Gate inbox delivery on worker-side steer ACK
Replace the fire-and-forget steer with a correlated ACK round-trip so main only marks an inbox row delivered once the worker confirms the message landed on the live Agent. Steer against a run that is still in the `preparing` window or has already started `closing` now falls back to the wake + inbox projection path instead of being silently dropped. Worker publishes `run-agent-state` transitions at Agent construction and teardown; main tracks these on `ActiveRunContext.state` and refuses to steer runs that are not `agent_active`. A rejected or timed-out ACK triggers `wakeAgentIfPossible` so the next `prepareRun` replays the row.
This commit is contained in:
1 parent
ad9205fcc9
commit
e917c614c9
12 files changed
+264
-57
No files matched your search
@@ -21,6 +21,7 @@ export function createWorkerService({
|
||||
budgetService,
|
||||
sessionService,
|
||||
getRuntimeBridge,
|
||||
getRuntimeMessageInjector,
|
||||
}: WorkerServiceDependencies) {
|
||||
const MAX_RETRY_ATTEMPTS = 2;
|
||||
const RETRY_COOLDOWN_MS = 30_000; // 30 seconds
|
||||
@@ -111,7 +112,21 @@ export function createWorkerService({
|
||||
await handleWorkerMessage(
|
||||
message,
|
||||
worker,
|
||||
{ db, logger, isQuitting, emitEvent, wakeAgentIfPossible, processRunCompletion, onRunStarted, onRunCompleted, notify, budgetService, sessionService, getRuntimeBridge },
|
||||
{
|
||||
db,
|
||||
logger,
|
||||
isQuitting,
|
||||
emitEvent,
|
||||
wakeAgentIfPossible,
|
||||
processRunCompletion,
|
||||
onRunStarted,
|
||||
onRunCompleted,
|
||||
notify,
|
||||
budgetService,
|
||||
sessionService,
|
||||
getRuntimeBridge,
|
||||
getRuntimeMessageInjector,
|
||||
},
|
||||
workerMessageSchema,
|
||||
destroyed,
|
||||
MAX_RETRY_ATTEMPTS,
|
||||
|
||||
Reference in new issue
Block a user