@kortyx/telemetry 0.6.2 → 0.7.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.7.0](https://github.com/kortyx-io/kortyx/compare/telemetry-v0.6.3...telemetry-v0.7.0) (2026-09-18)
4
+
5
+
6
+ ### Features
7
+
8
+ * **tools:** add useTool and first-class Studio observability ([#215](https://github.com/kortyx-io/kortyx/issues/215)) ([224c92d](https://github.com/kortyx-io/kortyx/commit/224c92d73caead320dd14582d8b624efc3252c9f))
9
+
10
+
11
+ ### Dependencies
12
+
13
+ * The following workspace dependencies were updated
14
+ * dependencies
15
+ * @kortyx/hooks bumped to 0.26.0
16
+ * @kortyx/telemetry-contracts bumped to 0.9.0
17
+
18
+ ## [0.6.3](https://github.com/kortyx-io/kortyx/compare/telemetry-v0.6.2...telemetry-v0.6.3) (2026-09-16)
19
+
20
+
21
+ ### Dependencies
22
+
23
+ * The following workspace dependencies were updated
24
+ * dependencies
25
+ * @kortyx/hooks bumped to 0.25.3
26
+ * @kortyx/telemetry-contracts bumped to 0.8.0
27
+
3
28
  ## [0.6.2](https://github.com/kortyx-io/kortyx/compare/telemetry-v0.6.1...telemetry-v0.6.2) (2026-09-15)
4
29
 
5
30
 
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import * as _kortyx_hooks from '@kortyx/hooks';
1
2
  import { KortyxTelemetryService, KortyxTelemetryConfig } from '@kortyx/hooks';
2
3
 
3
4
  type CreateKortyxTelemetryAdapterOptions = {
@@ -5,6 +6,8 @@ type CreateKortyxTelemetryAdapterOptions = {
5
6
  apiKey: string;
6
7
  environment: string;
7
8
  service: KortyxTelemetryService;
9
+ /** Optional replacement/suppression of automatically captured model fault diagnostics. */
10
+ error?: _kortyx_hooks.KortyxTraceErrorProjection;
8
11
  captureContent?: KortyxTelemetryConfig["captureContent"] | undefined;
9
12
  metadata?: Record<string, unknown> | undefined;
10
13
  tags?: string[] | undefined;
package/dist/index.js CHANGED
@@ -115,17 +115,29 @@ var createDelivery = (args) => {
115
115
 
116
116
  // src/event-mapper.ts
117
117
  var import_errors = require("@kortyx/core/errors");
118
+ var import_internal = require("@kortyx/hooks/internal");
118
119
  var stringValue = (value) => typeof value === "string" && value.length > 0 ? value : void 0;
119
120
  var shouldCapture = (value, side) => {
120
121
  if (value === true) return true;
121
122
  return Boolean(value && typeof value === "object" && value[side]);
122
123
  };
123
- var asErrorPayload = (error) => (0, import_errors.isControlFlowError)(error) ? {
124
- name: (0, import_errors.errorProperty)(error, "name"),
125
- code: (0, import_errors.errorProperty)(error, "code"),
126
- message: "Execution paused or cancelled.",
127
- controlFlow: true
128
- } : { ...(0, import_errors.serializeFailure)(error), name: "KortyxError" };
124
+ var asErrorPayload = (error, name, project) => {
125
+ if ((0, import_errors.isControlFlowError)(error))
126
+ return {
127
+ name: (0, import_errors.errorProperty)(error, "name"),
128
+ code: (0, import_errors.errorProperty)(error, "code"),
129
+ message: "Execution paused or cancelled.",
130
+ controlFlow: true
131
+ };
132
+ const failure = (0, import_errors.serializeFailure)(error);
133
+ if (!(0, import_internal.isModelTraceSpan)(name ?? "")) return { ...failure, name: "KortyxError" };
134
+ const diagnostic = (0, import_internal.errorDiagnostics)(error, project);
135
+ return {
136
+ ...failure,
137
+ name: diagnostic.errorType ?? "Error",
138
+ message: diagnostic.errorMessage ?? "Model execution failed."
139
+ };
140
+ };
129
141
  var correlationFrom = (attributes, active) => {
130
142
  const source = attributes ?? {};
131
143
  const runId = stringValue(source.runId) ?? active?.correlation.runId;
@@ -166,7 +178,7 @@ var createEventMapper = (args) => {
166
178
  ...input.context || args.metadata || args.tags ? {
167
179
  context: {
168
180
  ...args.tags ? { tags: args.tags } : {},
169
- ...args.metadata ? { metadata: args.metadata } : {},
181
+ ...args.metadata ? { metadata: (0, import_internal.safeTelemetryMetadata)(args.metadata) } : {},
170
182
  ...input.context ?? {}
171
183
  }
172
184
  } : {},
@@ -180,10 +192,10 @@ var createEventMapper = (args) => {
180
192
  });
181
193
  const spanContext = (telemetry, attributes) => {
182
194
  const tags = [...args.tags ?? [], ...telemetry?.tags ?? []];
183
- const metadata = {
195
+ const metadata = (0, import_internal.safeTelemetryMetadata)({
184
196
  ...args.metadata ?? {},
185
197
  ...telemetry?.metadata ?? {}
186
- };
198
+ });
187
199
  const userId = stringValue(attributes.userId);
188
200
  const tenantId = stringValue(attributes.tenantId);
189
201
  return userId || tenantId || tags.length || Object.keys(metadata).length ? {
@@ -196,7 +208,7 @@ var createEventMapper = (args) => {
196
208
  const telemetryPayload = (telemetry) => ({
197
209
  ...telemetry?.operation ? { operation: telemetry.operation } : {},
198
210
  ...telemetry?.tags?.length ? { tags: telemetry.tags } : {},
199
- ...telemetry?.metadata ? { metadata: telemetry.metadata } : {},
211
+ ...telemetry?.metadata ? { metadata: (0, import_internal.safeTelemetryMetadata)(telemetry.metadata) } : {},
200
212
  ...telemetry?.prompt ? {
201
213
  prompt: {
202
214
  ...telemetry.prompt.name ? { name: telemetry.prompt.name } : {},
@@ -207,7 +219,7 @@ var createEventMapper = (args) => {
207
219
  } : {}
208
220
  });
209
221
  return {
210
- asErrorPayload,
222
+ asErrorPayload: (error, name) => asErrorPayload(error, name, args.error),
211
223
  correlationFrom,
212
224
  createEvent,
213
225
  shouldCapture,
@@ -256,6 +268,7 @@ var createTopologyResolver = (args) => {
256
268
 
257
269
  // src/trace.ts
258
270
  var import_node_async_hooks = require("async_hooks");
271
+ var import_telemetry_contracts = require("@kortyx/telemetry-contracts");
259
272
  var createTraceAdapter = (args) => {
260
273
  const activeSpans = new import_node_async_hooks.AsyncLocalStorage();
261
274
  const createSpan = (startArgs) => {
@@ -268,17 +281,20 @@ var createTraceAdapter = (args) => {
268
281
  const currentAttributes = { ...attributes };
269
282
  const correlation = args.eventMapper.correlationFrom(attributes, parent);
270
283
  const startedAt = Date.now();
271
- if (correlation) {
284
+ const isTool = startArgs.name === "kortyx.tool";
285
+ if (correlation && (!isTool || attributes.executed === true)) {
272
286
  args.enqueue(
273
287
  args.eventMapper.createEvent({
274
- type: "span.started",
288
+ type: isTool ? "tool.started" : "span.started",
275
289
  correlation,
276
290
  span,
277
291
  ...parent ? { parentSpanId: parent.spanId } : {},
278
- payload: {
292
+ payload: isTool ? import_telemetry_contracts.ToolObservationSchema.parse(attributes) : {
279
293
  name: startArgs.name,
280
294
  attributes: currentAttributes,
281
- telemetry: args.eventMapper.telemetryPayload(startArgs.telemetry),
295
+ telemetry: args.eventMapper.telemetryPayload(
296
+ startArgs.telemetry
297
+ ),
282
298
  ...args.eventMapper.shouldCapture(
283
299
  startArgs.telemetry?.captureContent ?? args.captureContent,
284
300
  "input"
@@ -303,6 +319,20 @@ var createTraceAdapter = (args) => {
303
319
  };
304
320
  const telemetry = endArgs?.telemetry ?? startArgs.telemetry;
305
321
  const durationMs = Date.now() - startedAt;
322
+ if (isTool) {
323
+ const payload = import_telemetry_contracts.ToolObservationSchema.parse(endAttributes);
324
+ const type = payload.observationKind === "reused" ? "tool.reused" : payload.observationKind === "waiting" ? "tool.waiting" : payload.suspended ? "tool.suspended" : payload.outcome === "denied" ? "tool.denied" : payload.outcome === "fault" ? "tool.failed" : payload.outcome === "cancelled" ? "tool.cancelled" : "tool.completed";
325
+ args.enqueue(
326
+ args.eventMapper.createEvent({
327
+ type,
328
+ correlation,
329
+ span,
330
+ ...parent ? { parentSpanId: parent.spanId } : {},
331
+ payload
332
+ })
333
+ );
334
+ return;
335
+ }
306
336
  args.enqueue(
307
337
  args.eventMapper.createEvent({
308
338
  type: "span.ended",
@@ -349,10 +379,28 @@ var createTraceAdapter = (args) => {
349
379
  durationMs - timeToLastTokenMs
350
380
  )
351
381
  } : {},
352
- ...endArgs?.usage ? { usage: endArgs.usage } : {},
382
+ ...endArgs?.usage ? {
383
+ usage: failed ? Object.fromEntries(
384
+ Object.entries(endArgs.usage).filter(
385
+ ([key, value]) => [
386
+ "input",
387
+ "output",
388
+ "total",
389
+ "reasoning",
390
+ "cacheRead",
391
+ "cacheWrite",
392
+ "cacheWrite1h"
393
+ ].includes(key) && typeof value === "number" && Number.isFinite(value) || [
394
+ "outputIncludesReasoning",
395
+ "inputIncludesCacheRead",
396
+ "inputIncludesCacheWrite"
397
+ ].includes(key) && typeof value === "boolean"
398
+ )
399
+ ) : endArgs.usage
400
+ } : {},
353
401
  ...endArgs?.finishReason ? { finishReason: endArgs.finishReason } : {},
354
402
  ...endArgs?.warnings ? { warnings: endArgs.warnings } : {},
355
- ...endArgs?.providerMetadata ? { providerMetadata: endArgs.providerMetadata } : {}
403
+ ...endArgs?.providerMetadata && !failed ? { providerMetadata: endArgs.providerMetadata } : {}
356
404
  },
357
405
  context: args.eventMapper.spanContext(telemetry, currentAttributes)
358
406
  })
@@ -363,7 +411,8 @@ var createTraceAdapter = (args) => {
363
411
  Object.assign(currentAttributes, nextAttributes);
364
412
  },
365
413
  addEvent: (name, eventAttributes = {}) => {
366
- if (!correlation) return;
414
+ if (!correlation || activeSpans.getStore()?.name === "kortyx.tool" || startArgs.name === "kortyx.tool")
415
+ return;
367
416
  const type = name === "useReason.tool-call.start" ? "tool.started" : name === "useReason.tool-call.complete" ? "tool.completed" : name === "useReason.tool-call.error" ? "tool.failed" : void 0;
368
417
  if (!type) return;
369
418
  args.enqueue(
@@ -389,7 +438,7 @@ var createTraceAdapter = (args) => {
389
438
  ...parent ? { parentSpanId: parent.spanId } : {},
390
439
  payload: {
391
440
  name: startArgs.name,
392
- error: args.eventMapper.asErrorPayload(error),
441
+ error: args.eventMapper.asErrorPayload(error, startArgs.name),
393
442
  durationMs: Date.now() - startedAt
394
443
  }
395
444
  })
@@ -400,7 +449,7 @@ var createTraceAdapter = (args) => {
400
449
  };
401
450
  return {
402
451
  span: traceSpan,
403
- ...correlation ? { active: { ...span, correlation } } : {}
452
+ ...correlation ? { active: { ...span, name: startArgs.name, correlation } } : {}
404
453
  };
405
454
  };
406
455
  return {
@@ -472,7 +521,8 @@ function createKortyxTelemetryAdapter(options) {
472
521
  service: options.service,
473
522
  ...options.metadata ? { metadata: options.metadata } : {},
474
523
  ...options.tags ? { tags: options.tags } : {},
475
- createId
524
+ createId,
525
+ ...options.error ? { error: options.error } : {}
476
526
  });
477
527
  const topology = createTopologyResolver({
478
528
  ensure: async (snapshot) => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/delivery.ts","../src/event-mapper.ts","../src/topology.ts","../src/trace.ts"],"sourcesContent":["export { createKortyxTelemetryAdapter } from \"./adapter\";\nexport type {\n CreateKortyxTelemetryAdapterOptions,\n KortyxTelemetryAdapter,\n} from \"./types\";\n","import { randomUUID } from \"node:crypto\";\nimport type {\n EnsureWorkflowTopologyResponse,\n KortyxTelemetryEvent,\n} from \"@kortyx/hooks\";\nimport { createDelivery, TelemetryHttpError } from \"./delivery\";\nimport { createEventMapper } from \"./event-mapper\";\nimport { createTopologyResolver } from \"./topology\";\nimport { createTraceAdapter } from \"./trace\";\nimport type {\n CreateKortyxTelemetryAdapterOptions,\n KortyxTelemetryAdapter,\n} from \"./types\";\n\nexport type {\n CreateKortyxTelemetryAdapterOptions,\n KortyxTelemetryAdapter,\n} from \"./types\";\n\nconst DEFAULT_FLUSH_INTERVAL_MS = 250;\nconst DEFAULT_MAX_QUEUE_SIZE = 1_000;\n\nconst createId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nconst endpointFor = (endpoint: string, path: string): string =>\n `${endpoint.replace(/\\/$/, \"\")}${path}`;\n\n/**\n * Creates the optional Kortyx Studio HTTP adapter. Execution paths only enqueue\n * telemetry; delivery remains best-effort and cannot fail a workflow.\n */\nexport function createKortyxTelemetryAdapter(\n options: CreateKortyxTelemetryAdapterOptions,\n): KortyxTelemetryAdapter {\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (!fetchImpl) {\n throw new Error(\n \"createKortyxTelemetryAdapter requires a fetch implementation.\",\n );\n }\n\n const send = async (path: string, body: unknown): Promise<Response> => {\n const response = await fetchImpl(endpointFor(options.endpoint, path), {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${options.apiKey}`,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n if (!response.ok) throw new TelemetryHttpError(response.status);\n return response;\n };\n\n const delivery = createDelivery({\n maxQueueSize: options.maxQueueSize ?? DEFAULT_MAX_QUEUE_SIZE,\n flushIntervalMs: options.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS,\n send: async (events) => {\n await send(\"/v1/telemetry/events:batch\", { events });\n },\n });\n const eventMapper = createEventMapper({\n environment: options.environment,\n service: options.service,\n ...(options.metadata ? { metadata: options.metadata } : {}),\n ...(options.tags ? { tags: options.tags } : {}),\n createId,\n });\n const topology = createTopologyResolver({\n ensure: async (snapshot) => {\n const response = await send(\n \"/v1/telemetry/workflow-revisions:ensure\",\n snapshot,\n );\n return (await response.json()) as EnsureWorkflowTopologyResponse;\n },\n });\n const trace = createTraceAdapter({\n ...(options.captureContent\n ? { captureContent: options.captureContent }\n : {}),\n createId,\n enqueue: delivery.enqueue,\n eventMapper,\n });\n const emit = async (events: KortyxTelemetryEvent[]): Promise<void> => {\n for (const event of events) delivery.enqueue(event);\n };\n\n return {\n trace,\n reporter: {\n ensureWorkflowTopology: topology.ensureWorkflowTopology,\n emit,\n getWorkflowRevisionId: topology.getWorkflowRevisionId,\n },\n environment: options.environment,\n service: options.service,\n ...(options.captureContent\n ? { captureContent: options.captureContent }\n : {}),\n ...(options.metadata ? { metadata: options.metadata } : {}),\n ...(options.tags ? { tags: options.tags } : {}),\n flush: delivery.flush,\n getDroppedEventCount: delivery.getDroppedEventCount,\n getPermanentDeliveryFailureCount: delivery.getPermanentDeliveryFailureCount,\n };\n}\n","import type { KortyxTelemetryEvent } from \"@kortyx/hooks\";\n\nexport class TelemetryHttpError extends Error {\n constructor(readonly status: number) {\n super(`Kortyx telemetry request failed (${status}).`);\n }\n}\n\nexport const createDelivery = (args: {\n maxQueueSize: number;\n flushIntervalMs: number;\n send: (events: KortyxTelemetryEvent[]) => Promise<void>;\n}) => {\n const queue: KortyxTelemetryEvent[] = [];\n let dropped = 0;\n let permanentFailures = 0;\n let retryAttempt = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let inFlight: Promise<{ retryDelay: number | null }> | undefined;\n const schedule = (delay = args.flushIntervalMs) => {\n if (timer || inFlight || queue.length === 0) return;\n timer = setTimeout(() => {\n timer = undefined;\n void flush();\n }, delay);\n if (typeof timer === \"object\" && \"unref\" in timer) timer.unref?.();\n };\n const flush = async (): Promise<void> => {\n while (true) {\n if (inFlight) {\n const result = await inFlight;\n if (result.retryDelay !== null) return;\n continue;\n }\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n if (queue.length === 0) return;\n const events = queue.splice(0);\n const current = (async (): Promise<{ retryDelay: number | null }> => {\n try {\n await args.send(events);\n retryAttempt = 0;\n return { retryDelay: null };\n } catch (error) {\n const status =\n error instanceof TelemetryHttpError ? error.status : undefined;\n if (status !== undefined && status !== 429 && status < 500) {\n permanentFailures += events.length;\n return { retryDelay: null };\n }\n const overflow = Math.max(\n 0,\n queue.length + events.length - args.maxQueueSize,\n );\n if (overflow) {\n dropped += overflow;\n events.splice(0, overflow);\n }\n queue.unshift(...events);\n retryAttempt += 1;\n const backoff = Math.min(30_000, 250 * 2 ** (retryAttempt - 1));\n return {\n retryDelay: Math.floor(backoff * (0.5 + Math.random() * 0.5)),\n };\n }\n })();\n inFlight = current;\n const result = await current;\n if (inFlight === current) inFlight = undefined;\n if (result.retryDelay !== null) {\n schedule(result.retryDelay);\n return;\n }\n }\n };\n return {\n enqueue: (event: KortyxTelemetryEvent) => {\n if (queue.length >= args.maxQueueSize) {\n queue.shift();\n dropped += 1;\n }\n queue.push(event);\n schedule();\n },\n flush,\n getDroppedEventCount: () => dropped,\n getPermanentDeliveryFailureCount: () => permanentFailures,\n };\n};\n","import {\n errorProperty,\n isControlFlowError,\n serializeFailure,\n} from \"@kortyx/core/errors\";\nimport type {\n KortyxTelemetryConfig,\n KortyxTelemetryEvent,\n KortyxTelemetryEventType,\n ReasonTraceAttributes,\n ReasonTraceSpanStartArgs,\n} from \"@kortyx/hooks\";\nimport type { ActiveSpan, SpanContext } from \"./types\";\n\nconst stringValue = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.length > 0 ? value : undefined;\n\nconst shouldCapture = (\n value: KortyxTelemetryConfig[\"captureContent\"] | undefined,\n side: \"input\" | \"output\",\n): boolean => {\n if (value === true) return true;\n return Boolean(value && typeof value === \"object\" && value[side]);\n};\n\nconst asErrorPayload = (error: unknown): Record<string, unknown> =>\n isControlFlowError(error)\n ? {\n name: errorProperty(error, \"name\"),\n code: errorProperty(error, \"code\"),\n message: \"Execution paused or cancelled.\",\n controlFlow: true,\n }\n : { ...serializeFailure(error), name: \"KortyxError\" };\n\nconst correlationFrom = (\n attributes: ReasonTraceAttributes | undefined,\n active: ActiveSpan | undefined,\n): KortyxTelemetryEvent[\"correlation\"] | undefined => {\n const source = attributes ?? {};\n const runId = stringValue(source.runId) ?? active?.correlation.runId;\n const workflowId =\n stringValue(source.workflowId) ?? active?.correlation.workflowId;\n if (!runId || !workflowId) return undefined;\n\n const sameWorkflow = workflowId === active?.correlation.workflowId;\n const sessionId =\n stringValue(source.sessionId) ?? active?.correlation.sessionId;\n const workflowRevisionId =\n stringValue(source.workflowRevisionId) ??\n (sameWorkflow ? active?.correlation.workflowRevisionId : undefined);\n const topologyHash =\n stringValue(source.topologyHash) ??\n (sameWorkflow ? active?.correlation.topologyHash : undefined);\n const nodeId =\n stringValue(source.nodeId) ??\n (sameWorkflow ? active?.correlation.nodeId : undefined);\n return {\n runId,\n workflowId,\n ...Object.fromEntries(\n [\"invocationId\", \"parentInvocationId\", \"branchId\"].flatMap((key) => {\n const value =\n stringValue(source[key]) ??\n active?.correlation[key as \"invocationId\"];\n return value ? [[key, value]] : [];\n }),\n ),\n ...(sessionId ? { sessionId } : {}),\n ...(workflowRevisionId ? { workflowRevisionId } : {}),\n ...(topologyHash ? { topologyHash } : {}),\n ...(nodeId ? { nodeId } : {}),\n };\n};\n\nexport const createEventMapper = (args: {\n environment: string;\n service: KortyxTelemetryEvent[\"service\"];\n metadata?: Record<string, unknown> | undefined;\n tags?: string[] | undefined;\n createId: () => string;\n}) => {\n const createEvent = (input: {\n type: KortyxTelemetryEventType;\n correlation: KortyxTelemetryEvent[\"correlation\"];\n span?: SpanContext | undefined;\n parentSpanId?: string | undefined;\n payload: Record<string, unknown>;\n context?: KortyxTelemetryEvent[\"context\"] | undefined;\n }): KortyxTelemetryEvent => ({\n schemaVersion: 1,\n eventId: args.createId(),\n occurredAt: new Date().toISOString(),\n environment: args.environment,\n service: args.service,\n correlation: {\n ...input.correlation,\n ...(input.span\n ? { traceId: input.span.traceId, spanId: input.span.spanId }\n : {}),\n ...(input.parentSpanId ? { parentSpanId: input.parentSpanId } : {}),\n },\n ...(input.context || args.metadata || args.tags\n ? {\n context: {\n ...(args.tags ? { tags: args.tags } : {}),\n ...(args.metadata ? { metadata: args.metadata } : {}),\n ...(input.context ?? {}),\n },\n }\n : {}),\n type: input.type,\n payload: {\n ...input.payload,\n ...(input.correlation.invocationId\n ? { invocationId: input.correlation.invocationId }\n : {}),\n ...(input.correlation.parentInvocationId\n ? { parentInvocationId: input.correlation.parentInvocationId }\n : {}),\n ...(input.correlation.branchId\n ? { branchId: input.correlation.branchId }\n : {}),\n },\n });\n\n const spanContext = (\n telemetry: ReasonTraceSpanStartArgs[\"telemetry\"] | undefined,\n attributes: ReasonTraceAttributes,\n ): KortyxTelemetryEvent[\"context\"] | undefined => {\n const tags = [...(args.tags ?? []), ...(telemetry?.tags ?? [])];\n const metadata = {\n ...(args.metadata ?? {}),\n ...(telemetry?.metadata ?? {}),\n };\n const userId = stringValue(attributes.userId);\n const tenantId = stringValue(attributes.tenantId);\n return userId || tenantId || tags.length || Object.keys(metadata).length\n ? {\n ...(userId ? { userId } : {}),\n ...(tenantId ? { tenantId } : {}),\n ...(tags.length ? { tags } : {}),\n ...(Object.keys(metadata).length ? { metadata } : {}),\n }\n : undefined;\n };\n\n const telemetryPayload = (\n telemetry: ReasonTraceSpanStartArgs[\"telemetry\"] | undefined,\n ): Record<string, unknown> => ({\n ...(telemetry?.operation ? { operation: telemetry.operation } : {}),\n ...(telemetry?.tags?.length ? { tags: telemetry.tags } : {}),\n ...(telemetry?.metadata ? { metadata: telemetry.metadata } : {}),\n ...(telemetry?.prompt\n ? {\n prompt: {\n ...(telemetry.prompt.name ? { name: telemetry.prompt.name } : {}),\n ...(telemetry.prompt.version !== undefined\n ? { version: telemetry.prompt.version }\n : {}),\n ...(telemetry.prompt.type ? { type: telemetry.prompt.type } : {}),\n ...(telemetry.prompt.source\n ? { source: telemetry.prompt.source }\n : {}),\n },\n }\n : {}),\n });\n\n return {\n asErrorPayload,\n correlationFrom,\n createEvent,\n shouldCapture,\n spanContext,\n stringValue,\n telemetryPayload,\n };\n};\n","import type {\n EnsureWorkflowTopologyRequest,\n EnsureWorkflowTopologyResponse,\n} from \"@kortyx/hooks\";\n\ntype TopologyKey = {\n environment: string;\n workflowId: string;\n topologyHash: string;\n};\n\nconst keyFor = ({ environment, workflowId, topologyHash }: TopologyKey) =>\n `${environment}:${workflowId}:${topologyHash}`;\n\n/** Caches successful topology ensures and coalesces concurrent requests. */\nexport const createTopologyResolver = (args: {\n ensure: (\n snapshot: EnsureWorkflowTopologyRequest,\n ) => Promise<EnsureWorkflowTopologyResponse>;\n}) => {\n const revisions = new Map<string, string>();\n const pending = new Map<string, Promise<EnsureWorkflowTopologyResponse>>();\n\n const ensureWorkflowTopology = (\n snapshot: EnsureWorkflowTopologyRequest,\n ): Promise<EnsureWorkflowTopologyResponse> => {\n const key = keyFor({\n environment: snapshot.environment,\n workflowId: snapshot.workflow.id,\n topologyHash: snapshot.workflow.topologyHash,\n });\n const revision = revisions.get(key);\n if (revision) {\n return Promise.resolve({ workflowRevisionId: revision, created: false });\n }\n\n const existing = pending.get(key);\n if (existing) return existing;\n\n const request = args\n .ensure(snapshot)\n .then((result) => {\n if (!result.workflowRevisionId) {\n throw new Error(\n \"Telemetry API returned an invalid workflow revision.\",\n );\n }\n revisions.set(key, result.workflowRevisionId);\n return result;\n })\n .finally(() => {\n pending.delete(key);\n });\n pending.set(key, request);\n return request;\n };\n\n return {\n ensureWorkflowTopology,\n getWorkflowRevisionId: (args: TopologyKey) => revisions.get(keyFor(args)),\n };\n};\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type {\n KortyxTelemetryConfig,\n KortyxTelemetryEvent,\n ReasonTraceAdapter,\n ReasonTraceSpan,\n ReasonTraceSpanEndArgs,\n ReasonTraceSpanStartArgs,\n} from \"@kortyx/hooks\";\nimport type { createEventMapper } from \"./event-mapper\";\nimport type { ActiveSpan, SpanContext } from \"./types\";\n\n/** Maps generic SDK trace calls to Kortyx Studio's span and generation facts. */\nexport const createTraceAdapter = (args: {\n captureContent?: KortyxTelemetryConfig[\"captureContent\"] | undefined;\n createId: () => string;\n enqueue: (event: KortyxTelemetryEvent) => void;\n eventMapper: ReturnType<typeof createEventMapper>;\n}): ReasonTraceAdapter => {\n const activeSpans = new AsyncLocalStorage<ActiveSpan>();\n\n const createSpan = (\n startArgs: ReasonTraceSpanStartArgs,\n ): { span: ReasonTraceSpan; active?: ActiveSpan | undefined } => {\n const parent = activeSpans.getStore();\n const span: SpanContext = {\n traceId: parent?.traceId ?? args.createId(),\n spanId: args.createId(),\n };\n const attributes = { ...(startArgs.attributes ?? {}) };\n const currentAttributes = { ...attributes };\n const correlation = args.eventMapper.correlationFrom(attributes, parent);\n const startedAt = Date.now();\n\n if (correlation) {\n args.enqueue(\n args.eventMapper.createEvent({\n type: \"span.started\",\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: {\n name: startArgs.name,\n attributes: currentAttributes,\n telemetry: args.eventMapper.telemetryPayload(startArgs.telemetry),\n ...(args.eventMapper.shouldCapture(\n startArgs.telemetry?.captureContent ?? args.captureContent,\n \"input\",\n )\n ? { input: startArgs.telemetry?.input }\n : {}),\n },\n context: args.eventMapper.spanContext(\n startArgs.telemetry,\n currentAttributes,\n ),\n }),\n );\n }\n\n let ended = false;\n let failed = false;\n const end = (endArgs?: ReasonTraceSpanEndArgs): void => {\n if (ended) return;\n ended = true;\n if (!correlation) return;\n\n const endAttributes = {\n ...currentAttributes,\n ...(endArgs?.attributes ?? {}),\n };\n const telemetry = endArgs?.telemetry ?? startArgs.telemetry;\n const durationMs = Date.now() - startedAt;\n args.enqueue(\n args.eventMapper.createEvent({\n type: \"span.ended\",\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: {\n name: startArgs.name,\n attributes: endAttributes,\n durationMs,\n telemetry: args.eventMapper.telemetryPayload(telemetry),\n ...(args.eventMapper.shouldCapture(\n endArgs?.telemetry?.captureContent ??\n startArgs.telemetry?.captureContent ??\n args.captureContent,\n \"output\",\n )\n ? { output: endArgs?.telemetry?.output }\n : {}),\n },\n context: args.eventMapper.spanContext(telemetry, endAttributes),\n }),\n );\n\n if (startArgs.name !== \"runReasonEngine\") return;\n const ttftMs = nonnegativeNumber(endAttributes.ttftMs);\n const streamDurationMs = nonnegativeNumber(\n endAttributes.streamDurationMs,\n );\n const timeToLastTokenMs = nonnegativeNumber(\n endAttributes.timeToLastTokenMs,\n );\n args.enqueue(\n args.eventMapper.createEvent({\n type: \"generation.completed\",\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: {\n outcome: failed ? \"failed\" : \"completed\",\n provider:\n args.eventMapper.stringValue(attributes.providerId) ?? \"unknown\",\n model:\n args.eventMapper.stringValue(attributes.modelId) ?? \"unknown\",\n durationMs,\n ...(ttftMs !== undefined ? { ttftMs } : {}),\n ...(streamDurationMs !== undefined ? { streamDurationMs } : {}),\n ...(timeToLastTokenMs !== undefined\n ? {\n postStreamDurationMs: Math.max(\n 0,\n durationMs - timeToLastTokenMs,\n ),\n }\n : {}),\n ...(endArgs?.usage ? { usage: endArgs.usage } : {}),\n ...(endArgs?.finishReason\n ? { finishReason: endArgs.finishReason }\n : {}),\n ...(endArgs?.warnings ? { warnings: endArgs.warnings } : {}),\n ...(endArgs?.providerMetadata\n ? { providerMetadata: endArgs.providerMetadata }\n : {}),\n },\n context: args.eventMapper.spanContext(telemetry, currentAttributes),\n }),\n );\n };\n\n const traceSpan: ReasonTraceSpan = {\n setAttributes: (nextAttributes) => {\n Object.assign(currentAttributes, nextAttributes);\n },\n addEvent: (name, eventAttributes = {}) => {\n if (!correlation) return;\n const type =\n name === \"useReason.tool-call.start\"\n ? \"tool.started\"\n : name === \"useReason.tool-call.complete\"\n ? \"tool.completed\"\n : name === \"useReason.tool-call.error\"\n ? \"tool.failed\"\n : undefined;\n if (!type) return;\n args.enqueue(\n args.eventMapper.createEvent({\n type,\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: eventAttributes,\n }),\n );\n },\n end,\n fail: (error, endArgs) => {\n if (ended) return;\n failed = true;\n if (correlation) {\n args.enqueue(\n args.eventMapper.createEvent({\n type: \"span.failed\",\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: {\n name: startArgs.name,\n error: args.eventMapper.asErrorPayload(error),\n durationMs: Date.now() - startedAt,\n },\n }),\n );\n }\n end(endArgs);\n },\n };\n\n return {\n span: traceSpan,\n ...(correlation ? { active: { ...span, correlation } } : {}),\n };\n };\n\n return {\n startSpan: (startArgs) => createSpan(startArgs).span,\n withSpan: async (startArgs, fn) => {\n const created = createSpan(startArgs);\n const run = async (): Promise<Awaited<ReturnType<typeof fn>>> => {\n try {\n const result = await fn(created.span);\n created.span.end?.();\n return result;\n } catch (error) {\n try {\n created.span.fail?.(error);\n } catch {\n /* Preserve the callback failure. */\n }\n throw error;\n }\n };\n return created.active ? activeSpans.run(created.active, run) : run();\n },\n getActiveContext: () => {\n const active = activeSpans.getStore();\n return active\n ? { traceId: active.traceId, spanId: active.spanId }\n : undefined;\n },\n };\n};\n\nconst nonnegativeNumber = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? value\n : undefined;\n"],"mappings":"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","names":["result","args"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/delivery.ts","../src/event-mapper.ts","../src/topology.ts","../src/trace.ts"],"sourcesContent":["export { createKortyxTelemetryAdapter } from \"./adapter\";\nexport type {\n CreateKortyxTelemetryAdapterOptions,\n KortyxTelemetryAdapter,\n} from \"./types\";\n","import { randomUUID } from \"node:crypto\";\nimport type {\n EnsureWorkflowTopologyResponse,\n KortyxTelemetryEvent,\n} from \"@kortyx/hooks\";\nimport { createDelivery, TelemetryHttpError } from \"./delivery\";\nimport { createEventMapper } from \"./event-mapper\";\nimport { createTopologyResolver } from \"./topology\";\nimport { createTraceAdapter } from \"./trace\";\nimport type {\n CreateKortyxTelemetryAdapterOptions,\n KortyxTelemetryAdapter,\n} from \"./types\";\n\nexport type {\n CreateKortyxTelemetryAdapterOptions,\n KortyxTelemetryAdapter,\n} from \"./types\";\n\nconst DEFAULT_FLUSH_INTERVAL_MS = 250;\nconst DEFAULT_MAX_QUEUE_SIZE = 1_000;\n\nconst createId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nconst endpointFor = (endpoint: string, path: string): string =>\n `${endpoint.replace(/\\/$/, \"\")}${path}`;\n\n/**\n * Creates the optional Kortyx Studio HTTP adapter. Execution paths only enqueue\n * telemetry; delivery remains best-effort and cannot fail a workflow.\n */\nexport function createKortyxTelemetryAdapter(\n options: CreateKortyxTelemetryAdapterOptions,\n): KortyxTelemetryAdapter {\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (!fetchImpl) {\n throw new Error(\n \"createKortyxTelemetryAdapter requires a fetch implementation.\",\n );\n }\n\n const send = async (path: string, body: unknown): Promise<Response> => {\n const response = await fetchImpl(endpointFor(options.endpoint, path), {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${options.apiKey}`,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n if (!response.ok) throw new TelemetryHttpError(response.status);\n return response;\n };\n\n const delivery = createDelivery({\n maxQueueSize: options.maxQueueSize ?? DEFAULT_MAX_QUEUE_SIZE,\n flushIntervalMs: options.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS,\n send: async (events) => {\n await send(\"/v1/telemetry/events:batch\", { events });\n },\n });\n const eventMapper = createEventMapper({\n environment: options.environment,\n service: options.service,\n ...(options.metadata ? { metadata: options.metadata } : {}),\n ...(options.tags ? { tags: options.tags } : {}),\n createId,\n ...(options.error ? { error: options.error } : {}),\n });\n const topology = createTopologyResolver({\n ensure: async (snapshot) => {\n const response = await send(\n \"/v1/telemetry/workflow-revisions:ensure\",\n snapshot,\n );\n return (await response.json()) as EnsureWorkflowTopologyResponse;\n },\n });\n const trace = createTraceAdapter({\n ...(options.captureContent\n ? { captureContent: options.captureContent }\n : {}),\n createId,\n enqueue: delivery.enqueue,\n eventMapper,\n });\n const emit = async (events: KortyxTelemetryEvent[]): Promise<void> => {\n for (const event of events) delivery.enqueue(event);\n };\n\n return {\n trace,\n reporter: {\n ensureWorkflowTopology: topology.ensureWorkflowTopology,\n emit,\n getWorkflowRevisionId: topology.getWorkflowRevisionId,\n },\n environment: options.environment,\n service: options.service,\n ...(options.captureContent\n ? { captureContent: options.captureContent }\n : {}),\n ...(options.metadata ? { metadata: options.metadata } : {}),\n ...(options.tags ? { tags: options.tags } : {}),\n flush: delivery.flush,\n getDroppedEventCount: delivery.getDroppedEventCount,\n getPermanentDeliveryFailureCount: delivery.getPermanentDeliveryFailureCount,\n };\n}\n","import type { KortyxTelemetryEvent } from \"@kortyx/hooks\";\n\nexport class TelemetryHttpError extends Error {\n constructor(readonly status: number) {\n super(`Kortyx telemetry request failed (${status}).`);\n }\n}\n\nexport const createDelivery = (args: {\n maxQueueSize: number;\n flushIntervalMs: number;\n send: (events: KortyxTelemetryEvent[]) => Promise<void>;\n}) => {\n const queue: KortyxTelemetryEvent[] = [];\n let dropped = 0;\n let permanentFailures = 0;\n let retryAttempt = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let inFlight: Promise<{ retryDelay: number | null }> | undefined;\n const schedule = (delay = args.flushIntervalMs) => {\n if (timer || inFlight || queue.length === 0) return;\n timer = setTimeout(() => {\n timer = undefined;\n void flush();\n }, delay);\n if (typeof timer === \"object\" && \"unref\" in timer) timer.unref?.();\n };\n const flush = async (): Promise<void> => {\n while (true) {\n if (inFlight) {\n const result = await inFlight;\n if (result.retryDelay !== null) return;\n continue;\n }\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n if (queue.length === 0) return;\n const events = queue.splice(0);\n const current = (async (): Promise<{ retryDelay: number | null }> => {\n try {\n await args.send(events);\n retryAttempt = 0;\n return { retryDelay: null };\n } catch (error) {\n const status =\n error instanceof TelemetryHttpError ? error.status : undefined;\n if (status !== undefined && status !== 429 && status < 500) {\n permanentFailures += events.length;\n return { retryDelay: null };\n }\n const overflow = Math.max(\n 0,\n queue.length + events.length - args.maxQueueSize,\n );\n if (overflow) {\n dropped += overflow;\n events.splice(0, overflow);\n }\n queue.unshift(...events);\n retryAttempt += 1;\n const backoff = Math.min(30_000, 250 * 2 ** (retryAttempt - 1));\n return {\n retryDelay: Math.floor(backoff * (0.5 + Math.random() * 0.5)),\n };\n }\n })();\n inFlight = current;\n const result = await current;\n if (inFlight === current) inFlight = undefined;\n if (result.retryDelay !== null) {\n schedule(result.retryDelay);\n return;\n }\n }\n };\n return {\n enqueue: (event: KortyxTelemetryEvent) => {\n if (queue.length >= args.maxQueueSize) {\n queue.shift();\n dropped += 1;\n }\n queue.push(event);\n schedule();\n },\n flush,\n getDroppedEventCount: () => dropped,\n getPermanentDeliveryFailureCount: () => permanentFailures,\n };\n};\n","import {\n errorProperty,\n isControlFlowError,\n serializeFailure,\n} from \"@kortyx/core/errors\";\nimport type {\n KortyxTelemetryConfig,\n KortyxTelemetryEvent,\n KortyxTelemetryEventType,\n ReasonTraceAttributes,\n ReasonTraceSpanStartArgs,\n} from \"@kortyx/hooks\";\nimport {\n errorDiagnostics,\n isModelTraceSpan,\n safeTelemetryMetadata,\n} from \"@kortyx/hooks/internal\";\nimport type { ActiveSpan, SpanContext } from \"./types\";\n\nconst stringValue = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.length > 0 ? value : undefined;\n\nconst shouldCapture = (\n value: KortyxTelemetryConfig[\"captureContent\"] | undefined,\n side: \"input\" | \"output\",\n): boolean => {\n if (value === true) return true;\n return Boolean(value && typeof value === \"object\" && value[side]);\n};\n\nconst asErrorPayload = (\n error: unknown,\n name?: string,\n project?: import(\"@kortyx/hooks\").KortyxTraceErrorProjection,\n): Record<string, unknown> => {\n if (isControlFlowError(error))\n return {\n name: errorProperty(error, \"name\"),\n code: errorProperty(error, \"code\"),\n message: \"Execution paused or cancelled.\",\n controlFlow: true,\n };\n const failure = serializeFailure(error);\n if (!isModelTraceSpan(name ?? \"\")) return { ...failure, name: \"KortyxError\" };\n const diagnostic = errorDiagnostics(error, project);\n return {\n ...failure,\n name: diagnostic.errorType ?? \"Error\",\n message: diagnostic.errorMessage ?? \"Model execution failed.\",\n };\n};\n\nconst correlationFrom = (\n attributes: ReasonTraceAttributes | undefined,\n active: ActiveSpan | undefined,\n): KortyxTelemetryEvent[\"correlation\"] | undefined => {\n const source = attributes ?? {};\n const runId = stringValue(source.runId) ?? active?.correlation.runId;\n const workflowId =\n stringValue(source.workflowId) ?? active?.correlation.workflowId;\n if (!runId || !workflowId) return undefined;\n\n const sameWorkflow = workflowId === active?.correlation.workflowId;\n const sessionId =\n stringValue(source.sessionId) ?? active?.correlation.sessionId;\n const workflowRevisionId =\n stringValue(source.workflowRevisionId) ??\n (sameWorkflow ? active?.correlation.workflowRevisionId : undefined);\n const topologyHash =\n stringValue(source.topologyHash) ??\n (sameWorkflow ? active?.correlation.topologyHash : undefined);\n const nodeId =\n stringValue(source.nodeId) ??\n (sameWorkflow ? active?.correlation.nodeId : undefined);\n return {\n runId,\n workflowId,\n ...Object.fromEntries(\n [\"invocationId\", \"parentInvocationId\", \"branchId\"].flatMap((key) => {\n const value =\n stringValue(source[key]) ??\n active?.correlation[key as \"invocationId\"];\n return value ? [[key, value]] : [];\n }),\n ),\n ...(sessionId ? { sessionId } : {}),\n ...(workflowRevisionId ? { workflowRevisionId } : {}),\n ...(topologyHash ? { topologyHash } : {}),\n ...(nodeId ? { nodeId } : {}),\n };\n};\n\nexport const createEventMapper = (args: {\n environment: string;\n service: KortyxTelemetryEvent[\"service\"];\n metadata?: Record<string, unknown> | undefined;\n tags?: string[] | undefined;\n createId: () => string;\n error?: import(\"@kortyx/hooks\").KortyxTraceErrorProjection;\n}) => {\n const createEvent = (input: {\n type: KortyxTelemetryEventType;\n correlation: KortyxTelemetryEvent[\"correlation\"];\n span?: SpanContext | undefined;\n parentSpanId?: string | undefined;\n payload: Record<string, unknown>;\n context?: KortyxTelemetryEvent[\"context\"] | undefined;\n }): KortyxTelemetryEvent => ({\n schemaVersion: 1,\n eventId: args.createId(),\n occurredAt: new Date().toISOString(),\n environment: args.environment,\n service: args.service,\n correlation: {\n ...input.correlation,\n ...(input.span\n ? { traceId: input.span.traceId, spanId: input.span.spanId }\n : {}),\n ...(input.parentSpanId ? { parentSpanId: input.parentSpanId } : {}),\n },\n ...(input.context || args.metadata || args.tags\n ? {\n context: {\n ...(args.tags ? { tags: args.tags } : {}),\n ...(args.metadata\n ? { metadata: safeTelemetryMetadata(args.metadata) }\n : {}),\n ...(input.context ?? {}),\n },\n }\n : {}),\n type: input.type,\n payload: {\n ...input.payload,\n ...(input.correlation.invocationId\n ? { invocationId: input.correlation.invocationId }\n : {}),\n ...(input.correlation.parentInvocationId\n ? { parentInvocationId: input.correlation.parentInvocationId }\n : {}),\n ...(input.correlation.branchId\n ? { branchId: input.correlation.branchId }\n : {}),\n },\n });\n\n const spanContext = (\n telemetry: ReasonTraceSpanStartArgs[\"telemetry\"] | undefined,\n attributes: ReasonTraceAttributes,\n ): KortyxTelemetryEvent[\"context\"] | undefined => {\n const tags = [...(args.tags ?? []), ...(telemetry?.tags ?? [])];\n const metadata = safeTelemetryMetadata({\n ...(args.metadata ?? {}),\n ...(telemetry?.metadata ?? {}),\n });\n const userId = stringValue(attributes.userId);\n const tenantId = stringValue(attributes.tenantId);\n return userId || tenantId || tags.length || Object.keys(metadata).length\n ? {\n ...(userId ? { userId } : {}),\n ...(tenantId ? { tenantId } : {}),\n ...(tags.length ? { tags } : {}),\n ...(Object.keys(metadata).length ? { metadata } : {}),\n }\n : undefined;\n };\n\n const telemetryPayload = (\n telemetry: ReasonTraceSpanStartArgs[\"telemetry\"] | undefined,\n ): Record<string, unknown> => ({\n ...(telemetry?.operation ? { operation: telemetry.operation } : {}),\n ...(telemetry?.tags?.length ? { tags: telemetry.tags } : {}),\n ...(telemetry?.metadata\n ? { metadata: safeTelemetryMetadata(telemetry.metadata) }\n : {}),\n ...(telemetry?.prompt\n ? {\n prompt: {\n ...(telemetry.prompt.name ? { name: telemetry.prompt.name } : {}),\n ...(telemetry.prompt.version !== undefined\n ? { version: telemetry.prompt.version }\n : {}),\n ...(telemetry.prompt.type ? { type: telemetry.prompt.type } : {}),\n ...(telemetry.prompt.source\n ? { source: telemetry.prompt.source }\n : {}),\n },\n }\n : {}),\n });\n\n return {\n asErrorPayload: (error: unknown, name?: string) =>\n asErrorPayload(error, name, args.error),\n correlationFrom,\n createEvent,\n shouldCapture,\n spanContext,\n stringValue,\n telemetryPayload,\n };\n};\n","import type {\n EnsureWorkflowTopologyRequest,\n EnsureWorkflowTopologyResponse,\n} from \"@kortyx/hooks\";\n\ntype TopologyKey = {\n environment: string;\n workflowId: string;\n topologyHash: string;\n};\n\nconst keyFor = ({ environment, workflowId, topologyHash }: TopologyKey) =>\n `${environment}:${workflowId}:${topologyHash}`;\n\n/** Caches successful topology ensures and coalesces concurrent requests. */\nexport const createTopologyResolver = (args: {\n ensure: (\n snapshot: EnsureWorkflowTopologyRequest,\n ) => Promise<EnsureWorkflowTopologyResponse>;\n}) => {\n const revisions = new Map<string, string>();\n const pending = new Map<string, Promise<EnsureWorkflowTopologyResponse>>();\n\n const ensureWorkflowTopology = (\n snapshot: EnsureWorkflowTopologyRequest,\n ): Promise<EnsureWorkflowTopologyResponse> => {\n const key = keyFor({\n environment: snapshot.environment,\n workflowId: snapshot.workflow.id,\n topologyHash: snapshot.workflow.topologyHash,\n });\n const revision = revisions.get(key);\n if (revision) {\n return Promise.resolve({ workflowRevisionId: revision, created: false });\n }\n\n const existing = pending.get(key);\n if (existing) return existing;\n\n const request = args\n .ensure(snapshot)\n .then((result) => {\n if (!result.workflowRevisionId) {\n throw new Error(\n \"Telemetry API returned an invalid workflow revision.\",\n );\n }\n revisions.set(key, result.workflowRevisionId);\n return result;\n })\n .finally(() => {\n pending.delete(key);\n });\n pending.set(key, request);\n return request;\n };\n\n return {\n ensureWorkflowTopology,\n getWorkflowRevisionId: (args: TopologyKey) => revisions.get(keyFor(args)),\n };\n};\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type {\n KortyxTelemetryConfig,\n KortyxTelemetryEvent,\n ReasonTraceAdapter,\n ReasonTraceSpan,\n ReasonTraceSpanEndArgs,\n ReasonTraceSpanStartArgs,\n} from \"@kortyx/hooks\";\nimport { ToolObservationSchema } from \"@kortyx/telemetry-contracts\";\nimport type { createEventMapper } from \"./event-mapper\";\nimport type { ActiveSpan, SpanContext } from \"./types\";\n\n/** Maps generic SDK trace calls to Kortyx Studio's span and generation facts. */\nexport const createTraceAdapter = (args: {\n captureContent?: KortyxTelemetryConfig[\"captureContent\"] | undefined;\n createId: () => string;\n enqueue: (event: KortyxTelemetryEvent) => void;\n eventMapper: ReturnType<typeof createEventMapper>;\n}): ReasonTraceAdapter => {\n const activeSpans = new AsyncLocalStorage<ActiveSpan>();\n\n const createSpan = (\n startArgs: ReasonTraceSpanStartArgs,\n ): { span: ReasonTraceSpan; active?: ActiveSpan | undefined } => {\n const parent = activeSpans.getStore();\n const span: SpanContext = {\n traceId: parent?.traceId ?? args.createId(),\n spanId: args.createId(),\n };\n const attributes = { ...(startArgs.attributes ?? {}) };\n const currentAttributes = { ...attributes };\n const correlation = args.eventMapper.correlationFrom(attributes, parent);\n const startedAt = Date.now();\n\n const isTool = startArgs.name === \"kortyx.tool\";\n if (correlation && (!isTool || attributes.executed === true)) {\n args.enqueue(\n args.eventMapper.createEvent({\n type: isTool ? \"tool.started\" : \"span.started\",\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: isTool\n ? ToolObservationSchema.parse(attributes)\n : {\n name: startArgs.name,\n attributes: currentAttributes,\n telemetry: args.eventMapper.telemetryPayload(\n startArgs.telemetry,\n ),\n ...(args.eventMapper.shouldCapture(\n startArgs.telemetry?.captureContent ?? args.captureContent,\n \"input\",\n )\n ? { input: startArgs.telemetry?.input }\n : {}),\n },\n context: args.eventMapper.spanContext(\n startArgs.telemetry,\n currentAttributes,\n ),\n }),\n );\n }\n\n let ended = false;\n let failed = false;\n const end = (endArgs?: ReasonTraceSpanEndArgs): void => {\n if (ended) return;\n ended = true;\n if (!correlation) return;\n\n const endAttributes = {\n ...currentAttributes,\n ...(endArgs?.attributes ?? {}),\n };\n const telemetry = endArgs?.telemetry ?? startArgs.telemetry;\n const durationMs = Date.now() - startedAt;\n if (isTool) {\n const payload = ToolObservationSchema.parse(endAttributes);\n const type =\n payload.observationKind === \"reused\"\n ? \"tool.reused\"\n : payload.observationKind === \"waiting\"\n ? \"tool.waiting\"\n : payload.suspended\n ? \"tool.suspended\"\n : payload.outcome === \"denied\"\n ? \"tool.denied\"\n : payload.outcome === \"fault\"\n ? \"tool.failed\"\n : payload.outcome === \"cancelled\"\n ? \"tool.cancelled\"\n : \"tool.completed\";\n args.enqueue(\n args.eventMapper.createEvent({\n type,\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload,\n }),\n );\n return;\n }\n\n args.enqueue(\n args.eventMapper.createEvent({\n type: \"span.ended\",\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: {\n name: startArgs.name,\n attributes: endAttributes,\n durationMs,\n telemetry: args.eventMapper.telemetryPayload(telemetry),\n ...(args.eventMapper.shouldCapture(\n endArgs?.telemetry?.captureContent ??\n startArgs.telemetry?.captureContent ??\n args.captureContent,\n \"output\",\n )\n ? { output: endArgs?.telemetry?.output }\n : {}),\n },\n context: args.eventMapper.spanContext(telemetry, endAttributes),\n }),\n );\n\n if (startArgs.name !== \"runReasonEngine\") return;\n const ttftMs = nonnegativeNumber(endAttributes.ttftMs);\n const streamDurationMs = nonnegativeNumber(\n endAttributes.streamDurationMs,\n );\n const timeToLastTokenMs = nonnegativeNumber(\n endAttributes.timeToLastTokenMs,\n );\n args.enqueue(\n args.eventMapper.createEvent({\n type: \"generation.completed\",\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: {\n outcome: failed ? \"failed\" : \"completed\",\n provider:\n args.eventMapper.stringValue(attributes.providerId) ?? \"unknown\",\n model:\n args.eventMapper.stringValue(attributes.modelId) ?? \"unknown\",\n durationMs,\n ...(ttftMs !== undefined ? { ttftMs } : {}),\n ...(streamDurationMs !== undefined ? { streamDurationMs } : {}),\n ...(timeToLastTokenMs !== undefined\n ? {\n postStreamDurationMs: Math.max(\n 0,\n durationMs - timeToLastTokenMs,\n ),\n }\n : {}),\n ...(endArgs?.usage\n ? {\n usage: failed\n ? Object.fromEntries(\n Object.entries(endArgs.usage).filter(\n ([key, value]) =>\n ([\n \"input\",\n \"output\",\n \"total\",\n \"reasoning\",\n \"cacheRead\",\n \"cacheWrite\",\n \"cacheWrite1h\",\n ].includes(key) &&\n typeof value === \"number\" &&\n Number.isFinite(value)) ||\n ([\n \"outputIncludesReasoning\",\n \"inputIncludesCacheRead\",\n \"inputIncludesCacheWrite\",\n ].includes(key) &&\n typeof value === \"boolean\"),\n ),\n )\n : endArgs.usage,\n }\n : {}),\n ...(endArgs?.finishReason\n ? { finishReason: endArgs.finishReason }\n : {}),\n ...(endArgs?.warnings ? { warnings: endArgs.warnings } : {}),\n ...(endArgs?.providerMetadata && !failed\n ? { providerMetadata: endArgs.providerMetadata }\n : {}),\n },\n context: args.eventMapper.spanContext(telemetry, currentAttributes),\n }),\n );\n };\n\n const traceSpan: ReasonTraceSpan = {\n setAttributes: (nextAttributes) => {\n Object.assign(currentAttributes, nextAttributes);\n },\n addEvent: (name, eventAttributes = {}) => {\n if (\n !correlation ||\n activeSpans.getStore()?.name === \"kortyx.tool\" ||\n startArgs.name === \"kortyx.tool\"\n )\n return;\n const type =\n name === \"useReason.tool-call.start\"\n ? \"tool.started\"\n : name === \"useReason.tool-call.complete\"\n ? \"tool.completed\"\n : name === \"useReason.tool-call.error\"\n ? \"tool.failed\"\n : undefined;\n if (!type) return;\n args.enqueue(\n args.eventMapper.createEvent({\n type,\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: eventAttributes,\n }),\n );\n },\n end,\n fail: (error, endArgs) => {\n if (ended) return;\n failed = true;\n if (correlation) {\n args.enqueue(\n args.eventMapper.createEvent({\n type: \"span.failed\",\n correlation,\n span,\n ...(parent ? { parentSpanId: parent.spanId } : {}),\n payload: {\n name: startArgs.name,\n error: args.eventMapper.asErrorPayload(error, startArgs.name),\n durationMs: Date.now() - startedAt,\n },\n }),\n );\n }\n end(endArgs);\n },\n };\n\n return {\n span: traceSpan,\n ...(correlation\n ? { active: { ...span, name: startArgs.name, correlation } }\n : {}),\n };\n };\n\n return {\n startSpan: (startArgs) => createSpan(startArgs).span,\n withSpan: async (startArgs, fn) => {\n const created = createSpan(startArgs);\n const run = async (): Promise<Awaited<ReturnType<typeof fn>>> => {\n try {\n const result = await fn(created.span);\n created.span.end?.();\n return result;\n } catch (error) {\n try {\n created.span.fail?.(error);\n } catch {\n /* Preserve the callback failure. */\n }\n throw error;\n }\n };\n return created.active ? activeSpans.run(created.active, run) : run();\n },\n getActiveContext: () => {\n const active = activeSpans.getStore();\n return active\n ? { traceId: active.traceId, spanId: active.spanId }\n : undefined;\n },\n };\n};\n\nconst nonnegativeNumber = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? value\n : undefined;\n"],"mappings":"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","names":["result","args"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kortyx/telemetry",
3
- "version": "0.6.2",
3
+ "version": "0.7.0",
4
4
  "private": false,
5
5
  "description": "Kortyx Studio telemetry HTTP adapter.",
6
6
  "license": "Apache-2.0",
@@ -18,9 +18,9 @@
18
18
  "CHANGELOG.md"
19
19
  ],
20
20
  "dependencies": {
21
- "@kortyx/hooks": "0.25.2",
22
- "@kortyx/telemetry-contracts": "0.7.0",
23
- "@kortyx/core": "0.9.0"
21
+ "@kortyx/hooks": "0.26.0",
22
+ "@kortyx/core": "0.9.0",
23
+ "@kortyx/telemetry-contracts": "0.9.0"
24
24
  },
25
25
  "devDependencies": {
26
26
  "tsup": "^8.5.1",