@kortyx/telemetry-contracts 0.1.0 → 0.3.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/dist/index.js CHANGED
@@ -21,16 +21,164 @@ var index_exports = {};
21
21
  __export(index_exports, {
22
22
  EnsureWorkflowTopologyRequestSchema: () => EnsureWorkflowTopologyRequestSchema,
23
23
  EnsureWorkflowTopologyResponseSchema: () => EnsureWorkflowTopologyResponseSchema,
24
+ STUDIO_TIME_RANGES: () => STUDIO_TIME_RANGES,
25
+ StudioCatalogsResponseSchema: () => StudioCatalogsResponseSchema,
26
+ StudioChangeResourceSchema: () => StudioChangeResourceSchema,
27
+ StudioChangeSchema: () => StudioChangeSchema,
28
+ StudioContextResponseSchema: () => StudioContextResponseSchema,
29
+ StudioDetailEventSchema: () => StudioDetailEventSchema,
30
+ StudioInterruptDetailResponseSchema: () => StudioInterruptDetailResponseSchema,
31
+ StudioInterruptInteractionModeSchema: () => StudioInterruptInteractionModeSchema,
32
+ StudioInterruptOptionSchema: () => StudioInterruptOptionSchema,
33
+ StudioInterruptSchema: () => StudioInterruptSchema,
34
+ StudioInterruptStatusSchema: () => StudioInterruptStatusSchema,
35
+ StudioInterruptTypeSchema: () => StudioInterruptTypeSchema,
36
+ StudioInterruptsResponseSchema: () => StudioInterruptsResponseSchema,
37
+ StudioMetricSchema: () => StudioMetricSchema,
38
+ StudioPricingSourceSchema: () => StudioPricingSourceSchema,
39
+ StudioPricingStatusSchema: () => StudioPricingStatusSchema,
40
+ StudioResumeOutcomeSchema: () => StudioResumeOutcomeSchema,
41
+ StudioRunDetailResponseSchema: () => StudioRunDetailResponseSchema,
42
+ StudioRunSchema: () => StudioRunSchema,
43
+ StudioRunStatusSchema: () => StudioRunStatusSchema,
44
+ StudioRunsResponseSchema: () => StudioRunsResponseSchema,
45
+ StudioSessionDetailResponseSchema: () => StudioSessionDetailResponseSchema,
46
+ StudioSessionSchema: () => StudioSessionSchema,
47
+ StudioSessionsResponseSchema: () => StudioSessionsResponseSchema,
48
+ StudioTimeRangeContextSchema: () => StudioTimeRangeContextSchema,
49
+ StudioTimeRangeQuerySchema: () => StudioTimeRangeQuerySchema,
50
+ StudioTimeRangeSchema: () => StudioTimeRangeSchema,
51
+ StudioWorkflowHealthSchema: () => StudioWorkflowHealthSchema,
52
+ StudioWorkflowInternalEdgeSchema: () => StudioWorkflowInternalEdgeSchema,
53
+ StudioWorkflowNodeSchema: () => StudioWorkflowNodeSchema,
54
+ StudioWorkflowSchema: () => StudioWorkflowSchema,
55
+ StudioWorkflowTransitionSchema: () => StudioWorkflowTransitionSchema,
56
+ StudioWorkflowsResponseSchema: () => StudioWorkflowsResponseSchema,
24
57
  TELEMETRY_EVENT_TYPES: () => TELEMETRY_EVENT_TYPES,
58
+ TelemetryEventBatchResponseSchema: () => TelemetryEventBatchResponseSchema,
25
59
  TelemetryEventBatchSchema: () => TelemetryEventBatchSchema,
26
60
  TelemetryEventSchema: () => TelemetryEventSchema,
27
61
  TelemetryEventTypeSchema: () => TelemetryEventTypeSchema,
62
+ TelemetryPricingHintSchema: () => TelemetryPricingHintSchema,
63
+ TelemetryPricingLineItemSchema: () => TelemetryPricingLineItemSchema,
64
+ TelemetryPricingSourceSchema: () => TelemetryPricingSourceSchema,
65
+ TelemetryPricingUnitSchema: () => TelemetryPricingUnitSchema,
66
+ TelemetryPricingUsageTypeSchema: () => TelemetryPricingUsageTypeSchema,
28
67
  TelemetryServiceSchema: () => TelemetryServiceSchema,
68
+ TelemetryUnitPriceSchema: () => TelemetryUnitPriceSchema,
69
+ TelemetryUsageItemSchema: () => TelemetryUsageItemSchema,
70
+ WorkflowTopologyCallSchema: () => WorkflowTopologyCallSchema,
29
71
  WorkflowTopologyEdgeSchema: () => WorkflowTopologyEdgeSchema,
30
- WorkflowTopologyNodeSchema: () => WorkflowTopologyNodeSchema
72
+ WorkflowTopologyNodeSchema: () => WorkflowTopologyNodeSchema,
73
+ WorkflowTopologyTransitionSchema: () => WorkflowTopologyTransitionSchema,
74
+ projectWorkflowCalls: () => projectWorkflowCalls,
75
+ resolveStudioInterruptStatus: () => resolveStudioInterruptStatus,
76
+ resolveStudioTimeRange: () => resolveStudioTimeRange
31
77
  });
32
78
  module.exports = __toCommonJS(index_exports);
33
79
  var import_zod = require("zod");
80
+
81
+ // src/workflow-calls.ts
82
+ var str = (v, fallback = "") => typeof v === "string" ? v : fallback;
83
+ function projectWorkflowCalls(events) {
84
+ const groups = /* @__PURE__ */ new Map();
85
+ for (const event of events) {
86
+ if (!event.type.startsWith("workflow.call.") || !str(event.payload.invocationId) || !str(event.payload.targetWorkflowId))
87
+ continue;
88
+ const key = `${event.runId}:${str(event.payload.branchId, event.runId)}:${event.payload.invocationId}`;
89
+ const group = groups.get(key) ?? [];
90
+ if (!group.some((existing) => existing.id === event.id)) group.push(event);
91
+ groups.set(key, group);
92
+ }
93
+ return [...groups.entries()].map(([id, group]) => {
94
+ group.sort(
95
+ (a, b) => Number(a.payload.sequence ?? 0) - Number(b.payload.sequence ?? 0) || a.occurredAt.localeCompare(b.occurredAt) || a.id.localeCompare(b.id)
96
+ );
97
+ const first = group[0];
98
+ const p = first.payload;
99
+ const call = {
100
+ id,
101
+ invocationId: str(p.invocationId),
102
+ branchId: str(p.branchId, first.runId),
103
+ parentInvocationId: str(p.parentInvocationId) || null,
104
+ callId: str(p.callId),
105
+ callerNodeId: str(p.callerNodeId),
106
+ callerNodeExecutionId: str(p.callerNodeExecutionId),
107
+ sourceWorkflowId: str(p.sourceWorkflowId, first.workflowId),
108
+ targetWorkflowId: str(p.targetWorkflowId),
109
+ targetVersion: str(p.targetVersion) || null,
110
+ status: "incomplete",
111
+ startedAt: first.occurredAt,
112
+ endedAt: null,
113
+ activeMs: 0,
114
+ waitMs: 0,
115
+ attempts: 0,
116
+ reused: 0,
117
+ inherited: false,
118
+ sourceRunId: null,
119
+ leaf: null,
120
+ events: group
121
+ };
122
+ let active = null;
123
+ let waiting = null;
124
+ for (const event of group) {
125
+ const at = Date.parse(event.occurredAt);
126
+ const status = event.type.slice("workflow.call.".length);
127
+ for (const side of [
128
+ "input",
129
+ "output",
130
+ "inputOmitted",
131
+ "outputOmitted"
132
+ ])
133
+ if (side in event.payload) call[side] = event.payload[side];
134
+ if (status === "restored") {
135
+ call.inherited = true;
136
+ call.sourceRunId = str(event.payload.sourceRunId) || null;
137
+ call.status = event.payload.status === "completed" ? "completed" : event.payload.status === "failed" ? "failed" : "interrupted";
138
+ if (call.status === "interrupted") waiting = at;
139
+ } else if (status === "started" || status === "resumed") {
140
+ if (waiting !== null) call.waitMs += Math.max(0, at - waiting);
141
+ waiting = null;
142
+ active = at;
143
+ call.attempts++;
144
+ call.status = "running";
145
+ call.endedAt = null;
146
+ } else if (status === "reused") {
147
+ call.reused++;
148
+ call.status = "completed";
149
+ } else if (status === "suspended" || status === "completed" || status === "failed") {
150
+ if (active !== null) call.activeMs += Math.max(0, at - active);
151
+ active = null;
152
+ call.status = status === "suspended" ? "interrupted" : status;
153
+ if (status === "suspended") {
154
+ waiting = at;
155
+ const leaf = event.payload.leaf;
156
+ if (leaf && typeof leaf === "object") {
157
+ const value = leaf;
158
+ call.leaf = {
159
+ workflowId: str(value.workflowId),
160
+ nodeId: str(value.nodeId),
161
+ invocationId: str(value.invocationId)
162
+ };
163
+ }
164
+ } else {
165
+ call.endedAt = event.occurredAt;
166
+ call.leaf = null;
167
+ }
168
+ }
169
+ }
170
+ const cancellation = events.find(
171
+ (event) => event.type === "run.cancelled" && event.runId === first.runId && (event.payload.branchId ?? event.runId) === call.branchId && event.occurredAt >= (group.at(-1)?.occurredAt ?? first.occurredAt)
172
+ );
173
+ if (cancellation && (call.status === "interrupted" || call.status === "running")) {
174
+ call.status = "cancelled";
175
+ call.endedAt = cancellation.occurredAt;
176
+ }
177
+ return call;
178
+ }).sort((a, b) => a.startedAt.localeCompare(b.startedAt));
179
+ }
180
+
181
+ // src/index.ts
34
182
  var TELEMETRY_EVENT_TYPES = [
35
183
  "span.started",
36
184
  "span.ended",
@@ -45,6 +193,13 @@ var TELEMETRY_EVENT_TYPES = [
45
193
  "interrupt.cancelled",
46
194
  "run.cancelled",
47
195
  "workflow.transitioned",
196
+ "workflow.call.started",
197
+ "workflow.call.suspended",
198
+ "workflow.call.resumed",
199
+ "workflow.call.completed",
200
+ "workflow.call.failed",
201
+ "workflow.call.reused",
202
+ "workflow.call.restored",
48
203
  "session.checkpointed",
49
204
  "session.forked",
50
205
  "session.rolled_back"
@@ -66,6 +221,17 @@ var WorkflowTopologyEdgeSchema = import_zod.z.object({
66
221
  targetNodeId: import_zod.z.string().min(1),
67
222
  condition: import_zod.z.string().optional()
68
223
  }).strict();
224
+ var WorkflowTopologyCallSchema = import_zod.z.object({
225
+ sourceNodeId: import_zod.z.string().min(1),
226
+ targetWorkflowId: import_zod.z.string().min(1)
227
+ }).strict();
228
+ var WorkflowTopologyTransitionSchema = import_zod.z.object({
229
+ sourceNodeId: import_zod.z.string().min(1).optional(),
230
+ targetWorkflowId: import_zod.z.string().min(1),
231
+ condition: import_zod.z.string().optional(),
232
+ intent: import_zod.z.string().optional(),
233
+ kind: import_zod.z.enum(["call", "handoff"]).optional()
234
+ }).strict();
69
235
  var EnsureWorkflowTopologyRequestSchema = import_zod.z.object({
70
236
  schemaVersion: import_zod.z.literal(1),
71
237
  environment: import_zod.z.string().min(1),
@@ -77,7 +243,9 @@ var EnsureWorkflowTopologyRequestSchema = import_zod.z.object({
77
243
  tags: import_zod.z.array(import_zod.z.string()).optional(),
78
244
  topologyHash: import_zod.z.string().regex(/^[a-f0-9]{64}$/),
79
245
  nodes: import_zod.z.array(WorkflowTopologyNodeSchema),
80
- edges: import_zod.z.array(WorkflowTopologyEdgeSchema)
246
+ edges: import_zod.z.array(WorkflowTopologyEdgeSchema),
247
+ transitions: import_zod.z.array(WorkflowTopologyTransitionSchema).optional(),
248
+ calls: import_zod.z.array(WorkflowTopologyCallSchema).optional()
81
249
  }).strict()
82
250
  }).strict();
83
251
  var EnsureWorkflowTopologyResponseSchema = import_zod.z.object({ workflowRevisionId: import_zod.z.string().min(1), created: import_zod.z.boolean() }).strict();
@@ -89,6 +257,9 @@ var TelemetryEventSchema = import_zod.z.object({
89
257
  environment: import_zod.z.string().min(1),
90
258
  service: TelemetryServiceSchema,
91
259
  correlation: import_zod.z.object({
260
+ invocationId: import_zod.z.string().optional(),
261
+ parentInvocationId: import_zod.z.string().optional(),
262
+ branchId: import_zod.z.string().optional(),
92
263
  traceId: import_zod.z.string().optional(),
93
264
  spanId: import_zod.z.string().optional(),
94
265
  parentSpanId: import_zod.z.string().optional(),
@@ -109,16 +280,552 @@ var TelemetryEventSchema = import_zod.z.object({
109
280
  payload: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown())
110
281
  }).strict();
111
282
  var TelemetryEventBatchSchema = import_zod.z.object({ events: import_zod.z.array(TelemetryEventSchema).min(1) }).strict();
283
+ var TelemetryEventBatchResponseSchema = import_zod.z.object({
284
+ accepted: import_zod.z.number().int().nonnegative(),
285
+ inserted: import_zod.z.number().int().nonnegative(),
286
+ duplicates: import_zod.z.number().int().nonnegative()
287
+ }).strict();
288
+ var TelemetryPricingSourceSchema = import_zod.z.enum([
289
+ "sdk",
290
+ "provider",
291
+ "custom",
292
+ "project-rate-card",
293
+ "default-rate-card"
294
+ ]);
295
+ var TelemetryPricingUnitSchema = import_zod.z.enum([
296
+ "token",
297
+ "character",
298
+ "request",
299
+ "image",
300
+ "audio_second",
301
+ "audio_minute",
302
+ "video_second",
303
+ "video_minute",
304
+ "second",
305
+ "minute",
306
+ "custom"
307
+ ]);
308
+ var TelemetryPricingUsageTypeSchema = import_zod.z.enum([
309
+ "input",
310
+ "output",
311
+ "reasoning",
312
+ "cache_read",
313
+ "cache_write",
314
+ "embedding",
315
+ "image_input",
316
+ "image_output",
317
+ "audio_input",
318
+ "audio_output",
319
+ "video_input",
320
+ "video_output",
321
+ "request",
322
+ "custom"
323
+ ]);
324
+ var TelemetryUsageItemSchema = import_zod.z.object({
325
+ usageType: TelemetryPricingUsageTypeSchema,
326
+ quantity: import_zod.z.number().nonnegative(),
327
+ unit: TelemetryPricingUnitSchema,
328
+ label: import_zod.z.string().optional()
329
+ }).strict();
330
+ var TelemetryUnitPriceSchema = import_zod.z.object({
331
+ usageType: TelemetryPricingUsageTypeSchema,
332
+ unit: TelemetryPricingUnitSchema,
333
+ unitQuantity: import_zod.z.number().positive().default(1),
334
+ priceMicros: import_zod.z.number().int().nonnegative(),
335
+ label: import_zod.z.string().optional()
336
+ }).strict();
337
+ var TelemetryPricingLineItemSchema = import_zod.z.object({
338
+ usageType: TelemetryPricingUsageTypeSchema,
339
+ quantity: import_zod.z.number().nonnegative(),
340
+ unit: TelemetryPricingUnitSchema,
341
+ unitQuantity: import_zod.z.number().positive().default(1),
342
+ unitPriceMicros: import_zod.z.number().int().nonnegative().optional(),
343
+ totalCostMicros: import_zod.z.number().int().nonnegative().optional(),
344
+ label: import_zod.z.string().optional()
345
+ }).strict().refine(
346
+ (value) => value.totalCostMicros !== void 0 || value.unitPriceMicros !== void 0,
347
+ "line item requires totalCostMicros or unitPriceMicros"
348
+ );
349
+ var TelemetryPricingHintSchema = import_zod.z.object({
350
+ source: TelemetryPricingSourceSchema.extract(["sdk", "provider", "custom"]),
351
+ currency: import_zod.z.string().min(3).max(12).default("USD"),
352
+ actualCostMicros: import_zod.z.number().int().nonnegative().optional(),
353
+ lineItems: import_zod.z.array(TelemetryPricingLineItemSchema).optional(),
354
+ unitPrices: import_zod.z.array(TelemetryUnitPriceSchema).optional(),
355
+ usageItems: import_zod.z.array(TelemetryUsageItemSchema).optional(),
356
+ pricingRef: import_zod.z.string().min(1).optional(),
357
+ metadata: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).optional()
358
+ }).strict();
359
+ var StudioRunStatusSchema = import_zod.z.enum([
360
+ "running",
361
+ "completed",
362
+ "interrupted",
363
+ "incomplete",
364
+ "failed",
365
+ "cancelled"
366
+ ]);
367
+ var STUDIO_TIME_RANGES = [
368
+ "Last hour",
369
+ "24 hours",
370
+ "7 days",
371
+ "30 days",
372
+ "All time",
373
+ "Custom range"
374
+ ];
375
+ var StudioTimeRangeSchema = import_zod.z.enum(STUDIO_TIME_RANGES);
376
+ var StudioTimeRangeQuerySchema = import_zod.z.object({
377
+ range: StudioTimeRangeSchema.optional(),
378
+ startedAfter: import_zod.z.string().optional(),
379
+ startedBefore: import_zod.z.string().optional()
380
+ }).strict();
381
+ var StudioTimeRangeContextSchema = import_zod.z.object({
382
+ range: StudioTimeRangeSchema,
383
+ startedAfter: import_zod.z.string().datetime({ offset: true }).nullable(),
384
+ startedBefore: import_zod.z.string().datetime({ offset: true }).nullable()
385
+ }).strict();
386
+ var STUDIO_TIME_RANGE_MILLISECONDS = {
387
+ "Last hour": 60 * 60 * 1e3,
388
+ "24 hours": 24 * 60 * 60 * 1e3,
389
+ "7 days": 7 * 24 * 60 * 60 * 1e3,
390
+ "30 days": 30 * 24 * 60 * 60 * 1e3
391
+ };
392
+ var parseIsoBoundary = (value, label) => {
393
+ if (!value) {
394
+ return { ok: false, error: `${label} is required for a custom range.` };
395
+ }
396
+ if (!/(?:Z|[+-]\d{2}:\d{2})$/.test(value)) {
397
+ return {
398
+ ok: false,
399
+ error: `${label} must include an explicit UTC offset.`
400
+ };
401
+ }
402
+ const date = new Date(value);
403
+ return Number.isFinite(date.getTime()) ? { ok: true, date } : { ok: false, error: `${label} must be a valid ISO date and time.` };
404
+ };
405
+ var resolveStudioTimeRange = (input, now = /* @__PURE__ */ new Date()) => {
406
+ const parsedRange = StudioTimeRangeSchema.safeParse(
407
+ input.range || "24 hours"
408
+ );
409
+ if (!parsedRange.success) {
410
+ return {
411
+ ok: false,
412
+ error: `Unknown time range "${input.range}".`
413
+ };
414
+ }
415
+ if (!Number.isFinite(now.getTime())) {
416
+ return { ok: false, error: "The time range reference date is invalid." };
417
+ }
418
+ const range = parsedRange.data;
419
+ if (range === "All time") {
420
+ return {
421
+ ok: true,
422
+ value: { range, startedAfter: null, startedBefore: null }
423
+ };
424
+ }
425
+ if (range === "Custom range") {
426
+ const after = parseIsoBoundary(input.startedAfter, "Start time");
427
+ if ("error" in after) return { ok: false, error: after.error };
428
+ const before = parseIsoBoundary(input.startedBefore, "End time");
429
+ if ("error" in before) return { ok: false, error: before.error };
430
+ if (after.date.getTime() >= before.date.getTime()) {
431
+ return {
432
+ ok: false,
433
+ error: "Start time must be before end time."
434
+ };
435
+ }
436
+ return {
437
+ ok: true,
438
+ value: {
439
+ range,
440
+ startedAfter: after.date.toISOString(),
441
+ startedBefore: before.date.toISOString()
442
+ }
443
+ };
444
+ }
445
+ const duration = STUDIO_TIME_RANGE_MILLISECONDS[range];
446
+ if (!duration) {
447
+ return { ok: false, error: `Unknown time range "${range}".` };
448
+ }
449
+ return {
450
+ ok: true,
451
+ value: {
452
+ range,
453
+ startedAfter: new Date(now.getTime() - duration).toISOString(),
454
+ startedBefore: now.toISOString()
455
+ }
456
+ };
457
+ };
458
+ var StudioInterruptStatusSchema = import_zod.z.enum([
459
+ "pending",
460
+ "resolved",
461
+ "expired",
462
+ "failed",
463
+ "cancelled"
464
+ ]);
465
+ var resolveStudioInterruptStatus = (input, now = Date.now()) => {
466
+ if (input.status !== "pending" || !input.expiresAt) return input.status;
467
+ const expiresAt = Date.parse(input.expiresAt);
468
+ const nowMs = typeof now === "number" ? now : now.getTime();
469
+ return Number.isFinite(expiresAt) && Number.isFinite(nowMs) && expiresAt <= nowMs ? "expired" : input.status;
470
+ };
471
+ var StudioInterruptTypeSchema = import_zod.z.enum([
472
+ "choice",
473
+ "multi-choice",
474
+ "text",
475
+ "unknown"
476
+ ]);
477
+ var StudioInterruptInteractionModeSchema = import_zod.z.enum([
478
+ "static-options",
479
+ "dynamic-picker",
480
+ "freeform",
481
+ "unknown"
482
+ ]);
483
+ var StudioInterruptOptionSchema = import_zod.z.object({
484
+ id: import_zod.z.string().min(1),
485
+ label: import_zod.z.string().min(1),
486
+ description: import_zod.z.string().nullable()
487
+ }).strict();
488
+ var StudioResumeOutcomeSchema = import_zod.z.enum([
489
+ "resumed",
490
+ "resume failed",
491
+ "expired before resume",
492
+ "cancelled"
493
+ ]);
494
+ var StudioWorkflowHealthSchema = import_zod.z.enum([
495
+ "unknown",
496
+ "healthy",
497
+ "degraded",
498
+ "failing",
499
+ "idle"
500
+ ]);
501
+ var StudioPricingStatusSchema = import_zod.z.enum([
502
+ "priced",
503
+ "unpriced",
504
+ "unknown"
505
+ ]);
506
+ var StudioPricingSourceSchema = TelemetryPricingSourceSchema.nullable();
507
+ var StudioChangeResourceSchema = import_zod.z.enum([
508
+ "runs",
509
+ "sessions",
510
+ "interrupts"
511
+ ]);
512
+ var StudioChangeSchema = import_zod.z.object({
513
+ schemaVersion: import_zod.z.literal(1),
514
+ changeId: import_zod.z.string().min(1),
515
+ emittedAt: import_zod.z.string().datetime({ offset: true }),
516
+ organizationId: import_zod.z.string().min(1),
517
+ projectId: import_zod.z.string().min(1),
518
+ resources: import_zod.z.array(StudioChangeResourceSchema).min(1)
519
+ }).strict();
520
+ var StudioMetricSchema = import_zod.z.object({
521
+ runCount: import_zod.z.number().int().nonnegative(),
522
+ successRate: import_zod.z.number().min(0).max(100).nullable(),
523
+ errorRate: import_zod.z.number().min(0).max(100).nullable(),
524
+ retryCount: import_zod.z.number().int().nonnegative().nullable(),
525
+ interruptRate: import_zod.z.number().min(0).max(100).nullable(),
526
+ p50DurationMs: import_zod.z.number().nonnegative().nullable(),
527
+ p95DurationMs: import_zod.z.number().nonnegative().nullable(),
528
+ averageTokens: import_zod.z.number().nonnegative().nullable(),
529
+ averageCost: import_zod.z.number().nonnegative().nullable(),
530
+ currency: import_zod.z.string().nullable()
531
+ }).strict();
532
+ var StudioRunSchema = import_zod.z.object({
533
+ id: import_zod.z.string().min(1),
534
+ callerNodeId: import_zod.z.string().optional(),
535
+ parentRunId: import_zod.z.string().optional(),
536
+ parentWorkflowId: import_zod.z.string().optional(),
537
+ invocationId: import_zod.z.string().optional(),
538
+ branchId: import_zod.z.string().optional(),
539
+ callId: import_zod.z.string().optional(),
540
+ status: StudioRunStatusSchema,
541
+ startedAt: import_zod.z.string().datetime({ offset: true }),
542
+ endedAt: import_zod.z.string().datetime({ offset: true }).nullable(),
543
+ workflowId: import_zod.z.string().min(1),
544
+ workflowIds: import_zod.z.array(import_zod.z.string().min(1)),
545
+ workflowRefs: import_zod.z.array(
546
+ import_zod.z.object({
547
+ workflowId: import_zod.z.string().min(1),
548
+ workflowRevisionId: import_zod.z.string().nullable(),
549
+ declaredVersion: import_zod.z.string().nullable()
550
+ }).strict()
551
+ ),
552
+ workflowRevisionId: import_zod.z.string().nullable(),
553
+ declaredVersion: import_zod.z.string().nullable(),
554
+ transitionIds: import_zod.z.array(import_zod.z.string().min(1)),
555
+ path: import_zod.z.array(import_zod.z.string()),
556
+ sessionId: import_zod.z.string().nullable(),
557
+ provider: import_zod.z.string().nullable(),
558
+ model: import_zod.z.string().nullable(),
559
+ models: import_zod.z.array(import_zod.z.string()),
560
+ durationMs: import_zod.z.number().nonnegative().nullable(),
561
+ tokens: import_zod.z.number().int().nonnegative().nullable(),
562
+ cost: import_zod.z.number().nonnegative().nullable(),
563
+ pricingStatus: StudioPricingStatusSchema,
564
+ pricingSource: StudioPricingSourceSchema,
565
+ currency: import_zod.z.string().nullable(),
566
+ result: import_zod.z.string().nullable(),
567
+ environment: import_zod.z.string().min(1),
568
+ userId: import_zod.z.string().nullable(),
569
+ tenantId: import_zod.z.string().nullable(),
570
+ hasTool: import_zod.z.boolean(),
571
+ hasRetry: import_zod.z.boolean(),
572
+ interruptNodeId: import_zod.z.string().nullable(),
573
+ interruptId: import_zod.z.string().nullable().optional(),
574
+ interruptStatus: StudioInterruptStatusSchema.nullable().optional(),
575
+ interruptExpiresAt: import_zod.z.string().datetime({ offset: true }).nullable().optional()
576
+ }).strict();
577
+ var StudioSessionSchema = import_zod.z.object({
578
+ id: import_zod.z.string().min(1),
579
+ status: StudioRunStatusSchema,
580
+ lastActivityAt: import_zod.z.string().datetime({ offset: true }),
581
+ workflowIds: import_zod.z.array(import_zod.z.string()),
582
+ workflowCount: import_zod.z.number().int().nonnegative(),
583
+ activeWorkflowId: import_zod.z.string().nullable(),
584
+ activeVersion: import_zod.z.string().nullable(),
585
+ userId: import_zod.z.string().nullable(),
586
+ tenantId: import_zod.z.string().nullable(),
587
+ runs: import_zod.z.number().int().nonnegative(),
588
+ succeeded: import_zod.z.number().int().nonnegative(),
589
+ failed: import_zod.z.number().int().nonnegative(),
590
+ interrupted: import_zod.z.number().int().nonnegative(),
591
+ checkpoints: import_zod.z.number().int().nonnegative(),
592
+ hasFork: import_zod.z.boolean(),
593
+ durationMs: import_zod.z.number().nonnegative().nullable(),
594
+ tokens: import_zod.z.number().int().nonnegative().nullable(),
595
+ cost: import_zod.z.number().nonnegative().nullable(),
596
+ pricingStatus: StudioPricingStatusSchema,
597
+ pricingSource: StudioPricingSourceSchema,
598
+ currency: import_zod.z.string().nullable(),
599
+ latestResult: import_zod.z.string().nullable(),
600
+ latestError: import_zod.z.string().nullable(),
601
+ pendingInterruptId: import_zod.z.string().nullable(),
602
+ interruptStatus: StudioInterruptStatusSchema.nullable().optional(),
603
+ interruptExpiresAt: import_zod.z.string().datetime({ offset: true }).nullable().optional(),
604
+ providers: import_zod.z.array(import_zod.z.string()),
605
+ models: import_zod.z.array(import_zod.z.string()),
606
+ tags: import_zod.z.array(import_zod.z.string()),
607
+ environment: import_zod.z.string().min(1)
608
+ }).strict();
609
+ var StudioInterruptSchema = import_zod.z.object({
610
+ id: import_zod.z.string().min(1),
611
+ status: StudioInterruptStatusSchema,
612
+ type: StudioInterruptTypeSchema,
613
+ interactionMode: StudioInterruptInteractionModeSchema,
614
+ schemaId: import_zod.z.string().nullable(),
615
+ schemaVersion: import_zod.z.string().nullable(),
616
+ createdAt: import_zod.z.string().datetime({ offset: true }),
617
+ resolvedAt: import_zod.z.string().datetime({ offset: true }).nullable(),
618
+ expiresAt: import_zod.z.string().datetime({ offset: true }).nullable(),
619
+ question: import_zod.z.string().nullable(),
620
+ contentCaptured: import_zod.z.boolean(),
621
+ optionCount: import_zod.z.number().int().nonnegative().nullable(),
622
+ options: import_zod.z.array(StudioInterruptOptionSchema).nullable(),
623
+ workflowId: import_zod.z.string().min(1),
624
+ nodeId: import_zod.z.string().nullable(),
625
+ sessionId: import_zod.z.string().nullable(),
626
+ userId: import_zod.z.string().nullable(),
627
+ tenantId: import_zod.z.string().nullable(),
628
+ response: import_zod.z.string().nullable(),
629
+ responseCaptured: import_zod.z.boolean(),
630
+ resumeOutcome: StudioResumeOutcomeSchema.nullable(),
631
+ resumeError: import_zod.z.string().nullable(),
632
+ runId: import_zod.z.string().min(1),
633
+ resumeToken: import_zod.z.string().nullable(),
634
+ resolvedBy: import_zod.z.string().nullable(),
635
+ environment: import_zod.z.string().min(1)
636
+ }).strict();
637
+ var StudioDetailEventSchema = import_zod.z.object({
638
+ id: import_zod.z.string().min(1),
639
+ type: TelemetryEventTypeSchema,
640
+ occurredAt: import_zod.z.string().datetime({ offset: true }),
641
+ receivedAt: import_zod.z.string().datetime({ offset: true }),
642
+ environment: import_zod.z.string().min(1),
643
+ serviceName: import_zod.z.string().min(1),
644
+ deploymentRef: import_zod.z.string().nullable(),
645
+ traceId: import_zod.z.string().nullable(),
646
+ spanId: import_zod.z.string().nullable(),
647
+ parentSpanId: import_zod.z.string().nullable(),
648
+ runId: import_zod.z.string().min(1),
649
+ sessionId: import_zod.z.string().nullable(),
650
+ workflowId: import_zod.z.string().min(1),
651
+ workflowRevisionId: import_zod.z.string().nullable(),
652
+ nodeId: import_zod.z.string().nullable(),
653
+ userId: import_zod.z.string().nullable(),
654
+ tenantId: import_zod.z.string().nullable(),
655
+ tags: import_zod.z.array(import_zod.z.string()),
656
+ metadata: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).nullable(),
657
+ payload: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown())
658
+ }).strict();
659
+ var StudioWorkflowNodeSchema = import_zod.z.object({
660
+ id: import_zod.z.string().min(1),
661
+ label: import_zod.z.string(),
662
+ type: import_zod.z.string().nullable(),
663
+ state: import_zod.z.enum(["healthy", "warning", "failed", "interrupted", "retried"]).nullable(),
664
+ provider: import_zod.z.string().nullable(),
665
+ model: import_zod.z.string().nullable(),
666
+ metrics: StudioMetricSchema
667
+ }).strict();
668
+ var StudioWorkflowInternalEdgeSchema = import_zod.z.object({
669
+ id: import_zod.z.string().min(1),
670
+ source: import_zod.z.string().min(1),
671
+ target: import_zod.z.string().min(1),
672
+ condition: import_zod.z.string().nullable()
673
+ }).strict();
674
+ var StudioWorkflowTransitionSchema = import_zod.z.object({
675
+ kind: import_zod.z.enum(["call", "handoff"]).optional(),
676
+ id: import_zod.z.string().min(1),
677
+ sourceWorkflowId: import_zod.z.string().min(1),
678
+ sourceNodeId: import_zod.z.string().nullable(),
679
+ targetWorkflowId: import_zod.z.string().min(1),
680
+ condition: import_zod.z.string().nullable(),
681
+ volume: import_zod.z.number().int().nonnegative(),
682
+ successRate: import_zod.z.number().min(0).max(100).nullable(),
683
+ medianDurationMs: import_zod.z.number().nonnegative().nullable(),
684
+ errorRate: import_zod.z.number().min(0).max(100).nullable()
685
+ }).strict();
686
+ var StudioWorkflowSchema = import_zod.z.object({
687
+ id: import_zod.z.string().min(1),
688
+ name: import_zod.z.string().min(1),
689
+ description: import_zod.z.string().nullable(),
690
+ versions: import_zod.z.array(import_zod.z.string()),
691
+ activeVersion: import_zod.z.string().nullable(),
692
+ activeRevisionId: import_zod.z.string().nullable(),
693
+ health: StudioWorkflowHealthSchema,
694
+ tags: import_zod.z.array(import_zod.z.string()),
695
+ lastActivityAt: import_zod.z.string().datetime({ offset: true }).nullable(),
696
+ metrics: StudioMetricSchema,
697
+ nodes: import_zod.z.array(StudioWorkflowNodeSchema),
698
+ internalEdges: import_zod.z.array(StudioWorkflowInternalEdgeSchema)
699
+ }).strict();
700
+ var StudioRunsResponseSchema = import_zod.z.object({
701
+ runs: import_zod.z.array(StudioRunSchema),
702
+ totalCount: import_zod.z.number().int().nonnegative()
703
+ }).strict();
704
+ var StudioSessionsResponseSchema = import_zod.z.object({
705
+ sessions: import_zod.z.array(StudioSessionSchema),
706
+ totalCount: import_zod.z.number().int().nonnegative()
707
+ }).strict();
708
+ var StudioInterruptsResponseSchema = import_zod.z.object({
709
+ interrupts: import_zod.z.array(StudioInterruptSchema),
710
+ totalCount: import_zod.z.number().int().nonnegative()
711
+ }).strict();
712
+ var StudioRunDetailResponseSchema = import_zod.z.object({
713
+ run: StudioRunSchema,
714
+ events: import_zod.z.array(StudioDetailEventSchema),
715
+ session: StudioSessionSchema.nullable(),
716
+ interrupts: import_zod.z.array(StudioInterruptSchema),
717
+ updatedAt: import_zod.z.string().datetime({ offset: true })
718
+ }).strict();
719
+ var StudioSessionDetailResponseSchema = import_zod.z.object({
720
+ session: StudioSessionSchema,
721
+ runs: import_zod.z.array(StudioRunSchema),
722
+ events: import_zod.z.array(StudioDetailEventSchema),
723
+ interrupts: import_zod.z.array(StudioInterruptSchema),
724
+ updatedAt: import_zod.z.string().datetime({ offset: true })
725
+ }).strict();
726
+ var StudioInterruptDetailResponseSchema = import_zod.z.object({
727
+ interrupt: StudioInterruptSchema,
728
+ events: import_zod.z.array(StudioDetailEventSchema),
729
+ run: StudioRunSchema.nullable(),
730
+ session: StudioSessionSchema.nullable(),
731
+ updatedAt: import_zod.z.string().datetime({ offset: true })
732
+ }).strict();
733
+ var StudioWorkflowsResponseSchema = import_zod.z.object({
734
+ workflows: import_zod.z.array(StudioWorkflowSchema),
735
+ observedCalls: import_zod.z.array(
736
+ StudioWorkflowTransitionSchema.extend({
737
+ runId: import_zod.z.string(),
738
+ invocationId: import_zod.z.string(),
739
+ branchId: import_zod.z.string()
740
+ })
741
+ ).optional(),
742
+ transitions: import_zod.z.array(StudioWorkflowTransitionSchema),
743
+ cohort: StudioTimeRangeContextSchema.extend({
744
+ workflowId: import_zod.z.string().nullable(),
745
+ version: import_zod.z.string().nullable()
746
+ }).strict()
747
+ }).strict();
748
+ var StudioCatalogsResponseSchema = import_zod.z.object({
749
+ environments: import_zod.z.array(import_zod.z.string()),
750
+ providers: import_zod.z.array(import_zod.z.string()),
751
+ models: import_zod.z.array(import_zod.z.string()),
752
+ workflows: import_zod.z.array(import_zod.z.string()),
753
+ tags: import_zod.z.array(import_zod.z.string())
754
+ }).strict();
755
+ var StudioContextResponseSchema = import_zod.z.object({
756
+ organization: import_zod.z.object({
757
+ name: import_zod.z.string().min(1)
758
+ }).strict(),
759
+ project: import_zod.z.object({
760
+ name: import_zod.z.string().min(1)
761
+ }).strict(),
762
+ environments: import_zod.z.array(import_zod.z.string()),
763
+ apiKey: import_zod.z.object({
764
+ mode: import_zod.z.enum(["test", "live"]),
765
+ scopes: import_zod.z.array(import_zod.z.string())
766
+ }).strict(),
767
+ api: import_zod.z.object({
768
+ status: import_zod.z.literal("ok"),
769
+ service: import_zod.z.literal("kortyx-api"),
770
+ version: import_zod.z.string().min(1)
771
+ }).strict()
772
+ }).strict();
112
773
  // Annotate the CommonJS export names for ESM import in node:
113
774
  0 && (module.exports = {
114
775
  EnsureWorkflowTopologyRequestSchema,
115
776
  EnsureWorkflowTopologyResponseSchema,
777
+ STUDIO_TIME_RANGES,
778
+ StudioCatalogsResponseSchema,
779
+ StudioChangeResourceSchema,
780
+ StudioChangeSchema,
781
+ StudioContextResponseSchema,
782
+ StudioDetailEventSchema,
783
+ StudioInterruptDetailResponseSchema,
784
+ StudioInterruptInteractionModeSchema,
785
+ StudioInterruptOptionSchema,
786
+ StudioInterruptSchema,
787
+ StudioInterruptStatusSchema,
788
+ StudioInterruptTypeSchema,
789
+ StudioInterruptsResponseSchema,
790
+ StudioMetricSchema,
791
+ StudioPricingSourceSchema,
792
+ StudioPricingStatusSchema,
793
+ StudioResumeOutcomeSchema,
794
+ StudioRunDetailResponseSchema,
795
+ StudioRunSchema,
796
+ StudioRunStatusSchema,
797
+ StudioRunsResponseSchema,
798
+ StudioSessionDetailResponseSchema,
799
+ StudioSessionSchema,
800
+ StudioSessionsResponseSchema,
801
+ StudioTimeRangeContextSchema,
802
+ StudioTimeRangeQuerySchema,
803
+ StudioTimeRangeSchema,
804
+ StudioWorkflowHealthSchema,
805
+ StudioWorkflowInternalEdgeSchema,
806
+ StudioWorkflowNodeSchema,
807
+ StudioWorkflowSchema,
808
+ StudioWorkflowTransitionSchema,
809
+ StudioWorkflowsResponseSchema,
116
810
  TELEMETRY_EVENT_TYPES,
811
+ TelemetryEventBatchResponseSchema,
117
812
  TelemetryEventBatchSchema,
118
813
  TelemetryEventSchema,
119
814
  TelemetryEventTypeSchema,
815
+ TelemetryPricingHintSchema,
816
+ TelemetryPricingLineItemSchema,
817
+ TelemetryPricingSourceSchema,
818
+ TelemetryPricingUnitSchema,
819
+ TelemetryPricingUsageTypeSchema,
120
820
  TelemetryServiceSchema,
821
+ TelemetryUnitPriceSchema,
822
+ TelemetryUsageItemSchema,
823
+ WorkflowTopologyCallSchema,
121
824
  WorkflowTopologyEdgeSchema,
122
- WorkflowTopologyNodeSchema
825
+ WorkflowTopologyNodeSchema,
826
+ WorkflowTopologyTransitionSchema,
827
+ projectWorkflowCalls,
828
+ resolveStudioInterruptStatus,
829
+ resolveStudioTimeRange
123
830
  });
124
831
  //# sourceMappingURL=index.js.map