@introspection-sdk/introspection-node 0.4.2 → 0.4.3

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 (151) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-check-types.log +4 -0
  3. package/.turbo/turbo-lint.log +5 -0
  4. package/dist/client.d.ts +42 -132
  5. package/dist/client.d.ts.map +1 -1
  6. package/dist/client.js +67 -366
  7. package/dist/client.js.map +1 -0
  8. package/dist/converters/claude.d.ts +4 -0
  9. package/dist/converters/claude.d.ts.map +1 -1
  10. package/dist/converters/claude.js +7 -0
  11. package/dist/converters/claude.js.map +1 -0
  12. package/dist/converters/gemini.d.ts +90 -0
  13. package/dist/converters/gemini.d.ts.map +1 -0
  14. package/dist/converters/gemini.js +171 -0
  15. package/dist/converters/gemini.js.map +1 -0
  16. package/dist/converters/index.d.ts +1 -1
  17. package/dist/converters/index.d.ts.map +1 -1
  18. package/dist/converters/index.js +2 -1
  19. package/dist/converters/index.js.map +1 -0
  20. package/dist/converters/openai.js +1 -0
  21. package/dist/converters/openai.js.map +1 -0
  22. package/dist/converters/openclaw.d.ts +16 -0
  23. package/dist/converters/openclaw.d.ts.map +1 -0
  24. package/dist/converters/openclaw.js +49 -0
  25. package/dist/converters/openinference.js +1 -0
  26. package/dist/converters/openinference.js.map +1 -0
  27. package/dist/converters/vercel.d.ts.map +1 -1
  28. package/dist/converters/vercel.js +31 -3
  29. package/dist/converters/vercel.js.map +1 -0
  30. package/dist/http.d.ts +36 -0
  31. package/dist/http.d.ts.map +1 -0
  32. package/dist/http.js +145 -0
  33. package/dist/http.js.map +1 -0
  34. package/dist/index.d.ts +24 -27
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +22 -32
  37. package/dist/index.js.map +1 -0
  38. package/dist/otel/anthropic.d.ts +62 -0
  39. package/dist/otel/anthropic.d.ts.map +1 -0
  40. package/dist/otel/anthropic.js +425 -0
  41. package/dist/otel/anthropic.js.map +1 -0
  42. package/dist/otel/claude-hooks.d.ts +346 -0
  43. package/dist/otel/claude-hooks.d.ts.map +1 -0
  44. package/dist/otel/claude-hooks.js +645 -0
  45. package/dist/otel/claude-hooks.js.map +1 -0
  46. package/dist/otel/claude-wrapper.d.ts +93 -0
  47. package/dist/otel/claude-wrapper.d.ts.map +1 -0
  48. package/dist/otel/claude-wrapper.js +155 -0
  49. package/dist/otel/claude-wrapper.js.map +1 -0
  50. package/dist/otel/gemini.d.ts +48 -0
  51. package/dist/otel/gemini.d.ts.map +1 -0
  52. package/dist/otel/gemini.js +297 -0
  53. package/dist/otel/gemini.js.map +1 -0
  54. package/dist/otel/index.d.ts +27 -0
  55. package/dist/otel/index.d.ts.map +1 -0
  56. package/dist/otel/index.js +33 -0
  57. package/dist/otel/index.js.map +1 -0
  58. package/dist/otel/langchain-handler.d.ts +112 -0
  59. package/dist/otel/langchain-handler.d.ts.map +1 -0
  60. package/dist/otel/langchain-handler.js +555 -0
  61. package/dist/otel/langchain-handler.js.map +1 -0
  62. package/dist/otel/logs.d.ts +82 -0
  63. package/dist/otel/logs.d.ts.map +1 -0
  64. package/dist/otel/logs.js +271 -0
  65. package/dist/otel/logs.js.map +1 -0
  66. package/dist/otel/mastra-exporter.d.ts +87 -0
  67. package/dist/otel/mastra-exporter.d.ts.map +1 -0
  68. package/dist/otel/mastra-exporter.js +525 -0
  69. package/dist/otel/mastra-exporter.js.map +1 -0
  70. package/dist/otel/pi.d.ts +59 -0
  71. package/dist/otel/pi.d.ts.map +1 -0
  72. package/dist/otel/pi.js +67 -0
  73. package/dist/otel/pi.js.map +1 -0
  74. package/dist/otel/setup.d.ts +23 -0
  75. package/dist/otel/setup.d.ts.map +1 -0
  76. package/dist/otel/setup.js +127 -0
  77. package/dist/otel/setup.js.map +1 -0
  78. package/dist/otel/span-processor.d.ts +62 -0
  79. package/dist/otel/span-processor.d.ts.map +1 -0
  80. package/dist/otel/span-processor.js +319 -0
  81. package/dist/otel/span-processor.js.map +1 -0
  82. package/dist/otel/tracing-processor.d.ts +139 -0
  83. package/dist/otel/tracing-processor.d.ts.map +1 -0
  84. package/dist/otel/tracing-processor.js +418 -0
  85. package/dist/otel/tracing-processor.js.map +1 -0
  86. package/dist/resources/experiments.d.ts +31 -0
  87. package/dist/resources/experiments.d.ts.map +1 -0
  88. package/dist/resources/experiments.js +133 -0
  89. package/dist/resources/experiments.js.map +1 -0
  90. package/dist/resources/recipes.d.ts +22 -0
  91. package/dist/resources/recipes.d.ts.map +1 -0
  92. package/dist/resources/recipes.js +61 -0
  93. package/dist/resources/recipes.js.map +1 -0
  94. package/dist/resources/runtimes.d.ts +76 -0
  95. package/dist/resources/runtimes.d.ts.map +1 -0
  96. package/dist/resources/runtimes.js +179 -0
  97. package/dist/resources/runtimes.js.map +1 -0
  98. package/dist/runner-resources/files.d.ts +35 -0
  99. package/dist/runner-resources/files.d.ts.map +1 -0
  100. package/dist/runner-resources/files.js +131 -0
  101. package/dist/runner-resources/files.js.map +1 -0
  102. package/dist/runner-resources/tasks.d.ts +39 -0
  103. package/dist/runner-resources/tasks.d.ts.map +1 -0
  104. package/dist/runner-resources/tasks.js +129 -0
  105. package/dist/runner-resources/tasks.js.map +1 -0
  106. package/dist/runner.d.ts +80 -0
  107. package/dist/runner.d.ts.map +1 -0
  108. package/dist/runner.js +159 -0
  109. package/dist/runner.js.map +1 -0
  110. package/dist/streaming.d.ts +8 -0
  111. package/dist/streaming.d.ts.map +1 -0
  112. package/dist/streaming.js +67 -0
  113. package/dist/streaming.js.map +1 -0
  114. package/dist/types/genai.d.ts +165 -0
  115. package/dist/types/genai.d.ts.map +1 -0
  116. package/dist/types/genai.js +82 -0
  117. package/dist/types.js +1 -0
  118. package/dist/types.js.map +1 -0
  119. package/dist/utils.js +1 -0
  120. package/dist/utils.js.map +1 -0
  121. package/dist/version.js +1 -0
  122. package/dist/version.js.map +1 -0
  123. package/package.json +81 -24
  124. package/src/client.ts +76 -473
  125. package/src/converters/claude.ts +10 -0
  126. package/src/converters/gemini.ts +243 -0
  127. package/src/converters/index.ts +13 -7
  128. package/src/converters/vercel.ts +41 -3
  129. package/src/http.ts +163 -0
  130. package/src/index.ts +110 -75
  131. package/src/{anthropic.ts → otel/anthropic.ts} +95 -8
  132. package/src/{claude-hooks.ts → otel/claude-hooks.ts} +119 -20
  133. package/src/{claude-wrapper.ts → otel/claude-wrapper.ts} +1 -1
  134. package/src/otel/gemini.ts +397 -0
  135. package/src/otel/index.ts +80 -0
  136. package/src/{langchain-handler.ts → otel/langchain-handler.ts} +53 -6
  137. package/src/otel/logs.ts +394 -0
  138. package/src/{mastra-exporter.ts → otel/mastra-exporter.ts} +83 -22
  139. package/src/otel/pi.ts +88 -0
  140. package/src/otel/setup.ts +174 -0
  141. package/src/{span-processor.ts → otel/span-processor.ts} +11 -6
  142. package/src/{tracing-processor.ts → otel/tracing-processor.ts} +94 -19
  143. package/src/resources/experiments.ts +170 -0
  144. package/src/resources/recipes.ts +73 -0
  145. package/src/resources/runtimes.ts +231 -0
  146. package/src/runner-resources/files.ts +163 -0
  147. package/src/runner-resources/tasks.ts +156 -0
  148. package/src/runner.ts +194 -0
  149. package/src/streaming.ts +57 -0
  150. package/src/ai-sdk-integration.ts +0 -691
  151. package/src/converters/ai-sdk.ts +0 -323
@@ -0,0 +1,645 @@
1
+ /**
2
+ * Claude Agent SDK Instrumentation Hooks
3
+ *
4
+ * Provides OpenTelemetry instrumentation for the Claude Agent SDK via its hooks system.
5
+ * Creates spans for sessions, tool uses, and subagent executions with gen_ai.* attributes.
6
+ *
7
+ * @see https://platform.claude.com/docs/en/agent-sdk/typescript
8
+ */
9
+ import { context as otelContext, propagation, trace as otelTrace, SpanKind, SpanStatusCode, } from "@opentelemetry/api";
10
+ import { BasicTracerProvider, BatchSpanProcessor, SimpleSpanProcessor, } from "@opentelemetry/sdk-trace-base";
11
+ import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";
12
+ import { resourceFromAttributes, defaultResource, } from "@opentelemetry/resources";
13
+ import { ATTR_SERVICE_NAME } from "@opentelemetry/semantic-conventions";
14
+ import { logger, withOtlpHttpsProxy } from "../utils.js";
15
+ import { VERSION } from "../version.js";
16
+ import { convertClaudeSessionToOtelAttributes, } from "../converters/claude.js";
17
+ /**
18
+ * Provides instrumented hooks for Claude Agent SDK.
19
+ *
20
+ * Creates OpenTelemetry spans with gen_ai.* semantic convention attributes:
21
+ * - Session spans: gen_ai.system, gen_ai.request.model
22
+ * - Tool spans: gen_ai.tool.name, gen_ai.tool.input, gen_ai.tool.output
23
+ * - Subagent spans: gen_ai.agent.name
24
+ *
25
+ * Usage tracking is captured from streamed messages via recordUsage().
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * import { query } from "@anthropic-ai/claude-agent-sdk";
30
+ * import { IntrospectionClaudeHooks } from "@introspection-sdk/introspection-node";
31
+ *
32
+ * const hooks = new IntrospectionClaudeHooks();
33
+ *
34
+ * const stream = query({
35
+ * prompt: "Hello",
36
+ * options: {
37
+ * hooks: hooks.getHooks(),
38
+ * },
39
+ * });
40
+ *
41
+ * for await (const message of stream) {
42
+ * hooks.recordUsage(message);
43
+ * // handle message...
44
+ * }
45
+ *
46
+ * await hooks.shutdown();
47
+ * ```
48
+ */
49
+ export class IntrospectionClaudeHooks {
50
+ _tracerProvider;
51
+ _tracer;
52
+ _agentName;
53
+ _agentId;
54
+ _conversationId;
55
+ _sessionSpans = new Map();
56
+ _toolSpans = new Map();
57
+ _subagentSpans = new Map();
58
+ _sessionUsage = new Map();
59
+ constructor(options = {}) {
60
+ const advanced = options.advanced;
61
+ const serviceName = options.serviceName || "claude-agent";
62
+ this._agentName = options.agentName || serviceName;
63
+ this._agentId = options.agentId;
64
+ this._conversationId = options.conversationId;
65
+ const resource = defaultResource().merge(resourceFromAttributes({ [ATTR_SERVICE_NAME]: serviceName }));
66
+ if (!advanced?.spanExporter) {
67
+ const token = options.token || process.env.INTROSPECTION_TOKEN;
68
+ if (!token) {
69
+ throw new Error("INTROSPECTION_TOKEN is required");
70
+ }
71
+ const baseUrl = options.baseUrl ||
72
+ process.env.INTROSPECTION_BASE_OTEL_URL ||
73
+ "https://otel.introspection.dev";
74
+ const headers = {
75
+ "User-Agent": `introspection-sdk/${VERSION}`,
76
+ Authorization: `Bearer ${token}`,
77
+ ...options.additionalHeaders,
78
+ };
79
+ const endpoint = baseUrl.endsWith("/v1/traces")
80
+ ? baseUrl
81
+ : `${baseUrl.replace(/\/$/, "")}/v1/traces`;
82
+ logger.info(`IntrospectionClaudeHooks initialized: service=${serviceName}, endpoint=${endpoint}`);
83
+ const spanExporter = new OTLPTraceExporter(withOtlpHttpsProxy({
84
+ url: endpoint,
85
+ headers,
86
+ }));
87
+ // Default to sequential export for dev/staging tokens.
88
+ const useSimple = advanced?.useSimpleSpanProcessor ||
89
+ token.startsWith("intro_dev") ||
90
+ token.startsWith("intro_staging");
91
+ const spanProcessor = useSimple
92
+ ? new SimpleSpanProcessor(spanExporter)
93
+ : new BatchSpanProcessor(spanExporter, { scheduledDelayMillis: 1000 });
94
+ this._tracerProvider = new BasicTracerProvider({
95
+ resource,
96
+ idGenerator: advanced?.idGenerator,
97
+ spanProcessors: [spanProcessor],
98
+ });
99
+ }
100
+ else {
101
+ logger.info(`IntrospectionClaudeHooks initialized in test mode with custom exporter`);
102
+ const spanProcessor = advanced.useSimpleSpanProcessor
103
+ ? new SimpleSpanProcessor(advanced.spanExporter)
104
+ : new BatchSpanProcessor(advanced.spanExporter, {
105
+ scheduledDelayMillis: 100,
106
+ });
107
+ this._tracerProvider = new BasicTracerProvider({
108
+ resource,
109
+ idGenerator: advanced.idGenerator,
110
+ spanProcessors: [spanProcessor],
111
+ });
112
+ }
113
+ this._tracer = this._tracerProvider.getTracer("claude-agent-sdk", VERSION);
114
+ }
115
+ /**
116
+ * Build the hooks configuration object to pass to Claude Agent SDK
117
+ * `query()` options.
118
+ *
119
+ * @returns A {@link ClaudeHooksConfig} wired to this instance's tracing.
120
+ */
121
+ getHooks() {
122
+ return {
123
+ SessionStart: [
124
+ {
125
+ hooks: [this._onSessionStart.bind(this)],
126
+ },
127
+ ],
128
+ SessionEnd: [
129
+ {
130
+ hooks: [this._onSessionEnd.bind(this)],
131
+ },
132
+ ],
133
+ PreToolUse: [
134
+ {
135
+ hooks: [this._onPreToolUse.bind(this)],
136
+ },
137
+ ],
138
+ PostToolUse: [
139
+ {
140
+ hooks: [this._onPostToolUse.bind(this)],
141
+ },
142
+ ],
143
+ SubagentStart: [
144
+ {
145
+ hooks: [this._onSubagentStart.bind(this)],
146
+ },
147
+ ],
148
+ SubagentStop: [
149
+ {
150
+ hooks: [this._onSubagentStop.bind(this)],
151
+ },
152
+ ],
153
+ };
154
+ }
155
+ /**
156
+ * Resolve effective agent / conversation identity for a session, in order
157
+ * of precedence: OTel baggage on the active context > constructor option >
158
+ * the Claude session ID. Lets callers override identity per-invocation via
159
+ * `IntrospectionClient.withAgent()` / `.withConversation()` without
160
+ * having to construct a new hooks instance per call.
161
+ *
162
+ * Requires an active context manager — see {@link setupTracing}.
163
+ */
164
+ _resolveIdentity(sessionId) {
165
+ const baggage = propagation.getBaggage(otelContext.active());
166
+ const baggageAgentName = baggage?.getEntry("gen_ai.agent.name")?.value;
167
+ const baggageAgentId = baggage?.getEntry("gen_ai.agent.id")?.value;
168
+ const baggageConvId = baggage?.getEntry("gen_ai.conversation.id")?.value;
169
+ return {
170
+ agentName: baggageAgentName || this._agentName,
171
+ agentId: baggageAgentId || this._agentId,
172
+ conversationId: baggageConvId || this._conversationId || sessionId,
173
+ };
174
+ }
175
+ /**
176
+ * Set the input prompt for a session so it appears as
177
+ * `gen_ai.input.messages` on the session span.
178
+ *
179
+ * If `sessionId` is not provided the prompt is buffered and associated
180
+ * with the next session that starts via an `init` message.
181
+ *
182
+ * @param prompt - The user prompt string passed to `query()`.
183
+ * @param sessionId - Optional session ID if already known.
184
+ */
185
+ setInputPrompt(prompt, sessionId) {
186
+ if (sessionId) {
187
+ const existing = this._sessionUsage.get(sessionId) || {
188
+ input: 0,
189
+ output: 0,
190
+ cacheRead: 0,
191
+ cacheCreation: 0,
192
+ };
193
+ existing.inputPrompt = prompt;
194
+ this._sessionUsage.set(sessionId, existing);
195
+ }
196
+ else {
197
+ // Store for when session starts
198
+ this._pendingInputPrompt = prompt;
199
+ }
200
+ }
201
+ _pendingInputPrompt;
202
+ /**
203
+ * Set system instructions for a session so they appear as
204
+ * `gen_ai.system_instructions` on the session span.
205
+ *
206
+ * If `sessionId` is not provided the value is buffered and associated
207
+ * with the next session that starts via an `init` message.
208
+ *
209
+ * @param instructions - The system prompt / instructions string.
210
+ * @param sessionId - Optional session ID if already known.
211
+ */
212
+ setSystemInstructions(instructions, sessionId) {
213
+ if (sessionId) {
214
+ const existing = this._sessionUsage.get(sessionId) || {
215
+ input: 0,
216
+ output: 0,
217
+ cacheRead: 0,
218
+ cacheCreation: 0,
219
+ };
220
+ existing.systemInstructions = instructions;
221
+ this._sessionUsage.set(sessionId, existing);
222
+ }
223
+ else {
224
+ this._pendingSystemInstructions = instructions;
225
+ }
226
+ logger.info(`System instructions set (${instructions.length} chars)${sessionId ? ` for session ${sessionId}` : " (pending)"}`);
227
+ }
228
+ _pendingSystemInstructions;
229
+ /**
230
+ * Record usage from a streamed SDK message.
231
+ *
232
+ * Call this for **every** message yielded by `query()` to capture token
233
+ * usage. Session spans are automatically created on `init` messages and
234
+ * ended on `result` messages.
235
+ *
236
+ * @param message - A {@link ClaudeSDKMessage} yielded by the `query()` stream.
237
+ */
238
+ recordUsage(message) {
239
+ const sessionId = message.session_id || "default";
240
+ const msg = message;
241
+ // Handle system init message - start session span
242
+ if (message.type === "system" && msg.subtype === "init") {
243
+ this._startSessionFromMessage(sessionId, msg);
244
+ return;
245
+ }
246
+ if (message.type === "assistant") {
247
+ const assistantMsg = message;
248
+ const existing = this._sessionUsage.get(sessionId) || {
249
+ input: 0,
250
+ output: 0,
251
+ cacheRead: 0,
252
+ cacheCreation: 0,
253
+ };
254
+ // Track usage
255
+ const usage = assistantMsg.message?.usage;
256
+ if (usage) {
257
+ existing.input += usage.input_tokens || 0;
258
+ existing.output += usage.output_tokens || 0;
259
+ existing.cacheRead += usage.cache_read_input_tokens || 0;
260
+ existing.cacheCreation += usage.cache_creation_input_tokens || 0;
261
+ if (assistantMsg.message?.model) {
262
+ existing.model = assistantMsg.message.model;
263
+ }
264
+ logger.debug(`Recorded usage for session ${sessionId}: +${usage.input_tokens || 0} input, +${usage.output_tokens || 0} output`);
265
+ }
266
+ // Capture response ID from assistant message
267
+ if (assistantMsg.message?.id) {
268
+ existing.responseId = assistantMsg.message.id;
269
+ }
270
+ // Extract response content from assistant message
271
+ const content = assistantMsg.message?.content;
272
+ if (content && Array.isArray(content)) {
273
+ // Store content blocks for proper conversion
274
+ existing.responseBlocks = [
275
+ ...(existing.responseBlocks || []),
276
+ ...content,
277
+ ];
278
+ // Also extract text for backwards compatibility
279
+ const textContent = content
280
+ .filter((block) => block.type === "text" && block.text)
281
+ .map((block) => block.text)
282
+ .join("");
283
+ if (textContent) {
284
+ existing.responseContent =
285
+ (existing.responseContent || "") + textContent;
286
+ }
287
+ }
288
+ this._sessionUsage.set(sessionId, existing);
289
+ }
290
+ else if (message.type === "result") {
291
+ const resultMsg = message;
292
+ const existing = this._sessionUsage.get(sessionId) || {
293
+ input: 0,
294
+ output: 0,
295
+ cacheRead: 0,
296
+ cacheCreation: 0,
297
+ };
298
+ if (resultMsg.usage) {
299
+ // Result message has final totals
300
+ existing.input = resultMsg.usage.input_tokens || existing.input;
301
+ existing.output = resultMsg.usage.output_tokens || existing.output;
302
+ if (resultMsg.usage.cache_read_input_tokens != null) {
303
+ existing.cacheRead = resultMsg.usage.cache_read_input_tokens;
304
+ }
305
+ if (resultMsg.usage.cache_creation_input_tokens != null) {
306
+ existing.cacheCreation = resultMsg.usage.cache_creation_input_tokens;
307
+ }
308
+ }
309
+ // Fallback: aggregate cache tokens from per-model breakdown when top-level usage omits them
310
+ if (resultMsg.modelUsage &&
311
+ existing.cacheRead === 0 &&
312
+ existing.cacheCreation === 0) {
313
+ for (const modelData of Object.values(resultMsg.modelUsage)) {
314
+ existing.cacheRead += modelData.cacheReadInputTokens || 0;
315
+ existing.cacheCreation += modelData.cacheCreationInputTokens || 0;
316
+ }
317
+ }
318
+ if (resultMsg.total_cost_usd !== undefined) {
319
+ existing.cost = resultMsg.total_cost_usd;
320
+ }
321
+ // Capture stop reason from result subtype
322
+ const subtype = msg.subtype;
323
+ if (subtype) {
324
+ existing.stopReason = subtype;
325
+ }
326
+ this._sessionUsage.set(sessionId, existing);
327
+ logger.debug(`Recorded final usage for session ${sessionId}: ${existing.input} input, ${existing.output} output, $${existing.cost || 0}`);
328
+ // End session span on result message
329
+ this._endSessionFromMessage(sessionId, msg);
330
+ }
331
+ }
332
+ /**
333
+ * Start a session span from an init system message.
334
+ * This provides an alternative to the SessionStart hook which has timing issues.
335
+ */
336
+ _startSessionFromMessage(sessionId, msg) {
337
+ // Don't create duplicate spans if hook already created one
338
+ if (this._sessionSpans.has(sessionId)) {
339
+ logger.debug(`Session span already exists for ${sessionId}, skipping`);
340
+ return;
341
+ }
342
+ logger.debug(`Starting session span from init message: ${sessionId}`);
343
+ const ids = this._resolveIdentity(sessionId);
344
+ const attrs = {
345
+ "gen_ai.system": "anthropic",
346
+ "gen_ai.operation.name": "chat",
347
+ "gen_ai.agent.name": ids.agentName,
348
+ "gen_ai.conversation.id": ids.conversationId,
349
+ "claude.session_id": sessionId,
350
+ "claude.source": "message",
351
+ };
352
+ if (ids.agentId) {
353
+ attrs["gen_ai.agent.id"] = ids.agentId;
354
+ }
355
+ const span = this._tracer.startSpan("claude.session", {
356
+ kind: SpanKind.CLIENT,
357
+ attributes: attrs,
358
+ });
359
+ // Add model if present in init message
360
+ const model = msg.model;
361
+ if (model) {
362
+ span.setAttribute("gen_ai.request.model", model);
363
+ }
364
+ // Add tools if present
365
+ const tools = msg.tools;
366
+ if (tools && tools.length > 0) {
367
+ span.setAttribute("claude.tools", tools.join(","));
368
+ span.setAttribute("gen_ai.tool.definitions", JSON.stringify(tools.map((name) => ({ name }))));
369
+ }
370
+ this._sessionSpans.set(sessionId, span);
371
+ // Initialize session usage, including any pending input prompt and system instructions
372
+ const sessionData = { input: 0, output: 0, cacheRead: 0, cacheCreation: 0, model };
373
+ if (tools && tools.length > 0) {
374
+ sessionData.toolNames = tools;
375
+ }
376
+ if (this._pendingInputPrompt) {
377
+ sessionData.inputPrompt = this._pendingInputPrompt;
378
+ this._pendingInputPrompt = undefined;
379
+ }
380
+ if (this._pendingSystemInstructions) {
381
+ sessionData.systemInstructions = this._pendingSystemInstructions;
382
+ this._pendingSystemInstructions = undefined;
383
+ }
384
+ this._sessionUsage.set(sessionId, sessionData);
385
+ logger.info(`Created session span for ${sessionId}`);
386
+ }
387
+ /**
388
+ * End a session span from a result message.
389
+ * This provides an alternative to the SessionEnd hook which has timing issues.
390
+ */
391
+ _endSessionFromMessage(sessionId, msg) {
392
+ const span = this._sessionSpans.get(sessionId);
393
+ if (!span) {
394
+ logger.debug(`No session span found for ${sessionId}, nothing to end`);
395
+ return;
396
+ }
397
+ const usage = this._sessionUsage.get(sessionId);
398
+ // Use converter to set GenAI semantic convention attributes
399
+ const otelAttrs = convertClaudeSessionToOtelAttributes({
400
+ sessionId,
401
+ inputPrompt: usage?.inputPrompt,
402
+ responseContent: usage?.responseContent,
403
+ responseBlocks: usage?.responseBlocks,
404
+ model: usage?.model,
405
+ inputTokens: usage?.input,
406
+ outputTokens: usage?.output,
407
+ cacheReadInputTokens: usage?.cacheRead || undefined,
408
+ cacheCreationInputTokens: usage?.cacheCreation || undefined,
409
+ costUsd: usage?.cost,
410
+ stopReason: usage?.stopReason,
411
+ responseId: usage?.responseId,
412
+ toolNames: usage?.toolNames,
413
+ systemInstructions: usage?.systemInstructions,
414
+ });
415
+ // Apply all converted attributes to the span
416
+ for (const [key, value] of Object.entries(otelAttrs)) {
417
+ span.setAttribute(key, value);
418
+ }
419
+ // Set subtype/reason from result message
420
+ const subtype = msg.subtype;
421
+ if (subtype) {
422
+ span.setAttribute("claude.result_subtype", subtype);
423
+ if (subtype === "success") {
424
+ span.setStatus({ code: SpanStatusCode.OK });
425
+ }
426
+ else {
427
+ span.setStatus({
428
+ code: SpanStatusCode.ERROR,
429
+ message: subtype,
430
+ });
431
+ }
432
+ }
433
+ else {
434
+ span.setStatus({ code: SpanStatusCode.OK });
435
+ }
436
+ span.end();
437
+ this._sessionSpans.delete(sessionId);
438
+ this._sessionUsage.delete(sessionId);
439
+ logger.info(`Ended session span for ${sessionId}: ${usage?.input || 0} input, ${usage?.output || 0} output tokens`);
440
+ }
441
+ async _onSessionStart(input, _toolUseID, _options) {
442
+ void _toolUseID;
443
+ void _options;
444
+ const sessionInput = input;
445
+ logger.debug(`SessionStart hook: ${sessionInput.session_id}`);
446
+ // Resolve identity via _resolveIdentity so baggage on the active context
447
+ // takes precedence over constructor defaults, matching the message-init
448
+ // path in _startSessionFromMessage. Without this, the SessionStart hook
449
+ // would always stamp the constructor-time agentName / sessionId even
450
+ // when the caller wrapped the query in withAgent() / withConversation().
451
+ const ids = this._resolveIdentity(sessionInput.session_id);
452
+ const attrs = {
453
+ "gen_ai.system": "anthropic",
454
+ "gen_ai.operation.name": "chat",
455
+ "gen_ai.agent.name": ids.agentName,
456
+ "gen_ai.conversation.id": ids.conversationId,
457
+ "claude.session_id": sessionInput.session_id,
458
+ "claude.source": sessionInput.source,
459
+ };
460
+ if (ids.agentId) {
461
+ attrs["gen_ai.agent.id"] = ids.agentId;
462
+ }
463
+ const span = this._tracer.startSpan("claude.session", {
464
+ kind: SpanKind.CLIENT,
465
+ attributes: attrs,
466
+ });
467
+ if (sessionInput.model) {
468
+ span.setAttribute("gen_ai.request.model", sessionInput.model);
469
+ }
470
+ if (sessionInput.agent_type) {
471
+ span.setAttribute("claude.agent_type", sessionInput.agent_type);
472
+ }
473
+ this._sessionSpans.set(sessionInput.session_id, span);
474
+ // Initialize session usage, consuming any pending prompts/instructions
475
+ const sessionUsage = {
476
+ input: 0,
477
+ output: 0,
478
+ cacheRead: 0,
479
+ cacheCreation: 0,
480
+ };
481
+ if (this._pendingInputPrompt) {
482
+ sessionUsage.inputPrompt = this._pendingInputPrompt;
483
+ this._pendingInputPrompt = undefined;
484
+ }
485
+ if (this._pendingSystemInstructions) {
486
+ sessionUsage.systemInstructions = this._pendingSystemInstructions;
487
+ this._pendingSystemInstructions = undefined;
488
+ }
489
+ this._sessionUsage.set(sessionInput.session_id, sessionUsage);
490
+ return { continue: true };
491
+ }
492
+ async _onSessionEnd(input, _toolUseID, _options) {
493
+ void _toolUseID;
494
+ void _options;
495
+ const sessionInput = input;
496
+ logger.debug(`SessionEnd hook: ${sessionInput.session_id}`);
497
+ const span = this._sessionSpans.get(sessionInput.session_id);
498
+ if (span) {
499
+ const usage = this._sessionUsage.get(sessionInput.session_id);
500
+ if (usage) {
501
+ // Use converter for consistent gen_ai attribute mapping
502
+ const otelAttrs = convertClaudeSessionToOtelAttributes({
503
+ sessionId: sessionInput.session_id,
504
+ inputPrompt: usage.inputPrompt,
505
+ responseContent: usage.responseContent,
506
+ responseBlocks: usage.responseBlocks,
507
+ model: usage.model,
508
+ inputTokens: usage.input,
509
+ outputTokens: usage.output,
510
+ cacheReadInputTokens: usage.cacheRead || undefined,
511
+ cacheCreationInputTokens: usage.cacheCreation || undefined,
512
+ costUsd: usage.cost,
513
+ stopReason: usage.stopReason,
514
+ responseId: usage.responseId,
515
+ toolNames: usage.toolNames,
516
+ systemInstructions: usage.systemInstructions,
517
+ });
518
+ for (const [key, value] of Object.entries(otelAttrs)) {
519
+ span.setAttribute(key, value);
520
+ }
521
+ }
522
+ span.setAttribute("claude.exit_reason", sessionInput.reason);
523
+ span.setStatus({ code: SpanStatusCode.OK });
524
+ span.end();
525
+ this._sessionSpans.delete(sessionInput.session_id);
526
+ this._sessionUsage.delete(sessionInput.session_id);
527
+ logger.debug(`Ended session span for ${sessionInput.session_id}`);
528
+ }
529
+ return { continue: true };
530
+ }
531
+ async _onPreToolUse(input, _toolUseID, _options) {
532
+ void _toolUseID;
533
+ void _options;
534
+ const toolInput = input;
535
+ logger.debug(`PreToolUse: ${toolInput.tool_name} (${toolInput.tool_use_id})`);
536
+ const parentSpan = this._sessionSpans.get(toolInput.session_id);
537
+ const ctx = parentSpan
538
+ ? otelTrace.setSpan(otelContext.active(), parentSpan)
539
+ : undefined;
540
+ const span = this._tracer.startSpan(`tool.${toolInput.tool_name}`, {
541
+ kind: SpanKind.INTERNAL,
542
+ attributes: {
543
+ "gen_ai.tool.name": toolInput.tool_name,
544
+ "claude.session_id": toolInput.session_id,
545
+ "claude.tool_use_id": toolInput.tool_use_id,
546
+ },
547
+ }, ctx);
548
+ if (toolInput.tool_input) {
549
+ try {
550
+ span.setAttribute("gen_ai.tool.input", JSON.stringify(toolInput.tool_input));
551
+ }
552
+ catch {
553
+ span.setAttribute("gen_ai.tool.input", String(toolInput.tool_input));
554
+ }
555
+ }
556
+ this._toolSpans.set(toolInput.tool_use_id, span);
557
+ return { continue: true };
558
+ }
559
+ async _onPostToolUse(input, _toolUseID, _options) {
560
+ void _toolUseID;
561
+ void _options;
562
+ const toolInput = input;
563
+ logger.debug(`PostToolUse: ${toolInput.tool_name} (${toolInput.tool_use_id})`);
564
+ const span = this._toolSpans.get(toolInput.tool_use_id);
565
+ if (span) {
566
+ if (toolInput.tool_response !== undefined) {
567
+ try {
568
+ span.setAttribute("gen_ai.tool.output", JSON.stringify(toolInput.tool_response));
569
+ }
570
+ catch {
571
+ span.setAttribute("gen_ai.tool.output", String(toolInput.tool_response));
572
+ }
573
+ }
574
+ span.setStatus({ code: SpanStatusCode.OK });
575
+ span.end();
576
+ this._toolSpans.delete(toolInput.tool_use_id);
577
+ }
578
+ return { continue: true };
579
+ }
580
+ async _onSubagentStart(input, _toolUseID, _options) {
581
+ void _toolUseID;
582
+ void _options;
583
+ const subagentInput = input;
584
+ logger.debug(`SubagentStart: ${subagentInput.agent_type} (${subagentInput.agent_id})`);
585
+ const parentSpan = this._sessionSpans.get(subagentInput.session_id);
586
+ const ctx = parentSpan
587
+ ? otelTrace.setSpan(otelContext.active(), parentSpan)
588
+ : undefined;
589
+ const span = this._tracer.startSpan(`subagent.${subagentInput.agent_type}`, {
590
+ kind: SpanKind.INTERNAL,
591
+ attributes: {
592
+ "gen_ai.agent.name": subagentInput.agent_type,
593
+ "claude.session_id": subagentInput.session_id,
594
+ "claude.agent_id": subagentInput.agent_id,
595
+ },
596
+ }, ctx);
597
+ this._subagentSpans.set(subagentInput.agent_id, span);
598
+ return { continue: true };
599
+ }
600
+ async _onSubagentStop(input, _toolUseID, _options) {
601
+ void _toolUseID;
602
+ void _options;
603
+ const subagentInput = input;
604
+ logger.debug(`SubagentStop: ${subagentInput.agent_type} (${subagentInput.agent_id})`);
605
+ const span = this._subagentSpans.get(subagentInput.agent_id);
606
+ if (span) {
607
+ span.setStatus({ code: SpanStatusCode.OK });
608
+ span.end();
609
+ this._subagentSpans.delete(subagentInput.agent_id);
610
+ }
611
+ return { continue: true };
612
+ }
613
+ /**
614
+ * Force-flush any buffered spans to the Introspection backend.
615
+ *
616
+ * @returns A promise that resolves once the flush completes.
617
+ */
618
+ async forceFlush() {
619
+ await this._tracerProvider.forceFlush();
620
+ }
621
+ /**
622
+ * Shut down the hooks, ending any in-flight spans and flushing all
623
+ * pending data.
624
+ *
625
+ * @returns A promise that resolves once shutdown is complete.
626
+ */
627
+ async shutdown() {
628
+ // End any remaining spans
629
+ for (const [, span] of this._sessionSpans) {
630
+ span.end();
631
+ }
632
+ for (const [, span] of this._toolSpans) {
633
+ span.end();
634
+ }
635
+ for (const [, span] of this._subagentSpans) {
636
+ span.end();
637
+ }
638
+ this._sessionSpans.clear();
639
+ this._toolSpans.clear();
640
+ this._subagentSpans.clear();
641
+ this._sessionUsage.clear();
642
+ await this._tracerProvider.shutdown();
643
+ }
644
+ }
645
+ //# sourceMappingURL=claude-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-hooks.js","sourceRoot":"","sources":["../../src/otel/claude-hooks.ts"],"names":[],"mappings":"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"}