/** * Core telemetry keyed by submission id (v2, workstream C4). * * The submission runner emits one event per lifecycle transition; sinks are * fire-and-forget observers (a sink failure must never affect execution — * use {@link emitSubmissionTelemetry}). Platform packages provide durable * sinks (e.g. the Databricks sink writing Lakebase tables) so cost and * audit joins key on the same stable `submissionId` that drives events and * settlement. Distinct from `telemetry.ts` (per-span exporters): these are * lifecycle facts, not spans. */ import type { FabricActor } from "./types.js"; interface SubmissionTelemetryBase { readonly submissionId: string; /** `'dispatch'` or `'direct'`. */ readonly kind: string; readonly agent: string; readonly instanceId: string; readonly session: string; /** Epoch ms when the event was emitted. */ readonly at: number; readonly tenantId?: string; readonly actor?: FabricActor; } export type SubmissionTelemetryEvent = (SubmissionTelemetryBase & { readonly type: "submission_queued"; }) | (SubmissionTelemetryBase & { readonly type: "submission_running"; readonly attemptId: string; readonly attemptCount: number; readonly maxAttempts: number; }) | (SubmissionTelemetryBase & { readonly type: "submission_recovery"; readonly operation: "materialize_submission" | "finalize_settlement" | "reconcile_submission" | "start_submission" | "process_submission" | "reconcile_pass" | "enforce_deadline"; readonly outcome: "deferred" | "agent_unavailable" | "attempt_cap_deferred" | "terminated"; readonly attemptCount?: number; readonly maxAttempts?: number; readonly error?: string; }) /** @deprecated Read-only compatibility for sinks replaying pre-5.4 telemetry. */ | (SubmissionTelemetryBase & { readonly type: "submission_accepted"; }) /** @deprecated Read-only compatibility for sinks replaying pre-5.4 telemetry. */ | (SubmissionTelemetryBase & { readonly type: "submission_started"; readonly attemptId: string; readonly attemptCount: number; }) | (SubmissionTelemetryBase & { readonly type: "submission_settled"; readonly attemptId?: string; readonly outcome: "completed" | "failed" | "aborted"; readonly error?: string; /** Milliseconds from admission to settlement. */ readonly durationMs?: number; readonly attemptCount?: number; }) | (SubmissionTelemetryBase & { /** Model/serving usage attributable to the submission (one event per model call). */ readonly type: "submission_usage"; readonly attemptId?: string; readonly model?: string; readonly inputTokens?: number; readonly outputTokens?: number; readonly costUsd?: number; }); export interface SubmissionTelemetrySink { record(event: SubmissionTelemetryEvent): void | Promise; } /** Deliver an event to a sink, swallowing (and reporting) sink failures. */ export declare function emitSubmissionTelemetry(sink: SubmissionTelemetrySink | undefined, event: SubmissionTelemetryEvent, onError?: (error: unknown) => void): void; /** Fan one event out to several sinks. */ export declare function combineSubmissionTelemetrySinks(...sinks: SubmissionTelemetrySink[]): SubmissionTelemetrySink; export {}; //# sourceMappingURL=submission-telemetry.d.ts.map