use objectiveai_sdk::cli::command::viewer::spawn::{Request, Response};
use crate::context::Context;
use crate::error::Error;
pub async fn spawn(ctx: &Context) -> Result<String, Error> {
let daemon_address = ctx
.daemon_address()
.ok_or(Error::DaemonAddressUnavailable)?
.to_string();
let bin = if cfg!(windows) {
"objectiveai-viewer.exe"
} else {
"objectiveai-viewer"
};
let exe = ctx.filesystem.bin_dir().join(bin);
let lock_dir = ctx.filesystem.state_dir().join("locks");
let daemon_signature = ctx.config.daemon_secret.as_deref().map(|secret| {
use sha2::{Digest, Sha256};
let hash = Sha256::digest(secret.as_bytes());
format!(
"sha256={}",
hash.iter().map(|b| format!("{:02x}", b)).collect::<String>()
)
});
crate::spawn::spawn_until_lock_published(&exe, &lock_dir, "viewer", |cmd| {
cmd.env("OBJECTIVEAI_DIR", ctx.filesystem.dir())
.env("OBJECTIVEAI_STATE", ctx.filesystem.state())
.env("SUPPRESS_OUTPUT", "true")
.env("DAEMON_ADDRESS", &daemon_address);
if let Some(signature) = daemon_signature {
cmd.env("DAEMON_SIGNATURE", signature);
}
})
.await
}
pub async fn execute(ctx: &Context, _request: Request) -> Result<Response, Error> {
Ok(Response {
listening: spawn(ctx).await?,
})
}
pub mod request_schema {
use objectiveai_sdk::cli::command::viewer::spawn as sdk;
use objectiveai_sdk::cli::command::viewer::spawn::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::viewer::spawn as sdk;
use objectiveai_sdk::cli::command::viewer::spawn::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)))
}
}