feat: recompute basic watchdog statuses
This commit is contained in:
@@ -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() {
|
function main() {
|
||||||
const args = parseArgs(process.argv.slice(2));
|
const args = parseArgs(process.argv.slice(2));
|
||||||
|
|
||||||
@@ -194,6 +235,7 @@ function main() {
|
|||||||
const inputPayload = input.exists ? tryParseJson(input.content) : null;
|
const inputPayload = input.exists ? tryParseJson(input.content) : null;
|
||||||
const dispatchWrite = writeDispatchReceiptState(inputPayload);
|
const dispatchWrite = writeDispatchReceiptState(inputPayload);
|
||||||
const completionWrite = writeCompletionReceiptState(inputPayload);
|
const completionWrite = writeCompletionReceiptState(inputPayload);
|
||||||
|
const status = recomputeStatus(inputPayload);
|
||||||
|
|
||||||
if ('content' in input) {
|
if ('content' in input) {
|
||||||
delete input.content;
|
delete input.content;
|
||||||
@@ -210,7 +252,7 @@ function main() {
|
|||||||
const response = {
|
const response = {
|
||||||
ok: true,
|
ok: true,
|
||||||
tool: 'subagent_delivery_watchdog',
|
tool: 'subagent_delivery_watchdog',
|
||||||
version: 'skeleton-v3',
|
version: 'skeleton-v4',
|
||||||
mode: 'receipt-write',
|
mode: 'receipt-write',
|
||||||
args: {
|
args: {
|
||||||
compact: args.compact,
|
compact: args.compact,
|
||||||
@@ -218,8 +260,10 @@ function main() {
|
|||||||
},
|
},
|
||||||
input,
|
input,
|
||||||
result: {
|
result: {
|
||||||
status: 'not_implemented',
|
status,
|
||||||
message: 'Dispatch and completion receipt writes are implemented; status recompute remains pending.',
|
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,
|
records,
|
||||||
dispatchReceiptWrite: dispatchWrite,
|
dispatchReceiptWrite: dispatchWrite,
|
||||||
completionReceiptWrite: completionWrite,
|
completionReceiptWrite: completionWrite,
|
||||||
|
|||||||
Reference in New Issue
Block a user