use objectiveai_sdk::cli::command::api::spawn::{Request, Response};
use crate::context::Context;
use crate::error::Error;
const API_CONFIG_ENV: &[&str] = &[
"OBJECTIVEAI_ADDRESS",
"OBJECTIVEAI_AUTHORIZATION",
"OPENROUTER_ADDRESS",
"OPENROUTER_AUTHORIZATION",
"GITHUB_AUTHORIZATION",
"MCP_AUTHORIZATION",
"USER_AGENT",
"HTTP_REFERER",
"X_TITLE",
"COMMIT_AUTHOR_NAME",
"COMMIT_AUTHOR_EMAIL",
"CLAUDE_AGENT_SDK_ENABLED",
"CLAUDE_AGENT_SDK_RATE_LIMIT_MAX_RETRIES",
"CLAUDE_AGENT_SDK_RATE_LIMIT_MAX_WAIT_SECS",
"CLAUDE_AGENT_SDK_QUERY_LIMIT",
"CODEX_SDK_ENABLED",
"CODEX_SDK_RATE_LIMIT_MAX_RETRIES",
"CODEX_SDK_RATE_LIMIT_MAX_WAIT_SECS",
"CODEX_SDK_QUERY_LIMIT",
"AGENT_COMPLETIONS_BACKOFF_MAX_ELAPSED_TIME",
"MCP_BACKOFF_MAX_ELAPSED_TIME",
"GITHUB_BACKOFF_MAX_ELAPSED_TIME",
"AGENT_COMPLETIONS_FIRST_CHUNK_TIMEOUT",
"AGENT_COMPLETIONS_OTHER_CHUNK_TIMEOUT",
"MCP_CONNECT_TIMEOUT",
"MCP_CALL_TIMEOUT",
"REVERSE_CHANNEL_TIMEOUT",
"MCP_ENCRYPTION_KEY",
"OBJECTIVEAI_STATE",
"MOCK_DELAY_MS",
"MOCK_MAX_TOOL_CALLS",
"ADDRESS",
"PORT",
];
pub async fn spawn(ctx: &Context) -> Result<String, Error> {
let bin = if cfg!(windows) {
"objectiveai-api.exe"
} else {
"objectiveai-api"
};
let exe = ctx.filesystem.bin_dir().join(bin);
let lock_dir = ctx.filesystem.bin_dir().join("locks");
let timeout_ms = ctx.resolve_mcp_timeout_ms_opt().await?;
let backoff_ms = ctx.resolve_backoff_max_elapsed_time_ms_opt().await?;
crate::spawn::spawn_until_lock_published(&exe, &lock_dir, "api", |cmd| {
for key in API_CONFIG_ENV {
cmd.env_remove(key);
}
cmd.env("OBJECTIVEAI_DIR", ctx.filesystem.dir())
.env("SUPPRESS_OUTPUT", "true");
if let Some(timeout_ms) = timeout_ms {
let v = timeout_ms.to_string();
cmd.env("MCP_CONNECT_TIMEOUT", &v)
.env("MCP_CALL_TIMEOUT", &v);
}
if let Some(backoff_ms) = backoff_ms {
let v = backoff_ms.to_string();
cmd.env("AGENT_COMPLETIONS_BACKOFF_MAX_ELAPSED_TIME", &v)
.env("MCP_BACKOFF_MAX_ELAPSED_TIME", &v)
.env("GITHUB_BACKOFF_MAX_ELAPSED_TIME", &v);
}
})
.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::api::spawn as sdk;
use objectiveai_sdk::cli::command::api::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::api::spawn as sdk;
use objectiveai_sdk::cli::command::api::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)))
}
}