objectiveai_sdk/cli/command/logs/functions/inventions/
mod.rs1pub mod recursive;
2pub mod request;
3pub mod response;
4
5#[derive(clap::Subcommand)]
6pub enum Command {
7 Recursive {
8 #[command(subcommand)]
9 command: recursive::Command,
10 },
11 Request {
12 #[command(subcommand)]
13 command: request::Command,
14 },
15 Response {
16 #[command(subcommand)]
17 command: response::Command,
18 },
19}
20
21#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
22#[serde(untagged)]
23#[schemars(rename = "cli.command.logs.functions.inventions.Request")]
24pub enum Request {
25 #[schemars(title = "Recursive")]
26 Recursive(recursive::Request),
27 #[schemars(title = "Request")]
28 Request(request::Request),
29 #[schemars(title = "Response")]
30 Response(response::Request),
31}
32
33#[objectiveai_sdk_macros::json_schema_ignore]
36#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
37#[schemars(rename = "cli.command.logs.functions.inventions.ResponseItem")]
38#[serde(untagged)]
39pub enum ResponseItem {
40 #[schemars(title = "Recursive")]
41 Recursive(recursive::ResponseItem),
42 #[schemars(title = "Request")]
43 Request(request::Response),
44 #[schemars(title = "Response")]
45 Response(response::ResponseItem),
46}
47
48#[cfg(feature = "mcp")]
49impl crate::cli::command::CommandResponse for ResponseItem {
50 fn into_mcp(self) -> crate::cli::command::McpResponseItem {
51 match self {
52 ResponseItem::Recursive(v) => v.into_mcp(),
53 ResponseItem::Request(v) => v.into_mcp(),
54 ResponseItem::Response(v) => v.into_mcp(),
55 }
56 }
57}
58
59impl TryFrom<Command> for Request {
60 type Error = crate::cli::command::FromArgsError;
61 fn try_from(command: Command) -> Result<Self, Self::Error> {
62 match command {
63 Command::Recursive { command } =>
64 Ok(Request::Recursive(recursive::Request::try_from(command)?)),
65 Command::Request { command } =>
66 Ok(Request::Request(request::Request::try_from(command)?)),
67 Command::Response { command } =>
68 Ok(Request::Response(response::Request::try_from(command)?)),
69 }
70 }
71}
72
73impl crate::cli::command::CommandRequest for Request {
74 fn into_command(&self) -> Vec<String> {
75 match self {
76 Request::Recursive(inner) => inner.into_command(),
77 Request::Request(inner) => inner.into_command(),
78 Request::Response(inner) => inner.into_command(),
79 }
80 }
81}
82
83#[cfg(feature = "cli-executor")]
84pub async fn execute<E: crate::cli::command::CommandExecutor>(
85 executor: &E,
86 request: Request,
87
88 agent_arguments: Option<&crate::cli::command::AgentArguments>,
89 ) -> Result<
90 std::pin::Pin<Box<dyn futures::Stream<Item = Result<ResponseItem, E::Error>> + Send>>,
91 E::Error,
92> {
93 use futures::StreamExt;
94 let stream: std::pin::Pin<Box<dyn futures::Stream<Item = Result<ResponseItem, E::Error>> + Send>> =
95 match request {
96 Request::Recursive(req) => {
97 let inner = recursive::execute(executor, req, agent_arguments).await?;
98 Box::pin(inner.map(|r| r.map(ResponseItem::Recursive)))
99 }
100 Request::Request(req) => {
101 let inner = request::execute(executor, req, agent_arguments).await?;
102 Box::pin(inner.map(|r| r.map(ResponseItem::Request)))
103 }
104 Request::Response(req) => {
105 let inner = response::execute(executor, req, agent_arguments).await?;
106 Box::pin(inner.map(|r| r.map(ResponseItem::Response)))
107 }
108 };
109 Ok(stream)
110}
111
112#[cfg(feature = "cli-executor")]
113pub async fn execute_jq<E: crate::cli::command::CommandExecutor>(
114 executor: &E,
115 request: Request,
116 jq: String,
117
118 agent_arguments: Option<&crate::cli::command::AgentArguments>,
119 ) -> Result<
120 std::pin::Pin<Box<dyn futures::Stream<Item = Result<serde_json::Value, E::Error>> + Send>>,
121 E::Error,
122> {
123 let stream: std::pin::Pin<Box<dyn futures::Stream<Item = Result<serde_json::Value, E::Error>> + Send>> =
124 match request {
125 Request::Recursive(req) => {
126 let inner = recursive::execute_jq(executor, req, jq, agent_arguments).await?;
127 Box::pin(inner)
128 }
129 Request::Request(req) => {
130 let inner = request::execute_jq(executor, req, jq, agent_arguments).await?;
131 Box::pin(inner)
132 }
133 Request::Response(req) => {
134 let inner = response::execute_jq(executor, req, jq, agent_arguments).await?;
135 Box::pin(inner)
136 }
137 };
138 Ok(stream)
139}