feat: close AgentRun commander task plane gaps

This commit is contained in:
Codex
2026-06-09 00:06:53 +08:00
parent 96c8283574
commit 2f5cf8b3d4
15 changed files with 411 additions and 23 deletions
+24 -2
View File
@@ -451,7 +451,7 @@ export class MemoryAgentRunStore implements AgentRunStore {
}
createQueueTask(input: CreateQueueTaskInput): QueueTaskRecord {
const payloadHash = stableHash(input.payload);
const payloadHash = queueTaskPayloadHash(input);
if (input.idempotencyKey) {
const existing = Array.from(this.queueTasks.values()).find((task) => task.tenantId === input.tenantId && task.projectId === input.projectId && task.idempotencyKey === input.idempotencyKey);
if (existing) {
@@ -460,7 +460,9 @@ export class MemoryAgentRunStore implements AgentRunStore {
}
}
const at = nowIso();
const task: QueueTaskRecord = { ...input, id: newId("qt"), state: "pending", version: this.nextQueueVersion(), payloadHash, latestAttempt: null, sessionPath: null, createdAt: at, updatedAt: at, cancelledAt: null, cancelReason: null };
const sessionId = input.sessionRef?.sessionId ?? null;
const sessionPath = sessionId ? `/api/v1/sessions/${encodeURIComponent(sessionId)}` : null;
const task: QueueTaskRecord = { ...input, id: newId("qt"), state: "pending", version: this.nextQueueVersion(), payloadHash, latestAttempt: null, sessionPath, createdAt: at, updatedAt: at, cancelledAt: null, cancelReason: null };
this.queueTasks.set(task.id, task);
return task;
}
@@ -750,6 +752,26 @@ export function queueTaskSort(a: QueueTaskRecord, b: QueueTaskRecord): number {
return a.createdAt.localeCompare(b.createdAt) || a.id.localeCompare(b.id);
}
export function queueTaskPayloadHash(input: CreateQueueTaskInput): string {
return stableHash({
tenantId: input.tenantId,
projectId: input.projectId,
queue: input.queue,
lane: input.lane,
title: input.title,
priority: input.priority,
backendProfile: input.backendProfile,
providerId: input.providerId,
workspaceRef: input.workspaceRef,
sessionRef: input.sessionRef,
executionPolicy: input.executionPolicy,
resourceBundleRef: input.resourceBundleRef,
payload: input.payload,
references: input.references,
metadata: input.metadata,
});
}
export function buildQueueStats(tasks: QueueTaskRecord[], queue: string | null, generatedAt = nowIso()): QueueStats {
const byState: Record<string, number> = {};
const byLane: Record<string, number> = {};