lightrace 0.1.2 → 0.1.3

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.
@@ -0,0 +1,70 @@
1
+ import { BasicTracerProvider, BatchSpanProcessor } from "@opentelemetry/sdk-trace-base";
2
+ import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
3
+ // Lightrace OTel span attribute keys — trace-level
4
+ export const TRACE_NAME = "lightrace.trace.name";
5
+ export const TRACE_USER_ID = "lightrace.trace.user_id";
6
+ export const TRACE_SESSION_ID = "lightrace.trace.session_id";
7
+ export const TRACE_TAGS = "lightrace.trace.tags";
8
+ export const TRACE_PUBLIC = "lightrace.trace.public";
9
+ export const TRACE_METADATA = "lightrace.trace.metadata";
10
+ export const TRACE_INPUT = "lightrace.trace.input";
11
+ export const TRACE_OUTPUT = "lightrace.trace.output";
12
+ // Lightrace OTel span attribute keys — observation-level
13
+ export const OBSERVATION_TYPE = "lightrace.observation.type";
14
+ export const OBSERVATION_METADATA = "lightrace.observation.metadata";
15
+ export const OBSERVATION_LEVEL = "lightrace.observation.level";
16
+ export const OBSERVATION_STATUS_MESSAGE = "lightrace.observation.status_message";
17
+ export const OBSERVATION_INPUT = "lightrace.observation.input";
18
+ export const OBSERVATION_OUTPUT = "lightrace.observation.output";
19
+ export const OBSERVATION_COMPLETION_START_TIME = "lightrace.observation.completion_start_time";
20
+ export const OBSERVATION_MODEL = "lightrace.observation.model";
21
+ export const OBSERVATION_MODEL_PARAMETERS = "lightrace.observation.model_parameters";
22
+ export const OBSERVATION_USAGE_DETAILS = "lightrace.observation.usage_details";
23
+ export const OBSERVATION_COST_DETAILS = "lightrace.observation.cost_details";
24
+ // Internal / meta
25
+ export const RELEASE = "lightrace.release";
26
+ export const VERSION = "lightrace.version";
27
+ export const AS_ROOT = "lightrace.internal.as_root";
28
+ export function safeJson(value) {
29
+ if (value === null || value === undefined)
30
+ return "";
31
+ if (typeof value === "string")
32
+ return value;
33
+ try {
34
+ return JSON.stringify(value);
35
+ }
36
+ catch {
37
+ return String(value);
38
+ }
39
+ }
40
+ export class LightraceOtelExporter {
41
+ provider;
42
+ _tracer;
43
+ constructor(options) {
44
+ const host = options.host.replace(/\/$/, "");
45
+ const auth = Buffer.from(`${options.publicKey}:${options.secretKey}`).toString("base64");
46
+ const exporter = new OTLPTraceExporter({
47
+ url: `${host}/api/public/otel/v1/traces`,
48
+ headers: { Authorization: `Basic ${auth}` },
49
+ });
50
+ this.provider = new BasicTracerProvider({
51
+ spanProcessors: [
52
+ new BatchSpanProcessor(exporter, {
53
+ scheduledDelayMillis: options.flushIntervalMs ?? 5000,
54
+ maxExportBatchSize: options.maxExportBatchSize ?? 50,
55
+ }),
56
+ ],
57
+ });
58
+ this._tracer = this.provider.getTracer("lightrace-js", "0.2.0");
59
+ }
60
+ get tracer() {
61
+ return this._tracer;
62
+ }
63
+ flush() {
64
+ this.provider.forceFlush();
65
+ }
66
+ async shutdown() {
67
+ await this.provider.shutdown();
68
+ }
69
+ }
70
+ //# sourceMappingURL=otel-exporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel-exporter.js","sourceRoot":"","sources":["../src/otel-exporter.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Get the state passed with the current tool invocation.
3
+ * Returns undefined if not in an invocation context or no state was provided.
4
+ */
5
+ export declare function getInvokeState(): unknown;
1
6
  export declare class ToolClient {
2
7
  private host;
3
8
  private publicKey;
@@ -27,6 +32,15 @@ export declare class ToolClient {
27
32
  private handleMessage;
28
33
  private registerTools;
29
34
  private startHeartbeat;
35
+ /**
36
+ * Handle an invoke message. Validates signature and nonce, then fires off
37
+ * isolated execution without blocking the WS message handler.
38
+ */
30
39
  private handleInvoke;
40
+ /**
41
+ * Execute a tool invocation in isolation with a timeout.
42
+ * Runs outside the WS message handler so heartbeats continue flowing.
43
+ */
44
+ private executeToolIsolated;
31
45
  }
32
46
  //# sourceMappingURL=tool-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-client.d.ts","sourceRoot":"","sources":["../src/tool-client.ts"],"names":[],"mappings":"AAUA,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,iBAAiB,CAAS;IAElC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,cAAc,CAA+C;gBAEzD,OAAO,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B;IASD,OAAO,KAAK,KAAK,GAIhB;IAED,KAAK,IAAI,IAAI;IAQb,IAAI,IAAI,IAAI;IAUZ,OAAO,CAAC,OAAO;IAmCf,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,cAAc;YAQR,YAAY;CAsE3B"}
1
+ {"version":3,"file":"tool-client.d.ts","sourceRoot":"","sources":["../src/tool-client.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,iBAAiB,CAAS;IAElC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,cAAc,CAA+C;gBAEzD,OAAO,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B;IASD,OAAO,KAAK,KAAK,GAIhB;IAED,KAAK,IAAI,IAAI;IAQb,IAAI,IAAI,IAAI;IAUZ,OAAO,CAAC,OAAO;IAmCf,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,cAAc;IAQtB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAwCpB;;;OAGG;YACW,mBAAmB;CAyElC"}
@@ -1,11 +1,25 @@
1
1
  /**
2
2
  * WebSocket client for remote tool invocation.
3
+ *
4
+ * Tool execution is isolated: handleInvoke fires-and-forgets so the WS
5
+ * message handler is never blocked, allowing heartbeats to continue.
3
6
  */
7
+ import { AsyncLocalStorage } from "node:async_hooks";
4
8
  import WebSocket from "ws";
5
9
  import { _getToolRegistry } from "./trace.js";
6
10
  import { generateId } from "./utils.js";
11
+ import { restoreContext } from "./context.js";
7
12
  import { sign, verify, NonceTracker } from "./security.js";
8
13
  import { jsonSerializable } from "./utils.js";
14
+ /** AsyncLocalStorage for invoke state -- tools can access via getInvokeState(). */
15
+ const invokeStateStorage = new AsyncLocalStorage();
16
+ /**
17
+ * Get the state passed with the current tool invocation.
18
+ * Returns undefined if not in an invocation context or no state was provided.
19
+ */
20
+ export function getInvokeState() {
21
+ return invokeStateStorage.getStore();
22
+ }
9
23
  export class ToolClient {
10
24
  host;
11
25
  publicKey;
@@ -125,8 +139,12 @@ export class ToolClient {
125
139
  }
126
140
  }, this.heartbeatInterval);
127
141
  }
128
- async handleInvoke(ws, msg) {
129
- const { nonce, tool, input, signature: sig } = msg;
142
+ /**
143
+ * Handle an invoke message. Validates signature and nonce, then fires off
144
+ * isolated execution without blocking the WS message handler.
145
+ */
146
+ handleInvoke(ws, msg) {
147
+ const { nonce, tool, input, state, signature: sig } = msg;
130
148
  // Verify HMAC
131
149
  if (!this.sessionToken || !verify(this.sessionToken, nonce, tool, input, sig)) {
132
150
  ws.send(JSON.stringify({ type: "error", message: "Invalid signature" }));
@@ -150,36 +168,69 @@ export class ToolClient {
150
168
  }));
151
169
  return;
152
170
  }
171
+ // Fire and forget -- don't block the WS message handler
172
+ this.executeToolIsolated(ws, nonce, tool, input, state, entry).catch((err) => console.error("[lightrace] Tool execution error:", err));
173
+ }
174
+ /**
175
+ * Execute a tool invocation in isolation with a timeout.
176
+ * Runs outside the WS message handler so heartbeats continue flowing.
177
+ */
178
+ async executeToolIsolated(ws, nonce, tool, input, state, entry) {
179
+ // Restore registered context variables from __lightrace_context
180
+ const contextData = state &&
181
+ typeof state === "object" &&
182
+ "__lightrace_context" in state
183
+ ? state.__lightrace_context
184
+ : {};
185
+ if (contextData && typeof contextData === "object") {
186
+ restoreContext(contextData);
187
+ }
153
188
  const start = performance.now();
189
+ const timeoutMs = 30_000;
190
+ let timeoutId;
154
191
  try {
155
- let output;
156
- if (input && typeof input === "object" && !Array.isArray(input)) {
157
- output = await entry.fn(input);
158
- }
159
- else {
160
- output = input !== null && input !== undefined ? await entry.fn(input) : await entry.fn();
161
- }
192
+ const output = await Promise.race([
193
+ invokeStateStorage.run(state ?? null, async () => {
194
+ let result;
195
+ if (input && typeof input === "object" && !Array.isArray(input)) {
196
+ result = await entry.fn(input);
197
+ }
198
+ else {
199
+ result =
200
+ input !== null && input !== undefined ? await entry.fn(input) : await entry.fn();
201
+ }
202
+ return jsonSerializable(result);
203
+ }),
204
+ new Promise((_, reject) => {
205
+ timeoutId = setTimeout(() => reject(new Error("Tool execution timed out")), timeoutMs);
206
+ }),
207
+ ]);
208
+ clearTimeout(timeoutId);
162
209
  const durationMs = Math.round(performance.now() - start);
163
- output = jsonSerializable(output);
164
- ws.send(JSON.stringify({
165
- type: "result",
166
- nonce,
167
- output,
168
- durationMs,
169
- signature: sign(this.sessionToken, nonce, tool, output),
170
- }));
210
+ if (ws.readyState === WebSocket.OPEN) {
211
+ ws.send(JSON.stringify({
212
+ type: "result",
213
+ nonce,
214
+ output,
215
+ durationMs,
216
+ signature: sign(this.sessionToken, nonce, tool, output),
217
+ }));
218
+ }
171
219
  }
172
220
  catch (err) {
221
+ clearTimeout(timeoutId);
173
222
  const durationMs = Math.round(performance.now() - start);
174
223
  const error = err instanceof Error ? err.message : String(err);
175
- ws.send(JSON.stringify({
176
- type: "result",
177
- nonce,
178
- output: null,
179
- error,
180
- durationMs,
181
- signature: sign(this.sessionToken, nonce, tool, null),
182
- }));
224
+ if (ws.readyState === WebSocket.OPEN) {
225
+ ws.send(JSON.stringify({
226
+ type: "result",
227
+ nonce,
228
+ output: null,
229
+ error,
230
+ durationMs,
231
+ signature: sign(this.sessionToken, nonce, tool, null),
232
+ }));
233
+ }
183
234
  }
184
235
  }
185
236
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tool-client.js","sourceRoot":"","sources":["../src/tool-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-client.js","sourceRoot":"","sources":["../src/tool-client.ts"],"names":[],"mappings":"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"}
package/dist/trace.d.ts CHANGED
@@ -1,25 +1,23 @@
1
+ import type { LightraceOtelExporter } from "./otel-exporter.js";
1
2
  import type { TraceOptions, ToolRegistryEntry } from "./types.js";
2
- import type { BatchExporter } from "./exporter.js";
3
- /** Context for trace propagation. */
4
- interface TraceContext {
5
- traceId: string;
6
- observationId: string | null;
7
- }
8
- export declare function _setExporter(exporter: BatchExporter | null): void;
3
+ export declare function _setOtelExporter(exporter: LightraceOtelExporter | null): void;
4
+ export declare function _getOtelExporter(): LightraceOtelExporter | null;
9
5
  export declare function _setClientDefaults(defaults: {
10
6
  userId?: string;
11
7
  sessionId?: string;
12
8
  }): void;
13
- /** Get the current trace context (used by imperative API). */
14
- export declare function _getTraceContext(): TraceContext | undefined;
9
+ /** Get the current trace context from OTel's active span. */
10
+ export declare function _getTraceContext(): {
11
+ traceId: string;
12
+ observationId: string | null;
13
+ } | undefined;
15
14
  export declare function _getToolRegistry(): Map<string, ToolRegistryEntry>;
16
15
  /**
17
16
  * Unified trace wrapper.
18
17
  *
19
18
  * Signatures:
20
- * trace(name, fn) root trace (no options)
21
- * trace(name, options, fn) with options
19
+ * trace(name, fn) -- root trace (no options)
20
+ * trace(name, options, fn) -- with options
22
21
  */
23
22
  export declare function trace<T extends (...args: any[]) => any>(name: string, fnOrOptions: T | TraceOptions, maybeFn?: T): T;
24
- export {};
25
23
  //# sourceMappingURL=trace.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAc,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,qCAAqC;AACrC,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAaD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAEjE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAE1F;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,IAAI,YAAY,GAAG,SAAS,CAE3D;AAED,wBAAgB,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAEjE;AAED;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACrD,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,CAAC,GAAG,YAAY,EAC7B,OAAO,CAAC,EAAE,CAAC,GACV,CAAC,CA4IH"}
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAalE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAE7E;AAED,wBAAgB,gBAAgB,IAAI,qBAAqB,GAAG,IAAI,CAE/D;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAE1F;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,SAAS,CAQhG;AAED,wBAAgB,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAEjE;AAiDD;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACrD,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,CAAC,GAAG,YAAY,EAC7B,OAAO,CAAC,EAAE,CAAC,GACV,CAAC,CAkIH"}
package/dist/trace.js CHANGED
@@ -1,35 +1,77 @@
1
1
  /**
2
2
  * Unified trace() wrapper for all observation types.
3
+ *
4
+ * Uses OpenTelemetry for trace/span context propagation and export.
3
5
  */
4
- import { AsyncLocalStorage } from "node:async_hooks";
5
- import { EVENT_TYPE_MAP, OBSERVATION_TYPE_ENUM } from "./types.js";
6
- import { generateId, jsonSerializable, zodToJsonSchema } from "./utils.js";
7
- const asyncStorage = new AsyncLocalStorage();
8
- /** Global exporter reference (set by Client). */
9
- let _exporter = null;
6
+ import { trace as otelTrace } from "@opentelemetry/api";
7
+ import * as attrs from "./otel-exporter.js";
8
+ import { OBSERVATION_TYPE_ENUM } from "./types.js";
9
+ import { jsonSerializable, zodToJsonSchema } from "./utils.js";
10
+ /** Global OTel exporter reference (set by Client). */
11
+ let _otelExporter = null;
10
12
  /** Client-level defaults (set by Client to avoid circular imports). */
11
13
  let _clientDefaults = {};
12
14
  /** Global tool registry for invocable tools. */
13
15
  const _toolRegistry = new Map();
14
- export function _setExporter(exporter) {
15
- _exporter = exporter;
16
+ export function _setOtelExporter(exporter) {
17
+ _otelExporter = exporter;
18
+ }
19
+ export function _getOtelExporter() {
20
+ return _otelExporter;
16
21
  }
17
22
  export function _setClientDefaults(defaults) {
18
23
  _clientDefaults = defaults;
19
24
  }
20
- /** Get the current trace context (used by imperative API). */
25
+ /** Get the current trace context from OTel's active span. */
21
26
  export function _getTraceContext() {
22
- return asyncStorage.getStore();
27
+ const span = otelTrace.getActiveSpan();
28
+ if (!span)
29
+ return undefined;
30
+ const ctx = span.spanContext();
31
+ return {
32
+ traceId: ctx.traceId,
33
+ observationId: ctx.spanId,
34
+ };
23
35
  }
24
36
  export function _getToolRegistry() {
25
37
  return _toolRegistry;
26
38
  }
39
+ /** Helper to set span attributes for a root trace or child observation. */
40
+ function setSpanAttributes(span, opts) {
41
+ if (opts.isRoot) {
42
+ span.setAttribute(attrs.AS_ROOT, "true");
43
+ span.setAttribute(attrs.TRACE_NAME, opts.obsName);
44
+ span.setAttribute(attrs.TRACE_INPUT, attrs.safeJson(opts.input));
45
+ span.setAttribute(attrs.TRACE_OUTPUT, attrs.safeJson(opts.output));
46
+ if (opts.metadata)
47
+ span.setAttribute(attrs.TRACE_METADATA, attrs.safeJson(opts.metadata));
48
+ if (opts.userId)
49
+ span.setAttribute(attrs.TRACE_USER_ID, opts.userId);
50
+ if (opts.sessionId)
51
+ span.setAttribute(attrs.TRACE_SESSION_ID, opts.sessionId);
52
+ }
53
+ else {
54
+ span.setAttribute(attrs.OBSERVATION_TYPE, OBSERVATION_TYPE_ENUM[opts.obsType] ?? opts.obsType ?? "SPAN");
55
+ span.setAttribute(attrs.OBSERVATION_INPUT, attrs.safeJson(opts.input));
56
+ span.setAttribute(attrs.OBSERVATION_OUTPUT, attrs.safeJson(opts.output));
57
+ if (opts.metadata)
58
+ span.setAttribute(attrs.OBSERVATION_METADATA, attrs.safeJson(opts.metadata));
59
+ if (opts.model)
60
+ span.setAttribute(attrs.OBSERVATION_MODEL, opts.model);
61
+ span.setAttribute(attrs.OBSERVATION_LEVEL, opts.level);
62
+ if (opts.statusMessage)
63
+ span.setAttribute(attrs.OBSERVATION_STATUS_MESSAGE, opts.statusMessage);
64
+ if (opts.usage) {
65
+ span.setAttribute(attrs.OBSERVATION_USAGE_DETAILS, attrs.safeJson(opts.usage));
66
+ }
67
+ }
68
+ }
27
69
  /**
28
70
  * Unified trace wrapper.
29
71
  *
30
72
  * Signatures:
31
- * trace(name, fn) root trace (no options)
32
- * trace(name, options, fn) with options
73
+ * trace(name, fn) -- root trace (no options)
74
+ * trace(name, options, fn) -- with options
33
75
  */
34
76
  export function trace(name, fnOrOptions, maybeFn) {
35
77
  let options;
@@ -60,101 +102,91 @@ export function trace(name, fnOrOptions, maybeFn) {
60
102
  });
61
103
  }
62
104
  const wrapped = ((...args) => {
105
+ const tracer = _otelExporter?.tracer;
106
+ if (!tracer)
107
+ return fn(...args);
63
108
  const isRoot = obsType === null;
64
- const entityId = generateId();
65
- const startTime = new Date();
66
- // Get parent context
67
- const parentCtx = asyncStorage.getStore();
68
- const traceId = isRoot ? entityId : (parentCtx?.traceId ?? generateId());
69
- const parentObservationId = isRoot ? null : (parentCtx?.observationId ?? null);
70
- // Set context for children
71
- const childCtx = {
72
- traceId,
73
- observationId: isRoot ? null : entityId,
74
- };
75
- const emitEvent = (output, level, statusMessage) => {
76
- const endTime = new Date();
77
- const capturedInput = jsonSerializable(args.length === 1 ? args[0] : args);
78
- if (isRoot) {
79
- const body = {
80
- id: entityId,
81
- name: obsName,
82
- timestamp: startTime.toISOString(),
83
- input: capturedInput,
84
- output: jsonSerializable(output),
85
- metadata: staticMetadata,
86
- };
87
- if (userId !== undefined)
88
- body.userId = userId;
89
- if (sessionId !== undefined)
90
- body.sessionId = sessionId;
91
- const event = {
92
- id: generateId(),
93
- type: "trace-create",
94
- timestamp: startTime.toISOString(),
95
- body,
96
- };
97
- _exporter?.enqueue(event);
98
- }
99
- else {
100
- const createType = EVENT_TYPE_MAP[obsType]?.[0] ?? "span-create";
101
- const body = {
102
- id: entityId,
103
- traceId,
104
- type: OBSERVATION_TYPE_ENUM[obsType] ?? obsType,
105
- name: obsName,
106
- startTime: startTime.toISOString(),
107
- endTime: endTime.toISOString(),
108
- input: capturedInput,
109
- output: jsonSerializable(output),
110
- metadata: staticMetadata,
111
- model,
112
- level,
113
- statusMessage,
114
- parentObservationId,
115
- };
116
- // Add usage fields for generation observations
117
- if (usage && obsType === "generation") {
118
- if (usage.promptTokens !== undefined)
119
- body.promptTokens = usage.promptTokens;
120
- if (usage.completionTokens !== undefined)
121
- body.completionTokens = usage.completionTokens;
122
- if (usage.totalTokens !== undefined)
123
- body.totalTokens = usage.totalTokens;
109
+ return tracer.startActiveSpan(obsName, (span) => {
110
+ const execute = () => {
111
+ try {
112
+ const capturedInput = jsonSerializable(args.length === 1 ? args[0] : args);
113
+ const result = fn(...args);
114
+ // Handle async functions
115
+ if (result && typeof result === "object" && typeof result.then === "function") {
116
+ return result.then((resolved) => {
117
+ setSpanAttributes(span, {
118
+ isRoot,
119
+ obsType,
120
+ obsName,
121
+ input: capturedInput,
122
+ output: jsonSerializable(resolved),
123
+ model,
124
+ metadata: staticMetadata,
125
+ level: "DEFAULT",
126
+ userId,
127
+ sessionId,
128
+ usage,
129
+ });
130
+ span.end();
131
+ return resolved;
132
+ }, (err) => {
133
+ setSpanAttributes(span, {
134
+ isRoot,
135
+ obsType,
136
+ obsName,
137
+ input: capturedInput,
138
+ output: null,
139
+ model,
140
+ metadata: staticMetadata,
141
+ level: "ERROR",
142
+ statusMessage: err.message,
143
+ userId,
144
+ sessionId,
145
+ usage,
146
+ });
147
+ span.end();
148
+ throw err;
149
+ });
150
+ }
151
+ // Sync result
152
+ setSpanAttributes(span, {
153
+ isRoot,
154
+ obsType,
155
+ obsName,
156
+ input: capturedInput,
157
+ output: jsonSerializable(result),
158
+ model,
159
+ metadata: staticMetadata,
160
+ level: "DEFAULT",
161
+ userId,
162
+ sessionId,
163
+ usage,
164
+ });
165
+ span.end();
166
+ return result;
124
167
  }
125
- const event = {
126
- id: generateId(),
127
- type: createType,
128
- timestamp: startTime.toISOString(),
129
- body,
130
- };
131
- _exporter?.enqueue(event);
132
- }
133
- };
134
- const execute = () => {
135
- try {
136
- const result = fn(...args);
137
- // Handle async functions
138
- if (result && typeof result === "object" && typeof result.then === "function") {
139
- return result.then((resolved) => {
140
- emitEvent(resolved, "DEFAULT", null);
141
- return resolved;
142
- }, (err) => {
143
- emitEvent(null, "ERROR", err.message ?? String(err));
144
- throw err;
168
+ catch (err) {
169
+ const message = err instanceof Error ? err.message : String(err);
170
+ setSpanAttributes(span, {
171
+ isRoot,
172
+ obsType,
173
+ obsName,
174
+ input: jsonSerializable(args.length === 1 ? args[0] : args),
175
+ output: null,
176
+ model,
177
+ metadata: staticMetadata,
178
+ level: "ERROR",
179
+ statusMessage: message,
180
+ userId,
181
+ sessionId,
182
+ usage,
145
183
  });
184
+ span.end();
185
+ throw err;
146
186
  }
147
- // Sync result
148
- emitEvent(result, "DEFAULT", null);
149
- return result;
150
- }
151
- catch (err) {
152
- const message = err instanceof Error ? err.message : String(err);
153
- emitEvent(null, "ERROR", message);
154
- throw err;
155
- }
156
- };
157
- return asyncStorage.run(childCtx, execute);
187
+ };
188
+ return execute();
189
+ });
158
190
  });
159
191
  // Preserve function name
160
192
  Object.defineProperty(wrapped, "name", { value: fn.name || name });