use std::path::PathBuf; use libmcp::{Generation, HostSessionKernelSnapshot}; use serde::{Deserialize, Serialize}; use serde_json::Value; use crate::mcp::telemetry::ServerTelemetry; pub(crate) const PROTOCOL_VERSION: &str = "2025-11-25"; pub(crate) const SERVER_NAME: &str = "phone_opus"; pub(crate) const HOST_STATE_ENV: &str = "PHONE_OPUS_MCP_HOST_STATE"; pub(crate) const FORCE_ROLLOUT_ENV: &str = "PHONE_OPUS_MCP_TEST_FORCE_ROLLOUT_KEY"; pub(crate) const WORKER_CRASH_ONCE_ENV: &str = "PHONE_OPUS_MCP_TEST_WORKER_CRASH_ONCE_KEY"; pub(crate) const CLAUDE_BIN_ENV: &str = "PHONE_OPUS_CLAUDE_BIN"; pub(crate) const CLAUDE_EFFORT: &str = "max"; pub(crate) const CLAUDE_MODEL: &str = "claude-opus-4-6"; pub(crate) const CLAUDE_TOOLSET: &str = "Bash,Read,Grep,Glob,LS,WebFetch,WebSearch"; pub(crate) const EMPTY_MCP_CONFIG: &str = "{\"mcpServers\":{}}"; #[derive(Clone, Debug, Deserialize, Serialize)] pub(crate) struct HostStateSeed { pub(crate) session_kernel: HostSessionKernelSnapshot, pub(crate) telemetry: ServerTelemetry, pub(crate) next_request_id: u64, pub(crate) worker_generation: Generation, pub(crate) worker_spawned: bool, pub(crate) force_rollout_consumed: bool, pub(crate) worker_crash_once_consumed: bool, } #[derive(Clone, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)] #[serde(transparent)] pub(crate) struct HostRequestId(pub(crate) u64); #[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] #[serde(tag = "kind", rename_all = "snake_case")] pub(crate) enum WorkerRequest { Execute { id: HostRequestId, operation: WorkerOperation, }, } #[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] #[serde(tag = "kind", rename_all = "snake_case")] pub(crate) enum WorkerOperation { CallTool { name: String, arguments: Value }, } #[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] pub(crate) struct WorkerResponse { pub(crate) id: HostRequestId, pub(crate) outcome: WorkerOutcome, } #[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] #[serde(tag = "status", rename_all = "snake_case")] pub(crate) enum WorkerOutcome { Success { result: Value, }, Fault { fault: crate::mcp::fault::FaultRecord, }, } #[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] pub(crate) struct BinaryFingerprint { pub(crate) length_bytes: u64, pub(crate) modified_unix_nanos: u128, } #[derive(Clone, Debug)] pub(crate) struct WorkerSpawnConfig { pub(crate) executable: PathBuf, }