{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../../src/core/reliability/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE7F,MAAM,WAAW,mBAAmB;IACnC,MAAM,CAAC,IAAI,EAAE,oBAAoB,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzE,MAAM,IAAI,SAAS,gBAAgB,EAAE,CAAC;IACtC,OAAO,IAAI,kBAAkB,CAAC;CAC9B;AAED,MAAM,WAAW,0BAA0B;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAED,qBAAa,2BAA4B,YAAW,mBAAmB;IACtE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,YAAY,OAAO,GAAE,0BAA+B,EAInD;IAED,MAAM,CAAC,IAAI,EAAE,oBAAoB,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAOvE;IAED,MAAM,IAAI,SAAS,gBAAgB,EAAE,CAEpC;IAED,OAAO,IAAI,kBAAkB,CAgB5B;IAED,OAAO,CAAC,cAAc;CAKtB;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,mBAAmB,EAAE,GAAG,gBAAgB,EAAE,CAE1F","sourcesContent":["/**\n * Reliability telemetry — internal observability for key agent events.\n *\n * Records structured events and derives the Reliability Metrics that power the\n * Reliability Benchmark. This module is intentionally side-effect-light and\n * never logs sensitive user contents; payloads are caller-supplied summaries.\n */\n\nimport type { ReliabilityEvent, ReliabilityEventName, ReliabilityMetrics } from \"./types.js\";\n\nexport interface ReliabilityRecorder {\n\trecord(name: ReliabilityEventName, data?: Record<string, unknown>): void;\n\tevents(): readonly ReliabilityEvent[];\n\tmetrics(): ReliabilityMetrics;\n}\n\nexport interface ReliabilityRecorderOptions {\n\tmissionId?: string;\n\tnow?: () => number;\n}\n\nexport class InMemoryReliabilityRecorder implements ReliabilityRecorder {\n\tprivate readonly _missionId?: string;\n\tprivate readonly _now: () => number;\n\tprivate readonly _events: ReliabilityEvent[] = [];\n\tprivate readonly _startedAt: number;\n\n\tconstructor(options: ReliabilityRecorderOptions = {}) {\n\t\tthis._missionId = options.missionId;\n\t\tthis._now = options.now ?? Date.now;\n\t\tthis._startedAt = this._now();\n\t}\n\n\trecord(name: ReliabilityEventName, data?: Record<string, unknown>): void {\n\t\tthis._events.push({\n\t\t\tname,\n\t\t\tmissionId: this._missionId,\n\t\t\ttimestamp: new Date(this._now()).toISOString(),\n\t\t\tdata,\n\t\t});\n\t}\n\n\tevents(): readonly ReliabilityEvent[] {\n\t\treturn this._events;\n\t}\n\n\tmetrics(): ReliabilityMetrics {\n\t\tconst count = (name: ReliabilityEventName) => this._events.filter((e) => e.name === name).length;\n\t\tconst completed = count(\"mission_completed\") > 0;\n\n\t\treturn {\n\t\t\ttaskSuccess: completed,\n\t\t\tfalseSuccessAttempts: count(\"finalization_rejected\"),\n\t\t\tinvalidActionCount: count(\"action_validation_failure\") + count(\"action_decode_failure\"),\n\t\t\ttoolFailureCount: count(\"tool_failed\"),\n\t\t\tverificationFailureCount: count(\"verification_executed\"),\n\t\t\tfinalizationRejectionCount: count(\"finalization_rejected\"),\n\t\t\tactionsExecuted: count(\"tool_executed\"),\n\t\t\tmodelTurns: this._estimateTurns(),\n\t\t\telapsedMs: this._now() - this._startedAt,\n\t\t\tmissionResumed: count(\"mission_started\") > 1,\n\t\t};\n\t}\n\n\tprivate _estimateTurns(): number {\n\t\t// Turn boundaries are action_proposed + tool_executed signals; without\n\t\t// an explicit turn event we conservatively count assistant proposals.\n\t\treturn this._events.filter((e) => e.name === \"action_proposed\").length;\n\t}\n}\n\n/** Merge events from multiple recorders into a single ordered stream. */\nexport function concatEvents(recorders: readonly ReliabilityRecorder[]): ReliabilityEvent[] {\n\treturn recorders.flatMap((r) => [...r.events()]);\n}\n"]}