trodo-node 1.2.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +182 -2
  2. package/dist/cjs/TrodoClient.js +85 -102
  3. package/dist/cjs/TrodoClient.js.map +1 -1
  4. package/dist/cjs/api/ApiClient.js +20 -2
  5. package/dist/cjs/api/ApiClient.js.map +1 -1
  6. package/dist/cjs/api/endpoints.js +7 -1
  7. package/dist/cjs/api/endpoints.js.map +1 -1
  8. package/dist/cjs/index.js +115 -29
  9. package/dist/cjs/index.js.map +1 -1
  10. package/dist/cjs/otel/autoInstrument.js +253 -0
  11. package/dist/cjs/otel/autoInstrument.js.map +1 -0
  12. package/dist/cjs/otel/context.js +49 -0
  13. package/dist/cjs/otel/context.js.map +1 -0
  14. package/dist/cjs/otel/helpers.js +254 -0
  15. package/dist/cjs/otel/helpers.js.map +1 -0
  16. package/dist/cjs/otel/processor.js +153 -0
  17. package/dist/cjs/otel/processor.js.map +1 -0
  18. package/dist/cjs/otel/uuid.js +24 -0
  19. package/dist/cjs/otel/uuid.js.map +1 -0
  20. package/dist/cjs/otel/wrapAgent.js +460 -0
  21. package/dist/cjs/otel/wrapAgent.js.map +1 -0
  22. package/dist/esm/TrodoClient.d.ts +44 -11
  23. package/dist/esm/TrodoClient.d.ts.map +1 -1
  24. package/dist/esm/TrodoClient.js +85 -102
  25. package/dist/esm/TrodoClient.js.map +1 -1
  26. package/dist/esm/api/ApiClient.d.ts +9 -1
  27. package/dist/esm/api/ApiClient.d.ts.map +1 -1
  28. package/dist/esm/api/ApiClient.js +20 -2
  29. package/dist/esm/api/ApiClient.js.map +1 -1
  30. package/dist/esm/api/endpoints.d.ts +6 -1
  31. package/dist/esm/api/endpoints.d.ts.map +1 -1
  32. package/dist/esm/api/endpoints.js +7 -1
  33. package/dist/esm/api/endpoints.js.map +1 -1
  34. package/dist/esm/index.d.ts +96 -19
  35. package/dist/esm/index.d.ts.map +1 -1
  36. package/dist/esm/index.js +98 -23
  37. package/dist/esm/index.js.map +1 -1
  38. package/dist/esm/otel/autoInstrument.d.ts +61 -0
  39. package/dist/esm/otel/autoInstrument.d.ts.map +1 -0
  40. package/dist/esm/otel/autoInstrument.js +248 -0
  41. package/dist/esm/otel/autoInstrument.js.map +1 -0
  42. package/dist/esm/otel/context.d.ts +26 -0
  43. package/dist/esm/otel/context.d.ts.map +1 -0
  44. package/dist/esm/otel/context.js +44 -0
  45. package/dist/esm/otel/context.js.map +1 -0
  46. package/dist/esm/otel/helpers.d.ts +119 -0
  47. package/dist/esm/otel/helpers.d.ts.map +1 -0
  48. package/dist/esm/otel/helpers.js +244 -0
  49. package/dist/esm/otel/helpers.js.map +1 -0
  50. package/dist/esm/otel/processor.d.ts +104 -0
  51. package/dist/esm/otel/processor.d.ts.map +1 -0
  52. package/dist/esm/otel/processor.js +149 -0
  53. package/dist/esm/otel/processor.js.map +1 -0
  54. package/dist/esm/otel/uuid.d.ts +7 -0
  55. package/dist/esm/otel/uuid.d.ts.map +1 -0
  56. package/dist/esm/otel/uuid.js +21 -0
  57. package/dist/esm/otel/uuid.js.map +1 -0
  58. package/dist/esm/otel/wrapAgent.d.ts +133 -0
  59. package/dist/esm/otel/wrapAgent.d.ts.map +1 -0
  60. package/dist/esm/otel/wrapAgent.js +448 -0
  61. package/dist/esm/otel/wrapAgent.js.map +1 -0
  62. package/dist/esm/types/index.d.ts +24 -48
  63. package/dist/esm/types/index.d.ts.map +1 -1
  64. package/package.json +1 -1
@@ -0,0 +1,460 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SpanHandle = exports.RunHandle = void 0;
4
+ exports.currentRunId = currentRunId;
5
+ exports.currentSpanId = currentSpanId;
6
+ exports.startRun = startRun;
7
+ exports.endRun = endRun;
8
+ exports.wrapAgent = wrapAgent;
9
+ exports.withSpan = withSpan;
10
+ exports.joinRun = joinRun;
11
+ /**
12
+ * wrapAgent / withSpan / joinRun — user-facing surface for agent tracking.
13
+ *
14
+ * Users never generate IDs. The SDK creates run_id on wrapAgent, threads a
15
+ * span_id through AsyncLocalStorage, and any nested withSpan (or OTel
16
+ * auto-instrumented span from Anthropic/OpenAI/Vercel AI SDK/LangChain)
17
+ * inherits the current span as its parent.
18
+ *
19
+ * joinRun is for downstream microservices: opens a SPAN (not a run) in the
20
+ * context of the caller's run_id, flushing each span to the backend via
21
+ * append_spans. The originating service owns run lifecycle.
22
+ */
23
+ const uuid_js_1 = require("./uuid.js");
24
+ const context_js_1 = require("./context.js");
25
+ function nowIso() {
26
+ return new Date().toISOString();
27
+ }
28
+ function truncate(value, max = 64000) {
29
+ if (value == null)
30
+ return undefined;
31
+ const str = typeof value === 'string' ? value : safeJson(value);
32
+ return str.length > max ? str.slice(0, max) : str;
33
+ }
34
+ function safeJson(v) {
35
+ try {
36
+ return JSON.stringify(v);
37
+ }
38
+ catch {
39
+ return String(v);
40
+ }
41
+ }
42
+ /** Return the currently active run_id, if any. */
43
+ function currentRunId() {
44
+ return (0, context_js_1.getActiveContext)()?.runId ?? null;
45
+ }
46
+ /** Return the currently active span_id, if any. */
47
+ function currentSpanId() {
48
+ return (0, context_js_1.getActiveContext)()?.spanId ?? null;
49
+ }
50
+ function aggregate(spans) {
51
+ let totalIn = 0;
52
+ let totalOut = 0;
53
+ let totalCost = 0;
54
+ let toolCount = 0;
55
+ let errorCount = 0;
56
+ for (const s of spans) {
57
+ if (s.input_tokens)
58
+ totalIn += Number(s.input_tokens);
59
+ if (s.output_tokens)
60
+ totalOut += Number(s.output_tokens);
61
+ if (s.cost)
62
+ totalCost += Number(s.cost);
63
+ if (s.kind === 'tool')
64
+ toolCount += 1;
65
+ if (s.status === 'error')
66
+ errorCount += 1;
67
+ }
68
+ return {
69
+ total_tokens_in: totalIn,
70
+ total_tokens_out: totalOut,
71
+ total_cost: totalCost ? Math.round(totalCost * 1e8) / 1e8 : 0,
72
+ span_count: spans.length,
73
+ tool_count: toolCount,
74
+ error_count: errorCount,
75
+ };
76
+ }
77
+ /**
78
+ * RunHandle — returned by wrapAgent so callers can set input/output after
79
+ * inspecting the arguments / result. Mirrors the Python RunHandle API.
80
+ */
81
+ class RunHandle {
82
+ constructor(runId, agentName) {
83
+ this.metadata = {};
84
+ this.runId = runId;
85
+ this.agentName = agentName;
86
+ }
87
+ setInput(value) {
88
+ this.input = truncate(value);
89
+ }
90
+ setOutput(value) {
91
+ this.output = truncate(value);
92
+ }
93
+ setMetadata(extra) {
94
+ Object.assign(this.metadata, extra);
95
+ }
96
+ }
97
+ exports.RunHandle = RunHandle;
98
+ /**
99
+ * SpanHandle — returned by withSpan / joinRun. Collect LLM model/token/cost
100
+ * info and tool name here; the processor picks them up at span close.
101
+ */
102
+ class SpanHandle {
103
+ constructor(spanId, name) {
104
+ this.attributes = {};
105
+ this.spanId = spanId;
106
+ this.name = name;
107
+ }
108
+ setInput(value) {
109
+ this.input = truncate(value);
110
+ }
111
+ setOutput(value) {
112
+ this.output = truncate(value);
113
+ }
114
+ setAttribute(key, value) {
115
+ this.attributes[key] = value;
116
+ }
117
+ setLlm(opts) {
118
+ if (opts.model !== undefined)
119
+ this.model = opts.model;
120
+ if (opts.provider !== undefined)
121
+ this.provider = opts.provider;
122
+ if (opts.inputTokens !== undefined)
123
+ this.inputTokens = Number(opts.inputTokens);
124
+ if (opts.outputTokens !== undefined)
125
+ this.outputTokens = Number(opts.outputTokens);
126
+ if (opts.cost !== undefined)
127
+ this.cost = Number(opts.cost);
128
+ if (opts.temperature !== undefined)
129
+ this.temperature = Number(opts.temperature);
130
+ }
131
+ setTool(name) {
132
+ this.toolName = name;
133
+ }
134
+ }
135
+ exports.SpanHandle = SpanHandle;
136
+ /**
137
+ * Open a Run record without holding a context manager.
138
+ *
139
+ * Pairs with {@link endRun} for sessions that span multiple processes or HTTP
140
+ * requests (e.g. an MCP server where ``initialize`` opens a run and later
141
+ * ``tools/call`` requests append spans before a final close).
142
+ *
143
+ * Returns the runId (caller-supplied or freshly minted). Between startRun and
144
+ * endRun any process can use ``joinRun(runId, ...)`` to add spans — they flush
145
+ * incrementally via append_spans.
146
+ */
147
+ async function startRun(processor, agentName, options = {}) {
148
+ const runId = options.runId || (0, uuid_js_1.uuidv4)();
149
+ const run = {
150
+ run_id: runId,
151
+ agent_name: agentName,
152
+ distinct_id: options.distinctId ?? null,
153
+ conversation_id: options.conversationId ?? null,
154
+ parent_run_id: options.parentRunId ?? null,
155
+ status: 'running',
156
+ input: truncate(options.input),
157
+ started_at: nowIso(),
158
+ metadata: options.metadata,
159
+ };
160
+ processor.markJoined(runId);
161
+ await processor.startRun(run);
162
+ return runId;
163
+ }
164
+ /**
165
+ * Finalise a Run opened by {@link startRun}.
166
+ *
167
+ * Aggregates any locally-buffered spans for `runId`, POSTs to
168
+ * `/runs/{id}/end`, and unmarks the run as joined.
169
+ */
170
+ async function endRun(processor, runId, options = {}) {
171
+ const pending = processor.getPending(runId);
172
+ const agg = aggregate(pending);
173
+ const payload = {
174
+ ended_at: nowIso(),
175
+ status: options.status ?? 'ok',
176
+ total_tokens_in: agg.total_tokens_in,
177
+ total_tokens_out: agg.total_tokens_out,
178
+ total_cost: agg.total_cost,
179
+ span_count: agg.span_count,
180
+ tool_count: agg.tool_count,
181
+ error_count: agg.error_count,
182
+ };
183
+ if (options.output !== undefined) {
184
+ payload.output = truncate(options.output);
185
+ }
186
+ if (options.errorSummary !== undefined) {
187
+ payload.error_summary = truncate(options.errorSummary, 4000);
188
+ }
189
+ if (options.metadata !== undefined) {
190
+ payload.metadata = options.metadata;
191
+ }
192
+ await processor.endRun(runId, payload);
193
+ processor.unmarkJoined(runId);
194
+ }
195
+ /**
196
+ * Wrap an async function as an agent run. Every OTel span (or withSpan call)
197
+ * created inside `fn` is auto-nested under the run via AsyncLocalStorage.
198
+ *
199
+ * The callback receives a RunHandle so it can call `handle.setInput(...)` /
200
+ * `handle.setOutput(...)`. Old-style callbacks (no arg) still work.
201
+ */
202
+ async function wrapAgent(processor, teamSiteId, agentName, fn, options = {}) {
203
+ const runId = (0, uuid_js_1.uuidv4)();
204
+ const rootSpanId = (0, uuid_js_1.uuidv4)();
205
+ const startedAt = nowIso();
206
+ const startedMs = Date.now();
207
+ const handle = new RunHandle(runId, agentName);
208
+ const ctx = {
209
+ runId,
210
+ spanId: rootSpanId,
211
+ parentSpanId: null,
212
+ teamSiteId,
213
+ processor,
214
+ };
215
+ let status = 'ok';
216
+ let output;
217
+ let errorSummary;
218
+ let result;
219
+ try {
220
+ result = await (0, context_js_1.runWithContextAsync)(ctx, async () => fn(handle));
221
+ output = handle.output ?? truncate(result);
222
+ }
223
+ catch (err) {
224
+ status = 'error';
225
+ errorSummary = truncate(err?.message ?? String(err), 4000);
226
+ const pending = processor.getPending(runId);
227
+ const agg = aggregate(pending);
228
+ const run = {
229
+ run_id: runId,
230
+ agent_name: agentName,
231
+ distinct_id: options.distinctId ?? null,
232
+ conversation_id: options.conversationId ?? null,
233
+ parent_run_id: options.parentRunId ?? null,
234
+ status,
235
+ input: handle.input,
236
+ started_at: startedAt,
237
+ ended_at: nowIso(),
238
+ duration_ms: Date.now() - startedMs,
239
+ error_summary: errorSummary,
240
+ metadata: { ...(options.metadata || {}), ...handle.metadata },
241
+ total_tokens_in: agg.total_tokens_in,
242
+ total_tokens_out: agg.total_tokens_out,
243
+ total_cost: agg.total_cost,
244
+ span_count: agg.span_count,
245
+ tool_count: agg.tool_count,
246
+ error_count: agg.error_count,
247
+ };
248
+ await processor.ingestRun(run);
249
+ throw err;
250
+ }
251
+ const pending = processor.getPending(runId);
252
+ const agg = aggregate(pending);
253
+ const run = {
254
+ run_id: runId,
255
+ agent_name: agentName,
256
+ distinct_id: options.distinctId ?? null,
257
+ conversation_id: options.conversationId ?? null,
258
+ parent_run_id: options.parentRunId ?? null,
259
+ status,
260
+ input: handle.input,
261
+ output,
262
+ started_at: startedAt,
263
+ ended_at: nowIso(),
264
+ duration_ms: Date.now() - startedMs,
265
+ metadata: { ...(options.metadata || {}), ...handle.metadata },
266
+ total_tokens_in: agg.total_tokens_in,
267
+ total_tokens_out: agg.total_tokens_out,
268
+ total_cost: agg.total_cost,
269
+ span_count: agg.span_count,
270
+ tool_count: agg.tool_count,
271
+ error_count: agg.error_count,
272
+ };
273
+ await processor.ingestRun(run);
274
+ return { result, runId };
275
+ }
276
+ /**
277
+ * Create a nested span for non-auto-instrumented work (KB lookups, custom
278
+ * tools, computation). Requires an enclosing wrapAgent/joinRun.
279
+ *
280
+ * The callback receives a SpanHandle so the caller can record LLM tokens /
281
+ * tool name / output inside the function body.
282
+ */
283
+ async function withSpan(_processor, name, fn, options = {}) {
284
+ const active = (0, context_js_1.getActiveContext)();
285
+ const spanId = (0, uuid_js_1.uuidv4)();
286
+ const handle = new SpanHandle(spanId, name);
287
+ if (options.input !== undefined)
288
+ handle.setInput(options.input);
289
+ if (options.attributes)
290
+ Object.assign(handle.attributes, options.attributes);
291
+ if (!active) {
292
+ // Outside of a run — execute but skip tracking (don't crash user code).
293
+ return Promise.resolve(fn(handle));
294
+ }
295
+ const startedAt = nowIso();
296
+ const startedMs = Date.now();
297
+ const child = {
298
+ runId: active.runId,
299
+ spanId,
300
+ parentSpanId: active.spanId,
301
+ teamSiteId: active.teamSiteId,
302
+ processor: active.processor,
303
+ };
304
+ let status = 'ok';
305
+ let errorType;
306
+ let errorMessage;
307
+ try {
308
+ const result = await (0, context_js_1.runWithContextAsync)(child, async () => fn(handle));
309
+ if (handle.output === undefined)
310
+ handle.setOutput(result);
311
+ const span = {
312
+ span_id: spanId,
313
+ run_id: active.runId,
314
+ parent_span_id: active.spanId,
315
+ kind: options.kind || 'generic',
316
+ name,
317
+ status,
318
+ started_at: startedAt,
319
+ ended_at: nowIso(),
320
+ duration_ms: Date.now() - startedMs,
321
+ input: handle.input,
322
+ output: handle.output,
323
+ model: handle.model,
324
+ provider: handle.provider,
325
+ input_tokens: handle.inputTokens,
326
+ output_tokens: handle.outputTokens,
327
+ cost: handle.cost,
328
+ temperature: handle.temperature,
329
+ tool_name: handle.toolName,
330
+ attributes: Object.keys(handle.attributes).length ? handle.attributes : undefined,
331
+ };
332
+ active.processor.enqueueSpan(span);
333
+ return result;
334
+ }
335
+ catch (err) {
336
+ status = 'error';
337
+ errorType = err?.name || 'Error';
338
+ errorMessage = truncate(err?.message ?? String(err), 4000);
339
+ const span = {
340
+ span_id: spanId,
341
+ run_id: active.runId,
342
+ parent_span_id: active.spanId,
343
+ kind: options.kind || 'generic',
344
+ name,
345
+ status,
346
+ started_at: startedAt,
347
+ ended_at: nowIso(),
348
+ duration_ms: Date.now() - startedMs,
349
+ input: handle.input,
350
+ output: handle.output,
351
+ error_type: errorType,
352
+ error_message: errorMessage,
353
+ model: handle.model,
354
+ provider: handle.provider,
355
+ input_tokens: handle.inputTokens,
356
+ output_tokens: handle.outputTokens,
357
+ cost: handle.cost,
358
+ temperature: handle.temperature,
359
+ tool_name: handle.toolName,
360
+ attributes: Object.keys(handle.attributes).length ? handle.attributes : undefined,
361
+ };
362
+ active.processor.enqueueSpan(span);
363
+ throw err;
364
+ }
365
+ }
366
+ /**
367
+ * Join an existing agent run owned by a remote service. Opens a SPAN (not a
368
+ * run) under ``parentSpanId``; every span produced inside ``fn`` — including
369
+ * OTel auto-instrumented LLM spans — flushes to the backend as a child of
370
+ * the caller's run via append_spans. We never ingest a run here.
371
+ *
372
+ * Typical use: Express/FastAPI middleware detects ``X-Trodo-Run-Id`` +
373
+ * ``X-Trodo-Parent-Span-Id`` on an inbound request and wraps the handler
374
+ * with joinRun so the handler's work nests under the caller's run.
375
+ */
376
+ async function joinRun(processor, teamSiteId, runId, parentSpanId, fn, options = {}) {
377
+ const spanId = (0, uuid_js_1.uuidv4)();
378
+ const name = options.name || 'remote.handler';
379
+ const kind = options.kind || 'agent';
380
+ const handle = new SpanHandle(spanId, name);
381
+ if (options.input !== undefined)
382
+ handle.setInput(options.input);
383
+ if (options.attributes)
384
+ Object.assign(handle.attributes, options.attributes);
385
+ processor.markJoined(runId);
386
+ const startedAt = nowIso();
387
+ const startedMs = Date.now();
388
+ const ctx = {
389
+ runId,
390
+ spanId,
391
+ parentSpanId: parentSpanId ?? null,
392
+ teamSiteId,
393
+ processor,
394
+ };
395
+ let status = 'ok';
396
+ let errorType;
397
+ let errorMessage;
398
+ try {
399
+ const result = await (0, context_js_1.runWithContextAsync)(ctx, async () => fn(handle));
400
+ if (handle.output === undefined)
401
+ handle.setOutput(result);
402
+ const span = {
403
+ span_id: spanId,
404
+ run_id: runId,
405
+ parent_span_id: parentSpanId ?? null,
406
+ kind,
407
+ name,
408
+ status,
409
+ started_at: startedAt,
410
+ ended_at: nowIso(),
411
+ duration_ms: Date.now() - startedMs,
412
+ input: handle.input,
413
+ output: handle.output,
414
+ model: handle.model,
415
+ provider: handle.provider,
416
+ input_tokens: handle.inputTokens,
417
+ output_tokens: handle.outputTokens,
418
+ cost: handle.cost,
419
+ temperature: handle.temperature,
420
+ tool_name: handle.toolName,
421
+ attributes: Object.keys(handle.attributes).length ? handle.attributes : undefined,
422
+ };
423
+ await processor.appendSpans(runId, [span]);
424
+ return result;
425
+ }
426
+ catch (err) {
427
+ status = 'error';
428
+ errorType = err?.name || 'Error';
429
+ errorMessage = truncate(err?.message ?? String(err), 4000);
430
+ const span = {
431
+ span_id: spanId,
432
+ run_id: runId,
433
+ parent_span_id: parentSpanId ?? null,
434
+ kind,
435
+ name,
436
+ status,
437
+ started_at: startedAt,
438
+ ended_at: nowIso(),
439
+ duration_ms: Date.now() - startedMs,
440
+ input: handle.input,
441
+ output: handle.output,
442
+ error_type: errorType,
443
+ error_message: errorMessage,
444
+ model: handle.model,
445
+ provider: handle.provider,
446
+ input_tokens: handle.inputTokens,
447
+ output_tokens: handle.outputTokens,
448
+ cost: handle.cost,
449
+ temperature: handle.temperature,
450
+ tool_name: handle.toolName,
451
+ attributes: Object.keys(handle.attributes).length ? handle.attributes : undefined,
452
+ };
453
+ await processor.appendSpans(runId, [span]);
454
+ throw err;
455
+ }
456
+ finally {
457
+ processor.unmarkJoined(runId);
458
+ }
459
+ }
460
+ //# sourceMappingURL=wrapAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapAgent.js","sourceRoot":"","sources":["../../../src/otel/wrapAgent.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
- import type { TrodoConfig, ForUserOptions, TrackOptions, WalletAddressResult, ResetResult, ApiResult, GroupProfile, AgentCallProps, ToolUseProps, AgentResponseProps, AgentErrorProps, FeedbackProps } from './types/index.js';
1
+ import type { TrodoConfig, ForUserOptions, TrackOptions, WalletAddressResult, ResetResult, ApiResult, GroupProfile, FeedbackProps } from './types/index.js';
2
2
  import { UserContext } from './UserContext.js';
3
+ import { type WrapAgentOptions, type WrapAgentResult, type WithSpanOptions, type JoinRunOptions, type StartRunOptions, type EndRunOptions, type RunHandle, type SpanHandle } from './otel/wrapAgent.js';
4
+ import { expressMiddleware as expressMiddlewareImpl, type ToolOptions, type TrackLlmCallParams } from './otel/helpers.js';
3
5
  export declare class TrodoClient {
4
6
  readonly siteId: string;
5
7
  private readonly apiBase;
@@ -9,6 +11,7 @@ export declare class TrodoClient {
9
11
  private readonly batchFlusher;
10
12
  private readonly autoEventManager;
11
13
  private readonly userContextCache;
14
+ private readonly spanProcessor;
12
15
  readonly people: {
13
16
  set(distinctId: string, properties: Record<string, unknown>): Promise<ApiResult>;
14
17
  setOnce(distinctId: string, properties: Record<string, unknown>): Promise<ApiResult>;
@@ -35,15 +38,45 @@ export declare class TrodoClient {
35
38
  disableAutoEvents(): void;
36
39
  flush(): Promise<void>;
37
40
  shutdown(): Promise<void>;
38
- /** Track an LLM invocation / inbound message. */
39
- track_agent_call(props: AgentCallProps): Promise<void>;
40
- /** Track a tool invocation within an agent turn. */
41
- track_tool_use(props: ToolUseProps): Promise<void>;
42
- /** Track an LLM response / completion. */
43
- track_agent_response(props: AgentResponseProps): Promise<void>;
44
- /** Track an error during an agent turn. */
45
- track_agent_error(props: AgentErrorProps): Promise<void>;
46
- /** Track a user feedback reaction (thumbs up/down) on an agent response. */
47
- track_feedback(props: FeedbackProps): Promise<void>;
41
+ /**
42
+ * Wrap an async function as an agent run. Callback receives a RunHandle
43
+ * call `handle.setInput(...)` / `handle.setOutput(...)` to populate the
44
+ * run's input/output fields. Every OTel-auto-instrumented LLM call or
45
+ * nested `withSpan` inside `fn` is captured as a child span.
46
+ * Returns { result, runId } — runId is used to attach feedback later.
47
+ */
48
+ wrapAgent<R>(agentName: string, fn: (handle: RunHandle) => Promise<R> | R, options?: WrapAgentOptions): Promise<WrapAgentResult<R>>;
49
+ /** Create a nested span inside the current run. */
50
+ withSpan<R>(name: string, fn: (handle: SpanHandle) => Promise<R> | R, options?: WithSpanOptions): Promise<R>;
51
+ /**
52
+ * Join an existing run owned by a remote service — opens a span (not a new
53
+ * run) in that run's context. Spans inside `fn` are streamed to the backend
54
+ * via append_spans. Used by the express middleware and for manual cross-
55
+ * service join on any request shape.
56
+ */
57
+ joinRun<R>(runId: string, parentSpanId: string | null, fn: (handle: SpanHandle) => Promise<R> | R, options?: JoinRunOptions): Promise<R>;
58
+ /**
59
+ * Open a Run record without holding a context manager. Returns the runId.
60
+ *
61
+ * Pairs with {@link endRun} for sessions that span multiple processes or
62
+ * HTTP requests (e.g. an MCP server). Between startRun and endRun any
63
+ * process can use ``joinRun(runId, ...)`` to add spans.
64
+ */
65
+ startRun(agentName: string, options?: StartRunOptions): Promise<string>;
66
+ /** Finalise a Run opened by {@link startRun}. */
67
+ endRun(runId: string, options?: EndRunOptions): Promise<void>;
68
+ /** Higher-order wrapper: decorate a tool-like function so each call becomes a span. */
69
+ tool<Args extends unknown[], R>(fn: (...args: Args) => Promise<R> | R, options?: ToolOptions): (...args: Args) => Promise<R>;
70
+ /** Record a one-shot LLM span for a raw-HTTP caller. */
71
+ trackLlmCall(params: TrackLlmCallParams): Promise<void>;
72
+ /** Return an Express/Connect middleware that auto-joins inbound runs. */
73
+ expressMiddleware(): ReturnType<typeof expressMiddlewareImpl>;
74
+ /** Outbound HTTP headers carrying the current run/span context. */
75
+ propagationHeaders(): Record<string, string>;
76
+ /** Expose current run/span ids for bespoke propagation needs. */
77
+ currentRunId(): string | null;
78
+ currentSpanId(): string | null;
79
+ /** Attach feedback to a completed run. Call with the runId returned from wrapAgent. */
80
+ feedback(runId: string, props: Omit<FeedbackProps, 'runId'>): Promise<ApiResult>;
48
81
  }
49
82
  //# sourceMappingURL=TrodoClient.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TrodoClient.d.ts","sourceRoot":"","sources":["../../src/TrodoClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TrodoClient.d.ts","sourceRoot":"","sources":["../../src/TrodoClient.ts"],"names":[],"mappings":"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"}