1import { describe, expect, it } from "vite-plus/test";
2
3import { sanitizeAcpStderrExcerpt } from "./stderr.ts";
4
5describe("AcpStderr", () => {
6 it("redacts home paths, pairing URLs, and tokens from stderr excerpts", () => {
7 const excerpt = sanitizeAcpStderrExcerpt(
8 [
9 "Invalid project config at /Users/ada/.cursor/cli.json",
10 "Authorization: Bearer secret-token-value",
11 "Sign in: https://accounts.google.com/o/oauth2/v2/auth?state=oauth-state-value",
12 "Visit http://localhost:5733/pair#token=ABCDEF for pairing",
13 "key=sk-abcdefghijklmnopqrstuv",
14 ].join("\n"),
15 "/home/server",
16 { HOME: "/Users/ada" },
17 );
18
19 expect(excerpt).toContain("Invalid project config at ~/.cursor/cli.json");
20 expect(excerpt).toContain("Bearer [redacted]");
21 expect(excerpt).toContain("[pairing-url]");
22 expect(excerpt).toContain("[redacted]");
23 expect(excerpt).not.toContain("secret-token-value");
24 expect(excerpt).not.toContain("ABCDEF");
25 expect(excerpt).toContain("[sign-in-url]");
26 expect(excerpt).not.toContain("oauth-state-value");
27 expect(excerpt).not.toContain("sk-abcdefghijklmnopqrstuv");
28 });
29
30 it("redacts hyphenated OpenAI project keys and header credentials", () => {
31 const excerpt = sanitizeAcpStderrExcerpt(
32 [
33 "openai=sk-proj-abcdefghijklmnopqrstuvwxyz012345",
34 "svc=sk-svcacct-abcdefghijklmnopqrstuvwxyz012345",
35 "anthropic=sk-ant-api03-abcdefghijklmnopqrstuvwxyz012345",
36 "Authorization: Basic dXNlcjpwYXNz",
37 "x-api-key: ant-api-key-value",
38 ].join("\n"),
39 "/Users/ada",
40 {},
41 );
42
43 expect(excerpt).toContain("[redacted]");
44 expect(excerpt).toContain("Authorization: Basic [redacted]");
45 expect(excerpt).toContain("x-api-key: [redacted]");
46 expect(excerpt).not.toContain("sk-proj-");
47 expect(excerpt).not.toContain("sk-svcacct-");
48 expect(excerpt).not.toContain("sk-ant-api03-");
49 expect(excerpt).not.toContain("abcdefghijklmnopqrstuvwxyz012345");
50 expect(excerpt).not.toContain("dXNlcjpwYXNz");
51 expect(excerpt).not.toContain("ant-api-key-value");
52 });
53
54 it("redacts the whole key when its body contains underscores", () => {
55 const excerpt = sanitizeAcpStderrExcerpt(
56 [
57 "anthropic=sk-ant-api03-AbCdEf_GhIjKlMnOpQr-StUvWx_yz0123456789-AA",
58 "openai=sk-proj-AbCdEfGhIj_KlMnOpQrStUv-WxYz_0123456789",
59 ].join("\n"),
60 "/Users/ada",
61 {},
62 );
63
64 expect(excerpt).toBe("anthropic=[redacted]\nopenai=[redacted]");
65 });
66});