objectiveai-cli 2.1.1

ObjectiveAI command-line interface and embeddable library
//! `agents publish` — write a `RemoteAgentBaseWithFallbacks` to a
//! repository on the filesystem and return its content sha.
//!
//! Body resolves via the 4-variant `RequestBody` enum (inline /
//! file / python-inline / python-file) and the commit message via
//! the 2-variant `RequestPublishMessage` (inline / file).

use objectiveai_sdk::agent::RemoteAgentBaseWithFallbacks;
use objectiveai_sdk::cli::command::agents::publish::{
    Request, RequestBody, RequestPublishMessage, Response,
};

use crate::context::Context;
use crate::error::Error;

pub async fn execute(ctx: &Context, request: Request) -> Result<Response, Error> {
    let body = resolve_body(request.body)?;
    let message = resolve_publish_message(request.message)?;
    let sha = crate::filesystem::publish::publish_agent(
        &ctx.filesystem,
        &request.repository,
        &body,
        &message,
        request.overwrite,
    )
    .await?;
    Ok(Response { sha })
}

fn resolve_body(body: RequestBody) -> Result<RemoteAgentBaseWithFallbacks, Error> {
    match body {
        RequestBody::Inline(v) => Ok(v),
        RequestBody::File(p) => crate::source_resolver::resolve_source(
            None, None, Some(p), None, None,
            |_| unreachable!(),
        ),
        RequestBody::PythonInline(s) => crate::source_resolver::resolve_source(
            None, None, None, Some(s), None,
            |_| unreachable!(),
        ),
        RequestBody::PythonFile(p) => crate::source_resolver::resolve_source(
            None, None, None, None, Some(p),
            |_| unreachable!(),
        ),
    }
}

fn resolve_publish_message(m: RequestPublishMessage) -> Result<String, Error> {
    match m {
        RequestPublishMessage::Inline(s) => Ok(s),
        RequestPublishMessage::File(p) => std::fs::read_to_string(&p)
            .map_err(|e| Error::PromptFileRead(p, e)),
    }
}

pub mod request_schema {
    use objectiveai_sdk::cli::command::agents::publish as sdk;
    use objectiveai_sdk::cli::command::agents::publish::request_schema::{Request, Response};

    use crate::context::Context;
    use crate::error::Error;

    pub async fn execute(_ctx: &Context, _request: Request) -> Result<Response, Error> {
        Ok(objectiveai_sdk::cli::command::ResponseSchema(schemars::schema_for!(sdk::Request)))
    }
}

pub mod response_schema {
    use objectiveai_sdk::cli::command::agents::publish as sdk;
    use objectiveai_sdk::cli::command::agents::publish::response_schema::{Request, Response};

    use crate::context::Context;
    use crate::error::Error;

    pub async fn execute(_ctx: &Context, _request: Request) -> Result<Response, Error> {
        Ok(objectiveai_sdk::cli::command::ResponseSchema(schemars::schema_for!(sdk::Response)))
    }
}