/** * A2.3 / A2.4 — the fields ledger at the MCP surface (CC-2). * * The engine-level renderer is pinned in `@adeu/core`'s cc_fields_ledger * suite. What this file pins is the SURFACE: that `mode="fields"` reaches the * renderer, that `fields_offset` paginates it, and that the appendix carries * the summary without the detail lines. */ import { describe, it, expect, beforeAll, afterAll } from "vitest"; import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { ccFixtureBytes, ccGolden } from "../../core/src/test-utils.js"; import { DocumentObject, extractTextFromBuffer, bannerForDocument, } from "@adeu/core"; import { build_fields_response } from "./ledger.js"; import { build_appendix_response, build_full_document_response, } from "./response-builders.js"; let workDir: string; let fixturePath: string; function manyControls(n: number): string { let out = ""; for (let i = 1; i <= n; i++) { out += `` + `V${i}`; } return out; } async function fieldsMarkdown( bytes: Uint8Array, path: string, offset = 0, ): Promise { const buf = Buffer.from(bytes); const doc = await DocumentObject.load(buf); const raw = await extractTextFromBuffer(buf, false, false); const res: any = build_fields_response(doc, raw, path, { offset }); return res.structuredContent.markdown; } beforeAll(() => { workDir = mkdtempSync(join(tmpdir(), "adeu-cc2-")); fixturePath = join(workDir, "cc_fixture.docx"); writeFileSync(fixturePath, Buffer.from(ccFixtureBytes())); }); afterAll(() => { if (workDir) rmSync(workDir, { recursive: true, force: true }); }); describe("mode='fields' response shape", () => { it("returns the ledger as both text content and structured markdown", async () => { const buf = Buffer.from(ccFixtureBytes()); const doc = await DocumentObject.load(buf); const raw = await extractTextFromBuffer(buf, false, false); const res: any = build_fields_response(doc, raw, fixturePath, {}); expect(res.content[0].type).toBe("text"); // The File Path line is LLM-only chrome, exactly as every other mode. expect(res.content[0].text).toContain("> **File Path:**"); expect(res.content[0].text).toContain("# Fields: cc_fixture.docx"); expect(res.structuredContent.markdown.startsWith("# Fields:")).toBe(true); expect(res.structuredContent.title).toBe("cc_fixture.docx"); }); it("omits chrome under no_chrome", async () => { const buf = Buffer.from(ccFixtureBytes()); const doc = await DocumentObject.load(buf); const raw = await extractTextFromBuffer(buf, false, false); const res: any = build_fields_response(doc, raw, fixturePath, { no_chrome: true, }); expect(res.content[0].text).not.toContain("> **File Path:**"); }); }); describe("A2.3 — fields_offset pagination at the surface", () => { const bytes = () => ccFixtureBytes(undefined, manyControls(250)); it("returns CC:1-100 and points at offset 100", async () => { const md = await fieldsMarkdown(bytes(), fixturePath, 0); const cc = md.split("\n").filter((l) => l.startsWith("CC:")); expect(cc.length).toBe(100); expect(cc[0].startsWith("CC:1 ")).toBe(true); expect(cc[99].startsWith("CC:100 ")).toBe(true); expect(md.endsWith("\u2026 150 more \u2014 pass fields_offset=100 to continue.")).toBe( true, ); }); it("returns CC:101-200 and points at offset 200", async () => { const md = await fieldsMarkdown(bytes(), fixturePath, 100); const cc = md.split("\n").filter((l) => l.startsWith("CC:")); expect(cc[0].startsWith("CC:101 ")).toBe(true); expect(cc[99].startsWith("CC:200 ")).toBe(true); expect(md.endsWith("\u2026 50 more \u2014 pass fields_offset=200 to continue.")).toBe( true, ); }); it("returns CC:201-250 with no continuation", async () => { const md = await fieldsMarkdown(bytes(), fixturePath, 200); const cc = md.split("\n").filter((l) => l.startsWith("CC:")); expect(cc.length).toBe(50); expect(cc[49].startsWith("CC:250 ")).toBe(true); expect(md).not.toContain("pass fields_offset"); }); }); describe("A2.4 — appendix carries the summary, never the detail", () => { it("has a Content Controls section with the header lines only", async () => { const buf = Buffer.from(ccFixtureBytes()); const raw = await extractTextFromBuffer(buf, false, true); const res: any = build_appendix_response(raw, 1, fixturePath); const md: string = res.structuredContent.markdown; expect(md).toContain("## Content Controls"); expect(md).toContain( "Protection: none \u00b7 16 content controls \u2014 1 empty \u00b7 2 locked \u00b7 1 bound", ); expect(md).toContain('Read with mode="fields" for the full field ledger.'); // The bounded-appendix rule: FedRAMP rev4 would put 5,007 lines here. expect(md).not.toMatch(/^CC:\d/m); }); it("omits the section entirely for a plain document", async () => { const plain = "Plain paragraph."; const buf = Buffer.from(ccFixtureBytes(undefined, plain)); const raw = await extractTextFromBuffer(buf, false, true); // No controls and no protection: a plain document gains zero noise. expect(raw).not.toContain("## Content Controls"); }); }); describe("A1.9 — the banner appears exactly when warranted", () => { async function fullView(bytes: Uint8Array, name: string, no_chrome = false) { const path = join(workDir, name); writeFileSync(path, Buffer.from(bytes)); const buf = Buffer.from(bytes); const doc = await DocumentObject.load(buf); const raw = await extractTextFromBuffer(buf, false, false); const banner = no_chrome ? null : bannerForDocument(doc, ' \u00b7 read mode="fields" for the field ledger'); const res: any = build_full_document_response(raw, path, { no_chrome, fields_banner: banner, }); return res.content[0].text as string; } it("renders GOLDEN-BANNER plus the MCP hint for the fixture", async () => { const text = await fullView(ccFixtureBytes(), "banner_fixture.docx"); const line = text.split("\n").find((l) => l.startsWith("> **Protection:**"))!; // The golden plus the surface-aware hint, which the golden excludes. expect(line.startsWith(ccGolden("GOLDEN-BANNER"))).toBe(true); expect(line.endsWith('read mode="fields" for the field ledger')).toBe(true); }); it("reports forms protection", async () => { const text = await fullView(ccFixtureBytes("forms"), "banner_forms.docx"); expect(text).toContain( "> **Protection:** fill-in-forms only (enforced) \u00b7 **Fields:**", ); }); it("emits no banner at all for a plain document", async () => { const plain = "Plain paragraph."; const text = await fullView( ccFixtureBytes(undefined, plain), "banner_plain.docx", ); expect(text).not.toContain("**Protection:**"); }); it("suppresses the banner under no_chrome", async () => { // no_chrome exists so the projection can round-trip; a banner would // corrupt the artifact exactly as the File Path line would. const text = await fullView(ccFixtureBytes(), "banner_nc.docx", true); expect(text).not.toContain("**Protection:**"); expect(text).not.toContain("**File Path:**"); }); it("places the banner directly after the File Path line", async () => { const text = await fullView(ccFixtureBytes(), "banner_order.docx"); const lines = text.split("\n"); expect(lines[0].startsWith("> **File Path:**")).toBe(true); expect(lines[1].startsWith("> **Protection:**")).toBe(true); }); });