pub struct RunListEntry {
pub run_id: String,
pub status: AgentStatus,
pub wait_reason: Option<WaitReason>,
pub stage: String,
pub stage_index: Option<usize>,
pub num_stages: Option<usize>,
pub iteration: usize,
pub tool_calls: usize,
pub last_progress_at: Option<i64>,
pub unattended: bool,
pub empty_output: bool,
pub read_paths: Option<ReadPathGrantCounts>,
}Expand description
One row of a run listing (ControlRequest::List): a live run, its status,
and enough context to judge whether that status is a problem.
lev ps used to be a run id and a status word, which is why issue #184
happened: waiting on its own says nothing about whether a person is needed,
and there was no way to tell a run that had moved a second ago from one that
had been stopped for an hour. Everything here is read straight off the live
world, so it is the daemon’s own view, not a re-read of meta.json.
Fields§
§run_id: StringThe run id (lev ps’s first column, and what lev kill takes).
status: AgentStatusThe agent’s live status.
wait_reason: Option<WaitReason>Why the status is AgentStatus::Waiting; None for every other
status, and for a Waiting the host cannot attribute.
stage: StringThe stage the agent is in.
stage_index: Option<usize>Zero-based index of that stage, when the agent tracks one.
num_stages: Option<usize>How many stages the blueprint has.
iteration: usizeIterations completed in the current stage.
tool_calls: usizeCumulative tool calls across the run.
last_progress_at: Option<i64>Unix seconds when this run last actually moved (see
PersistWatermark). Distinct from
meta.json’s updated_at, which also advances on a heartbeat and so
cannot be used to tell a working run from a wedged one.
unattended: boolWhether this run is unattended (--yolo). An unattended run should never
be sitting on a prompt; if it is, something dropped the flag.
empty_output: boolWhether this run finished having modified nothing, when its blueprint gave it a way to. Only ever true for a run that has stopped.
The flag itself is as old as issue #107, but nothing ever showed it: it
went into meta.json and was read back only on restart, so a run that
finished with no work to show for it looked exactly like one that
succeeded. Defaulted for the same reason as unattended - an older
daemon simply omits it.
read_paths: Option<ReadPathGrantCounts>How much of this run’s [read_paths] its config granted at spawn.
None for a blueprint that declares none, which is nearly every agent.
Worth a column of its own because an ungranted declaration is inert: the run is up, looks healthy, and will be refused the reads its author designed it around.
Trait Implementations§
Source§impl Clone for RunListEntry
impl Clone for RunListEntry
Source§fn clone(&self) -> RunListEntry
fn clone(&self) -> RunListEntry
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for RunListEntry
impl Debug for RunListEntry
Source§impl<'de> Deserialize<'de> for RunListEntry
impl<'de> Deserialize<'de> for RunListEntry
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl PartialEq for RunListEntry
impl PartialEq for RunListEntry
Source§impl Serialize for RunListEntry
impl Serialize for RunListEntry
impl StructuralPartialEq for RunListEntry
Auto Trait Implementations§
impl Freeze for RunListEntry
impl RefUnwindSafe for RunListEntry
impl Send for RunListEntry
impl Sync for RunListEntry
impl Unpin for RunListEntry
impl UnsafeUnpin for RunListEntry
impl UnwindSafe for RunListEntry
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> ConditionalSend for Twhere
T: Send,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.