pub struct RunResult {
pub outcome: RunOutcome,
pub run_id: i64,
pub remembered: Vec<Rule>,
}Expand description
The result of a run, including the persisted run id for audit.
Three things, and the run_id is the one that outlives the process. Every
step, refusal, spawn and budget draw is in the store under it, so a run is
still readable long after the program that drove it exited — and it is the
handle every resume* entry point takes:
use io_harness::{run_with, ApproveAll, OpenRouter, Policy, RunOutcome, Store, TaskContract};
let store = Store::open("runs.db")?;
let result = run_with(contract, &OpenRouter::from_env()?, &store, policy, &ApproveAll).await?;
// What it cost and how long it took, read back from the same row an auditor
// would read — so the caller and the audit cannot disagree. `None` while a
// run is paused awaiting a human: there is no ending to summarise yet.
if let Some(summary) = result.summary(&store)? {
println!("{} tokens", summary.tokens);
}
// Rules an approver asked to remember. The crate applied them for the rest of
// this run and hands them back here; persisting them across runs is the
// caller's decision, because config files are the application's to own.
for rule in &result.remembered {
println!("remember: {:?} {} {:?}", rule.act, rule.pattern, rule.effect);
}
// Keep the id if the run is not finished — it is all a later process needs.
if !matches!(result.outcome, RunOutcome::Success { .. }) {
println!("resume run {}", result.run_id);
}Fields§
§outcome: RunOutcomeWhy the run stopped.
run_id: i64The run’s id in the Store, for reading its trace back.
remembered: Vec<Rule>Rules an approver asked to remember during this run. The crate applies them for the rest of the run and hands them back here; persisting them across runs is the caller’s decision, since config files are app-owned.
Implementations§
Source§impl RunResult
impl RunResult
Sourcepub fn summary(&self, store: &Store) -> Result<Option<RunSummary>>
pub fn summary(&self, store: &Store) -> Result<Option<RunSummary>>
What this run cost and whether it worked, read back from the store.
Added in 0.12.0. Before it, a caller holding a RunResult had an outcome
discriminant and a run_id: spend needed a follow-up query, and latency
was not recorded anywhere at all.
None when the run has not finished — a run paused awaiting a human has
no ending to summarise yet.
A method rather than a field, deliberately. A field would have to be
filled at every one of the entry points’ return sites, including the ones
that return Err and never build a RunResult, so the two could drift.
Reading it from the store means the caller and an auditor are looking at
the same row by construction. It also keeps this struct’s existing
exhaustive-pattern compatibility intact: no new field, no break.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for RunResult
impl RefUnwindSafe for RunResult
impl Send for RunResult
impl Sync for RunResult
impl Unpin for RunResult
impl UnsafeUnpin for RunResult
impl UnwindSafe for RunResult
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,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.