@baguette-studios/kernl-telemetry 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,244 @@
1
+ const HEX_TRACE_ID_LENGTH = 32;
2
+ const HEX_SPAN_ID_LENGTH = 16;
3
+ const ZERO_TRACE_ID = "0".repeat(HEX_TRACE_ID_LENGTH);
4
+ const ZERO_SPAN_ID = "0".repeat(HEX_SPAN_ID_LENGTH);
5
+ export function isOtlpTraceId(value) {
6
+ return typeof value === "string" && /^[0-9a-f]{32}$/.test(value) && value !== ZERO_TRACE_ID;
7
+ }
8
+ export function isOtlpSpanId(value) {
9
+ return typeof value === "string" && /^[0-9a-f]{16}$/.test(value) && value !== ZERO_SPAN_ID;
10
+ }
11
+ export function toOtlpTraceId(value) {
12
+ return normalizeOtlpHexId(value, HEX_TRACE_ID_LENGTH);
13
+ }
14
+ export function toOtlpSpanId(value) {
15
+ return normalizeOtlpHexId(value, HEX_SPAN_ID_LENGTH);
16
+ }
17
+ export function coalesceTelemetrySpans(records) {
18
+ const groups = new Map();
19
+ for (const record of records) {
20
+ if (record.kind !== "span") {
21
+ continue;
22
+ }
23
+ const key = record.spanId ?? record.id;
24
+ groups.set(key, [...(groups.get(key) ?? []), record]);
25
+ }
26
+ return [...groups.values()]
27
+ .map(coalesceSpanGroup)
28
+ .sort((left, right) => left.startTimeUnixNano - right.startTimeUnixNano);
29
+ }
30
+ export function toOtlpTraceSpans(records) {
31
+ return coalesceTelemetrySpans(records).map((span) => compact({
32
+ traceId: toOtlpTraceId(span.traceId),
33
+ spanId: toOtlpSpanId(span.spanId),
34
+ parentSpanId: span.parentSpanId ? toOtlpSpanId(span.parentSpanId) : undefined,
35
+ name: span.name,
36
+ startTimeUnixNano: span.startTimeUnixNano,
37
+ endTimeUnixNano: span.endTimeUnixNano,
38
+ attributes: {
39
+ "kernl.span.kind": span.kind,
40
+ ...span.attributes
41
+ },
42
+ status: otlpStatus(span.status, span.error)
43
+ }));
44
+ }
45
+ export function toOpenInferenceSpans(records, options = {}) {
46
+ return toOtlpTraceSpans(records).map((span) => {
47
+ const kind = String(span.attributes["kernl.span.kind"] ?? "");
48
+ return {
49
+ ...span,
50
+ profile: "openinference",
51
+ attributes: compact({
52
+ ...span.attributes,
53
+ "openinference.span.kind": openInferenceKind(kind, span.name),
54
+ "input.value": contentPayload(findSourceSpan(records, span)?.input, options),
55
+ "output.value": contentPayload(findSourceSpan(records, span)?.output, options),
56
+ "llm.model_name": firstString(span.attributes.model, span.attributes.modelName, span.attributes["gen_ai.request.model"]),
57
+ "tool.name": firstString(span.attributes.toolName, span.attributes["tool.name"])
58
+ })
59
+ };
60
+ });
61
+ }
62
+ export function toOtelGenAiSpans(records) {
63
+ return toOtlpTraceSpans(records).map((span) => {
64
+ const kind = String(span.attributes["kernl.span.kind"] ?? "");
65
+ return {
66
+ ...span,
67
+ profile: "otel.gen_ai",
68
+ attributes: compact({
69
+ ...span.attributes,
70
+ "gen_ai.operation.name": genAiOperationName(kind, span.name),
71
+ "gen_ai.provider.name": firstString(span.attributes.provider, span.attributes.modelProvider, span.attributes.system),
72
+ "gen_ai.request.model": firstString(span.attributes.model, span.attributes.modelName),
73
+ "gen_ai.usage.input_tokens": firstNumber(span.attributes.inputTokens, span.attributes.promptTokens),
74
+ "gen_ai.usage.output_tokens": firstNumber(span.attributes.outputTokens, span.attributes.completionTokens),
75
+ "tool.name": firstString(span.attributes.toolName, span.attributes["tool.name"])
76
+ })
77
+ };
78
+ });
79
+ }
80
+ export function extractLowCardinalityMetrics(records) {
81
+ const metrics = [];
82
+ for (const record of records) {
83
+ metrics.push({
84
+ name: "kernl.telemetry.records",
85
+ value: 1,
86
+ unit: "1",
87
+ attributes: compact({
88
+ kind: record.kind,
89
+ name: record.name,
90
+ status: record.status ?? "unset"
91
+ })
92
+ });
93
+ }
94
+ for (const span of coalesceTelemetrySpans(records)) {
95
+ if (span.endTimeUnixNano !== undefined) {
96
+ const explicitDurationMs = numericAttribute(span.attributes, "durationMs");
97
+ metrics.push({
98
+ name: "kernl.span.duration",
99
+ value: explicitDurationMs ?? (span.endTimeUnixNano - span.startTimeUnixNano) / 1_000_000,
100
+ unit: "ms",
101
+ attributes: compact({
102
+ span_kind: lowCardinalityString(span.kind),
103
+ status: span.status ?? "unset"
104
+ })
105
+ });
106
+ }
107
+ }
108
+ return metrics;
109
+ }
110
+ function coalesceSpanGroup(records) {
111
+ const ordered = [...records].sort((left, right) => left.timestamp - right.timestamp);
112
+ const started = ordered.find((record) => record.name === "span.started") ?? ordered[0];
113
+ const ended = [...ordered].reverse().find((record) => record.name === "span.ended");
114
+ const last = ended ?? ordered[ordered.length - 1];
115
+ const attributes = compact({
116
+ ...started.attributes,
117
+ ...last.attributes,
118
+ "kernl.record.id": last.id,
119
+ "kernl.record.name": last.name,
120
+ "kernl.run.id": last.runId ?? started.runId,
121
+ "kernl.session.id": last.sessionId ?? started.sessionId
122
+ });
123
+ const name = String(attributes.spanName ?? started.attributes?.spanName ?? started.name);
124
+ const kind = firstString(attributes.spanKind, attributes["kernl.span.kind"]);
125
+ const startTimeUnixNano = started.timestamp * 1_000_000;
126
+ const endTimeUnixNano = ended ? ended.timestamp * 1_000_000 : undefined;
127
+ return compact({
128
+ traceId: last.traceId ?? started.traceId ?? last.runId ?? started.runId ?? last.id,
129
+ spanId: last.spanId ?? started.spanId ?? started.id,
130
+ parentSpanId: last.parentSpanId ?? started.parentSpanId,
131
+ name,
132
+ kind,
133
+ startTimeUnixNano,
134
+ endTimeUnixNano,
135
+ status: last.status ?? started.status,
136
+ attributes,
137
+ input: started.input,
138
+ output: ended?.output ?? last.output,
139
+ error: last.error ?? started.error,
140
+ records: ordered
141
+ });
142
+ }
143
+ function normalizeOtlpHexId(value, length) {
144
+ const text = String(value ?? "");
145
+ const lowered = text.toLowerCase();
146
+ if (new RegExp(`^[0-9a-f]{${length}}$`).test(lowered) && !/^0+$/.test(lowered)) {
147
+ return lowered;
148
+ }
149
+ const hex = hashHex(text || "unknown", length);
150
+ return /^0+$/.test(hex) ? `1${hex.slice(1)}` : hex;
151
+ }
152
+ function hashHex(value, length) {
153
+ let output = "";
154
+ let seed = value;
155
+ while (output.length < length) {
156
+ output += fnv1a(seed).toString(16).padStart(8, "0");
157
+ seed = `${seed}:${output.length}`;
158
+ }
159
+ return output.slice(0, length);
160
+ }
161
+ function fnv1a(value) {
162
+ let hash = 2166136261;
163
+ for (let index = 0; index < value.length; index += 1) {
164
+ hash ^= value.charCodeAt(index);
165
+ hash = Math.imul(hash, 16777619);
166
+ }
167
+ return hash >>> 0;
168
+ }
169
+ function otlpStatus(status, error) {
170
+ if (status === "ok") {
171
+ return { code: "STATUS_CODE_OK" };
172
+ }
173
+ if (status === "error") {
174
+ return compact({ code: "STATUS_CODE_ERROR", message: error });
175
+ }
176
+ return { code: "STATUS_CODE_UNSET" };
177
+ }
178
+ function openInferenceKind(kind, name) {
179
+ if (kind === "model.request") {
180
+ return "LLM";
181
+ }
182
+ if (kind === "tool.call") {
183
+ return "TOOL";
184
+ }
185
+ if (name === "memory.retrieval") {
186
+ return "RETRIEVER";
187
+ }
188
+ if (kind === "approval" || kind === "policy") {
189
+ return "GUARDRAIL";
190
+ }
191
+ if (kind === "eval") {
192
+ return "EVALUATOR";
193
+ }
194
+ if (kind === "agent.turn") {
195
+ return "AGENT";
196
+ }
197
+ return "CHAIN";
198
+ }
199
+ function genAiOperationName(kind, name) {
200
+ if (kind === "model.request") {
201
+ return "chat";
202
+ }
203
+ if (kind === "tool.call") {
204
+ return "execute_tool";
205
+ }
206
+ return name;
207
+ }
208
+ function numericAttribute(attributes, key) {
209
+ const value = attributes?.[key];
210
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
211
+ }
212
+ function firstString(...values) {
213
+ return values.find((value) => typeof value === "string" && value.length > 0);
214
+ }
215
+ function firstNumber(...values) {
216
+ return values.find((value) => typeof value === "number" && Number.isFinite(value));
217
+ }
218
+ function lowCardinalityString(value) {
219
+ return typeof value === "string" && /^[a-z0-9_.-]{1,64}$/i.test(value) ? value : "unknown";
220
+ }
221
+ function contentPayload(value, options) {
222
+ return options.contentMode === "inline" ? stringPayload(value) : undefined;
223
+ }
224
+ function stringPayload(value) {
225
+ if (value === undefined) {
226
+ return undefined;
227
+ }
228
+ if (typeof value === "string") {
229
+ return value;
230
+ }
231
+ try {
232
+ return JSON.stringify(value);
233
+ }
234
+ catch {
235
+ return String(value);
236
+ }
237
+ }
238
+ function findSourceSpan(records, span) {
239
+ return coalesceTelemetrySpans(records).find((candidate) => toOtlpSpanId(candidate.spanId) === span.spanId);
240
+ }
241
+ function compact(value) {
242
+ return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));
243
+ }
244
+ //# sourceMappingURL=semantic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.js","sourceRoot":"","sources":["../src/semantic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ import type { TelemetryExporter, TelemetryRecord, TelemetrySink } from "./index.js";
2
+ import { type OtlpTraceSpan, type SemanticContentMode, type SemanticProfileSpan } from "./semantic.js";
3
+ export type TelemetryFetch = (url: string, init: {
4
+ method: "POST";
5
+ headers: Record<string, string>;
6
+ body: string;
7
+ }) => Promise<{
8
+ ok: boolean;
9
+ status: number;
10
+ statusText?: string | undefined;
11
+ text?: (() => Promise<string>) | undefined;
12
+ }>;
13
+ export type OtlpHttpJsonTraceProfile = "otlp" | "openinference" | "otel.gen_ai";
14
+ export type OtlpHttpJsonTraceExporterOptions = {
15
+ url: string;
16
+ fetch?: TelemetryFetch | undefined;
17
+ headers?: Record<string, string> | undefined;
18
+ profile?: OtlpHttpJsonTraceProfile | undefined;
19
+ contentMode?: SemanticContentMode | undefined;
20
+ serviceName?: string | undefined;
21
+ resourceAttributes?: Record<string, unknown> | undefined;
22
+ scopeName?: string | undefined;
23
+ scopeVersion?: string | undefined;
24
+ };
25
+ export type PhoenixOtlpExporterOptions = Omit<OtlpHttpJsonTraceExporterOptions, "profile" | "url"> & {
26
+ url?: string | undefined;
27
+ };
28
+ export type OtlpHttpJsonTracesPayload = {
29
+ resourceSpans: readonly [
30
+ {
31
+ resource: {
32
+ attributes: readonly OtlpKeyValue[];
33
+ };
34
+ scopeSpans: readonly [
35
+ {
36
+ scope: {
37
+ name: string;
38
+ version?: string | undefined;
39
+ };
40
+ spans: readonly OtlpJsonSpan[];
41
+ }
42
+ ];
43
+ }
44
+ ];
45
+ };
46
+ export type OtlpJsonSpan = Omit<OtlpTraceSpan, "attributes"> & {
47
+ attributes: readonly OtlpKeyValue[];
48
+ };
49
+ export type OtlpKeyValue = {
50
+ key: string;
51
+ value: OtlpAnyValue;
52
+ };
53
+ export type OtlpAnyValue = {
54
+ stringValue: string;
55
+ } | {
56
+ intValue: string;
57
+ } | {
58
+ doubleValue: number;
59
+ } | {
60
+ boolValue: boolean;
61
+ } | {
62
+ arrayValue: {
63
+ values: readonly OtlpAnyValue[];
64
+ };
65
+ } | {
66
+ kvlistValue: {
67
+ values: readonly OtlpKeyValue[];
68
+ };
69
+ };
70
+ export type TelemetryLogRecord = {
71
+ id: string;
72
+ timestamp: number;
73
+ severityText: "INFO" | "ERROR";
74
+ body: string;
75
+ traceId?: string | undefined;
76
+ spanId?: string | undefined;
77
+ attributes: Record<string, unknown>;
78
+ };
79
+ export type LogsExporterOptions = {
80
+ includeKinds?: readonly ("audit" | "analytics" | "error")[] | undefined;
81
+ };
82
+ export type LangfuseNativePayload = {
83
+ type: "score";
84
+ payload: {
85
+ id: string;
86
+ traceId?: string | undefined;
87
+ observationId?: string | undefined;
88
+ name: string;
89
+ value: number;
90
+ dataType: "NUMERIC";
91
+ comment?: string | undefined;
92
+ metadata: Record<string, unknown>;
93
+ };
94
+ } | {
95
+ type: "event";
96
+ payload: {
97
+ id: string;
98
+ timestamp: string;
99
+ traceId?: string | undefined;
100
+ sessionId?: string | undefined;
101
+ name: string;
102
+ metadata: Record<string, unknown>;
103
+ input?: unknown;
104
+ output?: unknown;
105
+ };
106
+ };
107
+ export declare function createOtlpHttpJsonTraceExporter(options: OtlpHttpJsonTraceExporterOptions): TelemetryExporter;
108
+ export declare function createPhoenixOtlpExporter(options?: PhoenixOtlpExporterOptions): TelemetryExporter;
109
+ export declare function createOtlpHttpJsonTracesPayload(spans: readonly (OtlpTraceSpan | SemanticProfileSpan)[], options?: Pick<OtlpHttpJsonTraceExporterOptions, "resourceAttributes" | "scopeName" | "scopeVersion" | "serviceName">): OtlpHttpJsonTracesPayload;
110
+ export declare function mapTelemetryLogs(records: readonly TelemetryRecord[], options?: LogsExporterOptions): TelemetryLogRecord[];
111
+ export declare function createLogsExporter(sink: TelemetrySink<TelemetryLogRecord>, options?: LogsExporterOptions): TelemetryExporter;
112
+ export declare function mapLangfuseNativePayloads(records: readonly TelemetryRecord[]): LangfuseNativePayload[];
113
+ export declare function createLangfuseNativeExporter(sink: TelemetrySink<LangfuseNativePayload>): TelemetryExporter;
114
+ //# sourceMappingURL=sinks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sinks.d.ts","sourceRoot":"","sources":["../src/sinks.ts"],"names":[],"mappings":"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"}
package/dist/sinks.js ADDED
@@ -0,0 +1,247 @@
1
+ import { toOpenInferenceSpans, toOtelGenAiSpans, toOtlpTraceSpans } from "./semantic.js";
2
+ export function createOtlpHttpJsonTraceExporter(options) {
3
+ const fetchImpl = options.fetch ?? globalThis.fetch;
4
+ if (!fetchImpl) {
5
+ throw new Error("createOtlpHttpJsonTraceExporter requires fetch in this runtime.");
6
+ }
7
+ return {
8
+ async export(records) {
9
+ const spans = mapTraceSpans(records, options);
10
+ if (spans.length === 0) {
11
+ return { status: "success", exported: 0, failed: 0 };
12
+ }
13
+ const payload = createOtlpHttpJsonTracesPayload(spans, options);
14
+ try {
15
+ const response = await fetchImpl(options.url, {
16
+ method: "POST",
17
+ headers: {
18
+ "content-type": "application/json",
19
+ ...options.headers
20
+ },
21
+ body: JSON.stringify(payload)
22
+ });
23
+ if (!response.ok) {
24
+ const detail = response.text ? await response.text().catch(() => "") : "";
25
+ return {
26
+ status: "error",
27
+ exported: 0,
28
+ failed: spans.length,
29
+ errors: [`HTTP ${response.status}${response.statusText ? ` ${response.statusText}` : ""}${detail ? `: ${detail}` : ""}`]
30
+ };
31
+ }
32
+ return { status: "success", exported: spans.length, failed: 0 };
33
+ }
34
+ catch (error) {
35
+ return {
36
+ status: "error",
37
+ exported: 0,
38
+ failed: spans.length,
39
+ errors: [error instanceof Error ? error.message : String(error)]
40
+ };
41
+ }
42
+ }
43
+ };
44
+ }
45
+ export function createPhoenixOtlpExporter(options = {}) {
46
+ return createOtlpHttpJsonTraceExporter({
47
+ ...options,
48
+ url: options.url ?? "http://127.0.0.1:6006/v1/traces",
49
+ profile: "openinference",
50
+ contentMode: options.contentMode ?? "none",
51
+ serviceName: options.serviceName ?? "kernl"
52
+ });
53
+ }
54
+ export function createOtlpHttpJsonTracesPayload(spans, options = {}) {
55
+ return {
56
+ resourceSpans: [
57
+ {
58
+ resource: {
59
+ attributes: toOtlpAttributes({
60
+ "service.name": options.serviceName ?? "kernl",
61
+ ...options.resourceAttributes
62
+ })
63
+ },
64
+ scopeSpans: [
65
+ {
66
+ scope: compact({
67
+ name: options.scopeName ?? "kernl.telemetry",
68
+ version: options.scopeVersion
69
+ }),
70
+ spans: spans.map((span) => ({
71
+ ...span,
72
+ attributes: toOtlpAttributes(span.attributes)
73
+ }))
74
+ }
75
+ ]
76
+ }
77
+ ]
78
+ };
79
+ }
80
+ export function mapTelemetryLogs(records, options = {}) {
81
+ const includeKinds = new Set(options.includeKinds ?? ["audit", "analytics", "error"]);
82
+ return records.flatMap((record) => {
83
+ const selectedKind = record.kind === "audit" || record.kind === "analytics" || record.status === "error";
84
+ if (!selectedKind) {
85
+ return [];
86
+ }
87
+ const logicalKind = record.status === "error" ? "error" : record.kind;
88
+ if (!includeKinds.has(logicalKind)) {
89
+ return [];
90
+ }
91
+ return [
92
+ compact({
93
+ id: record.id,
94
+ timestamp: record.timestamp,
95
+ severityText: record.status === "error" ? "ERROR" : "INFO",
96
+ body: record.error ?? String(record.attributes?.eventName ?? record.attributes?.auditType ?? record.name),
97
+ traceId: record.traceId,
98
+ spanId: record.spanId,
99
+ attributes: compact({
100
+ "kernl.kind": record.kind,
101
+ "kernl.name": record.name,
102
+ "kernl.status": record.status,
103
+ "kernl.session_id": record.sessionId,
104
+ "kernl.run_id": record.runId,
105
+ ...record.attributes
106
+ })
107
+ })
108
+ ];
109
+ });
110
+ }
111
+ export function createLogsExporter(sink, options = {}) {
112
+ return {
113
+ async export(records) {
114
+ return exportPayloads(mapTelemetryLogs(records, options), sink);
115
+ }
116
+ };
117
+ }
118
+ export function mapLangfuseNativePayloads(records) {
119
+ return records.flatMap((record) => {
120
+ if (record.name === "eval.scored") {
121
+ const score = numberAttribute(record, "score");
122
+ if (score === undefined) {
123
+ return [];
124
+ }
125
+ return [
126
+ {
127
+ type: "score",
128
+ payload: compact({
129
+ id: record.id,
130
+ traceId: record.traceId,
131
+ observationId: record.spanId,
132
+ name: stringAttribute(record, "label") ?? stringAttribute(record, "rubricId") ?? "eval.score",
133
+ value: score,
134
+ dataType: "NUMERIC",
135
+ comment: stringAttribute(record, "reason"),
136
+ metadata: compact({
137
+ kind: record.kind,
138
+ status: record.status,
139
+ rubricId: record.attributes?.rubricId,
140
+ maxScore: record.attributes?.maxScore,
141
+ passed: record.attributes?.passed,
142
+ ...record.attributes
143
+ })
144
+ })
145
+ }
146
+ ];
147
+ }
148
+ const eventName = stringAttribute(record, "eventName");
149
+ if (record.kind === "analytics" && eventName && (eventName.startsWith("feedback.") || eventName.startsWith("dataset."))) {
150
+ return [
151
+ {
152
+ type: "event",
153
+ payload: compact({
154
+ id: record.id,
155
+ timestamp: new Date(record.timestamp).toISOString(),
156
+ traceId: record.traceId,
157
+ sessionId: record.sessionId,
158
+ name: eventName,
159
+ metadata: compact({
160
+ kind: record.kind,
161
+ status: record.status,
162
+ ...record.attributes
163
+ }),
164
+ input: record.input,
165
+ output: record.output
166
+ })
167
+ }
168
+ ];
169
+ }
170
+ return [];
171
+ });
172
+ }
173
+ export function createLangfuseNativeExporter(sink) {
174
+ return {
175
+ async export(records) {
176
+ return exportPayloads(mapLangfuseNativePayloads(records), sink);
177
+ }
178
+ };
179
+ }
180
+ function mapTraceSpans(records, options) {
181
+ if (options.profile === "openinference") {
182
+ return toOpenInferenceSpans(records, { contentMode: options.contentMode });
183
+ }
184
+ if (options.profile === "otel.gen_ai") {
185
+ return toOtelGenAiSpans(records);
186
+ }
187
+ return toOtlpTraceSpans(records);
188
+ }
189
+ function toOtlpAttributes(attributes) {
190
+ return Object.entries(attributes)
191
+ .filter(([, value]) => value !== undefined)
192
+ .map(([key, value]) => ({ key, value: toOtlpAnyValue(value) }));
193
+ }
194
+ function toOtlpAnyValue(value) {
195
+ if (typeof value === "boolean") {
196
+ return { boolValue: value };
197
+ }
198
+ if (typeof value === "number") {
199
+ return Number.isInteger(value) ? { intValue: String(value) } : { doubleValue: value };
200
+ }
201
+ if (Array.isArray(value)) {
202
+ return { arrayValue: { values: value.map(toOtlpAnyValue) } };
203
+ }
204
+ if (value && typeof value === "object") {
205
+ return {
206
+ kvlistValue: {
207
+ values: Object.entries(value).map(([key, entry]) => ({
208
+ key,
209
+ value: toOtlpAnyValue(entry)
210
+ }))
211
+ }
212
+ };
213
+ }
214
+ return { stringValue: value === undefined || value === null ? "" : String(value) };
215
+ }
216
+ async function exportPayloads(payloads, sink) {
217
+ let exported = 0;
218
+ const errors = [];
219
+ for (const payload of payloads) {
220
+ try {
221
+ await sink(payload);
222
+ exported += 1;
223
+ }
224
+ catch (error) {
225
+ errors.push(error instanceof Error ? error.message : String(error));
226
+ }
227
+ }
228
+ const failed = payloads.length - exported;
229
+ return {
230
+ status: failed === 0 ? "success" : exported > 0 ? "partial" : "error",
231
+ exported,
232
+ failed,
233
+ ...(errors.length ? { errors } : {})
234
+ };
235
+ }
236
+ function stringAttribute(record, key) {
237
+ const value = record.attributes?.[key];
238
+ return typeof value === "string" && value.length > 0 ? value : undefined;
239
+ }
240
+ function numberAttribute(record, key) {
241
+ const value = record.attributes?.[key];
242
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
243
+ }
244
+ function compact(input) {
245
+ return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined));
246
+ }
247
+ //# sourceMappingURL=sinks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sinks.js","sourceRoot":"","sources":["../src/sinks.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,eAAe,CAAC;AA2GvB,MAAM,UAAU,+BAA+B,CAAC,OAAyC;IACvF,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IACpD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;IAED,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,OAAO;YAClB,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YACvD,CAAC;YAED,MAAM,OAAO,GAAG,+BAA+B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAChE,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE;oBAC5C,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,GAAG,OAAO,CAAC,OAAO;qBACnB;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;iBAC9B,CAAC,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1E,OAAO;wBACL,MAAM,EAAE,OAAO;wBACf,QAAQ,EAAE,CAAC;wBACX,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,MAAM,EAAE,CAAC,QAAQ,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;qBACzH,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YAClE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO;oBACL,MAAM,EAAE,OAAO;oBACf,QAAQ,EAAE,CAAC;oBACX,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,MAAM,EAAE,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;iBACjE,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,UAAsC,EAAE;IAChF,OAAO,+BAA+B,CAAC;QACrC,GAAG,OAAO;QACV,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,iCAAiC;QACrD,OAAO,EAAE,eAAe;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,MAAM;QAC1C,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO;KAC5C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,KAAuD,EACvD,UAAuH,EAAE;IAEzH,OAAO;QACL,aAAa,EAAE;YACb;gBACE,QAAQ,EAAE;oBACR,UAAU,EAAE,gBAAgB,CAAC;wBAC3B,cAAc,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO;wBAC9C,GAAG,OAAO,CAAC,kBAAkB;qBAC9B,CAAC;iBACH;gBACD,UAAU,EAAE;oBACV;wBACE,KAAK,EAAE,OAAO,CAAC;4BACb,IAAI,EAAE,OAAO,CAAC,SAAS,IAAI,iBAAiB;4BAC5C,OAAO,EAAE,OAAO,CAAC,YAAY;yBAC9B,CAAC;wBACF,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;4BAC1B,GAAG,IAAI;4BACP,UAAU,EAAE,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC;yBAC9C,CAAC,CAAC;qBACJ;iBACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAmC,EAAE,UAA+B,EAAE;IACrG,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IACtF,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QAChC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC;QACzG,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QACtE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAA8C,CAAC,EAAE,CAAC;YACtE,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO;YACL,OAAO,CAAC;gBACN,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,YAAY,EAAE,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;gBAC1D,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC;gBACzG,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,UAAU,EAAE,OAAO,CAAC;oBAClB,YAAY,EAAE,MAAM,CAAC,IAAI;oBACzB,YAAY,EAAE,MAAM,CAAC,IAAI;oBACzB,cAAc,EAAE,MAAM,CAAC,MAAM;oBAC7B,kBAAkB,EAAE,MAAM,CAAC,SAAS;oBACpC,cAAc,EAAE,MAAM,CAAC,KAAK;oBAC5B,GAAG,MAAM,CAAC,UAAU;iBACrB,CAAC;aACH,CAAC;SACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,IAAuC,EACvC,UAA+B,EAAE;IAEjC,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,OAAO;YAClB,OAAO,cAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;QAClE,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAmC;IAC3E,OAAO,OAAO,CAAC,OAAO,CAAwB,CAAC,MAAM,EAAE,EAAE;QACvD,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC/C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,OAAO;gBACL;oBACE,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,OAAO,CAAC;wBACf,EAAE,EAAE,MAAM,CAAC,EAAE;wBACb,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,aAAa,EAAE,MAAM,CAAC,MAAM;wBAC5B,IAAI,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,YAAY;wBAC7F,KAAK,EAAE,KAAK;wBACZ,QAAQ,EAAE,SAAkB;wBAC5B,OAAO,EAAE,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC;wBAC1C,QAAQ,EAAE,OAAO,CAAC;4BAChB,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,MAAM,EAAE,MAAM,CAAC,MAAM;4BACrB,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ;4BACrC,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ;4BACrC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM;4BACjC,GAAG,MAAM,CAAC,UAAU;yBACrB,CAAC;qBACH,CAAC;iBACH;aACF,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACxH,OAAO;gBACL;oBACE,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,OAAO,CAAC;wBACf,EAAE,EAAE,MAAM,CAAC,EAAE;wBACb,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;wBACnD,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,SAAS,EAAE,MAAM,CAAC,SAAS;wBAC3B,IAAI,EAAE,SAAS;wBACf,QAAQ,EAAE,OAAO,CAAC;4BAChB,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,MAAM,EAAE,MAAM,CAAC,MAAM;4BACrB,GAAG,MAAM,CAAC,UAAU;yBACrB,CAAC;wBACF,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;qBACtB,CAAC;iBACH;aACF,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,IAA0C;IACrF,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,OAAO;YAClB,OAAO,cAAc,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;QAClE,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,OAAmC,EACnC,OAA0E;IAE1E,IAAI,OAAO,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;QACxC,OAAO,oBAAoB,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;QACtC,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAmC;IAC3D,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;SAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;SAC1C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACxF,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;IAC/D,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO;YACL,WAAW,EAAE;gBACX,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC9E,GAAG;oBACH,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC;iBAC7B,CAAC,CAAC;aACJ;SACF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACrF,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,QAA6B,EAC7B,IAA6B;IAE7B,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,QAAQ,IAAI,CAAC,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC;IAC1C,OAAO;QACL,MAAM,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;QACrE,QAAQ;QACR,MAAM;QACN,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,MAAuB,EAAE,GAAW;IAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AAED,SAAS,eAAe,CAAC,MAAuB,EAAE,GAAW;IAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACjF,CAAC;AAED,SAAS,OAAO,CAAoC,KAAQ;IAC1D,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAM,CAAC;AACnG,CAAC"}