From 7d6e0716aaf07f851540d3d7fda3e78ddb36c805 Mon Sep 17 00:00:00 2001 From: Eve Date: Fri, 24 Apr 2026 10:55:05 +0800 Subject: [PATCH] feat: recompute basic watchdog statuses --- scripts/subagent_delivery_watchdog.mjs | 50 ++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/scripts/subagent_delivery_watchdog.mjs b/scripts/subagent_delivery_watchdog.mjs index b6075f7..de07d5f 100755 --- a/scripts/subagent_delivery_watchdog.mjs +++ b/scripts/subagent_delivery_watchdog.mjs @@ -182,6 +182,47 @@ function writeCompletionReceiptState(payload) { }; } +function parseTime(value) { + if (typeof value !== 'string' || value.length === 0) { + return null; + } + + const timestamp = Date.parse(value); + return Number.isNaN(timestamp) ? null : timestamp; +} + +function recomputeStatus(payload) { + if (!payload || typeof payload !== 'object') { + return 'not_implemented'; + } + + const completionReceivedAt = payload.completionReceivedAt ?? payload.completionReceiptAt ?? null; + if (parseTime(completionReceivedAt) !== null) { + return 'completed'; + } + + const hasDispatch = [payload.runId, payload.childSessionKey, payload.dispatchAt, payload.expectedBy].every( + (value) => typeof value === 'string' && value.length > 0, + ); + + if (!hasDispatch) { + return 'not_implemented'; + } + + const expectedBy = parseTime(payload.expectedBy); + const currentTime = parseTime(payload.currentTime); + + if (expectedBy === null || currentTime === null) { + return 'not_implemented'; + } + + if (currentTime > expectedBy) { + return 'suspect_delivery_failure'; + } + + return 'active'; +} + function main() { const args = parseArgs(process.argv.slice(2)); @@ -194,6 +235,7 @@ function main() { const inputPayload = input.exists ? tryParseJson(input.content) : null; const dispatchWrite = writeDispatchReceiptState(inputPayload); const completionWrite = writeCompletionReceiptState(inputPayload); + const status = recomputeStatus(inputPayload); if ('content' in input) { delete input.content; @@ -210,7 +252,7 @@ function main() { const response = { ok: true, tool: 'subagent_delivery_watchdog', - version: 'skeleton-v3', + version: 'skeleton-v4', mode: 'receipt-write', args: { compact: args.compact, @@ -218,8 +260,10 @@ function main() { }, input, result: { - status: 'not_implemented', - message: 'Dispatch and completion receipt writes are implemented; status recompute remains pending.', + status, + message: status === 'not_implemented' + ? 'Dispatch and completion receipt writes are implemented; status recompute only handles basic active/suspect/completed states.' + : 'Basic watchdog status recompute completed.', records, dispatchReceiptWrite: dispatchWrite, completionReceiptWrite: completionWrite,