The poller was a `tokio::spawn` inside the `hive-agent` serve loop. It never needed anything from that loop except a socket path, so being in-process bought nothing and cost two things: a harness restart took forge notifications down with it, and the whole forge/HTTP dependency tree was linked into the serve-loop binary. It is now `hive-forge-notify`, a per-agent daemon with its own systemd unit, a sibling of `hive-bash-daemon` and `hive-matrix-daemon`. Same contract as those two: it reaches the harness only by upserting todos on the in-agent socket, and nowhere else. The module moves verbatim (`notify.rs`) — the formatters, the activation gates, the dedupe map and all 33 tests are unchanged. Only the socket call sites are rewritten, onto a small local `todo_client` rather than the harness's. That mirrors what both sibling daemons already do, and the etiquette differs on purpose: the harness's client carries a 60s backoff schedule sized to ride out a hive-c0re restart, which its callers need because they have no retry of their own. This poller's two call sites both sit inside the 30s poll loop and both treat a failure as "leave the thread unread, try next tick", so the poll interval already is the retry; a second backoff would only stack sleeps and delay the rest of the batch. The unit is `Restart=on-failure`, not `always`. An agent with no forge account is a supported configuration and the poller reports it by logging why and exiting 0 — under `always` that clean exit would be a restart loop on every forge-less agent. `forgejo-api`, `url` and `time` drop out of `hive-agent`'s dependencies with the module. Also corrects docs that outlived the code they described: the persisted `forge_cursor` field is long gone (forge's own read-state is the durable record of what has been delivered), but `docs/persistence.md` and the `harness_state` module docs still documented it as live.
22 lines
950 B
Nix
22 lines
950 B
Nix
# The hyperhive-built packages the harness modules consume, threaded
|
|
# in explicitly as an option — no overlay. The flake's
|
|
# `nixosModules.{agent-base,ruth}` set this to the flake's own package
|
|
# outputs via `lib.mkDefault`, so a per-agent override of an
|
|
# individual key still wins.
|
|
{ lib, ... }:
|
|
{
|
|
options.hyperhive.packages = lib.mkOption {
|
|
type = lib.types.attrsOf lib.types.package;
|
|
internal = true;
|
|
description = ''
|
|
hyperhive package outputs consumed by the harness modules: the
|
|
per-binary daemon/CLI packages (`hive-agent`, `hive-agent-mcp`,
|
|
`hive-bash-daemon`,
|
|
`hive-forge`, `hive-forge-notify`, `hive-matrix-daemon`,
|
|
`hive-metric`, `hive-screen-mcp`) plus the `assets`, `frontend` and
|
|
`reference-docs` trees. Wired by the flake's agent-base/ruth
|
|
nixosModules to `hyperhive.packages.<system>.*`; override an
|
|
individual key per-agent to swap in a patched binary.
|
|
'';
|
|
};
|
|
}
|