fabro/lib/components
Bryan Helmkamp cb26c5603d
Answer steer and interrupt with the worker's acknowledgement
The worker control bus was publish-only: the steer and interrupt
endpoints answered 202 once the control was forwarded, and a refusal
showed up only later as a `run.notice` on the run's stream.

A steer or an interrupt now carries a request id. The worker answers it
over the control stream it arrived on with `{request_id, outcome}`,
where the outcome is `delivered` (with the stage's label) or `refused`
(with the code and the reason). The server keeps the outstanding
requests in a registry and waits up to 5 s for the answer: the endpoint
answers 202 `{"outcome":"delivered","stage":…}`, 409 with the refusal's
code (`no_live_turn`, `no_such_stage`, `steer_refused`,
`interrupt_refused`) and message, or 202 `{"outcome":"pending"}` when
the worker gave no answer in time. The `run.notice` record on refusal
stays, under the same code, so a steer to a stage that is not running is
now `no_such_stage` there too. Pause and unpause are unchanged.

The in-process test path answers a steer or an interrupt from the run's
own controls at once. `FABRO_TEST_CONTROL_ACKS_MUTED=1` on the server
mutes the worker's answers, so a test can see the pending fallback.
`fabro steer` prints the worker's answer, and a refusal is its error.
The OpenAPI spec documents the 202 body and the 409 codes; the Rust and
TypeScript clients are regenerated.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 23:54:11 -04:00
..
fabro-automation Open sandbox provider identity to plugin kinds 2026-09-09 15:17:32 -06:00
fabro-checkpoint Merge remote-tracking branch 'origin/main' into remove/run-metadata-branches 2026-09-12 16:28:01 -06:00
fabro-dump Show the sandbox's ready duration and retention outcome on the run 2026-09-18 19:34:56 -04:00
fabro-environment Open sandbox provider identity to plugin kinds 2026-09-09 15:17:32 -06:00
fabro-github Resolve one Git identity per run and inject it everywhere 2026-09-12 11:35:46 -06:00
fabro-graphviz Delete fabro-validate and fabro-acp; validate on Petri's check 2026-09-18 11:32:04 -04:00
fabro-install Remove the [server.slatedb] settings and the SlateDB prefix probe 2026-09-18 16:00:24 -04:00
fabro-interview Answer steer and interrupt with the worker's acknowledgement 2026-09-18 23:54:11 -04:00
fabro-llm Run agent stages, Ask Fabro, and fabro exec on pebble's CodingAgent 2026-09-11 14:19:15 -06:00
fabro-manifest Delete fabro-validate and fabro-acp; validate on Petri's check 2026-09-18 11:32:04 -04:00
fabro-mcp-store refactor: organize crates into three layers 2026-07-23 17:59:34 -04:00
fabro-petri Answer steer and interrupt with the worker's acknowledgement 2026-09-18 23:54:11 -04:00
fabro-sandbox Show the sandbox's ready duration and retention outcome on the run 2026-09-18 19:34:56 -04:00
fabro-slack Delete fabro-core and the engine half of fabro-workflow 2026-09-18 10:44:41 -04:00
fabro-store Show the sandbox's ready duration and retention outcome on the run 2026-09-18 19:34:56 -04:00
fabro-tool Answer steer and interrupt with the worker's acknowledgement 2026-09-18 23:54:11 -04:00
fabro-tracker refactor: organize crates into three layers 2026-07-23 17:59:34 -04:00
fabro-variable refactor: organize crates into three layers 2026-07-23 17:59:34 -04:00
fabro-workflow Restore the timeline, fork, rewind and retry operations over checkpoints 2026-09-18 23:17:25 -04:00
fabro-workflow-version Delete the legacy run event log, its reducer and its types 2026-09-18 14:09:17 -04:00