From 27bbbe79df77e6a47b9c1cc0bae83169bc367d45 Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Thu, 5 Feb 2026 12:31:07 -0600 Subject: [PATCH] feat(#233): Connect agent dashboard to real orchestrator API - Add GET /agents endpoint to orchestrator controller - Update AgentStatusWidget to fetch from real API instead of mock data - Add comprehensive tests for listAgents endpoint - Auto-refresh agent list every 30 seconds - Display agent status with proper icons and formatting - Show error states when API is unavailable Fixes #233 Co-Authored-By: Claude Sonnet 4.5 --- .../src/api/agents/agents.controller.spec.ts | 107 ++++++++++++ .../src/api/agents/agents.controller.ts | 41 +++++ .../components/widgets/AgentStatusWidget.tsx | 160 +++++++++++------- .../__tests__/AgentStatusWidget.test.tsx | 153 +++++++++++++++++ ...c.ts_20260205-1225_1_remediation_needed.md | 20 +++ ...c.ts_20260205-1225_2_remediation_needed.md | 20 +++ ...c.ts_20260205-1225_3_remediation_needed.md | 20 +++ ...c.ts_20260205-1227_1_remediation_needed.md | 20 +++ ...c.ts_20260205-1228_1_remediation_needed.md | 20 +++ ...c.ts_20260205-1228_2_remediation_needed.md | 20 +++ ...c.ts_20260205-1228_3_remediation_needed.md | 20 +++ ...r.ts_20260205-1225_1_remediation_needed.md | 20 +++ ...r.ts_20260205-1227_1_remediation_needed.md | 20 +++ ...r.ts_20260205-1227_2_remediation_needed.md | 20 +++ ...r.ts_20260205-1228_1_remediation_needed.md | 20 +++ ....tsx_20260205-1226_1_remediation_needed.md | 20 +++ ....tsx_20260205-1226_2_remediation_needed.md | 20 +++ ....tsx_20260205-1226_3_remediation_needed.md | 20 +++ ....tsx_20260205-1226_4_remediation_needed.md | 20 +++ ....tsx_20260205-1227_1_remediation_needed.md | 20 +++ ....tsx_20260205-1229_1_remediation_needed.md | 20 +++ ....tsx_20260205-1227_1_remediation_needed.md | 20 +++ ....tsx_20260205-1230_1_remediation_needed.md | 20 +++ ....tsx_20260205-1231_1_remediation_needed.md | 20 +++ 24 files changed, 800 insertions(+), 61 deletions(-) create mode 100644 apps/web/src/components/widgets/__tests__/AgentStatusWidget.test.tsx create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1225_1_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1225_2_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1225_3_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1227_1_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1228_1_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1228_2_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1228_3_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1225_1_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1227_1_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1227_2_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1228_1_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_1_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_2_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_3_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_4_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1227_1_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1229_1_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-__tests__-AgentStatusWidget.test.tsx_20260205-1227_1_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-__tests__-AgentStatusWidget.test.tsx_20260205-1230_1_remediation_needed.md create mode 100644 docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-__tests__-AgentStatusWidget.test.tsx_20260205-1231_1_remediation_needed.md diff --git a/apps/orchestrator/src/api/agents/agents.controller.spec.ts b/apps/orchestrator/src/api/agents/agents.controller.spec.ts index 1cb00fc..bd4d7ad 100644 --- a/apps/orchestrator/src/api/agents/agents.controller.spec.ts +++ b/apps/orchestrator/src/api/agents/agents.controller.spec.ts @@ -13,6 +13,8 @@ describe("AgentsController", () => { }; let spawnerService: { spawnAgent: ReturnType; + listAgentSessions: ReturnType; + getAgentSession: ReturnType; }; let lifecycleService: { getAgentLifecycleState: ReturnType; @@ -30,6 +32,8 @@ describe("AgentsController", () => { spawnerService = { spawnAgent: vi.fn(), + listAgentSessions: vi.fn(), + getAgentSession: vi.fn(), }; lifecycleService = { @@ -58,6 +62,109 @@ describe("AgentsController", () => { expect(controller).toBeDefined(); }); + describe("listAgents", () => { + it("should return empty array when no agents exist", () => { + // Arrange + spawnerService.listAgentSessions.mockReturnValue([]); + + // Act + const result = controller.listAgents(); + + // Assert + expect(spawnerService.listAgentSessions).toHaveBeenCalled(); + expect(result).toEqual([]); + }); + + it("should return all agent sessions with mapped status", () => { + // Arrange + const sessions = [ + { + agentId: "agent-1", + taskId: "task-1", + agentType: "worker" as const, + state: "running" as const, + context: { + repository: "repo", + branch: "main", + workItems: [], + }, + spawnedAt: new Date("2026-02-05T12:00:00Z"), + }, + { + agentId: "agent-2", + taskId: "task-2", + agentType: "reviewer" as const, + state: "completed" as const, + context: { + repository: "repo", + branch: "main", + workItems: [], + }, + spawnedAt: new Date("2026-02-05T11:00:00Z"), + completedAt: new Date("2026-02-05T11:30:00Z"), + }, + { + agentId: "agent-3", + taskId: "task-3", + agentType: "tester" as const, + state: "failed" as const, + context: { + repository: "repo", + branch: "main", + workItems: [], + }, + spawnedAt: new Date("2026-02-05T10:00:00Z"), + error: "Test execution failed", + }, + ]; + spawnerService.listAgentSessions.mockReturnValue(sessions); + + // Act + const result = controller.listAgents(); + + // Assert + expect(spawnerService.listAgentSessions).toHaveBeenCalled(); + expect(result).toHaveLength(3); + expect(result[0]).toEqual({ + agentId: "agent-1", + taskId: "task-1", + status: "running", + agentType: "worker", + spawnedAt: "2026-02-05T12:00:00.000Z", + completedAt: undefined, + error: undefined, + }); + expect(result[1]).toEqual({ + agentId: "agent-2", + taskId: "task-2", + status: "completed", + agentType: "reviewer", + spawnedAt: "2026-02-05T11:00:00.000Z", + completedAt: "2026-02-05T11:30:00.000Z", + error: undefined, + }); + expect(result[2]).toEqual({ + agentId: "agent-3", + taskId: "task-3", + status: "failed", + agentType: "tester", + spawnedAt: "2026-02-05T10:00:00.000Z", + completedAt: undefined, + error: "Test execution failed", + }); + }); + + it("should handle errors gracefully", () => { + // Arrange + spawnerService.listAgentSessions.mockImplementation(() => { + throw new Error("Service unavailable"); + }); + + // Act & Assert + expect(() => controller.listAgents()).toThrow("Failed to list agents: Service unavailable"); + }); + }); + describe("spawn", () => { const validRequest = { taskId: "task-123", diff --git a/apps/orchestrator/src/api/agents/agents.controller.ts b/apps/orchestrator/src/api/agents/agents.controller.ts index 17db768..d8b74e5 100644 --- a/apps/orchestrator/src/api/agents/agents.controller.ts +++ b/apps/orchestrator/src/api/agents/agents.controller.ts @@ -70,6 +70,47 @@ export class AgentsController { } } + /** + * List all agents + * @returns Array of all agent sessions with their status + */ + @Get() + listAgents(): { + agentId: string; + taskId: string; + status: string; + agentType: string; + spawnedAt: string; + completedAt?: string; + error?: string; + }[] { + this.logger.log("Received request to list all agents"); + + try { + // Get all sessions from spawner service + const sessions = this.spawnerService.listAgentSessions(); + + // Map to response format + const agents = sessions.map((session) => ({ + agentId: session.agentId, + taskId: session.taskId, + status: session.state, + agentType: session.agentType, + spawnedAt: session.spawnedAt.toISOString(), + completedAt: session.completedAt?.toISOString(), + error: session.error, + })); + + this.logger.log(`Found ${agents.length.toString()} agents`); + + return agents; + } catch (error: unknown) { + const errorMessage = error instanceof Error ? error.message : String(error); + this.logger.error(`Failed to list agents: ${errorMessage}`); + throw new Error(`Failed to list agents: ${errorMessage}`); + } + } + /** * Get agent status * @param agentId Agent ID to query diff --git a/apps/web/src/components/widgets/AgentStatusWidget.tsx b/apps/web/src/components/widgets/AgentStatusWidget.tsx index c62b238..87c551e 100644 --- a/apps/web/src/components/widgets/AgentStatusWidget.tsx +++ b/apps/web/src/components/widgets/AgentStatusWidget.tsx @@ -7,76 +7,103 @@ import { Bot, Activity, AlertCircle, CheckCircle, Clock } from "lucide-react"; import type { WidgetProps } from "@mosaic/shared"; interface Agent { - id: string; - name: string; - status: "IDLE" | "WORKING" | "WAITING" | "ERROR" | "TERMINATED"; - currentTask?: string; - lastHeartbeat: string; - taskCount: number; + agentId: string; + taskId: string; + status: string; + agentType: string; + spawnedAt: string; + completedAt?: string; + error?: string; } export function AgentStatusWidget({ id: _id, config: _config }: WidgetProps): React.JSX.Element { const [agents, setAgents] = useState([]); const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); - // Mock data for now - will fetch from API later + // Fetch agents from orchestrator API useEffect(() => { - setIsLoading(true); - setTimeout(() => { - setAgents([ - { - id: "1", - name: "Code Review Agent", - status: "WORKING", - currentTask: "Reviewing PR #123", - lastHeartbeat: new Date().toISOString(), - taskCount: 42, - }, - { - id: "2", - name: "Documentation Agent", - status: "IDLE", - lastHeartbeat: new Date().toISOString(), - taskCount: 15, - }, - { - id: "3", - name: "Test Runner Agent", - status: "ERROR", - currentTask: "Failed to run tests", - lastHeartbeat: new Date(Date.now() - 300000).toISOString(), - taskCount: 28, - }, - ]); - setIsLoading(false); - }, 500); + const fetchAgents = async (): Promise => { + setIsLoading(true); + setError(null); + + try { + // Get orchestrator URL from environment or default to localhost + const orchestratorUrl = process.env.NEXT_PUBLIC_ORCHESTRATOR_URL ?? "http://localhost:8001"; + + const response = await fetch(`${orchestratorUrl}/agents`, { + headers: { + "Content-Type": "application/json", + }, + }); + + if (!response.ok) { + throw new Error(`Failed to fetch agents: ${response.statusText}`); + } + + const data = (await response.json()) as Agent[]; + setAgents(data); + } catch (err: unknown) { + const errorMessage = err instanceof Error ? err.message : "Unknown error"; + console.error("Failed to fetch agents:", errorMessage); + setError(errorMessage); + setAgents([]); // Clear agents on error + } finally { + setIsLoading(false); + } + }; + + void fetchAgents(); + + // Refresh every 30 seconds + const interval = setInterval(() => { + void fetchAgents(); + }, 30000); + + return (): void => { + clearInterval(interval); + }; }, []); - const getStatusIcon = (status: Agent["status"]): React.JSX.Element => { - switch (status) { - case "WORKING": + const getStatusIcon = (status: string): React.JSX.Element => { + const statusLower = status.toLowerCase(); + switch (statusLower) { + case "running": + case "working": return ; - case "IDLE": - return ; - case "WAITING": + case "spawning": + case "queued": return ; - case "ERROR": + case "completed": + return ; + case "failed": + case "error": return ; - case "TERMINATED": + case "terminated": + case "killed": return ; default: return ; } }; - const getStatusText = (status: Agent["status"]): string => { + const getStatusText = (status: string): string => { return status.charAt(0).toUpperCase() + status.slice(1).toLowerCase(); }; - const getTimeSinceLastHeartbeat = (timestamp: string): string => { + const getAgentName = (agent: Agent): string => { + const typeMap: Record = { + worker: "Worker Agent", + reviewer: "Code Review Agent", + tester: "Test Runner Agent", + }; + return typeMap[agent.agentType] ?? `${getStatusText(agent.agentType)} Agent`; + }; + + const getTimeSinceSpawn = (timestamp: string): string => { const now = new Date(); - const last = new Date(timestamp); - const diffMs = now.getTime() - last.getTime(); + const spawned = new Date(timestamp); + const diffMs = now.getTime() - spawned.getTime(); if (diffMs < 60000) return "Just now"; if (diffMs < 3600000) return `${String(Math.floor(diffMs / 60000))}m ago`; @@ -86,9 +113,9 @@ export function AgentStatusWidget({ id: _id, config: _config }: WidgetProps): Re const stats = { total: agents.length, - working: agents.filter((a) => a.status === "WORKING").length, - idle: agents.filter((a) => a.status === "IDLE").length, - error: agents.filter((a) => a.status === "ERROR").length, + working: agents.filter((a) => a.status.toLowerCase() === "running").length, + idle: agents.filter((a) => a.status.toLowerCase() === "spawning").length, + error: agents.filter((a) => a.status.toLowerCase() === "failed").length, }; if (isLoading) { @@ -99,6 +126,17 @@ export function AgentStatusWidget({ id: _id, config: _config }: WidgetProps): Re ); } + if (error) { + return ( +
+
+ + {error} +
+
+ ); + } + return (
{/* Summary stats */} @@ -124,15 +162,15 @@ export function AgentStatusWidget({ id: _id, config: _config }: WidgetProps): Re {/* Agent list */}
{agents.length === 0 ? ( -
No agents configured
+
No agents running
) : ( agents.map((agent) => (
- {agent.name} + {getAgentName(agent)}
{getStatusIcon(agent.status)} @@ -148,13 +186,13 @@ export function AgentStatusWidget({ id: _id, config: _config }: WidgetProps): Re
- {agent.currentTask && ( -
{agent.currentTask}
- )} +
Task: {agent.taskId}
+ + {agent.error &&
{agent.error}
}
- {agent.taskCount} tasks completed - {getTimeSinceLastHeartbeat(agent.lastHeartbeat)} + Agent ID: {agent.agentId.slice(0, 8)}... + {getTimeSinceSpawn(agent.spawnedAt)}
)) diff --git a/apps/web/src/components/widgets/__tests__/AgentStatusWidget.test.tsx b/apps/web/src/components/widgets/__tests__/AgentStatusWidget.test.tsx new file mode 100644 index 0000000..c1d7b15 --- /dev/null +++ b/apps/web/src/components/widgets/__tests__/AgentStatusWidget.test.tsx @@ -0,0 +1,153 @@ +import { render, screen, waitFor } from "@testing-library/react"; +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import { AgentStatusWidget } from "../AgentStatusWidget"; + +describe("AgentStatusWidget", () => { + const mockFetch = vi.fn(); + + beforeEach(() => { + global.fetch = mockFetch as unknown as typeof fetch; + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + it("should render loading state initially", () => { + mockFetch.mockImplementation( + // eslint-disable-next-line @typescript-eslint/no-empty-function + () => new Promise(() => {}) // Never resolves + ); + + render(); + + expect(screen.getByText("Loading agents...")).toBeInTheDocument(); + }); + + it("should fetch and display agents from API", async () => { + const mockAgents = [ + { + agentId: "agent-1", + taskId: "task-1", + status: "running", + agentType: "worker", + spawnedAt: new Date().toISOString(), + }, + { + agentId: "agent-2", + taskId: "task-2", + status: "completed", + agentType: "reviewer", + spawnedAt: new Date().toISOString(), + completedAt: new Date().toISOString(), + }, + ]; + + mockFetch.mockResolvedValue({ + ok: true, + json: () => Promise.resolve(mockAgents), + }); + + render(); + + await waitFor(() => { + expect(screen.getByText("Worker Agent")).toBeInTheDocument(); + expect(screen.getByText("Code Review Agent")).toBeInTheDocument(); + }); + + expect(screen.getByText("Task: task-1")).toBeInTheDocument(); + expect(screen.getByText("Task: task-2")).toBeInTheDocument(); + }); + + it("should display error message when fetch fails", async () => { + mockFetch.mockResolvedValue({ + ok: false, + statusText: "Internal Server Error", + }); + + render(); + + await waitFor(() => { + expect(screen.getByText(/Failed to fetch agents: Internal Server Error/)).toBeInTheDocument(); + }); + }); + + it("should display no agents message when list is empty", async () => { + mockFetch.mockResolvedValue({ + ok: true, + json: () => Promise.resolve([]), + }); + + render(); + + await waitFor(() => { + expect(screen.getByText("No agents running")).toBeInTheDocument(); + }); + }); + + it("should display agent error messages", async () => { + const mockAgents = [ + { + agentId: "agent-1", + taskId: "task-1", + status: "failed", + agentType: "tester", + spawnedAt: new Date().toISOString(), + error: "Test execution failed", + }, + ]; + + mockFetch.mockResolvedValue({ + ok: true, + json: () => Promise.resolve(mockAgents), + }); + + render(); + + await waitFor(() => { + expect(screen.getByText("Test execution failed")).toBeInTheDocument(); + }); + }); + + it("should display correct stats summary", async () => { + const mockAgents = [ + { + agentId: "agent-1", + taskId: "task-1", + status: "running", + agentType: "worker", + spawnedAt: new Date().toISOString(), + }, + { + agentId: "agent-2", + taskId: "task-2", + status: "running", + agentType: "reviewer", + spawnedAt: new Date().toISOString(), + }, + { + agentId: "agent-3", + taskId: "task-3", + status: "failed", + agentType: "tester", + spawnedAt: new Date().toISOString(), + }, + ]; + + mockFetch.mockResolvedValue({ + ok: true, + json: () => Promise.resolve(mockAgents), + }); + + render(); + + await waitFor(() => { + // Check stats: 3 total, 2 working, 0 idle, 1 error + const stats = screen.getAllByText(/^[0-9]+$/); + expect(stats[0]).toHaveTextContent("3"); // Total + expect(stats[1]).toHaveTextContent("2"); // Working + expect(stats[2]).toHaveTextContent("0"); // Idle + expect(stats[3]).toHaveTextContent("1"); // Error + }); + }); +}); diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1225_1_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1225_1_remediation_needed.md new file mode 100644 index 0000000..e93073b --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1225_1_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/orchestrator/src/api/agents/agents.controller.spec.ts +**Tool Used:** Edit +**Epic:** general +**Iteration:** 1 +**Generated:** 2026-02-05 12:25:45 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1225_1_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1225_2_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1225_2_remediation_needed.md new file mode 100644 index 0000000..eb5f1ae --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1225_2_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/orchestrator/src/api/agents/agents.controller.spec.ts +**Tool Used:** Edit +**Epic:** general +**Iteration:** 2 +**Generated:** 2026-02-05 12:25:47 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1225_2_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1225_3_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1225_3_remediation_needed.md new file mode 100644 index 0000000..e41a361 --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1225_3_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/orchestrator/src/api/agents/agents.controller.spec.ts +**Tool Used:** Edit +**Epic:** general +**Iteration:** 3 +**Generated:** 2026-02-05 12:25:57 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1225_3_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1227_1_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1227_1_remediation_needed.md new file mode 100644 index 0000000..4c2848a --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1227_1_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/orchestrator/src/api/agents/agents.controller.spec.ts +**Tool Used:** Edit +**Epic:** general +**Iteration:** 1 +**Generated:** 2026-02-05 12:27:48 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1227_1_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1228_1_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1228_1_remediation_needed.md new file mode 100644 index 0000000..ebf7af5 --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1228_1_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/orchestrator/src/api/agents/agents.controller.spec.ts +**Tool Used:** Edit +**Epic:** general +**Iteration:** 1 +**Generated:** 2026-02-05 12:28:48 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1228_1_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1228_2_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1228_2_remediation_needed.md new file mode 100644 index 0000000..bf5b61e --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1228_2_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/orchestrator/src/api/agents/agents.controller.spec.ts +**Tool Used:** Edit +**Epic:** general +**Iteration:** 2 +**Generated:** 2026-02-05 12:28:50 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1228_2_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1228_3_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1228_3_remediation_needed.md new file mode 100644 index 0000000..d018993 --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1228_3_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/orchestrator/src/api/agents/agents.controller.spec.ts +**Tool Used:** Edit +**Epic:** general +**Iteration:** 3 +**Generated:** 2026-02-05 12:28:52 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.spec.ts_20260205-1228_3_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1225_1_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1225_1_remediation_needed.md new file mode 100644 index 0000000..32f6a38 --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1225_1_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/orchestrator/src/api/agents/agents.controller.ts +**Tool Used:** Edit +**Epic:** general +**Iteration:** 1 +**Generated:** 2026-02-05 12:25:37 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1225_1_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1227_1_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1227_1_remediation_needed.md new file mode 100644 index 0000000..ac7fe34 --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1227_1_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/orchestrator/src/api/agents/agents.controller.ts +**Tool Used:** Edit +**Epic:** general +**Iteration:** 1 +**Generated:** 2026-02-05 12:27:25 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1227_1_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1227_2_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1227_2_remediation_needed.md new file mode 100644 index 0000000..ba5ff8e --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1227_2_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/orchestrator/src/api/agents/agents.controller.ts +**Tool Used:** Edit +**Epic:** general +**Iteration:** 2 +**Generated:** 2026-02-05 12:27:27 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1227_2_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1228_1_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1228_1_remediation_needed.md new file mode 100644 index 0000000..00e6ad3 --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1228_1_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/orchestrator/src/api/agents/agents.controller.ts +**Tool Used:** Edit +**Epic:** general +**Iteration:** 1 +**Generated:** 2026-02-05 12:28:41 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-orchestrator-src-api-agents-agents.controller.ts_20260205-1228_1_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_1_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_1_remediation_needed.md new file mode 100644 index 0000000..edf51de --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_1_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/web/src/components/widgets/AgentStatusWidget.tsx +**Tool Used:** Edit +**Epic:** general +**Iteration:** 1 +**Generated:** 2026-02-05 12:26:19 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_1_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_2_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_2_remediation_needed.md new file mode 100644 index 0000000..d1bd7c3 --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_2_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/web/src/components/widgets/AgentStatusWidget.tsx +**Tool Used:** Edit +**Epic:** general +**Iteration:** 2 +**Generated:** 2026-02-05 12:26:34 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_2_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_3_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_3_remediation_needed.md new file mode 100644 index 0000000..50e4cea --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_3_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/web/src/components/widgets/AgentStatusWidget.tsx +**Tool Used:** Edit +**Epic:** general +**Iteration:** 3 +**Generated:** 2026-02-05 12:26:36 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_3_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_4_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_4_remediation_needed.md new file mode 100644 index 0000000..8a95f2d --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_4_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/web/src/components/widgets/AgentStatusWidget.tsx +**Tool Used:** Edit +**Epic:** general +**Iteration:** 4 +**Generated:** 2026-02-05 12:26:46 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1226_4_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1227_1_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1227_1_remediation_needed.md new file mode 100644 index 0000000..911d03c --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1227_1_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/web/src/components/widgets/AgentStatusWidget.tsx +**Tool Used:** Edit +**Epic:** general +**Iteration:** 1 +**Generated:** 2026-02-05 12:27:48 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1227_1_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1229_1_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1229_1_remediation_needed.md new file mode 100644 index 0000000..3ae2d91 --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1229_1_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/web/src/components/widgets/AgentStatusWidget.tsx +**Tool Used:** Edit +**Epic:** general +**Iteration:** 1 +**Generated:** 2026-02-05 12:29:51 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-AgentStatusWidget.tsx_20260205-1229_1_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-__tests__-AgentStatusWidget.test.tsx_20260205-1227_1_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-__tests__-AgentStatusWidget.test.tsx_20260205-1227_1_remediation_needed.md new file mode 100644 index 0000000..7842cab --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-__tests__-AgentStatusWidget.test.tsx_20260205-1227_1_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/web/src/components/widgets/**tests**/AgentStatusWidget.test.tsx +**Tool Used:** Write +**Epic:** general +**Iteration:** 1 +**Generated:** 2026-02-05 12:27:06 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-__tests__-AgentStatusWidget.test.tsx_20260205-1227_1_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-__tests__-AgentStatusWidget.test.tsx_20260205-1230_1_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-__tests__-AgentStatusWidget.test.tsx_20260205-1230_1_remediation_needed.md new file mode 100644 index 0000000..9ee6545 --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-__tests__-AgentStatusWidget.test.tsx_20260205-1230_1_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/web/src/components/widgets/**tests**/AgentStatusWidget.test.tsx +**Tool Used:** Write +**Epic:** general +**Iteration:** 1 +**Generated:** 2026-02-05 12:30:26 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-__tests__-AgentStatusWidget.test.tsx_20260205-1230_1_remediation_needed.md" +``` diff --git a/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-__tests__-AgentStatusWidget.test.tsx_20260205-1231_1_remediation_needed.md b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-__tests__-AgentStatusWidget.test.tsx_20260205-1231_1_remediation_needed.md new file mode 100644 index 0000000..c04fbc7 --- /dev/null +++ b/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-__tests__-AgentStatusWidget.test.tsx_20260205-1231_1_remediation_needed.md @@ -0,0 +1,20 @@ +# QA Remediation Report + +**File:** /home/localadmin/src/mosaic-stack/apps/web/src/components/widgets/**tests**/AgentStatusWidget.test.tsx +**Tool Used:** Edit +**Epic:** general +**Iteration:** 1 +**Generated:** 2026-02-05 12:31:04 + +## Status + +Pending QA validation + +## Next Steps + +This report was created by the QA automation hook. +To process this report, run: + +```bash +claude -p "Use Task tool to launch universal-qa-agent for report: /home/localadmin/src/mosaic-stack/docs/reports/qa-automation/pending/home-localadmin-src-mosaic-stack-apps-web-src-components-widgets-__tests__-AgentStatusWidget.test.tsx_20260205-1231_1_remediation_needed.md" +``` -- 2.49.1