@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,399 @@
1
+ import { HEADER_ADDRESS, HEADER_CORRELATION_ID, HEADER_RECIPE_NAME, HEADER_RUNTIME_ID, HEADER_RUNTIME_VERSION, } from "./constants.js";
2
+ import { createLogger } from "../../utils/logger.js";
3
+ const logger = createLogger("[senpi-core][span-hooks]");
4
+ export function registerSpanHooks(options) {
5
+ const { api, tracker } = options;
6
+ // Tool hooks often arrive with a ctx that lacks sessionKey/runId — OpenClaw
7
+ // doesn't always thread the host agent's identity through to tool calls.
8
+ // Mirror opik's fallback strategy: remember (agentId → sessionKey/runId)
9
+ // from llm_input, and the last seen pair, so tool hooks can resolve them.
10
+ const sessionByAgentId = new Map();
11
+ let lastActive = null;
12
+ const rememberSession = (agentCtx, sessionKey, runId) => {
13
+ const agentId = nonEmptyString(asRecord(agentCtx)?.agentId);
14
+ if (agentId)
15
+ sessionByAgentId.set(agentId, { sessionKey, runId });
16
+ lastActive = { sessionKey, runId };
17
+ };
18
+ const resolveToolSession = (ctx) => {
19
+ const direct = {
20
+ sessionKey: readSessionKey(ctx, undefined),
21
+ runId: readRunId(ctx, undefined),
22
+ };
23
+ if (direct.sessionKey && direct.runId) {
24
+ return { sessionKey: direct.sessionKey, runId: direct.runId };
25
+ }
26
+ const agentId = nonEmptyString(asRecord(ctx)?.agentId);
27
+ if (agentId) {
28
+ const hit = sessionByAgentId.get(agentId);
29
+ if (hit)
30
+ return hit;
31
+ }
32
+ return lastActive;
33
+ };
34
+ // ─── LLM ───────────────────────────────────────────────────────────────
35
+ api.on("llm_input", (event, agentCtx) => {
36
+ try {
37
+ const ctx = readContext(agentCtx);
38
+ const sessionKey = readSessionKey(agentCtx, event);
39
+ const runId = readRunId(agentCtx, event);
40
+ if (!sessionKey || !runId) {
41
+ logger.warn("llm_input missing sessionKey/runId; skipping span");
42
+ return;
43
+ }
44
+ rememberSession(agentCtx, sessionKey, runId);
45
+ tracker.openLlmSpan({
46
+ sessionKey,
47
+ runId,
48
+ emissionSource: "hook",
49
+ input: extractLlmInput(event),
50
+ ...ctx,
51
+ });
52
+ }
53
+ catch (err) {
54
+ logger.warn("llm_input handler failed", { err: errMsg(err) });
55
+ }
56
+ });
57
+ api.on("llm_output", (event, agentCtx) => {
58
+ try {
59
+ const ctx = readContext(agentCtx);
60
+ const sessionKey = readSessionKey(agentCtx, event);
61
+ const runId = readRunId(agentCtx, event);
62
+ if (!sessionKey || !runId) {
63
+ logger.warn("llm_output missing sessionKey/runId; skipping span");
64
+ return;
65
+ }
66
+ rememberSession(agentCtx, sessionKey, runId);
67
+ const out = extractLlmOutput(event);
68
+ tracker.finalizeLlmSpan({
69
+ sessionKey,
70
+ runId,
71
+ output: out.output,
72
+ model: out.model,
73
+ tokensIn: out.tokensIn,
74
+ tokensOut: out.tokensOut,
75
+ ...ctx,
76
+ });
77
+ }
78
+ catch (err) {
79
+ logger.warn("llm_output handler failed", { err: errMsg(err) });
80
+ }
81
+ });
82
+ // ─── Tool ──────────────────────────────────────────────────────────────
83
+ // OpenClaw's tool-hook context often omits sessionKey/runId. Fall back to
84
+ // (agentId → session/run) learned from the most recent llm_input, then to
85
+ // the last-active pair, matching opik's strategy.
86
+ api.on("before_tool_call", (event, toolCtx) => {
87
+ try {
88
+ const ctx = readContext(toolCtx);
89
+ const resolved = resolveToolSession(toolCtx);
90
+ if (!resolved) {
91
+ logger.debug("before_tool_call sessionKey/runId unresolved (no llm_input seen yet); skipping");
92
+ return;
93
+ }
94
+ const evObj = asRecord(event);
95
+ const toolName = nonEmptyString(evObj?.toolName) ?? nonEmptyString(evObj?.name) ?? "unknown";
96
+ const toolCallId = nonEmptyString(evObj?.toolCallId) ??
97
+ nonEmptyString(asRecord(toolCtx)?.toolCallId) ??
98
+ null;
99
+ tracker.openToolSpan({
100
+ sessionKey: resolved.sessionKey,
101
+ runId: resolved.runId,
102
+ emissionSource: "hook",
103
+ toolCallId,
104
+ toolName,
105
+ toolInput: asRecord(evObj?.params) ?? asRecord(evObj?.input),
106
+ ...ctx,
107
+ });
108
+ }
109
+ catch (err) {
110
+ logger.warn("before_tool_call handler failed", { err: errMsg(err) });
111
+ }
112
+ });
113
+ api.on("after_tool_call", (event, toolCtx) => {
114
+ try {
115
+ const ctx = readContext(toolCtx);
116
+ const resolved = resolveToolSession(toolCtx);
117
+ if (!resolved) {
118
+ logger.debug("after_tool_call sessionKey/runId unresolved (no llm_input seen yet); skipping");
119
+ return;
120
+ }
121
+ const evObj = asRecord(event);
122
+ const toolName = nonEmptyString(evObj?.toolName) ?? nonEmptyString(evObj?.name) ?? "unknown";
123
+ const toolCallId = nonEmptyString(evObj?.toolCallId) ??
124
+ nonEmptyString(asRecord(toolCtx)?.toolCallId) ??
125
+ null;
126
+ const error = evObj?.error;
127
+ const result = evObj?.result;
128
+ const durationMs = typeof evObj?.durationMs === "number" ? evObj.durationMs : undefined;
129
+ tracker.finalizeToolSpan({
130
+ sessionKey: resolved.sessionKey,
131
+ runId: resolved.runId,
132
+ toolCallId,
133
+ toolName,
134
+ output: error !== undefined ? undefined : result,
135
+ error: error !== undefined ? error : undefined,
136
+ durationMs,
137
+ ...ctx,
138
+ });
139
+ }
140
+ catch (err) {
141
+ logger.warn("after_tool_call handler failed", { err: errMsg(err) });
142
+ }
143
+ });
144
+ // ─── Subagent (four hooks) ─────────────────────────────────────────────
145
+ api.on("subagent_spawning", (event, subagentCtx) => {
146
+ try {
147
+ const ctx = readContext(subagentCtx);
148
+ const evObj = asRecord(event);
149
+ const ctxObj = asRecord(subagentCtx);
150
+ const hostSessionKey = nonEmptyString(ctxObj?.requesterSessionKey) ??
151
+ nonEmptyString(ctxObj?.sessionKey) ??
152
+ "";
153
+ const hostRunId = nonEmptyString(ctxObj?.runId) ??
154
+ nonEmptyString(ctxObj?.requesterRunId) ??
155
+ "";
156
+ const childSessionKey = nonEmptyString(evObj?.childSessionKey) ??
157
+ nonEmptyString(ctxObj?.childSessionKey);
158
+ if (!childSessionKey) {
159
+ logger.warn("subagent_spawning missing childSessionKey; skipping span");
160
+ return;
161
+ }
162
+ const parentSpanId = hostSessionKey && hostRunId
163
+ ? tracker.getActiveLlmSpanId(hostSessionKey, hostRunId)
164
+ : null;
165
+ tracker.openSubagentSpan({
166
+ hostSessionKey,
167
+ hostRunId,
168
+ childSessionKey,
169
+ parentSpanId,
170
+ input: {
171
+ agentId: evObj?.agentId,
172
+ label: evObj?.label,
173
+ mode: evObj?.mode,
174
+ requester: evObj?.requester,
175
+ threadRequested: evObj?.threadRequested,
176
+ },
177
+ ...ctx,
178
+ });
179
+ }
180
+ catch (err) {
181
+ logger.warn("subagent_spawning handler failed", { err: errMsg(err) });
182
+ }
183
+ });
184
+ api.on("subagent_spawned", (event, subagentCtx) => {
185
+ try {
186
+ const ctx = readContext(subagentCtx);
187
+ const evObj = asRecord(event);
188
+ const ctxObj = asRecord(subagentCtx);
189
+ const childSessionKey = nonEmptyString(evObj?.childSessionKey) ??
190
+ nonEmptyString(ctxObj?.childSessionKey);
191
+ if (!childSessionKey)
192
+ return;
193
+ tracker.mergeSubagentSpan({
194
+ childSessionKey,
195
+ status: "spawned",
196
+ patch: {
197
+ runId: nonEmptyString(evObj?.runId) ?? nonEmptyString(ctxObj?.runId),
198
+ agentId: evObj?.agentId,
199
+ mode: evObj?.mode,
200
+ threadRequested: evObj?.threadRequested,
201
+ },
202
+ }, ctx);
203
+ }
204
+ catch (err) {
205
+ logger.warn("subagent_spawned handler failed", { err: errMsg(err) });
206
+ }
207
+ });
208
+ api.on("subagent_delivery_target", (event, subagentCtx) => {
209
+ try {
210
+ const ctx = readContext(subagentCtx);
211
+ const evObj = asRecord(event);
212
+ const ctxObj = asRecord(subagentCtx);
213
+ const childSessionKey = nonEmptyString(evObj?.childSessionKey) ??
214
+ nonEmptyString(ctxObj?.childSessionKey);
215
+ if (!childSessionKey)
216
+ return;
217
+ const requesterOrigin = asRecord(evObj?.requesterOrigin) ?? {};
218
+ tracker.mergeSubagentSpan({
219
+ childSessionKey,
220
+ status: "delivery_target",
221
+ patch: {
222
+ delivery: {
223
+ channel: nonEmptyString(requesterOrigin.channel),
224
+ accountId: nonEmptyString(requesterOrigin.accountId),
225
+ to: nonEmptyString(requesterOrigin.to),
226
+ threadId: requesterOrigin.threadId,
227
+ childRunId: nonEmptyString(evObj?.childRunId),
228
+ spawnMode: nonEmptyString(evObj?.spawnMode),
229
+ expectsCompletionMessage: typeof evObj?.expectsCompletionMessage === "boolean"
230
+ ? evObj.expectsCompletionMessage
231
+ : undefined,
232
+ },
233
+ },
234
+ }, ctx);
235
+ }
236
+ catch (err) {
237
+ logger.warn("subagent_delivery_target handler failed", { err: errMsg(err) });
238
+ }
239
+ });
240
+ api.on("subagent_ended", (event, subagentCtx) => {
241
+ try {
242
+ const ctx = readContext(subagentCtx);
243
+ const evObj = asRecord(event);
244
+ const ctxObj = asRecord(subagentCtx);
245
+ const childSessionKey = nonEmptyString(evObj?.targetSessionKey) ??
246
+ nonEmptyString(ctxObj?.childSessionKey) ??
247
+ nonEmptyString(evObj?.childSessionKey);
248
+ if (!childSessionKey)
249
+ return;
250
+ const error = evObj?.error;
251
+ tracker.finalizeSubagentSpan({
252
+ childSessionKey,
253
+ status: "ended",
254
+ output: error === undefined
255
+ ? {
256
+ outcome: evObj?.outcome,
257
+ reason: evObj?.reason,
258
+ }
259
+ : undefined,
260
+ error: error !== undefined ? error : undefined,
261
+ }, ctx);
262
+ }
263
+ catch (err) {
264
+ logger.warn("subagent_ended handler failed", { err: errMsg(err) });
265
+ }
266
+ });
267
+ // ─── Agent end (sweep orphans + emit marker) ───────────────────────────
268
+ api.on("agent_end", (event, agentCtx) => {
269
+ try {
270
+ const ctx = readContext(agentCtx);
271
+ const sessionKey = readSessionKey(agentCtx, event);
272
+ const runId = readRunId(agentCtx, event);
273
+ if (!sessionKey || !runId) {
274
+ logger.warn("agent_end missing sessionKey/runId; skipping marker");
275
+ return;
276
+ }
277
+ const evObj = asRecord(event);
278
+ tracker.captureAgentEnd({
279
+ sessionKey,
280
+ runId,
281
+ outcome: evObj?.outcome,
282
+ error: evObj?.error,
283
+ ...ctx,
284
+ });
285
+ }
286
+ catch (err) {
287
+ logger.warn("agent_end handler failed", { err: errMsg(err) });
288
+ }
289
+ });
290
+ }
291
+ // ─── Helpers ──────────────────────────────────────────────────────────────
292
+ function asRecord(v) {
293
+ if (v && typeof v === "object" && !Array.isArray(v)) {
294
+ return v;
295
+ }
296
+ return undefined;
297
+ }
298
+ function nonEmptyString(v) {
299
+ return typeof v === "string" && v.length > 0 ? v : undefined;
300
+ }
301
+ /**
302
+ * Pull senpi-context headers out of agentCtx. Several common locations are
303
+ * checked because the exact shape depends on OpenClaw's runtime extension SDK.
304
+ */
305
+ function readContext(agentCtx) {
306
+ const headers = readHeaders(agentCtx);
307
+ return {
308
+ correlationId: headers[HEADER_CORRELATION_ID] ?? null,
309
+ address: headers[HEADER_ADDRESS] ?? null,
310
+ recipeName: headers[HEADER_RECIPE_NAME] ?? null,
311
+ runtimeId: headers[HEADER_RUNTIME_ID] ?? null,
312
+ runtimeVersion: headers[HEADER_RUNTIME_VERSION] ?? null,
313
+ };
314
+ }
315
+ function readHeaders(agentCtx) {
316
+ const ctxObj = asRecord(agentCtx);
317
+ if (!ctxObj)
318
+ return {};
319
+ const candidates = [
320
+ asRecord(ctxObj.headers),
321
+ asRecord(asRecord(ctxObj.request)?.headers),
322
+ asRecord(ctxObj.requestHeaders),
323
+ asRecord(asRecord(ctxObj.meta)?.headers),
324
+ ];
325
+ const out = {};
326
+ for (const candidate of candidates) {
327
+ if (!candidate)
328
+ continue;
329
+ for (const [k, v] of Object.entries(candidate)) {
330
+ // HTTP headers should be case-insensitive; normalize to lowercase.
331
+ const lk = k.toLowerCase();
332
+ if (typeof v === "string" && v.length > 0 && out[lk] === undefined) {
333
+ out[lk] = v;
334
+ }
335
+ else if (Array.isArray(v) && v.length > 0 && typeof v[0] === "string") {
336
+ out[lk] = v[0];
337
+ }
338
+ }
339
+ }
340
+ return out;
341
+ }
342
+ function readSessionKey(ctx, event) {
343
+ return (nonEmptyString(asRecord(ctx)?.sessionKey) ??
344
+ nonEmptyString(asRecord(ctx)?.sessionId) ??
345
+ nonEmptyString(asRecord(event)?.sessionKey) ??
346
+ nonEmptyString(asRecord(event)?.sessionId));
347
+ }
348
+ function readRunId(ctx, event) {
349
+ return (nonEmptyString(asRecord(ctx)?.runId) ??
350
+ nonEmptyString(asRecord(event)?.runId));
351
+ }
352
+ function extractLlmInput(event) {
353
+ const ev = asRecord(event);
354
+ if (!ev)
355
+ return {};
356
+ return {
357
+ system: ev.systemPrompt ?? ev.system,
358
+ prompt: ev.prompt,
359
+ messages: ev.historyMessages ?? ev.messages,
360
+ model: ev.model,
361
+ provider: ev.provider,
362
+ imagesCount: ev.imagesCount,
363
+ temperature: ev.temperature,
364
+ maxTokens: ev.maxTokens,
365
+ tools: ev.tools,
366
+ };
367
+ }
368
+ function extractLlmOutput(event) {
369
+ const ev = asRecord(event);
370
+ if (!ev)
371
+ return { model: null, tokensIn: null, tokensOut: null };
372
+ const usage = asRecord(ev.usage);
373
+ return {
374
+ output: {
375
+ assistantTexts: ev.assistantTexts,
376
+ lastAssistant: ev.lastAssistant,
377
+ content: ev.content,
378
+ finishReason: ev.finishReason ?? ev.stopReason,
379
+ },
380
+ model: nonEmptyString(ev.model) ?? null,
381
+ // Token field naming varies by provider:
382
+ // Anthropic → input_tokens / output_tokens
383
+ // OpenAI → promptTokens / completionTokens
384
+ // OpenClaw/Gemini → input / output
385
+ tokensIn: firstNumber(usage?.input_tokens, usage?.promptTokens, usage?.input),
386
+ tokensOut: firstNumber(usage?.output_tokens, usage?.completionTokens, usage?.output),
387
+ };
388
+ }
389
+ function firstNumber(...values) {
390
+ for (const v of values) {
391
+ if (typeof v === "number" && Number.isFinite(v))
392
+ return v;
393
+ }
394
+ return null;
395
+ }
396
+ function errMsg(err) {
397
+ return err instanceof Error ? err.message : String(err);
398
+ }
399
+ //# sourceMappingURL=span-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-hooks.js","sourceRoot":"","sources":["../../../src/tracking/spans/span-hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ import type { EmissionSource, SpanTransport } from "./types.js";
2
+ export interface SpanContextFields {
3
+ correlationId?: string | null;
4
+ address?: string | null;
5
+ recipeName?: string | null;
6
+ runtimeId?: string | null;
7
+ runtimeVersion?: string | null;
8
+ }
9
+ export interface OpenLlmSpanInput extends SpanContextFields {
10
+ sessionKey: string;
11
+ runId: string;
12
+ emissionSource: EmissionSource;
13
+ startedAt?: number;
14
+ input: Record<string, unknown>;
15
+ }
16
+ export interface FinalizeLlmSpanInput extends SpanContextFields {
17
+ sessionKey: string;
18
+ runId: string;
19
+ output?: Record<string, unknown>;
20
+ error?: unknown;
21
+ model?: string | null;
22
+ tokensIn?: number | null;
23
+ tokensOut?: number | null;
24
+ costUsd?: number | null;
25
+ }
26
+ export interface OpenToolSpanInput extends SpanContextFields {
27
+ sessionKey: string;
28
+ runId: string;
29
+ emissionSource: EmissionSource;
30
+ toolCallId: string | null;
31
+ toolName: string;
32
+ toolInput?: Record<string, unknown>;
33
+ startedAt?: number;
34
+ }
35
+ export interface FinalizeToolSpanInput extends SpanContextFields {
36
+ sessionKey: string;
37
+ runId: string;
38
+ toolCallId: string | null;
39
+ toolName: string;
40
+ output?: unknown;
41
+ error?: unknown;
42
+ durationMs?: number;
43
+ }
44
+ export interface DirectLlmSpanInput extends SpanContextFields {
45
+ sessionKey: string;
46
+ runId: string;
47
+ startedAt: number;
48
+ endedAt: number;
49
+ model?: string | null;
50
+ tokensIn?: number | null;
51
+ tokensOut?: number | null;
52
+ costUsd?: number | null;
53
+ input: Record<string, unknown>;
54
+ output?: Record<string, unknown>;
55
+ error?: unknown;
56
+ parentSpanId?: string | null;
57
+ }
58
+ export interface OpenSubagentInput extends SpanContextFields {
59
+ hostSessionKey: string;
60
+ hostRunId: string;
61
+ childSessionKey: string;
62
+ parentSpanId: string | null;
63
+ input: Record<string, unknown>;
64
+ startedAt?: number;
65
+ }
66
+ export interface MergeSubagentInput {
67
+ childSessionKey: string;
68
+ /** Status to record (e.g., "spawned", "delivery_target"). */
69
+ status: string;
70
+ /** Additional fields to merge into `data` (e.g., delivery metadata). */
71
+ patch?: Record<string, unknown>;
72
+ }
73
+ export interface FinalizeSubagentInput {
74
+ childSessionKey: string;
75
+ status: string;
76
+ output?: Record<string, unknown>;
77
+ error?: unknown;
78
+ }
79
+ export interface AgentEndInput extends SpanContextFields {
80
+ sessionKey: string;
81
+ runId: string;
82
+ outcome?: unknown;
83
+ error?: unknown;
84
+ }
85
+ export interface SpanTrackerOptions {
86
+ transport: SpanTransport;
87
+ /** Override Date.now for tests. */
88
+ now?: () => number;
89
+ staleTimeoutMs?: number;
90
+ sweepIntervalMs?: number;
91
+ /** Start the periodic stale sweeper. Set false in tests for determinism. */
92
+ enableSweeper?: boolean;
93
+ }
94
+ export declare class SpanTracker {
95
+ private readonly transport;
96
+ private readonly now;
97
+ private readonly staleTimeoutMs;
98
+ private readonly openSpans;
99
+ private readonly openSubagents;
100
+ private toolSeq;
101
+ private sweepTimer;
102
+ constructor(options: SpanTrackerOptions);
103
+ openLlmSpan(input: OpenLlmSpanInput): string;
104
+ finalizeLlmSpan(input: FinalizeLlmSpanInput): void;
105
+ /** Returns the id of the currently-open LLM span for (session, run), or null. */
106
+ getActiveLlmSpanId(sessionKey: string, runId: string): string | null;
107
+ openToolSpan(input: OpenToolSpanInput): string;
108
+ finalizeToolSpan(input: FinalizeToolSpanInput): void;
109
+ openSubagentSpan(input: OpenSubagentInput): string;
110
+ /** Merge fields into an existing subagent (e.g., on _spawned, _delivery_target). Lazy-creates if missing. */
111
+ mergeSubagentSpan(input: MergeSubagentInput, context?: SpanContextFields): void;
112
+ finalizeSubagentSpan(input: FinalizeSubagentInput, context?: SpanContextFields): void;
113
+ captureAgentEnd(input: AgentEndInput): void;
114
+ captureLlmSpan(input: DirectLlmSpanInput): void;
115
+ sweepStale(): void;
116
+ shutdown(): Promise<void>;
117
+ private enqueueOrphan;
118
+ private enqueueSubagentOrphan;
119
+ }
120
+ //# sourceMappingURL=span-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-tracker.d.ts","sourceRoot":"","sources":["../../../src/tracking/spans/span-tracker.ts"],"names":[],"mappings":"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"}