Add Beryl Agent and harness source

This commit is contained in:
2026-09-08 20:10:03 +08:00
parent 06d72d001c
commit 47cfbcd66a
70 changed files with 12558 additions and 0 deletions
@@ -0,0 +1,80 @@
import { afterEach, describe, expect, it, vi } from "vitest";
import { act, cleanup, render, screen, waitFor } from "@testing-library/react";
import "@testing-library/jest-dom/vitest";
import { App } from "../src/App.js";
global.ResizeObserver = class { observe(){} unobserve(){} disconnect(){} };
afterEach(cleanup);
describe("App", () => {
it("renders three principal surfaces", async () => {
localStorage.clear();
const fetchMock = vi.fn(() =>
Promise.resolve({
json: () => Promise.resolve({ skills: [], sessionId: "s" }),
ok: true,
}),
);
global.fetch = fetchMock as unknown as typeof fetch;
global.EventSource = class {
close() {}
addEventListener() {}
set onmessage(_: unknown) {}
} as unknown as typeof EventSource;
render(<App />);
expect(screen.getByText("Skills Catalog")).toBeInTheDocument();
expect(screen.getByText("AGENT LOOP")).toBeInTheDocument();
expect(screen.getByText("运行阶段")).toBeInTheDocument();
expect(screen.getByText("工具任务")).toBeInTheDocument();
expect(screen.getByLabelText("消息")).toBeInTheDocument();
await waitFor(() => expect(fetchMock).toHaveBeenCalledTimes(2));
});
it("shows a completed daily report image in the conversation", async () => {
localStorage.clear();
global.fetch = vi.fn((input: RequestInfo | URL) =>
Promise.resolve({
json: () =>
Promise.resolve(
String(input).includes("/api/skills")
? { skills: [] }
: { sessionId: "session-report" },
),
ok: true,
}),
) as unknown as typeof fetch;
let reportListener: ((event: MessageEvent) => void) | undefined;
global.EventSource = class {
close() {}
set onmessage(_: unknown) {}
addEventListener(type: string, listener: EventListenerOrEventListenerObject) {
if (type === "tool.completed")
reportListener = listener as (event: MessageEvent) => void;
}
} as unknown as typeof EventSource;
render(<App />);
await waitFor(() => expect(reportListener).toBeDefined());
act(() =>
reportListener?.({
data: JSON.stringify({
eventId: "evt-report",
runId: "run-report",
sessionId: "session-report",
sequence: 1,
timestamp: new Date().toISOString(),
type: "tool.completed",
payload: {
toolName: "save_report_image",
result: { details: { reportType: "daily" } },
},
}),
} as MessageEvent),
);
const image = await screen.findByRole("img", { name: "日报图片" });
expect(image).toHaveAttribute(
"src",
"/api/sessions/session-report/reports/daily?v=evt-report",
);
});
});