objectiveai_cli/command/api/
spawn.rs1use objectiveai_sdk::cli::command::api::spawn::{Request, Response};
9
10use crate::context::Context;
11use crate::error::Error;
12
13const API_CONFIG_ENV: &[&str] = &[
27 "OBJECTIVEAI_ADDRESS",
28 "OBJECTIVEAI_AUTHORIZATION",
29 "OPENROUTER_ADDRESS",
30 "OPENROUTER_AUTHORIZATION",
31 "GITHUB_AUTHORIZATION",
32 "MCP_AUTHORIZATION",
33 "USER_AGENT",
34 "HTTP_REFERER",
35 "X_TITLE",
36 "COMMIT_AUTHOR_NAME",
37 "COMMIT_AUTHOR_EMAIL",
38 "CLAUDE_AGENT_SDK_ENABLED",
39 "CLAUDE_AGENT_SDK_RATE_LIMIT_MAX_RETRIES",
40 "CLAUDE_AGENT_SDK_RATE_LIMIT_MAX_WAIT_SECS",
41 "CLAUDE_AGENT_SDK_QUERY_LIMIT",
42 "CODEX_SDK_ENABLED",
43 "CODEX_SDK_RATE_LIMIT_MAX_RETRIES",
44 "CODEX_SDK_RATE_LIMIT_MAX_WAIT_SECS",
45 "CODEX_SDK_QUERY_LIMIT",
46 "AGENT_COMPLETIONS_BACKOFF_MAX_ELAPSED_TIME",
47 "MCP_BACKOFF_MAX_ELAPSED_TIME",
48 "GITHUB_BACKOFF_MAX_ELAPSED_TIME",
49 "AGENT_COMPLETIONS_FIRST_CHUNK_TIMEOUT",
50 "AGENT_COMPLETIONS_OTHER_CHUNK_TIMEOUT",
51 "MCP_CONNECT_TIMEOUT",
52 "MCP_CALL_TIMEOUT",
53 "REVERSE_CHANNEL_TIMEOUT",
54 "MCP_ENCRYPTION_KEY",
55 "OBJECTIVEAI_STATE",
56 "MOCK_DELAY_MS",
57 "MOCK_MAX_TOOL_CALLS",
58 "ADDRESS",
59 "PORT",
60];
61
62pub async fn spawn(ctx: &Context) -> Result<String, Error> {
67 let bin = if cfg!(windows) {
68 "objectiveai-api.exe"
69 } else {
70 "objectiveai-api"
71 };
72 let exe = ctx.filesystem.bin_dir().join(bin);
73 let lock_dir = ctx.filesystem.bin_dir().join("locks");
74
75 let timeout_ms = ctx.resolve_mcp_timeout_ms_opt().await?;
87 let backoff_ms = ctx.resolve_backoff_max_elapsed_time_ms_opt().await?;
88
89 crate::spawn::spawn_until_lock_published(&exe, &lock_dir, "api", |cmd| {
90 for key in API_CONFIG_ENV {
91 cmd.env_remove(key);
92 }
93 cmd.env("OBJECTIVEAI_DIR", ctx.filesystem.dir())
94 .env("SUPPRESS_OUTPUT", "true");
95 if let Some(timeout_ms) = timeout_ms {
96 let v = timeout_ms.to_string();
97 cmd.env("MCP_CONNECT_TIMEOUT", &v)
98 .env("MCP_CALL_TIMEOUT", &v);
99 }
100 if let Some(backoff_ms) = backoff_ms {
101 let v = backoff_ms.to_string();
102 cmd.env("AGENT_COMPLETIONS_BACKOFF_MAX_ELAPSED_TIME", &v)
103 .env("MCP_BACKOFF_MAX_ELAPSED_TIME", &v)
104 .env("GITHUB_BACKOFF_MAX_ELAPSED_TIME", &v);
105 }
106 })
107 .await
108}
109
110pub async fn execute(ctx: &Context, _request: Request) -> Result<Response, Error> {
111 Ok(Response {
112 listening: spawn(ctx).await?,
113 })
114}
115
116pub mod request_schema {
117 use objectiveai_sdk::cli::command::api::spawn as sdk;
118 use objectiveai_sdk::cli::command::api::spawn::request_schema::{Request, Response};
119
120 use crate::context::Context;
121 use crate::error::Error;
122
123 pub async fn execute(_ctx: &Context, _request: Request) -> Result<Response, Error> {
124 Ok(objectiveai_sdk::cli::command::ResponseSchema(schemars::schema_for!(sdk::Request)))
125 }
126}
127
128pub mod response_schema {
129 use objectiveai_sdk::cli::command::api::spawn as sdk;
130 use objectiveai_sdk::cli::command::api::spawn::response_schema::{Request, Response};
131
132 use crate::context::Context;
133 use crate::error::Error;
134
135 pub async fn execute(_ctx: &Context, _request: Request) -> Result<Response, Error> {
136 Ok(objectiveai_sdk::cli::command::ResponseSchema(schemars::schema_for!(sdk::Response)))
137 }
138}