feat(#1147): add optional wait_seconds to bash_status
This commit is contained in:
parent
a2a96490d3
commit
faff09ef23
1 changed files with 35 additions and 6 deletions
|
|
@ -522,6 +522,12 @@ fn default_bash_run_wait() -> Option<u64> {
|
||||||
pub struct BashStatusArgs {
|
pub struct BashStatusArgs {
|
||||||
/// Task ID returned by `bash_run`.
|
/// Task ID returned by `bash_run`.
|
||||||
pub id: String,
|
pub id: String,
|
||||||
|
/// Optional inline wait: if set, `bash_status` polls for up to
|
||||||
|
/// `wait_seconds` (capped at 30) before returning. When the task
|
||||||
|
/// finishes within the window the full status is returned immediately.
|
||||||
|
/// Useful to avoid a separate round-trip when a task is expected to
|
||||||
|
/// finish soon.
|
||||||
|
pub wait_seconds: Option<u64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Format the result of `bash_status` from a task ID.
|
/// Format the result of `bash_status` from a task ID.
|
||||||
|
|
@ -1008,15 +1014,38 @@ impl AgentServer {
|
||||||
description = "Check the status of a background bash task by its ID (from `bash_run`). \
|
description = "Check the status of a background bash task by its ID (from `bash_run`). \
|
||||||
Returns the current status (pending/running/done/timed_out/interrupted), exit code \
|
Returns the current status (pending/running/done/timed_out/interrupted), exit code \
|
||||||
if finished, and a tail of stdout/stderr. Full output lives in \
|
if finished, and a tail of stdout/stderr. Full output lives in \
|
||||||
`harness/bash-tasks/<id>.out` / `.err`."
|
`harness/bash-tasks/<id>.out` / `.err`. \
|
||||||
|
Pass `wait_seconds` (capped at 30) to wait inline for the task to finish: when the \
|
||||||
|
task finishes within the window the full status is returned immediately. Useful to \
|
||||||
|
avoid a separate round-trip when the task is expected to finish soon."
|
||||||
)]
|
)]
|
||||||
async fn bash_status(&self, Parameters(args): Parameters<BashStatusArgs>) -> String {
|
async fn bash_status(&self, Parameters(args): Parameters<BashStatusArgs>) -> String {
|
||||||
let log = format!("{args:?}");
|
let log = format!("{args:?}");
|
||||||
run_tool_envelope(
|
run_tool_envelope("bash_status", log, async move {
|
||||||
"bash_status",
|
// Inline wait: if the task isn't terminal yet, poll until done or deadline.
|
||||||
log,
|
if let Some(wait) = args.wait_seconds {
|
||||||
async move { format_bash_status(&args.id) },
|
const MAX_WAIT_SECS: u64 = 30;
|
||||||
)
|
const POLL_MS: u64 = 100;
|
||||||
|
let deadline = tokio::time::Instant::now()
|
||||||
|
+ std::time::Duration::from_secs(wait.min(MAX_WAIT_SECS));
|
||||||
|
loop {
|
||||||
|
if let Some(task) = crate::bash_runner::read_task(&args.id) {
|
||||||
|
use crate::bash_runner::TaskStatus;
|
||||||
|
if matches!(
|
||||||
|
task.status,
|
||||||
|
TaskStatus::Done | TaskStatus::TimedOut | TaskStatus::Interrupted
|
||||||
|
) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if tokio::time::Instant::now() >= deadline {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
tokio::time::sleep(std::time::Duration::from_millis(POLL_MS)).await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
format_bash_status(&args.id)
|
||||||
|
})
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue