hive-agent: publish the agent terminal to the swarm queue
The harness has had its queue coordinates since the credential reached the container, but nothing used them. This offers each terminal row upward on `$SWARM.term.<hive>.<agent>`, so a swarm-level terminal can render an agent without reaching into the hive that hosts it. It publishes the same `TermMsg` the web UI is handed rather than a second model of the same events, so a new tool or a reclassified event changes both surfaces together. It subscribes to the event bus rather than to the SSE handler: the handler classifies per connected browser, so hanging this off it would mean an agent nobody is watching publishes nothing. That also means its own long-lived `ClassifyCtx`, since a publisher restarting its correlation state would lose the `tool_use` → name mapping a `tool_result` needs to render. The hive in the subject is derived from the queue client id, not from the harness's hive display name. Those come from different sources with no rule tying them together, and the responder builds its grant from the client id — so deriving it from the display name yields a publish the broker refuses, reaching an operator as a terminal that is merely empty. The prefix and suffix that bracket the hive are the responder's flags, which the agent is not told; it restates their defaults, and the symptom of a deployment retuning one without changing this is every publish refused rather than a wrong subject accepted. Oversize rows degrade in the publisher. Exceeding `max_payload` is not a truncation: the server refuses the message and closes the connection, so an oversize publish costs the row, the connection, and the rows racing behind it through the reconnect. The body is the only unbounded field — summaries are already trimmed at classification — so it is the field spent, and the row keeps its icon, level, summary and coalesce key. A row that does not fit even then is logged and dropped rather than sent. The limit is read off the connection, so `8388608` stays spelled once in the queue's own module; size is measured by serializing, because JSON escaping separates character count from wire length by an unbounded factor on exactly the rows already near the limit. Best-effort throughout: no queue, an unparseable client id and a failed connect each disable the publisher with one log line, and a failed publish loses its row and nothing else. The turn loop and the web UI never block on the queue. Refs #3805
This commit is contained in:
parent
da7fbd20b8
commit
2cdd7f2ff1
5 changed files with 375 additions and 2 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
|
@ -1646,6 +1646,7 @@ name = "hive-agent"
|
|||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-nats",
|
||||
"axum",
|
||||
"chrono",
|
||||
"clap",
|
||||
|
|
|
|||
Loading…
Reference in a new issue