ai-workflows 2.1.1 → 2.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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +17 -1
- package/README.md +305 -184
- package/dist/barrier.d.ts +159 -0
- package/dist/barrier.d.ts.map +1 -0
- package/dist/barrier.js +377 -0
- package/dist/barrier.js.map +1 -0
- package/dist/cascade-context.d.ts +149 -0
- package/dist/cascade-context.d.ts.map +1 -0
- package/dist/cascade-context.js +324 -0
- package/dist/cascade-context.js.map +1 -0
- package/dist/cascade-executor.d.ts +196 -0
- package/dist/cascade-executor.d.ts.map +1 -0
- package/dist/cascade-executor.js +384 -0
- package/dist/cascade-executor.js.map +1 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +27 -8
- package/dist/context.js.map +1 -1
- package/dist/cron-parser.d.ts +65 -0
- package/dist/cron-parser.d.ts.map +1 -0
- package/dist/cron-parser.js +294 -0
- package/dist/cron-parser.js.map +1 -0
- package/dist/cron-scheduler.d.ts +117 -0
- package/dist/cron-scheduler.d.ts.map +1 -0
- package/dist/cron-scheduler.js +176 -0
- package/dist/cron-scheduler.js.map +1 -0
- package/dist/database-context.d.ts +184 -0
- package/dist/database-context.d.ts.map +1 -0
- package/dist/database-context.js +428 -0
- package/dist/database-context.js.map +1 -0
- package/dist/dependency-graph.d.ts +157 -0
- package/dist/dependency-graph.d.ts.map +1 -0
- package/dist/dependency-graph.js +382 -0
- package/dist/dependency-graph.js.map +1 -0
- package/dist/digital-objects-adapter.d.ts +159 -0
- package/dist/digital-objects-adapter.d.ts.map +1 -0
- package/dist/digital-objects-adapter.js +229 -0
- package/dist/digital-objects-adapter.js.map +1 -0
- package/dist/durable-execution-cloudflare.d.ts +427 -0
- package/dist/durable-execution-cloudflare.d.ts.map +1 -0
- package/dist/durable-execution-cloudflare.js +510 -0
- package/dist/durable-execution-cloudflare.js.map +1 -0
- package/dist/durable-execution.d.ts +482 -0
- package/dist/durable-execution.d.ts.map +1 -0
- package/dist/durable-execution.js +594 -0
- package/dist/durable-execution.js.map +1 -0
- package/dist/durable-workflow.d.ts +176 -0
- package/dist/durable-workflow.d.ts.map +1 -0
- package/dist/durable-workflow.js +552 -0
- package/dist/durable-workflow.js.map +1 -0
- package/dist/every.d.ts +31 -2
- package/dist/every.d.ts.map +1 -1
- package/dist/every.js +63 -32
- package/dist/every.js.map +1 -1
- package/dist/graph/index.d.ts +8 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +8 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/topological-sort.d.ts +121 -0
- package/dist/graph/topological-sort.d.ts.map +1 -0
- package/dist/graph/topological-sort.js +292 -0
- package/dist/graph/topological-sort.js.map +1 -0
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +101 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +115 -0
- package/dist/logger.js.map +1 -0
- package/dist/on.d.ts +35 -10
- package/dist/on.d.ts.map +1 -1
- package/dist/on.js +53 -19
- package/dist/on.js.map +1 -1
- package/dist/runtime.d.ts +169 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +275 -0
- package/dist/runtime.js.map +1 -0
- package/dist/send.d.ts.map +1 -1
- package/dist/send.js +4 -3
- package/dist/send.js.map +1 -1
- package/dist/telemetry.d.ts +150 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +388 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/timer-registry.d.ts +77 -0
- package/dist/timer-registry.d.ts.map +1 -0
- package/dist/timer-registry.js +154 -0
- package/dist/timer-registry.js.map +1 -0
- package/dist/types.d.ts +105 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +17 -1
- package/dist/types.js.map +1 -1
- package/dist/worker/durable-step.d.ts +481 -0
- package/dist/worker/durable-step.d.ts.map +1 -0
- package/dist/worker/durable-step.js +606 -0
- package/dist/worker/durable-step.js.map +1 -0
- package/dist/worker/index.d.ts +106 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +124 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/state-adapter.d.ts +230 -0
- package/dist/worker/state-adapter.d.ts.map +1 -0
- package/dist/worker/state-adapter.js +409 -0
- package/dist/worker/state-adapter.js.map +1 -0
- package/dist/worker/topological-executor.d.ts +282 -0
- package/dist/worker/topological-executor.d.ts.map +1 -0
- package/dist/worker/topological-executor.js +396 -0
- package/dist/worker/topological-executor.js.map +1 -0
- package/dist/worker/workflow-builder.d.ts +286 -0
- package/dist/worker/workflow-builder.d.ts.map +1 -0
- package/dist/worker/workflow-builder.js +565 -0
- package/dist/worker/workflow-builder.js.map +1 -0
- package/dist/worker.d.ts +800 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +2428 -0
- package/dist/worker.js.map +1 -0
- package/dist/workflow-builder.d.ts +287 -0
- package/dist/workflow-builder.d.ts.map +1 -0
- package/dist/workflow-builder.js +762 -0
- package/dist/workflow-builder.js.map +1 -0
- package/dist/workflow.d.ts +14 -30
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +136 -292
- package/dist/workflow.js.map +1 -1
- package/examples/01-ecommerce-order-pipeline.ts +358 -0
- package/examples/02-content-moderation-cascade.ts +454 -0
- package/examples/03-scheduled-reporting-dependencies.ts +479 -0
- package/examples/04-database-persistence.ts +518 -0
- package/examples/README.md +173 -0
- package/package.json +21 -4
- package/src/__tests__/digital-objects-adapter.test.ts +274 -0
- package/src/__tests__/durable-workflow.test.ts +297 -0
- package/src/barrier.ts +507 -0
- package/src/cascade-context.ts +495 -0
- package/src/cascade-executor.ts +588 -0
- package/src/context.ts +51 -17
- package/src/cron-parser.ts +347 -0
- package/src/cron-scheduler.ts +239 -0
- package/src/database-context.ts +658 -0
- package/src/dependency-graph.ts +518 -0
- package/src/digital-objects-adapter.ts +351 -0
- package/src/durable-execution-cloudflare.ts +855 -0
- package/src/durable-execution.ts +1042 -0
- package/src/durable-workflow.ts +717 -0
- package/src/every.ts +104 -35
- package/src/graph/index.ts +19 -0
- package/src/graph/topological-sort.ts +412 -0
- package/src/index.ts +147 -0
- package/src/logger.ts +148 -0
- package/src/on.ts +81 -26
- package/src/runtime.ts +436 -0
- package/src/send.ts +4 -5
- package/src/telemetry.ts +577 -0
- package/src/timer-registry.ts +179 -0
- package/src/types.ts +146 -10
- package/src/worker/durable-step.ts +976 -0
- package/src/worker/index.ts +216 -0
- package/src/worker/state-adapter.ts +589 -0
- package/src/worker/topological-executor.ts +625 -0
- package/src/worker/workflow-builder.ts +871 -0
- package/src/worker.ts +2906 -0
- package/src/workflow-builder.ts +1068 -0
- package/src/workflow.ts +199 -355
- package/test/barrier-join.test.ts +442 -0
- package/test/barrier-unhandled-rejections.test.ts +359 -0
- package/test/cascade-context.test.ts +390 -0
- package/test/cascade-executor.test.ts +852 -0
- package/test/cron-parser.test.ts +314 -0
- package/test/cron-scheduler.test.ts +291 -0
- package/test/database-context.test.ts +770 -0
- package/test/db-provider-adapter.test.ts +862 -0
- package/test/dependency-graph.test.ts +512 -0
- package/test/durable-execution-cloudflare.test.ts +606 -0
- package/test/durable-execution-in-process.test.ts +286 -0
- package/test/durable-execution.test.ts +247 -0
- package/test/e2e/workflow-scenarios.e2e.test.ts +1039 -0
- package/test/graph/topological-sort.test.ts +586 -0
- package/test/integration.test.ts +442 -0
- package/test/rpc-surface.test.ts +946 -0
- package/test/runtime.test.ts +262 -0
- package/test/schedule-timer-cleanup.test.ts +353 -0
- package/test/send-race-conditions.test.ts +400 -0
- package/test/type-safety-every.test.ts +303 -0
- package/test/worker/durable-cascade.test.ts +1117 -0
- package/test/worker/durable-step.test.ts +723 -0
- package/test/worker/topological-executor.test.ts +1240 -0
- package/test/worker/workflow-builder.test.ts +1067 -0
- package/test/worker.test.ts +608 -0
- package/test/workflow-builder.test.ts +1670 -0
- package/test/workflow-cron.test.ts +256 -0
- package/test/workflow-state-adapter.test.ts +923 -0
- package/test/workflow.test.ts +25 -22
- package/tsconfig.json +3 -1
- package/vitest.config.ts +38 -1
- package/vitest.workers.config.ts +44 -0
- package/wrangler.jsonc +22 -0
- package/.turbo/turbo-test.log +0 -7
- package/src/context.js +0 -83
- package/src/every.js +0 -267
- package/src/index.js +0 -71
- package/src/on.js +0 -79
- package/src/send.js +0 -111
- package/src/types.js +0 -4
- package/src/workflow.js +0 -455
- package/test/context.test.js +0 -116
- package/test/every.test.js +0 -282
- package/test/on.test.js +0 -80
- package/test/send.test.js +0 -89
- package/test/workflow.test.js +0 -224
- package/vitest.config.js +0 -7
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenTelemetry Integration for ai-workflows
|
|
3
|
+
*
|
|
4
|
+
* Provides instrumented wrappers and telemetry utilities for workflow execution.
|
|
5
|
+
* Integrates with cascade-context for distributed tracing support.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { Workflow } from 'ai-workflows'
|
|
10
|
+
* import { withWorkflowTelemetry, instrumentWorkflow } from 'ai-workflows/telemetry'
|
|
11
|
+
*
|
|
12
|
+
* // Enable telemetry globally
|
|
13
|
+
* withWorkflowTelemetry({ provider: createConsoleTelemetryProvider() }, async () => {
|
|
14
|
+
* const workflow = Workflow($ => {
|
|
15
|
+
* $.on.Customer.created(async (customer) => {
|
|
16
|
+
* // Traced automatically
|
|
17
|
+
* })
|
|
18
|
+
* })
|
|
19
|
+
* await workflow.start()
|
|
20
|
+
* })
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @packageDocumentation
|
|
24
|
+
*/
|
|
25
|
+
import { getTracer, getMeter, getLogger, setTelemetryProvider, getTelemetryProvider, createHandlerMetrics, SemanticAttributes, MetricNames, createTraceparent, parseTraceparent, generateTraceId, generateSpanId, } from '@org.ai/types';
|
|
26
|
+
// Package info
|
|
27
|
+
const PACKAGE_NAME = 'ai-workflows';
|
|
28
|
+
const PACKAGE_VERSION = '2.1.4';
|
|
29
|
+
// ============================================================================
|
|
30
|
+
// Package-level Telemetry
|
|
31
|
+
// ============================================================================
|
|
32
|
+
let packageTracer;
|
|
33
|
+
let packageMeter;
|
|
34
|
+
let packageLogger;
|
|
35
|
+
let workflowMetrics;
|
|
36
|
+
/**
|
|
37
|
+
* Get the tracer for ai-workflows
|
|
38
|
+
*/
|
|
39
|
+
export function getWorkflowTracer() {
|
|
40
|
+
if (!packageTracer) {
|
|
41
|
+
packageTracer = getTracer(PACKAGE_NAME, PACKAGE_VERSION);
|
|
42
|
+
}
|
|
43
|
+
return packageTracer;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get the meter for ai-workflows
|
|
47
|
+
*/
|
|
48
|
+
export function getWorkflowMeter() {
|
|
49
|
+
if (!packageMeter) {
|
|
50
|
+
packageMeter = getMeter(PACKAGE_NAME, PACKAGE_VERSION);
|
|
51
|
+
}
|
|
52
|
+
return packageMeter;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get the logger for ai-workflows
|
|
56
|
+
*/
|
|
57
|
+
export function getWorkflowLogger() {
|
|
58
|
+
if (!packageLogger) {
|
|
59
|
+
packageLogger = getLogger(PACKAGE_NAME);
|
|
60
|
+
}
|
|
61
|
+
return packageLogger;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Create workflow-specific metrics
|
|
65
|
+
*/
|
|
66
|
+
export function createWorkflowMetrics(meter) {
|
|
67
|
+
return {
|
|
68
|
+
stepDuration: meter.createHistogram(MetricNames.WORKFLOW_STEP_DURATION, 'Duration of workflow steps', 'ms'),
|
|
69
|
+
stepTotal: meter.createCounter(MetricNames.WORKFLOW_STEP_TOTAL, 'Total number of workflow steps executed'),
|
|
70
|
+
stepErrors: meter.createCounter(MetricNames.WORKFLOW_STEP_ERRORS, 'Number of failed workflow steps'),
|
|
71
|
+
eventHandlers: meter.createCounter('workflow.event.handlers', 'Event handler invocations'),
|
|
72
|
+
scheduleHandlers: meter.createCounter('workflow.schedule.handlers', 'Schedule handler invocations'),
|
|
73
|
+
cascadeDepth: meter.createHistogram('workflow.cascade.depth', 'Cascade context depth'),
|
|
74
|
+
cascadeDuration: meter.createHistogram('workflow.cascade.duration', 'Total cascade execution duration', 'ms'),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get workflow metrics for the package
|
|
79
|
+
*/
|
|
80
|
+
export function getWorkflowMetrics() {
|
|
81
|
+
if (!workflowMetrics) {
|
|
82
|
+
workflowMetrics = createWorkflowMetrics(getWorkflowMeter());
|
|
83
|
+
}
|
|
84
|
+
return workflowMetrics;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Reset cached telemetry instances
|
|
88
|
+
*/
|
|
89
|
+
export function resetTelemetry() {
|
|
90
|
+
packageTracer = undefined;
|
|
91
|
+
packageMeter = undefined;
|
|
92
|
+
packageLogger = undefined;
|
|
93
|
+
workflowMetrics = undefined;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Execute a function with workflow telemetry enabled
|
|
97
|
+
*/
|
|
98
|
+
export async function withWorkflowTelemetry(options, fn) {
|
|
99
|
+
const previousProvider = getTelemetryProvider();
|
|
100
|
+
if (options.provider) {
|
|
101
|
+
setTelemetryProvider(options.provider);
|
|
102
|
+
resetTelemetry();
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
return await fn();
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
if (options.provider) {
|
|
109
|
+
setTelemetryProvider(previousProvider);
|
|
110
|
+
resetTelemetry();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// ============================================================================
|
|
115
|
+
// Cascade Context Integration
|
|
116
|
+
// ============================================================================
|
|
117
|
+
/**
|
|
118
|
+
* Create a span from a CascadeContext
|
|
119
|
+
*
|
|
120
|
+
* This bridges the cascade-context W3C Trace Context support with OpenTelemetry.
|
|
121
|
+
*/
|
|
122
|
+
export function spanFromCascadeContext(ctx, name) {
|
|
123
|
+
const tracer = getWorkflowTracer();
|
|
124
|
+
const traceContext = ctx.toTraceContext();
|
|
125
|
+
return tracer.startSpan(name || ctx.name || 'cascade', {
|
|
126
|
+
kind: 'internal',
|
|
127
|
+
parent: traceContext,
|
|
128
|
+
attributes: {
|
|
129
|
+
[SemanticAttributes.WORKFLOW_NAME]: ctx.name || 'cascade',
|
|
130
|
+
'cascade.correlationId': ctx.correlationId,
|
|
131
|
+
'cascade.spanId': ctx.spanId,
|
|
132
|
+
'cascade.depth': ctx.depth,
|
|
133
|
+
...(ctx.parentId && { 'cascade.parentId': ctx.parentId }),
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Create a TraceContext from a span
|
|
139
|
+
*
|
|
140
|
+
* Allows propagating span context to cascade-context.
|
|
141
|
+
*/
|
|
142
|
+
export function traceContextFromSpan(span) {
|
|
143
|
+
return span.getTraceContext();
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Record a CascadeStep as a span event
|
|
147
|
+
*/
|
|
148
|
+
export function recordStepAsSpanEvent(span, step) {
|
|
149
|
+
const attrs = {
|
|
150
|
+
'step.status': step.status,
|
|
151
|
+
...(step.duration !== undefined && { 'step.duration': step.duration }),
|
|
152
|
+
...(step.metadata &&
|
|
153
|
+
Object.keys(step.metadata).length > 0 && { 'step.metadata': JSON.stringify(step.metadata) }),
|
|
154
|
+
};
|
|
155
|
+
span.addEvent(step.name, attrs);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Convert CascadeContext steps to span events
|
|
159
|
+
*/
|
|
160
|
+
export function cascadeStepsToSpanEvents(span, ctx) {
|
|
161
|
+
for (const step of ctx.steps) {
|
|
162
|
+
recordStepAsSpanEvent(span, step);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// ============================================================================
|
|
166
|
+
// Event Handler Instrumentation
|
|
167
|
+
// ============================================================================
|
|
168
|
+
/**
|
|
169
|
+
* Record an event handler invocation
|
|
170
|
+
*/
|
|
171
|
+
export function recordEventHandler(params) {
|
|
172
|
+
const metrics = getWorkflowMetrics();
|
|
173
|
+
const labels = {
|
|
174
|
+
event: params.event,
|
|
175
|
+
status: params.success ? 'success' : 'error',
|
|
176
|
+
};
|
|
177
|
+
metrics.eventHandlers.add(1, labels);
|
|
178
|
+
metrics.stepDuration.record(params.durationMs, { ...labels, type: 'event' });
|
|
179
|
+
metrics.stepTotal.add(1, { ...labels, type: 'event' });
|
|
180
|
+
if (!params.success) {
|
|
181
|
+
metrics.stepErrors.add(1, { ...labels, type: 'event' });
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Record a schedule handler invocation
|
|
186
|
+
*/
|
|
187
|
+
export function recordScheduleHandler(params) {
|
|
188
|
+
const metrics = getWorkflowMetrics();
|
|
189
|
+
const labels = {
|
|
190
|
+
schedule: params.schedule,
|
|
191
|
+
status: params.success ? 'success' : 'error',
|
|
192
|
+
};
|
|
193
|
+
metrics.scheduleHandlers.add(1, labels);
|
|
194
|
+
metrics.stepDuration.record(params.durationMs, { ...labels, type: 'schedule' });
|
|
195
|
+
metrics.stepTotal.add(1, { ...labels, type: 'schedule' });
|
|
196
|
+
if (!params.success) {
|
|
197
|
+
metrics.stepErrors.add(1, { ...labels, type: 'schedule' });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Create a traced event handler
|
|
202
|
+
*/
|
|
203
|
+
export function tracedEventHandler(event, handler) {
|
|
204
|
+
return async (data, ctx) => {
|
|
205
|
+
const tracer = getWorkflowTracer();
|
|
206
|
+
const logger = getWorkflowLogger();
|
|
207
|
+
const startTime = Date.now();
|
|
208
|
+
return tracer.withSpan(`workflow.event.${event}`, {
|
|
209
|
+
kind: 'consumer',
|
|
210
|
+
attributes: {
|
|
211
|
+
[SemanticAttributes.WORKFLOW_NAME]: event,
|
|
212
|
+
'workflow.event': event,
|
|
213
|
+
},
|
|
214
|
+
}, async (span) => {
|
|
215
|
+
logger.info(`Event handler ${event} started`);
|
|
216
|
+
try {
|
|
217
|
+
const result = await handler(data, ctx);
|
|
218
|
+
const durationMs = Date.now() - startTime;
|
|
219
|
+
recordEventHandler({
|
|
220
|
+
event,
|
|
221
|
+
durationMs,
|
|
222
|
+
success: true,
|
|
223
|
+
});
|
|
224
|
+
span.setStatus('ok');
|
|
225
|
+
logger.info(`Event handler ${event} completed`, { durationMs });
|
|
226
|
+
return result;
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
const durationMs = Date.now() - startTime;
|
|
230
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
231
|
+
recordEventHandler({
|
|
232
|
+
event,
|
|
233
|
+
durationMs,
|
|
234
|
+
success: false,
|
|
235
|
+
});
|
|
236
|
+
span.setStatus('error', message);
|
|
237
|
+
logger.error(`Event handler ${event} failed`, error instanceof Error ? error : undefined, { durationMs });
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Create a traced schedule handler
|
|
245
|
+
*/
|
|
246
|
+
export function tracedScheduleHandler(schedule, handler) {
|
|
247
|
+
return async (ctx) => {
|
|
248
|
+
const tracer = getWorkflowTracer();
|
|
249
|
+
const logger = getWorkflowLogger();
|
|
250
|
+
const startTime = Date.now();
|
|
251
|
+
return tracer.withSpan(`workflow.schedule.${schedule}`, {
|
|
252
|
+
kind: 'internal',
|
|
253
|
+
attributes: {
|
|
254
|
+
[SemanticAttributes.WORKFLOW_NAME]: schedule,
|
|
255
|
+
'workflow.schedule': schedule,
|
|
256
|
+
},
|
|
257
|
+
}, async (span) => {
|
|
258
|
+
logger.info(`Schedule handler ${schedule} started`);
|
|
259
|
+
try {
|
|
260
|
+
const result = await handler(ctx);
|
|
261
|
+
const durationMs = Date.now() - startTime;
|
|
262
|
+
recordScheduleHandler({
|
|
263
|
+
schedule,
|
|
264
|
+
durationMs,
|
|
265
|
+
success: true,
|
|
266
|
+
});
|
|
267
|
+
span.setStatus('ok');
|
|
268
|
+
logger.info(`Schedule handler ${schedule} completed`, { durationMs });
|
|
269
|
+
return result;
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
const durationMs = Date.now() - startTime;
|
|
273
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
274
|
+
recordScheduleHandler({
|
|
275
|
+
schedule,
|
|
276
|
+
durationMs,
|
|
277
|
+
success: false,
|
|
278
|
+
});
|
|
279
|
+
span.setStatus('error', message);
|
|
280
|
+
logger.error(`Schedule handler ${schedule} failed`, error instanceof Error ? error : undefined, { durationMs });
|
|
281
|
+
throw error;
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
// ============================================================================
|
|
287
|
+
// Workflow Step Instrumentation
|
|
288
|
+
// ============================================================================
|
|
289
|
+
/**
|
|
290
|
+
* Record a workflow step
|
|
291
|
+
*/
|
|
292
|
+
export function recordWorkflowStep(params) {
|
|
293
|
+
const metrics = getWorkflowMetrics();
|
|
294
|
+
const labels = {
|
|
295
|
+
step: params.step,
|
|
296
|
+
workflow: params.workflow || 'default',
|
|
297
|
+
status: params.success ? 'success' : 'error',
|
|
298
|
+
...(params.tier && { tier: params.tier }),
|
|
299
|
+
};
|
|
300
|
+
metrics.stepTotal.add(1, labels);
|
|
301
|
+
metrics.stepDuration.record(params.durationMs, labels);
|
|
302
|
+
if (!params.success) {
|
|
303
|
+
metrics.stepErrors.add(1, labels);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Create a traced workflow step
|
|
308
|
+
*/
|
|
309
|
+
export function tracedStep(stepName, fn, options = {}) {
|
|
310
|
+
return async (...args) => {
|
|
311
|
+
const tracer = getWorkflowTracer();
|
|
312
|
+
const logger = getWorkflowLogger();
|
|
313
|
+
const startTime = Date.now();
|
|
314
|
+
const attributes = {
|
|
315
|
+
[SemanticAttributes.WORKFLOW_STEP]: stepName,
|
|
316
|
+
...(options.workflowName && { [SemanticAttributes.WORKFLOW_NAME]: options.workflowName }),
|
|
317
|
+
...(options.tier && { [SemanticAttributes.AI_TIER]: options.tier }),
|
|
318
|
+
};
|
|
319
|
+
return tracer.withSpan(`workflow.step.${stepName}`, { kind: 'internal', attributes }, async (span) => {
|
|
320
|
+
logger.debug(`Step ${stepName} started`, {
|
|
321
|
+
workflow: options.workflowName,
|
|
322
|
+
tier: options.tier,
|
|
323
|
+
});
|
|
324
|
+
try {
|
|
325
|
+
const result = await fn(...args);
|
|
326
|
+
const durationMs = Date.now() - startTime;
|
|
327
|
+
recordWorkflowStep({
|
|
328
|
+
step: stepName,
|
|
329
|
+
workflow: options.workflowName,
|
|
330
|
+
durationMs,
|
|
331
|
+
success: true,
|
|
332
|
+
tier: options.tier,
|
|
333
|
+
});
|
|
334
|
+
span.setStatus('ok');
|
|
335
|
+
return result;
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
const durationMs = Date.now() - startTime;
|
|
339
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
340
|
+
recordWorkflowStep({
|
|
341
|
+
step: stepName,
|
|
342
|
+
workflow: options.workflowName,
|
|
343
|
+
durationMs,
|
|
344
|
+
success: false,
|
|
345
|
+
tier: options.tier,
|
|
346
|
+
});
|
|
347
|
+
span.setStatus('error', message);
|
|
348
|
+
throw error;
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
// ============================================================================
|
|
354
|
+
// Span Helpers
|
|
355
|
+
// ============================================================================
|
|
356
|
+
/**
|
|
357
|
+
* Start a span for a workflow operation
|
|
358
|
+
*/
|
|
359
|
+
export function startWorkflowSpan(name, attributes) {
|
|
360
|
+
const tracer = getWorkflowTracer();
|
|
361
|
+
return tracer.startSpan(name, {
|
|
362
|
+
kind: 'internal',
|
|
363
|
+
attributes: {
|
|
364
|
+
[SemanticAttributes.SERVICE_NAME]: PACKAGE_NAME,
|
|
365
|
+
...attributes,
|
|
366
|
+
},
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Execute code within a workflow span
|
|
371
|
+
*/
|
|
372
|
+
export async function withWorkflowSpan(name, fn, attributes) {
|
|
373
|
+
const tracer = getWorkflowTracer();
|
|
374
|
+
return tracer.withSpan(name, { kind: 'internal', attributes }, fn);
|
|
375
|
+
}
|
|
376
|
+
// ============================================================================
|
|
377
|
+
// Re-exports from @org.ai/types
|
|
378
|
+
// ============================================================================
|
|
379
|
+
export {
|
|
380
|
+
// Global functions
|
|
381
|
+
getTracer, getMeter, getLogger, setTelemetryProvider, getTelemetryProvider,
|
|
382
|
+
// W3C Trace Context
|
|
383
|
+
createTraceparent, parseTraceparent, generateTraceId, generateSpanId,
|
|
384
|
+
// Constants
|
|
385
|
+
SemanticAttributes, MetricNames,
|
|
386
|
+
// Utilities
|
|
387
|
+
createHandlerMetrics, } from '@org.ai/types';
|
|
388
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global timer registry for workflow timers
|
|
3
|
+
*
|
|
4
|
+
* This module tracks all active timers across workflows to enable:
|
|
5
|
+
* - Timer cleanup when workflows are destroyed
|
|
6
|
+
* - Global timer count for debugging
|
|
7
|
+
* - Process exit cleanup
|
|
8
|
+
*/
|
|
9
|
+
interface TimerEntry {
|
|
10
|
+
timerId: NodeJS.Timeout;
|
|
11
|
+
workflowId: string;
|
|
12
|
+
registeredAt: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Register a timer in the global registry
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerTimer(workflowId: string, timerId: NodeJS.Timeout): string;
|
|
18
|
+
/**
|
|
19
|
+
* Unregister a timer from the global registry
|
|
20
|
+
*/
|
|
21
|
+
export declare function unregisterTimer(id: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Get all timer IDs for a specific workflow
|
|
24
|
+
*/
|
|
25
|
+
export declare function getTimerIdsForWorkflow(workflowId: string): string[];
|
|
26
|
+
/**
|
|
27
|
+
* Clear all timers for a specific workflow
|
|
28
|
+
*/
|
|
29
|
+
export declare function clearTimersForWorkflow(workflowId: string): number;
|
|
30
|
+
/**
|
|
31
|
+
* Get the count of all active timers
|
|
32
|
+
*/
|
|
33
|
+
export declare function getActiveTimerCount(): number;
|
|
34
|
+
/**
|
|
35
|
+
* Clear all timers from all workflows
|
|
36
|
+
*/
|
|
37
|
+
export declare function clearAllTimers(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Timer registry object for external access
|
|
40
|
+
*/
|
|
41
|
+
export declare const timerRegistry: {
|
|
42
|
+
register: typeof registerTimer;
|
|
43
|
+
unregister: typeof unregisterTimer;
|
|
44
|
+
getTimerIdsForWorkflow: typeof getTimerIdsForWorkflow;
|
|
45
|
+
clearForWorkflow: typeof clearTimersForWorkflow;
|
|
46
|
+
getActiveCount: typeof getActiveTimerCount;
|
|
47
|
+
clearAll: typeof clearAllTimers;
|
|
48
|
+
getAll: () => [string, TimerEntry][];
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Enable global timer registry functions.
|
|
52
|
+
*
|
|
53
|
+
* This opt-in function registers `getActiveWorkflowTimerCount` and `clearAllWorkflowTimers`
|
|
54
|
+
* on the global scope for debugging and cleanup purposes.
|
|
55
|
+
*
|
|
56
|
+
* Call this function explicitly if you need global access to timer management:
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```ts
|
|
60
|
+
* import { enableGlobalTimerRegistry } from 'ai-workflows'
|
|
61
|
+
*
|
|
62
|
+
* // Enable global registration
|
|
63
|
+
* enableGlobalTimerRegistry()
|
|
64
|
+
*
|
|
65
|
+
* // Now these are available globally:
|
|
66
|
+
* // globalThis.getActiveWorkflowTimerCount()
|
|
67
|
+
* // globalThis.clearAllWorkflowTimers()
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export declare function enableGlobalTimerRegistry(): void;
|
|
71
|
+
/**
|
|
72
|
+
* Check if global timer registry is enabled
|
|
73
|
+
*/
|
|
74
|
+
export declare function isGlobalTimerRegistryEnabled(): boolean;
|
|
75
|
+
export declare function registerProcessCleanup(): void;
|
|
76
|
+
export {};
|
|
77
|
+
//# sourceMappingURL=timer-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timer-registry.d.ts","sourceRoot":"","sources":["../src/timer-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;CACrB;AAmBD;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAQjF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAQnD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAQnE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAMjE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAKrC;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;CAQzB,CAAA;AAaD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAahD;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,OAAO,CAEtD;AAKD,wBAAgB,sBAAsB,IAAI,IAAI,CAU7C"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global timer registry for workflow timers
|
|
3
|
+
*
|
|
4
|
+
* This module tracks all active timers across workflows to enable:
|
|
5
|
+
* - Timer cleanup when workflows are destroyed
|
|
6
|
+
* - Global timer count for debugging
|
|
7
|
+
* - Process exit cleanup
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Global registry of active timers
|
|
11
|
+
*/
|
|
12
|
+
const activeTimers = new Map();
|
|
13
|
+
/**
|
|
14
|
+
* Counter for generating unique timer IDs
|
|
15
|
+
*/
|
|
16
|
+
let timerCounter = 0;
|
|
17
|
+
/**
|
|
18
|
+
* Generate a unique timer ID
|
|
19
|
+
*/
|
|
20
|
+
function generateTimerId(workflowId) {
|
|
21
|
+
return `${workflowId}-timer-${++timerCounter}`;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Register a timer in the global registry
|
|
25
|
+
*/
|
|
26
|
+
export function registerTimer(workflowId, timerId) {
|
|
27
|
+
const id = generateTimerId(workflowId);
|
|
28
|
+
activeTimers.set(id, {
|
|
29
|
+
timerId,
|
|
30
|
+
workflowId,
|
|
31
|
+
registeredAt: Date.now(),
|
|
32
|
+
});
|
|
33
|
+
return id;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Unregister a timer from the global registry
|
|
37
|
+
*/
|
|
38
|
+
export function unregisterTimer(id) {
|
|
39
|
+
const entry = activeTimers.get(id);
|
|
40
|
+
if (entry) {
|
|
41
|
+
clearInterval(entry.timerId);
|
|
42
|
+
activeTimers.delete(id);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get all timer IDs for a specific workflow
|
|
49
|
+
*/
|
|
50
|
+
export function getTimerIdsForWorkflow(workflowId) {
|
|
51
|
+
const ids = [];
|
|
52
|
+
for (const [id, entry] of activeTimers) {
|
|
53
|
+
if (entry.workflowId === workflowId) {
|
|
54
|
+
ids.push(id);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return ids;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Clear all timers for a specific workflow
|
|
61
|
+
*/
|
|
62
|
+
export function clearTimersForWorkflow(workflowId) {
|
|
63
|
+
const ids = getTimerIdsForWorkflow(workflowId);
|
|
64
|
+
for (const id of ids) {
|
|
65
|
+
unregisterTimer(id);
|
|
66
|
+
}
|
|
67
|
+
return ids.length;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get the count of all active timers
|
|
71
|
+
*/
|
|
72
|
+
export function getActiveTimerCount() {
|
|
73
|
+
return activeTimers.size;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Clear all timers from all workflows
|
|
77
|
+
*/
|
|
78
|
+
export function clearAllTimers() {
|
|
79
|
+
for (const [id, entry] of activeTimers) {
|
|
80
|
+
clearInterval(entry.timerId);
|
|
81
|
+
activeTimers.delete(id);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Timer registry object for external access
|
|
86
|
+
*/
|
|
87
|
+
export const timerRegistry = {
|
|
88
|
+
register: registerTimer,
|
|
89
|
+
unregister: unregisterTimer,
|
|
90
|
+
getTimerIdsForWorkflow,
|
|
91
|
+
clearForWorkflow: clearTimersForWorkflow,
|
|
92
|
+
getActiveCount: getActiveTimerCount,
|
|
93
|
+
clearAll: clearAllTimers,
|
|
94
|
+
getAll: () => Array.from(activeTimers.entries()),
|
|
95
|
+
};
|
|
96
|
+
let globalRegistrationEnabled = false;
|
|
97
|
+
function registerGlobalFunctions(target) {
|
|
98
|
+
;
|
|
99
|
+
target['getActiveWorkflowTimerCount'] =
|
|
100
|
+
getActiveTimerCount;
|
|
101
|
+
target['clearAllWorkflowTimers'] = clearAllTimers;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Enable global timer registry functions.
|
|
105
|
+
*
|
|
106
|
+
* This opt-in function registers `getActiveWorkflowTimerCount` and `clearAllWorkflowTimers`
|
|
107
|
+
* on the global scope for debugging and cleanup purposes.
|
|
108
|
+
*
|
|
109
|
+
* Call this function explicitly if you need global access to timer management:
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```ts
|
|
113
|
+
* import { enableGlobalTimerRegistry } from 'ai-workflows'
|
|
114
|
+
*
|
|
115
|
+
* // Enable global registration
|
|
116
|
+
* enableGlobalTimerRegistry()
|
|
117
|
+
*
|
|
118
|
+
* // Now these are available globally:
|
|
119
|
+
* // globalThis.getActiveWorkflowTimerCount()
|
|
120
|
+
* // globalThis.clearAllWorkflowTimers()
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
export function enableGlobalTimerRegistry() {
|
|
124
|
+
if (globalRegistrationEnabled)
|
|
125
|
+
return;
|
|
126
|
+
globalRegistrationEnabled = true;
|
|
127
|
+
// Register on globalThis (standard)
|
|
128
|
+
if (typeof globalThis !== 'undefined') {
|
|
129
|
+
registerGlobalFunctions(globalThis);
|
|
130
|
+
}
|
|
131
|
+
// Also register on global (Node.js specific, used in some test environments)
|
|
132
|
+
if (typeof global !== 'undefined' && global !== globalThis) {
|
|
133
|
+
registerGlobalFunctions(global);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Check if global timer registry is enabled
|
|
138
|
+
*/
|
|
139
|
+
export function isGlobalTimerRegistryEnabled() {
|
|
140
|
+
return globalRegistrationEnabled;
|
|
141
|
+
}
|
|
142
|
+
// Register process exit handlers for cleanup
|
|
143
|
+
let cleanupRegistered = false;
|
|
144
|
+
export function registerProcessCleanup() {
|
|
145
|
+
if (cleanupRegistered)
|
|
146
|
+
return;
|
|
147
|
+
cleanupRegistered = true;
|
|
148
|
+
const cleanup = () => {
|
|
149
|
+
clearAllTimers();
|
|
150
|
+
};
|
|
151
|
+
process.on('exit', cleanup);
|
|
152
|
+
process.on('beforeExit', cleanup);
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=timer-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timer-registry.js","sourceRoot":"","sources":["../src/timer-registry.ts"],"names":[],"mappings":"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"}
|