From 5d4d942378289b99ee10d900cc1626e5dad854d9 Mon Sep 17 00:00:00 2001 From: pelikhan Date: Mon, 29 Jun 2026 15:43:06 -0700 Subject: [PATCH 1/3] feat(dashboard): require workflow selection before loading runs Add a workflow selector to the Runs tab so logs are only fetched for the chosen workflow instead of all workflows at once. - Add selectedWorkflowFilter state (empty = none selected) - fetchRuns() is a no-op when no workflow is selected (clears runs) - selectWorkflowFilter() sets the filter and triggers fetchRuns() - init() no longer fetches runs on startup; user picks a workflow first - buildLogsCommand() includes the workflow name when one is selected - /api/runs now accepts workflow_name query param and forwards it to getRuns() - Runs tab shows a prompt to select a workflow when none is chosen - workflow_name column removed from run rows (redundant with the filter) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../agentic-workflows-dashboard/extension.mjs | 1 + .../agentic-workflows-dashboard/src/app.ts | 23 +++++++++++++-- .../agentic-workflows-dashboard/web/app.js | 28 +++++++++++++++---- .../web/index.html | 27 ++++++++++++++---- 4 files changed, 66 insertions(+), 13 deletions(-) diff --git a/.github/extensions/agentic-workflows-dashboard/extension.mjs b/.github/extensions/agentic-workflows-dashboard/extension.mjs index 204409279df..4f76df904b1 100644 --- a/.github/extensions/agentic-workflows-dashboard/extension.mjs +++ b/.github/extensions/agentic-workflows-dashboard/extension.mjs @@ -109,6 +109,7 @@ async function startServer() { count: parseInt(reqUrl.searchParams.get("count") ?? String(DEFAULT_RUN_COUNT), 10), window: reqUrl.searchParams.get("window") ?? "7d", timeout: parseInt(reqUrl.searchParams.get("timeout") ?? String(DEFAULT_LOG_TIMEOUT_MINUTES), 10), + workflowName: reqUrl.searchParams.get("workflow_name") ?? "", }) ); } else if (pathname === "/api/usage") { diff --git a/.github/extensions/agentic-workflows-dashboard/src/app.ts b/.github/extensions/agentic-workflows-dashboard/src/app.ts index fa26bdc47dd..81772676b8b 100644 --- a/.github/extensions/agentic-workflows-dashboard/src/app.ts +++ b/.github/extensions/agentic-workflows-dashboard/src/app.ts @@ -22,6 +22,7 @@ interface DashboardState { reportWindows: ReportWindow[]; activeTab: DashboardTabId; selectedWindow: ReportWindow["id"]; + selectedWorkflowFilter: string; logsTimeout: number; pageSize: number; cliStatus: CLIStatus | null; @@ -76,6 +77,7 @@ interface DashboardState { loadExperimentPage(page: number): void; selectRun(runId: number): void; viewRunDetails(runId: number): void; + selectWorkflowFilter(workflowName: string): Promise; loadAudit(): Promise; clearAudit(): void; buildLogsCommand(count?: number): string; @@ -212,6 +214,7 @@ Alpine.data("dashboardApp", (): DashboardState => ({ reportWindows, activeTab: "definitions", selectedWindow: "7d", + selectedWorkflowFilter: "", logsTimeout: 1, pageSize: 20, cliStatus: null, @@ -252,7 +255,7 @@ Alpine.data("dashboardApp", (): DashboardState => ({ this.commandInput = this.buildLogsCommand(); await this.fetchCliStatus(); if (this.cliStatus?.available) { - await Promise.all([this.fetchDefinitions(), this.fetchRuns(), this.fetchUsage(), this.fetchExperiments()]); + await Promise.all([this.fetchDefinitions(), this.fetchUsage(), this.fetchExperiments()]); this.commandOutput = `$ ${this.cliStatus.command}\ngh aw version ${this.cliStatus.version}`; return; } @@ -278,6 +281,13 @@ Alpine.data("dashboardApp", (): DashboardState => ({ await Promise.all([this.fetchRuns(), this.fetchUsage()]); }, + async selectWorkflowFilter(workflowName) { + this.selectedWorkflowFilter = workflowName; + this.commandInput = this.buildLogsCommand(); + if (!this.cliStatus?.available) return; + await this.fetchRuns(); + }, + async fetchCliStatus() { this.loadingCliStatus = true; this.errorCliStatus = ""; @@ -305,6 +315,13 @@ Alpine.data("dashboardApp", (): DashboardState => ({ }, async fetchRuns() { + if (!this.selectedWorkflowFilter) { + this.runs = []; + this.runsMeta = null; + this.selectedRun = null; + this.loadRunPage(1); + return; + } this.loadingRuns = true; this.errorRuns = ""; try { @@ -313,6 +330,7 @@ Alpine.data("dashboardApp", (): DashboardState => ({ count: "100", window: this.selectedWindow, timeout: String(this.logsTimeout), + workflow_name: this.selectedWorkflowFilter, }); const data = await fetchJson(`/api/runs?${params.toString()}`); this.runsMeta = data; @@ -459,7 +477,8 @@ Alpine.data("dashboardApp", (): DashboardState => ({ buildLogsCommand(count = DEFAULT_LOGS_COMMAND_COUNT) { const window = this.currentWindow(); - return `gh aw logs --json -c ${count} --start-date ${window.startDate} --timeout ${this.logsTimeout}`; + const workflowPart = this.selectedWorkflowFilter ? ` ${this.selectedWorkflowFilter}` : ""; + return `gh aw logs --json -c ${count}${workflowPart} --start-date ${window.startDate} --timeout ${this.logsTimeout}`; }, buildMaintenanceCommand(action) { diff --git a/.github/extensions/agentic-workflows-dashboard/web/app.js b/.github/extensions/agentic-workflows-dashboard/web/app.js index c96d64faf97..0a59ddfcc7b 100644 --- a/.github/extensions/agentic-workflows-dashboard/web/app.js +++ b/.github/extensions/agentic-workflows-dashboard/web/app.js @@ -3309,9 +3309,9 @@ var dashboardTabs = [ { id: "commands", label: "Commands" } ]; var reportWindows = [ - { id: "3d", label: "3 days", startDate: "-3d" }, - { id: "7d", label: "7 days", startDate: "-1w" }, - { id: "1mo", label: "1 month", startDate: "-1mo" } + { id: "3d", label: "3 days", startDate: "-3d", days: 3 }, + { id: "7d", label: "7 days", startDate: "-1w", days: 7 }, + { id: "1mo", label: "1 month", startDate: "-1mo", days: 30 } ]; var DEFAULT_LOGS_COMMAND_COUNT = 25; function cliSourceLabel(cliStatus) { @@ -3394,6 +3394,7 @@ module_default.data("dashboardApp", () => ({ reportWindows, activeTab: "definitions", selectedWindow: "7d", + selectedWorkflowFilter: "", logsTimeout: 1, pageSize: 20, cliStatus: null, @@ -3433,7 +3434,7 @@ module_default.data("dashboardApp", () => ({ this.commandInput = this.buildLogsCommand(); await this.fetchCliStatus(); if (this.cliStatus?.available) { - await Promise.all([this.fetchDefinitions(), this.fetchRuns(), this.fetchUsage(), this.fetchExperiments()]); + await Promise.all([this.fetchDefinitions(), this.fetchUsage(), this.fetchExperiments()]); this.commandOutput = `$ ${this.cliStatus.command} gh aw version ${this.cliStatus.version}`; return; @@ -3455,6 +3456,12 @@ gh aw version ${this.cliStatus.version}`; if (!this.cliStatus?.available) return; await Promise.all([this.fetchRuns(), this.fetchUsage()]); }, + async selectWorkflowFilter(workflowName) { + this.selectedWorkflowFilter = workflowName; + this.commandInput = this.buildLogsCommand(); + if (!this.cliStatus?.available) return; + await this.fetchRuns(); + }, async fetchCliStatus() { this.loadingCliStatus = true; this.errorCliStatus = ""; @@ -3480,6 +3487,13 @@ gh aw version ${this.cliStatus.version}`; } }, async fetchRuns() { + if (!this.selectedWorkflowFilter) { + this.runs = []; + this.runsMeta = null; + this.selectedRun = null; + this.loadRunPage(1); + return; + } this.loadingRuns = true; this.errorRuns = ""; try { @@ -3487,7 +3501,8 @@ gh aw version ${this.cliStatus.version}`; const params = new URLSearchParams({ count: "100", window: this.selectedWindow, - timeout: String(this.logsTimeout) + timeout: String(this.logsTimeout), + workflow_name: this.selectedWorkflowFilter }); const data2 = await fetchJson(`/api/runs?${params.toString()}`); this.runsMeta = data2; @@ -3620,7 +3635,8 @@ gh aw version ${this.cliStatus.version}`; }, buildLogsCommand(count = DEFAULT_LOGS_COMMAND_COUNT) { const window2 = this.currentWindow(); - return `gh aw logs --json -c ${count} --start-date ${window2.startDate} --timeout ${this.logsTimeout}`; + const workflowPart = this.selectedWorkflowFilter ? ` ${this.selectedWorkflowFilter}` : ""; + return `gh aw logs --json -c ${count}${workflowPart} --start-date ${window2.startDate} --timeout ${this.logsTimeout}`; }, buildMaintenanceCommand(action) { if (action === "check-update") return "gh aw status --json"; diff --git a/.github/extensions/agentic-workflows-dashboard/web/index.html b/.github/extensions/agentic-workflows-dashboard/web/index.html index 1aa30f847f0..423abe16532 100644 --- a/.github/extensions/agentic-workflows-dashboard/web/index.html +++ b/.github/extensions/agentic-workflows-dashboard/web/index.html @@ -112,9 +112,27 @@

Workflow definitions
-
+

Workflow runs

- +
+ + +
+
+ +
+
Select a workflow above to load its runs.
+
Filtering by workflow avoids downloading logs for all workflows at once.
@@ -142,13 +160,12 @@

Workflow runs

-
+