Skip to main content

objectiveai_sdk/cli/command/plugins/install/
mod.rs

1pub mod filesystem;
2pub mod github;
3
4#[derive(clap::Subcommand)]
5pub enum Command {
6    Filesystem(filesystem::Command),
7    Github(github::Command),
8}
9
10#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
11#[serde(untagged)]
12#[schemars(rename = "cli.command.plugins.install.Request")]
13pub enum Request {
14    #[schemars(title = "Filesystem")]
15    Filesystem(filesystem::Request),
16    #[schemars(title = "FilesystemRequestSchema")]
17    FilesystemRequestSchema(filesystem::request_schema::Request),
18    #[schemars(title = "FilesystemResponseSchema")]
19    FilesystemResponseSchema(filesystem::response_schema::Request),
20    #[schemars(title = "Github")]
21    Github(github::Request),
22    #[schemars(title = "GithubRequestSchema")]
23    GithubRequestSchema(github::request_schema::Request),
24    #[schemars(title = "GithubResponseSchema")]
25    GithubResponseSchema(github::response_schema::Request),
26}
27
28// Exempt from json-schema coverage: tier aggregate (see the root
29// `ResponseItem` in command.rs - TS7056).
30#[objectiveai_sdk_macros::json_schema_ignore]
31#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
32#[schemars(rename = "cli.command.plugins.install.Response")]
33#[serde(untagged)]
34pub enum Response {
35    #[schemars(title = "Filesystem")]
36    Filesystem(filesystem::Response),
37    #[schemars(title = "FilesystemRequestSchema")]
38    FilesystemRequestSchema(filesystem::request_schema::Response),
39    #[schemars(title = "FilesystemResponseSchema")]
40    FilesystemResponseSchema(filesystem::response_schema::Response),
41    #[schemars(title = "Github")]
42    Github(github::Response),
43    #[schemars(title = "GithubRequestSchema")]
44    GithubRequestSchema(github::request_schema::Response),
45    #[schemars(title = "GithubResponseSchema")]
46    GithubResponseSchema(github::response_schema::Response),
47}
48
49#[cfg(feature = "mcp")]
50impl crate::cli::command::CommandResponse for Response {
51    fn into_mcp(self) -> crate::cli::command::McpResponseItem {
52        match self {
53            Response::Filesystem(v) => v.into_mcp(),
54            Response::FilesystemRequestSchema(v) => v.into_mcp(),
55            Response::FilesystemResponseSchema(v) => v.into_mcp(),
56            Response::Github(v) => v.into_mcp(),
57            Response::GithubRequestSchema(v) => v.into_mcp(),
58            Response::GithubResponseSchema(v) => v.into_mcp(),
59        }
60    }
61}
62
63impl TryFrom<Command> for Request {
64    type Error = crate::cli::command::FromArgsError;
65    fn try_from(command: Command) -> Result<Self, Self::Error> {
66        match command {
67            Command::Filesystem(cmd) => match cmd.schema {
68                None => Ok(Request::Filesystem(filesystem::Request::try_from(cmd.args)?)),
69                Some(filesystem::Schema::RequestSchema(args)) =>
70                    Ok(Request::FilesystemRequestSchema(filesystem::request_schema::Request::try_from(args)?)),
71                Some(filesystem::Schema::ResponseSchema(args)) =>
72                    Ok(Request::FilesystemResponseSchema(filesystem::response_schema::Request::try_from(args)?)),
73            },
74            Command::Github(cmd) => match cmd.schema {
75                None => Ok(Request::Github(github::Request::try_from(cmd.args)?)),
76                Some(github::Schema::RequestSchema(args)) =>
77                    Ok(Request::GithubRequestSchema(github::request_schema::Request::try_from(args)?)),
78                Some(github::Schema::ResponseSchema(args)) =>
79                    Ok(Request::GithubResponseSchema(github::response_schema::Request::try_from(args)?)),
80            },
81        }
82    }
83}
84
85impl crate::cli::command::CommandRequest for Request {
86    fn request_base(&self) -> &crate::cli::command::RequestBase {
87        match self {
88            Request::Filesystem(inner) => inner.request_base(),
89            Request::FilesystemRequestSchema(inner) => inner.request_base(),
90            Request::FilesystemResponseSchema(inner) => inner.request_base(),
91            Request::Github(inner) => inner.request_base(),
92            Request::GithubRequestSchema(inner) => inner.request_base(),
93            Request::GithubResponseSchema(inner) => inner.request_base(),
94        }
95    }
96
97    fn request_base_mut(&mut self) -> Option<&mut crate::cli::command::RequestBase> {
98        match self {
99            Request::Filesystem(inner) => inner.request_base_mut(),
100            Request::FilesystemRequestSchema(inner) => inner.request_base_mut(),
101            Request::FilesystemResponseSchema(inner) => inner.request_base_mut(),
102            Request::Github(inner) => inner.request_base_mut(),
103            Request::GithubRequestSchema(inner) => inner.request_base_mut(),
104            Request::GithubResponseSchema(inner) => inner.request_base_mut(),
105        }
106    }
107}
108
109#[cfg(feature = "cli-executor")]
110pub async fn execute<E: crate::cli::command::CommandExecutor>(
111    executor: &E,
112    request: Request,
113
114        agent_arguments: Option<&crate::cli::command::AgentArguments>,
115    ) -> Result<
116    std::pin::Pin<Box<dyn futures::Stream<Item = Result<Response, E::Error>> + Send>>,
117    E::Error,
118> {
119    use futures::StreamExt;
120    let stream: std::pin::Pin<Box<dyn futures::Stream<Item = Result<Response, E::Error>> + Send>> =
121        match request {
122            Request::Filesystem(req) => {
123                let value = filesystem::execute(executor, req, agent_arguments).await?;
124                Box::pin(crate::cli::command::StreamOnce::new(Ok(
125                    Response::Filesystem(value),
126                )))
127            }
128            Request::FilesystemRequestSchema(req) => {
129                let value = filesystem::request_schema::execute(executor, req, agent_arguments).await?;
130                Box::pin(crate::cli::command::StreamOnce::new(Ok(
131                    Response::FilesystemRequestSchema(value),
132                )))
133            }
134            Request::FilesystemResponseSchema(req) => {
135                let value = filesystem::response_schema::execute(executor, req, agent_arguments).await?;
136                Box::pin(crate::cli::command::StreamOnce::new(Ok(
137                    Response::FilesystemResponseSchema(value),
138                )))
139            }
140            Request::Github(req) => {
141                let value = github::execute(executor, req, agent_arguments).await?;
142                Box::pin(crate::cli::command::StreamOnce::new(Ok(
143                    Response::Github(value),
144                )))
145            }
146            Request::GithubRequestSchema(req) => {
147                let value = github::request_schema::execute(executor, req, agent_arguments).await?;
148                Box::pin(crate::cli::command::StreamOnce::new(Ok(
149                    Response::GithubRequestSchema(value),
150                )))
151            }
152            Request::GithubResponseSchema(req) => {
153                let value = github::response_schema::execute(executor, req, agent_arguments).await?;
154                Box::pin(crate::cli::command::StreamOnce::new(Ok(
155                    Response::GithubResponseSchema(value),
156                )))
157            }
158        };
159    Ok(stream)
160}
161
162#[cfg(feature = "cli-executor")]
163pub async fn execute_transform<E: crate::cli::command::CommandExecutor>(
164    executor: &E,
165    request: Request,
166    transform: crate::cli::command::Transform,
167
168        agent_arguments: Option<&crate::cli::command::AgentArguments>,
169    ) -> Result<
170    std::pin::Pin<Box<dyn futures::Stream<Item = Result<serde_json::Value, E::Error>> + Send>>,
171    E::Error,
172> {
173    let stream: std::pin::Pin<Box<dyn futures::Stream<Item = Result<serde_json::Value, E::Error>> + Send>> =
174        match request {
175            Request::Filesystem(req) => {
176                let value = filesystem::execute_transform(executor, req, transform, agent_arguments).await?;
177                Box::pin(crate::cli::command::StreamOnce::new(Ok(value)))
178            }
179            Request::FilesystemRequestSchema(req) => {
180                let value = filesystem::request_schema::execute_transform(executor, req, transform, agent_arguments).await?;
181                Box::pin(crate::cli::command::StreamOnce::new(Ok(value)))
182            }
183            Request::FilesystemResponseSchema(req) => {
184                let value = filesystem::response_schema::execute_transform(executor, req, transform, agent_arguments).await?;
185                Box::pin(crate::cli::command::StreamOnce::new(Ok(value)))
186            }
187            Request::Github(req) => {
188                let value = github::execute_transform(executor, req, transform, agent_arguments).await?;
189                Box::pin(crate::cli::command::StreamOnce::new(Ok(value)))
190            }
191            Request::GithubRequestSchema(req) => {
192                let value = github::request_schema::execute_transform(executor, req, transform, agent_arguments).await?;
193                Box::pin(crate::cli::command::StreamOnce::new(Ok(value)))
194            }
195            Request::GithubResponseSchema(req) => {
196                let value = github::response_schema::execute_transform(executor, req, transform, agent_arguments).await?;
197                Box::pin(crate::cli::command::StreamOnce::new(Ok(value)))
198            }
199        };
200    Ok(stream)
201}