@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,26 @@
1
+ /**
2
+ * registerSpanHooks: wires OpenClaw plugin hooks to SpanTracker.
3
+ *
4
+ * Subscribes to nine hooks total: llm_input, llm_output, before_tool_call,
5
+ * after_tool_call, subagent_spawning, subagent_spawned, subagent_delivery_target,
6
+ * subagent_ended, agent_end.
7
+ *
8
+ * Senpi-context fields (correlation_id, address, recipe_name, runtime_id,
9
+ * runtime_version) are read from request headers passed in agentCtx — see
10
+ * openclaw-llm-decision.ts for the matching header propagation.
11
+ *
12
+ * Handlers never throw — errors are caught and logged.
13
+ */
14
+ import type { SpanTracker } from "./span-tracker.js";
15
+ /** Minimal shape of the OpenClaw plugin API surface we need. */
16
+ export interface SpanHooksPluginApi {
17
+ on(hookName: string, handler: (...args: unknown[]) => void | Promise<void>, opts?: {
18
+ priority?: number;
19
+ }): void;
20
+ }
21
+ export interface RegisterSpanHooksOptions {
22
+ api: SpanHooksPluginApi;
23
+ tracker: SpanTracker;
24
+ }
25
+ export declare function registerSpanHooks(options: RegisterSpanHooksOptions): void;
26
+ //# sourceMappingURL=span-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-hooks.d.ts","sourceRoot":"","sources":["../../../src/tracking/spans/span-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,mBAAmB,CAAC;AAYxE,gEAAgE;AAChE,MAAM,WAAW,kBAAkB;IACjC,EAAE,CACA,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACrD,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3B,IAAI,CAAC;CACT;AAED,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,kBAAkB,CAAC;IACxB,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAmRzE"}
@@ -0,0 +1,365 @@
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
+ // ─── LLM ───────────────────────────────────────────────────────────────
7
+ api.on("llm_input", (event, agentCtx) => {
8
+ try {
9
+ const ctx = readContext(agentCtx);
10
+ const sessionKey = readSessionKey(agentCtx, event);
11
+ const runId = readRunId(agentCtx, event);
12
+ if (!sessionKey || !runId) {
13
+ logger.warn("llm_input missing sessionKey/runId; skipping span");
14
+ return;
15
+ }
16
+ tracker.openLlmSpan({
17
+ sessionKey,
18
+ runId,
19
+ emissionSource: "hook",
20
+ input: extractLlmInput(event),
21
+ ...ctx,
22
+ });
23
+ }
24
+ catch (err) {
25
+ logger.warn("llm_input handler failed", { err: errMsg(err) });
26
+ }
27
+ });
28
+ api.on("llm_output", (event, agentCtx) => {
29
+ try {
30
+ const ctx = readContext(agentCtx);
31
+ const sessionKey = readSessionKey(agentCtx, event);
32
+ const runId = readRunId(agentCtx, event);
33
+ if (!sessionKey || !runId) {
34
+ logger.warn("llm_output missing sessionKey/runId; skipping span");
35
+ return;
36
+ }
37
+ const out = extractLlmOutput(event);
38
+ tracker.finalizeLlmSpan({
39
+ sessionKey,
40
+ runId,
41
+ output: out.output,
42
+ model: out.model,
43
+ tokensIn: out.tokensIn,
44
+ tokensOut: out.tokensOut,
45
+ ...ctx,
46
+ });
47
+ }
48
+ catch (err) {
49
+ logger.warn("llm_output handler failed", { err: errMsg(err) });
50
+ }
51
+ });
52
+ // ─── Tool ──────────────────────────────────────────────────────────────
53
+ api.on("before_tool_call", (event, toolCtx) => {
54
+ try {
55
+ const ctx = readContext(toolCtx);
56
+ const sessionKey = readSessionKey(toolCtx, event);
57
+ const runId = readRunId(toolCtx, event);
58
+ if (!sessionKey || !runId) {
59
+ logger.warn("before_tool_call missing sessionKey/runId; skipping span");
60
+ return;
61
+ }
62
+ const evObj = asRecord(event);
63
+ const toolName = nonEmptyString(evObj?.toolName) ?? nonEmptyString(evObj?.name) ?? "unknown";
64
+ const toolCallId = nonEmptyString(evObj?.toolCallId) ??
65
+ nonEmptyString(asRecord(toolCtx)?.toolCallId) ??
66
+ null;
67
+ tracker.openToolSpan({
68
+ sessionKey,
69
+ runId,
70
+ emissionSource: "hook",
71
+ toolCallId,
72
+ toolName,
73
+ toolInput: asRecord(evObj?.params) ?? asRecord(evObj?.input),
74
+ ...ctx,
75
+ });
76
+ }
77
+ catch (err) {
78
+ logger.warn("before_tool_call handler failed", { err: errMsg(err) });
79
+ }
80
+ });
81
+ api.on("after_tool_call", (event, toolCtx) => {
82
+ try {
83
+ const ctx = readContext(toolCtx);
84
+ const sessionKey = readSessionKey(toolCtx, event);
85
+ const runId = readRunId(toolCtx, event);
86
+ if (!sessionKey || !runId) {
87
+ logger.warn("after_tool_call missing sessionKey/runId; skipping span");
88
+ return;
89
+ }
90
+ const evObj = asRecord(event);
91
+ const toolName = nonEmptyString(evObj?.toolName) ?? nonEmptyString(evObj?.name) ?? "unknown";
92
+ const toolCallId = nonEmptyString(evObj?.toolCallId) ??
93
+ nonEmptyString(asRecord(toolCtx)?.toolCallId) ??
94
+ null;
95
+ const error = evObj?.error;
96
+ const result = evObj?.result;
97
+ const durationMs = typeof evObj?.durationMs === "number" ? evObj.durationMs : undefined;
98
+ tracker.finalizeToolSpan({
99
+ sessionKey,
100
+ runId,
101
+ toolCallId,
102
+ toolName,
103
+ output: error !== undefined ? undefined : result,
104
+ error: error !== undefined ? error : undefined,
105
+ durationMs,
106
+ ...ctx,
107
+ });
108
+ }
109
+ catch (err) {
110
+ logger.warn("after_tool_call handler failed", { err: errMsg(err) });
111
+ }
112
+ });
113
+ // ─── Subagent (four hooks) ─────────────────────────────────────────────
114
+ api.on("subagent_spawning", (event, subagentCtx) => {
115
+ try {
116
+ const ctx = readContext(subagentCtx);
117
+ const evObj = asRecord(event);
118
+ const ctxObj = asRecord(subagentCtx);
119
+ const hostSessionKey = nonEmptyString(ctxObj?.requesterSessionKey) ??
120
+ nonEmptyString(ctxObj?.sessionKey) ??
121
+ "";
122
+ const hostRunId = nonEmptyString(ctxObj?.runId) ??
123
+ nonEmptyString(ctxObj?.requesterRunId) ??
124
+ "";
125
+ const childSessionKey = nonEmptyString(evObj?.childSessionKey) ??
126
+ nonEmptyString(ctxObj?.childSessionKey);
127
+ if (!childSessionKey) {
128
+ logger.warn("subagent_spawning missing childSessionKey; skipping span");
129
+ return;
130
+ }
131
+ const parentSpanId = hostSessionKey && hostRunId
132
+ ? tracker.getActiveLlmSpanId(hostSessionKey, hostRunId)
133
+ : null;
134
+ tracker.openSubagentSpan({
135
+ hostSessionKey,
136
+ hostRunId,
137
+ childSessionKey,
138
+ parentSpanId,
139
+ input: {
140
+ agentId: evObj?.agentId,
141
+ label: evObj?.label,
142
+ mode: evObj?.mode,
143
+ requester: evObj?.requester,
144
+ threadRequested: evObj?.threadRequested,
145
+ },
146
+ ...ctx,
147
+ });
148
+ }
149
+ catch (err) {
150
+ logger.warn("subagent_spawning handler failed", { err: errMsg(err) });
151
+ }
152
+ });
153
+ api.on("subagent_spawned", (event, subagentCtx) => {
154
+ try {
155
+ const ctx = readContext(subagentCtx);
156
+ const evObj = asRecord(event);
157
+ const ctxObj = asRecord(subagentCtx);
158
+ const childSessionKey = nonEmptyString(evObj?.childSessionKey) ??
159
+ nonEmptyString(ctxObj?.childSessionKey);
160
+ if (!childSessionKey)
161
+ return;
162
+ tracker.mergeSubagentSpan({
163
+ childSessionKey,
164
+ status: "spawned",
165
+ patch: {
166
+ runId: nonEmptyString(evObj?.runId) ?? nonEmptyString(ctxObj?.runId),
167
+ agentId: evObj?.agentId,
168
+ mode: evObj?.mode,
169
+ threadRequested: evObj?.threadRequested,
170
+ },
171
+ }, ctx);
172
+ }
173
+ catch (err) {
174
+ logger.warn("subagent_spawned handler failed", { err: errMsg(err) });
175
+ }
176
+ });
177
+ api.on("subagent_delivery_target", (event, subagentCtx) => {
178
+ try {
179
+ const ctx = readContext(subagentCtx);
180
+ const evObj = asRecord(event);
181
+ const ctxObj = asRecord(subagentCtx);
182
+ const childSessionKey = nonEmptyString(evObj?.childSessionKey) ??
183
+ nonEmptyString(ctxObj?.childSessionKey);
184
+ if (!childSessionKey)
185
+ return;
186
+ const requesterOrigin = asRecord(evObj?.requesterOrigin) ?? {};
187
+ tracker.mergeSubagentSpan({
188
+ childSessionKey,
189
+ status: "delivery_target",
190
+ patch: {
191
+ delivery: {
192
+ channel: nonEmptyString(requesterOrigin.channel),
193
+ accountId: nonEmptyString(requesterOrigin.accountId),
194
+ to: nonEmptyString(requesterOrigin.to),
195
+ threadId: requesterOrigin.threadId,
196
+ childRunId: nonEmptyString(evObj?.childRunId),
197
+ spawnMode: nonEmptyString(evObj?.spawnMode),
198
+ expectsCompletionMessage: typeof evObj?.expectsCompletionMessage === "boolean"
199
+ ? evObj.expectsCompletionMessage
200
+ : undefined,
201
+ },
202
+ },
203
+ }, ctx);
204
+ }
205
+ catch (err) {
206
+ logger.warn("subagent_delivery_target handler failed", { err: errMsg(err) });
207
+ }
208
+ });
209
+ api.on("subagent_ended", (event, subagentCtx) => {
210
+ try {
211
+ const ctx = readContext(subagentCtx);
212
+ const evObj = asRecord(event);
213
+ const ctxObj = asRecord(subagentCtx);
214
+ const childSessionKey = nonEmptyString(evObj?.targetSessionKey) ??
215
+ nonEmptyString(ctxObj?.childSessionKey) ??
216
+ nonEmptyString(evObj?.childSessionKey);
217
+ if (!childSessionKey)
218
+ return;
219
+ const error = evObj?.error;
220
+ tracker.finalizeSubagentSpan({
221
+ childSessionKey,
222
+ status: "ended",
223
+ output: error === undefined
224
+ ? {
225
+ outcome: evObj?.outcome,
226
+ reason: evObj?.reason,
227
+ }
228
+ : undefined,
229
+ error: error !== undefined ? error : undefined,
230
+ }, ctx);
231
+ }
232
+ catch (err) {
233
+ logger.warn("subagent_ended handler failed", { err: errMsg(err) });
234
+ }
235
+ });
236
+ // ─── Agent end (sweep orphans + emit marker) ───────────────────────────
237
+ api.on("agent_end", (event, agentCtx) => {
238
+ try {
239
+ const ctx = readContext(agentCtx);
240
+ const sessionKey = readSessionKey(agentCtx, event);
241
+ const runId = readRunId(agentCtx, event);
242
+ if (!sessionKey || !runId) {
243
+ logger.warn("agent_end missing sessionKey/runId; skipping marker");
244
+ return;
245
+ }
246
+ const evObj = asRecord(event);
247
+ tracker.captureAgentEnd({
248
+ sessionKey,
249
+ runId,
250
+ outcome: evObj?.outcome,
251
+ error: evObj?.error,
252
+ ...ctx,
253
+ });
254
+ }
255
+ catch (err) {
256
+ logger.warn("agent_end handler failed", { err: errMsg(err) });
257
+ }
258
+ });
259
+ }
260
+ // ─── Helpers ──────────────────────────────────────────────────────────────
261
+ function asRecord(v) {
262
+ if (v && typeof v === "object" && !Array.isArray(v)) {
263
+ return v;
264
+ }
265
+ return undefined;
266
+ }
267
+ function nonEmptyString(v) {
268
+ return typeof v === "string" && v.length > 0 ? v : undefined;
269
+ }
270
+ /**
271
+ * Pull senpi-context headers out of agentCtx. Several common locations are
272
+ * checked because the exact shape depends on OpenClaw's runtime extension SDK.
273
+ */
274
+ function readContext(agentCtx) {
275
+ const headers = readHeaders(agentCtx);
276
+ return {
277
+ correlationId: headers[HEADER_CORRELATION_ID] ?? null,
278
+ address: headers[HEADER_ADDRESS] ?? null,
279
+ recipeName: headers[HEADER_RECIPE_NAME] ?? null,
280
+ runtimeId: headers[HEADER_RUNTIME_ID] ?? null,
281
+ runtimeVersion: headers[HEADER_RUNTIME_VERSION] ?? null,
282
+ };
283
+ }
284
+ function readHeaders(agentCtx) {
285
+ const ctxObj = asRecord(agentCtx);
286
+ if (!ctxObj)
287
+ return {};
288
+ const candidates = [
289
+ asRecord(ctxObj.headers),
290
+ asRecord(asRecord(ctxObj.request)?.headers),
291
+ asRecord(ctxObj.requestHeaders),
292
+ asRecord(asRecord(ctxObj.meta)?.headers),
293
+ ];
294
+ const out = {};
295
+ for (const candidate of candidates) {
296
+ if (!candidate)
297
+ continue;
298
+ for (const [k, v] of Object.entries(candidate)) {
299
+ // HTTP headers should be case-insensitive; normalize to lowercase.
300
+ const lk = k.toLowerCase();
301
+ if (typeof v === "string" && v.length > 0 && out[lk] === undefined) {
302
+ out[lk] = v;
303
+ }
304
+ else if (Array.isArray(v) && v.length > 0 && typeof v[0] === "string") {
305
+ out[lk] = v[0];
306
+ }
307
+ }
308
+ }
309
+ return out;
310
+ }
311
+ function readSessionKey(ctx, event) {
312
+ return (nonEmptyString(asRecord(ctx)?.sessionKey) ??
313
+ nonEmptyString(asRecord(ctx)?.sessionId) ??
314
+ nonEmptyString(asRecord(event)?.sessionKey) ??
315
+ nonEmptyString(asRecord(event)?.sessionId));
316
+ }
317
+ function readRunId(ctx, event) {
318
+ return (nonEmptyString(asRecord(ctx)?.runId) ??
319
+ nonEmptyString(asRecord(event)?.runId));
320
+ }
321
+ function extractLlmInput(event) {
322
+ const ev = asRecord(event);
323
+ if (!ev)
324
+ return {};
325
+ return {
326
+ system: ev.systemPrompt ?? ev.system,
327
+ prompt: ev.prompt,
328
+ messages: ev.historyMessages ?? ev.messages,
329
+ model: ev.model,
330
+ provider: ev.provider,
331
+ imagesCount: ev.imagesCount,
332
+ temperature: ev.temperature,
333
+ maxTokens: ev.maxTokens,
334
+ tools: ev.tools,
335
+ };
336
+ }
337
+ function extractLlmOutput(event) {
338
+ const ev = asRecord(event);
339
+ if (!ev)
340
+ return { model: null, tokensIn: null, tokensOut: null };
341
+ const usage = asRecord(ev.usage);
342
+ return {
343
+ output: {
344
+ assistantTexts: ev.assistantTexts,
345
+ lastAssistant: ev.lastAssistant,
346
+ content: ev.content,
347
+ finishReason: ev.finishReason ?? ev.stopReason,
348
+ },
349
+ model: nonEmptyString(ev.model) ?? null,
350
+ tokensIn: typeof usage?.input_tokens === "number"
351
+ ? usage.input_tokens
352
+ : typeof usage?.promptTokens === "number"
353
+ ? usage.promptTokens
354
+ : null,
355
+ tokensOut: typeof usage?.output_tokens === "number"
356
+ ? usage.output_tokens
357
+ : typeof usage?.completionTokens === "number"
358
+ ? usage.completionTokens
359
+ : null,
360
+ };
361
+ }
362
+ function errMsg(err) {
363
+ return err instanceof Error ? err.message : String(err);
364
+ }
365
+ //# 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":"AAqBA,OAAO,KAAK,EACV,cAAc,EAGd,aAAa,EAEd,MAAM,YAAY,CAAC;AAYpB,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAsB,SAAQ,iBAAiB;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAc,SAAQ,iBAAiB;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA0CD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,aAAa,CAAC;IACzB,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4EAA4E;IAC5E,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuC;IACrE,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,UAAU,CAA+C;gBAErD,OAAO,EAAE,kBAAkB;IAiBvC,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM;IAgC5C,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI;IAmDlD,iFAAiF;IACjF,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMpE,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM;IAmD9C,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI;IAkFpD,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM;IAgClD,6GAA6G;IAC7G,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,IAAI;IAkC/E,oBAAoB,CAAC,KAAK,EAAE,qBAAqB,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,IAAI;IAoDrF,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAkE3C,cAAc,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAqC/C,UAAU,IAAI,IAAI;IA8BZ,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB/B,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,qBAAqB;CA4B9B"}