diff options
Diffstat (limited to 'crates')
| -rw-r--r-- | crates/phone-opus/src/mcp/catalog.rs | 5 | ||||
| -rw-r--r-- | crates/phone-opus/src/mcp/service.rs | 30 | ||||
| -rw-r--r-- | crates/phone-opus/tests/mcp_hardening.rs | 4 |
3 files changed, 1 insertions, 38 deletions
diff --git a/crates/phone-opus/src/mcp/catalog.rs b/crates/phone-opus/src/mcp/catalog.rs index 839c477..f3f0925 100644 --- a/crates/phone-opus/src/mcp/catalog.rs +++ b/crates/phone-opus/src/mcp/catalog.rs @@ -102,11 +102,6 @@ fn tool_schema(name: &str) -> Value { "type": "string", "description": "Optional working directory for the Claude Code session. Relative paths resolve against the MCP host working directory." }, - "max_turns": { - "type": "integer", - "minimum": 1, - "description": "Optional maximum number of Claude agent turns before stopping." - }, "session_id": { "type": "string", "description": "Optional Claude session handle returned by a previous consult call. When set, phone_opus resumes that conversation instead of starting a fresh one." diff --git a/crates/phone-opus/src/mcp/service.rs b/crates/phone-opus/src/mcp/service.rs index bd9b31f..9fc1134 100644 --- a/crates/phone-opus/src/mcp/service.rs +++ b/crates/phone-opus/src/mcp/service.rs @@ -122,7 +122,6 @@ impl WorkerService { struct ConsultArgs { prompt: String, cwd: Option<String>, - max_turns: Option<u64>, session_id: Option<String>, background: Option<bool>, } @@ -141,7 +140,6 @@ struct ConsultJobsArgs { struct ConsultRequest { prompt: PromptText, cwd: WorkingDirectory, - max_turns: Option<TurnLimit>, session: Option<SessionHandle>, mode: ConsultMode, } @@ -151,7 +149,6 @@ impl ConsultRequest { Ok(Self { prompt: PromptText::parse(args.prompt)?, cwd: WorkingDirectory::resolve(args.cwd)?, - max_turns: args.max_turns.map(TurnLimit::parse).transpose()?, session: args.session_id.map(SessionHandle::parse).transpose()?, mode: ConsultMode::from_background(args.background), }) @@ -177,7 +174,6 @@ impl ConsultRequest { BackgroundConsultRequest { prompt: self.prompt.as_str().to_owned(), cwd: self.cwd.display(), - max_turns: self.max_turns.map(TurnLimit::get), session_id: self.requested_session_id(), } } @@ -269,22 +265,6 @@ impl WorkingDirectory { } } -#[derive(Debug, Clone, Copy)] -struct TurnLimit(u64); - -impl TurnLimit { - fn parse(raw: u64) -> Result<Self, ConsultRequestError> { - if raw == 0 { - return Err(ConsultRequestError::InvalidTurnLimit); - } - Ok(Self(raw)) - } - - fn get(self) -> u64 { - self.0 - } -} - #[derive(Debug, Clone)] struct SessionHandle(Uuid); @@ -304,7 +284,6 @@ impl SessionHandle { struct BackgroundConsultRequest { prompt: String, cwd: String, - max_turns: Option<u64>, session_id: Option<String>, } @@ -313,7 +292,6 @@ impl BackgroundConsultRequest { ConsultRequest::parse(ConsultArgs { prompt: self.prompt, cwd: Some(self.cwd), - max_turns: self.max_turns, session_id: self.session_id, background: Some(false), }) @@ -459,7 +437,6 @@ impl BackgroundConsultJobRecord { "finished_unix_ms": self.finished_unix_ms, "runner_pid": self.runner_pid, "cwd": self.request.cwd, - "max_turns": self.request.max_turns, "requested_session_id": self.request.session_id, "prompt_prefix_injected": self.prompt_prefix_injected, }) @@ -476,8 +453,6 @@ enum ConsultRequestError { Canonicalize { path: String, source: io::Error }, #[error("working directory `{0}` is not a directory")] NotDirectory(String), - #[error("max_turns must be greater than zero")] - InvalidTurnLimit, #[error("session_id must be a valid UUID, got `{0}`")] InvalidSessionHandle(String), #[error("job_id must be a valid UUID, got `{0}`")] @@ -866,7 +841,6 @@ fn submit_background_consult( "prompt": request.prompt.as_str(), "effective_prompt": request.prompt.rendered(), "cwd": request.cwd.display(), - "max_turns": request.max_turns.map(TurnLimit::get), "follow_up_tools": ["consult_job", "consult_jobs"], }); fallback_detailed_tool_output( @@ -1118,9 +1092,6 @@ fn invoke_claude(request: &ConsultRequest) -> Result<ConsultResponse, ConsultInv if let Some(session) = request.session.as_ref() { let _ = command.arg("--resume").arg(session.display()); } - if let Some(max_turns) = request.max_turns { - let _ = command.arg("--max-turns").arg(max_turns.get().to_string()); - } let output = command .arg(request.prompt.rendered()) .output() @@ -1288,7 +1259,6 @@ fn consult_output( "prompt": request.prompt.as_str(), "prompt_prefix": CLAUDE_CONSULT_PREFIX, "effective_prompt": request.prompt.rendered(), - "max_turns": request.max_turns.map(TurnLimit::get), "session_mode": request.session_mode(), "requested_session_id": request.requested_session_id(), "duration_ms": response.duration_ms, diff --git a/crates/phone-opus/tests/mcp_hardening.rs b/crates/phone-opus/tests/mcp_hardening.rs index f65c254..23a1325 100644 --- a/crates/phone-opus/tests/mcp_hardening.rs +++ b/crates/phone-opus/tests/mcp_hardening.rs @@ -383,7 +383,6 @@ fn consult_can_resume_a_prior_session_with_read_only_toolset_and_requested_worki json!({ "prompt": "say oracle", "cwd": sandbox.display().to_string(), - "max_turns": 7, "session_id": resumed_session }), )?; @@ -435,8 +434,7 @@ fn consult_can_resume_a_prior_session_with_read_only_toolset_and_requested_worki assert!(!lines.contains(&"dontAsk")); assert!(lines.contains(&"--resume")); assert!(lines.contains(&resumed_session)); - assert!(lines.contains(&"--max-turns")); - assert!(lines.contains(&"7")); + assert!(!lines.contains(&"--max-turns")); assert!(args.contains(PROMPT_PREFIX)); assert!(args.contains("The real prompt follows.")); let prefix_index = must_some(args.find(PROMPT_PREFIX), "prefixed consult prompt")?; |