fix: expose codex submit queue context

This commit is contained in:
Codex
2026-05-23 08:05:06 +00:00
parent 084a136525
commit e8fe7d1d9b
5 changed files with 297 additions and 6 deletions
+183 -5
View File
@@ -22,6 +22,7 @@ const supervisorBodyPreviewChars = 70;
const supervisorRecentBodyPreviewChars = 50;
const diagnosticsIdPreviewLimit = 3;
const diagnosticsReasonPreviewLimit = 2;
const mutationQueueIdPreviewLimit = 15;
const steerPromptPreviewChars = 320;
const detailAttemptReturnedLimit = 3;
const detailInitialPromptPreviewChars = 1200;
@@ -253,6 +254,11 @@ interface CompactTaskMutationResponseOptions {
fullPrompt?: boolean;
}
interface CompactSubmitQueueConfirmationOptions {
submittedTasks?: Record<string, unknown>[];
idPreviewLimit?: number;
}
interface CodexTasksOptions {
queueId: string | undefined;
requestedLimit: number;
@@ -3658,17 +3664,187 @@ function compactSubmitTaskConfirmation(task: unknown): Record<string, unknown> {
};
}
function compactSubmitQueueConfirmation(value: unknown): Record<string, unknown> | null {
function orderedUniqueStringList(values: string[]): string[] {
const seen = new Set<string>();
const items: string[] = [];
for (const value of values) {
if (seen.has(value)) continue;
seen.add(value);
items.push(value);
}
return items;
}
function compactIdPreview(knownIds: string[], totalCount: number, limit: number, source: string, note: string | null = null): Record<string, unknown> {
const all = orderedUniqueStringList(knownIds);
const count = Math.max(0, totalCount, all.length);
const items = all.slice(0, limit);
const omitted = Math.max(0, count - items.length);
return {
items,
count,
returned: items.length,
omitted,
truncated: omitted > 0 || all.length > items.length,
source,
...(note === null ? {} : { note }),
};
}
function idPreviewInputItems(value: unknown): string[] {
const record = asRecord(value);
return stringList(record?.items ?? value);
}
function idPreviewInputCount(value: unknown): number {
const record = asRecord(value);
const explicit = asNumber(record?.count, Number.NaN);
if (Number.isFinite(explicit)) return explicit;
return idPreviewInputItems(value).length;
}
function countForStatus(counts: Record<string, unknown>, status: string): number {
return asNumber(counts[status], 0);
}
function maxFiniteNumber(values: number[]): number {
const finite = values.filter((value) => Number.isFinite(value));
return finite.length === 0 ? 0 : Math.max(...finite);
}
function taskIdsForStatuses(tasks: Record<string, unknown>[], statuses: Set<string> | null): string[] {
return tasks.flatMap((task) => {
const id = asString(task.id);
if (id.length === 0) return [];
if (statuses !== null && !statuses.has(asString(task.status))) return [];
return [id];
});
}
function previewSource(parts: string[], fallback: string): string {
const unique = orderedUniqueStringList(parts.filter((part) => part.length > 0));
return unique.length > 0 ? unique.join("+") : fallback;
}
function compactSubmitQueueConfirmation(value: unknown, options: CompactSubmitQueueConfirmationOptions = {}): Record<string, unknown> | null {
const record = asRecord(value);
if (record === null) return null;
const counts = asRecord(record.counts) ?? {};
const diagnosticsRecord = asRecord(record.executionDiagnostics) ?? {};
const submittedTasks = options.submittedTasks ?? [];
const idPreviewLimit = Math.max(1, Math.min(options.idPreviewLimit ?? mutationQueueIdPreviewLimit, maxTasksLimit));
const submittedTaskIds = taskIdsForStatuses(submittedTasks, null);
const submittedQueuedTaskIds = taskIdsForStatuses(submittedTasks, new Set(["queued", "retry_wait"]));
const submittedActiveTaskIds = taskIdsForStatuses(submittedTasks, new Set(["running", "judging"]));
const upstreamQueuedTaskIds = idPreviewInputItems(record.queuedTaskIds);
const queuedKnownIds = orderedUniqueStringList([...submittedQueuedTaskIds, ...upstreamQueuedTaskIds]);
const queuedStatusCount = countForStatus(counts, "queued") + countForStatus(counts, "retry_wait");
const queuedCount = Math.max(queuedKnownIds.length, idPreviewInputCount(record.queuedTaskIds), queuedStatusCount);
const queuedPreview = compactIdPreview(
queuedKnownIds,
queuedCount,
idPreviewLimit,
previewSource([
submittedQueuedTaskIds.length > 0 ? "submittedTaskIds" : "",
upstreamQueuedTaskIds.length > 0 ? "upstreamQueuedTaskIds" : "",
queuedKnownIds.length === 0 && queuedCount > 0 ? "aggregateCountsOnly" : "",
], "none"),
queuedCount > queuedKnownIds.length ? "Upstream did not enumerate every queued id in this low-noise mutation response; count remains authoritative." : null,
);
const upstreamActiveTaskIds = idPreviewInputItems(record.activeTaskIds);
const databaseActiveTaskIds = idPreviewInputItems(record.databaseActiveTaskIds);
const diagnosticsDatabaseActiveTaskIds = idPreviewInputItems(diagnosticsRecord.databaseActiveTaskIds);
const diagnosticsHeartbeatTaskIds = idPreviewInputItems(diagnosticsRecord.heartbeatFreshTaskIds);
const activeKnownIds = orderedUniqueStringList([
...submittedActiveTaskIds,
...upstreamActiveTaskIds,
...databaseActiveTaskIds,
...diagnosticsDatabaseActiveTaskIds,
...diagnosticsHeartbeatTaskIds,
]);
const statusActiveCount = countForStatus(counts, "running") + countForStatus(counts, "judging");
const databaseActiveTaskCount = maxFiniteNumber([
databaseActiveTaskIds.length,
diagnosticsDatabaseActiveTaskIds.length,
asNumber(record.databaseActiveTaskCount, Number.NaN),
asNumber(diagnosticsRecord.databaseActiveTaskCount, Number.NaN),
]);
const activeCount = maxFiniteNumber([
activeKnownIds.length,
idPreviewInputCount(record.activeTaskIds),
databaseActiveTaskCount,
statusActiveCount,
]);
const activePreview = compactIdPreview(
activeKnownIds,
activeCount,
idPreviewLimit,
previewSource([
submittedActiveTaskIds.length > 0 ? "submittedTaskIds" : "",
upstreamActiveTaskIds.length > 0 ? "upstreamActiveTaskIds" : "",
databaseActiveTaskIds.length > 0 ? "databaseActiveTaskIds" : "",
diagnosticsDatabaseActiveTaskIds.length > 0 ? "executionDiagnostics.databaseActiveTaskIds" : "",
diagnosticsHeartbeatTaskIds.length > 0 ? "executionDiagnostics.heartbeatFreshTaskIds" : "",
activeKnownIds.length === 0 && activeCount > 0 ? "aggregateCountsOnly" : "",
], "none"),
activeCount > activeKnownIds.length ? "Upstream only exposed aggregate active counts for part of the running set; count remains authoritative." : null,
);
const databaseActivePreview = compactIdPreview(
orderedUniqueStringList([...databaseActiveTaskIds, ...diagnosticsDatabaseActiveTaskIds]),
maxFiniteNumber([databaseActiveTaskCount, idPreviewInputCount(record.databaseActiveTaskIds), idPreviewInputCount(diagnosticsRecord.databaseActiveTaskIds)]),
idPreviewLimit,
previewSource([
databaseActiveTaskIds.length > 0 ? "databaseActiveTaskIds" : "",
diagnosticsDatabaseActiveTaskIds.length > 0 ? "executionDiagnostics.databaseActiveTaskIds" : "",
databaseActiveTaskCount > 0 && databaseActiveTaskIds.length === 0 && diagnosticsDatabaseActiveTaskIds.length === 0 ? "aggregateCountsOnly" : "",
], "none"),
);
const submittedPreview = compactIdPreview(submittedTaskIds, submittedTaskIds.length, idPreviewLimit, "response.tasks");
const omittedCounts = {
activeTaskIds: asNumber(activePreview.omitted, 0),
databaseActiveTaskIds: asNumber(databaseActivePreview.omitted, 0),
queuedTaskIds: asNumber(queuedPreview.omitted, 0),
submittedTaskIds: asNumber(submittedPreview.omitted, 0),
};
const listsTruncated = Object.values(omittedCounts).some((count) => count > 0)
|| activePreview.truncated === true
|| databaseActivePreview.truncated === true
|| queuedPreview.truncated === true
|| submittedPreview.truncated === true;
return {
total: record.total ?? null,
queueCount: record.queueCount ?? null,
counts: record.counts ?? null,
activeQueueIds: boundedUniqueStringList(record.activeQueueIds, 8),
activeTaskIds: boundedUniqueStringList(record.activeTaskIds ?? record.databaseActiveTaskIds, 8),
queuedTaskIds: boundedUniqueStringList(record.queuedTaskIds, 8),
activeTaskIds: activePreview,
databaseActiveTaskCount,
databaseActiveTaskIds: databaseActivePreview,
queuedTaskIds: queuedPreview,
executionDiagnostics: compactQueueExecutionDiagnostics(record.executionDiagnostics),
...(submittedTasks.length === 0 ? {} : { submittedTaskIds: submittedPreview }),
countContext: {
queued: countForStatus(counts, "queued"),
retryWait: countForStatus(counts, "retry_wait"),
running: countForStatus(counts, "running"),
judging: countForStatus(counts, "judging"),
active: statusActiveCount,
databaseActive: databaseActiveTaskCount,
submitted: submittedTaskIds.length,
},
listPreviewPolicy: {
bounded: true,
idPreviewLimit,
countsAreAuthoritative: true,
truncated: listsTruncated,
omittedCounts,
note: listsTruncated
? "Low-noise mutation output omits additional task ids from one or more previews; use the raw command for full upstream queue detail."
: "Low-noise mutation output includes all known task ids returned for these previews.",
rawCommand: "bun scripts/cli.ts microservice proxy code-queue /api/tasks/overview?limit=30 --raw --full",
},
byQueue: Array.isArray(record.byQueue) ? record.byQueue : undefined,
};
}
@@ -3683,7 +3859,9 @@ function compactSubmitConcurrencyGuard(value: Record<string, unknown>): Record<s
}
function compactSubmitSuccessResponse(body: Record<string, unknown>, upstream: Record<string, unknown>, lock: Record<string, unknown>): Record<string, unknown> {
const allTasks = asArray(body.tasks).map(compactSubmitTaskConfirmation);
const rawTasks = asArray(body.tasks);
const submittedTasks = rawTasks.map((task) => asRecord(task)).filter((task): task is Record<string, unknown> => task !== null);
const allTasks = rawTasks.map(compactSubmitTaskConfirmation);
const tasks = allTasks.slice(0, defaultTasksLimit);
const allTaskIds = allTasks.map((task) => asString(task.id)).filter(Boolean);
const taskIds = allTaskIds.slice(0, defaultTasksLimit);
@@ -3710,7 +3888,7 @@ function compactSubmitSuccessResponse(body: Record<string, unknown>, upstream: R
reason: "codex submit is a write operation; default output confirms persistence and provides drill-down commands without echoing prompt text.",
},
},
queue: compactSubmitQueueConfirmation(body.queue),
queue: compactSubmitQueueConfirmation(body.queue, { submittedTasks }),
submitConcurrencyGuard: compactSubmitConcurrencyGuard(lock),
commands: {
firstTask: firstTaskId === null ? null : `bun scripts/cli.ts codex task ${firstTaskId}`,