@senpi/runtime 1.1.0-dev.runtime-phase-2.20260515135454 → 1.1.0-dev.runtime-phase-2.20260519125628

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 (59) hide show
  1. package/dist/actions/llm-decision/anthropic-llm-decision.d.ts +9 -0
  2. package/dist/actions/llm-decision/anthropic-llm-decision.d.ts.map +1 -1
  3. package/dist/actions/llm-decision/anthropic-llm-decision.js +74 -3
  4. package/dist/actions/llm-decision/anthropic-llm-decision.js.map +1 -1
  5. package/dist/actions/llm-decision/factory.d.ts +6 -0
  6. package/dist/actions/llm-decision/factory.d.ts.map +1 -1
  7. package/dist/actions/llm-decision/factory.js +2 -0
  8. package/dist/actions/llm-decision/factory.js.map +1 -1
  9. package/dist/actions/llm-decision/openclaw-llm-decision.d.ts.map +1 -1
  10. package/dist/actions/llm-decision/openclaw-llm-decision.js +28 -0
  11. package/dist/actions/llm-decision/openclaw-llm-decision.js.map +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +18 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/runtime/run.d.ts +6 -0
  16. package/dist/runtime/run.d.ts.map +1 -1
  17. package/dist/runtime/run.js +1 -0
  18. package/dist/runtime/run.js.map +1 -1
  19. package/dist/runtime/runtime-schema.d.ts +1019 -1
  20. package/dist/runtime/runtime-schema.d.ts.map +1 -1
  21. package/dist/runtime/runtime-schema.js +34 -0
  22. package/dist/runtime/runtime-schema.js.map +1 -1
  23. package/dist/runtime/runtime.d.ts +8 -0
  24. package/dist/runtime/runtime.d.ts.map +1 -1
  25. package/dist/runtime/runtime.js +57 -37
  26. package/dist/runtime/runtime.js.map +1 -1
  27. package/dist/tracking/context.d.ts +31 -0
  28. package/dist/tracking/context.d.ts.map +1 -0
  29. package/dist/tracking/context.js +20 -0
  30. package/dist/tracking/context.js.map +1 -0
  31. package/dist/tracking/spans/constants.d.ts +15 -0
  32. package/dist/tracking/spans/constants.d.ts.map +1 -0
  33. package/dist/tracking/spans/constants.js +18 -0
  34. package/dist/tracking/spans/constants.js.map +1 -0
  35. package/dist/tracking/spans/index.d.ts +13 -0
  36. package/dist/tracking/spans/index.d.ts.map +1 -0
  37. package/dist/tracking/spans/index.js +16 -0
  38. package/dist/tracking/spans/index.js.map +1 -0
  39. package/dist/tracking/spans/plugin-span-tracker.d.ts +3 -0
  40. package/dist/tracking/spans/plugin-span-tracker.d.ts.map +1 -0
  41. package/dist/tracking/spans/plugin-span-tracker.js +24 -0
  42. package/dist/tracking/spans/plugin-span-tracker.js.map +1 -0
  43. package/dist/tracking/spans/span-hooks.d.ts +26 -0
  44. package/dist/tracking/spans/span-hooks.d.ts.map +1 -0
  45. package/dist/tracking/spans/span-hooks.js +399 -0
  46. package/dist/tracking/spans/span-hooks.js.map +1 -0
  47. package/dist/tracking/spans/span-tracker.d.ts +120 -0
  48. package/dist/tracking/spans/span-tracker.d.ts.map +1 -0
  49. package/dist/tracking/spans/span-tracker.js +616 -0
  50. package/dist/tracking/spans/span-tracker.js.map +1 -0
  51. package/dist/tracking/spans/span-transport.d.ts +34 -0
  52. package/dist/tracking/spans/span-transport.d.ts.map +1 -0
  53. package/dist/tracking/spans/span-transport.js +121 -0
  54. package/dist/tracking/spans/span-transport.js.map +1 -0
  55. package/dist/tracking/spans/types.d.ts +78 -0
  56. package/dist/tracking/spans/types.d.ts.map +1 -0
  57. package/dist/tracking/spans/types.js +6 -0
  58. package/dist/tracking/spans/types.js.map +1 -0
  59. package/package.json +1 -1
@@ -0,0 +1,616 @@
1
+ /**
2
+ * SpanTracker: stitches start/end hook pairs into one finalized span and
3
+ * enqueues it on the transport. Maintains two registries:
4
+ *
5
+ * - openSpans: Map<spanKey, OpenSpan> (LLM and tool spans)
6
+ * - openSubagents: Map<childSessionKey, OpenSubagentSpan>
7
+ *
8
+ * Lifetimes:
9
+ * - LLM span: llm_input → llm_output (single host turn)
10
+ * - Tool span: before_tool_call → after_tool_call (single tool call)
11
+ * - Subagent: subagent_spawning → … → subagent_ended (may outlive host turns)
12
+ *
13
+ * Orphan handling — flush spans we couldn't pair up with `data.orphan_reason`:
14
+ * - agent_end sweep: any span open under (session,run) when agent_end fires
15
+ * - stale sweep: anything older than STALE_TIMEOUT_MS (periodic)
16
+ * - shutdown drain: anything still open at shutdown
17
+ *
18
+ * Never throws — errors are caught and logged.
19
+ */
20
+ import { randomUUID } from "node:crypto";
21
+ import { createLogger } from "../../utils/logger.js";
22
+ import { STALE_TIMEOUT_MS, SWEEP_INTERVAL_MS, } from "./constants.js";
23
+ const logger = createLogger("[senpi-core][span-tracker]");
24
+ const ADDRESS_RE = /^0x[a-f0-9]{40}$/i;
25
+ const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
26
+ function spanKeyLlm(sessionKey, runId) {
27
+ return `session:${sessionKey}:run:${runId}:llm`;
28
+ }
29
+ function spanKeyTool(sessionKey, runId, toolCallId, toolName, seq) {
30
+ if (toolCallId) {
31
+ return `session:${sessionKey}:run:${runId}:toolcall:${toolCallId}`;
32
+ }
33
+ return `session:${sessionKey}:run:${runId}:tool:${toolName}:${seq}`;
34
+ }
35
+ function sanitizeCorrelationId(raw) {
36
+ if (typeof raw !== "string")
37
+ return null;
38
+ return UUID_V4_RE.test(raw) ? raw : null;
39
+ }
40
+ function sanitizeAddress(raw) {
41
+ if (typeof raw !== "string")
42
+ return null;
43
+ const lowered = raw.toLowerCase();
44
+ return ADDRESS_RE.test(lowered) ? lowered : null;
45
+ }
46
+ function sanitizeString(raw) {
47
+ return typeof raw === "string" && raw.length > 0 ? raw : null;
48
+ }
49
+ function sanitizeUint(raw) {
50
+ return typeof raw === "number" && Number.isInteger(raw) && raw >= 0 ? raw : null;
51
+ }
52
+ function sanitizeFloat(raw) {
53
+ return typeof raw === "number" && Number.isFinite(raw) && raw >= 0 ? raw : null;
54
+ }
55
+ export class SpanTracker {
56
+ transport;
57
+ now;
58
+ staleTimeoutMs;
59
+ openSpans = new Map();
60
+ openSubagents = new Map();
61
+ toolSeq = 0;
62
+ sweepTimer = null;
63
+ constructor(options) {
64
+ this.transport = options.transport;
65
+ this.now = options.now ?? Date.now;
66
+ this.staleTimeoutMs = options.staleTimeoutMs ?? STALE_TIMEOUT_MS;
67
+ const sweepInterval = options.sweepIntervalMs ?? SWEEP_INTERVAL_MS;
68
+ if (options.enableSweeper !== false) {
69
+ this.sweepTimer = setInterval(() => {
70
+ this.sweepStale();
71
+ }, sweepInterval);
72
+ if (this.sweepTimer && typeof this.sweepTimer === "object" && "unref" in this.sweepTimer) {
73
+ this.sweepTimer.unref();
74
+ }
75
+ }
76
+ }
77
+ // ─── LLM lifecycle (hook path) ──────────────────────────────────────────
78
+ openLlmSpan(input) {
79
+ try {
80
+ const key = spanKeyLlm(input.sessionKey, input.runId);
81
+ const existing = this.openSpans.get(key);
82
+ if (existing) {
83
+ // Silently discard the prior open span. A duplicate llm_input for the
84
+ // same (session, run) usually means OpenClaw's agent loop is starting
85
+ // a new turn (e.g., feeding back a tool result) without having fired
86
+ // llm_output for the previous turn — emitting an orphan row would
87
+ // pollute ClickHouse with partial records. We post only after the
88
+ // matching llm_output completes the merge.
89
+ logger.debug("openLlmSpan: discarding prior open span", {
90
+ sessionKey: input.sessionKey,
91
+ runId: input.runId,
92
+ });
93
+ this.openSpans.delete(key);
94
+ }
95
+ const id = randomUUID();
96
+ this.openSpans.set(key, {
97
+ id,
98
+ spanType: "llm",
99
+ sessionKey: input.sessionKey,
100
+ runId: input.runId,
101
+ parentSpanId: null,
102
+ toolCallId: null,
103
+ startedAt: input.startedAt ?? this.now(),
104
+ correlationId: sanitizeCorrelationId(input.correlationId),
105
+ address: sanitizeAddress(input.address),
106
+ recipeName: sanitizeString(input.recipeName),
107
+ runtimeId: sanitizeString(input.runtimeId),
108
+ runtimeVersion: sanitizeString(input.runtimeVersion),
109
+ data: { input: input.input },
110
+ emissionSource: input.emissionSource,
111
+ });
112
+ return id;
113
+ }
114
+ catch (err) {
115
+ logger.warn("openLlmSpan failed", { err: errMsg(err) });
116
+ return "";
117
+ }
118
+ }
119
+ finalizeLlmSpan(input) {
120
+ try {
121
+ const key = spanKeyLlm(input.sessionKey, input.runId);
122
+ const open = this.openSpans.get(key);
123
+ if (!open) {
124
+ logger.warn("finalizeLlmSpan: no open span", {
125
+ sessionKey: input.sessionKey,
126
+ runId: input.runId,
127
+ });
128
+ return;
129
+ }
130
+ this.openSpans.delete(key);
131
+ const endedAt = this.now();
132
+ const data = {
133
+ ...open.data,
134
+ ...(input.output !== undefined ? { output: input.output } : {}),
135
+ ...(input.error !== undefined ? { error: errMsg(input.error) } : {}),
136
+ };
137
+ this.transport.enqueue({
138
+ id: open.id,
139
+ correlationId: sanitizeCorrelationId(input.correlationId) ?? open.correlationId,
140
+ sessionKey: open.sessionKey,
141
+ runId: open.runId,
142
+ childSessionKey: null,
143
+ toolCallId: null,
144
+ parentSpanId: open.parentSpanId,
145
+ spanType: "llm",
146
+ emissionSource: open.emissionSource,
147
+ timestamp: endedAt,
148
+ address: sanitizeAddress(input.address) ?? open.address,
149
+ recipeName: sanitizeString(input.recipeName) ?? open.recipeName,
150
+ runtimeId: sanitizeString(input.runtimeId) ?? open.runtimeId,
151
+ runtimeVersion: sanitizeString(input.runtimeVersion) ?? open.runtimeVersion,
152
+ startedAt: open.startedAt,
153
+ endedAt,
154
+ durationMs: Math.max(0, endedAt - open.startedAt),
155
+ model: sanitizeString(input.model),
156
+ tokensIn: sanitizeUint(input.tokensIn),
157
+ tokensOut: sanitizeUint(input.tokensOut),
158
+ costUsd: sanitizeFloat(input.costUsd),
159
+ data,
160
+ });
161
+ }
162
+ catch (err) {
163
+ logger.warn("finalizeLlmSpan failed", { err: errMsg(err) });
164
+ }
165
+ }
166
+ /** Returns the id of the currently-open LLM span for (session, run), or null. */
167
+ getActiveLlmSpanId(sessionKey, runId) {
168
+ return this.openSpans.get(spanKeyLlm(sessionKey, runId))?.id ?? null;
169
+ }
170
+ // ─── Tool lifecycle (hook path) ─────────────────────────────────────────
171
+ openToolSpan(input) {
172
+ try {
173
+ const parentSpanId = this.getActiveLlmSpanId(input.sessionKey, input.runId);
174
+ const seq = ++this.toolSeq;
175
+ const key = spanKeyTool(input.sessionKey, input.runId, input.toolCallId, input.toolName, seq);
176
+ // For toolCallId-keyed entries, silently discard any duplicate so we
177
+ // don't emit partial rows. The merge happens at after_tool_call.
178
+ if (input.toolCallId) {
179
+ const existing = this.openSpans.get(key);
180
+ if (existing) {
181
+ logger.debug("openToolSpan: discarding prior open span", {
182
+ toolCallId: input.toolCallId,
183
+ });
184
+ this.openSpans.delete(key);
185
+ }
186
+ }
187
+ const id = randomUUID();
188
+ this.openSpans.set(key, {
189
+ id,
190
+ spanType: "tool",
191
+ sessionKey: input.sessionKey,
192
+ runId: input.runId,
193
+ parentSpanId,
194
+ toolCallId: input.toolCallId,
195
+ startedAt: input.startedAt ?? this.now(),
196
+ correlationId: sanitizeCorrelationId(input.correlationId),
197
+ address: sanitizeAddress(input.address),
198
+ recipeName: sanitizeString(input.recipeName),
199
+ runtimeId: sanitizeString(input.runtimeId),
200
+ runtimeVersion: sanitizeString(input.runtimeVersion),
201
+ data: {
202
+ input: {
203
+ tool_name: input.toolName,
204
+ ...(input.toolInput !== undefined ? { params: input.toolInput } : {}),
205
+ },
206
+ },
207
+ emissionSource: input.emissionSource,
208
+ });
209
+ return id;
210
+ }
211
+ catch (err) {
212
+ logger.warn("openToolSpan failed", { err: errMsg(err) });
213
+ return "";
214
+ }
215
+ }
216
+ finalizeToolSpan(input) {
217
+ try {
218
+ // Find by toolCallId first; otherwise first matching tool-name key.
219
+ let foundKey;
220
+ if (input.toolCallId) {
221
+ const exactKey = spanKeyTool(input.sessionKey, input.runId, input.toolCallId, input.toolName, 0);
222
+ if (this.openSpans.has(exactKey)) {
223
+ foundKey = exactKey;
224
+ }
225
+ }
226
+ if (!foundKey) {
227
+ const prefix = `session:${input.sessionKey}:run:${input.runId}:tool:${input.toolName}:`;
228
+ for (const key of this.openSpans.keys()) {
229
+ if (key.startsWith(prefix)) {
230
+ foundKey = key;
231
+ break;
232
+ }
233
+ }
234
+ }
235
+ if (!foundKey) {
236
+ logger.warn("finalizeToolSpan: no open span", {
237
+ sessionKey: input.sessionKey,
238
+ toolName: input.toolName,
239
+ toolCallId: input.toolCallId,
240
+ });
241
+ return;
242
+ }
243
+ const open = this.openSpans.get(foundKey);
244
+ if (!open)
245
+ return;
246
+ this.openSpans.delete(foundKey);
247
+ const endedAt = this.now();
248
+ const data = { ...open.data };
249
+ if (input.error !== undefined) {
250
+ data.error = errMsg(input.error);
251
+ }
252
+ else if (input.output !== undefined) {
253
+ data.output =
254
+ input.output && typeof input.output === "object"
255
+ ? input.output
256
+ : { result: input.output };
257
+ }
258
+ this.transport.enqueue({
259
+ id: open.id,
260
+ correlationId: sanitizeCorrelationId(input.correlationId) ?? open.correlationId,
261
+ sessionKey: open.sessionKey,
262
+ runId: open.runId,
263
+ childSessionKey: null,
264
+ toolCallId: open.toolCallId,
265
+ parentSpanId: open.parentSpanId,
266
+ spanType: "tool",
267
+ emissionSource: open.emissionSource,
268
+ timestamp: endedAt,
269
+ address: sanitizeAddress(input.address) ?? open.address,
270
+ recipeName: sanitizeString(input.recipeName) ?? open.recipeName,
271
+ runtimeId: sanitizeString(input.runtimeId) ?? open.runtimeId,
272
+ runtimeVersion: sanitizeString(input.runtimeVersion) ?? open.runtimeVersion,
273
+ startedAt: open.startedAt,
274
+ endedAt,
275
+ durationMs: input.durationMs ?? Math.max(0, endedAt - open.startedAt),
276
+ model: null,
277
+ tokensIn: null,
278
+ tokensOut: null,
279
+ costUsd: null,
280
+ data,
281
+ });
282
+ }
283
+ catch (err) {
284
+ logger.warn("finalizeToolSpan failed", { err: errMsg(err) });
285
+ }
286
+ }
287
+ // ─── Subagent lifecycle (separate registry, keyed by childSessionKey) ───
288
+ openSubagentSpan(input) {
289
+ try {
290
+ const existing = this.openSubagents.get(input.childSessionKey);
291
+ if (existing) {
292
+ this.enqueueSubagentOrphan(existing, "subagent_spawning_replaces_active");
293
+ this.openSubagents.delete(input.childSessionKey);
294
+ }
295
+ const id = randomUUID();
296
+ this.openSubagents.set(input.childSessionKey, {
297
+ id,
298
+ hostSessionKey: input.hostSessionKey,
299
+ hostRunId: input.hostRunId,
300
+ childSessionKey: input.childSessionKey,
301
+ parentSpanId: input.parentSpanId,
302
+ startedAt: input.startedAt ?? this.now(),
303
+ correlationId: sanitizeCorrelationId(input.correlationId),
304
+ address: sanitizeAddress(input.address),
305
+ recipeName: sanitizeString(input.recipeName),
306
+ runtimeId: sanitizeString(input.runtimeId),
307
+ runtimeVersion: sanitizeString(input.runtimeVersion),
308
+ data: {
309
+ input: input.input,
310
+ status: "spawning",
311
+ },
312
+ });
313
+ return id;
314
+ }
315
+ catch (err) {
316
+ logger.warn("openSubagentSpan failed", { err: errMsg(err) });
317
+ return "";
318
+ }
319
+ }
320
+ /** Merge fields into an existing subagent (e.g., on _spawned, _delivery_target). Lazy-creates if missing. */
321
+ mergeSubagentSpan(input, context) {
322
+ try {
323
+ let open = this.openSubagents.get(input.childSessionKey);
324
+ if (!open) {
325
+ // Lazy-create: missed _spawning. Use what context we have.
326
+ const id = randomUUID();
327
+ open = {
328
+ id,
329
+ hostSessionKey: "",
330
+ hostRunId: "",
331
+ childSessionKey: input.childSessionKey,
332
+ parentSpanId: null,
333
+ startedAt: this.now(),
334
+ correlationId: sanitizeCorrelationId(context?.correlationId),
335
+ address: sanitizeAddress(context?.address),
336
+ recipeName: sanitizeString(context?.recipeName),
337
+ runtimeId: sanitizeString(context?.runtimeId),
338
+ runtimeVersion: sanitizeString(context?.runtimeVersion),
339
+ data: { status: input.status },
340
+ };
341
+ this.openSubagents.set(input.childSessionKey, open);
342
+ }
343
+ open.data.status = input.status;
344
+ if (input.patch) {
345
+ // shallow-merge any provided fields into the data root
346
+ for (const [k, v] of Object.entries(input.patch)) {
347
+ open.data[k] = v;
348
+ }
349
+ }
350
+ }
351
+ catch (err) {
352
+ logger.warn("mergeSubagentSpan failed", { err: errMsg(err) });
353
+ }
354
+ }
355
+ finalizeSubagentSpan(input, context) {
356
+ try {
357
+ const open = this.openSubagents.get(input.childSessionKey);
358
+ if (!open) {
359
+ logger.warn("finalizeSubagentSpan: no open subagent", {
360
+ childSessionKey: input.childSessionKey,
361
+ });
362
+ return;
363
+ }
364
+ this.openSubagents.delete(input.childSessionKey);
365
+ const endedAt = this.now();
366
+ const data = { ...open.data, status: input.status };
367
+ if (input.error !== undefined) {
368
+ data.output = { error: errMsg(input.error) };
369
+ }
370
+ else if (input.output !== undefined) {
371
+ data.output = input.output;
372
+ }
373
+ this.transport.enqueue({
374
+ id: open.id,
375
+ correlationId: sanitizeCorrelationId(context?.correlationId) ?? open.correlationId,
376
+ sessionKey: open.hostSessionKey,
377
+ runId: open.hostRunId,
378
+ childSessionKey: open.childSessionKey,
379
+ toolCallId: null,
380
+ parentSpanId: open.parentSpanId,
381
+ spanType: "subagent",
382
+ emissionSource: "hook",
383
+ timestamp: endedAt,
384
+ address: sanitizeAddress(context?.address) ?? open.address,
385
+ recipeName: sanitizeString(context?.recipeName) ?? open.recipeName,
386
+ runtimeId: sanitizeString(context?.runtimeId) ?? open.runtimeId,
387
+ runtimeVersion: sanitizeString(context?.runtimeVersion) ?? open.runtimeVersion,
388
+ startedAt: open.startedAt,
389
+ endedAt,
390
+ durationMs: Math.max(0, endedAt - open.startedAt),
391
+ model: null,
392
+ tokensIn: null,
393
+ tokensOut: null,
394
+ costUsd: null,
395
+ data,
396
+ });
397
+ }
398
+ catch (err) {
399
+ logger.warn("finalizeSubagentSpan failed", { err: errMsg(err) });
400
+ }
401
+ }
402
+ // ─── Agent end — emit marker + sweep orphans for this (session, run) ────
403
+ captureAgentEnd(input) {
404
+ try {
405
+ // Sweep orphans for this session/run.
406
+ const prefix = `session:${input.sessionKey}:run:${input.runId}:`;
407
+ const keysToSweep = [];
408
+ for (const key of this.openSpans.keys()) {
409
+ if (key.startsWith(prefix))
410
+ keysToSweep.push(key);
411
+ }
412
+ for (const key of keysToSweep) {
413
+ const open = this.openSpans.get(key);
414
+ if (open) {
415
+ this.enqueueOrphan(open, "agent_end_without_close");
416
+ this.openSpans.delete(key);
417
+ }
418
+ }
419
+ // Also sweep subagents hosted by this (session, run).
420
+ const subKeysToSweep = [];
421
+ for (const [k, sub] of this.openSubagents.entries()) {
422
+ if (sub.hostSessionKey === input.sessionKey && sub.hostRunId === input.runId) {
423
+ subKeysToSweep.push(k);
424
+ }
425
+ }
426
+ for (const k of subKeysToSweep) {
427
+ const sub = this.openSubagents.get(k);
428
+ if (sub) {
429
+ this.enqueueSubagentOrphan(sub, "agent_end_without_close");
430
+ this.openSubagents.delete(k);
431
+ }
432
+ }
433
+ const endedAt = this.now();
434
+ const data = {};
435
+ if (input.outcome !== undefined)
436
+ data.outcome = input.outcome;
437
+ if (input.error !== undefined)
438
+ data.error = errMsg(input.error);
439
+ this.transport.enqueue({
440
+ id: randomUUID(),
441
+ correlationId: sanitizeCorrelationId(input.correlationId),
442
+ sessionKey: input.sessionKey,
443
+ runId: input.runId,
444
+ childSessionKey: null,
445
+ toolCallId: null,
446
+ parentSpanId: null,
447
+ spanType: "agent_end",
448
+ emissionSource: "hook",
449
+ timestamp: endedAt,
450
+ address: sanitizeAddress(input.address),
451
+ recipeName: sanitizeString(input.recipeName),
452
+ runtimeId: sanitizeString(input.runtimeId),
453
+ runtimeVersion: sanitizeString(input.runtimeVersion),
454
+ startedAt: endedAt,
455
+ endedAt,
456
+ durationMs: 0,
457
+ model: null,
458
+ tokensIn: null,
459
+ tokensOut: null,
460
+ costUsd: null,
461
+ data,
462
+ });
463
+ }
464
+ catch (err) {
465
+ logger.warn("captureAgentEnd failed", { err: errMsg(err) });
466
+ }
467
+ }
468
+ // ─── Direct (manual) emission — for non-hook paths like AnthropicLlmDecision ──
469
+ captureLlmSpan(input) {
470
+ try {
471
+ const data = { input: input.input };
472
+ if (input.output !== undefined)
473
+ data.output = input.output;
474
+ if (input.error !== undefined)
475
+ data.error = errMsg(input.error);
476
+ this.transport.enqueue({
477
+ id: randomUUID(),
478
+ correlationId: sanitizeCorrelationId(input.correlationId),
479
+ sessionKey: input.sessionKey,
480
+ runId: input.runId,
481
+ childSessionKey: null,
482
+ toolCallId: null,
483
+ parentSpanId: input.parentSpanId ?? null,
484
+ spanType: "llm",
485
+ emissionSource: "direct",
486
+ timestamp: input.endedAt,
487
+ address: sanitizeAddress(input.address),
488
+ recipeName: sanitizeString(input.recipeName),
489
+ runtimeId: sanitizeString(input.runtimeId),
490
+ runtimeVersion: sanitizeString(input.runtimeVersion),
491
+ startedAt: input.startedAt,
492
+ endedAt: input.endedAt,
493
+ durationMs: Math.max(0, input.endedAt - input.startedAt),
494
+ model: sanitizeString(input.model),
495
+ tokensIn: sanitizeUint(input.tokensIn),
496
+ tokensOut: sanitizeUint(input.tokensOut),
497
+ costUsd: sanitizeFloat(input.costUsd),
498
+ data,
499
+ });
500
+ }
501
+ catch (err) {
502
+ logger.warn("captureLlmSpan failed", { err: errMsg(err) });
503
+ }
504
+ }
505
+ // ─── Maintenance ────────────────────────────────────────────────────────
506
+ sweepStale() {
507
+ try {
508
+ const cutoff = this.now() - this.staleTimeoutMs;
509
+ const keys = [];
510
+ for (const [k, open] of this.openSpans.entries()) {
511
+ if (open.startedAt < cutoff)
512
+ keys.push(k);
513
+ }
514
+ for (const k of keys) {
515
+ const open = this.openSpans.get(k);
516
+ if (open) {
517
+ this.enqueueOrphan(open, "stale_timeout");
518
+ this.openSpans.delete(k);
519
+ }
520
+ }
521
+ const subKeys = [];
522
+ for (const [k, sub] of this.openSubagents.entries()) {
523
+ if (sub.startedAt < cutoff)
524
+ subKeys.push(k);
525
+ }
526
+ for (const k of subKeys) {
527
+ const sub = this.openSubagents.get(k);
528
+ if (sub) {
529
+ this.enqueueSubagentOrphan(sub, "stale_timeout");
530
+ this.openSubagents.delete(k);
531
+ }
532
+ }
533
+ }
534
+ catch (err) {
535
+ logger.warn("sweepStale failed", { err: errMsg(err) });
536
+ }
537
+ }
538
+ async shutdown() {
539
+ if (this.sweepTimer) {
540
+ clearInterval(this.sweepTimer);
541
+ this.sweepTimer = null;
542
+ }
543
+ // Drain remaining open spans as orphans.
544
+ for (const [k, open] of this.openSpans.entries()) {
545
+ this.enqueueOrphan(open, "shutdown");
546
+ this.openSpans.delete(k);
547
+ }
548
+ for (const [k, sub] of this.openSubagents.entries()) {
549
+ this.enqueueSubagentOrphan(sub, "shutdown");
550
+ this.openSubagents.delete(k);
551
+ }
552
+ await this.transport.shutdown();
553
+ }
554
+ // ─── Internal: orphan enqueue helpers ───────────────────────────────────
555
+ enqueueOrphan(open, reason) {
556
+ const endedAt = this.now();
557
+ const data = { ...open.data, orphan_reason: reason };
558
+ const span = {
559
+ id: open.id,
560
+ correlationId: open.correlationId,
561
+ sessionKey: open.sessionKey,
562
+ runId: open.runId,
563
+ childSessionKey: null,
564
+ toolCallId: open.toolCallId,
565
+ parentSpanId: open.parentSpanId,
566
+ spanType: open.spanType,
567
+ emissionSource: open.emissionSource,
568
+ timestamp: endedAt,
569
+ address: open.address,
570
+ recipeName: open.recipeName,
571
+ runtimeId: open.runtimeId,
572
+ runtimeVersion: open.runtimeVersion,
573
+ startedAt: open.startedAt,
574
+ endedAt,
575
+ durationMs: Math.max(0, endedAt - open.startedAt),
576
+ model: null,
577
+ tokensIn: null,
578
+ tokensOut: null,
579
+ costUsd: null,
580
+ data,
581
+ };
582
+ this.transport.enqueue(span);
583
+ }
584
+ enqueueSubagentOrphan(open, reason) {
585
+ const endedAt = this.now();
586
+ const data = { ...open.data, orphan_reason: reason };
587
+ this.transport.enqueue({
588
+ id: open.id,
589
+ correlationId: open.correlationId,
590
+ sessionKey: open.hostSessionKey,
591
+ runId: open.hostRunId,
592
+ childSessionKey: open.childSessionKey,
593
+ toolCallId: null,
594
+ parentSpanId: open.parentSpanId,
595
+ spanType: "subagent",
596
+ emissionSource: "hook",
597
+ timestamp: endedAt,
598
+ address: open.address,
599
+ recipeName: open.recipeName,
600
+ runtimeId: open.runtimeId,
601
+ runtimeVersion: open.runtimeVersion,
602
+ startedAt: open.startedAt,
603
+ endedAt,
604
+ durationMs: Math.max(0, endedAt - open.startedAt),
605
+ model: null,
606
+ tokensIn: null,
607
+ tokensOut: null,
608
+ costUsd: null,
609
+ data,
610
+ });
611
+ }
612
+ }
613
+ function errMsg(err) {
614
+ return err instanceof Error ? err.message : String(err);
615
+ }
616
+ //# sourceMappingURL=span-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-tracker.js","sourceRoot":"","sources":["../../../src/tracking/spans/span-tracker.ts"],"names":[],"mappings":"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"}