refactor(worker): split god-handler into per-message type files

Extract handleWorkerMessage (380 lines, 12 positional args) into dispatcher
+ focused handler modules. Dispatcher now routes by message.type to
run-log / run-status / run-finished handlers, each receiving (event, deps,
context) triple. run-finished is further decomposed into 5 steps:
finalizeRun, accumulateAndRotateSession, emitAndNotifyCompletion,
runPostCompletionAutomation, triggerSelfWake.

No behavior change: all branches, notifications, lease renewals, circuit
breaker, and escalation semantics preserved. Schema validation stays at
dispatcher top level.
This commit is contained in:
ZacharyZhang-NY committed 2026-04-16 22:04:37 -04:00
1 parent 69724f0188
commit cc02b45864
7 files changed
+515 -336

No files matched your search

@@ -0,0 +1,45 @@
import { filterRunLogChunk } from "../run-log-filter";
import { persistRunEvent } from "../run-event-recorder";
import type { HandlerContext, HandlerDeps, WorkerMessageEvent } from "./handler-context";
const LEASE_RENEWAL_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes
export async function handleRunLog(
event: Extract<WorkerMessageEvent, { type: "run-log" }>,
deps: HandlerDeps,
context: HandlerContext,
): Promise<void> {
const { db, logger, emitEvent } = deps;
const { leaseRenewalMap } = context;
const filtered = filterRunLogChunk(event.stream, event.chunk);
if (filtered === null) return;
await db.appendRunLog(event.runId, event.stream, filtered);
const runState = db.getRunAuthState(event.runId);
if (runState) {
persistRunEvent(db, logger, {
companyId: runState.companyId,
runId: event.runId,
agentId: runState.agentId,
eventType: "run_log",
stream: event.stream,
message: filtered,
});
}
emitEvent({ ...event, chunk: filtered });
// Throttled lease renewal: keep execution lock alive for long-running tasks.
// Without this, tasks exceeding the 15-minute stale lock timeout get reclaimed.
const now = Date.now();
const lastRenewal = leaseRenewalMap.get(event.runId) ?? 0;
if (now - lastRenewal >= LEASE_RENEWAL_INTERVAL_MS) {
try {
const run = db.getRun(event.runId);
db.renewTaskLease(run.taskId, run.id);
leaseRenewalMap.set(event.runId, now);
} catch {
// Run not found — skip lease renewal
}
}
}