Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406import { genericObservability } from "agents/observability";import assert from "node:assert/strict";import { test } from "node:test";import { DatabaseSync } from "node:sqlite";import { DiagnosticStore, diagnosticId, extensionDiagnostic, modelDiagnostic, taskDiagnostic, toolDiagnostic, validateDiagnostic,} from "../worker/diagnostics.ts";import { DIAGNOSTIC_LIMITS } from "../shared/diagnostics.ts";
const sentinel = "private-sentinel-prompt-error-key-url";const event = (overrides = {}) => ({ kind: "turn", timestamp: Date.now(), id: diagnosticId("request"), conversationId: null, requestId: diagnosticId("request"), phase: "start", status: "started", durationMs: null, details: {}, ...overrides,});function store() { const db = new DatabaseSync(":memory:"); const sql = (strings, ...values) => { const statement = db.prepare(strings.join("?")); return statement.columns().length ? statement.all(...values) : (statement.run(...values), []); }; return { db, sql, diagnostics: new DiagnosticStore(sql) };}test("strict safe schema and native projectors omit all content and ambiguous usage", () => { for (const bad of [ { ...event(), text: sentinel }, event({ details: { secret: sentinel } }), event({ id: sentinel }), event({ durationMs: Infinity }), event({ details: { model: sentinel } }), event({ details: { tool: sentinel } }), ...[sentinel, 399, 600, 401.5].map((httpStatus) => event({ details: { httpStatus } }), ), event({ details: { failureStage: sentinel } }), event({ details: { errorCategory: sentinel } }), event({ details: { cfRay: sentinel } }), ...[sentinel, 999, 10000, 2006.5].map((gatewayErrorCode) => event({ details: { gatewayErrorCode } }), ), ]) assert.throws(() => validateDiagnostic(bad)); const ctx = { callId: sentinel, stepNumber: 1, model: { provider: "workers-ai", modelId: sentinel }, runtimeContext: { "cloudflare.agents.turn.request_id": sentinel, secret: sentinel, }, text: sentinel, providerMetadata: { secret: sentinel }, usage: { inputTokens: 0, outputTokens: 7, totalTokens: 7, inputTokenDetails: { cacheReadTokens: 0, cacheWriteTokens: NaN }, outputTokenDetails: { reasoningTokens: Infinity }, raw: sentinel, }, performance: { responseTimeMs: 12, stepTimeMs: 45, timeToFirstOutputMs: 3, secret: sentinel, }, }; const model = validateDiagnostic(modelDiagnostic(ctx)); assert.equal(model.details.inputTokens, null); assert.equal(model.details.outputTokens, 7); assert.equal(model.details.cacheReadTokens, null); assert.equal(model.details.reasoningTokens, null); assert.equal(model.details.cost, null); assert.equal(model.durationMs, 12); assert.equal(model.details.stepTimeMs, 45); assert.ok(!JSON.stringify(model).includes(sentinel)); assert.equal( modelDiagnostic({ ...ctx, model: { provider: "anthropic.messages", modelId: "claude-sonnet-5" }, }).details.inputTokens, 0, ); const router = validateDiagnostic( modelDiagnostic({ ...ctx, model: { provider: "openrouter", modelId: "openai/gpt-5.6-luna" }, }), ); assert.equal(router.details.provider, "openrouter"); assert.equal(router.details.model, "openai/gpt-5.6-luna"); assert.equal(router.details.inputTokens, 0); assert.ok(!JSON.stringify(router).includes(sentinel)); const tool = validateDiagnostic( toolDiagnostic({ toolCallId: sentinel, toolName: "shell", kind: "shell", status: "failed", attempts: 2, createdAt: 1, startedAt: 10, endedAt: 20, updatedAt: 20, reason: "interrupted", inputSummary: sentinel, outputSummary: sentinel, progress: { text: sentinel }, }), ); assert.equal(tool.durationMs, 10); assert.ok(!JSON.stringify(tool).includes(sentinel)); const task = validateDiagnostic( taskDiagnostic({ id: sentinel, taskId: sentinel, conversationId: sentinel, submissionId: sentinel, source: "scheduled", status: "completed", startedAt: "2026-01-01T00:00:00Z", completedAt: "2026-01-01T00:00:05Z", instructions: sentinel, metadata: { secret: sentinel }, }), ); assert.equal(task.durationMs, null); assert.equal(task.details.claimToCompletionMs, 5000); assert.ok(!JSON.stringify(task).includes(sentinel));});test("bounded SQL retention never touches native rows, survives new instances, and revalidates export", () => { const { db, sql, diagnostics } = store(); db.exec( "CREATE TABLE native_idempotency (id TEXT); INSERT INTO native_idempotency VALUES ('keep')", ); for (let i = 0; i < 610; i++) diagnostics.record(event({ id: diagnosticId(String(i)) })); let view = diagnostics.snapshot(); assert.equal(view.events.length, DIAGNOSTIC_LIMITS.maxRows); assert.equal(view.prunedRows, 110); assert.ok( view.events.every( (e, i, all) => i === 0 || all[i - 1].sequence > e.sequence, ), ); assert.equal(new DiagnosticStore(sql).snapshot().events.length, 500); diagnostics.record( event({ timestamp: Date.now() - DIAGNOSTIC_LIMITS.maxAgeMs - 1 }), ); assert.equal(diagnostics.snapshot().prunedRows, 111); db.prepare( "UPDATE flarebot_diagnostics SET event = ? WHERE sequence = (SELECT max(sequence) FROM flarebot_diagnostics)", ).run(JSON.stringify({ ...event(), private: sentinel })); assert.equal(diagnostics.snapshot().omittedRows, 1); assert.ok(!JSON.stringify(diagnostics.snapshot()).includes(sentinel)); const generation = diagnostics.generation(); diagnostics.clear(); diagnostics.record(event(), generation); assert.equal(diagnostics.snapshot().events.length, 0); diagnostics.record(event()); assert.equal(diagnostics.snapshot().events.length, 1); assert.deepEqual( db .prepare("SELECT id FROM native_idempotency") .all() .map((r) => r.id), ["keep"], ); const detail = { provider: "workers-ai", model: "@cf/meta/llama-3.3-70b-instruct-fp8-fast", step: 1, responseTimeMs: 1, stepTimeMs: 1, timeToFirstOutputMs: 1, inputTokens: 1, outputTokens: 1, totalTokens: 2, cacheReadTokens: 1, cacheWriteTokens: 1, reasoningTokens: 1, cost: null, taskId: diagnosticId("task"), submissionId: diagnosticId("submission"), attempts: 2, tool: "createSchedule", toolKind: "schedule", source: "scheduled", claimedAt: 1, completedAt: 2, claimToCompletionMs: 1, }; for (let i = 0; i < 500; i++) diagnostics.record(event({ details: detail })); assert.ok( diagnostics.snapshot().events.length < 500, "byte cap must constrain rows too", ); assert.ok( db.prepare("SELECT sum(bytes) AS total FROM flarebot_diagnostics").get() .total <= DIAGNOSTIC_LIMITS.maxStoreBytes, ); db.close();});test("native receiver strips text, contains sink/storage failure, and clear blocks late finishes", () => { const { db, diagnostics } = store(); const receiver = diagnostics.receiver(); receiver.emit({ type: "chat:turn:start", timestamp: Date.now(), payload: { requestId: sentinel, trigger: sentinel, admission: sentinel }, }); receiver.emit({ type: "chat:turn:finish", timestamp: Date.now(), payload: { requestId: sentinel, trigger: sentinel, admission: sentinel, status: "error", durationMs: 42, error: sentinel, }, }); receiver.emit({ type: "connect", timestamp: Date.now(), payload: { connectionId: sentinel }, }); receiver.emit({ type: "disconnect", timestamp: Date.now(), payload: { connectionId: sentinel, code: 1000, reason: sentinel }, }); assert.equal(diagnostics.snapshot().events.length, 4); assert.ok(!JSON.stringify(diagnostics.snapshot()).includes(sentinel)); diagnostics.clear(); receiver.emit({ type: "chat:turn:finish", timestamp: Date.now(), payload: { requestId: sentinel, status: "completed", trigger: "rpc", admission: "queue", durationMs: 5, }, }); receiver.emit({ type: "chat:recovery:detected", timestamp: Date.now(), payload: { requestId: sentinel, incidentId: sentinel, attempt: 1, maxAttempts: 3, recoveryKind: "retry", }, }); assert.equal(diagnostics.snapshot().events.length, 0); const nativeEmit = genericObservability.emit; try { genericObservability.emit = () => { throw new Error(sentinel); }; receiver.emit({ type: "connect", timestamp: Date.now(), payload: { connectionId: "independent-sink" }, }); assert.equal( diagnostics.snapshot().events.length, 1, "native sink failure cannot suppress safe collection", ); } finally { genericObservability.emit = nativeEmit; } db.close(); assert.doesNotThrow(() => receiver.emit({ type: "connect", timestamp: Date.now(), payload: { connectionId: sentinel }, }), ); assert.equal(diagnostics.snapshot().available, false);});
test("native MCP diagnostics never publish provider-controlled text or auth metadata", () => { const { diagnostics, db } = store(); const emitted = []; const original = genericObservability.emit; genericObservability.emit = (event) => emitted.push(event); try { const receiver = diagnostics.receiver(); for (const type of [ "preconnect", "connect", "authorize", "discover", "close", "future", ]) { receiver.emit({ type: `mcp:client:${type}`, timestamp: 1, agent: sentinel, name: sentinel, payload: { serverId: sentinel, url: sentinel, authUrl: sentinel, clientId: sentinel, state: sentinel, transport: sentinel, error: sentinel, capability: sentinel, extra: sentinel, }, }); } assert.equal( emitted.length, 5, "unrecognized MCP event types stay unpublished", ); assert.ok(!JSON.stringify(emitted).includes(sentinel)); assert.ok( emitted.some((event) => event.payload.error === "MCP discovery failed"), ); assert.equal(diagnostics.snapshot().events.length, 0); } finally { genericObservability.emit = original; db.close(); }});
test("extension diagnostics retain fixed provenance and decisions without payloads", () => { const projected = extensionDiagnostic({ operation: "skill-script", source: { kind: "skill", id: sentinel }, version: sentinel, fingerprint: sentinel, startedAt: Date.now() - 20, status: "error", failure: "script", input: sentinel, error: new Error(sentinel), }); validateDiagnostic(projected); assert.equal(projected.details.capabilitySourceId, diagnosticId(sentinel)); assert.equal(projected.details.capabilityVersion, diagnosticId(sentinel)); assert.equal(projected.details.extensionFailure, "script"); assert.ok(projected.durationMs >= 20); assert.equal(JSON.stringify(projected).includes(sentinel), false); for (const details of [ { ...projected.details, extensionFailure: sentinel }, { ...projected.details, extensionOperation: sentinel }, { ...projected.details, capabilityVersion: sentinel }, { ...projected.details, approvalResolution: sentinel }, { ...projected.details, scriptInput: sentinel }, ]) assert.throws(() => validateDiagnostic({ ...projected, details })); for (const approvalDecision of ["approved", "denied"]) { const activity = toolDiagnostic({ toolCallId: sentinel, toolName: sentinel, kind: "other", status: "failed", attempts: 1, createdAt: 1, startedAt: 2, endedAt: 3, updatedAt: 3, approvalDecision, capability: { id: sentinel, fingerprint: sentinel, name: sentinel, version: sentinel, source: { kind: "skill", id: sentinel, name: sentinel }, }, }); validateDiagnostic(activity); assert.equal(activity.details.approvalResolution, approvalDecision); assert.equal(activity.details.capabilityVersion, diagnosticId(sentinel)); assert.equal(activity.durationMs, 1); assert.equal(JSON.stringify(activity).includes(sentinel), false); }});