From 10160bf6a966fe4861310e2781c5570a3343000e Mon Sep 17 00:00:00 2001 From: Ibrahim Kazimov <74775400+ibrahimkzmv@users.noreply.github.com> Date: Fri, 17 Apr 2026 12:29:23 +0300 Subject: [PATCH] fix: update dashboard metrics with start and end timestamps for tasks --- src/orchestrator/orchestrator.ts | 39 ++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/src/orchestrator/orchestrator.ts b/src/orchestrator/orchestrator.ts index 17c2a5f..f920234 100644 --- a/src/orchestrator/orchestrator.ts +++ b/src/orchestrator/orchestrator.ts @@ -208,6 +208,8 @@ function resolveTokenBudget(primary?: number, fallback?: number): number | undef } interface DashboardTaskMetrics { + readonly startMs: number + readonly endMs: number readonly durationMs: number readonly tokenUsage: TokenUsage readonly toolCalls: AgentRunResult['toolCalls'] @@ -391,6 +393,10 @@ function buildRunTeamDashboardHtml(_goal: string, _tasks: DashboardTaskNode[]): +
+ +

0

+
@@ -412,6 +418,7 @@ function buildRunTeamDashboardHtml(_goal: string, _tasks: DashboardTaskNode[]): const selectedAssignee = document.getElementById("selectedAssignee"); const selectedState = document.getElementById("selectedState"); const selectedStart = document.getElementById("selectedStart"); + const selectedToolCalls = document.getElementById("selectedToolCalls"); const selectedEnd = document.getElementById("selectedEnd"); const selectedPromptTokens = document.getElementById("selectedPromptTokens"); const selectedCompletionTokens = document.getElementById("selectedCompletionTokens"); @@ -582,6 +589,7 @@ function buildRunTeamDashboardHtml(_goal: string, _tasks: DashboardTaskNode[]): function renderDetails(task) { const metrics = task?.metrics ?? {}; + const statusLabel = (statusStyles[task.status] || statusStyles.pending).chip; const usage = metrics.tokenUsage ?? { input_tokens: 0, output_tokens: 0 }; const inTokens = usage.input_tokens ?? 0; const outTokens = usage.output_tokens ?? 0; @@ -589,9 +597,13 @@ function buildRunTeamDashboardHtml(_goal: string, _tasks: DashboardTaskNode[]): const ratio = total > 0 ? Math.round((inTokens / total) * 100) : 0; selectedAssignee.textContent = task?.assignee || "UNASSIGNED"; - selectedState.textContent = "ACTIVE STATE: " + task.status.toUpperCase(); - selectedStart.textContent = payload.generatedAt || "-"; - selectedEnd.textContent = payload.generatedAt || "-"; + + selectedState.textContent = "STATE: " + statusLabel; + selectedStart.textContent = metrics.startMs ? new Date(metrics.startMs).toISOString() : "-"; + selectedEnd.textContent = metrics.endMs ? new Date(metrics.endMs).toISOString() : "-"; + + selectedToolCalls.textContent = (metrics.toolCalls ?? []).length.toString(); + selectedPromptTokens.textContent = inTokens.toLocaleString(); selectedCompletionTokens.textContent = outTokens.toLocaleString(); selectedTokenRatio.style.width = ratio + "%"; @@ -668,9 +680,6 @@ function buildRunTeamDashboardHtml(_goal: string, _tasks: DashboardTaskNode[]): }); renderLiveOutput(taskList); - if (taskList.length > 0) { - renderDetails(taskList[0]); - } } renderDag(tasks); @@ -1035,9 +1044,10 @@ async function executeQueue( }, ) + const taskEndMs = Date.now() + // Emit task trace if (config.onTrace) { - const taskEndMs = Date.now() emitTrace(config.onTrace, { type: 'task', runId: ctx.runId ?? '', @@ -1053,8 +1063,11 @@ async function executeQueue( } ctx.agentResults.set(`${assignee}:${task.id}`, result) + ctx.taskMetrics.set(task.id, { - durationMs: Math.max(0, Date.now() - taskStartMs), + startMs: taskStartMs, + endMs: taskEndMs, + durationMs: Math.max(0, taskEndMs - taskStartMs), tokenUsage: result.tokenUsage, toolCalls: result.toolCalls, }) @@ -1433,7 +1446,11 @@ export class OpenMultiAgent { ? { ...(traceFields ?? {}), ...(abortFields ?? {}) } : undefined + const scStartMs = Date.now() + const result = await agent.run(goal, runOptions) + + const scEndMs = Date.now() if (result.budgetExceeded) { this.config.onProgress?.({ @@ -1455,6 +1472,8 @@ export class OpenMultiAgent { const agentResults = new Map() agentResults.set(bestAgent.name, result) + + await this.emitRunTeamDashboard( goal, [{ @@ -1470,7 +1489,9 @@ export class OpenMultiAgent { }], new Map([ ['short-circuit', { - durationMs: 0, + startMs: scStartMs, + endMs: scEndMs, + durationMs: scEndMs - scStartMs, tokenUsage: result.tokenUsage, toolCalls: result.toolCalls, }],