[exec] add include-plan-tool flag and print it nicely (#3461)
### Summary Sometimes in exec runs, we want to allow the model to use the `update_plan` tool, but that's not easily configurable. This change adds a feature flag for this, and formats the output so it's human-readable ## Test Plan <img width="1280" height="354" alt="Screenshot 2025-09-11 at 12 39 44 AM" src="https://github.com/user-attachments/assets/72e11070-fb98-47f5-a784-5123ca7333d9" />
This commit is contained in:
@@ -67,6 +67,10 @@ pub struct Cli {
|
|||||||
#[arg(long = "json", default_value_t = false)]
|
#[arg(long = "json", default_value_t = false)]
|
||||||
pub json: bool,
|
pub json: bool,
|
||||||
|
|
||||||
|
/// Whether to include the plan tool in the conversation.
|
||||||
|
#[arg(long = "include-plan-tool", default_value_t = false)]
|
||||||
|
pub include_plan_tool: bool,
|
||||||
|
|
||||||
/// Specifies file where the last message from the agent should be written.
|
/// Specifies file where the last message from the agent should be written.
|
||||||
#[arg(long = "output-last-message")]
|
#[arg(long = "output-last-message")]
|
||||||
pub last_message_file: Option<PathBuf>,
|
pub last_message_file: Option<PathBuf>,
|
||||||
|
|||||||
@@ -539,8 +539,37 @@ impl EventProcessor for EventProcessorWithHumanOutput {
|
|||||||
}
|
}
|
||||||
EventMsg::PlanUpdate(plan_update_event) => {
|
EventMsg::PlanUpdate(plan_update_event) => {
|
||||||
let UpdatePlanArgs { explanation, plan } = plan_update_event;
|
let UpdatePlanArgs { explanation, plan } = plan_update_event;
|
||||||
ts_println!(self, "explanation: {explanation:?}");
|
|
||||||
ts_println!(self, "plan: {plan:?}");
|
// Header
|
||||||
|
ts_println!(self, "{}", "Plan update".style(self.magenta));
|
||||||
|
|
||||||
|
// Optional explanation
|
||||||
|
if let Some(explanation) = explanation
|
||||||
|
&& !explanation.trim().is_empty()
|
||||||
|
{
|
||||||
|
ts_println!(self, "{}", explanation.style(self.italic));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pretty-print the plan items with simple status markers.
|
||||||
|
for item in plan {
|
||||||
|
use codex_core::plan_tool::StepStatus;
|
||||||
|
match item.status {
|
||||||
|
StepStatus::Completed => {
|
||||||
|
ts_println!(self, " {} {}", "✓".style(self.green), item.step);
|
||||||
|
}
|
||||||
|
StepStatus::InProgress => {
|
||||||
|
ts_println!(self, " {} {}", "→".style(self.cyan), item.step);
|
||||||
|
}
|
||||||
|
StepStatus::Pending => {
|
||||||
|
ts_println!(
|
||||||
|
self,
|
||||||
|
" {} {}",
|
||||||
|
"•".style(self.dimmed),
|
||||||
|
item.step.style(self.dimmed)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
EventMsg::GetHistoryEntryResponse(_) => {
|
EventMsg::GetHistoryEntryResponse(_) => {
|
||||||
// Currently ignored in exec output.
|
// Currently ignored in exec output.
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ pub async fn run_main(cli: Cli, codex_linux_sandbox_exe: Option<PathBuf>) -> any
|
|||||||
sandbox_mode: sandbox_mode_cli_arg,
|
sandbox_mode: sandbox_mode_cli_arg,
|
||||||
prompt,
|
prompt,
|
||||||
output_schema: output_schema_path,
|
output_schema: output_schema_path,
|
||||||
|
include_plan_tool,
|
||||||
config_overrides,
|
config_overrides,
|
||||||
} = cli;
|
} = cli;
|
||||||
|
|
||||||
@@ -161,7 +162,7 @@ pub async fn run_main(cli: Cli, codex_linux_sandbox_exe: Option<PathBuf>) -> any
|
|||||||
model_provider,
|
model_provider,
|
||||||
codex_linux_sandbox_exe,
|
codex_linux_sandbox_exe,
|
||||||
base_instructions: None,
|
base_instructions: None,
|
||||||
include_plan_tool: None,
|
include_plan_tool: Some(include_plan_tool),
|
||||||
include_apply_patch_tool: None,
|
include_apply_patch_tool: None,
|
||||||
include_view_image_tool: None,
|
include_view_image_tool: None,
|
||||||
show_raw_agent_reasoning: oss.then_some(true),
|
show_raw_agent_reasoning: oss.then_some(true),
|
||||||
|
|||||||
Reference in New Issue
Block a user