1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//! `AgentRunResult<S>` — terminal envelope returned by
//! [`crate::Agent::execute`] / [`crate::Agent::execute_with`].
//!
//! Pairs the agent's final state with the run's stable correlation
//! id and a frozen [`UsageSnapshot`] of the
//! [`entelix_core::RunBudget`] counters at terminal — operators see
//! how much of the cap each axis consumed without holding the live
//! `Arc` (and without observing further mutations from sibling
//! sub-agent dispatches that share the same budget through the
//! `ExecutionContext`).
//!
//! ## Why an envelope, not just an event
//!
//! [`crate::AgentEvent::Complete`] also carries the snapshot, but
//! caller-facing `execute` returns one value rather than a stream.
//! Forcing the caller to thread their own `CaptureSink` to read
//! per-run usage would re-introduce stateful telemetry coupling
//! that the agent runtime exists to avoid (and does not work for
//! the `Auto`-mode `execute` path that does not own a sink loop).
//!
//! ## Frozen at terminal — invariant
//!
//! `usage` is captured *after* the inner runnable returns
//! successfully and *before* observers fire — observers can mutate
//! side-channel state (vector store writes, summary persistence)
//! whose dispatches may themselves consume budget through layered
//! `ChatModel` calls; freezing the snapshot ahead of that point
//! reflects exactly the agent run's own cost. documents
//! the budget; documents this envelope.
use UsageSnapshot;
/// Terminal artifact of one agent run.
///
/// Returned by [`crate::Agent::execute`] and
/// [`crate::Agent::execute_with`]. Constructed only by the agent
/// runtime — public field access lets callers destructure
/// ergonomically (`let AgentRunResult { state, usage, .. } = ...`)
/// without a fresh constructor surface.