Skip to main content

objectiveai_cli/command/agents/
publish.rs

1//! `agents publish` — write a `RemoteAgentBaseWithFallbacks` to a
2//! repository on the filesystem and return its content sha.
3//!
4//! Body resolves via the 4-variant `RequestBody` enum (inline /
5//! file / python-inline / python-file) and the commit message via
6//! the 2-variant `RequestPublishMessage` (inline / file).
7
8use objectiveai_sdk::agent::RemoteAgentBaseWithFallbacks;
9use objectiveai_sdk::cli::command::agents::publish::{
10    Request, RequestBody, RequestPublishMessage, Response,
11};
12
13use crate::context::Context;
14use crate::error::Error;
15
16pub async fn execute(ctx: &Context, request: Request) -> Result<Response, Error> {
17    let body = resolve_body(ctx, request.body).await?;
18    let message = resolve_publish_message(request.message)?;
19    let sha = crate::filesystem::publish::publish_agent(
20        &ctx.filesystem,
21        &request.repository,
22        &body,
23        &message,
24        request.overwrite,
25    )
26    .await?;
27    Ok(Response { sha })
28}
29
30async fn resolve_body(
31    ctx: &Context,
32    body: RequestBody,
33) -> Result<RemoteAgentBaseWithFallbacks, Error> {
34    match body {
35        RequestBody::Inline(v) => Ok(v),
36        RequestBody::File(p) => crate::source_resolver::resolve_source(
37            ctx, None, None, Some(p), None, None,
38            |_| unreachable!(),
39        ).await,
40        RequestBody::PythonInline(s) => crate::source_resolver::resolve_source(
41            ctx, None, None, None, Some(s), None,
42            |_| unreachable!(),
43        ).await,
44        RequestBody::PythonFile(p) => crate::source_resolver::resolve_source(
45            ctx, None, None, None, None, Some(p),
46            |_| unreachable!(),
47        ).await,
48    }
49}
50
51fn resolve_publish_message(m: RequestPublishMessage) -> Result<String, Error> {
52    match m {
53        RequestPublishMessage::Inline(s) => Ok(s),
54        RequestPublishMessage::File(p) => std::fs::read_to_string(&p)
55            .map_err(|e| Error::PromptFileRead(p, e)),
56    }
57}
58
59pub mod request_schema {
60    use objectiveai_sdk::cli::command::agents::publish as sdk;
61    use objectiveai_sdk::cli::command::agents::publish::request_schema::{Request, Response};
62
63    use crate::context::Context;
64    use crate::error::Error;
65
66    pub async fn execute(_ctx: &Context, _request: Request) -> Result<Response, Error> {
67        Ok(objectiveai_sdk::cli::command::ResponseSchema(schemars::schema_for!(sdk::Request)))
68    }
69}
70
71pub mod response_schema {
72    use objectiveai_sdk::cli::command::agents::publish as sdk;
73    use objectiveai_sdk::cli::command::agents::publish::response_schema::{Request, Response};
74
75    use crate::context::Context;
76    use crate::error::Error;
77
78    pub async fn execute(_ctx: &Context, _request: Request) -> Result<Response, Error> {
79        Ok(objectiveai_sdk::cli::command::ResponseSchema(schemars::schema_for!(sdk::Response)))
80    }
81}