forked from bai/curriculum-project-hub
48 lines
1.7 KiB
TypeScript
48 lines
1.7 KiB
TypeScript
import { describe, expect, it, vi } from "vitest";
|
|
import { createAgentSdkStderrSink } from "../../src/agent/diagnostics.js";
|
|
|
|
describe("agent SDK stderr diagnostics", () => {
|
|
it("redacts a credential split across chunks and correlates the log", () => {
|
|
const warn = vi.fn();
|
|
const sink = createAgentSdkStderrSink({
|
|
logger: { warn },
|
|
runId: "run-1",
|
|
projectId: "project-1",
|
|
sensitiveValues: ["provider-secret"],
|
|
});
|
|
|
|
sink.write("sandbox startup token=provider-");
|
|
sink.write("secret\nremaining diagnostic");
|
|
sink.flush();
|
|
|
|
const serialized = JSON.stringify(warn.mock.calls);
|
|
expect(serialized).not.toContain("provider-secret");
|
|
expect(serialized).toContain("[REDACTED]");
|
|
expect(warn).toHaveBeenCalledWith(
|
|
expect.objectContaining({ runId: "run-1", projectId: "project-1" }),
|
|
"agent SDK stderr",
|
|
);
|
|
});
|
|
|
|
it("bounds line length, line count, and an unterminated line", () => {
|
|
const warn = vi.fn();
|
|
const sink = createAgentSdkStderrSink({
|
|
logger: { warn },
|
|
runId: "run-2",
|
|
projectId: "project-2",
|
|
sensitiveValues: [],
|
|
});
|
|
|
|
sink.write(`${"x".repeat(3_000)}\n`);
|
|
sink.write(Array.from({ length: 30 }, (_, index) => `line-${index}`).join("\n"));
|
|
sink.flush();
|
|
|
|
expect(warn.mock.calls.length).toBeLessThanOrEqual(21);
|
|
const diagnostics = warn.mock.calls
|
|
.map(([bindings]) => (bindings as { sdkStderr?: string }).sdkStderr)
|
|
.filter((value): value is string => value !== undefined);
|
|
expect(diagnostics.every((value) => value.length <= 2_000)).toBe(true);
|
|
expect(warn.mock.calls.some(([, message]) => String(message).includes("limit reached"))).toBe(true);
|
|
});
|
|
});
|