@senpi/runtime 1.1.0-dev.runtime-phase-2.20260514144638 → 1.1.0-dev.runtime-phase-2.20260519120952

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