Nothing submits an approval since scheduled prompts left hive-c0re, so the
queue only acted on rows written before that.
- hive-c0re: the approvals store and its migrations, approve/deny/
resolve actions, the ResolveApproval tail node (and meta_update's
approval_id), POST /api/approve and /api/deny, the approval views on
/api/state, the approval_resolved dashboard event, the orphan GC,
destroy/purge failing pending rows, and the approval rows in
get_loose_ends. DestroyBookkeeping loses the purge flag, which only
worded the approval-failure note.
- The CancelLooseEnd request goes: its only hive-c0re arm was the
approval one. cancel_loose_end handles reminder and todo in the harness.
- Wire types: hive_sh4re::approvals (ReminderStats moves to inbox),
LooseEnd::Approval, CancelLooseEndKind, HelperEvent::ApprovalResolved,
ToolGroup::Approvals, HostRequest::{Pending,Approve,Deny} and
HostResponse.approvals. HOST_SOCK_VERSION goes to 2 for the removed
field.
- hivectl loses the approvals verbs; docs/tools/hivectl-cli.md is
regenerated.
- The system prompt drops approval_resolved.
- The approvals table stays in broker.sqlite, unread, the same way the
operator_questions table was left when its store was removed.
- An `approvals` entry still in tool-groups.json is skipped with a warning
by ToolGroup::parse_list, like any unknown group.
- docs/agent-lifecycle/approvals.md is renamed to config-changes.md so the
code's doc pointers resolve; its content follows in the docs commit.
34 lines
1.3 KiB
Rust
34 lines
1.3 KiB
Rust
//! Loose-ends aggregator. Assembles a `Vec<LooseEnd>` for a single agent
|
|
//! (`for_agent`) — always the caller's own. `Request::GetLooseEnds` from
|
|
//! either the agent or manager socket lands here. Reminders and todos are
|
|
//! agent-local (in-container `hive-agent` stores) and never sourced from
|
|
//! here.
|
|
//!
|
|
//! Call frequency is low (an agent doing self-introspection between
|
|
//! turns), so the sweep happens fresh every time — no caching, no
|
|
//! mutation events.
|
|
|
|
use anyhow::Result;
|
|
use hive_sh4re::inbox::LooseEnd;
|
|
|
|
use crate::coordinator::Coordinator;
|
|
|
|
/// Open threads pending against `agent`: undelivered inbox messages this
|
|
/// agent still owes itself a `recv` for, only when the count is non-zero.
|
|
///
|
|
/// # Errors
|
|
///
|
|
/// Propagates errors from `count_pending`.
|
|
pub fn for_agent(coord: &Coordinator, agent: &str) -> Result<Vec<LooseEnd>> {
|
|
let mut out = Vec::new();
|
|
// Only emitted when non-zero so a clean inbox doesn't add noise. The
|
|
// wake-message that drove the current turn is already delivered, so
|
|
// this counts only what's genuinely still queued.
|
|
let pending_messages = coord.broker.count_pending(agent)?;
|
|
if pending_messages > 0 {
|
|
out.push(LooseEnd::PendingMessages {
|
|
count: pending_messages,
|
|
});
|
|
}
|
|
Ok(out)
|
|
}
|