import { describe, expect, test } from "bun:test"; import { applyStreamingSubstitution, applySubstitutions, extractAndSanitize, } from "../tools/sensitive-output-placeholders.js"; describe("extractAndSanitize", () => { test("parses a valid invite_code directive and replaces raw value with placeholder", () => { const rawToken = "abc123def456"; const content = `\nhttps://t.me/bot?start=iv_${rawToken}`; const { sanitizedContent, bindings } = extractAndSanitize(content); expect(bindings).toHaveLength(1); expect(bindings[0].kind).toBe("invite_code"); expect(bindings[0].value).toBe(rawToken); expect(bindings[0].placeholder).toMatch( /^VELLUM_ASSISTANT_INVITE_CODE_[A-Z0-9]{8}$/, ); // Directive tag should be stripped expect(sanitizedContent).not.toContain(" { const content = "Some text "; const { sanitizedContent, bindings } = extractAndSanitize(content); expect(bindings).toHaveLength(0); expect(sanitizedContent).toBe(content); }); test("ignores unknown kind values", () => { const content = ''; const { sanitizedContent, bindings } = extractAndSanitize(content); expect(bindings).toHaveLength(0); expect(sanitizedContent).toBe(content); }); test("drops empty values", () => { const content = ''; const { sanitizedContent, bindings } = extractAndSanitize(content); expect(bindings).toHaveLength(0); // Directive should remain since no valid binding was extracted expect(sanitizedContent).toBe(content); }); test("deduplicates identical values into a single binding", () => { const rawToken = "token123"; const content = [ ``, ``, `Link1: https://t.me/bot?start=iv_${rawToken}`, `Link2: https://t.me/bot?start=iv_${rawToken}`, ].join("\n"); const { sanitizedContent, bindings } = extractAndSanitize(content); expect(bindings).toHaveLength(1); expect(bindings[0].value).toBe(rawToken); // Both occurrences of the raw token should be replaced with the same placeholder const placeholderCount = sanitizedContent.split(bindings[0].placeholder).length - 1; expect(placeholderCount).toBe(2); expect(sanitizedContent).not.toContain(rawToken); }); test("supports multiple distinct bindings", () => { const token1 = "firstToken123"; const token2 = "secondToken456"; const content = [ ``, ``, `Link1: https://t.me/bot?start=iv_${token1}`, `Link2: https://t.me/bot?start=iv_${token2}`, ].join("\n"); const { sanitizedContent, bindings } = extractAndSanitize(content); expect(bindings).toHaveLength(2); expect(bindings[0].value).toBe(token1); expect(bindings[1].value).toBe(token2); // Both raw tokens should be replaced expect(sanitizedContent).not.toContain(token1); expect(sanitizedContent).not.toContain(token2); expect(sanitizedContent).toContain(bindings[0].placeholder); expect(sanitizedContent).toContain(bindings[1].placeholder); }); test("returns content unchanged when no directives are present", () => { const content = "Just a normal tool output with no directives."; const { sanitizedContent, bindings } = extractAndSanitize(content); expect(bindings).toHaveLength(0); expect(sanitizedContent).toBe(content); }); test("placeholder format matches required pattern", () => { const content = ''; const { bindings } = extractAndSanitize(content); expect(bindings).toHaveLength(1); // Must be exactly: VELLUM_ASSISTANT_INVITE_CODE_ followed by 8 uppercase alphanumeric chars expect(bindings[0].placeholder).toMatch( /^VELLUM_ASSISTANT_INVITE_CODE_[A-Z0-9]{8}$/, ); }); }); describe("applySubstitutions", () => { test("replaces placeholders with real values", () => { const map = new Map([ ["VELLUM_ASSISTANT_INVITE_CODE_ABCD1234", "realtoken123"], ]); const text = "Your link: https://t.me/bot?start=iv_VELLUM_ASSISTANT_INVITE_CODE_ABCD1234"; const result = applySubstitutions(text, map); expect(result).toBe("Your link: https://t.me/bot?start=iv_realtoken123"); }); test("replaces multiple placeholders", () => { const map = new Map([ ["VELLUM_ASSISTANT_INVITE_CODE_AAAA1111", "token1"], ["VELLUM_ASSISTANT_INVITE_CODE_BBBB2222", "token2"], ]); const text = "Link1: VELLUM_ASSISTANT_INVITE_CODE_AAAA1111, Link2: VELLUM_ASSISTANT_INVITE_CODE_BBBB2222"; const result = applySubstitutions(text, map); expect(result).toBe("Link1: token1, Link2: token2"); }); test("returns text unchanged when map is empty", () => { const map = new Map(); const text = "No placeholders here."; expect(applySubstitutions(text, map)).toBe(text); }); }); describe("applyStreamingSubstitution", () => { test("resolves complete placeholders in a single chunk", () => { const map = new Map([ ["VELLUM_ASSISTANT_INVITE_CODE_ABCD1234", "realtoken"], ]); const { emit, pending } = applyStreamingSubstitution( "Your code: VELLUM_ASSISTANT_INVITE_CODE_ABCD1234 is ready.", map, ); expect(emit).toContain("realtoken"); expect(emit).not.toContain("VELLUM_ASSISTANT_INVITE_CODE_ABCD1234"); // No pending text since the placeholder was complete expect(pending).toBe(""); }); test("buffers text that could be an incomplete placeholder prefix", () => { const map = new Map([ ["VELLUM_ASSISTANT_INVITE_CODE_ABCD1234", "realtoken"], ]); // Chunk ends mid-placeholder const { emit, pending } = applyStreamingSubstitution( "Your code: VELLUM_ASSISTANT_", map, ); // The ambiguous tail should be buffered expect(pending.length).toBeGreaterThan(0); // emit should not contain the partial placeholder expect(emit).not.toContain("VELLUM_ASSISTANT_"); }); test("handles split-chunk placeholder by concatenating pending with next chunk", () => { const map = new Map([ ["VELLUM_ASSISTANT_INVITE_CODE_ABCD1234", "realtoken"], ]); // First chunk: partial placeholder const result1 = applyStreamingSubstitution("Link: VELLUM_ASSISTANT_", map); // Second chunk completes the placeholder const combined = result1.pending + "INVITE_CODE_ABCD1234 done."; const result2 = applyStreamingSubstitution(combined, map); expect(result2.emit).toContain("realtoken"); expect(result2.emit).toContain("done."); expect(result2.pending).toBe(""); }); test("returns text unchanged when map is empty", () => { const map = new Map(); const { emit, pending } = applyStreamingSubstitution("Hello world", map); expect(emit).toBe("Hello world"); expect(pending).toBe(""); }); });