turn_stats: per-turn analytics sink
new sqlite table at /state/hyperhive-turn-stats.sqlite on each agent's state dir. one row per claude turn captures identity (model, wake_from, result_kind), timing (started/ended_at, duration_ms), cost (input/output/cache_read/cache_creation token counts), behaviour (tool_call_count + per-tool breakdown JSON), and post-turn snapshot metrics (open_threads_count, open_reminders_count). wire additions: - AgentRequest/ManagerRequest::CountPendingReminders + Broker::count_pending_reminders_for(agent) - Bus::observe_stream + take_tool_calls — pumps the existing stdout stream-json, picks out tool_use blocks, accumulates per turn. bin loops fold the breakdown into each row. - TurnStats::open_default + TurnStatRow + record() — best-effort inserts; failures log + don't block the harness. both ag3nt and m1nd bins capture started_at + duration via Instant::elapsed, fetch open-thread + reminder counts from hive-c0re via the existing socket (post-turn, best-effort), and record one row at turn_end. record_kind splits ok / failed / prompt_too_long; failures carry the error message in note. todo entries for host-side vacuum sweep + reading the table back into agent/dashboard badges.
This commit is contained in:
parent
dc1ce1f236
commit
8f5752980f
12 changed files with 476 additions and 3 deletions
|
|
@ -309,6 +309,10 @@ pub enum AgentRequest {
|
|||
/// manager); questions surface where the agent is `asker` or
|
||||
/// `target`. Cheap O(n) sweep server-side — no caching.
|
||||
GetOpenThreads,
|
||||
/// Count of this agent's pending (un-delivered) reminders. Used
|
||||
/// by the harness's per-turn stats sink to snapshot "what was
|
||||
/// queued at turn-end time" without paying for a full list.
|
||||
CountPendingReminders,
|
||||
}
|
||||
|
||||
/// Responses on a per-agent socket.
|
||||
|
|
@ -333,6 +337,8 @@ pub enum AgentResponse {
|
|||
/// `GetOpenThreads` result: list of loose ends pending against
|
||||
/// this agent. Ordered newest-first within each kind.
|
||||
OpenThreads { threads: Vec<OpenThread> },
|
||||
/// `CountPendingReminders` result.
|
||||
PendingRemindersCount { count: u64 },
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
|
@ -596,6 +602,9 @@ pub enum ManagerRequest {
|
|||
/// sub-agent surface is `AgentRequest::GetOpenThreads` which
|
||||
/// only returns rows where the agent itself is asker / target.
|
||||
GetOpenThreads,
|
||||
/// Count of the manager's own pending reminders. Mirror of
|
||||
/// `AgentRequest::CountPendingReminders` on the manager surface.
|
||||
CountPendingReminders,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
|
|
@ -634,4 +643,8 @@ pub enum ManagerResponse {
|
|||
OpenThreads {
|
||||
threads: Vec<OpenThread>,
|
||||
},
|
||||
/// `CountPendingReminders` result.
|
||||
PendingRemindersCount {
|
||||
count: u64,
|
||||
},
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue