import assert from "node:assert/strict"; import { readFileSync } from "node:fs"; import test from "node:test"; import { agentExecutionReceiptSchema } from "../src/lib/consultation-agent-events.ts"; import { displayTechniqueAuditLabel, displayTechniqueAuditNote, normalizeTechniqueAuditRows, resolveTechniqueAuditRows, splitSpokenAnswerAndTechniqueAudit, techniqueAuditStatusLabel, } from "../src/lib/consultation-technique-audit.ts"; const disclosureSource = readFileSync(new URL("../src/components/technique-audit-disclosure.tsx", import.meta.url), "utf8"); const contentSource = readFileSync(new URL("../src/components/chat-message-content.tsx", import.meta.url), "utf8"); const toolsSource = readFileSync(new URL("../src/mastra/consultation-tools.ts", import.meta.url), "utf8"); const routeSource = readFileSync(new URL("../src/app/api/consult/route.ts", import.meta.url), "utf8"); const globalStyles = readFileSync(new URL("../src/app/globals.css", import.meta.url), "utf8"); const spoken = [ "今天适合推进沟通,不适合拍板承诺。", "", "| 适合推进 | 需要避开 |", "|---|---|", "| 汇报、提案、写作 | 冲动承诺、夸大其词 |", "", "给一个现在就能做的行动。", ].join("\n"); const auditTable = [ "| 技法 | 状态 | 说明 |", "|---|---|---|", "| VedAstro 云状态 | 阻塞 | 未经核验的官方云证据,置信度封顶 |", "| 功能吉凶星 | 已执行 | 功能属性与自然属性冲突时降置信 |", "| 问卦盘(Prashna) | 不适用 | 本轮为本命咨询 |", ].join("\n"); test("a complete technique audit table stays in the spoken body and is also parsed for the folded copy", () => { const full = `${spoken}\n\n${auditTable}`; const split = splitSpokenAnswerAndTechniqueAudit(full); assert.equal(split.complete, true); assert.equal(split.spoken, full); assert.equal(split.spoken.includes("适合推进"), true); assert.equal(split.spoken.includes("技法"), true); assert.deepEqual(split.rows, [ { technique: "VedAstro 云状态", status: "blocked", note: "未经核验的官方云证据,置信度封顶" }, { technique: "功能吉凶星", status: "executed", note: "功能属性与自然属性冲突时降置信" }, { technique: "问卦盘(Prashna)", status: "not_applicable", note: "本轮为本命咨询" }, ]); }); test("an incomplete streaming audit table is hidden rather than shown as pipes", () => { const split = splitSpokenAnswerAndTechniqueAudit(`${spoken}\n\n| 技法 | 状态 | 说明 |\n|---|---|---|\n| VedAstro 云状态 | 阻塞 |`); assert.equal(split.complete, false); assert.equal(split.spoken, spoken); assert.deepEqual(split.rows, []); }); test("delivered receipt rows fill the folded table when the spoken answer has no dump", () => { const delivered = normalizeTechniqueAuditRows([ { technique: "VedAstro Cloud State", status: "blocked", boundary: "confidence_capped_without_verified_official_cloud" }, { technique: "Formal Vargas D1–D60", status: "executed", boundary: "20/20 named traditional charts; remaining D-N are separate" }, { technique: "Western transits", status: "used", note: "layer_not_materialized" }, ]); assert.deepEqual(delivered, [ { technique: "VedAstro Cloud State", status: "blocked", note: "confidence_capped_without_verified_official_cloud" }, { technique: "Formal Vargas D1–D60", status: "executed", note: "20/20 named traditional charts; remaining D-N are separate" }, { technique: "Western transits", status: "executed", note: "layer_not_materialized" }, ]); assert.equal(displayTechniqueAuditLabel("VedAstro Cloud State"), "VedAstro 云状态"); assert.equal(displayTechniqueAuditLabel("Western transits"), "西洋行运"); assert.equal(displayTechniqueAuditNote("confidence_capped_without_verified_official_cloud"), "未经核验的官方云证据,置信度封顶"); assert.equal(displayTechniqueAuditNote("20/20 named traditional charts; remaining D-N are separate"), "20/20 传统命名分盘"); assert.equal(displayTechniqueAuditNote("layer_not_materialized"), "本层未物化"); assert.equal(displayTechniqueAuditNote("unmapped_machine_key"), ""); assert.equal(techniqueAuditStatusLabel("blocked"), "阻塞"); const split = splitSpokenAnswerAndTechniqueAudit(spoken); assert.deepEqual(resolveTechniqueAuditRows(split, delivered), delivered); }); test("the public receipt may carry the audit rows and still rejects internal diagnostics", () => { const receipt = agentExecutionReceiptSchema.parse({ runId: "run", runtime: "mastra-agentic", skill: { name: "jyotish-vedic-astrology", loaded: true, referenceReads: 0, methodologySections: 0 }, steps: [{ sequence: 1, kind: "skill", name: "jyotish-vedic-astrology", status: "completed" }], workflow: { route: "timing", status: "ready", preciseTiming: "allowed", missingLayers: [] }, techniqueAuditTable: [ { technique: "Narayana Dasha", status: "executed", note: "本轮无独立当前读数" }, ], }); assert.equal(receipt.techniqueAuditTable?.[0]?.technique, "Narayana Dasha"); assert.throws(() => agentExecutionReceiptSchema.parse({ ...receipt, techniqueAuditTable: [{ technique: "Narayana Dasha", status: "used" }], })); }); test("the folded audit control stays closed and never remounts the internal panel", () => { assert.match(disclosureSource, /
/); assert.doesNotMatch(disclosureSource, /]*\sopen/); assert.doesNotMatch(disclosureSource, /EvidenceAuditPanel/); assert.doesNotMatch(disclosureSource, /techniqueTruth|workflowReceipt|rawReceipt/); assert.match(contentSource, /splitSpokenAnswerAndTechniqueAudit/); assert.match(contentSource, /TechniqueAuditDisclosure/); assert.match(toolsSource, /ctx\.state\.techniqueAuditTable = normalizeTechniqueAuditRows/); assert.match(routeSource, /techniqueAuditTable: state\.techniqueAuditTable/); assert.match(globalStyles, /\.markdown-table/); assert.match(globalStyles, /\.technique-audit >/); assert.match(globalStyles, /\.markdown-table th,/); });