fix: 暴露 session follow-up 可见性

This commit is contained in:
AgentRun Codex
2026-06-12 04:26:14 +08:00
parent 216209ca95
commit 21ff548b86
3 changed files with 197 additions and 68 deletions
+49 -40
View File
@@ -213,7 +213,7 @@ function summarizeCommandShowResult(command: JsonValue, result: JsonValue, runId
function summarizeResultEnvelope(record: JsonRecord | null): JsonRecord | null {
if (!record) return null;
return withoutFullRecordBytes(compactRecord(record, {
keys: ["runId", "commandId", "attemptId", "runnerId", "jobName", "namespace", "status", "runStatus", "commandState", "terminalStatus", "terminalSource", "completed", "failureKind", "failureMessage", "lastSeq", "eventCount", "scopedEventCount", "scopedLastSeq", "runnerJobCount"],
keys: ["ok", "executionOk", "runId", "commandId", "attemptId", "runnerId", "jobName", "namespace", "status", "runStatus", "commandState", "terminalStatus", "terminalSource", "providerTerminalFailure", "recoverableViaSession", "completed", "finalResponseAuthority", "finalResponseFallback", "needsContinuation", "failureKind", "failureMessage", "lastSeq", "eventCount", "scopedEventCount", "scopedLastSeq", "runnerJobCount"],
}));
}
@@ -262,17 +262,16 @@ function summarizeDiagnosisRecord(record: JsonRecord | null): JsonRecord | null
function summarizeFinalResponseRecord(record: JsonRecord | null): JsonRecord | null {
if (!record) return null;
return withoutFullRecordBytes(compactRecord(record, { keys: ["seq", "source", "final", "replyAuthority", "textTruncated", "outputTruncated", "text"] }));
return withoutFullRecordBytes(compactRecord(record, { keys: ["seq", "source", "final", "replyAuthority", "authority", "fallback", "needsContinuation", "textTruncated", "outputTruncated", "text"] }));
}
function runCommandDrillDown(runId: string, commandId: string | null, sessionId: string | null, lastSeq: number): JsonRecord {
return {
run: `./scripts/agentrun runs show ${runId}`,
runFull: `./scripts/agentrun runs show ${runId} --full`,
result: `./scripts/agentrun runs result ${runId}${commandId ? ` --command-id ${commandId}` : ""}`,
events: `./scripts/agentrun runs events ${runId} --after-seq ${lastSeq} --limit 100 --tail-summary`,
...(commandId ? { command: `./scripts/agentrun commands show ${commandId} --run-id ${runId}`, commandResult: `./scripts/agentrun commands result ${commandId} --run-id ${runId}` } : {}),
...(sessionId ? { trace: `./scripts/agentrun sessions trace ${sessionId} --after-seq ${lastSeq} --limit 100 --run-id ${runId}`, output: `./scripts/agentrun sessions output ${sessionId} --after-seq ${lastSeq} --limit 100 --run-id ${runId}` } : {}),
run: `describe run/${runId}`,
result: `result run/${runId}${commandId ? ` --command ${commandId}` : ""}`,
events: `events run/${runId} --after-seq ${lastSeq} --limit 100`,
...(commandId ? { command: `describe command/${commandId} --run ${runId}`, commandResult: `result command/${commandId} --run ${runId}` } : {}),
...(sessionId ? { logs: `logs session/${sessionId} --tail 100`, send: `send session/${sessionId} --prompt-stdin` } : {}),
valuesPrinted: false,
};
}
@@ -405,11 +404,10 @@ export function summarizeQueueDispatchResult(result: JsonValue, taskId: string):
fullResponseBytes: jsonByteLength(result),
valuesPrinted: false,
pollCommands: {
queue: `./scripts/agentrun queue show ${stringValue(task?.id) ?? taskId}`,
...(runId ? { run: `./scripts/agentrun runs show ${runId}` } : {}),
...(runId && commandId ? { command: `./scripts/agentrun commands show ${commandId} --run-id ${runId}` } : {}),
...(runId ? { events: `./scripts/agentrun runs events ${runId} --after-seq 0 --limit 100 --tail-summary` } : {}),
...(sessionId ? { trace: `./scripts/agentrun sessions trace ${sessionId} --after-seq 0 --limit 100`, output: `./scripts/agentrun sessions output ${sessionId} --after-seq 0 --limit 100` } : {}),
queue: `describe task/${stringValue(task?.id) ?? taskId}`,
...(runId ? { run: `describe run/${runId}`, result: `result run/${runId}${commandId ? ` --command ${commandId}` : ""}`, events: `events run/${runId} --after-seq 0 --limit 100` } : {}),
...(runId && commandId ? { command: `describe command/${commandId} --run ${runId}` } : {}),
...(sessionId ? { logs: `logs session/${sessionId} --tail 100`, send: `send session/${sessionId} --prompt-stdin` } : {}),
},
expandedOutput: {
fullFlag: "--full",
@@ -665,11 +663,11 @@ function summarizeSessionMutationResult(action: "session-cancel" | "session-read
fullResponseBytes: jsonByteLength(result),
valuesPrinted: false,
drillDownCommands: {
show: `./scripts/agentrun sessions show ${sessionId} --reader-id cli`,
trace: `./scripts/agentrun sessions trace ${sessionId} --after-seq 0 --limit 100`,
output: `./scripts/agentrun sessions output ${sessionId} --after-seq 0 --limit 100`,
traceFull: `./scripts/agentrun sessions trace ${sessionId} --after-seq 0 --limit 100 --full`,
outputFull: `./scripts/agentrun sessions output ${sessionId} --after-seq 0 --limit 100 --full`,
show: `describe session/${sessionId}`,
logs: `logs session/${sessionId} --tail 100`,
send: `send session/${sessionId} --prompt-stdin`,
read: `ack session/${sessionId}`,
cancel: `cancel session/${sessionId}`,
},
expandedOutput: {
fullFlag: "--full",
@@ -703,11 +701,13 @@ function summarizeSessionSendResult(result: JsonValue, sessionId: string, profil
fullResponseBytes: jsonByteLength(result),
valuesPrinted: false,
drillDownCommands: {
show: `./scripts/agentrun sessions show ${sessionId} --reader-id cli`,
trace: `./scripts/agentrun sessions trace ${sessionId} --after-seq ${afterSeq} --limit 100`,
output: `./scripts/agentrun sessions output ${sessionId} --after-seq ${afterSeq} --limit 100`,
read: `./scripts/agentrun sessions read ${sessionId} --reader-id cli`,
cancel: `./scripts/agentrun sessions cancel ${sessionId}`,
show: `describe session/${sessionId}`,
logs: `logs session/${sessionId} --tail 100`,
...(stringValue(run?.id) ? { events: `events run/${String(run?.id)} --after-seq ${afterSeq} --limit 100` } : {}),
...(stringValue(run?.id) && stringValue(command?.id) ? { result: `result run/${String(run?.id)} --command ${String(command?.id)}` } : {}),
send: `send session/${sessionId} --prompt-stdin`,
read: `ack session/${sessionId}`,
cancel: `cancel session/${sessionId}`,
},
expandedOutput: {
fullFlag: "--full",
@@ -796,10 +796,10 @@ export function summarizeQueueTaskShowResult(result: JsonValue, taskId: string):
fullResponseBytes: jsonByteLength(result),
valuesPrinted: false,
pollCommands: {
full: `./scripts/agentrun queue show ${taskId} --full`,
...(runId ? { run: `./scripts/agentrun runs show ${runId}`, events: `./scripts/agentrun runs events ${runId} --after-seq ${afterSeq} --limit 100 --tail-summary` } : {}),
...(runId && commandId ? { command: `./scripts/agentrun commands show ${commandId} --run-id ${runId}` } : {}),
...(sessionId ? { trace: `./scripts/agentrun sessions trace ${sessionId} --after-seq 0 --limit 100`, output: `./scripts/agentrun sessions output ${sessionId} --after-seq 0 --limit 100` } : {}),
full: `describe task/${taskId} --full`,
...(runId ? { run: `describe run/${runId}`, result: `result run/${runId}${commandId ? ` --command ${commandId}` : ""}`, events: `events run/${runId} --after-seq ${afterSeq} --limit 100` } : {}),
...(runId && commandId ? { command: `describe command/${commandId} --run ${runId}` } : {}),
...(sessionId ? { logs: `logs session/${sessionId} --tail 100`, send: `send session/${sessionId} --prompt-stdin` } : {}),
},
};
}
@@ -814,6 +814,7 @@ export function summarizeQueueCommanderSnapshot(result: JsonValue, options: Queu
queue: stringValue(record.queue),
readerId: stringValue(record.readerId),
stats: summarizeQueueStats(jsonRecordValue(record.stats)),
activeSessionCount: numberValue(record.activeSessionCount),
sourceCount: items.length,
displayedCount: selected.length,
limit: options.limit,
@@ -824,13 +825,15 @@ export function summarizeQueueCommanderSnapshot(result: JsonValue, options: Queu
fullResponseBytes: jsonByteLength(result),
valuesPrinted: false,
drillDownCommands: {
full: "./scripts/agentrun queue commander --reader-id cli --full",
raw: "./scripts/agentrun queue commander --reader-id cli --raw",
item: "./scripts/agentrun queue show <taskId>",
run: "./scripts/agentrun runs show <runId>",
events: "./scripts/agentrun runs events <runId> --after-seq <lastSeq> --limit 100 --tail-summary",
command: "./scripts/agentrun commands show <commandId> --run-id <runId>",
sessionHint: "session trace/output 只在 queue show <taskId> 的 per-task pollCommands 中按实际 sessionId 输出",
full: "get tasks --queue commander -o wide",
item: "describe task/<taskId>",
run: "describe run/<runId>",
events: "events run/<runId> --after-seq <lastSeq> --limit 100",
result: "result run/<runId> --command <commandId>",
command: "describe command/<commandId> --run <runId>",
logs: "logs session/<sessionId> --tail 100",
send: "send session/<sessionId> --prompt-stdin",
sessionHint: "细节按实际 run/session 走 result/events/logs;续跑只用 send session/<sessionId>",
},
};
}
@@ -948,9 +951,11 @@ function summarizeQueueTaskWithAttempt(record: JsonRecord | null, fallbackTaskId
const summary = summarizeQueueTaskRecord(record, fallbackTaskId);
const latestAttempt = summarizeAttemptRecord(jsonRecordValue(record?.latestAttempt));
const supervisor = summarizeSupervisorRecord(jsonRecordValue(record?.supervisor));
const activeSession = summarizeActiveSessionRecord(jsonRecordValue(record?.activeSession));
const sessionRef = jsonRecordValue(record?.sessionRef);
if (latestAttempt) summary.latestAttempt = latestAttempt;
if (supervisor) summary.supervisor = supervisor;
if (activeSession) summary.activeSession = activeSession;
const sessionId = stringValue(sessionRef?.sessionId) ?? stringValue(latestAttempt?.sessionId);
if (sessionId) summary.sessionId = sessionId;
if (record?.readCursor !== undefined) summary.read = record.readCursor !== null;
@@ -994,7 +999,7 @@ function summarizeSupervisorRecord(record: JsonRecord | null): JsonRecord | null
const terminalClassification = jsonRecordValue(record.terminalClassification);
const diagnosis = jsonRecordValue(record.diagnosis);
return {
...withoutFullRecordBytes(compactRecord(record, { keys: ["phase", "active", "status", "terminalStatus", "failureKind", "runId", "commandId", "lastSeq", "lastEventAt", "lastEventAgeMs", "leaseRemainingMs", "leaseExpired"] })),
...withoutFullRecordBytes(compactRecord(record, { keys: ["source", "sessionId", "executionState", "attentionState", "active", "activeRunId", "activeCommandId", "attemptRunId", "attemptCommandId", "phase", "status", "terminalStatus", "failureKind", "runId", "commandId", "lastSeq", "lastEventAt", "lastEventAgeMs", "leaseRemainingMs", "leaseExpired"] })),
diagnosis: diagnosis ? summarizeDiagnosisRecord(diagnosis) : null,
terminalClassification: terminalClassification ? summarizeTerminalClassification(terminalClassification) : null,
lastActivity: lastActivity ? withoutFullRecordBytes(compactRecord(lastActivity, { keys: ["sourceSeq", "eventId", "activityKind", "type", "status", "toolName", "itemId", "ageMs", "summary"] })) : null,
@@ -1004,8 +1009,13 @@ function summarizeSupervisorRecord(record: JsonRecord | null): JsonRecord | null
};
}
function summarizeActiveSessionRecord(record: JsonRecord | null): JsonRecord | null {
if (!record) return null;
return withoutFullRecordBytes(compactRecord(record, { keys: ["sessionId", "sessionPath", "executionState", "attentionState", "active", "activeRunId", "activeCommandId", "lastRunId", "lastCommandId", "terminalStatus", "failureKind", "lastActivityAt", "updatedAt"] }));
}
function summarizeTerminalClassification(record: JsonRecord): JsonRecord {
return withoutFullRecordBytes(compactRecord(record, { keys: ["category", "confidence", "providerEvidence", "providerInterruption", "providerInterruptionKnown", "providerInterruptionReason", "retryInterruptionObserved", "retryInterruptionSeq", "retryInterruptionKind", "hardTimeout", "idleTimeout", "timeoutKind", "timeoutState", "transportDisconnectObserved", "transportDisconnectSeq", "reason"] }));
return withoutFullRecordBytes(compactRecord(record, { keys: ["category", "confidence", "terminalStatus", "failureKind", "providerEvidence", "providerInterruption", "providerInterruptionKnown", "providerInterruptionReason", "retryInterruptionObserved", "retryInterruptionSeq", "retryInterruptionKind", "hardTimeout", "idleTimeout", "timeoutKind", "timeoutState", "transportDisconnectObserved", "transportDisconnectSeq", "reason"] }));
}
function summarizeRecoveryActions(value: JsonValue | undefined): JsonValue[] {
@@ -1215,10 +1225,9 @@ async function sessionCreate(args: ParsedArgs, positionalSessionId: string | nul
pvc: created.pvc,
storage,
pollCommands: {
show: `./scripts/agentrun sessions show ${sessionId} --reader-id cli`,
storage: `./scripts/agentrun sessions storage ${sessionId}`,
trace: `./scripts/agentrun sessions trace ${sessionId} --after-seq 0 --limit 100`,
send: `./scripts/agentrun sessions send ${sessionId} --prompt "..."`,
show: `describe session/${sessionId}`,
logs: `logs session/${sessionId} --tail 100`,
send: `send session/${sessionId} --prompt-stdin`,
},
};
}