import assert from "node:assert/strict"; import test from "node:test"; import { Agent } from "@mastra/core/agent"; import { createPersonalReportAgent } from "../src/mastra/personal-report.ts"; const model = { specificationVersion: "v2", provider: "telemetry-test", modelId: "telemetry-test", } as never; function testModel() { return { id: "telemetry-test", label: "Telemetry test", description: "Telemetry test", creditCost: 0, isDefault: false, mode: "openai" as const, model, }; } test("personal report telemetry records each truncated attempt without private payloads", async () => { const originalGenerate = Agent.prototype.generate; const originalInfo = console.info; const logs: unknown[][] = []; let calls = 0; Agent.prototype.generate = (async function () { calls += 1; return { object: {}, usage: Promise.resolve({ inputTokens: 11, outputTokens: 3, totalTokens: 14 }), finishReason: Promise.resolve("length"), }; }) as never; console.info = (...args: unknown[]) => logs.push(args); try { const agent = createPersonalReportAgent(testModel()); await assert.rejects(agent.generate({} as never, {} as never)); } finally { Agent.prototype.generate = originalGenerate; console.info = originalInfo; } assert.equal(calls, 2); const telemetry = logs .filter(([label]) => label === "[personal-report-agent]") .map(([, payload]) => JSON.parse(String(payload)) as Record); assert.equal(telemetry.length, 2); assert.deepEqual(telemetry.map((entry) => entry.finishReason), ["length", "length"]); assert.deepEqual(telemetry.map((entry) => entry.repairAttempted), [false, true]); assert.deepEqual(telemetry.map((entry) => entry.outputTokens), [3, 3]); assert.equal("prompt" in telemetry[0], false); assert.equal("bundle" in telemetry[0], false); assert.equal("report" in telemetry[0], false); }); test("telemetry carries interpretive and knowledge-pack sizes as numbers only", async () => { const originalGenerate = Agent.prototype.generate; const originalInfo = console.info; const logs: unknown[][] = []; Agent.prototype.generate = (async function () { return { object: {}, usage: Promise.resolve({ inputTokens: 11, outputTokens: 3, totalTokens: 14 }), finishReason: Promise.resolve("length"), }; }) as never; console.info = (...args: unknown[]) => logs.push(args); try { const agent = createPersonalReportAgent(testModel()); await assert.rejects(agent.generateSection!( { interpretiveFacts: { yogas: [{}, {}], functionalRoles: [{}], shadbalaRanking: [], savScores: [{}], convergenceDomains: [], currentDasha: {}, savTotal: 337 } } as never, { id: "theme-wealth", kind: "thematic", theme: "wealth", disposition: "write", evidenceRefs: [], targetCharacters: { min: 1, max: 2 } } as never, [], )); } finally { Agent.prototype.generate = originalGenerate; console.info = originalInfo; } const telemetry = logs .filter(([label]) => label === "[personal-report-agent]") .map(([, payload]) => JSON.parse(String(payload)) as Record); assert.ok(telemetry.length >= 1); assert.equal(telemetry[0].interpretiveFactCount, 6); assert.equal(typeof telemetry[0].knowledgePackCharacters, "number"); assert.ok((telemetry[0].knowledgePackCharacters as number) > 500); // The metrics are sizes, not payloads: no seed text or fact text may appear. const serialized = JSON.stringify(telemetry[0]); assert.ok(!serialized.includes("хол")); assert.ok(!serialized.includes("yogakaraka")); });