fix: expose codex submit queue context
This commit is contained in:
+183
-5
@@ -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}`,
|
||||
|
||||
Reference in New Issue
Block a user