Menu
popagent
publicLatest change 81b1cb620a6e0b4e696cfbf27e6bf93be875f4a9 - Mark the calling task in companyStatus so reports do not read themselves as a failing duplicate by AkurAI Build
import { describe, expect, test } from "bun:test";
import { createCompanyStatusTool } from "./company-status";
import type { AgentTask } from "../api-types";
const task = (overrides: Partial<AgentTask>): AgentTask => ({
id: "t", sessionId: null, scheduleId: null, source: "user", workspaceId: "default", prompt: "Prepare report",
model: "policy/routing", status: "completed", output: "## Report\n" + "x".repeat(600), error: null, stepsCompleted: 3,
progress: "Completed", workflow: null, recoveryCount: 0, attemptCount: 1, maxAttempts: 3, nextAttemptAt: null,
lastErrorClass: null, deadLetteredAt: null, heartbeatAt: null, createdAt: new Date(Date.now() - 3_600_000).toISOString(),
startedAt: null, completedAt: new Date().toISOString(), activity: [], ...overrides,
} as AgentTask);
describe("companyStatus", () => {
test("returns a bounded, grouped snapshot of tasks, attention, schedules, automation, and signals", async () => {
const old = new Date(Date.now() - 72 * 3_600_000).toISOString();
const tool = createCompanyStatusTool({
workspaces: async () => [{ id: "default", name: "popagent", repositoryPath: "popagent", createdAt: "", updatedAt: "" }],
tasks: async () => [
task({ id: "done" }),
task({ id: "stale", createdAt: old, completedAt: old }),
task({ id: "dead", status: "dead-letter", error: "boom", lastErrorClass: "provider", createdAt: old, completedAt: old }),
task({ id: "live", status: "running", createdAt: old, completedAt: null, error: "[429] usage limit", lastErrorClass: "rate-limit" }),
],
schedules: async () => [{ id: "s", sessionId: null, workspaceId: "default", source: "user", name: "Daily", prompt: "p", model: "policy/routing", maxAttempts: 3, cron: "0 10 * * *", timezone: "UTC", enabled: true, followUps: false, nextRunAt: null, lastRunAt: null, createdAt: "", updatedAt: "", latestTaskStatus: "completed" }],
automation: async () => ({ state: "paused", selectedWorkspaceIds: [], activeTask: null }),
signals: async () => [{ id: "sig", sessionId: null, turnId: null, traceId: null, agentId: "orchistrator", workspaceId: "default", kind: "turn-success", summary: "ok", status: "applied", attempts: 1, createdAt: new Date().toISOString() } as never],
});
const result = await tool.execute!({ sinceHours: 24, includeOutputs: true, maxTasks: 60 }, { abortSignal: AbortSignal.timeout(5_000), requestContext: new Map([["popagent.taskId", "live"]]) } as never) as unknown as {
taskCounts: Record<string, number>; tasks: Array<{ id: string; output?: string }>; needsAttention: Array<{ id: string }>;
schedules: Array<Record<string, unknown>>; automation: { state: string }; signals: unknown[]; truncated: boolean;
};
expect(result.taskCounts).toEqual({ completed: 1, running: 1 });
expect(result.tasks.map((item) => item.id)).toEqual(["done", "live"]);
expect(result.tasks[1]).toMatchObject({ current: true, error: null, errorClass: null });
expect(String(result.tasks[0]!.output)).toHaveLength(401);
expect(result.needsAttention.map((item) => item.id)).toEqual(["dead"]);
expect(result.schedules[0]).toMatchObject({ name: "Daily", latestTaskStatus: "completed" });
expect(result.automation.state).toBe("paused");
expect(result.signals).toHaveLength(1);
expect(result.truncated).toBe(false);
});
});