hive-claude 0.1.4: the idle watchdog stops claude with SIGINT
hive-claude 0.1.4 (hive-claude #28) sends the idle watchdog's signal as SIGINT to claude's process group instead of SIGKILL. It then waits for claude to exit, with no SIGKILL fallback. claude stops the commands its Bash tool started when it shuts down on SIGINT, and a SIGKILL left them running. This is the last SIGKILL of a claude process from #4999. hive-agent's `idle_timeout` -> `Error::IdleTimeout` -> `TurnError::ApiStall` path is unchanged. The difference is that the error now arrives only once claude has exited. A claude that ignores the SIGINT keeps the turn open until it is killed by hand or the unit stops. The Cargo.lock change is only hive-claude's version and checksum. A plain `cargo update -p hive-claude --precise 0.1.4` also moved seven crates' Windows-only `windows-sys` edges from 0.61.2 to 0.52.0, unrelated to this bump. The minimal lock passes `--locked`. The turn-loop and web-UI docs, and hive-agent's watchdog docs and stall note, now say SIGINT instead of "killed". That includes the ACP spots that the previous commit's `Drop` change made stale.
This commit is contained in:
parent
43e69d345e
commit
f3860f3497
5 changed files with 17 additions and 13 deletions
|
|
@ -142,8 +142,8 @@ else a `TurnError`) drives the post-claude branch:
|
|||
| `Err(RateLimited)` | sleep `HIVE_RATE_LIMIT_SLEEP_SECS` (default 300), requeue inflight, status back to `online` |
|
||||
| `Err(AuthFailed)` | emit `needs_login_idle` sentinel, requeue inflight, park in `wait_for_login` |
|
||||
| `Err(SessionNotFound)` | resume + create self-heal both missed ("shouldn't happen"); requeue inflight so the next turn creates fresh — no status park, message not dropped |
|
||||
| `Err(ApiStall)` | idle watchdog killed claude after `HIVE_TURN_IDLE_SECS` (default 600) of output silence; sleep `HIVE_STALL_SLEEP_SECS` (default 60), requeue inflight, status back to `online` |
|
||||
| `Err(AgentStall(note))` | the same, for an ACP agent: after `HIVE_TURN_IDLE_SECS` with no `session/update` the harness sent the agent `session/cancel`, and killed it if it ignored that; `note` says which |
|
||||
| `Err(ApiStall)` | idle watchdog sent claude SIGINT after `HIVE_TURN_IDLE_SECS` (default 600) of output silence and claude exited; sleep `HIVE_STALL_SLEEP_SECS` (default 60), requeue inflight, status back to `online` |
|
||||
| `Err(AgentStall(note))` | the same, for an ACP agent: after `HIVE_TURN_IDLE_SECS` with no `session/update` the harness sent the agent `session/cancel`, and SIGINT if it ignored that; `note` says which |
|
||||
| `Err(Failed(err))` | route `[system] \`<qualified-label>\` claude turn failed:\n<err>` to `operator` via `send_to_operator` |
|
||||
|
||||
`ApiStall` catches an Anthropic API stall — a multi-retry connection storm where
|
||||
|
|
@ -152,7 +152,11 @@ the stream goes silent for minutes. On `claude` the idle watchdog lives in
|
|||
resets on every stdout line, so a large but still-streaming turn is never cut —
|
||||
only complete output silence for the window trips it. The harness sets the
|
||||
window from `HIVE_TURN_IDLE_SECS` (`0` disables) and maps the driver's
|
||||
`Error::IdleTimeout` onto `TurnError::ApiStall`.
|
||||
`Error::IdleTimeout` onto `TurnError::ApiStall`. The watchdog sends claude's
|
||||
process group SIGINT, so claude stops the commands it started, and then
|
||||
waits for claude to exit. Nothing escalates to SIGKILL: a claude that
|
||||
ignores the SIGINT keeps the turn open until someone kills it or the unit
|
||||
stops.
|
||||
|
||||
`hive-runtime` applies the same window to an ACP agent's turns. That's
|
||||
also how a provider HTTP 429 ends an ACP turn when the agent retries it without
|
||||
|
|
|
|||
|
|
@ -229,7 +229,7 @@ Slash commands today:
|
|||
- `/clear` — wipe the local terminal view (server history kept).
|
||||
- `/cancel` — `POST /api/cancel` → SIGINT to the turn's claude and every
|
||||
command it started (its process group), emits a Note. On an ACP agent
|
||||
it sends the agent `session/cancel` instead, and kills it if the turn
|
||||
it sends the agent `session/cancel` instead, and SIGINT if the turn
|
||||
hasn't ended 10s later. Also surfaces as a `■ cancel turn` button in
|
||||
the state row while state=thinking.
|
||||
- `/compact` — `POST /api/compact` → sets the deferred
|
||||
|
|
|
|||
Loading…
Reference in a new issue