autotel-cloudflare 3.0.0 → 4.0.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/agents.d.ts +626 -123
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +260 -171
- package/dist/agents.js.map +1 -1
- package/package.json +8 -4
- package/src/actors/alarms.ts +0 -225
- package/src/actors/index.ts +0 -36
- package/src/actors/instrument-actor.test.ts +0 -179
- package/src/actors/instrument-actor.ts +0 -574
- package/src/actors/sockets.ts +0 -217
- package/src/actors/storage.ts +0 -263
- package/src/actors/traced-handler.ts +0 -300
- package/src/actors/types.ts +0 -98
- package/src/actors.ts +0 -50
- package/src/agents/index.ts +0 -42
- package/src/agents/otel-observability.test.ts +0 -336
- package/src/agents/otel-observability.ts +0 -474
- package/src/agents/types.ts +0 -167
- package/src/agents.ts +0 -76
- package/src/bindings/ai.test.ts +0 -170
- package/src/bindings/ai.ts +0 -73
- package/src/bindings/analytics-engine.test.ts +0 -175
- package/src/bindings/analytics-engine.ts +0 -78
- package/src/bindings/bindings-cache.test.ts +0 -80
- package/src/bindings/bindings-detection.test.ts +0 -235
- package/src/bindings/bindings-this-binding.test.ts +0 -294
- package/src/bindings/bindings.ts +0 -720
- package/src/bindings/browser-rendering.test.ts +0 -160
- package/src/bindings/browser-rendering.ts +0 -70
- package/src/bindings/common.ts +0 -84
- package/src/bindings/hyperdrive.test.ts +0 -176
- package/src/bindings/hyperdrive.ts +0 -74
- package/src/bindings/images.test.ts +0 -262
- package/src/bindings/images.ts +0 -182
- package/src/bindings/index.ts +0 -20
- package/src/bindings/queue-producer.test.ts +0 -224
- package/src/bindings/queue-producer.ts +0 -105
- package/src/bindings/rate-limiter.test.ts +0 -140
- package/src/bindings/rate-limiter.ts +0 -69
- package/src/bindings/vectorize.test.ts +0 -362
- package/src/bindings/vectorize.ts +0 -86
- package/src/bindings.ts +0 -6
- package/src/events.ts +0 -6
- package/src/execution-logger.test.ts +0 -127
- package/src/execution-logger.ts +0 -112
- package/src/global/cache.test.ts +0 -292
- package/src/global/cache.ts +0 -164
- package/src/global/fetch.test.ts +0 -399
- package/src/global/fetch.ts +0 -136
- package/src/global/index.ts +0 -7
- package/src/handlers/durable-objects.test.ts +0 -524
- package/src/handlers/durable-objects.ts +0 -250
- package/src/handlers/index.ts +0 -6
- package/src/handlers/workflows.test.ts +0 -411
- package/src/handlers/workflows.ts +0 -345
- package/src/handlers.ts +0 -6
- package/src/index.ts +0 -91
- package/src/logger.ts +0 -15
- package/src/native/native-tracing.test.ts +0 -54
- package/src/native/native-tracing.ts +0 -83
- package/src/native.ts +0 -12
- package/src/parse-error.ts +0 -1
- package/src/sampling.ts +0 -6
- package/src/testing.ts +0 -6
- package/src/wrappers/cf-attributes.test.ts +0 -334
- package/src/wrappers/define-worker-fetch.test.ts +0 -102
- package/src/wrappers/define-worker-fetch.ts +0 -71
- package/src/wrappers/index.ts +0 -13
- package/src/wrappers/instrument.integration.test.ts +0 -578
- package/src/wrappers/instrument.ts +0 -806
- package/src/wrappers/native-instrument.test.ts +0 -153
- package/src/wrappers/wrap-do.ts +0 -34
- package/src/wrappers/wrap-module.ts +0 -37
package/dist/agents.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","names":[],"sources":["../src/agents/types.ts","../src/agents/otel-observability.ts"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"agents.d.ts","names":[],"sources":["../src/agents/base.ts","../src/agents/agent.ts","../src/agents/mcp.ts","../src/agents/observability.ts","../src/agents/types.ts","../src/agents/otel-observability.ts"],"mappings":"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"}
|
package/dist/agents.js
CHANGED
|
@@ -1,44 +1,15 @@
|
|
|
1
1
|
import { WorkerTracer, WorkerTracerProvider, createInitialiser } from "autotel-edge";
|
|
2
2
|
import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
3
3
|
import { resourceFromAttributes } from "@opentelemetry/resources";
|
|
4
|
+
import { agentContextFromSpan, recordHumanApproval } from "autotel-genai/agent";
|
|
4
5
|
|
|
5
6
|
//#region src/agents/otel-observability.ts
|
|
6
7
|
/**
|
|
7
8
|
* OpenTelemetry-based Observability implementation for Cloudflare Agents SDK
|
|
8
9
|
*
|
|
9
10
|
* Converts Agent events into OpenTelemetry spans for distributed tracing.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```typescript
|
|
13
|
-
* import { Agent } from 'agents'
|
|
14
|
-
* import { createOtelObservability } from 'autotel-cloudflare/agents'
|
|
15
|
-
*
|
|
16
|
-
* class MyAgent extends Agent<Env> {
|
|
17
|
-
* observability = createOtelObservability({
|
|
18
|
-
* service: { name: 'my-agent' },
|
|
19
|
-
* exporter: { url: env.OTLP_ENDPOINT }
|
|
20
|
-
* })
|
|
21
|
-
*
|
|
22
|
-
* @callable()
|
|
23
|
-
* async doSomething() {
|
|
24
|
-
* // This RPC call will be automatically traced
|
|
25
|
-
* return 'done'
|
|
26
|
-
* }
|
|
27
|
-
* }
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
/**
|
|
31
|
-
* Map of active spans keyed by event ID
|
|
32
|
-
* Used to correlate start/end events
|
|
33
|
-
*/
|
|
34
|
-
const activeSpans = /* @__PURE__ */ new Map();
|
|
35
|
-
/**
|
|
36
|
-
* Whether the provider has been initialized
|
|
37
11
|
*/
|
|
38
12
|
let providerInitialized = false;
|
|
39
|
-
/**
|
|
40
|
-
* Initialize the tracer provider for Agents
|
|
41
|
-
*/
|
|
42
13
|
function initProvider(config) {
|
|
43
14
|
if (providerInitialized) return;
|
|
44
15
|
const resource = resourceFromAttributes({
|
|
@@ -55,128 +26,221 @@ function initProvider(config) {
|
|
|
55
26
|
trace.getTracer("autotel-cloudflare/agents").setHeadSampler(config.sampling.headSampler);
|
|
56
27
|
providerInitialized = true;
|
|
57
28
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
29
|
+
function classifyEvent(type) {
|
|
30
|
+
if (type.startsWith("mcp:")) return "mcp";
|
|
31
|
+
if (type.startsWith("workflow:")) return "workflow";
|
|
32
|
+
if (type.startsWith("fiber:")) return "fiber";
|
|
33
|
+
if (type.startsWith("agent_tool:")) return "agentTool";
|
|
34
|
+
if (type.startsWith("chat:transcript:")) return "transcript";
|
|
35
|
+
if (type.startsWith("chat:")) return "chat";
|
|
36
|
+
if (type.startsWith("submission:")) return "submission";
|
|
37
|
+
if (type.startsWith("queue:")) return "queue";
|
|
38
|
+
if (type.startsWith("schedule:")) return "schedule";
|
|
39
|
+
if (type.startsWith("message:") || type.startsWith("tool:") || type === "rpc:error") return "message";
|
|
40
|
+
if (type === "rpc") return "rpc";
|
|
41
|
+
if (type.startsWith("state:")) return "state";
|
|
42
|
+
if (type.startsWith("email:")) return "email";
|
|
43
|
+
if (type === "connect" || type === "disconnect" || type === "destroy") return "lifecycle";
|
|
44
|
+
return "message";
|
|
45
|
+
}
|
|
46
|
+
function shouldTraceEvent(event, options) {
|
|
47
|
+
const merged = {
|
|
48
|
+
traceRpc: true,
|
|
49
|
+
traceSchedule: true,
|
|
50
|
+
traceQueue: true,
|
|
51
|
+
traceSubmissions: true,
|
|
52
|
+
traceMcp: true,
|
|
53
|
+
traceStateUpdates: false,
|
|
54
|
+
traceMessages: true,
|
|
55
|
+
traceLifecycle: true,
|
|
56
|
+
traceChat: true,
|
|
57
|
+
traceTranscripts: true,
|
|
58
|
+
traceFibers: true,
|
|
59
|
+
traceToolRecovery: true,
|
|
60
|
+
traceWorkflow: true,
|
|
61
|
+
traceEmail: true,
|
|
62
|
+
...options
|
|
63
|
+
};
|
|
64
|
+
switch (classifyEvent(event.type)) {
|
|
65
|
+
case "rpc": return merged.traceRpc;
|
|
66
|
+
case "schedule": return merged.traceSchedule;
|
|
67
|
+
case "queue": return merged.traceQueue;
|
|
68
|
+
case "submission": return merged.traceSubmissions;
|
|
69
|
+
case "mcp": return merged.traceMcp;
|
|
70
|
+
case "state": return merged.traceStateUpdates;
|
|
71
|
+
case "message": return merged.traceMessages;
|
|
72
|
+
case "lifecycle": return merged.traceLifecycle;
|
|
73
|
+
case "chat": return merged.traceChat;
|
|
74
|
+
case "transcript": return merged.traceTranscripts;
|
|
75
|
+
case "fiber": return merged.traceFibers;
|
|
76
|
+
case "agentTool": return merged.traceToolRecovery;
|
|
77
|
+
case "workflow": return merged.traceWorkflow;
|
|
78
|
+
case "email": return merged.traceEmail;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function formatTypeSegment(value) {
|
|
82
|
+
return value.replaceAll(/[:_]/g, ".");
|
|
83
|
+
}
|
|
84
|
+
function getPayloadName(payload, ...keys) {
|
|
85
|
+
for (const key of keys) {
|
|
86
|
+
const value = payload[key];
|
|
87
|
+
if (typeof value === "string" && value.length > 0) return value;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
61
90
|
function getDefaultSpanName(event) {
|
|
91
|
+
const payload = event.payload;
|
|
62
92
|
switch (event.type) {
|
|
63
|
-
case "rpc":
|
|
64
|
-
case "
|
|
65
|
-
case "schedule:
|
|
66
|
-
case "schedule:
|
|
67
|
-
case "
|
|
68
|
-
case "
|
|
69
|
-
case "
|
|
70
|
-
case "
|
|
71
|
-
case "
|
|
72
|
-
case "
|
|
73
|
-
case "
|
|
74
|
-
case "
|
|
75
|
-
case "
|
|
76
|
-
case "
|
|
77
|
-
|
|
93
|
+
case "rpc":
|
|
94
|
+
case "rpc:error": return `agent.rpc ${payload.method}`;
|
|
95
|
+
case "schedule:create":
|
|
96
|
+
case "schedule:execute":
|
|
97
|
+
case "schedule:cancel":
|
|
98
|
+
case "schedule:retry":
|
|
99
|
+
case "schedule:error":
|
|
100
|
+
case "schedule:duplicate_warning": return `agent.${formatTypeSegment(event.type)} ${getPayloadName(payload, "callback") ?? "unknown"}`;
|
|
101
|
+
case "queue:create":
|
|
102
|
+
case "queue:retry":
|
|
103
|
+
case "queue:error": return `agent.${formatTypeSegment(event.type)} ${getPayloadName(payload, "callback") ?? "unknown"}`;
|
|
104
|
+
case "submission:create":
|
|
105
|
+
case "submission:status":
|
|
106
|
+
case "submission:error": return `agent.${formatTypeSegment(event.type)} ${getPayloadName(payload, "submissionId") ?? "unknown"}`;
|
|
107
|
+
case "connect":
|
|
108
|
+
case "disconnect": return `agent.${event.type} ${getPayloadName(payload, "connectionId") ?? "unknown"}`;
|
|
109
|
+
case "mcp:client:preconnect": return `mcp.client.preconnect ${getPayloadName(payload, "serverId") ?? "unknown"}`;
|
|
110
|
+
case "mcp:client:authorize": return `mcp.client.authorize ${getPayloadName(payload, "serverId") ?? "unknown"}`;
|
|
111
|
+
case "mcp:client:connect":
|
|
112
|
+
case "mcp:client:discover":
|
|
113
|
+
case "mcp:client:close": return `mcp.client.${formatTypeSegment(event.type).split(".").slice(-1)[0]} ${getPayloadName(payload, "url", "capability", "state") ?? "unknown"}`;
|
|
114
|
+
case "workflow:start":
|
|
115
|
+
case "workflow:event":
|
|
116
|
+
case "workflow:approved":
|
|
117
|
+
case "workflow:rejected":
|
|
118
|
+
case "workflow:terminated":
|
|
119
|
+
case "workflow:paused":
|
|
120
|
+
case "workflow:resumed":
|
|
121
|
+
case "workflow:restarted": return `agent.${formatTypeSegment(event.type)} ${getPayloadName(payload, "workflowName", "workflowId", "eventType") ?? "unknown"}`;
|
|
122
|
+
case "email:receive":
|
|
123
|
+
case "email:reply":
|
|
124
|
+
case "email:send": return `agent.${formatTypeSegment(event.type)} ${getPayloadName(payload, "subject") ?? "message"}`;
|
|
125
|
+
case "destroy": return "agent.destroy";
|
|
126
|
+
default: return `agent.${formatTypeSegment(event.type)}`;
|
|
78
127
|
}
|
|
79
128
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
129
|
+
function isPrimitiveAttributeValue(value) {
|
|
130
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") return true;
|
|
131
|
+
if (!Array.isArray(value)) return false;
|
|
132
|
+
return value.every((entry) => typeof entry === "string" || typeof entry === "number" || typeof entry === "boolean");
|
|
133
|
+
}
|
|
134
|
+
function setIfPresent(attrs, key, value) {
|
|
135
|
+
if (value === void 0 || value === null) return;
|
|
136
|
+
if (isPrimitiveAttributeValue(value)) attrs[key] = value;
|
|
137
|
+
}
|
|
83
138
|
function getDefaultAttributes(event) {
|
|
84
|
-
const attrs = {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
139
|
+
const attrs = { "agent.event.type": event.type };
|
|
140
|
+
setIfPresent(attrs, "agent.event.id", event.id);
|
|
141
|
+
setIfPresent(attrs, "agent.display_message", event.displayMessage);
|
|
142
|
+
setIfPresent(attrs, "agent.class", event.agent);
|
|
143
|
+
setIfPresent(attrs, "agent.instance.name", event.name);
|
|
144
|
+
setIfPresent(attrs, "gen_ai.agent.name", event.agent);
|
|
88
145
|
switch (event.type) {
|
|
89
146
|
case "rpc":
|
|
90
147
|
attrs["agent.rpc.method"] = event.payload.method;
|
|
91
|
-
|
|
148
|
+
setIfPresent(attrs, "agent.rpc.streaming", event.payload.streaming);
|
|
149
|
+
break;
|
|
150
|
+
case "rpc:error":
|
|
151
|
+
attrs["agent.rpc.method"] = event.payload.method;
|
|
92
152
|
break;
|
|
93
153
|
case "schedule:create":
|
|
94
154
|
case "schedule:execute":
|
|
95
155
|
case "schedule:cancel":
|
|
96
|
-
|
|
97
|
-
|
|
156
|
+
case "schedule:retry":
|
|
157
|
+
case "schedule:error":
|
|
158
|
+
case "queue:create":
|
|
159
|
+
case "queue:retry":
|
|
160
|
+
case "queue:error":
|
|
161
|
+
setIfPresent(attrs, "agent.schedule.callback", event.payload.callback);
|
|
162
|
+
setIfPresent(attrs, "agent.schedule.id", event.payload.id);
|
|
163
|
+
break;
|
|
164
|
+
case "schedule:duplicate_warning":
|
|
165
|
+
setIfPresent(attrs, "agent.schedule.callback", event.payload.callback);
|
|
98
166
|
break;
|
|
99
167
|
case "connect":
|
|
100
|
-
|
|
168
|
+
case "disconnect":
|
|
169
|
+
setIfPresent(attrs, "agent.connection.id", event.payload.connectionId);
|
|
101
170
|
break;
|
|
102
171
|
case "mcp:client:preconnect":
|
|
103
|
-
attrs
|
|
172
|
+
setIfPresent(attrs, "agent.mcp.server_id", event.payload.serverId);
|
|
104
173
|
break;
|
|
105
174
|
case "mcp:client:connect":
|
|
106
|
-
|
|
107
|
-
attrs
|
|
108
|
-
attrs
|
|
109
|
-
|
|
175
|
+
case "mcp:client:close":
|
|
176
|
+
setIfPresent(attrs, "agent.mcp.url", event.payload.url);
|
|
177
|
+
setIfPresent(attrs, "agent.mcp.transport", event.payload.transport);
|
|
178
|
+
setIfPresent(attrs, "agent.mcp.state", event.payload.state);
|
|
110
179
|
break;
|
|
111
180
|
case "mcp:client:authorize":
|
|
112
|
-
attrs
|
|
113
|
-
attrs
|
|
114
|
-
|
|
181
|
+
setIfPresent(attrs, "agent.mcp.server_id", event.payload.serverId);
|
|
182
|
+
setIfPresent(attrs, "agent.mcp.auth_url", event.payload.authUrl);
|
|
183
|
+
setIfPresent(attrs, "agent.mcp.client_id", event.payload.clientId);
|
|
184
|
+
break;
|
|
185
|
+
case "mcp:client:discover":
|
|
186
|
+
setIfPresent(attrs, "agent.mcp.url", event.payload.url);
|
|
187
|
+
setIfPresent(attrs, "agent.mcp.state", event.payload.state);
|
|
188
|
+
setIfPresent(attrs, "agent.mcp.capability", event.payload.capability);
|
|
115
189
|
break;
|
|
116
190
|
}
|
|
117
|
-
for (const [key, value] of Object.entries(event.payload))
|
|
191
|
+
for (const [key, value] of Object.entries(event.payload)) setIfPresent(attrs, `agent.payload.${key}`, value);
|
|
118
192
|
return attrs;
|
|
119
193
|
}
|
|
120
|
-
/**
|
|
121
|
-
* Determine span kind based on event type
|
|
122
|
-
*/
|
|
123
194
|
function getSpanKind(event) {
|
|
124
|
-
switch (event.type) {
|
|
125
|
-
case "rpc":
|
|
126
|
-
case "
|
|
127
|
-
case "
|
|
128
|
-
case "mcp
|
|
129
|
-
case "
|
|
130
|
-
case "
|
|
195
|
+
switch (classifyEvent(event.type)) {
|
|
196
|
+
case "rpc":
|
|
197
|
+
case "lifecycle":
|
|
198
|
+
case "email": return SpanKind.SERVER;
|
|
199
|
+
case "mcp": return SpanKind.CLIENT;
|
|
200
|
+
case "schedule":
|
|
201
|
+
case "queue": return SpanKind.CONSUMER;
|
|
131
202
|
default: return SpanKind.INTERNAL;
|
|
132
203
|
}
|
|
133
204
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
traceStateUpdates: false,
|
|
143
|
-
traceMessages: true,
|
|
144
|
-
traceLifecycle: true,
|
|
145
|
-
...options
|
|
146
|
-
};
|
|
147
|
-
switch (event.type) {
|
|
148
|
-
case "rpc": return opts.traceRpc ?? true;
|
|
149
|
-
case "schedule:create":
|
|
150
|
-
case "schedule:execute":
|
|
151
|
-
case "schedule:cancel": return opts.traceSchedule ?? true;
|
|
152
|
-
case "mcp:client:preconnect":
|
|
153
|
-
case "mcp:client:connect":
|
|
154
|
-
case "mcp:client:authorize":
|
|
155
|
-
case "mcp:client:discover": return opts.traceMcp ?? true;
|
|
156
|
-
case "state:update": return opts.traceStateUpdates ?? false;
|
|
157
|
-
case "message:request":
|
|
158
|
-
case "message:response":
|
|
159
|
-
case "message:clear": return opts.traceMessages ?? true;
|
|
160
|
-
case "connect":
|
|
161
|
-
case "destroy": return opts.traceLifecycle ?? true;
|
|
162
|
-
default: return true;
|
|
205
|
+
function inferErrorMessage(event) {
|
|
206
|
+
const payload = event.payload;
|
|
207
|
+
const direct = payload.error;
|
|
208
|
+
if (typeof direct === "string" && direct.length > 0) return direct;
|
|
209
|
+
if (event.type === "workflow:rejected") {
|
|
210
|
+
const reason = payload.reason;
|
|
211
|
+
if (typeof reason === "string" && reason.length > 0) return reason;
|
|
212
|
+
return "workflow rejected";
|
|
163
213
|
}
|
|
214
|
+
if (event.type.endsWith(":failed") || event.type.endsWith(":error")) return event.type;
|
|
215
|
+
}
|
|
216
|
+
function isErrorEvent(event) {
|
|
217
|
+
if (event.type === "workflow:rejected") return true;
|
|
218
|
+
if (event.type.endsWith(":error") || event.type.endsWith(":failed")) return true;
|
|
219
|
+
if ("error" in event.payload) return typeof event.payload.error === "string";
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
function applyEventStatus(span, event) {
|
|
223
|
+
if (!isErrorEvent(event)) {
|
|
224
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const message = inferErrorMessage(event);
|
|
228
|
+
span.setStatus({
|
|
229
|
+
code: SpanStatusCode.ERROR,
|
|
230
|
+
message
|
|
231
|
+
});
|
|
232
|
+
span.setAttribute("error", true);
|
|
233
|
+
if (message) span.setAttribute("exception.message", message);
|
|
164
234
|
}
|
|
165
|
-
/**
|
|
166
|
-
* Export spans asynchronously
|
|
167
|
-
*/
|
|
168
235
|
async function exportSpans(traceId, ctx) {
|
|
169
236
|
const tracer = trace.getTracer("autotel-cloudflare/agents");
|
|
170
237
|
if (tracer instanceof WorkerTracer) try {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
if (ctxWithScheduler.scheduler) await ctxWithScheduler.scheduler.wait(1);
|
|
174
|
-
}
|
|
238
|
+
const scheduler = ctx && "scheduler" in ctx ? ctx.scheduler : void 0;
|
|
239
|
+
if (scheduler?.wait) await scheduler.wait(1);
|
|
175
240
|
await tracer.forceFlush(traceId);
|
|
176
241
|
} catch (error) {
|
|
177
242
|
console.error("[autotel-cloudflare/agents] Failed to export spans:", error);
|
|
178
243
|
}
|
|
179
|
-
if (ctx && "waitUntil" in ctx) {}
|
|
180
244
|
}
|
|
181
245
|
/**
|
|
182
246
|
* OpenTelemetry-based Observability implementation
|
|
@@ -193,19 +257,11 @@ var OtelObservability = class {
|
|
|
193
257
|
this.config = initialiser({}, void 0);
|
|
194
258
|
this.options = config.agents ?? {};
|
|
195
259
|
}
|
|
196
|
-
/**
|
|
197
|
-
* Initialize the tracer provider (called lazily on first emit)
|
|
198
|
-
*/
|
|
199
260
|
initialize() {
|
|
200
261
|
if (this.initialized) return;
|
|
201
262
|
initProvider(this.config);
|
|
202
263
|
this.initialized = true;
|
|
203
264
|
}
|
|
204
|
-
/**
|
|
205
|
-
* Emit an observability event
|
|
206
|
-
*
|
|
207
|
-
* Converts the event to an OpenTelemetry span based on the event type.
|
|
208
|
-
*/
|
|
209
265
|
emit(event, ctx) {
|
|
210
266
|
this.initialize();
|
|
211
267
|
if (!shouldTraceEvent(event, this.options)) return;
|
|
@@ -213,63 +269,33 @@ var OtelObservability = class {
|
|
|
213
269
|
const spanName = this.options.spanNameFormatter ? this.options.spanNameFormatter(event) : getDefaultSpanName(event);
|
|
214
270
|
const defaultAttrs = getDefaultAttributes(event);
|
|
215
271
|
const customAttrs = this.options.attributeExtractor ? this.options.attributeExtractor(event) : {};
|
|
216
|
-
const attributes = {
|
|
217
|
-
...defaultAttrs,
|
|
218
|
-
...customAttrs
|
|
219
|
-
};
|
|
220
|
-
const kind = getSpanKind(event);
|
|
221
272
|
const span = tracer.startSpan(spanName, {
|
|
222
|
-
kind,
|
|
223
|
-
attributes
|
|
273
|
+
kind: getSpanKind(event),
|
|
274
|
+
attributes: {
|
|
275
|
+
...defaultAttrs,
|
|
276
|
+
...customAttrs
|
|
277
|
+
},
|
|
224
278
|
startTime: event.timestamp
|
|
225
279
|
});
|
|
226
|
-
|
|
280
|
+
if (event.type === "tool:approval") recordHumanApproval({
|
|
281
|
+
ctx: agentContextFromSpan(span),
|
|
282
|
+
toolCallId: event.payload.toolCallId,
|
|
283
|
+
approved: event.payload.approved,
|
|
284
|
+
required: true
|
|
285
|
+
});
|
|
286
|
+
applyEventStatus(span, event);
|
|
227
287
|
span.end(event.timestamp + 1);
|
|
228
|
-
activeSpans.set(event.id, span);
|
|
229
288
|
const traceId = span.spanContext().traceId;
|
|
230
|
-
if (ctx && "waitUntil" in ctx && typeof ctx.waitUntil === "function")
|
|
231
|
-
|
|
289
|
+
if (ctx && "waitUntil" in ctx && typeof ctx.waitUntil === "function") {
|
|
290
|
+
ctx.waitUntil(exportSpans(traceId, ctx));
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
exportSpans(traceId, ctx);
|
|
232
294
|
}
|
|
233
295
|
};
|
|
234
|
-
/**
|
|
235
|
-
* Create an OtelObservability instance
|
|
236
|
-
*
|
|
237
|
-
* @example
|
|
238
|
-
* ```typescript
|
|
239
|
-
* import { Agent } from 'agents'
|
|
240
|
-
* import { createOtelObservability } from 'autotel-cloudflare/agents'
|
|
241
|
-
*
|
|
242
|
-
* class MyAgent extends Agent<Env> {
|
|
243
|
-
* observability = createOtelObservability({
|
|
244
|
-
* service: { name: 'my-agent' },
|
|
245
|
-
* exporter: { url: env.OTLP_ENDPOINT }
|
|
246
|
-
* })
|
|
247
|
-
* }
|
|
248
|
-
* ```
|
|
249
|
-
*/
|
|
250
296
|
function createOtelObservability(config) {
|
|
251
297
|
return new OtelObservability(config);
|
|
252
298
|
}
|
|
253
|
-
/**
|
|
254
|
-
* Create an OtelObservability instance with environment-based config
|
|
255
|
-
*
|
|
256
|
-
* Use this when you need to access environment variables for configuration.
|
|
257
|
-
*
|
|
258
|
-
* @example
|
|
259
|
-
* ```typescript
|
|
260
|
-
* import { Agent } from 'agents'
|
|
261
|
-
* import { createOtelObservabilityFromEnv } from 'autotel-cloudflare/agents'
|
|
262
|
-
*
|
|
263
|
-
* class MyAgent extends Agent<Env> {
|
|
264
|
-
* observability?: OtelObservability
|
|
265
|
-
*
|
|
266
|
-
* constructor(state: DurableObjectState, env: Env) {
|
|
267
|
-
* super(state, env)
|
|
268
|
-
* this.observability = createOtelObservabilityFromEnv(env)
|
|
269
|
-
* }
|
|
270
|
-
* }
|
|
271
|
-
* ```
|
|
272
|
-
*/
|
|
273
299
|
function createOtelObservabilityFromEnv(env, options) {
|
|
274
300
|
const endpoint = env.OTEL_EXPORTER_OTLP_ENDPOINT || void 0;
|
|
275
301
|
const serviceName = env.OTEL_SERVICE_NAME || "cloudflare-agent";
|
|
@@ -293,5 +319,68 @@ function createOtelObservabilityFromEnv(env, options) {
|
|
|
293
319
|
}
|
|
294
320
|
|
|
295
321
|
//#endregion
|
|
296
|
-
|
|
322
|
+
//#region src/agents/observability.ts
|
|
323
|
+
const listeners = {
|
|
324
|
+
state: /* @__PURE__ */ new Set(),
|
|
325
|
+
rpc: /* @__PURE__ */ new Set(),
|
|
326
|
+
message: /* @__PURE__ */ new Set(),
|
|
327
|
+
chat: /* @__PURE__ */ new Set(),
|
|
328
|
+
transcript: /* @__PURE__ */ new Set(),
|
|
329
|
+
fiber: /* @__PURE__ */ new Set(),
|
|
330
|
+
agentTool: /* @__PURE__ */ new Set(),
|
|
331
|
+
schedule: /* @__PURE__ */ new Set(),
|
|
332
|
+
lifecycle: /* @__PURE__ */ new Set(),
|
|
333
|
+
workflow: /* @__PURE__ */ new Set(),
|
|
334
|
+
mcp: /* @__PURE__ */ new Set(),
|
|
335
|
+
email: /* @__PURE__ */ new Set()
|
|
336
|
+
};
|
|
337
|
+
function createChannel(key, name) {
|
|
338
|
+
return {
|
|
339
|
+
name,
|
|
340
|
+
publish(event) {
|
|
341
|
+
for (const callback of listeners[key]) callback(event);
|
|
342
|
+
}
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
const channels = {
|
|
346
|
+
state: createChannel("state", "agents:state"),
|
|
347
|
+
rpc: createChannel("rpc", "agents:rpc"),
|
|
348
|
+
message: createChannel("message", "agents:message"),
|
|
349
|
+
chat: createChannel("chat", "agents:chat"),
|
|
350
|
+
transcript: createChannel("transcript", "agents:transcript"),
|
|
351
|
+
fiber: createChannel("fiber", "agents:fiber"),
|
|
352
|
+
agentTool: createChannel("agentTool", "agents:agent_tool"),
|
|
353
|
+
schedule: createChannel("schedule", "agents:schedule"),
|
|
354
|
+
lifecycle: createChannel("lifecycle", "agents:lifecycle"),
|
|
355
|
+
workflow: createChannel("workflow", "agents:workflow"),
|
|
356
|
+
mcp: createChannel("mcp", "agents:mcp"),
|
|
357
|
+
email: createChannel("email", "agents:email")
|
|
358
|
+
};
|
|
359
|
+
function getChannel(type) {
|
|
360
|
+
if (type.startsWith("mcp:")) return channels.mcp;
|
|
361
|
+
if (type.startsWith("workflow:")) return channels.workflow;
|
|
362
|
+
if (type.startsWith("fiber:")) return channels.fiber;
|
|
363
|
+
if (type.startsWith("transcript:") || type.startsWith("chat:transcript:")) return channels.transcript;
|
|
364
|
+
if (type.startsWith("chat:")) return channels.chat;
|
|
365
|
+
if (type.startsWith("agent_tool:")) return channels.agentTool;
|
|
366
|
+
if (type.startsWith("schedule:") || type.startsWith("queue:")) return channels.schedule;
|
|
367
|
+
if (type.startsWith("message:") || type.startsWith("tool:") || type.startsWith("submission:")) return channels.message;
|
|
368
|
+
if (type === "rpc" || type.startsWith("rpc:")) return channels.rpc;
|
|
369
|
+
if (type.startsWith("state:")) return channels.state;
|
|
370
|
+
if (type.startsWith("email:")) return channels.email;
|
|
371
|
+
return channels.lifecycle;
|
|
372
|
+
}
|
|
373
|
+
const genericObservability = { emit(event) {
|
|
374
|
+
getChannel(event.type).publish(event);
|
|
375
|
+
} };
|
|
376
|
+
function subscribe(channelKey, callback) {
|
|
377
|
+
const bucket = listeners[channelKey];
|
|
378
|
+
bucket.add(callback);
|
|
379
|
+
return () => {
|
|
380
|
+
bucket.delete(callback);
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
//#endregion
|
|
385
|
+
export { OtelObservability, channels, createOtelObservability, createOtelObservabilityFromEnv, genericObservability, subscribe };
|
|
297
386
|
//# sourceMappingURL=agents.js.map
|