pi-otel 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/otel/sdk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Span lifecycle tracker.
3
+ *
4
+ * Owns one `pi.interaction` root span per user prompt. Children:
5
+ * - `pi.llm_request` per provider request
6
+ * - `pi.tool.<name>` per tool invocation (parallel-safe via Map<toolCallId, …>)
7
+ *
8
+ * Active provider span is single-slot — pi serializes provider requests
9
+ * per session, but parallel tool calls overlap, so tools key on toolCallId.
10
+ */
11
+ import { type Tracer } from "@opentelemetry/api";
12
+ import { type ContentCapture } from "./attrs.js";
13
+ export interface SpanTrackerOpts {
14
+ tracer: Tracer;
15
+ captureContent: ContentCapture;
16
+ sessionId: () => string | undefined;
17
+ cwd: string;
18
+ }
19
+ export declare class SpanTracker {
20
+ private opts;
21
+ private interaction;
22
+ private turn;
23
+ private llm;
24
+ private tools;
25
+ private turnCount;
26
+ private toolCount;
27
+ private pendingMessages;
28
+ constructor(opts: SpanTrackerOpts);
29
+ private commonAttrs;
30
+ startInteraction(prompt: string | undefined): void;
31
+ endInteraction(error?: unknown): void;
32
+ startTurn(turnIndex: number | undefined): void;
33
+ endTurn(error?: unknown): void;
34
+ startLlmRequest(model?: string): void;
35
+ private currentInputMessages;
36
+ private flushPendingMessages;
37
+ /**
38
+ * Buffer a user-role message; flushed as a gen_ai.user.message event on the
39
+ * next LLM span (or the current one if already open).
40
+ */
41
+ noteUserMessage(content: unknown): void;
42
+ /**
43
+ * Buffer a toolResult message; flushed as a gen_ai.tool.message event on the
44
+ * next LLM span (only when captureContent === "full").
45
+ */
46
+ noteToolResultMessage(msg: {
47
+ toolCallId: string;
48
+ toolName?: string;
49
+ content: unknown;
50
+ }): void;
51
+ /**
52
+ * Emit gen_ai.assistant.message + gen_ai.choice events on the active LLM
53
+ * span. Called from message_end before endLlmRequest.
54
+ */
55
+ noteAssistantMessage(message: any): void;
56
+ setLlmAttrs(attrs: Record<string, unknown>): void;
57
+ endLlmRequest(error?: unknown): void;
58
+ private recordLlmMetrics;
59
+ startTool(toolCallId: string, toolName: string, input: unknown): void;
60
+ endTool(toolCallId: string, args: {
61
+ isError?: boolean;
62
+ result?: unknown;
63
+ }): void;
64
+ /**
65
+ * Drop any buffered user/tool messages — used when an interaction ends
66
+ * without ever opening an LLM span (e.g., user prompt cancelled).
67
+ */
68
+ clearPending(): void;
69
+ /**
70
+ * Hook for the launcher / external code to read the active interaction
71
+ * trace id (e.g. for surfacing in UI).
72
+ */
73
+ activeTraceId(): string | undefined;
74
+ }
package/dist/spans.js ADDED
@@ -0,0 +1,504 @@
1
+ /**
2
+ * Span lifecycle tracker.
3
+ *
4
+ * Owns one `pi.interaction` root span per user prompt. Children:
5
+ * - `pi.llm_request` per provider request
6
+ * - `pi.tool.<name>` per tool invocation (parallel-safe via Map<toolCallId, …>)
7
+ *
8
+ * Active provider span is single-slot — pi serializes provider requests
9
+ * per session, but parallel tool calls overlap, so tools key on toolCallId.
10
+ */
11
+ import { context as otelContext, SpanStatusCode, trace, } from "@opentelemetry/api";
12
+ import { SeverityNumber } from "@opentelemetry/api-logs";
13
+ import { ATTR_CONVERSATION_ID, ATTR_ERROR_TYPE, ATTR_GEN_AI_INPUT_MESSAGES, ATTR_GEN_AI_OUTPUT_MESSAGES, ATTR_INPUT_TOKENS, ATTR_OPERATION_NAME, ATTR_OUTPUT_TOKENS, ATTR_PI_CWD, ATTR_PI_SESSION_ID, ATTR_PI_TOOL_CALL_ID, ATTR_PI_TOOL_COUNT, ATTR_PI_TOOL_INPUT, ATTR_PI_TOOL_IS_ERROR, ATTR_PI_TOOL_NAME, ATTR_PI_TOOL_OUTPUT, ATTR_PI_TURN_COUNT, ATTR_PI_TURN_INDEX, ATTR_PI_USER_PROMPT, ATTR_PI_USER_PROMPT_LENGTH, ATTR_REQUEST_MODEL, ATTR_RESPONSE_MODEL, ATTR_SESSION_ID, ATTR_SYSTEM, ATTR_TOKEN_TYPE, ATTR_TOOL_CALL_ARGUMENTS, ATTR_TOOL_CALL_ID, ATTR_TOOL_CALL_RESULT, ATTR_TOOL_NAME, clampAttr, EVENT_GEN_AI_ASSISTANT_MESSAGE, EVENT_GEN_AI_CHOICE, EVENT_GEN_AI_TOOL_MESSAGE, EVENT_GEN_AI_USER_MESSAGE, GEN_AI_SYSTEM_PI, SPAN_INTERACTION, SPAN_LLM_REQUEST, SPAN_TURN, spanToolName, } from "./attrs.js";
14
+ import { emitLifecycleLog } from "./otel/logs.js";
15
+ import { getDurationHistogram, getTokenHistogram, getToolCallsCounter, getToolCallsHistogram, } from "./otel/metrics.js";
16
+ /**
17
+ * Flatten pi AgentMessage `content` (string | content-part[]) into a single
18
+ * text string. Non-text parts are skipped — tool_calls are surfaced via
19
+ * extractToolCalls instead.
20
+ */
21
+ function extractMessageText(content) {
22
+ if (content == null)
23
+ return "";
24
+ if (typeof content === "string")
25
+ return content;
26
+ if (!Array.isArray(content))
27
+ return "";
28
+ const parts = [];
29
+ for (const p of content) {
30
+ if (!p || typeof p !== "object")
31
+ continue;
32
+ if (p.type === "text" && typeof p.text === "string")
33
+ parts.push(p.text);
34
+ }
35
+ return parts.join("\n");
36
+ }
37
+ /**
38
+ * Extract assistant tool_calls from AgentMessage content parts into the
39
+ * OTel GenAI semconv shape: [{id, type:"function", function:{name, arguments}}].
40
+ * `includeArguments=false` (no_tool_content) omits the arguments payload.
41
+ */
42
+ function extractToolCalls(content, includeArguments) {
43
+ if (!Array.isArray(content))
44
+ return [];
45
+ const calls = [];
46
+ for (const p of content) {
47
+ if (!p || typeof p !== "object")
48
+ continue;
49
+ const isToolCall = p.type === "toolCall" || p.type === "tool_call" || p.type === "tool_use";
50
+ if (!isToolCall)
51
+ continue;
52
+ const id = p.id ?? p.toolCallId ?? p.tool_call_id ?? p.toolUseId;
53
+ const name = p.name ?? p.toolName ?? p.tool_name;
54
+ const args = p.arguments ?? p.input ?? p.args;
55
+ const fn = { name };
56
+ if (includeArguments && args !== undefined) {
57
+ fn.arguments = typeof args === "string" ? args : JSON.stringify(args);
58
+ }
59
+ calls.push({ id, type: "function", function: fn });
60
+ }
61
+ return calls;
62
+ }
63
+ export class SpanTracker {
64
+ opts;
65
+ interaction = null;
66
+ turn = null;
67
+ llm = null;
68
+ tools = new Map();
69
+ turnCount = 0;
70
+ toolCount = 0;
71
+ // user/toolResult messages can land before the next llm_request opens; buffer
72
+ // them and flush as gen_ai.*.message events when the LLM span starts.
73
+ pendingMessages = [];
74
+ constructor(opts) {
75
+ this.opts = opts;
76
+ }
77
+ commonAttrs() {
78
+ const sid = this.opts.sessionId();
79
+ const attrs = {
80
+ [ATTR_SYSTEM]: GEN_AI_SYSTEM_PI,
81
+ [ATTR_PI_CWD]: this.opts.cwd,
82
+ };
83
+ if (sid) {
84
+ attrs[ATTR_PI_SESSION_ID] = sid;
85
+ attrs[ATTR_SESSION_ID] = sid;
86
+ attrs[ATTR_CONVERSATION_ID] = sid;
87
+ }
88
+ return attrs;
89
+ }
90
+ startInteraction(prompt) {
91
+ if (this.interaction)
92
+ return; // already open — defensive
93
+ this.turnCount = 0;
94
+ this.toolCount = 0;
95
+ const attrs = this.commonAttrs();
96
+ if (typeof prompt === "string") {
97
+ attrs[ATTR_PI_USER_PROMPT_LENGTH] = prompt.length;
98
+ if (this.opts.captureContent === "full") {
99
+ attrs[ATTR_PI_USER_PROMPT] = clampAttr(prompt);
100
+ }
101
+ }
102
+ const span = this.opts.tracer.startSpan(SPAN_INTERACTION, {
103
+ attributes: attrs,
104
+ });
105
+ const ctx = trace.setSpan(otelContext.active(), span);
106
+ this.interaction = { span, ctx };
107
+ }
108
+ endInteraction(error) {
109
+ if (!this.interaction)
110
+ return;
111
+ const { span } = this.interaction;
112
+ span.setAttribute(ATTR_PI_TURN_COUNT, this.turnCount);
113
+ span.setAttribute(ATTR_PI_TOOL_COUNT, this.toolCount);
114
+ if (error) {
115
+ span.setAttribute(ATTR_ERROR_TYPE, error?.name ?? "Error");
116
+ span.setStatus({
117
+ code: SpanStatusCode.ERROR,
118
+ message: String(error?.message ?? error),
119
+ });
120
+ }
121
+ // Close stragglers defensively.
122
+ if (this.llm) {
123
+ this.llm.span.end();
124
+ this.llm = null;
125
+ }
126
+ for (const slot of this.tools.values())
127
+ slot.span.end();
128
+ this.tools.clear();
129
+ if (this.turn) {
130
+ this.turn.span.end();
131
+ this.turn = null;
132
+ }
133
+ span.end();
134
+ this.interaction = null;
135
+ this.pendingMessages = [];
136
+ }
137
+ startTurn(turnIndex) {
138
+ if (!this.interaction)
139
+ return;
140
+ if (this.turn) {
141
+ // Defensive: a previous turn never closed — close it.
142
+ this.turn.span.end();
143
+ this.turn = null;
144
+ }
145
+ const idx = typeof turnIndex === "number" ? turnIndex : this.turnCount;
146
+ const attrs = this.commonAttrs();
147
+ attrs[ATTR_PI_TURN_INDEX] = idx;
148
+ const span = this.opts.tracer.startSpan(SPAN_TURN, { attributes: attrs }, this.interaction.ctx);
149
+ const ctx = trace.setSpan(this.interaction.ctx, span);
150
+ this.turn = { span, ctx, index: idx };
151
+ this.turnCount += 1;
152
+ }
153
+ endTurn(error) {
154
+ if (!this.turn)
155
+ return;
156
+ if (error) {
157
+ this.turn.span.setAttribute(ATTR_ERROR_TYPE, error?.name ?? "Error");
158
+ this.turn.span.setStatus({
159
+ code: SpanStatusCode.ERROR,
160
+ message: String(error?.message ?? error),
161
+ });
162
+ }
163
+ this.turn.span.end();
164
+ this.turn = null;
165
+ }
166
+ startLlmRequest(model) {
167
+ if (this.llm) {
168
+ // Should not happen — defensive close.
169
+ this.llm.span.end();
170
+ this.llm = null;
171
+ }
172
+ const parentCtx = this.turn?.ctx ?? this.interaction?.ctx ?? otelContext.active();
173
+ const attrs = this.commonAttrs();
174
+ attrs[ATTR_OPERATION_NAME] = "chat";
175
+ if (model)
176
+ attrs[ATTR_REQUEST_MODEL] = model;
177
+ const span = this.opts.tracer.startSpan(SPAN_LLM_REQUEST, { attributes: attrs }, parentCtx);
178
+ const ctx = trace.setSpan(parentCtx, span);
179
+ this.llm = {
180
+ span,
181
+ ctx,
182
+ startNs: process.hrtime.bigint(),
183
+ requestModel: model,
184
+ };
185
+ this.currentInputMessages = [];
186
+ this.flushPendingMessages();
187
+ }
188
+ // Accumulated input messages for the current LLM request, kept in the
189
+ // GenAI semconv "messages" shape ({role, parts:[{type,...}]}) so we can
190
+ // serialize to `gen_ai.input.messages` at the end. Aspire 9.x reads this
191
+ // attribute, not the span events.
192
+ currentInputMessages = [];
193
+ flushPendingMessages() {
194
+ if (!this.llm || this.pendingMessages.length === 0)
195
+ return;
196
+ if (this.opts.captureContent === "metadata_only") {
197
+ this.pendingMessages = [];
198
+ return;
199
+ }
200
+ const allowTool = this.opts.captureContent === "full";
201
+ for (const m of this.pendingMessages) {
202
+ if (m.kind === "user") {
203
+ const attrs = {
204
+ [ATTR_SYSTEM]: GEN_AI_SYSTEM_PI,
205
+ role: "user",
206
+ content: clampAttr(m.content),
207
+ };
208
+ this.llm.span.addEvent(EVENT_GEN_AI_USER_MESSAGE, attrs);
209
+ this.currentInputMessages.push({
210
+ role: "user",
211
+ parts: [{ type: "text", content: m.content }],
212
+ });
213
+ }
214
+ else if (m.kind === "tool" && allowTool) {
215
+ const attrs = {
216
+ [ATTR_SYSTEM]: GEN_AI_SYSTEM_PI,
217
+ role: "tool",
218
+ id: m.toolCallId,
219
+ ...(m.toolName ? { name: m.toolName } : {}),
220
+ content: clampAttr(m.content),
221
+ };
222
+ this.llm.span.addEvent(EVENT_GEN_AI_TOOL_MESSAGE, attrs);
223
+ this.currentInputMessages.push({
224
+ role: "tool",
225
+ parts: [
226
+ {
227
+ type: "tool_call_response",
228
+ id: m.toolCallId,
229
+ ...(m.toolName ? { name: m.toolName } : {}),
230
+ response: m.content,
231
+ },
232
+ ],
233
+ });
234
+ }
235
+ }
236
+ this.pendingMessages = [];
237
+ }
238
+ /**
239
+ * Buffer a user-role message; flushed as a gen_ai.user.message event on the
240
+ * next LLM span (or the current one if already open).
241
+ */
242
+ noteUserMessage(content) {
243
+ if (this.opts.captureContent === "metadata_only")
244
+ return;
245
+ const text = extractMessageText(content);
246
+ if (!text)
247
+ return;
248
+ this.pendingMessages.push({ kind: "user", content: text });
249
+ if (this.llm)
250
+ this.flushPendingMessages();
251
+ }
252
+ /**
253
+ * Buffer a toolResult message; flushed as a gen_ai.tool.message event on the
254
+ * next LLM span (only when captureContent === "full").
255
+ */
256
+ noteToolResultMessage(msg) {
257
+ if (this.opts.captureContent !== "full")
258
+ return;
259
+ if (!msg.toolCallId)
260
+ return;
261
+ const text = extractMessageText(msg.content);
262
+ this.pendingMessages.push({
263
+ kind: "tool",
264
+ content: text,
265
+ toolCallId: msg.toolCallId,
266
+ toolName: msg.toolName,
267
+ });
268
+ if (this.llm)
269
+ this.flushPendingMessages();
270
+ }
271
+ /**
272
+ * Emit gen_ai.assistant.message + gen_ai.choice events on the active LLM
273
+ * span. Called from message_end before endLlmRequest.
274
+ */
275
+ noteAssistantMessage(message) {
276
+ if (!this.llm)
277
+ return;
278
+ if (typeof message?.model === "string")
279
+ this.llm.responseModel = message.model;
280
+ const allowTool = this.opts.captureContent === "full";
281
+ const toolCalls = extractToolCalls(message?.content, allowTool);
282
+ this.llm.toolCallCount = toolCalls.length;
283
+ if (this.opts.captureContent === "metadata_only")
284
+ return;
285
+ const text = extractMessageText(message?.content);
286
+ const assistantAttrs = {
287
+ [ATTR_SYSTEM]: GEN_AI_SYSTEM_PI,
288
+ role: "assistant",
289
+ };
290
+ if (text)
291
+ assistantAttrs.content = clampAttr(text);
292
+ if (toolCalls.length)
293
+ assistantAttrs.tool_calls = clampAttr(toolCalls);
294
+ this.llm.span.addEvent(EVENT_GEN_AI_ASSISTANT_MESSAGE, assistantAttrs);
295
+ const finish = message?.stopReason ??
296
+ message?.finishReason ??
297
+ message?.finish_reason ??
298
+ "stop";
299
+ const choiceMessage = { role: "assistant" };
300
+ if (text)
301
+ choiceMessage.content = text;
302
+ if (toolCalls.length)
303
+ choiceMessage.tool_calls = toolCalls;
304
+ const finishReasonStr = typeof finish === "string" ? finish : "stop";
305
+ this.llm.span.addEvent(EVENT_GEN_AI_CHOICE, {
306
+ [ATTR_SYSTEM]: GEN_AI_SYSTEM_PI,
307
+ index: 0,
308
+ finish_reason: finishReasonStr,
309
+ message: clampAttr(choiceMessage),
310
+ });
311
+ // Aspire 9.x AI panel reads these JSON-stringified attributes on the
312
+ // LLM span. The span events above are for older readers / log-pipeline
313
+ // consumers — keep both.
314
+ const outputParts = [];
315
+ if (text)
316
+ outputParts.push({ type: "text", content: text });
317
+ if (allowTool) {
318
+ for (const tc of toolCalls) {
319
+ outputParts.push({
320
+ type: "tool_call",
321
+ id: tc.id,
322
+ name: tc.function?.name,
323
+ arguments: tc.function?.arguments,
324
+ });
325
+ }
326
+ }
327
+ const outputMessages = [
328
+ { role: "assistant", parts: outputParts, finish_reason: finishReasonStr },
329
+ ];
330
+ if (this.currentInputMessages.length > 0) {
331
+ this.llm.span.setAttribute(ATTR_GEN_AI_INPUT_MESSAGES, clampAttr(this.currentInputMessages));
332
+ }
333
+ this.llm.span.setAttribute(ATTR_GEN_AI_OUTPUT_MESSAGES, clampAttr(outputMessages));
334
+ }
335
+ setLlmAttrs(attrs) {
336
+ if (!this.llm)
337
+ return;
338
+ const respModel = attrs[ATTR_RESPONSE_MODEL];
339
+ if (typeof respModel === "string")
340
+ this.llm.responseModel = respModel;
341
+ const reqModel = attrs[ATTR_REQUEST_MODEL];
342
+ if (typeof reqModel === "string")
343
+ this.llm.requestModel = reqModel;
344
+ const inTok = attrs[ATTR_INPUT_TOKENS];
345
+ if (typeof inTok === "number")
346
+ this.llm.inputTokens = inTok;
347
+ const outTok = attrs[ATTR_OUTPUT_TOKENS];
348
+ if (typeof outTok === "number")
349
+ this.llm.outputTokens = outTok;
350
+ for (const [k, v] of Object.entries(attrs)) {
351
+ if (v === undefined || v === null)
352
+ continue;
353
+ // OTel SDK requires primitive or primitive[] values.
354
+ if (typeof v === "string" ||
355
+ typeof v === "number" ||
356
+ typeof v === "boolean") {
357
+ this.llm.span.setAttribute(k, v);
358
+ }
359
+ else if (Array.isArray(v) && v.every((x) => typeof x === "string")) {
360
+ this.llm.span.setAttribute(k, v);
361
+ }
362
+ else {
363
+ this.llm.span.setAttribute(k, clampAttr(v));
364
+ }
365
+ }
366
+ }
367
+ endLlmRequest(error) {
368
+ if (!this.llm)
369
+ return;
370
+ if (error) {
371
+ const errName = error?.name ?? "Error";
372
+ const errMsg = String(error?.message ?? error);
373
+ this.llm.span.setAttribute(ATTR_ERROR_TYPE, errName);
374
+ this.llm.span.setStatus({ code: SpanStatusCode.ERROR, message: errMsg });
375
+ const attrs = {
376
+ [ATTR_SYSTEM]: GEN_AI_SYSTEM_PI,
377
+ [ATTR_ERROR_TYPE]: errName,
378
+ "exception.message": errMsg,
379
+ };
380
+ if (this.llm.requestModel)
381
+ attrs[ATTR_REQUEST_MODEL] = this.llm.requestModel;
382
+ if (this.llm.responseModel)
383
+ attrs[ATTR_RESPONSE_MODEL] = this.llm.responseModel;
384
+ const stack = error?.stack;
385
+ if (typeof stack === "string")
386
+ attrs["exception.stacktrace"] = stack;
387
+ emitLifecycleLog("pi.llm_request.error", SeverityNumber.ERROR, `LLM request failed: ${errMsg}`, attrs);
388
+ }
389
+ this.recordLlmMetrics(error);
390
+ this.llm.span.end();
391
+ this.llm = null;
392
+ this.currentInputMessages = [];
393
+ }
394
+ recordLlmMetrics(error) {
395
+ if (!this.llm)
396
+ return;
397
+ const elapsedSec = Number(process.hrtime.bigint() - this.llm.startNs) / 1e9;
398
+ const baseAttrs = {
399
+ [ATTR_SYSTEM]: GEN_AI_SYSTEM_PI,
400
+ [ATTR_OPERATION_NAME]: "chat",
401
+ };
402
+ if (this.llm.requestModel)
403
+ baseAttrs[ATTR_REQUEST_MODEL] = this.llm.requestModel;
404
+ if (this.llm.responseModel)
405
+ baseAttrs[ATTR_RESPONSE_MODEL] = this.llm.responseModel;
406
+ if (error)
407
+ baseAttrs[ATTR_ERROR_TYPE] = error?.name ?? "Error";
408
+ try {
409
+ getDurationHistogram().record(elapsedSec, baseAttrs);
410
+ if (typeof this.llm.inputTokens === "number") {
411
+ getTokenHistogram().record(this.llm.inputTokens, {
412
+ ...baseAttrs,
413
+ [ATTR_TOKEN_TYPE]: "input",
414
+ });
415
+ }
416
+ if (typeof this.llm.outputTokens === "number") {
417
+ getTokenHistogram().record(this.llm.outputTokens, {
418
+ ...baseAttrs,
419
+ [ATTR_TOKEN_TYPE]: "output",
420
+ });
421
+ }
422
+ getToolCallsHistogram().record(this.llm.toolCallCount ?? 0, baseAttrs);
423
+ }
424
+ catch {
425
+ // Metrics are best-effort — never block span lifecycle.
426
+ }
427
+ }
428
+ startTool(toolCallId, toolName, input) {
429
+ // Tool spans are siblings of pi.llm_request under pi.turn (SPEC §5).
430
+ // Parenting under the LLM span would imply the tool ran *during* the model
431
+ // call; tools actually execute after it.
432
+ const parentCtx = this.turn?.ctx ?? this.interaction?.ctx ?? otelContext.active();
433
+ const attrs = this.commonAttrs();
434
+ attrs[ATTR_PI_TOOL_NAME] = toolName;
435
+ attrs[ATTR_PI_TOOL_CALL_ID] = toolCallId;
436
+ attrs[ATTR_TOOL_NAME] = toolName;
437
+ attrs[ATTR_TOOL_CALL_ID] = toolCallId;
438
+ if (this.opts.captureContent === "full" && input !== undefined) {
439
+ const clamped = clampAttr(input);
440
+ attrs[ATTR_PI_TOOL_INPUT] = clamped;
441
+ attrs[ATTR_TOOL_CALL_ARGUMENTS] = clamped;
442
+ }
443
+ const span = this.opts.tracer.startSpan(spanToolName(toolName), { attributes: attrs }, parentCtx);
444
+ const ctx = trace.setSpan(parentCtx, span);
445
+ this.tools.set(toolCallId, { span, ctx, name: toolName });
446
+ this.toolCount += 1;
447
+ }
448
+ endTool(toolCallId, args) {
449
+ const slot = this.tools.get(toolCallId);
450
+ if (!slot)
451
+ return;
452
+ if (args.isError) {
453
+ slot.span.setAttribute(ATTR_PI_TOOL_IS_ERROR, true);
454
+ slot.span.setStatus({ code: SpanStatusCode.ERROR });
455
+ const attrs = {
456
+ [ATTR_SYSTEM]: GEN_AI_SYSTEM_PI,
457
+ [ATTR_TOOL_NAME]: slot.name,
458
+ [ATTR_TOOL_CALL_ID]: toolCallId,
459
+ };
460
+ if (this.opts.captureContent === "full" && args.result !== undefined) {
461
+ attrs[ATTR_TOOL_CALL_RESULT] = clampAttr(args.result);
462
+ }
463
+ emitLifecycleLog("pi.tool.error", SeverityNumber.ERROR, `tool ${slot.name} failed`, attrs);
464
+ }
465
+ else {
466
+ slot.span.setAttribute(ATTR_PI_TOOL_IS_ERROR, false);
467
+ }
468
+ if (this.opts.captureContent === "full" && args.result !== undefined) {
469
+ const clamped = clampAttr(args.result);
470
+ slot.span.setAttribute(ATTR_PI_TOOL_OUTPUT, clamped);
471
+ slot.span.setAttribute(ATTR_TOOL_CALL_RESULT, clamped);
472
+ }
473
+ slot.span.end();
474
+ this.tools.delete(toolCallId);
475
+ try {
476
+ const counterAttrs = {
477
+ [ATTR_SYSTEM]: GEN_AI_SYSTEM_PI,
478
+ [ATTR_TOOL_NAME]: slot.name,
479
+ };
480
+ if (args.isError)
481
+ counterAttrs[ATTR_ERROR_TYPE] = "tool_error";
482
+ getToolCallsCounter().add(1, counterAttrs);
483
+ }
484
+ catch {
485
+ // Metrics are best-effort — never block lifecycle.
486
+ }
487
+ }
488
+ /**
489
+ * Drop any buffered user/tool messages — used when an interaction ends
490
+ * without ever opening an LLM span (e.g., user prompt cancelled).
491
+ */
492
+ clearPending() {
493
+ this.pendingMessages = [];
494
+ }
495
+ /**
496
+ * Hook for the launcher / external code to read the active interaction
497
+ * trace id (e.g. for surfacing in UI).
498
+ */
499
+ activeTraceId() {
500
+ const sc = this.interaction?.span.spanContext();
501
+ return sc?.traceId;
502
+ }
503
+ }
504
+ //# sourceMappingURL=spans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spans.js","sourceRoot":"","sources":["../src/spans.ts"],"names":[],"mappings":"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"}