Skip to main content

antigravity_codes/protocol_generated/
types.rs

1// AUTO-GENERATED by scripts/codegen_antigravity.py — DO NOT EDIT BY HAND.
2// Run `python3 scripts/codegen_antigravity.py` to regenerate.
3//
4// Source: the `FileDescriptorProto` embedded in `localharness_pb2.py` from the
5// `google-antigravity` wheel, snapshotted under `tests/schemas/`.
6//
7// The harness speaks protobuf-JSON over a WebSocket, so these are plain serde
8// types shaped like that encoding: `camelCase` members, 64-bit integers as
9// strings, `bytes` as base64, enums as their proto value names, and a protobuf
10// `oneof` flattened into sibling `Option` members (with a generated view enum).
11
12#![allow(clippy::large_enum_variant)]
13
14use std::collections::HashMap;
15
16use serde::{Deserialize, Serialize};
17
18/// `antigravity.localharness.ActionEditFile.DiffLine.LineAction`
19#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
20pub enum ActionEditFileDiffLineLineAction {
21    #[default]
22    Unspecified,
23    Insert,
24    Delete,
25    None,
26    /// A value this crate does not know about yet.
27    ///
28    /// The harness is versioned independently of this crate, so an
29    /// unrecognised enum value is treated as forward compatibility rather
30    /// than as a decode error.
31    Unknown(String),
32}
33
34impl ActionEditFileDiffLineLineAction {
35    /// The protobuf-JSON spelling of this value.
36    pub fn as_str(&self) -> &str {
37        match self {
38            Self::Unspecified => "LINE_ACTION_UNSPECIFIED",
39            Self::Insert => "LINE_ACTION_INSERT",
40            Self::Delete => "LINE_ACTION_DELETE",
41            Self::None => "LINE_ACTION_NONE",
42            Self::Unknown(s) => s,
43        }
44    }
45}
46
47impl std::fmt::Display for ActionEditFileDiffLineLineAction {
48    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
49        f.write_str(self.as_str())
50    }
51}
52
53impl Serialize for ActionEditFileDiffLineLineAction {
54    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
55        s.serialize_str(self.as_str())
56    }
57}
58
59impl<'de> Deserialize<'de> for ActionEditFileDiffLineLineAction {
60    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
61        Ok(match crate::wire::EnumRepr::deserialize(d)? {
62            crate::wire::EnumRepr::Name(n) if n == "LINE_ACTION_UNSPECIFIED" => Self::Unspecified,
63            crate::wire::EnumRepr::Name(n) if n == "LINE_ACTION_INSERT" => Self::Insert,
64            crate::wire::EnumRepr::Name(n) if n == "LINE_ACTION_DELETE" => Self::Delete,
65            crate::wire::EnumRepr::Name(n) if n == "LINE_ACTION_NONE" => Self::None,
66            crate::wire::EnumRepr::Number(0) => Self::Unspecified,
67            crate::wire::EnumRepr::Number(1) => Self::Insert,
68            crate::wire::EnumRepr::Number(2) => Self::Delete,
69            crate::wire::EnumRepr::Number(3) => Self::None,
70            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
71            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
72        })
73    }
74}
75
76/// `genai.AudioContent.MimeType`
77#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
78pub enum AudioContentMimeType {
79    #[default]
80    TypeUnspecified,
81    TypeWav,
82    TypeMp3,
83    TypeAiff,
84    TypeAac,
85    TypeOgg,
86    TypeFlac,
87    TypeMpeg,
88    TypeM4a,
89    TypeL16,
90    TypeS16le,
91    TypeOpus,
92    TypeAlaw,
93    TypeMulaw,
94    TypeVideoAudioS16le,
95    /// A value this crate does not know about yet.
96    ///
97    /// The harness is versioned independently of this crate, so an
98    /// unrecognised enum value is treated as forward compatibility rather
99    /// than as a decode error.
100    Unknown(String),
101}
102
103impl AudioContentMimeType {
104    /// The protobuf-JSON spelling of this value.
105    pub fn as_str(&self) -> &str {
106        match self {
107            Self::TypeUnspecified => "TYPE_UNSPECIFIED",
108            Self::TypeWav => "TYPE_WAV",
109            Self::TypeMp3 => "TYPE_MP3",
110            Self::TypeAiff => "TYPE_AIFF",
111            Self::TypeAac => "TYPE_AAC",
112            Self::TypeOgg => "TYPE_OGG",
113            Self::TypeFlac => "TYPE_FLAC",
114            Self::TypeMpeg => "TYPE_MPEG",
115            Self::TypeM4a => "TYPE_M4A",
116            Self::TypeL16 => "TYPE_L16",
117            Self::TypeS16le => "TYPE_S16LE",
118            Self::TypeOpus => "TYPE_OPUS",
119            Self::TypeAlaw => "TYPE_ALAW",
120            Self::TypeMulaw => "TYPE_MULAW",
121            Self::TypeVideoAudioS16le => "TYPE_VIDEO_AUDIO_S16LE",
122            Self::Unknown(s) => s,
123        }
124    }
125}
126
127impl std::fmt::Display for AudioContentMimeType {
128    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
129        f.write_str(self.as_str())
130    }
131}
132
133impl Serialize for AudioContentMimeType {
134    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
135        s.serialize_str(self.as_str())
136    }
137}
138
139impl<'de> Deserialize<'de> for AudioContentMimeType {
140    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
141        Ok(match crate::wire::EnumRepr::deserialize(d)? {
142            crate::wire::EnumRepr::Name(n) if n == "TYPE_UNSPECIFIED" => Self::TypeUnspecified,
143            crate::wire::EnumRepr::Name(n) if n == "TYPE_WAV" => Self::TypeWav,
144            crate::wire::EnumRepr::Name(n) if n == "TYPE_MP3" => Self::TypeMp3,
145            crate::wire::EnumRepr::Name(n) if n == "TYPE_AIFF" => Self::TypeAiff,
146            crate::wire::EnumRepr::Name(n) if n == "TYPE_AAC" => Self::TypeAac,
147            crate::wire::EnumRepr::Name(n) if n == "TYPE_OGG" => Self::TypeOgg,
148            crate::wire::EnumRepr::Name(n) if n == "TYPE_FLAC" => Self::TypeFlac,
149            crate::wire::EnumRepr::Name(n) if n == "TYPE_MPEG" => Self::TypeMpeg,
150            crate::wire::EnumRepr::Name(n) if n == "TYPE_M4A" => Self::TypeM4a,
151            crate::wire::EnumRepr::Name(n) if n == "TYPE_L16" => Self::TypeL16,
152            crate::wire::EnumRepr::Name(n) if n == "TYPE_S16LE" => Self::TypeS16le,
153            crate::wire::EnumRepr::Name(n) if n == "TYPE_OPUS" => Self::TypeOpus,
154            crate::wire::EnumRepr::Name(n) if n == "TYPE_ALAW" => Self::TypeAlaw,
155            crate::wire::EnumRepr::Name(n) if n == "TYPE_MULAW" => Self::TypeMulaw,
156            crate::wire::EnumRepr::Name(n) if n == "TYPE_VIDEO_AUDIO_S16LE" => {
157                Self::TypeVideoAudioS16le
158            }
159            crate::wire::EnumRepr::Number(0) => Self::TypeUnspecified,
160            crate::wire::EnumRepr::Number(1) => Self::TypeWav,
161            crate::wire::EnumRepr::Number(2) => Self::TypeMp3,
162            crate::wire::EnumRepr::Number(3) => Self::TypeAiff,
163            crate::wire::EnumRepr::Number(4) => Self::TypeAac,
164            crate::wire::EnumRepr::Number(5) => Self::TypeOgg,
165            crate::wire::EnumRepr::Number(6) => Self::TypeFlac,
166            crate::wire::EnumRepr::Number(7) => Self::TypeMpeg,
167            crate::wire::EnumRepr::Number(8) => Self::TypeM4a,
168            crate::wire::EnumRepr::Number(9) => Self::TypeL16,
169            crate::wire::EnumRepr::Number(10) => Self::TypeS16le,
170            crate::wire::EnumRepr::Number(11) => Self::TypeOpus,
171            crate::wire::EnumRepr::Number(12) => Self::TypeAlaw,
172            crate::wire::EnumRepr::Number(13) => Self::TypeMulaw,
173            crate::wire::EnumRepr::Number(14) => Self::TypeVideoAudioS16le,
174            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
175            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
176        })
177    }
178}
179
180/// `genai.CodeExecutionCallContent.CodeExecutionCallArguments.Language`
181#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
182pub enum CodeExecutionCallContentCodeExecutionCallArgumentsLanguage {
183    #[default]
184    Unspecified,
185    Python,
186    /// A value this crate does not know about yet.
187    ///
188    /// The harness is versioned independently of this crate, so an
189    /// unrecognised enum value is treated as forward compatibility rather
190    /// than as a decode error.
191    Unknown(String),
192}
193
194impl CodeExecutionCallContentCodeExecutionCallArgumentsLanguage {
195    /// The protobuf-JSON spelling of this value.
196    pub fn as_str(&self) -> &str {
197        match self {
198            Self::Unspecified => "LANGUAGE_UNSPECIFIED",
199            Self::Python => "PYTHON",
200            Self::Unknown(s) => s,
201        }
202    }
203}
204
205impl std::fmt::Display for CodeExecutionCallContentCodeExecutionCallArgumentsLanguage {
206    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
207        f.write_str(self.as_str())
208    }
209}
210
211impl Serialize for CodeExecutionCallContentCodeExecutionCallArgumentsLanguage {
212    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
213        s.serialize_str(self.as_str())
214    }
215}
216
217impl<'de> Deserialize<'de> for CodeExecutionCallContentCodeExecutionCallArgumentsLanguage {
218    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
219        Ok(match crate::wire::EnumRepr::deserialize(d)? {
220            crate::wire::EnumRepr::Name(n) if n == "LANGUAGE_UNSPECIFIED" => Self::Unspecified,
221            crate::wire::EnumRepr::Name(n) if n == "PYTHON" => Self::Python,
222            crate::wire::EnumRepr::Number(0) => Self::Unspecified,
223            crate::wire::EnumRepr::Number(1) => Self::Python,
224            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
225            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
226        })
227    }
228}
229
230/// `genai.DocumentContent.MimeType`
231#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
232pub enum DocumentContentMimeType {
233    #[default]
234    TypeUnspecified,
235    TypePdf,
236    TypeCsv,
237    /// A value this crate does not know about yet.
238    ///
239    /// The harness is versioned independently of this crate, so an
240    /// unrecognised enum value is treated as forward compatibility rather
241    /// than as a decode error.
242    Unknown(String),
243}
244
245impl DocumentContentMimeType {
246    /// The protobuf-JSON spelling of this value.
247    pub fn as_str(&self) -> &str {
248        match self {
249            Self::TypeUnspecified => "TYPE_UNSPECIFIED",
250            Self::TypePdf => "TYPE_PDF",
251            Self::TypeCsv => "TYPE_CSV",
252            Self::Unknown(s) => s,
253        }
254    }
255}
256
257impl std::fmt::Display for DocumentContentMimeType {
258    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
259        f.write_str(self.as_str())
260    }
261}
262
263impl Serialize for DocumentContentMimeType {
264    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
265        s.serialize_str(self.as_str())
266    }
267}
268
269impl<'de> Deserialize<'de> for DocumentContentMimeType {
270    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
271        Ok(match crate::wire::EnumRepr::deserialize(d)? {
272            crate::wire::EnumRepr::Name(n) if n == "TYPE_UNSPECIFIED" => Self::TypeUnspecified,
273            crate::wire::EnumRepr::Name(n) if n == "TYPE_PDF" => Self::TypePdf,
274            crate::wire::EnumRepr::Name(n) if n == "TYPE_CSV" => Self::TypeCsv,
275            crate::wire::EnumRepr::Number(0) => Self::TypeUnspecified,
276            crate::wire::EnumRepr::Number(1) => Self::TypePdf,
277            crate::wire::EnumRepr::Number(2) => Self::TypeCsv,
278            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
279            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
280        })
281    }
282}
283
284/// `genai.GoogleSearch.SearchType`
285#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
286pub enum GoogleSearchSearchType {
287    #[default]
288    Unspecified,
289    WebSearch,
290    ImageSearch,
291    EnterpriseWebSearch,
292    /// A value this crate does not know about yet.
293    ///
294    /// The harness is versioned independently of this crate, so an
295    /// unrecognised enum value is treated as forward compatibility rather
296    /// than as a decode error.
297    Unknown(String),
298}
299
300impl GoogleSearchSearchType {
301    /// The protobuf-JSON spelling of this value.
302    pub fn as_str(&self) -> &str {
303        match self {
304            Self::Unspecified => "SEARCH_TYPE_UNSPECIFIED",
305            Self::WebSearch => "SEARCH_TYPE_WEB_SEARCH",
306            Self::ImageSearch => "SEARCH_TYPE_IMAGE_SEARCH",
307            Self::EnterpriseWebSearch => "SEARCH_TYPE_ENTERPRISE_WEB_SEARCH",
308            Self::Unknown(s) => s,
309        }
310    }
311}
312
313impl std::fmt::Display for GoogleSearchSearchType {
314    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
315        f.write_str(self.as_str())
316    }
317}
318
319impl Serialize for GoogleSearchSearchType {
320    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
321        s.serialize_str(self.as_str())
322    }
323}
324
325impl<'de> Deserialize<'de> for GoogleSearchSearchType {
326    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
327        Ok(match crate::wire::EnumRepr::deserialize(d)? {
328            crate::wire::EnumRepr::Name(n) if n == "SEARCH_TYPE_UNSPECIFIED" => Self::Unspecified,
329            crate::wire::EnumRepr::Name(n) if n == "SEARCH_TYPE_WEB_SEARCH" => Self::WebSearch,
330            crate::wire::EnumRepr::Name(n) if n == "SEARCH_TYPE_IMAGE_SEARCH" => Self::ImageSearch,
331            crate::wire::EnumRepr::Name(n) if n == "SEARCH_TYPE_ENTERPRISE_WEB_SEARCH" => {
332                Self::EnterpriseWebSearch
333            }
334            crate::wire::EnumRepr::Number(0) => Self::Unspecified,
335            crate::wire::EnumRepr::Number(1) => Self::WebSearch,
336            crate::wire::EnumRepr::Number(2) => Self::ImageSearch,
337            crate::wire::EnumRepr::Number(3) => Self::EnterpriseWebSearch,
338            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
339            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
340        })
341    }
342}
343
344/// `antigravity.localharness.HarnessConfig.SessionContinuationMode`
345#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
346pub enum HarnessConfigSessionContinuationMode {
347    #[default]
348    Unspecified,
349    Resume,
350    CreateOrResume,
351    CreateOnly,
352    /// A value this crate does not know about yet.
353    ///
354    /// The harness is versioned independently of this crate, so an
355    /// unrecognised enum value is treated as forward compatibility rather
356    /// than as a decode error.
357    Unknown(String),
358}
359
360impl HarnessConfigSessionContinuationMode {
361    /// The protobuf-JSON spelling of this value.
362    pub fn as_str(&self) -> &str {
363        match self {
364            Self::Unspecified => "SESSION_CONTINUATION_MODE_UNSPECIFIED",
365            Self::Resume => "RESUME",
366            Self::CreateOrResume => "CREATE_OR_RESUME",
367            Self::CreateOnly => "CREATE_ONLY",
368            Self::Unknown(s) => s,
369        }
370    }
371}
372
373impl std::fmt::Display for HarnessConfigSessionContinuationMode {
374    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
375        f.write_str(self.as_str())
376    }
377}
378
379impl Serialize for HarnessConfigSessionContinuationMode {
380    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
381        s.serialize_str(self.as_str())
382    }
383}
384
385impl<'de> Deserialize<'de> for HarnessConfigSessionContinuationMode {
386    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
387        Ok(match crate::wire::EnumRepr::deserialize(d)? {
388            crate::wire::EnumRepr::Name(n) if n == "SESSION_CONTINUATION_MODE_UNSPECIFIED" => {
389                Self::Unspecified
390            }
391            crate::wire::EnumRepr::Name(n) if n == "RESUME" => Self::Resume,
392            crate::wire::EnumRepr::Name(n) if n == "CREATE_OR_RESUME" => Self::CreateOrResume,
393            crate::wire::EnumRepr::Name(n) if n == "CREATE_ONLY" => Self::CreateOnly,
394            crate::wire::EnumRepr::Number(0) => Self::Unspecified,
395            crate::wire::EnumRepr::Number(1) => Self::Resume,
396            crate::wire::EnumRepr::Number(2) => Self::CreateOrResume,
397            crate::wire::EnumRepr::Number(3) => Self::CreateOnly,
398            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
399            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
400        })
401    }
402}
403
404/// `genai.ImageContent.MimeType`
405#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
406pub enum ImageContentMimeType {
407    #[default]
408    TypeUnspecified,
409    TypePng,
410    TypeJpeg,
411    TypeWebp,
412    TypeHeic,
413    TypeHeif,
414    TypeGif,
415    TypeBmp,
416    TypeTiff,
417    TypeVideoFrameJpeg2000,
418    TypeVideoJpeg2000,
419    /// A value this crate does not know about yet.
420    ///
421    /// The harness is versioned independently of this crate, so an
422    /// unrecognised enum value is treated as forward compatibility rather
423    /// than as a decode error.
424    Unknown(String),
425}
426
427impl ImageContentMimeType {
428    /// The protobuf-JSON spelling of this value.
429    pub fn as_str(&self) -> &str {
430        match self {
431            Self::TypeUnspecified => "TYPE_UNSPECIFIED",
432            Self::TypePng => "TYPE_PNG",
433            Self::TypeJpeg => "TYPE_JPEG",
434            Self::TypeWebp => "TYPE_WEBP",
435            Self::TypeHeic => "TYPE_HEIC",
436            Self::TypeHeif => "TYPE_HEIF",
437            Self::TypeGif => "TYPE_GIF",
438            Self::TypeBmp => "TYPE_BMP",
439            Self::TypeTiff => "TYPE_TIFF",
440            Self::TypeVideoFrameJpeg2000 => "TYPE_VIDEO_FRAME_JPEG2000",
441            Self::TypeVideoJpeg2000 => "TYPE_VIDEO_JPEG2000",
442            Self::Unknown(s) => s,
443        }
444    }
445}
446
447impl std::fmt::Display for ImageContentMimeType {
448    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
449        f.write_str(self.as_str())
450    }
451}
452
453impl Serialize for ImageContentMimeType {
454    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
455        s.serialize_str(self.as_str())
456    }
457}
458
459impl<'de> Deserialize<'de> for ImageContentMimeType {
460    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
461        Ok(match crate::wire::EnumRepr::deserialize(d)? {
462            crate::wire::EnumRepr::Name(n) if n == "TYPE_UNSPECIFIED" => Self::TypeUnspecified,
463            crate::wire::EnumRepr::Name(n) if n == "TYPE_PNG" => Self::TypePng,
464            crate::wire::EnumRepr::Name(n) if n == "TYPE_JPEG" => Self::TypeJpeg,
465            crate::wire::EnumRepr::Name(n) if n == "TYPE_WEBP" => Self::TypeWebp,
466            crate::wire::EnumRepr::Name(n) if n == "TYPE_HEIC" => Self::TypeHeic,
467            crate::wire::EnumRepr::Name(n) if n == "TYPE_HEIF" => Self::TypeHeif,
468            crate::wire::EnumRepr::Name(n) if n == "TYPE_GIF" => Self::TypeGif,
469            crate::wire::EnumRepr::Name(n) if n == "TYPE_BMP" => Self::TypeBmp,
470            crate::wire::EnumRepr::Name(n) if n == "TYPE_TIFF" => Self::TypeTiff,
471            crate::wire::EnumRepr::Name(n) if n == "TYPE_VIDEO_FRAME_JPEG2000" => {
472                Self::TypeVideoFrameJpeg2000
473            }
474            crate::wire::EnumRepr::Name(n) if n == "TYPE_VIDEO_JPEG2000" => Self::TypeVideoJpeg2000,
475            crate::wire::EnumRepr::Number(0) => Self::TypeUnspecified,
476            crate::wire::EnumRepr::Number(1) => Self::TypePng,
477            crate::wire::EnumRepr::Number(2) => Self::TypeJpeg,
478            crate::wire::EnumRepr::Number(3) => Self::TypeWebp,
479            crate::wire::EnumRepr::Number(4) => Self::TypeHeic,
480            crate::wire::EnumRepr::Number(5) => Self::TypeHeif,
481            crate::wire::EnumRepr::Number(7) => Self::TypeGif,
482            crate::wire::EnumRepr::Number(8) => Self::TypeBmp,
483            crate::wire::EnumRepr::Number(9) => Self::TypeTiff,
484            crate::wire::EnumRepr::Number(10) => Self::TypeVideoFrameJpeg2000,
485            crate::wire::EnumRepr::Number(11) => Self::TypeVideoJpeg2000,
486            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
487            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
488        })
489    }
490}
491
492/// `antigravity.localharness.LifecycleHook`
493#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
494pub enum LifecycleHook {
495    #[default]
496    Unspecified,
497    OnSessionStart,
498    OnSessionEnd,
499    PreTurn,
500    PostTurn,
501    PreTool,
502    PostTool,
503    OnToolError,
504    /// A value this crate does not know about yet.
505    ///
506    /// The harness is versioned independently of this crate, so an
507    /// unrecognised enum value is treated as forward compatibility rather
508    /// than as a decode error.
509    Unknown(String),
510}
511
512impl LifecycleHook {
513    /// The protobuf-JSON spelling of this value.
514    pub fn as_str(&self) -> &str {
515        match self {
516            Self::Unspecified => "LIFECYCLE_HOOK_UNSPECIFIED",
517            Self::OnSessionStart => "LIFECYCLE_HOOK_ON_SESSION_START",
518            Self::OnSessionEnd => "LIFECYCLE_HOOK_ON_SESSION_END",
519            Self::PreTurn => "LIFECYCLE_HOOK_PRE_TURN",
520            Self::PostTurn => "LIFECYCLE_HOOK_POST_TURN",
521            Self::PreTool => "LIFECYCLE_HOOK_PRE_TOOL",
522            Self::PostTool => "LIFECYCLE_HOOK_POST_TOOL",
523            Self::OnToolError => "LIFECYCLE_HOOK_ON_TOOL_ERROR",
524            Self::Unknown(s) => s,
525        }
526    }
527}
528
529impl std::fmt::Display for LifecycleHook {
530    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
531        f.write_str(self.as_str())
532    }
533}
534
535impl Serialize for LifecycleHook {
536    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
537        s.serialize_str(self.as_str())
538    }
539}
540
541impl<'de> Deserialize<'de> for LifecycleHook {
542    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
543        Ok(match crate::wire::EnumRepr::deserialize(d)? {
544            crate::wire::EnumRepr::Name(n) if n == "LIFECYCLE_HOOK_UNSPECIFIED" => {
545                Self::Unspecified
546            }
547            crate::wire::EnumRepr::Name(n) if n == "LIFECYCLE_HOOK_ON_SESSION_START" => {
548                Self::OnSessionStart
549            }
550            crate::wire::EnumRepr::Name(n) if n == "LIFECYCLE_HOOK_ON_SESSION_END" => {
551                Self::OnSessionEnd
552            }
553            crate::wire::EnumRepr::Name(n) if n == "LIFECYCLE_HOOK_PRE_TURN" => Self::PreTurn,
554            crate::wire::EnumRepr::Name(n) if n == "LIFECYCLE_HOOK_POST_TURN" => Self::PostTurn,
555            crate::wire::EnumRepr::Name(n) if n == "LIFECYCLE_HOOK_PRE_TOOL" => Self::PreTool,
556            crate::wire::EnumRepr::Name(n) if n == "LIFECYCLE_HOOK_POST_TOOL" => Self::PostTool,
557            crate::wire::EnumRepr::Name(n) if n == "LIFECYCLE_HOOK_ON_TOOL_ERROR" => {
558                Self::OnToolError
559            }
560            crate::wire::EnumRepr::Number(0) => Self::Unspecified,
561            crate::wire::EnumRepr::Number(1) => Self::OnSessionStart,
562            crate::wire::EnumRepr::Number(2) => Self::OnSessionEnd,
563            crate::wire::EnumRepr::Number(3) => Self::PreTurn,
564            crate::wire::EnumRepr::Number(4) => Self::PostTurn,
565            crate::wire::EnumRepr::Number(5) => Self::PreTool,
566            crate::wire::EnumRepr::Number(6) => Self::PostTool,
567            crate::wire::EnumRepr::Number(7) => Self::OnToolError,
568            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
569            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
570        })
571    }
572}
573
574/// `antigravity.localharness.McpServerConfig.AuthProviderType`
575#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
576pub enum McpServerConfigAuthProviderType {
577    #[default]
578    Unspecified,
579    GoogleCredentials,
580    /// A value this crate does not know about yet.
581    ///
582    /// The harness is versioned independently of this crate, so an
583    /// unrecognised enum value is treated as forward compatibility rather
584    /// than as a decode error.
585    Unknown(String),
586}
587
588impl McpServerConfigAuthProviderType {
589    /// The protobuf-JSON spelling of this value.
590    pub fn as_str(&self) -> &str {
591        match self {
592            Self::Unspecified => "AUTH_PROVIDER_TYPE_UNSPECIFIED",
593            Self::GoogleCredentials => "AUTH_PROVIDER_TYPE_GOOGLE_CREDENTIALS",
594            Self::Unknown(s) => s,
595        }
596    }
597}
598
599impl std::fmt::Display for McpServerConfigAuthProviderType {
600    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
601        f.write_str(self.as_str())
602    }
603}
604
605impl Serialize for McpServerConfigAuthProviderType {
606    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
607        s.serialize_str(self.as_str())
608    }
609}
610
611impl<'de> Deserialize<'de> for McpServerConfigAuthProviderType {
612    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
613        Ok(match crate::wire::EnumRepr::deserialize(d)? {
614            crate::wire::EnumRepr::Name(n) if n == "AUTH_PROVIDER_TYPE_UNSPECIFIED" => {
615                Self::Unspecified
616            }
617            crate::wire::EnumRepr::Name(n) if n == "AUTH_PROVIDER_TYPE_GOOGLE_CREDENTIALS" => {
618                Self::GoogleCredentials
619            }
620            crate::wire::EnumRepr::Number(0) => Self::Unspecified,
621            crate::wire::EnumRepr::Number(1) => Self::GoogleCredentials,
622            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
623            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
624        })
625    }
626}
627
628/// `genai.MediaResolution`
629#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
630pub enum MediaResolution {
631    #[default]
632    Unspecified,
633    Low,
634    Medium,
635    High,
636    UltraHigh,
637    /// A value this crate does not know about yet.
638    ///
639    /// The harness is versioned independently of this crate, so an
640    /// unrecognised enum value is treated as forward compatibility rather
641    /// than as a decode error.
642    Unknown(String),
643}
644
645impl MediaResolution {
646    /// The protobuf-JSON spelling of this value.
647    pub fn as_str(&self) -> &str {
648        match self {
649            Self::Unspecified => "MEDIA_RESOLUTION_UNSPECIFIED",
650            Self::Low => "LOW",
651            Self::Medium => "MEDIUM",
652            Self::High => "HIGH",
653            Self::UltraHigh => "ULTRA_HIGH",
654            Self::Unknown(s) => s,
655        }
656    }
657}
658
659impl std::fmt::Display for MediaResolution {
660    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
661        f.write_str(self.as_str())
662    }
663}
664
665impl Serialize for MediaResolution {
666    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
667        s.serialize_str(self.as_str())
668    }
669}
670
671impl<'de> Deserialize<'de> for MediaResolution {
672    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
673        Ok(match crate::wire::EnumRepr::deserialize(d)? {
674            crate::wire::EnumRepr::Name(n) if n == "MEDIA_RESOLUTION_UNSPECIFIED" => {
675                Self::Unspecified
676            }
677            crate::wire::EnumRepr::Name(n) if n == "LOW" => Self::Low,
678            crate::wire::EnumRepr::Name(n) if n == "MEDIUM" => Self::Medium,
679            crate::wire::EnumRepr::Name(n) if n == "HIGH" => Self::High,
680            crate::wire::EnumRepr::Name(n) if n == "ULTRA_HIGH" => Self::UltraHigh,
681            crate::wire::EnumRepr::Number(0) => Self::Unspecified,
682            crate::wire::EnumRepr::Number(1) => Self::Low,
683            crate::wire::EnumRepr::Number(2) => Self::Medium,
684            crate::wire::EnumRepr::Number(3) => Self::High,
685            crate::wire::EnumRepr::Number(4) => Self::UltraHigh,
686            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
687            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
688        })
689    }
690}
691
692/// `antigravity.localharness.ModelType`
693#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
694pub enum ModelType {
695    #[default]
696    Unspecified,
697    Text,
698    Image,
699    /// A value this crate does not know about yet.
700    ///
701    /// The harness is versioned independently of this crate, so an
702    /// unrecognised enum value is treated as forward compatibility rather
703    /// than as a decode error.
704    Unknown(String),
705}
706
707impl ModelType {
708    /// The protobuf-JSON spelling of this value.
709    pub fn as_str(&self) -> &str {
710        match self {
711            Self::Unspecified => "MODEL_TYPE_UNSPECIFIED",
712            Self::Text => "MODEL_TYPE_TEXT",
713            Self::Image => "MODEL_TYPE_IMAGE",
714            Self::Unknown(s) => s,
715        }
716    }
717}
718
719impl std::fmt::Display for ModelType {
720    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
721        f.write_str(self.as_str())
722    }
723}
724
725impl Serialize for ModelType {
726    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
727        s.serialize_str(self.as_str())
728    }
729}
730
731impl<'de> Deserialize<'de> for ModelType {
732    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
733        Ok(match crate::wire::EnumRepr::deserialize(d)? {
734            crate::wire::EnumRepr::Name(n) if n == "MODEL_TYPE_UNSPECIFIED" => Self::Unspecified,
735            crate::wire::EnumRepr::Name(n) if n == "MODEL_TYPE_TEXT" => Self::Text,
736            crate::wire::EnumRepr::Name(n) if n == "MODEL_TYPE_IMAGE" => Self::Image,
737            crate::wire::EnumRepr::Number(0) => Self::Unspecified,
738            crate::wire::EnumRepr::Number(1) => Self::Text,
739            crate::wire::EnumRepr::Number(2) => Self::Image,
740            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
741            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
742        })
743    }
744}
745
746/// `google.protobuf.NullValue`
747#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
748pub enum NullValue {
749    #[default]
750    NullValue,
751    /// A value this crate does not know about yet.
752    ///
753    /// The harness is versioned independently of this crate, so an
754    /// unrecognised enum value is treated as forward compatibility rather
755    /// than as a decode error.
756    Unknown(String),
757}
758
759impl NullValue {
760    /// The protobuf-JSON spelling of this value.
761    pub fn as_str(&self) -> &str {
762        match self {
763            Self::NullValue => "NULL_VALUE",
764            Self::Unknown(s) => s,
765        }
766    }
767}
768
769impl std::fmt::Display for NullValue {
770    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
771        f.write_str(self.as_str())
772    }
773}
774
775impl Serialize for NullValue {
776    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
777        s.serialize_str(self.as_str())
778    }
779}
780
781impl<'de> Deserialize<'de> for NullValue {
782    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
783        Ok(match crate::wire::EnumRepr::deserialize(d)? {
784            crate::wire::EnumRepr::Name(n) if n == "NULL_VALUE" => Self::NullValue,
785            crate::wire::EnumRepr::Number(0) => Self::NullValue,
786            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
787            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
788        })
789    }
790}
791
792/// `antigravity.localharness.PolicyDecision`
793#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
794pub enum PolicyDecision {
795    #[default]
796    Unspecified,
797    Allow,
798    Deny,
799    AskUser,
800    /// A value this crate does not know about yet.
801    ///
802    /// The harness is versioned independently of this crate, so an
803    /// unrecognised enum value is treated as forward compatibility rather
804    /// than as a decode error.
805    Unknown(String),
806}
807
808impl PolicyDecision {
809    /// The protobuf-JSON spelling of this value.
810    pub fn as_str(&self) -> &str {
811        match self {
812            Self::Unspecified => "POLICY_DECISION_UNSPECIFIED",
813            Self::Allow => "POLICY_DECISION_ALLOW",
814            Self::Deny => "POLICY_DECISION_DENY",
815            Self::AskUser => "POLICY_DECISION_ASK_USER",
816            Self::Unknown(s) => s,
817        }
818    }
819}
820
821impl std::fmt::Display for PolicyDecision {
822    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
823        f.write_str(self.as_str())
824    }
825}
826
827impl Serialize for PolicyDecision {
828    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
829        s.serialize_str(self.as_str())
830    }
831}
832
833impl<'de> Deserialize<'de> for PolicyDecision {
834    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
835        Ok(match crate::wire::EnumRepr::deserialize(d)? {
836            crate::wire::EnumRepr::Name(n) if n == "POLICY_DECISION_UNSPECIFIED" => {
837                Self::Unspecified
838            }
839            crate::wire::EnumRepr::Name(n) if n == "POLICY_DECISION_ALLOW" => Self::Allow,
840            crate::wire::EnumRepr::Name(n) if n == "POLICY_DECISION_DENY" => Self::Deny,
841            crate::wire::EnumRepr::Name(n) if n == "POLICY_DECISION_ASK_USER" => Self::AskUser,
842            crate::wire::EnumRepr::Number(0) => Self::Unspecified,
843            crate::wire::EnumRepr::Number(1) => Self::Allow,
844            crate::wire::EnumRepr::Number(2) => Self::Deny,
845            crate::wire::EnumRepr::Number(3) => Self::AskUser,
846            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
847            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
848        })
849    }
850}
851
852/// `antigravity.localharness.PolicyEvaluationOutcome`
853#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
854pub enum PolicyEvaluationOutcome {
855    #[default]
856    Unspecified,
857    Allow,
858    Deny,
859    NoMatch,
860    /// A value this crate does not know about yet.
861    ///
862    /// The harness is versioned independently of this crate, so an
863    /// unrecognised enum value is treated as forward compatibility rather
864    /// than as a decode error.
865    Unknown(String),
866}
867
868impl PolicyEvaluationOutcome {
869    /// The protobuf-JSON spelling of this value.
870    pub fn as_str(&self) -> &str {
871        match self {
872            Self::Unspecified => "POLICY_EVALUATION_OUTCOME_UNSPECIFIED",
873            Self::Allow => "POLICY_EVALUATION_OUTCOME_ALLOW",
874            Self::Deny => "POLICY_EVALUATION_OUTCOME_DENY",
875            Self::NoMatch => "POLICY_EVALUATION_OUTCOME_NO_MATCH",
876            Self::Unknown(s) => s,
877        }
878    }
879}
880
881impl std::fmt::Display for PolicyEvaluationOutcome {
882    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
883        f.write_str(self.as_str())
884    }
885}
886
887impl Serialize for PolicyEvaluationOutcome {
888    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
889        s.serialize_str(self.as_str())
890    }
891}
892
893impl<'de> Deserialize<'de> for PolicyEvaluationOutcome {
894    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
895        Ok(match crate::wire::EnumRepr::deserialize(d)? {
896            crate::wire::EnumRepr::Name(n) if n == "POLICY_EVALUATION_OUTCOME_UNSPECIFIED" => {
897                Self::Unspecified
898            }
899            crate::wire::EnumRepr::Name(n) if n == "POLICY_EVALUATION_OUTCOME_ALLOW" => Self::Allow,
900            crate::wire::EnumRepr::Name(n) if n == "POLICY_EVALUATION_OUTCOME_DENY" => Self::Deny,
901            crate::wire::EnumRepr::Name(n) if n == "POLICY_EVALUATION_OUTCOME_NO_MATCH" => {
902                Self::NoMatch
903            }
904            crate::wire::EnumRepr::Number(0) => Self::Unspecified,
905            crate::wire::EnumRepr::Number(1) => Self::Allow,
906            crate::wire::EnumRepr::Number(2) => Self::Deny,
907            crate::wire::EnumRepr::Number(3) => Self::NoMatch,
908            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
909            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
910        })
911    }
912}
913
914/// `antigravity.localharness.PreToolResult.Decision`
915#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
916pub enum PreToolResultDecision {
917    #[default]
918    Unspecified,
919    Allow,
920    Deny,
921    /// A value this crate does not know about yet.
922    ///
923    /// The harness is versioned independently of this crate, so an
924    /// unrecognised enum value is treated as forward compatibility rather
925    /// than as a decode error.
926    Unknown(String),
927}
928
929impl PreToolResultDecision {
930    /// The protobuf-JSON spelling of this value.
931    pub fn as_str(&self) -> &str {
932        match self {
933            Self::Unspecified => "DECISION_UNSPECIFIED",
934            Self::Allow => "ALLOW",
935            Self::Deny => "DENY",
936            Self::Unknown(s) => s,
937        }
938    }
939}
940
941impl std::fmt::Display for PreToolResultDecision {
942    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
943        f.write_str(self.as_str())
944    }
945}
946
947impl Serialize for PreToolResultDecision {
948    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
949        s.serialize_str(self.as_str())
950    }
951}
952
953impl<'de> Deserialize<'de> for PreToolResultDecision {
954    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
955        Ok(match crate::wire::EnumRepr::deserialize(d)? {
956            crate::wire::EnumRepr::Name(n) if n == "DECISION_UNSPECIFIED" => Self::Unspecified,
957            crate::wire::EnumRepr::Name(n) if n == "ALLOW" => Self::Allow,
958            crate::wire::EnumRepr::Name(n) if n == "DENY" => Self::Deny,
959            crate::wire::EnumRepr::Number(0) => Self::Unspecified,
960            crate::wire::EnumRepr::Number(1) => Self::Allow,
961            crate::wire::EnumRepr::Number(2) => Self::Deny,
962            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
963            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
964        })
965    }
966}
967
968/// `antigravity.localharness.PreTurnResult.Decision`
969#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
970pub enum PreTurnResultDecision {
971    #[default]
972    Unspecified,
973    Allow,
974    Deny,
975    /// A value this crate does not know about yet.
976    ///
977    /// The harness is versioned independently of this crate, so an
978    /// unrecognised enum value is treated as forward compatibility rather
979    /// than as a decode error.
980    Unknown(String),
981}
982
983impl PreTurnResultDecision {
984    /// The protobuf-JSON spelling of this value.
985    pub fn as_str(&self) -> &str {
986        match self {
987            Self::Unspecified => "DECISION_UNSPECIFIED",
988            Self::Allow => "ALLOW",
989            Self::Deny => "DENY",
990            Self::Unknown(s) => s,
991        }
992    }
993}
994
995impl std::fmt::Display for PreTurnResultDecision {
996    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
997        f.write_str(self.as_str())
998    }
999}
1000
1001impl Serialize for PreTurnResultDecision {
1002    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1003        s.serialize_str(self.as_str())
1004    }
1005}
1006
1007impl<'de> Deserialize<'de> for PreTurnResultDecision {
1008    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
1009        Ok(match crate::wire::EnumRepr::deserialize(d)? {
1010            crate::wire::EnumRepr::Name(n) if n == "DECISION_UNSPECIFIED" => Self::Unspecified,
1011            crate::wire::EnumRepr::Name(n) if n == "ALLOW" => Self::Allow,
1012            crate::wire::EnumRepr::Name(n) if n == "DENY" => Self::Deny,
1013            crate::wire::EnumRepr::Number(0) => Self::Unspecified,
1014            crate::wire::EnumRepr::Number(1) => Self::Allow,
1015            crate::wire::EnumRepr::Number(2) => Self::Deny,
1016            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
1017            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
1018        })
1019    }
1020}
1021
1022/// `antigravity.localharness.StepUpdate.Source`
1023#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
1024pub enum StepUpdateSource {
1025    #[default]
1026    Unspecified,
1027    System,
1028    User,
1029    Model,
1030    /// A value this crate does not know about yet.
1031    ///
1032    /// The harness is versioned independently of this crate, so an
1033    /// unrecognised enum value is treated as forward compatibility rather
1034    /// than as a decode error.
1035    Unknown(String),
1036}
1037
1038impl StepUpdateSource {
1039    /// The protobuf-JSON spelling of this value.
1040    pub fn as_str(&self) -> &str {
1041        match self {
1042            Self::Unspecified => "SOURCE_UNSPECIFIED",
1043            Self::System => "SOURCE_SYSTEM",
1044            Self::User => "SOURCE_USER",
1045            Self::Model => "SOURCE_MODEL",
1046            Self::Unknown(s) => s,
1047        }
1048    }
1049}
1050
1051impl std::fmt::Display for StepUpdateSource {
1052    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1053        f.write_str(self.as_str())
1054    }
1055}
1056
1057impl Serialize for StepUpdateSource {
1058    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1059        s.serialize_str(self.as_str())
1060    }
1061}
1062
1063impl<'de> Deserialize<'de> for StepUpdateSource {
1064    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
1065        Ok(match crate::wire::EnumRepr::deserialize(d)? {
1066            crate::wire::EnumRepr::Name(n) if n == "SOURCE_UNSPECIFIED" => Self::Unspecified,
1067            crate::wire::EnumRepr::Name(n) if n == "SOURCE_SYSTEM" => Self::System,
1068            crate::wire::EnumRepr::Name(n) if n == "SOURCE_USER" => Self::User,
1069            crate::wire::EnumRepr::Name(n) if n == "SOURCE_MODEL" => Self::Model,
1070            crate::wire::EnumRepr::Number(0) => Self::Unspecified,
1071            crate::wire::EnumRepr::Number(1) => Self::System,
1072            crate::wire::EnumRepr::Number(2) => Self::User,
1073            crate::wire::EnumRepr::Number(3) => Self::Model,
1074            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
1075            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
1076        })
1077    }
1078}
1079
1080/// `antigravity.localharness.StepUpdate.State`
1081#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
1082pub enum StepUpdateState {
1083    #[default]
1084    Unspecified,
1085    Active,
1086    Done,
1087    WaitingForUser,
1088    Error,
1089    /// A value this crate does not know about yet.
1090    ///
1091    /// The harness is versioned independently of this crate, so an
1092    /// unrecognised enum value is treated as forward compatibility rather
1093    /// than as a decode error.
1094    Unknown(String),
1095}
1096
1097impl StepUpdateState {
1098    /// The protobuf-JSON spelling of this value.
1099    pub fn as_str(&self) -> &str {
1100        match self {
1101            Self::Unspecified => "STATE_UNSPECIFIED",
1102            Self::Active => "STATE_ACTIVE",
1103            Self::Done => "STATE_DONE",
1104            Self::WaitingForUser => "STATE_WAITING_FOR_USER",
1105            Self::Error => "STATE_ERROR",
1106            Self::Unknown(s) => s,
1107        }
1108    }
1109}
1110
1111impl std::fmt::Display for StepUpdateState {
1112    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1113        f.write_str(self.as_str())
1114    }
1115}
1116
1117impl Serialize for StepUpdateState {
1118    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1119        s.serialize_str(self.as_str())
1120    }
1121}
1122
1123impl<'de> Deserialize<'de> for StepUpdateState {
1124    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
1125        Ok(match crate::wire::EnumRepr::deserialize(d)? {
1126            crate::wire::EnumRepr::Name(n) if n == "STATE_UNSPECIFIED" => Self::Unspecified,
1127            crate::wire::EnumRepr::Name(n) if n == "STATE_ACTIVE" => Self::Active,
1128            crate::wire::EnumRepr::Name(n) if n == "STATE_DONE" => Self::Done,
1129            crate::wire::EnumRepr::Name(n) if n == "STATE_WAITING_FOR_USER" => Self::WaitingForUser,
1130            crate::wire::EnumRepr::Name(n) if n == "STATE_ERROR" => Self::Error,
1131            crate::wire::EnumRepr::Number(0) => Self::Unspecified,
1132            crate::wire::EnumRepr::Number(1) => Self::Active,
1133            crate::wire::EnumRepr::Number(2) => Self::Done,
1134            crate::wire::EnumRepr::Number(3) => Self::WaitingForUser,
1135            crate::wire::EnumRepr::Number(4) => Self::Error,
1136            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
1137            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
1138        })
1139    }
1140}
1141
1142/// `antigravity.localharness.StepUpdate.Target`
1143#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
1144pub enum StepUpdateTarget {
1145    #[default]
1146    Unspecified,
1147    User,
1148    Model,
1149    Environment,
1150    /// A value this crate does not know about yet.
1151    ///
1152    /// The harness is versioned independently of this crate, so an
1153    /// unrecognised enum value is treated as forward compatibility rather
1154    /// than as a decode error.
1155    Unknown(String),
1156}
1157
1158impl StepUpdateTarget {
1159    /// The protobuf-JSON spelling of this value.
1160    pub fn as_str(&self) -> &str {
1161        match self {
1162            Self::Unspecified => "TARGET_UNSPECIFIED",
1163            Self::User => "TARGET_USER",
1164            Self::Model => "TARGET_MODEL",
1165            Self::Environment => "TARGET_ENVIRONMENT",
1166            Self::Unknown(s) => s,
1167        }
1168    }
1169}
1170
1171impl std::fmt::Display for StepUpdateTarget {
1172    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1173        f.write_str(self.as_str())
1174    }
1175}
1176
1177impl Serialize for StepUpdateTarget {
1178    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1179        s.serialize_str(self.as_str())
1180    }
1181}
1182
1183impl<'de> Deserialize<'de> for StepUpdateTarget {
1184    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
1185        Ok(match crate::wire::EnumRepr::deserialize(d)? {
1186            crate::wire::EnumRepr::Name(n) if n == "TARGET_UNSPECIFIED" => Self::Unspecified,
1187            crate::wire::EnumRepr::Name(n) if n == "TARGET_USER" => Self::User,
1188            crate::wire::EnumRepr::Name(n) if n == "TARGET_MODEL" => Self::Model,
1189            crate::wire::EnumRepr::Name(n) if n == "TARGET_ENVIRONMENT" => Self::Environment,
1190            crate::wire::EnumRepr::Number(0) => Self::Unspecified,
1191            crate::wire::EnumRepr::Number(1) => Self::User,
1192            crate::wire::EnumRepr::Number(2) => Self::Model,
1193            crate::wire::EnumRepr::Number(3) => Self::Environment,
1194            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
1195            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
1196        })
1197    }
1198}
1199
1200/// `antigravity.localharness.TrajectoryStateUpdate.State`
1201#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
1202pub enum TrajectoryStateUpdateState {
1203    #[default]
1204    Unspecified,
1205    Running,
1206    FullyIdle,
1207    Cancelled,
1208    WaitingForTasks,
1209    /// A value this crate does not know about yet.
1210    ///
1211    /// The harness is versioned independently of this crate, so an
1212    /// unrecognised enum value is treated as forward compatibility rather
1213    /// than as a decode error.
1214    Unknown(String),
1215}
1216
1217impl TrajectoryStateUpdateState {
1218    /// The protobuf-JSON spelling of this value.
1219    pub fn as_str(&self) -> &str {
1220        match self {
1221            Self::Unspecified => "STATE_UNSPECIFIED",
1222            Self::Running => "STATE_RUNNING",
1223            Self::FullyIdle => "STATE_FULLY_IDLE",
1224            Self::Cancelled => "STATE_CANCELLED",
1225            Self::WaitingForTasks => "STATE_WAITING_FOR_TASKS",
1226            Self::Unknown(s) => s,
1227        }
1228    }
1229}
1230
1231impl std::fmt::Display for TrajectoryStateUpdateState {
1232    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1233        f.write_str(self.as_str())
1234    }
1235}
1236
1237impl Serialize for TrajectoryStateUpdateState {
1238    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1239        s.serialize_str(self.as_str())
1240    }
1241}
1242
1243impl<'de> Deserialize<'de> for TrajectoryStateUpdateState {
1244    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
1245        Ok(match crate::wire::EnumRepr::deserialize(d)? {
1246            crate::wire::EnumRepr::Name(n) if n == "STATE_UNSPECIFIED" => Self::Unspecified,
1247            crate::wire::EnumRepr::Name(n) if n == "STATE_RUNNING" => Self::Running,
1248            crate::wire::EnumRepr::Name(n) if n == "STATE_FULLY_IDLE" => Self::FullyIdle,
1249            crate::wire::EnumRepr::Name(n) if n == "STATE_CANCELLED" => Self::Cancelled,
1250            crate::wire::EnumRepr::Name(n) if n == "STATE_WAITING_FOR_TASKS" => {
1251                Self::WaitingForTasks
1252            }
1253            crate::wire::EnumRepr::Number(0) => Self::Unspecified,
1254            crate::wire::EnumRepr::Number(1) => Self::Running,
1255            crate::wire::EnumRepr::Number(2) => Self::FullyIdle,
1256            crate::wire::EnumRepr::Number(3) => Self::Cancelled,
1257            crate::wire::EnumRepr::Number(4) => Self::WaitingForTasks,
1258            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
1259            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
1260        })
1261    }
1262}
1263
1264/// `genai.UrlContextResultContent.UrlContextResult.Status`
1265#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
1266pub enum UrlContextResultContentUrlContextResultStatus {
1267    #[default]
1268    Unspecified,
1269    Success,
1270    Error,
1271    Paywall,
1272    Unsafe,
1273    /// A value this crate does not know about yet.
1274    ///
1275    /// The harness is versioned independently of this crate, so an
1276    /// unrecognised enum value is treated as forward compatibility rather
1277    /// than as a decode error.
1278    Unknown(String),
1279}
1280
1281impl UrlContextResultContentUrlContextResultStatus {
1282    /// The protobuf-JSON spelling of this value.
1283    pub fn as_str(&self) -> &str {
1284        match self {
1285            Self::Unspecified => "STATUS_UNSPECIFIED",
1286            Self::Success => "SUCCESS",
1287            Self::Error => "ERROR",
1288            Self::Paywall => "PAYWALL",
1289            Self::Unsafe => "UNSAFE",
1290            Self::Unknown(s) => s,
1291        }
1292    }
1293}
1294
1295impl std::fmt::Display for UrlContextResultContentUrlContextResultStatus {
1296    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1297        f.write_str(self.as_str())
1298    }
1299}
1300
1301impl Serialize for UrlContextResultContentUrlContextResultStatus {
1302    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1303        s.serialize_str(self.as_str())
1304    }
1305}
1306
1307impl<'de> Deserialize<'de> for UrlContextResultContentUrlContextResultStatus {
1308    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
1309        Ok(match crate::wire::EnumRepr::deserialize(d)? {
1310            crate::wire::EnumRepr::Name(n) if n == "STATUS_UNSPECIFIED" => Self::Unspecified,
1311            crate::wire::EnumRepr::Name(n) if n == "SUCCESS" => Self::Success,
1312            crate::wire::EnumRepr::Name(n) if n == "ERROR" => Self::Error,
1313            crate::wire::EnumRepr::Name(n) if n == "PAYWALL" => Self::Paywall,
1314            crate::wire::EnumRepr::Name(n) if n == "UNSAFE" => Self::Unsafe,
1315            crate::wire::EnumRepr::Number(0) => Self::Unspecified,
1316            crate::wire::EnumRepr::Number(1) => Self::Success,
1317            crate::wire::EnumRepr::Number(2) => Self::Error,
1318            crate::wire::EnumRepr::Number(3) => Self::Paywall,
1319            crate::wire::EnumRepr::Number(4) => Self::Unsafe,
1320            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
1321            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
1322        })
1323    }
1324}
1325
1326/// `genai.VideoContent.MimeType`
1327#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
1328pub enum VideoContentMimeType {
1329    #[default]
1330    TypeUnspecified,
1331    TypeMp4,
1332    TypeMpeg,
1333    TypeMpg,
1334    TypeMov,
1335    TypeAvi,
1336    TypeXFlv,
1337    TypeWebm,
1338    TypeWmv,
1339    Type3gpp,
1340    TypeYtBeyond,
1341    /// A value this crate does not know about yet.
1342    ///
1343    /// The harness is versioned independently of this crate, so an
1344    /// unrecognised enum value is treated as forward compatibility rather
1345    /// than as a decode error.
1346    Unknown(String),
1347}
1348
1349impl VideoContentMimeType {
1350    /// The protobuf-JSON spelling of this value.
1351    pub fn as_str(&self) -> &str {
1352        match self {
1353            Self::TypeUnspecified => "TYPE_UNSPECIFIED",
1354            Self::TypeMp4 => "TYPE_MP4",
1355            Self::TypeMpeg => "TYPE_MPEG",
1356            Self::TypeMpg => "TYPE_MPG",
1357            Self::TypeMov => "TYPE_MOV",
1358            Self::TypeAvi => "TYPE_AVI",
1359            Self::TypeXFlv => "TYPE_X_FLV",
1360            Self::TypeWebm => "TYPE_WEBM",
1361            Self::TypeWmv => "TYPE_WMV",
1362            Self::Type3gpp => "TYPE_3GPP",
1363            Self::TypeYtBeyond => "TYPE_YT_BEYOND",
1364            Self::Unknown(s) => s,
1365        }
1366    }
1367}
1368
1369impl std::fmt::Display for VideoContentMimeType {
1370    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1371        f.write_str(self.as_str())
1372    }
1373}
1374
1375impl Serialize for VideoContentMimeType {
1376    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1377        s.serialize_str(self.as_str())
1378    }
1379}
1380
1381impl<'de> Deserialize<'de> for VideoContentMimeType {
1382    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
1383        Ok(match crate::wire::EnumRepr::deserialize(d)? {
1384            crate::wire::EnumRepr::Name(n) if n == "TYPE_UNSPECIFIED" => Self::TypeUnspecified,
1385            crate::wire::EnumRepr::Name(n) if n == "TYPE_MP4" => Self::TypeMp4,
1386            crate::wire::EnumRepr::Name(n) if n == "TYPE_MPEG" => Self::TypeMpeg,
1387            crate::wire::EnumRepr::Name(n) if n == "TYPE_MPG" => Self::TypeMpg,
1388            crate::wire::EnumRepr::Name(n) if n == "TYPE_MOV" => Self::TypeMov,
1389            crate::wire::EnumRepr::Name(n) if n == "TYPE_AVI" => Self::TypeAvi,
1390            crate::wire::EnumRepr::Name(n) if n == "TYPE_X_FLV" => Self::TypeXFlv,
1391            crate::wire::EnumRepr::Name(n) if n == "TYPE_WEBM" => Self::TypeWebm,
1392            crate::wire::EnumRepr::Name(n) if n == "TYPE_WMV" => Self::TypeWmv,
1393            crate::wire::EnumRepr::Name(n) if n == "TYPE_3GPP" => Self::Type3gpp,
1394            crate::wire::EnumRepr::Name(n) if n == "TYPE_YT_BEYOND" => Self::TypeYtBeyond,
1395            crate::wire::EnumRepr::Number(0) => Self::TypeUnspecified,
1396            crate::wire::EnumRepr::Number(1) => Self::TypeMp4,
1397            crate::wire::EnumRepr::Number(2) => Self::TypeMpeg,
1398            crate::wire::EnumRepr::Number(3) => Self::TypeMpg,
1399            crate::wire::EnumRepr::Number(4) => Self::TypeMov,
1400            crate::wire::EnumRepr::Number(5) => Self::TypeAvi,
1401            crate::wire::EnumRepr::Number(6) => Self::TypeXFlv,
1402            crate::wire::EnumRepr::Number(7) => Self::TypeWebm,
1403            crate::wire::EnumRepr::Number(8) => Self::TypeWmv,
1404            crate::wire::EnumRepr::Number(9) => Self::Type3gpp,
1405            crate::wire::EnumRepr::Number(10) => Self::TypeYtBeyond,
1406            crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
1407            crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
1408        })
1409    }
1410}
1411
1412/// `antigravity.localharness.ActionCompaction`
1413#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1414#[serde(rename_all = "camelCase")]
1415pub struct ActionCompaction {}
1416
1417/// `antigravity.localharness.ActionCreateFile`
1418#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1419#[serde(rename_all = "camelCase")]
1420pub struct ActionCreateFile {
1421    #[serde(alias = "file_path", default, skip_serializing_if = "Option::is_none")]
1422    pub file_path: Option<String>,
1423    #[serde(default, skip_serializing_if = "Option::is_none")]
1424    pub contents: Option<String>,
1425}
1426
1427/// `antigravity.localharness.ActionCustomTool`
1428#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1429#[serde(rename_all = "camelCase")]
1430pub struct ActionCustomTool {
1431    #[serde(alias = "tool_call", default, skip_serializing_if = "Option::is_none")]
1432    pub tool_call: Option<ToolCall>,
1433    #[serde(
1434        alias = "tool_response",
1435        default,
1436        skip_serializing_if = "Option::is_none"
1437    )]
1438    pub tool_response: Option<ToolResponse>,
1439}
1440
1441/// `antigravity.localharness.ActionEditFile`
1442#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1443#[serde(rename_all = "camelCase")]
1444pub struct ActionEditFile {
1445    #[serde(alias = "file_path", default, skip_serializing_if = "Option::is_none")]
1446    pub file_path: Option<String>,
1447    #[serde(alias = "diff_block", default, skip_serializing_if = "Vec::is_empty")]
1448    pub diff_block: Vec<ActionEditFileDiffBlock>,
1449}
1450
1451/// `antigravity.localharness.ActionEditFile.DiffBlock`
1452#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1453#[serde(rename_all = "camelCase")]
1454pub struct ActionEditFileDiffBlock {
1455    #[serde(alias = "start_line", default, skip_serializing_if = "Option::is_none")]
1456    pub start_line: Option<i32>,
1457    #[serde(alias = "end_line", default, skip_serializing_if = "Option::is_none")]
1458    pub end_line: Option<i32>,
1459    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1460    pub lines: Vec<ActionEditFileDiffLine>,
1461}
1462
1463/// `antigravity.localharness.ActionEditFile.DiffLine`
1464#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1465#[serde(rename_all = "camelCase")]
1466pub struct ActionEditFileDiffLine {
1467    #[serde(default, skip_serializing_if = "Option::is_none")]
1468    pub text: Option<String>,
1469    #[serde(default, skip_serializing_if = "Option::is_none")]
1470    pub action: Option<ActionEditFileDiffLineLineAction>,
1471}
1472
1473/// `antigravity.localharness.ActionError`
1474#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1475#[serde(rename_all = "camelCase")]
1476pub struct ActionError {
1477    #[serde(
1478        alias = "error_message",
1479        default,
1480        skip_serializing_if = "Option::is_none"
1481    )]
1482    pub error_message: Option<String>,
1483    #[serde(alias = "http_code", default, skip_serializing_if = "Option::is_none")]
1484    pub http_code: Option<u32>,
1485}
1486
1487/// `antigravity.localharness.ActionFindFile`
1488#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1489#[serde(rename_all = "camelCase")]
1490pub struct ActionFindFile {
1491    #[serde(
1492        alias = "directory_path",
1493        default,
1494        skip_serializing_if = "Option::is_none"
1495    )]
1496    pub directory_path: Option<String>,
1497    #[serde(default, skip_serializing_if = "Option::is_none")]
1498    pub query: Option<String>,
1499    #[serde(default, skip_serializing_if = "Option::is_none")]
1500    pub output: Option<String>,
1501}
1502
1503/// `antigravity.localharness.ActionFinish`
1504#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1505#[serde(rename_all = "camelCase")]
1506pub struct ActionFinish {
1507    #[serde(
1508        alias = "output_string",
1509        default,
1510        skip_serializing_if = "Option::is_none"
1511    )]
1512    pub output_string: Option<String>,
1513}
1514
1515/// `antigravity.localharness.ActionGenerateImage`
1516#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1517#[serde(rename_all = "camelCase")]
1518pub struct ActionGenerateImage {
1519    #[serde(default, skip_serializing_if = "Option::is_none")]
1520    pub prompt: Option<String>,
1521    #[serde(alias = "image_paths", default, skip_serializing_if = "Vec::is_empty")]
1522    pub image_paths: Vec<String>,
1523    #[serde(alias = "image_name", default, skip_serializing_if = "Option::is_none")]
1524    pub image_name: Option<String>,
1525    #[serde(
1526        alias = "aspect_ratio",
1527        default,
1528        skip_serializing_if = "Option::is_none"
1529    )]
1530    pub aspect_ratio: Option<String>,
1531}
1532
1533/// `antigravity.localharness.ActionInvokeSubagent`
1534#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1535#[serde(rename_all = "camelCase")]
1536pub struct ActionInvokeSubagent {}
1537
1538/// `antigravity.localharness.ActionListDirectory`
1539#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1540#[serde(rename_all = "camelCase")]
1541pub struct ActionListDirectory {
1542    #[serde(
1543        alias = "directory_path",
1544        default,
1545        skip_serializing_if = "Option::is_none"
1546    )]
1547    pub directory_path: Option<String>,
1548    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1549    pub results: Vec<ActionListDirectoryResult>,
1550}
1551
1552/// `antigravity.localharness.ActionListDirectory.Result`
1553#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1554#[serde(rename_all = "camelCase")]
1555pub struct ActionListDirectoryResult {
1556    #[serde(
1557        alias = "is_directory",
1558        default,
1559        skip_serializing_if = "Option::is_none"
1560    )]
1561    pub is_directory: Option<bool>,
1562    #[serde(
1563        alias = "file_size",
1564        default,
1565        skip_serializing_if = "Option::is_none",
1566        with = "crate::wire::opt_int"
1567    )]
1568    pub file_size: Option<u64>,
1569    #[serde(default, skip_serializing_if = "Option::is_none")]
1570    pub name: Option<String>,
1571}
1572
1573/// The `info` oneof of [`ActionListDirectoryResult`], as an owned value.
1574#[derive(Debug, Clone, PartialEq)]
1575pub enum ActionListDirectoryResultInfo {
1576    IsDirectory(bool),
1577    FileSize(u64),
1578}
1579
1580impl ActionListDirectoryResult {
1581    /// Takes the set arm of the `info` oneof, if any.
1582    pub fn into_info(self) -> Option<ActionListDirectoryResultInfo> {
1583        if let Some(v) = self.is_directory {
1584            return Some(ActionListDirectoryResultInfo::IsDirectory(v));
1585        }
1586        if let Some(v) = self.file_size {
1587            return Some(ActionListDirectoryResultInfo::FileSize(v));
1588        }
1589        None
1590    }
1591
1592    /// True when any arm of the `info` oneof is set.
1593    pub fn has_info(&self) -> bool {
1594        self.is_directory.is_some() || self.file_size.is_some()
1595    }
1596}
1597
1598/// `antigravity.localharness.ActionMcpTool`
1599#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1600#[serde(rename_all = "camelCase")]
1601pub struct ActionMcpTool {
1602    #[serde(
1603        alias = "server_name",
1604        default,
1605        skip_serializing_if = "Option::is_none"
1606    )]
1607    pub server_name: Option<String>,
1608    #[serde(alias = "tool_name", default, skip_serializing_if = "Option::is_none")]
1609    pub tool_name: Option<String>,
1610    #[serde(
1611        alias = "arguments_json",
1612        default,
1613        skip_serializing_if = "Option::is_none"
1614    )]
1615    pub arguments_json: Option<String>,
1616}
1617
1618/// `antigravity.localharness.ActionReadUrlContent`
1619#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1620#[serde(rename_all = "camelCase")]
1621pub struct ActionReadUrlContent {
1622    #[serde(default, skip_serializing_if = "Option::is_none")]
1623    pub url: Option<String>,
1624    #[serde(default, skip_serializing_if = "Option::is_none")]
1625    pub title: Option<String>,
1626    #[serde(default, skip_serializing_if = "Option::is_none")]
1627    pub summary: Option<String>,
1628    #[serde(
1629        alias = "content_path",
1630        default,
1631        skip_serializing_if = "Option::is_none"
1632    )]
1633    pub content_path: Option<String>,
1634}
1635
1636/// `antigravity.localharness.ActionRunCommand`
1637#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1638#[serde(rename_all = "camelCase")]
1639pub struct ActionRunCommand {
1640    #[serde(
1641        alias = "command_line",
1642        default,
1643        skip_serializing_if = "Option::is_none"
1644    )]
1645    pub command_line: Option<String>,
1646    #[serde(
1647        alias = "working_dir",
1648        default,
1649        skip_serializing_if = "Option::is_none"
1650    )]
1651    pub working_dir: Option<String>,
1652    #[serde(alias = "exit_code", default, skip_serializing_if = "Option::is_none")]
1653    pub exit_code: Option<i32>,
1654    #[serde(
1655        alias = "combined_output",
1656        default,
1657        skip_serializing_if = "Option::is_none"
1658    )]
1659    pub combined_output: Option<String>,
1660}
1661
1662/// `antigravity.localharness.ActionSearchDirectory`
1663#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1664#[serde(rename_all = "camelCase")]
1665pub struct ActionSearchDirectory {
1666    #[serde(
1667        alias = "directory_path",
1668        default,
1669        skip_serializing_if = "Option::is_none"
1670    )]
1671    pub directory_path: Option<String>,
1672    #[serde(default, skip_serializing_if = "Option::is_none")]
1673    pub query: Option<String>,
1674    #[serde(
1675        alias = "num_results",
1676        default,
1677        skip_serializing_if = "Option::is_none"
1678    )]
1679    pub num_results: Option<i32>,
1680}
1681
1682/// `antigravity.localharness.ActionSearchWeb`
1683#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1684#[serde(rename_all = "camelCase")]
1685pub struct ActionSearchWeb {
1686    #[serde(default, skip_serializing_if = "Option::is_none")]
1687    pub query: Option<String>,
1688    #[serde(default, skip_serializing_if = "Option::is_none")]
1689    pub domain: Option<String>,
1690    #[serde(default, skip_serializing_if = "Option::is_none")]
1691    pub summary: Option<String>,
1692}
1693
1694/// `antigravity.localharness.ActionViewFile`
1695#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1696#[serde(rename_all = "camelCase")]
1697pub struct ActionViewFile {
1698    #[serde(alias = "file_path", default, skip_serializing_if = "Option::is_none")]
1699    pub file_path: Option<String>,
1700    #[serde(alias = "start_line", default, skip_serializing_if = "Option::is_none")]
1701    pub start_line: Option<u32>,
1702    #[serde(alias = "end_line", default, skip_serializing_if = "Option::is_none")]
1703    pub end_line: Option<u32>,
1704}
1705
1706/// `antigravity.localharness.AppendedSystemInstructions`
1707#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1708#[serde(rename_all = "camelCase")]
1709pub struct AppendedSystemInstructions {
1710    #[serde(
1711        alias = "custom_identity",
1712        default,
1713        skip_serializing_if = "Option::is_none"
1714    )]
1715    pub custom_identity: Option<String>,
1716    #[serde(
1717        alias = "appended_sections",
1718        default,
1719        skip_serializing_if = "Vec::is_empty"
1720    )]
1721    pub appended_sections: Vec<AppendedSystemInstructionsSection>,
1722}
1723
1724/// `antigravity.localharness.AppendedSystemInstructions.Section`
1725#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1726#[serde(rename_all = "camelCase")]
1727pub struct AppendedSystemInstructionsSection {
1728    #[serde(default, skip_serializing_if = "Option::is_none")]
1729    pub title: Option<String>,
1730    #[serde(default, skip_serializing_if = "Option::is_none")]
1731    pub content: Option<String>,
1732}
1733
1734/// `genai.AudioContent`
1735#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1736#[serde(rename_all = "camelCase")]
1737pub struct AudioContent {
1738    #[serde(
1739        default,
1740        skip_serializing_if = "Option::is_none",
1741        with = "crate::wire::opt_bytes"
1742    )]
1743    pub data: Option<Vec<u8>>,
1744    #[serde(default, skip_serializing_if = "Option::is_none")]
1745    pub uri: Option<String>,
1746    #[serde(alias = "mime_type", default, skip_serializing_if = "Option::is_none")]
1747    pub mime_type: Option<AudioContentMimeType>,
1748    #[serde(default, skip_serializing_if = "Option::is_none")]
1749    pub channels: Option<i32>,
1750    #[serde(
1751        alias = "sample_rate",
1752        default,
1753        skip_serializing_if = "Option::is_none"
1754    )]
1755    pub sample_rate: Option<i32>,
1756}
1757
1758/// The `data_or_uri` oneof of [`AudioContent`], as an owned value.
1759#[derive(Debug, Clone, PartialEq)]
1760pub enum AudioContentDataOrUri {
1761    Data(Vec<u8>),
1762    Uri(String),
1763}
1764
1765impl AudioContent {
1766    /// Takes the set arm of the `data_or_uri` oneof, if any.
1767    pub fn into_data_or_uri(self) -> Option<AudioContentDataOrUri> {
1768        if let Some(v) = self.data {
1769            return Some(AudioContentDataOrUri::Data(v));
1770        }
1771        if let Some(v) = self.uri {
1772            return Some(AudioContentDataOrUri::Uri(v));
1773        }
1774        None
1775    }
1776
1777    /// True when any arm of the `data_or_uri` oneof is set.
1778    pub fn has_data_or_uri(&self) -> bool {
1779        self.data.is_some() || self.uri.is_some()
1780    }
1781}
1782
1783/// `antigravity.localharness.CallHookRequest`
1784#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1785#[serde(rename_all = "camelCase")]
1786pub struct CallHookRequest {
1787    #[serde(
1788        alias = "pre_turn_args",
1789        default,
1790        skip_serializing_if = "Option::is_none"
1791    )]
1792    pub pre_turn_args: Option<PreTurnArgs>,
1793    #[serde(
1794        alias = "post_turn_args",
1795        default,
1796        skip_serializing_if = "Option::is_none"
1797    )]
1798    pub post_turn_args: Option<PostTurnArgs>,
1799    #[serde(
1800        alias = "pre_tool_args",
1801        default,
1802        skip_serializing_if = "Option::is_none"
1803    )]
1804    pub pre_tool_args: Option<PreToolArgs>,
1805    #[serde(
1806        alias = "post_tool_args",
1807        default,
1808        skip_serializing_if = "Option::is_none"
1809    )]
1810    pub post_tool_args: Option<PostToolArgs>,
1811    #[serde(
1812        alias = "on_tool_error_args",
1813        default,
1814        skip_serializing_if = "Option::is_none"
1815    )]
1816    pub on_tool_error_args: Option<OnToolErrorArgs>,
1817    #[serde(alias = "request_id", default, skip_serializing_if = "Option::is_none")]
1818    pub request_id: Option<String>,
1819    #[serde(default, skip_serializing_if = "Option::is_none")]
1820    pub name: Option<String>,
1821    #[serde(default, skip_serializing_if = "Option::is_none")]
1822    pub r#type: Option<LifecycleHook>,
1823}
1824
1825/// The `args` oneof of [`CallHookRequest`], as an owned value.
1826#[derive(Debug, Clone, PartialEq)]
1827pub enum CallHookRequestArgs {
1828    PreTurnArgs(PreTurnArgs),
1829    PostTurnArgs(PostTurnArgs),
1830    PreToolArgs(PreToolArgs),
1831    PostToolArgs(PostToolArgs),
1832    OnToolErrorArgs(OnToolErrorArgs),
1833}
1834
1835impl CallHookRequest {
1836    /// Takes the set arm of the `args` oneof, if any.
1837    pub fn into_args(self) -> Option<CallHookRequestArgs> {
1838        if let Some(v) = self.pre_turn_args {
1839            return Some(CallHookRequestArgs::PreTurnArgs(v));
1840        }
1841        if let Some(v) = self.post_turn_args {
1842            return Some(CallHookRequestArgs::PostTurnArgs(v));
1843        }
1844        if let Some(v) = self.pre_tool_args {
1845            return Some(CallHookRequestArgs::PreToolArgs(v));
1846        }
1847        if let Some(v) = self.post_tool_args {
1848            return Some(CallHookRequestArgs::PostToolArgs(v));
1849        }
1850        if let Some(v) = self.on_tool_error_args {
1851            return Some(CallHookRequestArgs::OnToolErrorArgs(v));
1852        }
1853        None
1854    }
1855
1856    /// True when any arm of the `args` oneof is set.
1857    pub fn has_args(&self) -> bool {
1858        self.pre_turn_args.is_some()
1859            || self.post_turn_args.is_some()
1860            || self.pre_tool_args.is_some()
1861            || self.post_tool_args.is_some()
1862            || self.on_tool_error_args.is_some()
1863    }
1864}
1865
1866/// `antigravity.localharness.CallHookResponse`
1867#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1868#[serde(rename_all = "camelCase")]
1869pub struct CallHookResponse {
1870    #[serde(
1871        alias = "pre_turn_result",
1872        default,
1873        skip_serializing_if = "Option::is_none"
1874    )]
1875    pub pre_turn_result: Option<PreTurnResult>,
1876    #[serde(
1877        alias = "pre_tool_result",
1878        default,
1879        skip_serializing_if = "Option::is_none"
1880    )]
1881    pub pre_tool_result: Option<PreToolResult>,
1882    #[serde(
1883        alias = "empty_result",
1884        default,
1885        skip_serializing_if = "Option::is_none"
1886    )]
1887    pub empty_result: Option<EmptyResult>,
1888    #[serde(
1889        alias = "error_message",
1890        default,
1891        skip_serializing_if = "Option::is_none"
1892    )]
1893    pub error_message: Option<String>,
1894    #[serde(
1895        alias = "on_tool_error_result",
1896        default,
1897        skip_serializing_if = "Option::is_none"
1898    )]
1899    pub on_tool_error_result: Option<OnToolErrorResult>,
1900    #[serde(alias = "request_id", default, skip_serializing_if = "Option::is_none")]
1901    pub request_id: Option<String>,
1902}
1903
1904/// The `result` oneof of [`CallHookResponse`], as an owned value.
1905#[derive(Debug, Clone, PartialEq)]
1906pub enum CallHookResponseResult {
1907    PreTurnResult(PreTurnResult),
1908    PreToolResult(PreToolResult),
1909    EmptyResult(EmptyResult),
1910    ErrorMessage(String),
1911    OnToolErrorResult(OnToolErrorResult),
1912}
1913
1914impl CallHookResponse {
1915    /// Takes the set arm of the `result` oneof, if any.
1916    pub fn into_result(self) -> Option<CallHookResponseResult> {
1917        if let Some(v) = self.pre_turn_result {
1918            return Some(CallHookResponseResult::PreTurnResult(v));
1919        }
1920        if let Some(v) = self.pre_tool_result {
1921            return Some(CallHookResponseResult::PreToolResult(v));
1922        }
1923        if let Some(v) = self.empty_result {
1924            return Some(CallHookResponseResult::EmptyResult(v));
1925        }
1926        if let Some(v) = self.error_message {
1927            return Some(CallHookResponseResult::ErrorMessage(v));
1928        }
1929        if let Some(v) = self.on_tool_error_result {
1930            return Some(CallHookResponseResult::OnToolErrorResult(v));
1931        }
1932        None
1933    }
1934
1935    /// True when any arm of the `result` oneof is set.
1936    pub fn has_result(&self) -> bool {
1937        self.pre_turn_result.is_some()
1938            || self.pre_tool_result.is_some()
1939            || self.empty_result.is_some()
1940            || self.error_message.is_some()
1941            || self.on_tool_error_result.is_some()
1942    }
1943}
1944
1945/// `antigravity.localharness.ClientInfo`
1946#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1947#[serde(rename_all = "camelCase")]
1948pub struct ClientInfo {
1949    #[serde(default, skip_serializing_if = "Option::is_none")]
1950    pub language: Option<String>,
1951    #[serde(default, skip_serializing_if = "Option::is_none")]
1952    pub version: Option<String>,
1953    #[serde(
1954        alias = "language_version",
1955        default,
1956        skip_serializing_if = "Option::is_none"
1957    )]
1958    pub language_version: Option<String>,
1959    #[serde(default, skip_serializing_if = "Option::is_none")]
1960    pub os: Option<String>,
1961    #[serde(alias = "os_version", default, skip_serializing_if = "Option::is_none")]
1962    pub os_version: Option<String>,
1963}
1964
1965/// `genai.CodeExecutionCallContent`
1966#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1967#[serde(rename_all = "camelCase")]
1968pub struct CodeExecutionCallContent {
1969    #[serde(default, skip_serializing_if = "Option::is_none")]
1970    pub arguments: Option<CodeExecutionCallContentCodeExecutionCallArguments>,
1971}
1972
1973/// `genai.CodeExecutionCallContent.CodeExecutionCallArguments`
1974#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1975#[serde(rename_all = "camelCase")]
1976pub struct CodeExecutionCallContentCodeExecutionCallArguments {
1977    #[serde(default, skip_serializing_if = "Option::is_none")]
1978    pub language: Option<CodeExecutionCallContentCodeExecutionCallArgumentsLanguage>,
1979    #[serde(default, skip_serializing_if = "Option::is_none")]
1980    pub code: Option<String>,
1981}
1982
1983/// `genai.CodeExecutionResultContent`
1984#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1985#[serde(rename_all = "camelCase")]
1986pub struct CodeExecutionResultContent {
1987    #[serde(default, skip_serializing_if = "Option::is_none")]
1988    pub result: Option<String>,
1989    #[serde(alias = "is_error", default, skip_serializing_if = "Option::is_none")]
1990    pub is_error: Option<bool>,
1991}
1992
1993/// `genai.Content`
1994#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1995#[serde(rename_all = "camelCase")]
1996pub struct Content {
1997    #[serde(default, skip_serializing_if = "Option::is_none")]
1998    pub text: Option<TextContent>,
1999    #[serde(default, skip_serializing_if = "Option::is_none")]
2000    pub image: Option<ImageContent>,
2001    #[serde(default, skip_serializing_if = "Option::is_none")]
2002    pub audio: Option<AudioContent>,
2003    #[serde(default, skip_serializing_if = "Option::is_none")]
2004    pub document: Option<DocumentContent>,
2005    #[serde(default, skip_serializing_if = "Option::is_none")]
2006    pub video: Option<VideoContent>,
2007    #[serde(default, skip_serializing_if = "Option::is_none")]
2008    pub thought: Option<ThoughtContent>,
2009    #[serde(alias = "tool_call", default, skip_serializing_if = "Option::is_none")]
2010    pub tool_call: Option<ToolCallContent>,
2011    #[serde(
2012        alias = "tool_result",
2013        default,
2014        skip_serializing_if = "Option::is_none"
2015    )]
2016    pub tool_result: Option<ToolResultContent>,
2017}
2018
2019/// The `type` oneof of [`Content`], as an owned value.
2020#[derive(Debug, Clone, PartialEq)]
2021pub enum ContentType {
2022    Text(TextContent),
2023    Image(ImageContent),
2024    Audio(AudioContent),
2025    Document(DocumentContent),
2026    Video(VideoContent),
2027    Thought(ThoughtContent),
2028    ToolCall(ToolCallContent),
2029    ToolResult(ToolResultContent),
2030}
2031
2032impl Content {
2033    /// Takes the set arm of the `type` oneof, if any.
2034    pub fn into_type(self) -> Option<ContentType> {
2035        if let Some(v) = self.text {
2036            return Some(ContentType::Text(v));
2037        }
2038        if let Some(v) = self.image {
2039            return Some(ContentType::Image(v));
2040        }
2041        if let Some(v) = self.audio {
2042            return Some(ContentType::Audio(v));
2043        }
2044        if let Some(v) = self.document {
2045            return Some(ContentType::Document(v));
2046        }
2047        if let Some(v) = self.video {
2048            return Some(ContentType::Video(v));
2049        }
2050        if let Some(v) = self.thought {
2051            return Some(ContentType::Thought(v));
2052        }
2053        if let Some(v) = self.tool_call {
2054            return Some(ContentType::ToolCall(v));
2055        }
2056        if let Some(v) = self.tool_result {
2057            return Some(ContentType::ToolResult(v));
2058        }
2059        None
2060    }
2061
2062    /// True when any arm of the `type` oneof is set.
2063    pub fn has_type(&self) -> bool {
2064        self.text.is_some()
2065            || self.image.is_some()
2066            || self.audio.is_some()
2067            || self.document.is_some()
2068            || self.video.is_some()
2069            || self.thought.is_some()
2070            || self.tool_call.is_some()
2071            || self.tool_result.is_some()
2072    }
2073}
2074
2075/// `antigravity.localharness.CustomAgent`
2076#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2077#[serde(rename_all = "camelCase")]
2078pub struct CustomAgent {
2079    #[serde(default, skip_serializing_if = "Option::is_none")]
2080    pub name: Option<String>,
2081    #[serde(default, skip_serializing_if = "Option::is_none")]
2082    pub description: Option<String>,
2083    #[serde(
2084        alias = "system_instructions",
2085        default,
2086        skip_serializing_if = "Option::is_none"
2087    )]
2088    pub system_instructions: Option<SystemInstructions>,
2089    #[serde(
2090        alias = "harness_side_tools",
2091        default,
2092        skip_serializing_if = "Option::is_none"
2093    )]
2094    pub harness_side_tools: Option<HarnessSideTools>,
2095    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2096    pub tools: Vec<Tool>,
2097}
2098
2099/// `antigravity.localharness.CustomEndpoint`
2100#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2101#[serde(rename_all = "camelCase")]
2102pub struct CustomEndpoint {
2103    #[serde(
2104        alias = "backend_type",
2105        default,
2106        skip_serializing_if = "Option::is_none"
2107    )]
2108    pub backend_type: Option<String>,
2109    #[serde(
2110        alias = "config_json",
2111        default,
2112        skip_serializing_if = "Option::is_none"
2113    )]
2114    pub config_json: Option<String>,
2115}
2116
2117/// `antigravity.localharness.CustomSystemInstructions`
2118#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2119#[serde(rename_all = "camelCase")]
2120pub struct CustomSystemInstructions {
2121    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2122    pub part: Vec<CustomSystemInstructionsPart>,
2123}
2124
2125/// `antigravity.localharness.CustomSystemInstructions.Part`
2126#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2127#[serde(rename_all = "camelCase")]
2128pub struct CustomSystemInstructionsPart {
2129    #[serde(default, skip_serializing_if = "Option::is_none")]
2130    pub text: Option<String>,
2131    #[serde(default, skip_serializing_if = "Option::is_none")]
2132    pub template: Option<CustomSystemInstructionsSystemInstructionTemplate>,
2133}
2134
2135/// The `part` oneof of [`CustomSystemInstructionsPart`], as an owned value.
2136#[derive(Debug, Clone, PartialEq)]
2137pub enum CustomSystemInstructionsPartPart {
2138    Text(String),
2139    Template(CustomSystemInstructionsSystemInstructionTemplate),
2140}
2141
2142impl CustomSystemInstructionsPart {
2143    /// Takes the set arm of the `part` oneof, if any.
2144    pub fn into_part(self) -> Option<CustomSystemInstructionsPartPart> {
2145        if let Some(v) = self.text {
2146            return Some(CustomSystemInstructionsPartPart::Text(v));
2147        }
2148        if let Some(v) = self.template {
2149            return Some(CustomSystemInstructionsPartPart::Template(v));
2150        }
2151        None
2152    }
2153
2154    /// True when any arm of the `part` oneof is set.
2155    pub fn has_part(&self) -> bool {
2156        self.text.is_some() || self.template.is_some()
2157    }
2158}
2159
2160/// `antigravity.localharness.CustomSystemInstructions.SystemInstructionTemplate`
2161#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2162#[serde(rename_all = "camelCase")]
2163pub struct CustomSystemInstructionsSystemInstructionTemplate {
2164    #[serde(
2165        alias = "template_name",
2166        default,
2167        skip_serializing_if = "Option::is_none"
2168    )]
2169    pub template_name: Option<String>,
2170    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2171    pub args: Vec<CustomSystemInstructionsSystemInstructionTemplateArg>,
2172}
2173
2174/// `antigravity.localharness.CustomSystemInstructions.SystemInstructionTemplate.Arg`
2175#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2176#[serde(rename_all = "camelCase")]
2177pub struct CustomSystemInstructionsSystemInstructionTemplateArg {
2178    #[serde(default, skip_serializing_if = "Option::is_none")]
2179    pub name: Option<String>,
2180    #[serde(default, skip_serializing_if = "Option::is_none")]
2181    pub value: Option<String>,
2182}
2183
2184/// `genai.DocumentContent`
2185#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2186#[serde(rename_all = "camelCase")]
2187pub struct DocumentContent {
2188    #[serde(
2189        default,
2190        skip_serializing_if = "Option::is_none",
2191        with = "crate::wire::opt_bytes"
2192    )]
2193    pub data: Option<Vec<u8>>,
2194    #[serde(default, skip_serializing_if = "Option::is_none")]
2195    pub uri: Option<String>,
2196    #[serde(alias = "mime_type", default, skip_serializing_if = "Option::is_none")]
2197    pub mime_type: Option<DocumentContentMimeType>,
2198}
2199
2200/// The `data_or_uri` oneof of [`DocumentContent`], as an owned value.
2201#[derive(Debug, Clone, PartialEq)]
2202pub enum DocumentContentDataOrUri {
2203    Data(Vec<u8>),
2204    Uri(String),
2205}
2206
2207impl DocumentContent {
2208    /// Takes the set arm of the `data_or_uri` oneof, if any.
2209    pub fn into_data_or_uri(self) -> Option<DocumentContentDataOrUri> {
2210        if let Some(v) = self.data {
2211            return Some(DocumentContentDataOrUri::Data(v));
2212        }
2213        if let Some(v) = self.uri {
2214            return Some(DocumentContentDataOrUri::Uri(v));
2215        }
2216        None
2217    }
2218
2219    /// True when any arm of the `data_or_uri` oneof is set.
2220    pub fn has_data_or_uri(&self) -> bool {
2221        self.data.is_some() || self.uri.is_some()
2222    }
2223}
2224
2225/// `antigravity.localharness.EmptyResult`
2226#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2227#[serde(rename_all = "camelCase")]
2228pub struct EmptyResult {}
2229
2230/// `genai.Field`
2231#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2232#[serde(rename_all = "camelCase")]
2233pub struct Field {
2234    #[serde(default, skip_serializing_if = "Option::is_none")]
2235    pub name: Option<String>,
2236    #[serde(default, skip_serializing_if = "Option::is_none")]
2237    pub value: Option<Value>,
2238}
2239
2240/// `genai.FileCitation`
2241#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2242#[serde(rename_all = "camelCase")]
2243pub struct FileCitation {
2244    #[serde(
2245        alias = "document_uri",
2246        default,
2247        skip_serializing_if = "Option::is_none"
2248    )]
2249    pub document_uri: Option<String>,
2250    #[serde(alias = "file_name", default, skip_serializing_if = "Option::is_none")]
2251    pub file_name: Option<String>,
2252    #[serde(default, skip_serializing_if = "Option::is_none")]
2253    pub source: Option<String>,
2254    #[serde(
2255        alias = "custom_metadata",
2256        default,
2257        skip_serializing_if = "Option::is_none"
2258    )]
2259    pub custom_metadata: Option<Struct>,
2260    #[serde(
2261        alias = "page_number",
2262        default,
2263        skip_serializing_if = "Option::is_none"
2264    )]
2265    pub page_number: Option<i32>,
2266    #[serde(alias = "media_id", default, skip_serializing_if = "Option::is_none")]
2267    pub media_id: Option<String>,
2268}
2269
2270/// `antigravity.localharness.FileEditToolConfig`
2271#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2272#[serde(rename_all = "camelCase")]
2273pub struct FileEditToolConfig {
2274    #[serde(default, skip_serializing_if = "Option::is_none")]
2275    pub enabled: Option<bool>,
2276}
2277
2278/// `genai.FileSearchCallContent`
2279#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2280#[serde(rename_all = "camelCase")]
2281pub struct FileSearchCallContent {}
2282
2283/// `genai.FileSearchResultContent`
2284#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2285#[serde(rename_all = "camelCase")]
2286pub struct FileSearchResultContent {
2287    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2288    pub result: Vec<FileSearchResultContentFileSearchResult>,
2289}
2290
2291/// `genai.FileSearchResultContent.FileSearchResult`
2292#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2293#[serde(rename_all = "camelCase")]
2294pub struct FileSearchResultContentFileSearchResult {}
2295
2296/// `antigravity.localharness.FilesystemWorkspace`
2297#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2298#[serde(rename_all = "camelCase")]
2299pub struct FilesystemWorkspace {
2300    #[serde(default, skip_serializing_if = "Option::is_none")]
2301    pub directory: Option<String>,
2302}
2303
2304/// `antigravity.localharness.FindToolConfig`
2305#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2306#[serde(rename_all = "camelCase")]
2307pub struct FindToolConfig {
2308    #[serde(default, skip_serializing_if = "Option::is_none")]
2309    pub enabled: Option<bool>,
2310}
2311
2312/// `genai.FunctionCallContent`
2313#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2314#[serde(rename_all = "camelCase")]
2315pub struct FunctionCallContent {
2316    #[serde(default, skip_serializing_if = "Option::is_none")]
2317    pub name: Option<String>,
2318    #[serde(default, skip_serializing_if = "Option::is_none")]
2319    pub arguments: Option<Struct>,
2320}
2321
2322/// `genai.FunctionResultContent`
2323#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2324#[serde(rename_all = "camelCase")]
2325pub struct FunctionResultContent {
2326    #[serde(
2327        alias = "struct_result",
2328        default,
2329        skip_serializing_if = "Option::is_none"
2330    )]
2331    pub struct_result: Option<Struct>,
2332    #[serde(
2333        alias = "content_list",
2334        default,
2335        skip_serializing_if = "Option::is_none"
2336    )]
2337    pub content_list: Option<FunctionResultSubcontentList>,
2338    #[serde(
2339        alias = "string_result",
2340        default,
2341        skip_serializing_if = "Option::is_none"
2342    )]
2343    pub string_result: Option<String>,
2344    #[serde(default, skip_serializing_if = "Option::is_none")]
2345    pub name: Option<String>,
2346    #[serde(alias = "is_error", default, skip_serializing_if = "Option::is_none")]
2347    pub is_error: Option<bool>,
2348}
2349
2350/// The `result` oneof of [`FunctionResultContent`], as an owned value.
2351#[derive(Debug, Clone, PartialEq)]
2352pub enum FunctionResultContentResult {
2353    StructResult(Struct),
2354    ContentList(FunctionResultSubcontentList),
2355    StringResult(String),
2356}
2357
2358impl FunctionResultContent {
2359    /// Takes the set arm of the `result` oneof, if any.
2360    pub fn into_result(self) -> Option<FunctionResultContentResult> {
2361        if let Some(v) = self.struct_result {
2362            return Some(FunctionResultContentResult::StructResult(v));
2363        }
2364        if let Some(v) = self.content_list {
2365            return Some(FunctionResultContentResult::ContentList(v));
2366        }
2367        if let Some(v) = self.string_result {
2368            return Some(FunctionResultContentResult::StringResult(v));
2369        }
2370        None
2371    }
2372
2373    /// True when any arm of the `result` oneof is set.
2374    pub fn has_result(&self) -> bool {
2375        self.struct_result.is_some() || self.content_list.is_some() || self.string_result.is_some()
2376    }
2377}
2378
2379/// `genai.FunctionResultSubcontent`
2380#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2381#[serde(rename_all = "camelCase")]
2382pub struct FunctionResultSubcontent {
2383    #[serde(default, skip_serializing_if = "Option::is_none")]
2384    pub text: Option<TextContent>,
2385    #[serde(default, skip_serializing_if = "Option::is_none")]
2386    pub image: Option<ImageContent>,
2387}
2388
2389/// The `type` oneof of [`FunctionResultSubcontent`], as an owned value.
2390#[derive(Debug, Clone, PartialEq)]
2391pub enum FunctionResultSubcontentType {
2392    Text(TextContent),
2393    Image(ImageContent),
2394}
2395
2396impl FunctionResultSubcontent {
2397    /// Takes the set arm of the `type` oneof, if any.
2398    pub fn into_type(self) -> Option<FunctionResultSubcontentType> {
2399        if let Some(v) = self.text {
2400            return Some(FunctionResultSubcontentType::Text(v));
2401        }
2402        if let Some(v) = self.image {
2403            return Some(FunctionResultSubcontentType::Image(v));
2404        }
2405        None
2406    }
2407
2408    /// True when any arm of the `type` oneof is set.
2409    pub fn has_type(&self) -> bool {
2410        self.text.is_some() || self.image.is_some()
2411    }
2412}
2413
2414/// `genai.FunctionResultSubcontentList`
2415#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2416#[serde(rename_all = "camelCase")]
2417pub struct FunctionResultSubcontentList {
2418    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2419    pub contents: Vec<FunctionResultSubcontent>,
2420}
2421
2422/// `antigravity.localharness.GeminiAPIEndpoint`
2423#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2424#[serde(rename_all = "camelCase")]
2425pub struct GeminiAPIEndpoint {
2426    #[serde(alias = "base_url", default, skip_serializing_if = "Option::is_none")]
2427    pub base_url: Option<String>,
2428    #[serde(
2429        alias = "http_headers",
2430        default,
2431        skip_serializing_if = "HashMap::is_empty"
2432    )]
2433    pub http_headers: HashMap<String, String>,
2434    #[serde(alias = "api_key", default, skip_serializing_if = "Option::is_none")]
2435    pub api_key: Option<String>,
2436    #[serde(default, skip_serializing_if = "Option::is_none")]
2437    pub options: Option<GeminiModelOptions>,
2438}
2439
2440/// `antigravity.localharness.GeminiModelOptions`
2441#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2442#[serde(rename_all = "camelCase")]
2443pub struct GeminiModelOptions {
2444    #[serde(
2445        alias = "thinking_level",
2446        default,
2447        skip_serializing_if = "Option::is_none"
2448    )]
2449    pub thinking_level: Option<String>,
2450    #[serde(
2451        alias = "service_tier",
2452        default,
2453        skip_serializing_if = "Option::is_none"
2454    )]
2455    pub service_tier: Option<String>,
2456}
2457
2458/// `antigravity.localharness.GemmaEndpoint`
2459#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2460#[serde(rename_all = "camelCase")]
2461pub struct GemmaEndpoint {
2462    #[serde(alias = "base_url", default, skip_serializing_if = "Option::is_none")]
2463    pub base_url: Option<String>,
2464}
2465
2466/// `antigravity.localharness.GenerateImageToolConfig`
2467#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2468#[serde(rename_all = "camelCase")]
2469pub struct GenerateImageToolConfig {
2470    #[serde(default, skip_serializing_if = "Option::is_none")]
2471    pub enabled: Option<bool>,
2472}
2473
2474/// `genai.GoogleMapsCallContent`
2475#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2476#[serde(rename_all = "camelCase")]
2477pub struct GoogleMapsCallContent {
2478    #[serde(default, skip_serializing_if = "Option::is_none")]
2479    pub arguments: Option<GoogleMapsCallContentGoogleMapsCallArguments>,
2480}
2481
2482/// `genai.GoogleMapsCallContent.GoogleMapsCallArguments`
2483#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2484#[serde(rename_all = "camelCase")]
2485pub struct GoogleMapsCallContentGoogleMapsCallArguments {
2486    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2487    pub queries: Vec<String>,
2488}
2489
2490/// `genai.GoogleMapsResultContent`
2491#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2492#[serde(rename_all = "camelCase")]
2493pub struct GoogleMapsResultContent {
2494    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2495    pub result: Vec<GoogleMapsResultContentGoogleMapsResult>,
2496}
2497
2498/// `genai.GoogleMapsResultContent.GoogleMapsResult`
2499#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2500#[serde(rename_all = "camelCase")]
2501pub struct GoogleMapsResultContentGoogleMapsResult {
2502    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2503    pub places: Vec<GoogleMapsResultContentGoogleMapsResultPlaces>,
2504    #[serde(
2505        alias = "widget_context_token",
2506        default,
2507        skip_serializing_if = "Option::is_none"
2508    )]
2509    pub widget_context_token: Option<String>,
2510}
2511
2512/// `genai.GoogleMapsResultContent.GoogleMapsResult.Places`
2513#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2514#[serde(rename_all = "camelCase")]
2515pub struct GoogleMapsResultContentGoogleMapsResultPlaces {
2516    #[serde(alias = "place_id", default, skip_serializing_if = "Option::is_none")]
2517    pub place_id: Option<String>,
2518    #[serde(default, skip_serializing_if = "Option::is_none")]
2519    pub name: Option<String>,
2520    #[serde(default, skip_serializing_if = "Option::is_none")]
2521    pub url: Option<String>,
2522    #[serde(
2523        alias = "review_snippets",
2524        default,
2525        skip_serializing_if = "Vec::is_empty"
2526    )]
2527    pub review_snippets: Vec<ReviewSnippet>,
2528}
2529
2530/// `genai.GoogleSearchCallContent`
2531#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2532#[serde(rename_all = "camelCase")]
2533pub struct GoogleSearchCallContent {
2534    #[serde(default, skip_serializing_if = "Option::is_none")]
2535    pub arguments: Option<GoogleSearchCallContentGoogleSearchCallArguments>,
2536    #[serde(
2537        alias = "search_type",
2538        default,
2539        skip_serializing_if = "Option::is_none"
2540    )]
2541    pub search_type: Option<GoogleSearchSearchType>,
2542}
2543
2544/// `genai.GoogleSearchCallContent.GoogleSearchCallArguments`
2545#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2546#[serde(rename_all = "camelCase")]
2547pub struct GoogleSearchCallContentGoogleSearchCallArguments {
2548    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2549    pub queries: Vec<String>,
2550}
2551
2552/// `genai.GoogleSearchResultContent`
2553#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2554#[serde(rename_all = "camelCase")]
2555pub struct GoogleSearchResultContent {
2556    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2557    pub result: Vec<GoogleSearchResultContentGoogleSearchResult>,
2558    #[serde(alias = "is_error", default, skip_serializing_if = "Option::is_none")]
2559    pub is_error: Option<bool>,
2560}
2561
2562/// `genai.GoogleSearchResultContent.GoogleSearchResult`
2563#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2564#[serde(rename_all = "camelCase")]
2565pub struct GoogleSearchResultContentGoogleSearchResult {
2566    #[serde(
2567        alias = "search_suggestions",
2568        default,
2569        skip_serializing_if = "Option::is_none"
2570    )]
2571    pub search_suggestions: Option<String>,
2572}
2573
2574/// `antigravity.localharness.GrepSearchToolConfig`
2575#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2576#[serde(rename_all = "camelCase")]
2577pub struct GrepSearchToolConfig {
2578    #[serde(default, skip_serializing_if = "Option::is_none")]
2579    pub enabled: Option<bool>,
2580}
2581
2582/// `antigravity.localharness.HarnessConfig`
2583#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2584#[serde(rename_all = "camelCase")]
2585pub struct HarnessConfig {
2586    #[serde(alias = "cascade_id", default, skip_serializing_if = "Option::is_none")]
2587    pub cascade_id: Option<String>,
2588    #[serde(
2589        alias = "session_continuation_mode",
2590        default,
2591        skip_serializing_if = "Option::is_none"
2592    )]
2593    pub session_continuation_mode: Option<HarnessConfigSessionContinuationMode>,
2594    #[serde(
2595        alias = "system_instructions",
2596        default,
2597        skip_serializing_if = "Option::is_none"
2598    )]
2599    pub system_instructions: Option<SystemInstructions>,
2600    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2601    pub tools: Vec<Tool>,
2602    #[serde(
2603        alias = "harness_side_tools",
2604        default,
2605        skip_serializing_if = "Option::is_none"
2606    )]
2607    pub harness_side_tools: Option<HarnessSideTools>,
2608    #[serde(
2609        alias = "compaction_threshold",
2610        default,
2611        skip_serializing_if = "Option::is_none"
2612    )]
2613    pub compaction_threshold: Option<u32>,
2614    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2615    pub workspaces: Vec<Workspace>,
2616    #[serde(alias = "skills_paths", default, skip_serializing_if = "Vec::is_empty")]
2617    pub skills_paths: Vec<String>,
2618    #[serde(
2619        alias = "finish_tool_schema_json",
2620        default,
2621        skip_serializing_if = "Option::is_none"
2622    )]
2623    pub finish_tool_schema_json: Option<String>,
2624    #[serde(
2625        alias = "initial_trajectory",
2626        default,
2627        skip_serializing_if = "Option::is_none",
2628        with = "crate::wire::opt_bytes"
2629    )]
2630    pub initial_trajectory: Option<Vec<u8>>,
2631    #[serde(
2632        alias = "app_data_dir",
2633        default,
2634        skip_serializing_if = "Option::is_none"
2635    )]
2636    pub app_data_dir: Option<String>,
2637    #[serde(alias = "mcp_servers", default, skip_serializing_if = "Vec::is_empty")]
2638    pub mcp_servers: Vec<McpServerConfig>,
2639    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2640    pub models: Vec<ModelConfig>,
2641    #[serde(
2642        alias = "enabled_hooks",
2643        default,
2644        skip_serializing_if = "Vec::is_empty"
2645    )]
2646    pub enabled_hooks: Vec<LifecycleHook>,
2647    #[serde(
2648        alias = "custom_subagents",
2649        default,
2650        skip_serializing_if = "Vec::is_empty"
2651    )]
2652    pub custom_subagents: Vec<CustomAgent>,
2653    #[serde(
2654        alias = "tool_output_truncation",
2655        default,
2656        skip_serializing_if = "Option::is_none"
2657    )]
2658    pub tool_output_truncation: Option<ToolOutputTruncation>,
2659    #[serde(
2660        alias = "retry_config",
2661        default,
2662        skip_serializing_if = "Option::is_none"
2663    )]
2664    pub retry_config: Option<RetryConfig>,
2665    #[serde(
2666        alias = "policy_config",
2667        default,
2668        skip_serializing_if = "Option::is_none"
2669    )]
2670    pub policy_config: Option<PolicyConfig>,
2671}
2672
2673/// `antigravity.localharness.HarnessSideTools`
2674#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2675#[serde(rename_all = "camelCase")]
2676pub struct HarnessSideTools {
2677    #[serde(default, skip_serializing_if = "Option::is_none")]
2678    pub find: Option<FindToolConfig>,
2679    #[serde(
2680        alias = "run_command",
2681        default,
2682        skip_serializing_if = "Option::is_none"
2683    )]
2684    pub run_command: Option<RunCommandToolConfig>,
2685    #[serde(default, skip_serializing_if = "Option::is_none")]
2686    pub subagents: Option<SubagentsConfig>,
2687    #[serde(
2688        alias = "user_questions",
2689        default,
2690        skip_serializing_if = "Option::is_none"
2691    )]
2692    pub user_questions: Option<UserQuestionsConfig>,
2693    #[serde(alias = "file_edit", default, skip_serializing_if = "Option::is_none")]
2694    pub file_edit: Option<FileEditToolConfig>,
2695    #[serde(alias = "view_file", default, skip_serializing_if = "Option::is_none")]
2696    pub view_file: Option<ViewFileToolConfig>,
2697    #[serde(
2698        alias = "write_to_file",
2699        default,
2700        skip_serializing_if = "Option::is_none"
2701    )]
2702    pub write_to_file: Option<WriteToFileToolConfig>,
2703    #[serde(
2704        alias = "grep_search",
2705        default,
2706        skip_serializing_if = "Option::is_none"
2707    )]
2708    pub grep_search: Option<GrepSearchToolConfig>,
2709    #[serde(alias = "list_dir", default, skip_serializing_if = "Option::is_none")]
2710    pub list_dir: Option<ListDirToolConfig>,
2711    #[serde(default, skip_serializing_if = "Option::is_none")]
2712    pub permissions: Option<PermissionsConfig>,
2713    #[serde(
2714        alias = "generate_image",
2715        default,
2716        skip_serializing_if = "Option::is_none"
2717    )]
2718    pub generate_image: Option<GenerateImageToolConfig>,
2719    #[serde(alias = "search_web", default, skip_serializing_if = "Option::is_none")]
2720    pub search_web: Option<SearchWebToolConfig>,
2721    #[serde(
2722        alias = "read_url_content",
2723        default,
2724        skip_serializing_if = "Option::is_none"
2725    )]
2726    pub read_url_content: Option<ReadUrlContentToolConfig>,
2727    #[serde(
2728        alias = "tool_search_config",
2729        default,
2730        skip_serializing_if = "Option::is_none"
2731    )]
2732    pub tool_search_config: Option<ToolSearchConfig>,
2733}
2734
2735/// `genai.ImageContent`
2736#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2737#[serde(rename_all = "camelCase")]
2738pub struct ImageContent {
2739    #[serde(
2740        default,
2741        skip_serializing_if = "Option::is_none",
2742        with = "crate::wire::opt_bytes"
2743    )]
2744    pub data: Option<Vec<u8>>,
2745    #[serde(default, skip_serializing_if = "Option::is_none")]
2746    pub uri: Option<String>,
2747    #[serde(alias = "mime_type", default, skip_serializing_if = "Option::is_none")]
2748    pub mime_type: Option<ImageContentMimeType>,
2749    #[serde(default, skip_serializing_if = "Option::is_none")]
2750    pub resolution: Option<MediaResolution>,
2751}
2752
2753/// The `data_or_uri` oneof of [`ImageContent`], as an owned value.
2754#[derive(Debug, Clone, PartialEq)]
2755pub enum ImageContentDataOrUri {
2756    Data(Vec<u8>),
2757    Uri(String),
2758}
2759
2760impl ImageContent {
2761    /// Takes the set arm of the `data_or_uri` oneof, if any.
2762    pub fn into_data_or_uri(self) -> Option<ImageContentDataOrUri> {
2763        if let Some(v) = self.data {
2764            return Some(ImageContentDataOrUri::Data(v));
2765        }
2766        if let Some(v) = self.uri {
2767            return Some(ImageContentDataOrUri::Uri(v));
2768        }
2769        None
2770    }
2771
2772    /// True when any arm of the `data_or_uri` oneof is set.
2773    pub fn has_data_or_uri(&self) -> bool {
2774        self.data.is_some() || self.uri.is_some()
2775    }
2776}
2777
2778/// `antigravity.localharness.InitializeConversationEvent`
2779#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2780#[serde(rename_all = "camelCase")]
2781pub struct InitializeConversationEvent {
2782    #[serde(default, skip_serializing_if = "Option::is_none")]
2783    pub config: Option<HarnessConfig>,
2784}
2785
2786/// `antigravity.localharness.InitializeConversationResponse`
2787#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2788#[serde(rename_all = "camelCase")]
2789pub struct InitializeConversationResponse {
2790    #[serde(alias = "cascade_id", default, skip_serializing_if = "Option::is_none")]
2791    pub cascade_id: Option<String>,
2792    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2793    pub history: Vec<StepUpdate>,
2794    #[serde(
2795        alias = "cumulative_usage",
2796        default,
2797        skip_serializing_if = "Option::is_none"
2798    )]
2799    pub cumulative_usage: Option<UsageMetadata>,
2800    #[serde(
2801        alias = "trajectory_usage",
2802        default,
2803        skip_serializing_if = "Vec::is_empty"
2804    )]
2805    pub trajectory_usage: Vec<TrajectoryUsageEntry>,
2806}
2807
2808/// `antigravity.localharness.InputConfig`
2809#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2810#[serde(rename_all = "camelCase")]
2811pub struct InputConfig {
2812    #[serde(
2813        alias = "storage_directory",
2814        default,
2815        skip_serializing_if = "Option::is_none"
2816    )]
2817    pub storage_directory: Option<String>,
2818    #[serde(default, skip_serializing_if = "Option::is_none")]
2819    pub port: Option<u32>,
2820    /// Proto default: `localhost`.
2821    #[serde(
2822        alias = "bind_address",
2823        default,
2824        skip_serializing_if = "Option::is_none"
2825    )]
2826    pub bind_address: Option<String>,
2827    #[serde(
2828        alias = "client_info",
2829        default,
2830        skip_serializing_if = "Option::is_none"
2831    )]
2832    pub client_info: Option<ClientInfo>,
2833    #[serde(default, skip_serializing_if = "HashMap::is_empty")]
2834    pub env: HashMap<String, String>,
2835}
2836
2837/// `antigravity.localharness.InputEvent`
2838#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2839#[serde(rename_all = "camelCase")]
2840pub struct InputEvent {
2841    #[serde(alias = "user_input", default, skip_serializing_if = "Option::is_none")]
2842    pub user_input: Option<String>,
2843    #[serde(
2844        alias = "complex_user_input",
2845        default,
2846        skip_serializing_if = "Option::is_none"
2847    )]
2848    pub complex_user_input: Option<UserInput>,
2849    #[serde(
2850        alias = "tool_confirmation",
2851        default,
2852        skip_serializing_if = "Option::is_none"
2853    )]
2854    pub tool_confirmation: Option<ToolConfirmation>,
2855    #[serde(
2856        alias = "tool_response",
2857        default,
2858        skip_serializing_if = "Option::is_none"
2859    )]
2860    pub tool_response: Option<ToolResponse>,
2861    #[serde(
2862        alias = "question_response",
2863        default,
2864        skip_serializing_if = "Option::is_none"
2865    )]
2866    pub question_response: Option<UserQuestionsResponse>,
2867    #[serde(
2868        alias = "halt_request",
2869        default,
2870        skip_serializing_if = "Option::is_none"
2871    )]
2872    pub halt_request: Option<bool>,
2873    #[serde(
2874        alias = "automated_trigger",
2875        default,
2876        skip_serializing_if = "Option::is_none"
2877    )]
2878    pub automated_trigger: Option<String>,
2879    #[serde(
2880        alias = "call_hook_response",
2881        default,
2882        skip_serializing_if = "Option::is_none"
2883    )]
2884    pub call_hook_response: Option<CallHookResponse>,
2885    #[serde(
2886        alias = "session_end_request",
2887        default,
2888        skip_serializing_if = "Option::is_none"
2889    )]
2890    pub session_end_request: Option<bool>,
2891    #[serde(
2892        alias = "policy_decision_response",
2893        default,
2894        skip_serializing_if = "Option::is_none"
2895    )]
2896    pub policy_decision_response: Option<PolicyDecisionResponse>,
2897}
2898
2899/// The `event` oneof of [`InputEvent`], as an owned value.
2900#[derive(Debug, Clone, PartialEq)]
2901pub enum InputEventEvent {
2902    UserInput(String),
2903    ComplexUserInput(UserInput),
2904    ToolConfirmation(ToolConfirmation),
2905    ToolResponse(ToolResponse),
2906    QuestionResponse(UserQuestionsResponse),
2907    HaltRequest(bool),
2908    AutomatedTrigger(String),
2909    CallHookResponse(CallHookResponse),
2910    SessionEndRequest(bool),
2911    PolicyDecisionResponse(PolicyDecisionResponse),
2912}
2913
2914impl InputEvent {
2915    /// Takes the set arm of the `event` oneof, if any.
2916    pub fn into_event(self) -> Option<InputEventEvent> {
2917        if let Some(v) = self.user_input {
2918            return Some(InputEventEvent::UserInput(v));
2919        }
2920        if let Some(v) = self.complex_user_input {
2921            return Some(InputEventEvent::ComplexUserInput(v));
2922        }
2923        if let Some(v) = self.tool_confirmation {
2924            return Some(InputEventEvent::ToolConfirmation(v));
2925        }
2926        if let Some(v) = self.tool_response {
2927            return Some(InputEventEvent::ToolResponse(v));
2928        }
2929        if let Some(v) = self.question_response {
2930            return Some(InputEventEvent::QuestionResponse(v));
2931        }
2932        if let Some(v) = self.halt_request {
2933            return Some(InputEventEvent::HaltRequest(v));
2934        }
2935        if let Some(v) = self.automated_trigger {
2936            return Some(InputEventEvent::AutomatedTrigger(v));
2937        }
2938        if let Some(v) = self.call_hook_response {
2939            return Some(InputEventEvent::CallHookResponse(v));
2940        }
2941        if let Some(v) = self.session_end_request {
2942            return Some(InputEventEvent::SessionEndRequest(v));
2943        }
2944        if let Some(v) = self.policy_decision_response {
2945            return Some(InputEventEvent::PolicyDecisionResponse(v));
2946        }
2947        None
2948    }
2949
2950    /// True when any arm of the `event` oneof is set.
2951    pub fn has_event(&self) -> bool {
2952        self.user_input.is_some()
2953            || self.complex_user_input.is_some()
2954            || self.tool_confirmation.is_some()
2955            || self.tool_response.is_some()
2956            || self.question_response.is_some()
2957            || self.halt_request.is_some()
2958            || self.automated_trigger.is_some()
2959            || self.call_hook_response.is_some()
2960            || self.session_end_request.is_some()
2961            || self.policy_decision_response.is_some()
2962    }
2963}
2964
2965/// `antigravity.localharness.ListDirToolConfig`
2966#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2967#[serde(rename_all = "camelCase")]
2968pub struct ListDirToolConfig {
2969    #[serde(default, skip_serializing_if = "Option::is_none")]
2970    pub enabled: Option<bool>,
2971}
2972
2973/// `genai.ListValue`
2974#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2975#[serde(rename_all = "camelCase")]
2976pub struct ListValue {
2977    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2978    pub values: Vec<Value>,
2979}
2980
2981/// `antigravity.localharness.McpHttpTransport`
2982#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2983#[serde(rename_all = "camelCase")]
2984pub struct McpHttpTransport {
2985    #[serde(default, skip_serializing_if = "Option::is_none")]
2986    pub url: Option<String>,
2987    #[serde(default, skip_serializing_if = "HashMap::is_empty")]
2988    pub headers: HashMap<String, String>,
2989}
2990
2991/// `antigravity.localharness.McpServerConfig`
2992#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2993#[serde(rename_all = "camelCase")]
2994pub struct McpServerConfig {
2995    #[serde(default, skip_serializing_if = "Option::is_none")]
2996    pub stdio: Option<McpStdioTransport>,
2997    #[serde(default, skip_serializing_if = "Option::is_none")]
2998    pub http: Option<McpHttpTransport>,
2999    #[serde(default, skip_serializing_if = "Option::is_none")]
3000    pub name: Option<String>,
3001    #[serde(
3002        alias = "enabled_tools",
3003        default,
3004        skip_serializing_if = "Vec::is_empty"
3005    )]
3006    pub enabled_tools: Vec<String>,
3007    #[serde(
3008        alias = "disabled_tools",
3009        default,
3010        skip_serializing_if = "Vec::is_empty"
3011    )]
3012    pub disabled_tools: Vec<String>,
3013    #[serde(
3014        alias = "auth_provider_type",
3015        default,
3016        skip_serializing_if = "Option::is_none"
3017    )]
3018    pub auth_provider_type: Option<McpServerConfigAuthProviderType>,
3019    #[serde(
3020        alias = "timeout_seconds",
3021        default,
3022        skip_serializing_if = "Option::is_none"
3023    )]
3024    pub timeout_seconds: Option<i32>,
3025}
3026
3027/// The `transport` oneof of [`McpServerConfig`], as an owned value.
3028#[derive(Debug, Clone, PartialEq)]
3029pub enum McpServerConfigTransport {
3030    Stdio(McpStdioTransport),
3031    Http(McpHttpTransport),
3032}
3033
3034impl McpServerConfig {
3035    /// Takes the set arm of the `transport` oneof, if any.
3036    pub fn into_transport(self) -> Option<McpServerConfigTransport> {
3037        if let Some(v) = self.stdio {
3038            return Some(McpServerConfigTransport::Stdio(v));
3039        }
3040        if let Some(v) = self.http {
3041            return Some(McpServerConfigTransport::Http(v));
3042        }
3043        None
3044    }
3045
3046    /// True when any arm of the `transport` oneof is set.
3047    pub fn has_transport(&self) -> bool {
3048        self.stdio.is_some() || self.http.is_some()
3049    }
3050}
3051
3052/// `genai.McpServerToolCallContent`
3053#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3054#[serde(rename_all = "camelCase")]
3055pub struct McpServerToolCallContent {
3056    #[serde(default, skip_serializing_if = "Option::is_none")]
3057    pub name: Option<String>,
3058    #[serde(
3059        alias = "server_name",
3060        default,
3061        skip_serializing_if = "Option::is_none"
3062    )]
3063    pub server_name: Option<String>,
3064    #[serde(default, skip_serializing_if = "Option::is_none")]
3065    pub arguments: Option<Struct>,
3066}
3067
3068/// `genai.McpServerToolResultContent`
3069#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3070#[serde(rename_all = "camelCase")]
3071pub struct McpServerToolResultContent {
3072    #[serde(
3073        alias = "struct_result",
3074        default,
3075        skip_serializing_if = "Option::is_none"
3076    )]
3077    pub struct_result: Option<Struct>,
3078    #[serde(
3079        alias = "content_list",
3080        default,
3081        skip_serializing_if = "Option::is_none"
3082    )]
3083    pub content_list: Option<FunctionResultSubcontentList>,
3084    #[serde(
3085        alias = "string_result",
3086        default,
3087        skip_serializing_if = "Option::is_none"
3088    )]
3089    pub string_result: Option<String>,
3090    #[serde(default, skip_serializing_if = "Option::is_none")]
3091    pub name: Option<String>,
3092    #[serde(
3093        alias = "server_name",
3094        default,
3095        skip_serializing_if = "Option::is_none"
3096    )]
3097    pub server_name: Option<String>,
3098}
3099
3100/// The `result` oneof of [`McpServerToolResultContent`], as an owned value.
3101#[derive(Debug, Clone, PartialEq)]
3102pub enum McpServerToolResultContentResult {
3103    StructResult(Struct),
3104    ContentList(FunctionResultSubcontentList),
3105    StringResult(String),
3106}
3107
3108impl McpServerToolResultContent {
3109    /// Takes the set arm of the `result` oneof, if any.
3110    pub fn into_result(self) -> Option<McpServerToolResultContentResult> {
3111        if let Some(v) = self.struct_result {
3112            return Some(McpServerToolResultContentResult::StructResult(v));
3113        }
3114        if let Some(v) = self.content_list {
3115            return Some(McpServerToolResultContentResult::ContentList(v));
3116        }
3117        if let Some(v) = self.string_result {
3118            return Some(McpServerToolResultContentResult::StringResult(v));
3119        }
3120        None
3121    }
3122
3123    /// True when any arm of the `result` oneof is set.
3124    pub fn has_result(&self) -> bool {
3125        self.struct_result.is_some() || self.content_list.is_some() || self.string_result.is_some()
3126    }
3127}
3128
3129/// `antigravity.localharness.McpStdioTransport`
3130#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3131#[serde(rename_all = "camelCase")]
3132pub struct McpStdioTransport {
3133    #[serde(default, skip_serializing_if = "Option::is_none")]
3134    pub command: Option<String>,
3135    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3136    pub args: Vec<String>,
3137    #[serde(default, skip_serializing_if = "HashMap::is_empty")]
3138    pub env: HashMap<String, String>,
3139}
3140
3141/// `antigravity.localharness.Media`
3142#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3143#[serde(rename_all = "camelCase")]
3144pub struct Media {
3145    #[serde(alias = "mime_type", default, skip_serializing_if = "Option::is_none")]
3146    pub mime_type: Option<String>,
3147    #[serde(default, skip_serializing_if = "Option::is_none")]
3148    pub description: Option<String>,
3149    #[serde(
3150        default,
3151        skip_serializing_if = "Option::is_none",
3152        with = "crate::wire::opt_bytes"
3153    )]
3154    pub data: Option<Vec<u8>>,
3155}
3156
3157/// `antigravity.localharness.ModelAPIRetryConfig`
3158#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3159#[serde(rename_all = "camelCase")]
3160pub struct ModelAPIRetryConfig {
3161    #[serde(
3162        alias = "max_retries",
3163        default,
3164        skip_serializing_if = "Option::is_none"
3165    )]
3166    pub max_retries: Option<u32>,
3167    #[serde(
3168        alias = "initial_sleep_duration_ms",
3169        default,
3170        skip_serializing_if = "Option::is_none"
3171    )]
3172    pub initial_sleep_duration_ms: Option<u32>,
3173    #[serde(
3174        alias = "exponential_multiplier",
3175        default,
3176        skip_serializing_if = "Option::is_none"
3177    )]
3178    pub exponential_multiplier: Option<f64>,
3179    #[serde(
3180        alias = "jitter_range",
3181        default,
3182        skip_serializing_if = "Option::is_none"
3183    )]
3184    pub jitter_range: Option<f64>,
3185}
3186
3187/// `antigravity.localharness.ModelConfig`
3188#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3189#[serde(rename_all = "camelCase")]
3190pub struct ModelConfig {
3191    #[serde(
3192        alias = "gemini_api_endpoint",
3193        default,
3194        skip_serializing_if = "Option::is_none"
3195    )]
3196    pub gemini_api_endpoint: Option<GeminiAPIEndpoint>,
3197    #[serde(
3198        alias = "vertex_endpoint",
3199        default,
3200        skip_serializing_if = "Option::is_none"
3201    )]
3202    pub vertex_endpoint: Option<VertexEndpoint>,
3203    #[serde(
3204        alias = "gemma_endpoint",
3205        default,
3206        skip_serializing_if = "Option::is_none"
3207    )]
3208    pub gemma_endpoint: Option<GemmaEndpoint>,
3209    #[serde(
3210        alias = "custom_endpoint",
3211        default,
3212        skip_serializing_if = "Option::is_none"
3213    )]
3214    pub custom_endpoint: Option<CustomEndpoint>,
3215    #[serde(default, skip_serializing_if = "Option::is_none")]
3216    pub name: Option<String>,
3217    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3218    pub types: Vec<ModelType>,
3219}
3220
3221/// The `endpoint` oneof of [`ModelConfig`], as an owned value.
3222#[derive(Debug, Clone, PartialEq)]
3223pub enum ModelConfigEndpoint {
3224    GeminiApiEndpoint(GeminiAPIEndpoint),
3225    VertexEndpoint(VertexEndpoint),
3226    GemmaEndpoint(GemmaEndpoint),
3227    CustomEndpoint(CustomEndpoint),
3228}
3229
3230impl ModelConfig {
3231    /// Takes the set arm of the `endpoint` oneof, if any.
3232    pub fn into_endpoint(self) -> Option<ModelConfigEndpoint> {
3233        if let Some(v) = self.gemini_api_endpoint {
3234            return Some(ModelConfigEndpoint::GeminiApiEndpoint(v));
3235        }
3236        if let Some(v) = self.vertex_endpoint {
3237            return Some(ModelConfigEndpoint::VertexEndpoint(v));
3238        }
3239        if let Some(v) = self.gemma_endpoint {
3240            return Some(ModelConfigEndpoint::GemmaEndpoint(v));
3241        }
3242        if let Some(v) = self.custom_endpoint {
3243            return Some(ModelConfigEndpoint::CustomEndpoint(v));
3244        }
3245        None
3246    }
3247
3248    /// True when any arm of the `endpoint` oneof is set.
3249    pub fn has_endpoint(&self) -> bool {
3250        self.gemini_api_endpoint.is_some()
3251            || self.vertex_endpoint.is_some()
3252            || self.gemma_endpoint.is_some()
3253            || self.custom_endpoint.is_some()
3254    }
3255}
3256
3257/// `antigravity.localharness.ModelOutputRetryConfig`
3258#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3259#[serde(rename_all = "camelCase")]
3260pub struct ModelOutputRetryConfig {
3261    #[serde(
3262        alias = "max_retries",
3263        default,
3264        skip_serializing_if = "Option::is_none"
3265    )]
3266    pub max_retries: Option<u32>,
3267}
3268
3269/// `antigravity.localharness.MultipleChoice`
3270#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3271#[serde(rename_all = "camelCase")]
3272pub struct MultipleChoice {
3273    #[serde(default, skip_serializing_if = "Option::is_none")]
3274    pub question: Option<String>,
3275    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3276    pub choices: Vec<String>,
3277    #[serde(
3278        alias = "is_multi_select",
3279        default,
3280        skip_serializing_if = "Option::is_none"
3281    )]
3282    pub is_multi_select: Option<bool>,
3283}
3284
3285/// `antigravity.localharness.MultipleChoiceAnswer`
3286#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3287#[serde(rename_all = "camelCase")]
3288pub struct MultipleChoiceAnswer {
3289    #[serde(
3290        alias = "selected_choice_indices",
3291        default,
3292        skip_serializing_if = "Vec::is_empty"
3293    )]
3294    pub selected_choice_indices: Vec<i32>,
3295    #[serde(
3296        alias = "freeform_response",
3297        default,
3298        skip_serializing_if = "Option::is_none"
3299    )]
3300    pub freeform_response: Option<String>,
3301}
3302
3303/// `antigravity.localharness.OnToolErrorArgs`
3304#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3305#[serde(rename_all = "camelCase")]
3306pub struct OnToolErrorArgs {
3307    #[serde(alias = "tool_name", default, skip_serializing_if = "Option::is_none")]
3308    pub tool_name: Option<String>,
3309    #[serde(
3310        alias = "error_message",
3311        default,
3312        skip_serializing_if = "Option::is_none"
3313    )]
3314    pub error_message: Option<String>,
3315    #[serde(
3316        alias = "server_name",
3317        default,
3318        skip_serializing_if = "Option::is_none"
3319    )]
3320    pub server_name: Option<String>,
3321    #[serde(alias = "call_id", default, skip_serializing_if = "Option::is_none")]
3322    pub call_id: Option<String>,
3323}
3324
3325/// `antigravity.localharness.OnToolErrorResult`
3326#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3327#[serde(rename_all = "camelCase")]
3328pub struct OnToolErrorResult {
3329    #[serde(
3330        alias = "custom_error_message",
3331        default,
3332        skip_serializing_if = "Option::is_none"
3333    )]
3334    pub custom_error_message: Option<String>,
3335}
3336
3337/// `antigravity.localharness.OutputConfig`
3338#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3339#[serde(rename_all = "camelCase")]
3340pub struct OutputConfig {
3341    #[serde(default, skip_serializing_if = "Option::is_none")]
3342    pub port: Option<i32>,
3343    #[serde(alias = "api_key", default, skip_serializing_if = "Option::is_none")]
3344    pub api_key: Option<String>,
3345}
3346
3347/// `antigravity.localharness.OutputEvent`
3348#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3349#[serde(rename_all = "camelCase")]
3350pub struct OutputEvent {
3351    #[serde(
3352        alias = "step_update",
3353        default,
3354        skip_serializing_if = "Option::is_none"
3355    )]
3356    pub step_update: Option<StepUpdate>,
3357    #[serde(
3358        alias = "trajectory_state_update",
3359        default,
3360        skip_serializing_if = "Option::is_none"
3361    )]
3362    pub trajectory_state_update: Option<TrajectoryStateUpdate>,
3363    #[serde(alias = "tool_call", default, skip_serializing_if = "Option::is_none")]
3364    pub tool_call: Option<ToolCall>,
3365    #[serde(
3366        alias = "initialize_conversation_response",
3367        default,
3368        skip_serializing_if = "Option::is_none"
3369    )]
3370    pub initialize_conversation_response: Option<InitializeConversationResponse>,
3371    #[serde(
3372        alias = "call_hook_request",
3373        default,
3374        skip_serializing_if = "Option::is_none"
3375    )]
3376    pub call_hook_request: Option<CallHookRequest>,
3377    #[serde(
3378        alias = "session_end_response",
3379        default,
3380        skip_serializing_if = "Option::is_none"
3381    )]
3382    pub session_end_response: Option<bool>,
3383    #[serde(
3384        alias = "policy_decision_request",
3385        default,
3386        skip_serializing_if = "Option::is_none"
3387    )]
3388    pub policy_decision_request: Option<PolicyDecisionRequest>,
3389    #[serde(
3390        alias = "usage_update",
3391        default,
3392        skip_serializing_if = "Option::is_none"
3393    )]
3394    pub usage_update: Option<UsageUpdate>,
3395    #[serde(
3396        alias = "seq_num",
3397        default,
3398        skip_serializing_if = "Option::is_none",
3399        with = "crate::wire::opt_int"
3400    )]
3401    pub seq_num: Option<i64>,
3402    #[serde(
3403        alias = "timestamp_micros",
3404        default,
3405        skip_serializing_if = "Option::is_none",
3406        with = "crate::wire::opt_int"
3407    )]
3408    pub timestamp_micros: Option<i64>,
3409}
3410
3411/// The `event` oneof of [`OutputEvent`], as an owned value.
3412#[derive(Debug, Clone, PartialEq)]
3413pub enum OutputEventEvent {
3414    StepUpdate(StepUpdate),
3415    TrajectoryStateUpdate(TrajectoryStateUpdate),
3416    ToolCall(ToolCall),
3417    InitializeConversationResponse(InitializeConversationResponse),
3418    CallHookRequest(CallHookRequest),
3419    SessionEndResponse(bool),
3420    PolicyDecisionRequest(PolicyDecisionRequest),
3421    UsageUpdate(UsageUpdate),
3422}
3423
3424impl OutputEvent {
3425    /// Takes the set arm of the `event` oneof, if any.
3426    pub fn into_event(self) -> Option<OutputEventEvent> {
3427        if let Some(v) = self.step_update {
3428            return Some(OutputEventEvent::StepUpdate(v));
3429        }
3430        if let Some(v) = self.trajectory_state_update {
3431            return Some(OutputEventEvent::TrajectoryStateUpdate(v));
3432        }
3433        if let Some(v) = self.tool_call {
3434            return Some(OutputEventEvent::ToolCall(v));
3435        }
3436        if let Some(v) = self.initialize_conversation_response {
3437            return Some(OutputEventEvent::InitializeConversationResponse(v));
3438        }
3439        if let Some(v) = self.call_hook_request {
3440            return Some(OutputEventEvent::CallHookRequest(v));
3441        }
3442        if let Some(v) = self.session_end_response {
3443            return Some(OutputEventEvent::SessionEndResponse(v));
3444        }
3445        if let Some(v) = self.policy_decision_request {
3446            return Some(OutputEventEvent::PolicyDecisionRequest(v));
3447        }
3448        if let Some(v) = self.usage_update {
3449            return Some(OutputEventEvent::UsageUpdate(v));
3450        }
3451        None
3452    }
3453
3454    /// True when any arm of the `event` oneof is set.
3455    pub fn has_event(&self) -> bool {
3456        self.step_update.is_some()
3457            || self.trajectory_state_update.is_some()
3458            || self.tool_call.is_some()
3459            || self.initialize_conversation_response.is_some()
3460            || self.call_hook_request.is_some()
3461            || self.session_end_response.is_some()
3462            || self.policy_decision_request.is_some()
3463            || self.usage_update.is_some()
3464    }
3465}
3466
3467/// `antigravity.localharness.PermissionsConfig`
3468#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3469#[serde(rename_all = "camelCase")]
3470pub struct PermissionsConfig {
3471    #[serde(
3472        alias = "enforce_workspace_validation",
3473        default,
3474        skip_serializing_if = "Option::is_none"
3475    )]
3476    pub enforce_workspace_validation: Option<bool>,
3477}
3478
3479/// `genai.PlaceCitation`
3480#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3481#[serde(rename_all = "camelCase")]
3482pub struct PlaceCitation {
3483    #[serde(alias = "place_id", default, skip_serializing_if = "Option::is_none")]
3484    pub place_id: Option<String>,
3485    #[serde(default, skip_serializing_if = "Option::is_none")]
3486    pub name: Option<String>,
3487    #[serde(default, skip_serializing_if = "Option::is_none")]
3488    pub url: Option<String>,
3489    #[serde(
3490        alias = "review_snippets",
3491        default,
3492        skip_serializing_if = "Vec::is_empty"
3493    )]
3494    pub review_snippets: Vec<ReviewSnippet>,
3495}
3496
3497/// `antigravity.localharness.PolicyConfig`
3498#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3499#[serde(rename_all = "camelCase")]
3500pub struct PolicyConfig {
3501    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3502    pub rules: Vec<PolicyRule>,
3503}
3504
3505/// `antigravity.localharness.PolicyDecisionRequest`
3506#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3507#[serde(rename_all = "camelCase")]
3508pub struct PolicyDecisionRequest {
3509    #[serde(alias = "request_id", default, skip_serializing_if = "Option::is_none")]
3510    pub request_id: Option<String>,
3511    #[serde(alias = "rule_id", default, skip_serializing_if = "Option::is_none")]
3512    pub rule_id: Option<String>,
3513    #[serde(alias = "tool_args", default, skip_serializing_if = "Option::is_none")]
3514    pub tool_args: Option<PreToolArgs>,
3515}
3516
3517/// `antigravity.localharness.PolicyDecisionResponse`
3518#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3519#[serde(rename_all = "camelCase")]
3520pub struct PolicyDecisionResponse {
3521    #[serde(alias = "request_id", default, skip_serializing_if = "Option::is_none")]
3522    pub request_id: Option<String>,
3523    #[serde(default, skip_serializing_if = "Option::is_none")]
3524    pub outcome: Option<PolicyEvaluationOutcome>,
3525    #[serde(
3526        alias = "deny_reason",
3527        default,
3528        skip_serializing_if = "Option::is_none"
3529    )]
3530    pub deny_reason: Option<String>,
3531}
3532
3533/// `antigravity.localharness.PolicyRule`
3534#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3535#[serde(rename_all = "camelCase")]
3536pub struct PolicyRule {
3537    #[serde(default, skip_serializing_if = "Option::is_none")]
3538    pub tool: Option<String>,
3539    #[serde(
3540        alias = "server_name",
3541        default,
3542        skip_serializing_if = "Option::is_none"
3543    )]
3544    pub server_name: Option<String>,
3545    #[serde(default, skip_serializing_if = "Option::is_none")]
3546    pub name: Option<String>,
3547    #[serde(default, skip_serializing_if = "Option::is_none")]
3548    pub decision: Option<PolicyDecision>,
3549    #[serde(
3550        alias = "deny_reason",
3551        default,
3552        skip_serializing_if = "Option::is_none"
3553    )]
3554    pub deny_reason: Option<String>,
3555    #[serde(alias = "is_dynamic", default, skip_serializing_if = "Option::is_none")]
3556    pub is_dynamic: Option<bool>,
3557    #[serde(alias = "rule_id", default, skip_serializing_if = "Option::is_none")]
3558    pub rule_id: Option<String>,
3559}
3560
3561/// `antigravity.localharness.PostToolArgs`
3562#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3563#[serde(rename_all = "camelCase")]
3564pub struct PostToolArgs {
3565    #[serde(alias = "tool_name", default, skip_serializing_if = "Option::is_none")]
3566    pub tool_name: Option<String>,
3567    #[serde(default, skip_serializing_if = "Option::is_none")]
3568    pub result: Option<String>,
3569    #[serde(default, skip_serializing_if = "Option::is_none")]
3570    pub error: Option<String>,
3571    #[serde(
3572        alias = "server_name",
3573        default,
3574        skip_serializing_if = "Option::is_none"
3575    )]
3576    pub server_name: Option<String>,
3577    #[serde(alias = "call_id", default, skip_serializing_if = "Option::is_none")]
3578    pub call_id: Option<String>,
3579}
3580
3581/// `antigravity.localharness.PostTurnArgs`
3582#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3583#[serde(rename_all = "camelCase")]
3584pub struct PostTurnArgs {
3585    #[serde(
3586        alias = "response_text",
3587        default,
3588        skip_serializing_if = "Option::is_none"
3589    )]
3590    pub response_text: Option<String>,
3591}
3592
3593/// `antigravity.localharness.PreToolArgs`
3594#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3595#[serde(rename_all = "camelCase")]
3596pub struct PreToolArgs {
3597    #[serde(alias = "tool_name", default, skip_serializing_if = "Option::is_none")]
3598    pub tool_name: Option<String>,
3599    #[serde(
3600        alias = "arguments_json",
3601        default,
3602        skip_serializing_if = "Option::is_none"
3603    )]
3604    pub arguments_json: Option<String>,
3605    #[serde(
3606        alias = "server_name",
3607        default,
3608        skip_serializing_if = "Option::is_none"
3609    )]
3610    pub server_name: Option<String>,
3611    #[serde(alias = "call_id", default, skip_serializing_if = "Option::is_none")]
3612    pub call_id: Option<String>,
3613}
3614
3615/// `antigravity.localharness.PreToolResult`
3616#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3617#[serde(rename_all = "camelCase")]
3618pub struct PreToolResult {
3619    #[serde(default, skip_serializing_if = "Option::is_none")]
3620    pub decision: Option<PreToolResultDecision>,
3621    #[serde(default, skip_serializing_if = "Option::is_none")]
3622    pub reason: Option<String>,
3623    #[serde(
3624        alias = "modified_arguments_json",
3625        default,
3626        skip_serializing_if = "Option::is_none"
3627    )]
3628    pub modified_arguments_json: Option<String>,
3629}
3630
3631/// `antigravity.localharness.PreTurnArgs`
3632#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3633#[serde(rename_all = "camelCase")]
3634pub struct PreTurnArgs {
3635    #[serde(alias = "user_input", default, skip_serializing_if = "Option::is_none")]
3636    pub user_input: Option<UserInput>,
3637}
3638
3639/// `antigravity.localharness.PreTurnResult`
3640#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3641#[serde(rename_all = "camelCase")]
3642pub struct PreTurnResult {
3643    #[serde(default, skip_serializing_if = "Option::is_none")]
3644    pub decision: Option<PreTurnResultDecision>,
3645    #[serde(default, skip_serializing_if = "Option::is_none")]
3646    pub reason: Option<String>,
3647}
3648
3649/// `antigravity.localharness.ReadUrlContentToolConfig`
3650#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3651#[serde(rename_all = "camelCase")]
3652pub struct ReadUrlContentToolConfig {
3653    #[serde(default, skip_serializing_if = "Option::is_none")]
3654    pub enabled: Option<bool>,
3655}
3656
3657/// `antigravity.localharness.RetryConfig`
3658#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3659#[serde(rename_all = "camelCase")]
3660pub struct RetryConfig {
3661    #[serde(alias = "api_retry", default, skip_serializing_if = "Option::is_none")]
3662    pub api_retry: Option<ModelAPIRetryConfig>,
3663    #[serde(
3664        alias = "model_output_retry",
3665        default,
3666        skip_serializing_if = "Option::is_none"
3667    )]
3668    pub model_output_retry: Option<ModelOutputRetryConfig>,
3669}
3670
3671/// `genai.ReviewSnippet`
3672#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3673#[serde(rename_all = "camelCase")]
3674pub struct ReviewSnippet {
3675    #[serde(default, skip_serializing_if = "Option::is_none")]
3676    pub title: Option<String>,
3677    #[serde(default, skip_serializing_if = "Option::is_none")]
3678    pub url: Option<String>,
3679    #[serde(alias = "review_id", default, skip_serializing_if = "Option::is_none")]
3680    pub review_id: Option<String>,
3681}
3682
3683/// `antigravity.localharness.RunCommandToolConfig`
3684#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3685#[serde(rename_all = "camelCase")]
3686pub struct RunCommandToolConfig {
3687    #[serde(default, skip_serializing_if = "Option::is_none")]
3688    pub enabled: Option<bool>,
3689}
3690
3691/// `antigravity.localharness.SearchWebToolConfig`
3692#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3693#[serde(rename_all = "camelCase")]
3694pub struct SearchWebToolConfig {
3695    #[serde(default, skip_serializing_if = "Option::is_none")]
3696    pub enabled: Option<bool>,
3697}
3698
3699/// `antigravity.localharness.StepUpdate`
3700#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3701#[serde(rename_all = "camelCase")]
3702pub struct StepUpdate {
3703    #[serde(alias = "cascade_id", default, skip_serializing_if = "Option::is_none")]
3704    pub cascade_id: Option<String>,
3705    #[serde(
3706        alias = "trajectory_id",
3707        default,
3708        skip_serializing_if = "Option::is_none"
3709    )]
3710    pub trajectory_id: Option<String>,
3711    #[serde(alias = "step_index", default, skip_serializing_if = "Option::is_none")]
3712    pub step_index: Option<u32>,
3713    #[serde(default, skip_serializing_if = "Option::is_none")]
3714    pub state: Option<StepUpdateState>,
3715    #[serde(default, skip_serializing_if = "Option::is_none")]
3716    pub source: Option<StepUpdateSource>,
3717    #[serde(default, skip_serializing_if = "Option::is_none")]
3718    pub target: Option<StepUpdateTarget>,
3719    #[serde(
3720        alias = "error_message",
3721        default,
3722        skip_serializing_if = "Option::is_none"
3723    )]
3724    pub error_message: Option<String>,
3725    #[serde(default, skip_serializing_if = "Option::is_none")]
3726    pub thinking: Option<String>,
3727    #[serde(alias = "text_delta", default, skip_serializing_if = "Option::is_none")]
3728    pub text_delta: Option<String>,
3729    #[serde(
3730        alias = "thinking_delta",
3731        default,
3732        skip_serializing_if = "Option::is_none"
3733    )]
3734    pub thinking_delta: Option<String>,
3735    #[serde(default, skip_serializing_if = "Option::is_none")]
3736    pub text: Option<String>,
3737    #[serde(
3738        alias = "list_directory",
3739        default,
3740        skip_serializing_if = "Option::is_none"
3741    )]
3742    pub list_directory: Option<ActionListDirectory>,
3743    #[serde(alias = "find_file", default, skip_serializing_if = "Option::is_none")]
3744    pub find_file: Option<ActionFindFile>,
3745    #[serde(
3746        alias = "search_directory",
3747        default,
3748        skip_serializing_if = "Option::is_none"
3749    )]
3750    pub search_directory: Option<ActionSearchDirectory>,
3751    #[serde(alias = "view_file", default, skip_serializing_if = "Option::is_none")]
3752    pub view_file: Option<ActionViewFile>,
3753    #[serde(
3754        alias = "create_file",
3755        default,
3756        skip_serializing_if = "Option::is_none"
3757    )]
3758    pub create_file: Option<ActionCreateFile>,
3759    #[serde(alias = "edit_file", default, skip_serializing_if = "Option::is_none")]
3760    pub edit_file: Option<ActionEditFile>,
3761    #[serde(
3762        alias = "run_command",
3763        default,
3764        skip_serializing_if = "Option::is_none"
3765    )]
3766    pub run_command: Option<ActionRunCommand>,
3767    #[serde(default, skip_serializing_if = "Option::is_none")]
3768    pub compaction: Option<ActionCompaction>,
3769    #[serde(
3770        alias = "invoke_subagent",
3771        default,
3772        skip_serializing_if = "Option::is_none"
3773    )]
3774    pub invoke_subagent: Option<ActionInvokeSubagent>,
3775    #[serde(
3776        alias = "generate_image",
3777        default,
3778        skip_serializing_if = "Option::is_none"
3779    )]
3780    pub generate_image: Option<ActionGenerateImage>,
3781    #[serde(default, skip_serializing_if = "Option::is_none")]
3782    pub finish: Option<ActionFinish>,
3783    #[serde(default, skip_serializing_if = "Option::is_none")]
3784    pub error: Option<ActionError>,
3785    #[serde(alias = "mcp_tool", default, skip_serializing_if = "Option::is_none")]
3786    pub mcp_tool: Option<ActionMcpTool>,
3787    #[serde(alias = "search_web", default, skip_serializing_if = "Option::is_none")]
3788    pub search_web: Option<ActionSearchWeb>,
3789    #[serde(
3790        alias = "read_url_content",
3791        default,
3792        skip_serializing_if = "Option::is_none"
3793    )]
3794    pub read_url_content: Option<ActionReadUrlContent>,
3795    #[serde(
3796        alias = "custom_tool",
3797        default,
3798        skip_serializing_if = "Option::is_none"
3799    )]
3800    pub custom_tool: Option<ActionCustomTool>,
3801    #[serde(
3802        alias = "request_text",
3803        default,
3804        skip_serializing_if = "Option::is_none"
3805    )]
3806    pub request_text: Option<String>,
3807    #[serde(
3808        alias = "tool_confirmation_request",
3809        default,
3810        skip_serializing_if = "Option::is_none"
3811    )]
3812    pub tool_confirmation_request: Option<ToolConfirmationRequest>,
3813    #[serde(
3814        alias = "questions_request",
3815        default,
3816        skip_serializing_if = "Option::is_none"
3817    )]
3818    pub questions_request: Option<UserQuestionsRequest>,
3819}
3820
3821/// `genai.Struct`
3822#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3823#[serde(rename_all = "camelCase")]
3824pub struct Struct {
3825    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3826    pub fields: Vec<Field>,
3827}
3828
3829/// `antigravity.localharness.SubagentsConfig`
3830#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3831#[serde(rename_all = "camelCase")]
3832pub struct SubagentsConfig {
3833    #[serde(default, skip_serializing_if = "Option::is_none")]
3834    pub enabled: Option<bool>,
3835}
3836
3837/// `antigravity.localharness.SystemInstructions`
3838#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3839#[serde(rename_all = "camelCase")]
3840pub struct SystemInstructions {
3841    #[serde(default, skip_serializing_if = "Option::is_none")]
3842    pub custom: Option<CustomSystemInstructions>,
3843    #[serde(default, skip_serializing_if = "Option::is_none")]
3844    pub appended: Option<AppendedSystemInstructions>,
3845}
3846
3847/// The `type` oneof of [`SystemInstructions`], as an owned value.
3848#[derive(Debug, Clone, PartialEq)]
3849pub enum SystemInstructionsType {
3850    Custom(CustomSystemInstructions),
3851    Appended(AppendedSystemInstructions),
3852}
3853
3854impl SystemInstructions {
3855    /// Takes the set arm of the `type` oneof, if any.
3856    pub fn into_type(self) -> Option<SystemInstructionsType> {
3857        if let Some(v) = self.custom {
3858            return Some(SystemInstructionsType::Custom(v));
3859        }
3860        if let Some(v) = self.appended {
3861            return Some(SystemInstructionsType::Appended(v));
3862        }
3863        None
3864    }
3865
3866    /// True when any arm of the `type` oneof is set.
3867    pub fn has_type(&self) -> bool {
3868        self.custom.is_some() || self.appended.is_some()
3869    }
3870}
3871
3872/// `genai.TextContent`
3873#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3874#[serde(rename_all = "camelCase")]
3875pub struct TextContent {
3876    #[serde(default, skip_serializing_if = "Option::is_none")]
3877    pub text: Option<String>,
3878    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3879    pub annotations: Vec<TextContentAnnotation>,
3880}
3881
3882/// `genai.TextContent.Annotation`
3883#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3884#[serde(rename_all = "camelCase")]
3885pub struct TextContentAnnotation {
3886    #[serde(
3887        alias = "url_citation",
3888        default,
3889        skip_serializing_if = "Option::is_none"
3890    )]
3891    pub url_citation: Option<UrlCitation>,
3892    #[serde(
3893        alias = "file_citation",
3894        default,
3895        skip_serializing_if = "Option::is_none"
3896    )]
3897    pub file_citation: Option<FileCitation>,
3898    #[serde(
3899        alias = "place_citation",
3900        default,
3901        skip_serializing_if = "Option::is_none"
3902    )]
3903    pub place_citation: Option<PlaceCitation>,
3904    #[serde(alias = "word_info", default, skip_serializing_if = "Option::is_none")]
3905    pub word_info: Option<WordInfo>,
3906    #[serde(
3907        alias = "start_index",
3908        default,
3909        skip_serializing_if = "Option::is_none"
3910    )]
3911    pub start_index: Option<i32>,
3912    #[serde(alias = "end_index", default, skip_serializing_if = "Option::is_none")]
3913    pub end_index: Option<i32>,
3914}
3915
3916/// The `type` oneof of [`TextContentAnnotation`], as an owned value.
3917#[derive(Debug, Clone, PartialEq)]
3918pub enum TextContentAnnotationType {
3919    UrlCitation(UrlCitation),
3920    FileCitation(FileCitation),
3921    PlaceCitation(PlaceCitation),
3922    WordInfo(WordInfo),
3923}
3924
3925impl TextContentAnnotation {
3926    /// Takes the set arm of the `type` oneof, if any.
3927    pub fn into_type(self) -> Option<TextContentAnnotationType> {
3928        if let Some(v) = self.url_citation {
3929            return Some(TextContentAnnotationType::UrlCitation(v));
3930        }
3931        if let Some(v) = self.file_citation {
3932            return Some(TextContentAnnotationType::FileCitation(v));
3933        }
3934        if let Some(v) = self.place_citation {
3935            return Some(TextContentAnnotationType::PlaceCitation(v));
3936        }
3937        if let Some(v) = self.word_info {
3938            return Some(TextContentAnnotationType::WordInfo(v));
3939        }
3940        None
3941    }
3942
3943    /// True when any arm of the `type` oneof is set.
3944    pub fn has_type(&self) -> bool {
3945        self.url_citation.is_some()
3946            || self.file_citation.is_some()
3947            || self.place_citation.is_some()
3948            || self.word_info.is_some()
3949    }
3950}
3951
3952/// `genai.ThoughtContent`
3953#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3954#[serde(rename_all = "camelCase")]
3955pub struct ThoughtContent {
3956    #[serde(
3957        default,
3958        skip_serializing_if = "Option::is_none",
3959        with = "crate::wire::opt_bytes"
3960    )]
3961    pub signature: Option<Vec<u8>>,
3962    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3963    pub summary: Vec<ThoughtSummaryContent>,
3964}
3965
3966/// `genai.ThoughtSummaryContent`
3967#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3968#[serde(rename_all = "camelCase")]
3969pub struct ThoughtSummaryContent {
3970    #[serde(default, skip_serializing_if = "Option::is_none")]
3971    pub text: Option<TextContent>,
3972    #[serde(default, skip_serializing_if = "Option::is_none")]
3973    pub image: Option<ImageContent>,
3974}
3975
3976/// The `type` oneof of [`ThoughtSummaryContent`], as an owned value.
3977#[derive(Debug, Clone, PartialEq)]
3978pub enum ThoughtSummaryContentType {
3979    Text(TextContent),
3980    Image(ImageContent),
3981}
3982
3983impl ThoughtSummaryContent {
3984    /// Takes the set arm of the `type` oneof, if any.
3985    pub fn into_type(self) -> Option<ThoughtSummaryContentType> {
3986        if let Some(v) = self.text {
3987            return Some(ThoughtSummaryContentType::Text(v));
3988        }
3989        if let Some(v) = self.image {
3990            return Some(ThoughtSummaryContentType::Image(v));
3991        }
3992        None
3993    }
3994
3995    /// True when any arm of the `type` oneof is set.
3996    pub fn has_type(&self) -> bool {
3997        self.text.is_some() || self.image.is_some()
3998    }
3999}
4000
4001/// `antigravity.localharness.Tool`
4002#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4003#[serde(rename_all = "camelCase")]
4004pub struct Tool {
4005    #[serde(default, skip_serializing_if = "Option::is_none")]
4006    pub name: Option<String>,
4007    #[serde(default, skip_serializing_if = "Option::is_none")]
4008    pub description: Option<String>,
4009    #[serde(
4010        alias = "parameters_json_schema",
4011        default,
4012        skip_serializing_if = "Option::is_none"
4013    )]
4014    pub parameters_json_schema: Option<String>,
4015    #[serde(
4016        alias = "response_json_schema",
4017        default,
4018        skip_serializing_if = "Option::is_none"
4019    )]
4020    pub response_json_schema: Option<String>,
4021    #[serde(
4022        alias = "defer_loading",
4023        default,
4024        skip_serializing_if = "Option::is_none"
4025    )]
4026    pub defer_loading: Option<bool>,
4027}
4028
4029/// `antigravity.localharness.ToolCall`
4030#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4031#[serde(rename_all = "camelCase")]
4032pub struct ToolCall {
4033    #[serde(default, skip_serializing_if = "Option::is_none")]
4034    pub id: Option<String>,
4035    #[serde(default, skip_serializing_if = "Option::is_none")]
4036    pub name: Option<String>,
4037    #[serde(
4038        alias = "arguments_json",
4039        default,
4040        skip_serializing_if = "Option::is_none"
4041    )]
4042    pub arguments_json: Option<String>,
4043    #[serde(default, skip_serializing_if = "Option::is_none")]
4044    pub arguments: Option<Struct>,
4045}
4046
4047/// `genai.ToolCallContent`
4048#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4049#[serde(rename_all = "camelCase")]
4050pub struct ToolCallContent {
4051    #[serde(
4052        alias = "function_call",
4053        default,
4054        skip_serializing_if = "Option::is_none"
4055    )]
4056    pub function_call: Option<FunctionCallContent>,
4057    #[serde(
4058        alias = "code_execution_call",
4059        default,
4060        skip_serializing_if = "Option::is_none"
4061    )]
4062    pub code_execution_call: Option<CodeExecutionCallContent>,
4063    #[serde(
4064        alias = "url_context_call",
4065        default,
4066        skip_serializing_if = "Option::is_none"
4067    )]
4068    pub url_context_call: Option<UrlContextCallContent>,
4069    #[serde(
4070        alias = "mcp_server_tool_call",
4071        default,
4072        skip_serializing_if = "Option::is_none"
4073    )]
4074    pub mcp_server_tool_call: Option<McpServerToolCallContent>,
4075    #[serde(
4076        alias = "google_search_call",
4077        default,
4078        skip_serializing_if = "Option::is_none"
4079    )]
4080    pub google_search_call: Option<GoogleSearchCallContent>,
4081    #[serde(
4082        alias = "file_search_call",
4083        default,
4084        skip_serializing_if = "Option::is_none"
4085    )]
4086    pub file_search_call: Option<FileSearchCallContent>,
4087    #[serde(
4088        alias = "google_maps_call",
4089        default,
4090        skip_serializing_if = "Option::is_none"
4091    )]
4092    pub google_maps_call: Option<GoogleMapsCallContent>,
4093    #[serde(default, skip_serializing_if = "Option::is_none")]
4094    pub id: Option<String>,
4095    #[serde(
4096        default,
4097        skip_serializing_if = "Option::is_none",
4098        with = "crate::wire::opt_bytes"
4099    )]
4100    pub signature: Option<Vec<u8>>,
4101}
4102
4103/// The `type` oneof of [`ToolCallContent`], as an owned value.
4104#[derive(Debug, Clone, PartialEq)]
4105pub enum ToolCallContentType {
4106    FunctionCall(FunctionCallContent),
4107    CodeExecutionCall(CodeExecutionCallContent),
4108    UrlContextCall(UrlContextCallContent),
4109    McpServerToolCall(McpServerToolCallContent),
4110    GoogleSearchCall(GoogleSearchCallContent),
4111    FileSearchCall(FileSearchCallContent),
4112    GoogleMapsCall(GoogleMapsCallContent),
4113}
4114
4115impl ToolCallContent {
4116    /// Takes the set arm of the `type` oneof, if any.
4117    pub fn into_type(self) -> Option<ToolCallContentType> {
4118        if let Some(v) = self.function_call {
4119            return Some(ToolCallContentType::FunctionCall(v));
4120        }
4121        if let Some(v) = self.code_execution_call {
4122            return Some(ToolCallContentType::CodeExecutionCall(v));
4123        }
4124        if let Some(v) = self.url_context_call {
4125            return Some(ToolCallContentType::UrlContextCall(v));
4126        }
4127        if let Some(v) = self.mcp_server_tool_call {
4128            return Some(ToolCallContentType::McpServerToolCall(v));
4129        }
4130        if let Some(v) = self.google_search_call {
4131            return Some(ToolCallContentType::GoogleSearchCall(v));
4132        }
4133        if let Some(v) = self.file_search_call {
4134            return Some(ToolCallContentType::FileSearchCall(v));
4135        }
4136        if let Some(v) = self.google_maps_call {
4137            return Some(ToolCallContentType::GoogleMapsCall(v));
4138        }
4139        None
4140    }
4141
4142    /// True when any arm of the `type` oneof is set.
4143    pub fn has_type(&self) -> bool {
4144        self.function_call.is_some()
4145            || self.code_execution_call.is_some()
4146            || self.url_context_call.is_some()
4147            || self.mcp_server_tool_call.is_some()
4148            || self.google_search_call.is_some()
4149            || self.file_search_call.is_some()
4150            || self.google_maps_call.is_some()
4151    }
4152}
4153
4154/// `antigravity.localharness.ToolConfirmation`
4155#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4156#[serde(rename_all = "camelCase")]
4157pub struct ToolConfirmation {
4158    #[serde(
4159        alias = "trajectory_id",
4160        default,
4161        skip_serializing_if = "Option::is_none"
4162    )]
4163    pub trajectory_id: Option<String>,
4164    #[serde(alias = "step_index", default, skip_serializing_if = "Option::is_none")]
4165    pub step_index: Option<u32>,
4166    #[serde(default, skip_serializing_if = "Option::is_none")]
4167    pub accepted: Option<bool>,
4168}
4169
4170/// `antigravity.localharness.ToolConfirmationRequest`
4171#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4172#[serde(rename_all = "camelCase")]
4173pub struct ToolConfirmationRequest {}
4174
4175/// `antigravity.localharness.ToolOutputTruncation`
4176#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4177#[serde(rename_all = "camelCase")]
4178pub struct ToolOutputTruncation {
4179    #[serde(default, skip_serializing_if = "Option::is_none")]
4180    pub truncate: Option<ToolOutputTruncationTruncateStrategy>,
4181    #[serde(default, skip_serializing_if = "Option::is_none")]
4182    pub error: Option<ToolOutputTruncationErrorStrategy>,
4183}
4184
4185/// The `strategy` oneof of [`ToolOutputTruncation`], as an owned value.
4186#[derive(Debug, Clone, PartialEq)]
4187pub enum ToolOutputTruncationStrategy {
4188    Truncate(ToolOutputTruncationTruncateStrategy),
4189    Error(ToolOutputTruncationErrorStrategy),
4190}
4191
4192impl ToolOutputTruncation {
4193    /// Takes the set arm of the `strategy` oneof, if any.
4194    pub fn into_strategy(self) -> Option<ToolOutputTruncationStrategy> {
4195        if let Some(v) = self.truncate {
4196            return Some(ToolOutputTruncationStrategy::Truncate(v));
4197        }
4198        if let Some(v) = self.error {
4199            return Some(ToolOutputTruncationStrategy::Error(v));
4200        }
4201        None
4202    }
4203
4204    /// True when any arm of the `strategy` oneof is set.
4205    pub fn has_strategy(&self) -> bool {
4206        self.truncate.is_some() || self.error.is_some()
4207    }
4208}
4209
4210/// `antigravity.localharness.ToolOutputTruncation.ErrorStrategy`
4211#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4212#[serde(rename_all = "camelCase")]
4213pub struct ToolOutputTruncationErrorStrategy {
4214    #[serde(alias = "max_tokens", default, skip_serializing_if = "Option::is_none")]
4215    pub max_tokens: Option<i32>,
4216    #[serde(
4217        alias = "error_message",
4218        default,
4219        skip_serializing_if = "Option::is_none"
4220    )]
4221    pub error_message: Option<String>,
4222}
4223
4224/// `antigravity.localharness.ToolOutputTruncation.TruncateStrategy`
4225#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4226#[serde(rename_all = "camelCase")]
4227pub struct ToolOutputTruncationTruncateStrategy {
4228    #[serde(alias = "max_tokens", default, skip_serializing_if = "Option::is_none")]
4229    pub max_tokens: Option<i32>,
4230}
4231
4232/// `antigravity.localharness.ToolResponse`
4233#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4234#[serde(rename_all = "camelCase")]
4235pub struct ToolResponse {
4236    #[serde(default, skip_serializing_if = "Option::is_none")]
4237    pub id: Option<String>,
4238    #[serde(
4239        alias = "response_json",
4240        default,
4241        skip_serializing_if = "Option::is_none"
4242    )]
4243    pub response_json: Option<String>,
4244    #[serde(
4245        alias = "supplemental_media",
4246        default,
4247        skip_serializing_if = "Vec::is_empty"
4248    )]
4249    pub supplemental_media: Vec<Media>,
4250    #[serde(default, skip_serializing_if = "Option::is_none")]
4251    pub response: Option<Struct>,
4252    #[serde(
4253        alias = "error_message",
4254        default,
4255        skip_serializing_if = "Option::is_none"
4256    )]
4257    pub error_message: Option<String>,
4258}
4259
4260/// `genai.ToolResultContent`
4261#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4262#[serde(rename_all = "camelCase")]
4263pub struct ToolResultContent {
4264    #[serde(
4265        alias = "function_result",
4266        default,
4267        skip_serializing_if = "Option::is_none"
4268    )]
4269    pub function_result: Option<FunctionResultContent>,
4270    #[serde(
4271        alias = "code_execution_result",
4272        default,
4273        skip_serializing_if = "Option::is_none"
4274    )]
4275    pub code_execution_result: Option<CodeExecutionResultContent>,
4276    #[serde(
4277        alias = "url_context_result",
4278        default,
4279        skip_serializing_if = "Option::is_none"
4280    )]
4281    pub url_context_result: Option<UrlContextResultContent>,
4282    #[serde(
4283        alias = "google_search_result",
4284        default,
4285        skip_serializing_if = "Option::is_none"
4286    )]
4287    pub google_search_result: Option<GoogleSearchResultContent>,
4288    #[serde(
4289        alias = "mcp_server_tool_result",
4290        default,
4291        skip_serializing_if = "Option::is_none"
4292    )]
4293    pub mcp_server_tool_result: Option<McpServerToolResultContent>,
4294    #[serde(
4295        alias = "file_search_result",
4296        default,
4297        skip_serializing_if = "Option::is_none"
4298    )]
4299    pub file_search_result: Option<FileSearchResultContent>,
4300    #[serde(
4301        alias = "google_maps_result",
4302        default,
4303        skip_serializing_if = "Option::is_none"
4304    )]
4305    pub google_maps_result: Option<GoogleMapsResultContent>,
4306    #[serde(alias = "call_id", default, skip_serializing_if = "Option::is_none")]
4307    pub call_id: Option<String>,
4308    #[serde(
4309        default,
4310        skip_serializing_if = "Option::is_none",
4311        with = "crate::wire::opt_bytes"
4312    )]
4313    pub signature: Option<Vec<u8>>,
4314}
4315
4316/// The `type` oneof of [`ToolResultContent`], as an owned value.
4317#[derive(Debug, Clone, PartialEq)]
4318pub enum ToolResultContentType {
4319    FunctionResult(FunctionResultContent),
4320    CodeExecutionResult(CodeExecutionResultContent),
4321    UrlContextResult(UrlContextResultContent),
4322    GoogleSearchResult(GoogleSearchResultContent),
4323    McpServerToolResult(McpServerToolResultContent),
4324    FileSearchResult(FileSearchResultContent),
4325    GoogleMapsResult(GoogleMapsResultContent),
4326}
4327
4328impl ToolResultContent {
4329    /// Takes the set arm of the `type` oneof, if any.
4330    pub fn into_type(self) -> Option<ToolResultContentType> {
4331        if let Some(v) = self.function_result {
4332            return Some(ToolResultContentType::FunctionResult(v));
4333        }
4334        if let Some(v) = self.code_execution_result {
4335            return Some(ToolResultContentType::CodeExecutionResult(v));
4336        }
4337        if let Some(v) = self.url_context_result {
4338            return Some(ToolResultContentType::UrlContextResult(v));
4339        }
4340        if let Some(v) = self.google_search_result {
4341            return Some(ToolResultContentType::GoogleSearchResult(v));
4342        }
4343        if let Some(v) = self.mcp_server_tool_result {
4344            return Some(ToolResultContentType::McpServerToolResult(v));
4345        }
4346        if let Some(v) = self.file_search_result {
4347            return Some(ToolResultContentType::FileSearchResult(v));
4348        }
4349        if let Some(v) = self.google_maps_result {
4350            return Some(ToolResultContentType::GoogleMapsResult(v));
4351        }
4352        None
4353    }
4354
4355    /// True when any arm of the `type` oneof is set.
4356    pub fn has_type(&self) -> bool {
4357        self.function_result.is_some()
4358            || self.code_execution_result.is_some()
4359            || self.url_context_result.is_some()
4360            || self.google_search_result.is_some()
4361            || self.mcp_server_tool_result.is_some()
4362            || self.file_search_result.is_some()
4363            || self.google_maps_result.is_some()
4364    }
4365}
4366
4367/// `antigravity.localharness.ToolSearchConfig`
4368#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4369#[serde(rename_all = "camelCase")]
4370pub struct ToolSearchConfig {
4371    #[serde(default, skip_serializing_if = "Option::is_none")]
4372    pub enabled: Option<bool>,
4373}
4374
4375/// `antigravity.localharness.TrajectoryStateUpdate`
4376#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4377#[serde(rename_all = "camelCase")]
4378pub struct TrajectoryStateUpdate {
4379    #[serde(
4380        alias = "trajectory_id",
4381        default,
4382        skip_serializing_if = "Option::is_none"
4383    )]
4384    pub trajectory_id: Option<String>,
4385    #[serde(default, skip_serializing_if = "Option::is_none")]
4386    pub state: Option<TrajectoryStateUpdateState>,
4387    #[serde(default, skip_serializing_if = "Option::is_none")]
4388    pub error: Option<String>,
4389}
4390
4391/// `antigravity.localharness.TrajectoryUsageEntry`
4392#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4393#[serde(rename_all = "camelCase")]
4394pub struct TrajectoryUsageEntry {
4395    #[serde(
4396        alias = "trajectory_id",
4397        default,
4398        skip_serializing_if = "Option::is_none"
4399    )]
4400    pub trajectory_id: Option<String>,
4401    #[serde(default, skip_serializing_if = "Option::is_none")]
4402    pub usage: Option<UsageMetadata>,
4403}
4404
4405/// `genai.UrlCitation`
4406#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4407#[serde(rename_all = "camelCase")]
4408pub struct UrlCitation {
4409    #[serde(default, skip_serializing_if = "Option::is_none")]
4410    pub url: Option<String>,
4411    #[serde(default, skip_serializing_if = "Option::is_none")]
4412    pub title: Option<String>,
4413}
4414
4415/// `genai.UrlContextCallContent`
4416#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4417#[serde(rename_all = "camelCase")]
4418pub struct UrlContextCallContent {
4419    #[serde(default, skip_serializing_if = "Option::is_none")]
4420    pub arguments: Option<UrlContextCallContentUrlContextCallArguments>,
4421}
4422
4423/// `genai.UrlContextCallContent.UrlContextCallArguments`
4424#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4425#[serde(rename_all = "camelCase")]
4426pub struct UrlContextCallContentUrlContextCallArguments {
4427    #[serde(default, skip_serializing_if = "Vec::is_empty")]
4428    pub urls: Vec<String>,
4429}
4430
4431/// `genai.UrlContextResultContent`
4432#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4433#[serde(rename_all = "camelCase")]
4434pub struct UrlContextResultContent {
4435    #[serde(default, skip_serializing_if = "Vec::is_empty")]
4436    pub result: Vec<UrlContextResultContentUrlContextResult>,
4437    #[serde(alias = "is_error", default, skip_serializing_if = "Option::is_none")]
4438    pub is_error: Option<bool>,
4439}
4440
4441/// `genai.UrlContextResultContent.UrlContextResult`
4442#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4443#[serde(rename_all = "camelCase")]
4444pub struct UrlContextResultContentUrlContextResult {
4445    #[serde(default, skip_serializing_if = "Option::is_none")]
4446    pub url: Option<String>,
4447    #[serde(default, skip_serializing_if = "Option::is_none")]
4448    pub status: Option<UrlContextResultContentUrlContextResultStatus>,
4449}
4450
4451/// `antigravity.localharness.UsageMetadata`
4452#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4453#[serde(rename_all = "camelCase")]
4454pub struct UsageMetadata {
4455    #[serde(
4456        alias = "prompt_token_count",
4457        default,
4458        skip_serializing_if = "Option::is_none",
4459        with = "crate::wire::opt_int"
4460    )]
4461    pub prompt_token_count: Option<u64>,
4462    #[serde(
4463        alias = "cached_content_token_count",
4464        default,
4465        skip_serializing_if = "Option::is_none",
4466        with = "crate::wire::opt_int"
4467    )]
4468    pub cached_content_token_count: Option<u64>,
4469    #[serde(
4470        alias = "candidates_token_count",
4471        default,
4472        skip_serializing_if = "Option::is_none",
4473        with = "crate::wire::opt_int"
4474    )]
4475    pub candidates_token_count: Option<u64>,
4476    #[serde(
4477        alias = "thoughts_token_count",
4478        default,
4479        skip_serializing_if = "Option::is_none",
4480        with = "crate::wire::opt_int"
4481    )]
4482    pub thoughts_token_count: Option<u64>,
4483    #[serde(
4484        alias = "total_token_count",
4485        default,
4486        skip_serializing_if = "Option::is_none",
4487        with = "crate::wire::opt_int"
4488    )]
4489    pub total_token_count: Option<u64>,
4490    #[serde(
4491        alias = "service_tier",
4492        default,
4493        skip_serializing_if = "Option::is_none"
4494    )]
4495    pub service_tier: Option<String>,
4496}
4497
4498/// `antigravity.localharness.UsageUpdate`
4499#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4500#[serde(rename_all = "camelCase")]
4501pub struct UsageUpdate {
4502    #[serde(default, skip_serializing_if = "Vec::is_empty")]
4503    pub agents: Vec<TrajectoryUsageEntry>,
4504    #[serde(default, skip_serializing_if = "Option::is_none")]
4505    pub total: Option<UsageMetadata>,
4506}
4507
4508/// `antigravity.localharness.UserInput`
4509#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4510#[serde(rename_all = "camelCase")]
4511pub struct UserInput {
4512    #[serde(default, skip_serializing_if = "Vec::is_empty")]
4513    pub parts: Vec<UserInputPart>,
4514}
4515
4516/// `antigravity.localharness.UserInput.Media`
4517#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4518#[serde(rename_all = "camelCase")]
4519pub struct UserInputMedia {
4520    #[serde(alias = "mime_type", default, skip_serializing_if = "Option::is_none")]
4521    pub mime_type: Option<String>,
4522    #[serde(default, skip_serializing_if = "Option::is_none")]
4523    pub description: Option<String>,
4524    #[serde(
4525        default,
4526        skip_serializing_if = "Option::is_none",
4527        with = "crate::wire::opt_bytes"
4528    )]
4529    pub data: Option<Vec<u8>>,
4530}
4531
4532/// `antigravity.localharness.UserInput.Part`
4533#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4534#[serde(rename_all = "camelCase")]
4535pub struct UserInputPart {
4536    #[serde(default, skip_serializing_if = "Option::is_none")]
4537    pub text: Option<String>,
4538    #[serde(default, skip_serializing_if = "Option::is_none")]
4539    pub media: Option<UserInputMedia>,
4540    #[serde(
4541        alias = "slash_command",
4542        default,
4543        skip_serializing_if = "Option::is_none"
4544    )]
4545    pub slash_command: Option<UserInputSlashCommand>,
4546}
4547
4548/// The `part` oneof of [`UserInputPart`], as an owned value.
4549#[derive(Debug, Clone, PartialEq)]
4550pub enum UserInputPartPart {
4551    Text(String),
4552    Media(UserInputMedia),
4553    SlashCommand(UserInputSlashCommand),
4554}
4555
4556impl UserInputPart {
4557    /// Takes the set arm of the `part` oneof, if any.
4558    pub fn into_part(self) -> Option<UserInputPartPart> {
4559        if let Some(v) = self.text {
4560            return Some(UserInputPartPart::Text(v));
4561        }
4562        if let Some(v) = self.media {
4563            return Some(UserInputPartPart::Media(v));
4564        }
4565        if let Some(v) = self.slash_command {
4566            return Some(UserInputPartPart::SlashCommand(v));
4567        }
4568        None
4569    }
4570
4571    /// True when any arm of the `part` oneof is set.
4572    pub fn has_part(&self) -> bool {
4573        self.text.is_some() || self.media.is_some() || self.slash_command.is_some()
4574    }
4575}
4576
4577/// `antigravity.localharness.UserInput.SlashCommand`
4578#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4579#[serde(rename_all = "camelCase")]
4580pub struct UserInputSlashCommand {
4581    #[serde(default, skip_serializing_if = "Option::is_none")]
4582    pub name: Option<String>,
4583}
4584
4585/// `antigravity.localharness.UserQuestion`
4586#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4587#[serde(rename_all = "camelCase")]
4588pub struct UserQuestion {
4589    #[serde(
4590        alias = "multiple_choice",
4591        default,
4592        skip_serializing_if = "Option::is_none"
4593    )]
4594    pub multiple_choice: Option<MultipleChoice>,
4595}
4596
4597/// The `question_type` oneof of [`UserQuestion`], as an owned value.
4598#[derive(Debug, Clone, PartialEq)]
4599pub enum UserQuestionQuestionType {
4600    MultipleChoice(MultipleChoice),
4601}
4602
4603impl UserQuestion {
4604    /// Takes the set arm of the `question_type` oneof, if any.
4605    pub fn into_question_type(self) -> Option<UserQuestionQuestionType> {
4606        if let Some(v) = self.multiple_choice {
4607            return Some(UserQuestionQuestionType::MultipleChoice(v));
4608        }
4609        None
4610    }
4611
4612    /// True when any arm of the `question_type` oneof is set.
4613    pub fn has_question_type(&self) -> bool {
4614        self.multiple_choice.is_some()
4615    }
4616}
4617
4618/// `antigravity.localharness.UserQuestionAnswer`
4619#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4620#[serde(rename_all = "camelCase")]
4621pub struct UserQuestionAnswer {
4622    #[serde(default, skip_serializing_if = "Option::is_none")]
4623    pub unanswered: Option<bool>,
4624    #[serde(
4625        alias = "multiple_choice_answer",
4626        default,
4627        skip_serializing_if = "Option::is_none"
4628    )]
4629    pub multiple_choice_answer: Option<MultipleChoiceAnswer>,
4630}
4631
4632/// The `answer` oneof of [`UserQuestionAnswer`], as an owned value.
4633#[derive(Debug, Clone, PartialEq)]
4634pub enum UserQuestionAnswerAnswer {
4635    Unanswered(bool),
4636    MultipleChoiceAnswer(MultipleChoiceAnswer),
4637}
4638
4639impl UserQuestionAnswer {
4640    /// Takes the set arm of the `answer` oneof, if any.
4641    pub fn into_answer(self) -> Option<UserQuestionAnswerAnswer> {
4642        if let Some(v) = self.unanswered {
4643            return Some(UserQuestionAnswerAnswer::Unanswered(v));
4644        }
4645        if let Some(v) = self.multiple_choice_answer {
4646            return Some(UserQuestionAnswerAnswer::MultipleChoiceAnswer(v));
4647        }
4648        None
4649    }
4650
4651    /// True when any arm of the `answer` oneof is set.
4652    pub fn has_answer(&self) -> bool {
4653        self.unanswered.is_some() || self.multiple_choice_answer.is_some()
4654    }
4655}
4656
4657/// `antigravity.localharness.UserQuestionsConfig`
4658#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4659#[serde(rename_all = "camelCase")]
4660pub struct UserQuestionsConfig {
4661    #[serde(default, skip_serializing_if = "Option::is_none")]
4662    pub enabled: Option<bool>,
4663}
4664
4665/// `antigravity.localharness.UserQuestionsRequest`
4666#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4667#[serde(rename_all = "camelCase")]
4668pub struct UserQuestionsRequest {
4669    #[serde(default, skip_serializing_if = "Vec::is_empty")]
4670    pub questions: Vec<UserQuestion>,
4671}
4672
4673/// `antigravity.localharness.UserQuestionsResponse`
4674#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4675#[serde(rename_all = "camelCase")]
4676pub struct UserQuestionsResponse {
4677    #[serde(default, skip_serializing_if = "Option::is_none")]
4678    pub cancelled: Option<bool>,
4679    #[serde(default, skip_serializing_if = "Option::is_none")]
4680    pub response: Option<UserQuestionsResponseQuestionsResponse>,
4681    #[serde(
4682        alias = "trajectory_id",
4683        default,
4684        skip_serializing_if = "Option::is_none"
4685    )]
4686    pub trajectory_id: Option<String>,
4687    #[serde(alias = "step_index", default, skip_serializing_if = "Option::is_none")]
4688    pub step_index: Option<u32>,
4689}
4690
4691/// The `result` oneof of [`UserQuestionsResponse`], as an owned value.
4692#[derive(Debug, Clone, PartialEq)]
4693pub enum UserQuestionsResponseResult {
4694    Cancelled(bool),
4695    Response(UserQuestionsResponseQuestionsResponse),
4696}
4697
4698impl UserQuestionsResponse {
4699    /// Takes the set arm of the `result` oneof, if any.
4700    pub fn into_result(self) -> Option<UserQuestionsResponseResult> {
4701        if let Some(v) = self.cancelled {
4702            return Some(UserQuestionsResponseResult::Cancelled(v));
4703        }
4704        if let Some(v) = self.response {
4705            return Some(UserQuestionsResponseResult::Response(v));
4706        }
4707        None
4708    }
4709
4710    /// True when any arm of the `result` oneof is set.
4711    pub fn has_result(&self) -> bool {
4712        self.cancelled.is_some() || self.response.is_some()
4713    }
4714}
4715
4716/// `antigravity.localharness.UserQuestionsResponse.QuestionsResponse`
4717#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4718#[serde(rename_all = "camelCase")]
4719pub struct UserQuestionsResponseQuestionsResponse {
4720    #[serde(default, skip_serializing_if = "Vec::is_empty")]
4721    pub answers: Vec<UserQuestionAnswer>,
4722}
4723
4724/// `genai.Value`
4725#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4726#[serde(rename_all = "camelCase")]
4727pub struct Value {
4728    #[serde(alias = "null_value", default, skip_serializing_if = "Option::is_none")]
4729    pub null_value: Option<NullValue>,
4730    #[serde(
4731        alias = "number_value",
4732        default,
4733        skip_serializing_if = "Option::is_none"
4734    )]
4735    pub number_value: Option<f64>,
4736    #[serde(
4737        alias = "string_value",
4738        default,
4739        skip_serializing_if = "Option::is_none"
4740    )]
4741    pub string_value: Option<String>,
4742    #[serde(alias = "bool_value", default, skip_serializing_if = "Option::is_none")]
4743    pub bool_value: Option<bool>,
4744    #[serde(
4745        alias = "struct_value",
4746        default,
4747        skip_serializing_if = "Option::is_none"
4748    )]
4749    pub struct_value: Option<Struct>,
4750    #[serde(alias = "list_value", default, skip_serializing_if = "Option::is_none")]
4751    pub list_value: Option<ListValue>,
4752    #[serde(
4753        alias = "content_value",
4754        default,
4755        skip_serializing_if = "Option::is_none"
4756    )]
4757    pub content_value: Option<Content>,
4758}
4759
4760/// The `kind` oneof of [`Value`], as an owned value.
4761#[derive(Debug, Clone, PartialEq)]
4762pub enum ValueKind {
4763    NullValue(NullValue),
4764    NumberValue(f64),
4765    StringValue(String),
4766    BoolValue(bool),
4767    StructValue(Struct),
4768    ListValue(ListValue),
4769    ContentValue(Content),
4770}
4771
4772impl Value {
4773    /// Takes the set arm of the `kind` oneof, if any.
4774    pub fn into_kind(self) -> Option<ValueKind> {
4775        if let Some(v) = self.null_value {
4776            return Some(ValueKind::NullValue(v));
4777        }
4778        if let Some(v) = self.number_value {
4779            return Some(ValueKind::NumberValue(v));
4780        }
4781        if let Some(v) = self.string_value {
4782            return Some(ValueKind::StringValue(v));
4783        }
4784        if let Some(v) = self.bool_value {
4785            return Some(ValueKind::BoolValue(v));
4786        }
4787        if let Some(v) = self.struct_value {
4788            return Some(ValueKind::StructValue(v));
4789        }
4790        if let Some(v) = self.list_value {
4791            return Some(ValueKind::ListValue(v));
4792        }
4793        if let Some(v) = self.content_value {
4794            return Some(ValueKind::ContentValue(v));
4795        }
4796        None
4797    }
4798
4799    /// True when any arm of the `kind` oneof is set.
4800    pub fn has_kind(&self) -> bool {
4801        self.null_value.is_some()
4802            || self.number_value.is_some()
4803            || self.string_value.is_some()
4804            || self.bool_value.is_some()
4805            || self.struct_value.is_some()
4806            || self.list_value.is_some()
4807            || self.content_value.is_some()
4808    }
4809}
4810
4811/// `antigravity.localharness.VertexEndpoint`
4812#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4813#[serde(rename_all = "camelCase")]
4814pub struct VertexEndpoint {
4815    #[serde(alias = "base_url", default, skip_serializing_if = "Option::is_none")]
4816    pub base_url: Option<String>,
4817    #[serde(
4818        alias = "http_headers",
4819        default,
4820        skip_serializing_if = "HashMap::is_empty"
4821    )]
4822    pub http_headers: HashMap<String, String>,
4823    #[serde(default, skip_serializing_if = "Option::is_none")]
4824    pub project: Option<String>,
4825    #[serde(default, skip_serializing_if = "Option::is_none")]
4826    pub location: Option<String>,
4827    #[serde(default, skip_serializing_if = "Option::is_none")]
4828    pub options: Option<GeminiModelOptions>,
4829}
4830
4831/// `genai.VideoContent`
4832#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4833#[serde(rename_all = "camelCase")]
4834pub struct VideoContent {
4835    #[serde(
4836        default,
4837        skip_serializing_if = "Option::is_none",
4838        with = "crate::wire::opt_bytes"
4839    )]
4840    pub data: Option<Vec<u8>>,
4841    #[serde(default, skip_serializing_if = "Option::is_none")]
4842    pub uri: Option<String>,
4843    #[serde(alias = "mime_type", default, skip_serializing_if = "Option::is_none")]
4844    pub mime_type: Option<VideoContentMimeType>,
4845    #[serde(default, skip_serializing_if = "Option::is_none")]
4846    pub resolution: Option<MediaResolution>,
4847}
4848
4849/// The `data_or_uri` oneof of [`VideoContent`], as an owned value.
4850#[derive(Debug, Clone, PartialEq)]
4851pub enum VideoContentDataOrUri {
4852    Data(Vec<u8>),
4853    Uri(String),
4854}
4855
4856impl VideoContent {
4857    /// Takes the set arm of the `data_or_uri` oneof, if any.
4858    pub fn into_data_or_uri(self) -> Option<VideoContentDataOrUri> {
4859        if let Some(v) = self.data {
4860            return Some(VideoContentDataOrUri::Data(v));
4861        }
4862        if let Some(v) = self.uri {
4863            return Some(VideoContentDataOrUri::Uri(v));
4864        }
4865        None
4866    }
4867
4868    /// True when any arm of the `data_or_uri` oneof is set.
4869    pub fn has_data_or_uri(&self) -> bool {
4870        self.data.is_some() || self.uri.is_some()
4871    }
4872}
4873
4874/// `antigravity.localharness.ViewFileToolConfig`
4875#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4876#[serde(rename_all = "camelCase")]
4877pub struct ViewFileToolConfig {
4878    #[serde(default, skip_serializing_if = "Option::is_none")]
4879    pub enabled: Option<bool>,
4880}
4881
4882/// `genai.WordInfo`
4883#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4884#[serde(rename_all = "camelCase")]
4885pub struct WordInfo {
4886    #[serde(default, skip_serializing_if = "Option::is_none")]
4887    pub text: Option<String>,
4888    #[serde(
4889        alias = "start_offset",
4890        default,
4891        skip_serializing_if = "Option::is_none"
4892    )]
4893    pub start_offset: Option<String>,
4894    #[serde(alias = "end_offset", default, skip_serializing_if = "Option::is_none")]
4895    pub end_offset: Option<String>,
4896    #[serde(default, skip_serializing_if = "Option::is_none")]
4897    pub speaker: Option<String>,
4898}
4899
4900/// `antigravity.localharness.Workspace`
4901#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4902#[serde(rename_all = "camelCase")]
4903pub struct Workspace {
4904    #[serde(
4905        alias = "filesystem_workspace",
4906        default,
4907        skip_serializing_if = "Option::is_none"
4908    )]
4909    pub filesystem_workspace: Option<FilesystemWorkspace>,
4910}
4911
4912/// The `workspace_type` oneof of [`Workspace`], as an owned value.
4913#[derive(Debug, Clone, PartialEq)]
4914pub enum WorkspaceWorkspaceType {
4915    FilesystemWorkspace(FilesystemWorkspace),
4916}
4917
4918impl Workspace {
4919    /// Takes the set arm of the `workspace_type` oneof, if any.
4920    pub fn into_workspace_type(self) -> Option<WorkspaceWorkspaceType> {
4921        if let Some(v) = self.filesystem_workspace {
4922            return Some(WorkspaceWorkspaceType::FilesystemWorkspace(v));
4923        }
4924        None
4925    }
4926
4927    /// True when any arm of the `workspace_type` oneof is set.
4928    pub fn has_workspace_type(&self) -> bool {
4929        self.filesystem_workspace.is_some()
4930    }
4931}
4932
4933/// `antigravity.localharness.WriteToFileToolConfig`
4934#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4935#[serde(rename_all = "camelCase")]
4936pub struct WriteToFileToolConfig {
4937    #[serde(default, skip_serializing_if = "Option::is_none")]
4938    pub enabled: Option<bool>,
4939}