swarm repositories / source
aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
authormain <main@swarm.moe>2026-03-23 18:00:13 -0400
committermain <main@swarm.moe>2026-03-23 18:00:13 -0400
commita4a4798b4deed085021149e45e20c5e014ee4de5 (patch)
tree58ddc3346b1b0515a53e0f21d086dffc7a7d3a10 /crates
parentcd7d3d07d29aec672858ab70a792b39ddd0ec3ad (diff)
downloadphone_opus-a4a4798b4deed085021149e45e20c5e014ee4de5.zip
Remove consult turn limits
Diffstat (limited to 'crates')
-rw-r--r--crates/phone-opus/src/mcp/catalog.rs5
-rw-r--r--crates/phone-opus/src/mcp/service.rs30
-rw-r--r--crates/phone-opus/tests/mcp_hardening.rs4
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")?;