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.
Files changed (73) hide show
  1. package/dist/agents.d.ts +626 -123
  2. package/dist/agents.d.ts.map +1 -1
  3. package/dist/agents.js +260 -171
  4. package/dist/agents.js.map +1 -1
  5. package/package.json +8 -4
  6. package/src/actors/alarms.ts +0 -225
  7. package/src/actors/index.ts +0 -36
  8. package/src/actors/instrument-actor.test.ts +0 -179
  9. package/src/actors/instrument-actor.ts +0 -574
  10. package/src/actors/sockets.ts +0 -217
  11. package/src/actors/storage.ts +0 -263
  12. package/src/actors/traced-handler.ts +0 -300
  13. package/src/actors/types.ts +0 -98
  14. package/src/actors.ts +0 -50
  15. package/src/agents/index.ts +0 -42
  16. package/src/agents/otel-observability.test.ts +0 -336
  17. package/src/agents/otel-observability.ts +0 -474
  18. package/src/agents/types.ts +0 -167
  19. package/src/agents.ts +0 -76
  20. package/src/bindings/ai.test.ts +0 -170
  21. package/src/bindings/ai.ts +0 -73
  22. package/src/bindings/analytics-engine.test.ts +0 -175
  23. package/src/bindings/analytics-engine.ts +0 -78
  24. package/src/bindings/bindings-cache.test.ts +0 -80
  25. package/src/bindings/bindings-detection.test.ts +0 -235
  26. package/src/bindings/bindings-this-binding.test.ts +0 -294
  27. package/src/bindings/bindings.ts +0 -720
  28. package/src/bindings/browser-rendering.test.ts +0 -160
  29. package/src/bindings/browser-rendering.ts +0 -70
  30. package/src/bindings/common.ts +0 -84
  31. package/src/bindings/hyperdrive.test.ts +0 -176
  32. package/src/bindings/hyperdrive.ts +0 -74
  33. package/src/bindings/images.test.ts +0 -262
  34. package/src/bindings/images.ts +0 -182
  35. package/src/bindings/index.ts +0 -20
  36. package/src/bindings/queue-producer.test.ts +0 -224
  37. package/src/bindings/queue-producer.ts +0 -105
  38. package/src/bindings/rate-limiter.test.ts +0 -140
  39. package/src/bindings/rate-limiter.ts +0 -69
  40. package/src/bindings/vectorize.test.ts +0 -362
  41. package/src/bindings/vectorize.ts +0 -86
  42. package/src/bindings.ts +0 -6
  43. package/src/events.ts +0 -6
  44. package/src/execution-logger.test.ts +0 -127
  45. package/src/execution-logger.ts +0 -112
  46. package/src/global/cache.test.ts +0 -292
  47. package/src/global/cache.ts +0 -164
  48. package/src/global/fetch.test.ts +0 -399
  49. package/src/global/fetch.ts +0 -136
  50. package/src/global/index.ts +0 -7
  51. package/src/handlers/durable-objects.test.ts +0 -524
  52. package/src/handlers/durable-objects.ts +0 -250
  53. package/src/handlers/index.ts +0 -6
  54. package/src/handlers/workflows.test.ts +0 -411
  55. package/src/handlers/workflows.ts +0 -345
  56. package/src/handlers.ts +0 -6
  57. package/src/index.ts +0 -91
  58. package/src/logger.ts +0 -15
  59. package/src/native/native-tracing.test.ts +0 -54
  60. package/src/native/native-tracing.ts +0 -83
  61. package/src/native.ts +0 -12
  62. package/src/parse-error.ts +0 -1
  63. package/src/sampling.ts +0 -6
  64. package/src/testing.ts +0 -6
  65. package/src/wrappers/cf-attributes.test.ts +0 -334
  66. package/src/wrappers/define-worker-fetch.test.ts +0 -102
  67. package/src/wrappers/define-worker-fetch.ts +0 -71
  68. package/src/wrappers/index.ts +0 -13
  69. package/src/wrappers/instrument.integration.test.ts +0 -578
  70. package/src/wrappers/instrument.ts +0 -806
  71. package/src/wrappers/native-instrument.test.ts +0 -153
  72. package/src/wrappers/wrap-do.ts +0 -34
  73. package/src/wrappers/wrap-module.ts +0 -37
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","names":[],"sources":["../src/agents/types.ts","../src/agents/otel-observability.ts"],"mappings":";;;;;;;UAUiB,cAAA,mCAEC,MAAA,oBAA0B,MAAA;EAE1C,IAAA,EAAM,CAAA;EAMG;EAJT,EAAA;EAIyB;EAFzB,cAAA;EAPA;EASA,OAAA,EAAS,OAAA,GAAU,MAAA;EARH;EAUhB,SAAA;AAAA;;;;KAMU,uBAAA,GACR,cAAA,iBAA+B,MAAA,qBAC/B,cAAA;EAGI,MAAA;EACA,SAAA;AAAA,KAGJ,cAAA,yCAAuD,MAAA,qBACvD,cAAA,oBACA,cAAA;EAGI,QAAA;EACA,EAAA;AAAA,KAGJ,cAAA,cACA,cAAA;EAGI,YAAA;AAAA;;;;KAOI,qBAAA,GACR,cAAA;EAA0C,QAAA;AAAA,KAC1C,cAAA;EAEI,GAAA;EAAa,SAAA;EAAmB,KAAA;EAAe,KAAA;AAAA,KAEnD,cAAA;EAGI,QAAA;EACA,OAAA;EACA,QAAA;AAAA,KAGJ,cAAA,wBAAsC,MAAA;;;;KAK9B,kBAAA,GAAqB,uBAAA,GAA0B,qBAAqB;;;;UAK/D,aAAA;EAlCb;;;AAGgB;AAOpB;EA8BE,IAAA,CAAK,KAAA,EAAO,kBAAA,EAAoB,GAAA,GAAM,kBAAkB;AAAA;;;;UAMzC,2BAAA;EAtBb;;;;EA2BF,QAAA;EAvCE;;;;EA6CF,aAAA;EAzCE;;;;EA+CF,QAAA;EAvCwC;;AAAM;AAKhD;EAwCE,iBAAA;;;AAxC8E;AAKhF;EAyCE,aAAA;;;;;EAMA,cAAA;EAzCsC;;;EA8CtC,kBAAA,IAAsB,KAAA,EAAO,kBAAA,KAAuB,UAAA;EAxCrC;;;EA6Cf,iBAAA,IAAqB,KAAA,EAAO,kBAAA;AAAA;;;;KAMlB,uBAAA,GAA0B,mBAAA;EAxCpC;;;EA4CA,MAAA,GAAS,2BAA2B;AAAA;;;;UAMrB,mBAAA;EACf,kBAAA;EACA,gBAAA;EACA,kBAAA;EACA,qBAAA;EACA,yBAAA;EACA,mBAAA;EACA,qBAAA;EACA,qBAAA;EACA,eAAA;EACA,qBAAA;EACA,iBAAA;AAAA;;;;;AA/IS;AAMX;;;cCwSa,iBAAA,YAA6B,aAAA;EAAA,QAChC,MAAA;EAAA,QACA,OAAA;EAAA,QACA,WAAA;cAEI,MAAA,EAAQ,uBAAA;EDnSlB;;;EAAA,QC6SM,UAAA;EDpSQ;;;;;EC+ShB,IAAA,CAAK,KAAA,EAAO,kBAAA,EAAoB,GAAA,GAAM,kBAAA;AAAA;;;;;;;;;;;AD5SpB;AAOpB;;;;;iBC0WgB,uBAAA,CAAwB,MAAA,EAAQ,uBAAA,GAA0B,iBAAiB;;;;;;;;;;;;;;;;;;;AD5V3C;AAKhD;iBC+WgB,8BAAA,CACd,GAAA,EAAK,MAAA,mBACL,OAAA,GAAU,2BAAA,GACT,iBAAA"}
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
- * Get default span name for an event
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": return `agent.rpc ${event.payload.method}`;
64
- case "schedule:create": return `agent.schedule.create ${event.payload.callback}`;
65
- case "schedule:execute": return `agent.schedule.execute ${event.payload.callback}`;
66
- case "schedule:cancel": return `agent.schedule.cancel ${event.payload.callback}`;
67
- case "connect": return `agent.connect`;
68
- case "destroy": return `agent.destroy`;
69
- case "state:update": return `agent.state.update`;
70
- case "message:request": return `agent.message.request`;
71
- case "message:response": return `agent.message.response`;
72
- case "message:clear": return `agent.message.clear`;
73
- case "mcp:client:preconnect": return `mcp.preconnect ${event.payload.serverId}`;
74
- case "mcp:client:connect": return `mcp.connect ${event.payload.url}`;
75
- case "mcp:client:authorize": return `mcp.authorize ${event.payload.serverId}`;
76
- case "mcp:client:discover": return `mcp.discover`;
77
- default: return `agent.${event.type}`;
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
- * Get default attributes for an event
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
- "agent.event.type": event.type,
86
- "agent.event.id": event.id
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
- if (event.payload.streaming !== void 0) attrs["agent.rpc.streaming"] = event.payload.streaming;
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
- attrs["agent.schedule.callback"] = event.payload.callback;
97
- attrs["agent.schedule.id"] = event.payload.id;
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
- attrs["agent.connection.id"] = event.payload.connectionId;
168
+ case "disconnect":
169
+ setIfPresent(attrs, "agent.connection.id", event.payload.connectionId);
101
170
  break;
102
171
  case "mcp:client:preconnect":
103
- attrs["agent.mcp.server_id"] = event.payload.serverId;
172
+ setIfPresent(attrs, "agent.mcp.server_id", event.payload.serverId);
104
173
  break;
105
174
  case "mcp:client:connect":
106
- attrs["agent.mcp.url"] = event.payload.url;
107
- attrs["agent.mcp.transport"] = event.payload.transport;
108
- attrs["agent.mcp.state"] = event.payload.state;
109
- if (event.payload.error) attrs["agent.mcp.error"] = event.payload.error;
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["agent.mcp.server_id"] = event.payload.serverId;
113
- attrs["agent.mcp.auth_url"] = event.payload.authUrl;
114
- if (event.payload.clientId) attrs["agent.mcp.client_id"] = event.payload.clientId;
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)) if (attrs[`agent.${key}`] === void 0 && (typeof value === "string" || typeof value === "number" || typeof value === "boolean")) attrs[`agent.payload.${key}`] = value;
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": return SpanKind.SERVER;
126
- case "connect": return SpanKind.SERVER;
127
- case "mcp:client:connect":
128
- case "mcp:client:preconnect":
129
- case "mcp:client:authorize":
130
- case "mcp:client:discover": return SpanKind.CLIENT;
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
- * Check if an event type should be traced based on options
136
- */
137
- function shouldTraceEvent(event, options) {
138
- const opts = {
139
- traceRpc: true,
140
- traceSchedule: true,
141
- traceMcp: true,
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
- if (ctx && "scheduler" in ctx) {
172
- const ctxWithScheduler = ctx;
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
- span.setStatus({ code: SpanStatusCode.OK });
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") ctx.waitUntil(exportSpans(traceId, ctx));
231
- else exportSpans(traceId, ctx);
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
- export { OtelObservability, createOtelObservability, createOtelObservabilityFromEnv };
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