fix: 收敛 commander supervisor 噪声
This commit is contained in:
+9
-4
@@ -744,9 +744,9 @@ function summarizeSupervisorRecord(record: JsonRecord | null): JsonRecord | null
|
|||||||
const lastActivity = jsonRecordValue(record.lastActivity);
|
const lastActivity = jsonRecordValue(record.lastActivity);
|
||||||
const timeoutBudget = jsonRecordValue(record.timeoutBudget);
|
const timeoutBudget = jsonRecordValue(record.timeoutBudget);
|
||||||
return {
|
return {
|
||||||
...compactRecord(record, { keys: ["phase", "active", "status", "terminalStatus", "failureKind", "runId", "commandId", "lastSeq"] }),
|
...withoutFullRecordBytes(compactRecord(record, { keys: ["phase", "active", "status", "terminalStatus", "failureKind", "runId", "commandId", "lastSeq"] })),
|
||||||
lastActivity: lastActivity ? compactRecord(lastActivity, { keys: ["sourceSeq", "eventId", "activityKind", "type", "status", "toolName", "itemId", "ageMs", "summary"] }) : null,
|
lastActivity: lastActivity ? withoutFullRecordBytes(compactRecord(lastActivity, { keys: ["sourceSeq", "eventId", "activityKind", "type", "status", "toolName", "itemId", "ageMs", "summary"] })) : null,
|
||||||
timeoutBudget: timeoutBudget ? compactRecord(timeoutBudget, { keys: ["state", "timeoutMs", "elapsedMs", "remainingMs", "startedAt", "source"] }) : null,
|
timeoutBudget: timeoutBudget ? withoutFullRecordBytes(compactRecord(timeoutBudget, { keys: ["state", "timeoutMs", "elapsedMs", "remainingMs", "startedAt", "source"] })) : null,
|
||||||
recoveryActions: summarizeRecoveryActions(record.recoveryActions),
|
recoveryActions: summarizeRecoveryActions(record.recoveryActions),
|
||||||
valuesPrinted: false,
|
valuesPrinted: false,
|
||||||
};
|
};
|
||||||
@@ -754,7 +754,12 @@ function summarizeSupervisorRecord(record: JsonRecord | null): JsonRecord | null
|
|||||||
|
|
||||||
function summarizeRecoveryActions(value: JsonValue | undefined): JsonValue[] {
|
function summarizeRecoveryActions(value: JsonValue | undefined): JsonValue[] {
|
||||||
if (!Array.isArray(value)) return [];
|
if (!Array.isArray(value)) return [];
|
||||||
return value.slice(0, 5).map((item) => compactRecord(jsonRecordValue(item), { keys: ["action", "reason", "runId", "commandId", "sessionId", "afterSeq", "command", "hint"] }));
|
return value.slice(0, 5).map((item) => withoutFullRecordBytes(compactRecord(jsonRecordValue(item), { keys: ["action", "reason", "runId", "commandId", "sessionId", "afterSeq", "hint"] })));
|
||||||
|
}
|
||||||
|
|
||||||
|
function withoutFullRecordBytes(record: JsonRecord): JsonRecord {
|
||||||
|
const { fullRecordBytes: _omitted, ...rest } = record;
|
||||||
|
return rest;
|
||||||
}
|
}
|
||||||
|
|
||||||
function summarizeRunRecord(record: JsonRecord | null): JsonRecord | null {
|
function summarizeRunRecord(record: JsonRecord | null): JsonRecord | null {
|
||||||
|
|||||||
+6
-1
@@ -97,7 +97,8 @@ function livenessSnapshot(run: RunRecord, command: CommandRecord | null, events:
|
|||||||
const active = terminal === null && !runIsTerminal(run) && !commandIsTerminal(command);
|
const active = terminal === null && !runIsTerminal(run) && !commandIsTerminal(command);
|
||||||
const lastEvent = events.at(-1) ?? null;
|
const lastEvent = events.at(-1) ?? null;
|
||||||
const lastVisibleActivity = latestVisibleActivity(scopedEvents);
|
const lastVisibleActivity = latestVisibleActivity(scopedEvents);
|
||||||
const lastCommandActivity = lastVisibleActivity ?? latestLivenessActivity(scopedEvents);
|
const lastBusinessActivity = latestBusinessActivity(scopedEvents);
|
||||||
|
const lastCommandActivity = lastBusinessActivity ?? latestLivenessActivity(scopedEvents);
|
||||||
const lease = leaseSummary(run, nowMs);
|
const lease = leaseSummary(run, nowMs);
|
||||||
const transportDisconnect = latestTransportDisconnect(scopedEvents);
|
const transportDisconnect = latestTransportDisconnect(scopedEvents);
|
||||||
const lastActivity = livenessActivitySummary(lastCommandActivity, nowMs);
|
const lastActivity = livenessActivitySummary(lastCommandActivity, nowMs);
|
||||||
@@ -193,6 +194,10 @@ function latestVisibleActivity(events: RunEvent[]): RunEvent | null {
|
|||||||
return [...events].reverse().find((event) => event.type === "assistant_message" || event.type === "tool_call" || event.type === "command_output" || event.type === "diff" || event.type === "error" || event.type === "terminal_status") ?? null;
|
return [...events].reverse().find((event) => event.type === "assistant_message" || event.type === "tool_call" || event.type === "command_output" || event.type === "diff" || event.type === "error" || event.type === "terminal_status") ?? null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function latestBusinessActivity(events: RunEvent[]): RunEvent | null {
|
||||||
|
return [...events].reverse().find((event) => event.type === "assistant_message" || event.type === "tool_call" || event.type === "command_output" || event.type === "diff") ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
function isLivenessActivityEvent(event: RunEvent): boolean {
|
function isLivenessActivityEvent(event: RunEvent): boolean {
|
||||||
if (event.type === "assistant_message" || event.type === "tool_call" || event.type === "command_output" || event.type === "diff" || event.type === "error" || event.type === "terminal_status") return true;
|
if (event.type === "assistant_message" || event.type === "tool_call" || event.type === "command_output" || event.type === "diff" || event.type === "error" || event.type === "terminal_status") return true;
|
||||||
if (event.type !== "backend_status") return false;
|
if (event.type !== "backend_status") return false;
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ const selfTest: SelfTestCase = async (context: SelfTestContext) => {
|
|||||||
const summaryItem = ((commanderSummary.items as JsonRecord[]) ?? []).find((item) => item.id === task.id) as JsonRecord;
|
const summaryItem = ((commanderSummary.items as JsonRecord[]) ?? []).find((item) => item.id === task.id) as JsonRecord;
|
||||||
assert.equal(((summaryItem.supervisor as JsonRecord).phase), "terminal");
|
assert.equal(((summaryItem.supervisor as JsonRecord).phase), "terminal");
|
||||||
assert.equal(JSON.stringify(commanderSummary).includes("hwpod workspace apply-patch"), false, "commander summary must stay compact and avoid dumping command bodies");
|
assert.equal(JSON.stringify(commanderSummary).includes("hwpod workspace apply-patch"), false, "commander summary must stay compact and avoid dumping command bodies");
|
||||||
|
assert.equal(JSON.stringify(summaryItem.supervisor).includes("fullRecordBytes"), false, "commander supervisor must not add bookkeeping noise");
|
||||||
assertNoSecretLeak({ toolResult, assistantLive, inactiveLive, terminalResult, session, commanderSummary });
|
assertNoSecretLeak({ toolResult, assistantLive, inactiveLive, terminalResult, session, commanderSummary });
|
||||||
|
|
||||||
return { name: "timeout-liveness", tests: ["tool-in-flight-liveness", "assistant-progress-liveness", "stdio-inactive-timeout-budget", "terminal-timeout-recovery", "queue-commander-supervisor"] };
|
return { name: "timeout-liveness", tests: ["tool-in-flight-liveness", "assistant-progress-liveness", "stdio-inactive-timeout-budget", "terminal-timeout-recovery", "queue-commander-supervisor"] };
|
||||||
|
|||||||
Reference in New Issue
Block a user