@dexto/core 1.8.3 → 1.8.5

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 (63) hide show
  1. package/dist/agent/DextoAgent.cjs +3 -1
  2. package/dist/agent/DextoAgent.d.ts +2 -0
  3. package/dist/agent/DextoAgent.d.ts.map +1 -1
  4. package/dist/agent/DextoAgent.js +7 -2
  5. package/dist/events/index.d.ts +3 -0
  6. package/dist/events/index.d.ts.map +1 -1
  7. package/dist/index.browser.cjs +6 -0
  8. package/dist/index.browser.d.ts +2 -0
  9. package/dist/index.browser.d.ts.map +1 -1
  10. package/dist/index.browser.js +4 -0
  11. package/dist/llm/executor/provider-error.cjs +214 -0
  12. package/dist/llm/executor/provider-error.d.ts +26 -0
  13. package/dist/llm/executor/provider-error.d.ts.map +1 -0
  14. package/dist/llm/executor/provider-error.js +190 -0
  15. package/dist/llm/executor/stream-processor.cjs +34 -5
  16. package/dist/llm/executor/stream-processor.d.ts +4 -1
  17. package/dist/llm/executor/stream-processor.d.ts.map +1 -1
  18. package/dist/llm/executor/stream-processor.js +34 -5
  19. package/dist/llm/executor/turn-executor.cjs +320 -152
  20. package/dist/llm/executor/turn-executor.d.ts +6 -5
  21. package/dist/llm/executor/turn-executor.d.ts.map +1 -1
  22. package/dist/llm/executor/turn-executor.js +319 -148
  23. package/dist/llm/registry/sync.cjs +15 -2
  24. package/dist/llm/registry/sync.d.ts.map +1 -1
  25. package/dist/llm/registry/sync.js +15 -2
  26. package/dist/llm/services/vercel.cjs +32 -5
  27. package/dist/llm/services/vercel.d.ts.map +1 -1
  28. package/dist/llm/services/vercel.js +32 -5
  29. package/dist/session/chat-session.cjs +41 -11
  30. package/dist/session/chat-session.d.ts.map +1 -1
  31. package/dist/session/chat-session.js +41 -11
  32. package/dist/session/title-generator.cjs +19 -2
  33. package/dist/session/title-generator.d.ts +8 -0
  34. package/dist/session/title-generator.d.ts.map +1 -1
  35. package/dist/session/title-generator.js +19 -2
  36. package/dist/systemPrompt/contributors.cjs +10 -1
  37. package/dist/systemPrompt/contributors.d.ts.map +1 -1
  38. package/dist/systemPrompt/contributors.js +10 -1
  39. package/dist/telemetry/browser.cjs +138 -0
  40. package/dist/telemetry/browser.d.ts +30 -0
  41. package/dist/telemetry/browser.d.ts.map +1 -0
  42. package/dist/telemetry/browser.js +115 -0
  43. package/dist/telemetry/decorators.cjs +86 -82
  44. package/dist/telemetry/decorators.d.ts.map +1 -1
  45. package/dist/telemetry/decorators.js +86 -82
  46. package/dist/telemetry/index.cjs +5 -2
  47. package/dist/telemetry/index.d.ts +1 -0
  48. package/dist/telemetry/index.d.ts.map +1 -1
  49. package/dist/telemetry/index.js +3 -1
  50. package/dist/telemetry/operation-span.cjs +74 -0
  51. package/dist/telemetry/operation-span.d.ts +13 -0
  52. package/dist/telemetry/operation-span.d.ts.map +1 -0
  53. package/dist/telemetry/operation-span.js +51 -0
  54. package/dist/telemetry/telemetry.cjs +2 -3
  55. package/dist/telemetry/telemetry.d.ts.map +1 -1
  56. package/dist/telemetry/telemetry.js +2 -3
  57. package/dist/telemetry/utils.cjs +11 -12
  58. package/dist/telemetry/utils.d.ts.map +1 -1
  59. package/dist/telemetry/utils.js +11 -12
  60. package/dist/tools/tool-call-metadata.cjs +121 -6
  61. package/dist/tools/tool-call-metadata.d.ts.map +1 -1
  62. package/dist/tools/tool-call-metadata.js +121 -6
  63. package/package.json +3 -2
@@ -0,0 +1,115 @@
1
+ import "../chunk-C6A6W6XS.js";
2
+ import { context as otlpContext, propagation, trace } from "@opentelemetry/api";
3
+ function isGlobalTelemetryLike(value) {
4
+ if (typeof value !== "object" || value === null) {
5
+ return false;
6
+ }
7
+ return typeof Reflect.get(value, "forceFlush") === "function" && typeof Reflect.get(value, "isInitialized") === "function" && typeof Reflect.get(value, "name") === "string" && typeof Reflect.get(value, "shutdown") === "function" && Reflect.get(value, "tracer") !== void 0;
8
+ }
9
+ class Telemetry {
10
+ tracer;
11
+ name;
12
+ _isInitialized;
13
+ _shutdownHandler;
14
+ static _initPromise;
15
+ constructor(config, options) {
16
+ const serviceName = config.serviceName ?? "dexto-service";
17
+ const tracerName = config.tracerName ?? serviceName;
18
+ this.name = serviceName;
19
+ this.tracer = trace.getTracer(tracerName);
20
+ this._shutdownHandler = options.shutdown;
21
+ this._isInitialized = options.initialized;
22
+ }
23
+ static async registerGlobal(options = {}) {
24
+ const existing = Telemetry.getGlobalInstance();
25
+ if (existing !== void 0) {
26
+ return existing;
27
+ }
28
+ if (Telemetry._initPromise !== void 0) {
29
+ return Telemetry._initPromise;
30
+ }
31
+ Telemetry._initPromise = Promise.resolve().then(() => {
32
+ const current = Telemetry.getGlobalInstance();
33
+ if (current !== void 0) {
34
+ return current;
35
+ }
36
+ const telemetry = new Telemetry(options.config ?? {}, {
37
+ initialized: options.initialized ?? true,
38
+ ...options.shutdown !== void 0 && { shutdown: options.shutdown }
39
+ });
40
+ Telemetry.setGlobalInstance(telemetry);
41
+ return telemetry;
42
+ });
43
+ return Telemetry._initPromise;
44
+ }
45
+ static getActiveSpan() {
46
+ return trace.getActiveSpan();
47
+ }
48
+ static get() {
49
+ const telemetry = Telemetry.getGlobalInstance();
50
+ if (telemetry === void 0) {
51
+ throw new Error("Telemetry not initialized. Call Telemetry.registerGlobal() first.");
52
+ }
53
+ return telemetry;
54
+ }
55
+ static hasGlobalInstance() {
56
+ return Telemetry.getGlobalInstance() !== void 0;
57
+ }
58
+ static async shutdownGlobal() {
59
+ const telemetry = Telemetry.getGlobalInstance();
60
+ if (telemetry !== void 0) {
61
+ await telemetry.shutdown();
62
+ }
63
+ Telemetry.setGlobalInstance(void 0);
64
+ Telemetry._initPromise = void 0;
65
+ }
66
+ static setBaggage(baggage, ctx = otlpContext.active()) {
67
+ const currentBaggage = Object.fromEntries(
68
+ propagation.getBaggage(ctx)?.getAllEntries() ?? []
69
+ );
70
+ return propagation.setBaggage(
71
+ ctx,
72
+ propagation.createBaggage({
73
+ ...currentBaggage,
74
+ ...baggage
75
+ })
76
+ );
77
+ }
78
+ static withContext(ctx, fn) {
79
+ return otlpContext.with(ctx, fn);
80
+ }
81
+ isInitialized() {
82
+ return this._isInitialized;
83
+ }
84
+ async forceFlush() {
85
+ const provider = trace.getTracerProvider();
86
+ const forceFlush = Reflect.get(provider, "forceFlush");
87
+ if (typeof forceFlush === "function") {
88
+ await Reflect.apply(forceFlush, provider, []);
89
+ }
90
+ }
91
+ async shutdown() {
92
+ try {
93
+ await this._shutdownHandler?.();
94
+ } finally {
95
+ this._isInitialized = false;
96
+ this._shutdownHandler = void 0;
97
+ Telemetry.setGlobalInstance(void 0);
98
+ Telemetry._initPromise = void 0;
99
+ }
100
+ }
101
+ static getGlobalInstance() {
102
+ const telemetry = Reflect.get(globalThis, "__TELEMETRY__");
103
+ return isGlobalTelemetryLike(telemetry) ? telemetry : void 0;
104
+ }
105
+ static setGlobalInstance(telemetry) {
106
+ if (telemetry === void 0) {
107
+ Reflect.deleteProperty(globalThis, "__TELEMETRY__");
108
+ return;
109
+ }
110
+ Reflect.set(globalThis, "__TELEMETRY__", telemetry);
111
+ }
112
+ }
113
+ export {
114
+ Telemetry
115
+ };
@@ -49,11 +49,7 @@ function withSpan(options) {
49
49
  if (spanKind !== void 0) {
50
50
  spanOptions.kind = spanKind;
51
51
  }
52
- const span = tracer.startSpan(spanName, spanOptions);
53
- let ctx = import_api.trace.setSpan(import_api.context.active(), span);
54
- args.forEach((arg, index) => {
55
- span.setAttribute(`${spanName}.argument.${index}`, (0, import_safe_stringify.safeStringify)(arg, 8192));
56
- });
52
+ let ctx = import_api.context.active();
57
53
  const {
58
54
  requestId,
59
55
  componentName,
@@ -63,47 +59,52 @@ function withSpan(options) {
63
59
  sessionId,
64
60
  hostRuntime
65
61
  } = (0, import_utils.getBaggageValues)(ctx);
66
- if (sessionId) {
67
- span.setAttribute("sessionId", sessionId);
68
- span.setAttribute("baggage.sessionId", sessionId);
69
- }
70
- if (requestId) {
71
- span.setAttribute("http.request_id", requestId);
72
- span.setAttribute("baggage.http.request_id", requestId);
73
- }
74
- if (threadId) {
75
- span.setAttribute("threadId", threadId);
76
- span.setAttribute("baggage.threadId", threadId);
77
- }
78
- if (resourceId) {
79
- span.setAttribute("resourceId", resourceId);
80
- span.setAttribute("baggage.resourceId", resourceId);
81
- }
82
- if (runId !== void 0) {
83
- span.setAttribute("runId", String(runId));
84
- span.setAttribute("baggage.runId", String(runId));
85
- }
86
- for (const [key, value] of Object.entries((0, import_runtime.getHostRuntimeAttributes)(hostRuntime))) {
87
- span.setAttribute(key, value);
88
- }
89
62
  const inferredComponentName = options?.componentName;
90
63
  const effectiveHostRuntime = hostRuntime;
91
64
  const effectiveRunId = effectiveHostRuntime?.ids?.runId ?? runId;
92
- if (componentName) {
93
- span.setAttribute("componentName", componentName);
94
- span.setAttribute("baggage.componentName", componentName);
95
- } else if (inferredComponentName) {
96
- span.setAttribute("componentName", inferredComponentName);
97
- }
98
- if (effectiveRunId !== void 0) {
99
- span.setAttribute("runId", String(effectiveRunId));
100
- span.setAttribute("baggage.runId", String(effectiveRunId));
101
- }
102
- for (const [key, value] of Object.entries(
103
- (0, import_runtime.getHostRuntimeAttributes)(effectiveHostRuntime)
104
- )) {
105
- span.setAttribute(key, value);
106
- }
65
+ const applySpanAttributes = (span) => {
66
+ args.forEach((arg, index) => {
67
+ span.setAttribute(`${spanName}.argument.${index}`, (0, import_safe_stringify.safeStringify)(arg, 8192));
68
+ });
69
+ if (sessionId) {
70
+ span.setAttribute("sessionId", sessionId);
71
+ span.setAttribute("baggage.sessionId", sessionId);
72
+ }
73
+ if (requestId) {
74
+ span.setAttribute("http.request_id", requestId);
75
+ span.setAttribute("baggage.http.request_id", requestId);
76
+ }
77
+ if (threadId) {
78
+ span.setAttribute("threadId", threadId);
79
+ span.setAttribute("baggage.threadId", threadId);
80
+ }
81
+ if (resourceId) {
82
+ span.setAttribute("resourceId", resourceId);
83
+ span.setAttribute("baggage.resourceId", resourceId);
84
+ }
85
+ if (runId !== void 0) {
86
+ span.setAttribute("runId", String(runId));
87
+ span.setAttribute("baggage.runId", String(runId));
88
+ }
89
+ for (const [key, value] of Object.entries((0, import_runtime.getHostRuntimeAttributes)(hostRuntime))) {
90
+ span.setAttribute(key, value);
91
+ }
92
+ if (componentName) {
93
+ span.setAttribute("componentName", componentName);
94
+ span.setAttribute("baggage.componentName", componentName);
95
+ } else if (inferredComponentName) {
96
+ span.setAttribute("componentName", inferredComponentName);
97
+ }
98
+ if (effectiveRunId !== void 0) {
99
+ span.setAttribute("runId", String(effectiveRunId));
100
+ span.setAttribute("baggage.runId", String(effectiveRunId));
101
+ }
102
+ for (const [key, value] of Object.entries(
103
+ (0, import_runtime.getHostRuntimeAttributes)(effectiveHostRuntime)
104
+ )) {
105
+ span.setAttribute(key, value);
106
+ }
107
+ };
107
108
  const existingBaggage = import_api.propagation.getBaggage(ctx);
108
109
  const baggageEntries = {};
109
110
  if (existingBaggage) {
@@ -151,48 +152,51 @@ function withSpan(options) {
151
152
  if (Object.keys(baggageEntries).length > 0) {
152
153
  ctx = import_api.propagation.setBaggage(ctx, import_api.propagation.createBaggage(baggageEntries));
153
154
  }
154
- let result;
155
- try {
156
- result = import_api.context.with(ctx, () => originalMethod.apply(this, args));
157
- if (result instanceof Promise) {
158
- return result.then((resolvedValue) => {
159
- span.setAttribute(
160
- `${spanName}.result`,
161
- (0, import_safe_stringify.safeStringify)(resolvedValue, 8192)
162
- );
163
- return resolvedValue;
164
- }).catch((error) => {
165
- span.recordException(error);
166
- span.setStatus({
167
- code: import_api.SpanStatusCode.ERROR,
168
- message: error?.toString()
155
+ return tracer.startActiveSpan(spanName, spanOptions, ctx, (span) => {
156
+ applySpanAttributes(span);
157
+ let result;
158
+ try {
159
+ result = originalMethod.apply(this, args);
160
+ if (result instanceof Promise) {
161
+ return result.then((resolvedValue) => {
162
+ span.setAttribute(
163
+ `${spanName}.result`,
164
+ (0, import_safe_stringify.safeStringify)(resolvedValue, 8192)
165
+ );
166
+ return resolvedValue;
167
+ }).catch((error) => {
168
+ span.recordException(error);
169
+ span.setStatus({
170
+ code: import_api.SpanStatusCode.ERROR,
171
+ message: error?.toString()
172
+ });
173
+ throw error;
174
+ }).finally(() => {
175
+ span.end();
169
176
  });
170
- throw error;
171
- }).finally(() => {
172
- span.end();
177
+ }
178
+ span.setAttribute(`${spanName}.result`, (0, import_safe_stringify.safeStringify)(result, 8192));
179
+ return result;
180
+ } catch (error) {
181
+ const logger2 = this?.logger;
182
+ logger2?.error(
183
+ `withSpan: Error in method '${methodName}': ${error instanceof Error ? error.message : String(error)}`,
184
+ { error }
185
+ );
186
+ span.setStatus({
187
+ code: import_api.SpanStatusCode.ERROR,
188
+ message: error instanceof Error ? error.message : "Unknown error"
173
189
  });
190
+ if (error instanceof Error) {
191
+ span.recordException(error);
192
+ }
193
+ throw error;
194
+ } finally {
195
+ if (!(result instanceof Promise)) {
196
+ span.end();
197
+ }
174
198
  }
175
- span.setAttribute(`${spanName}.result`, (0, import_safe_stringify.safeStringify)(result, 8192));
176
- return result;
177
- } catch (error) {
178
- const logger2 = this?.logger;
179
- logger2?.error(
180
- `withSpan: Error in method '${methodName}': ${error instanceof Error ? error.message : String(error)}`,
181
- { error }
182
- );
183
- span.setStatus({
184
- code: import_api.SpanStatusCode.ERROR,
185
- message: error instanceof Error ? error.message : "Unknown error"
186
- });
187
- if (error instanceof Error) {
188
- span.recordException(error);
189
- }
190
- throw error;
191
- } finally {
192
- if (!(result instanceof Promise)) {
193
- span.end();
194
- }
195
- }
199
+ });
196
200
  };
197
201
  return descriptor;
198
202
  };
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/telemetry/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,QAAQ,EAIX,MAAM,oBAAoB,CAAC;AAO5B,wBAAgB,QAAQ,CAAC,OAAO,EAAE;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,GAAG,CAgON;AAGD,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB,IACoB,CAAC,SAAS;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;CAAE,EAAE,QAAQ,CAAC,OA6BrE"}
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/telemetry/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,QAAQ,EAKX,MAAM,oBAAoB,CAAC;AAO5B,wBAAgB,QAAQ,CAAC,OAAO,EAAE;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,GAAG,CAmON;AAGD,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB,IACoB,CAAC,SAAS;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;CAAE,EAAE,QAAQ,CAAC,OA6BrE"}
@@ -32,11 +32,7 @@ function withSpan(options) {
32
32
  if (spanKind !== void 0) {
33
33
  spanOptions.kind = spanKind;
34
34
  }
35
- const span = tracer.startSpan(spanName, spanOptions);
36
- let ctx = trace.setSpan(context.active(), span);
37
- args.forEach((arg, index) => {
38
- span.setAttribute(`${spanName}.argument.${index}`, safeStringify(arg, 8192));
39
- });
35
+ let ctx = context.active();
40
36
  const {
41
37
  requestId,
42
38
  componentName,
@@ -46,47 +42,52 @@ function withSpan(options) {
46
42
  sessionId,
47
43
  hostRuntime
48
44
  } = getBaggageValues(ctx);
49
- if (sessionId) {
50
- span.setAttribute("sessionId", sessionId);
51
- span.setAttribute("baggage.sessionId", sessionId);
52
- }
53
- if (requestId) {
54
- span.setAttribute("http.request_id", requestId);
55
- span.setAttribute("baggage.http.request_id", requestId);
56
- }
57
- if (threadId) {
58
- span.setAttribute("threadId", threadId);
59
- span.setAttribute("baggage.threadId", threadId);
60
- }
61
- if (resourceId) {
62
- span.setAttribute("resourceId", resourceId);
63
- span.setAttribute("baggage.resourceId", resourceId);
64
- }
65
- if (runId !== void 0) {
66
- span.setAttribute("runId", String(runId));
67
- span.setAttribute("baggage.runId", String(runId));
68
- }
69
- for (const [key, value] of Object.entries(getHostRuntimeAttributes(hostRuntime))) {
70
- span.setAttribute(key, value);
71
- }
72
45
  const inferredComponentName = options?.componentName;
73
46
  const effectiveHostRuntime = hostRuntime;
74
47
  const effectiveRunId = effectiveHostRuntime?.ids?.runId ?? runId;
75
- if (componentName) {
76
- span.setAttribute("componentName", componentName);
77
- span.setAttribute("baggage.componentName", componentName);
78
- } else if (inferredComponentName) {
79
- span.setAttribute("componentName", inferredComponentName);
80
- }
81
- if (effectiveRunId !== void 0) {
82
- span.setAttribute("runId", String(effectiveRunId));
83
- span.setAttribute("baggage.runId", String(effectiveRunId));
84
- }
85
- for (const [key, value] of Object.entries(
86
- getHostRuntimeAttributes(effectiveHostRuntime)
87
- )) {
88
- span.setAttribute(key, value);
89
- }
48
+ const applySpanAttributes = (span) => {
49
+ args.forEach((arg, index) => {
50
+ span.setAttribute(`${spanName}.argument.${index}`, safeStringify(arg, 8192));
51
+ });
52
+ if (sessionId) {
53
+ span.setAttribute("sessionId", sessionId);
54
+ span.setAttribute("baggage.sessionId", sessionId);
55
+ }
56
+ if (requestId) {
57
+ span.setAttribute("http.request_id", requestId);
58
+ span.setAttribute("baggage.http.request_id", requestId);
59
+ }
60
+ if (threadId) {
61
+ span.setAttribute("threadId", threadId);
62
+ span.setAttribute("baggage.threadId", threadId);
63
+ }
64
+ if (resourceId) {
65
+ span.setAttribute("resourceId", resourceId);
66
+ span.setAttribute("baggage.resourceId", resourceId);
67
+ }
68
+ if (runId !== void 0) {
69
+ span.setAttribute("runId", String(runId));
70
+ span.setAttribute("baggage.runId", String(runId));
71
+ }
72
+ for (const [key, value] of Object.entries(getHostRuntimeAttributes(hostRuntime))) {
73
+ span.setAttribute(key, value);
74
+ }
75
+ if (componentName) {
76
+ span.setAttribute("componentName", componentName);
77
+ span.setAttribute("baggage.componentName", componentName);
78
+ } else if (inferredComponentName) {
79
+ span.setAttribute("componentName", inferredComponentName);
80
+ }
81
+ if (effectiveRunId !== void 0) {
82
+ span.setAttribute("runId", String(effectiveRunId));
83
+ span.setAttribute("baggage.runId", String(effectiveRunId));
84
+ }
85
+ for (const [key, value] of Object.entries(
86
+ getHostRuntimeAttributes(effectiveHostRuntime)
87
+ )) {
88
+ span.setAttribute(key, value);
89
+ }
90
+ };
90
91
  const existingBaggage = propagation.getBaggage(ctx);
91
92
  const baggageEntries = {};
92
93
  if (existingBaggage) {
@@ -134,48 +135,51 @@ function withSpan(options) {
134
135
  if (Object.keys(baggageEntries).length > 0) {
135
136
  ctx = propagation.setBaggage(ctx, propagation.createBaggage(baggageEntries));
136
137
  }
137
- let result;
138
- try {
139
- result = context.with(ctx, () => originalMethod.apply(this, args));
140
- if (result instanceof Promise) {
141
- return result.then((resolvedValue) => {
142
- span.setAttribute(
143
- `${spanName}.result`,
144
- safeStringify(resolvedValue, 8192)
145
- );
146
- return resolvedValue;
147
- }).catch((error) => {
148
- span.recordException(error);
149
- span.setStatus({
150
- code: SpanStatusCode.ERROR,
151
- message: error?.toString()
138
+ return tracer.startActiveSpan(spanName, spanOptions, ctx, (span) => {
139
+ applySpanAttributes(span);
140
+ let result;
141
+ try {
142
+ result = originalMethod.apply(this, args);
143
+ if (result instanceof Promise) {
144
+ return result.then((resolvedValue) => {
145
+ span.setAttribute(
146
+ `${spanName}.result`,
147
+ safeStringify(resolvedValue, 8192)
148
+ );
149
+ return resolvedValue;
150
+ }).catch((error) => {
151
+ span.recordException(error);
152
+ span.setStatus({
153
+ code: SpanStatusCode.ERROR,
154
+ message: error?.toString()
155
+ });
156
+ throw error;
157
+ }).finally(() => {
158
+ span.end();
152
159
  });
153
- throw error;
154
- }).finally(() => {
155
- span.end();
160
+ }
161
+ span.setAttribute(`${spanName}.result`, safeStringify(result, 8192));
162
+ return result;
163
+ } catch (error) {
164
+ const logger2 = this?.logger;
165
+ logger2?.error(
166
+ `withSpan: Error in method '${methodName}': ${error instanceof Error ? error.message : String(error)}`,
167
+ { error }
168
+ );
169
+ span.setStatus({
170
+ code: SpanStatusCode.ERROR,
171
+ message: error instanceof Error ? error.message : "Unknown error"
156
172
  });
173
+ if (error instanceof Error) {
174
+ span.recordException(error);
175
+ }
176
+ throw error;
177
+ } finally {
178
+ if (!(result instanceof Promise)) {
179
+ span.end();
180
+ }
157
181
  }
158
- span.setAttribute(`${spanName}.result`, safeStringify(result, 8192));
159
- return result;
160
- } catch (error) {
161
- const logger2 = this?.logger;
162
- logger2?.error(
163
- `withSpan: Error in method '${methodName}': ${error instanceof Error ? error.message : String(error)}`,
164
- { error }
165
- );
166
- span.setStatus({
167
- code: SpanStatusCode.ERROR,
168
- message: error instanceof Error ? error.message : "Unknown error"
169
- });
170
- if (error instanceof Error) {
171
- span.recordException(error);
172
- }
173
- throw error;
174
- } finally {
175
- if (!(result instanceof Promise)) {
176
- span.end();
177
- }
178
- }
182
+ });
179
183
  };
180
184
  return descriptor;
181
185
  };
@@ -19,13 +19,16 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  var telemetry_exports = {};
20
20
  __export(telemetry_exports, {
21
21
  OtelConfigurationSchema: () => import_schemas.OtelConfigurationSchema,
22
- Telemetry: () => import_telemetry.Telemetry
22
+ Telemetry: () => import_telemetry.Telemetry,
23
+ recordOperationSpan: () => import_operation_span.recordOperationSpan
23
24
  });
24
25
  module.exports = __toCommonJS(telemetry_exports);
25
26
  var import_telemetry = require("./telemetry.js");
26
27
  var import_schemas = require("./schemas.js");
28
+ var import_operation_span = require("./operation-span.js");
27
29
  // Annotate the CommonJS export names for ESM import in node:
28
30
  0 && (module.exports = {
29
31
  OtelConfigurationSchema,
30
- Telemetry
32
+ Telemetry,
33
+ recordOperationSpan
31
34
  });
@@ -1,4 +1,5 @@
1
1
  export { Telemetry, type TelemetryRegistrationOptions, type TelemetryShutdownHandler, } from './telemetry.js';
2
2
  export { OtelConfigurationSchema } from './schemas.js';
3
3
  export type { OtelConfiguration } from './schemas.js';
4
+ export { recordOperationSpan, type OperationSpanOptions } from './operation-span.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,SAAS,EACT,KAAK,4BAA4B,EACjC,KAAK,wBAAwB,GAChC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,SAAS,EACT,KAAK,4BAA4B,EACjC,KAAK,wBAAwB,GAChC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -3,7 +3,9 @@ import {
3
3
  Telemetry
4
4
  } from "./telemetry.js";
5
5
  import { OtelConfigurationSchema } from "./schemas.js";
6
+ import { recordOperationSpan } from "./operation-span.js";
6
7
  export {
7
8
  OtelConfigurationSchema,
8
- Telemetry
9
+ Telemetry,
10
+ recordOperationSpan
9
11
  };
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var operation_span_exports = {};
20
+ __export(operation_span_exports, {
21
+ recordOperationSpan: () => recordOperationSpan
22
+ });
23
+ module.exports = __toCommonJS(operation_span_exports);
24
+ var import_api = require("@opentelemetry/api");
25
+ var import_utils = require("./utils.js");
26
+ async function recordOperationSpan(options, operation, logger) {
27
+ const skipIfNoTelemetry = options.skipIfNoTelemetry ?? true;
28
+ if (skipIfNoTelemetry && !(0, import_utils.hasActiveTelemetry)(logger)) {
29
+ return operation();
30
+ }
31
+ return import_api.trace.getTracer(options.tracerName ?? "dexto").startActiveSpan(options.name, { kind: import_api.SpanKind.INTERNAL }, async (span) => {
32
+ const spanContext = import_api.trace.setSpan(import_api.context.active(), span);
33
+ (0, import_utils.addBaggageAttributesToSpan)(span, spanContext, logger);
34
+ if (options.componentName !== void 0) {
35
+ span.setAttribute("componentName", options.componentName);
36
+ }
37
+ setOperationSpanAttributes(span, options.attributes);
38
+ try {
39
+ const result = await operation();
40
+ try {
41
+ setOperationSpanAttributes(span, options.resultAttributes?.(result));
42
+ } catch (error) {
43
+ logger?.debug("Failed to set OpenTelemetry result attributes", {
44
+ error: error instanceof Error ? error.message : String(error),
45
+ span: options.name
46
+ });
47
+ }
48
+ span.setStatus({ code: import_api.SpanStatusCode.OK });
49
+ return result;
50
+ } catch (error) {
51
+ if (error instanceof Error) {
52
+ span.recordException(error);
53
+ span.setStatus({ code: import_api.SpanStatusCode.ERROR, message: error.message });
54
+ } else {
55
+ span.setStatus({ code: import_api.SpanStatusCode.ERROR, message: String(error) });
56
+ }
57
+ throw error;
58
+ } finally {
59
+ span.end();
60
+ }
61
+ });
62
+ }
63
+ function setOperationSpanAttributes(span, attributes) {
64
+ if (span === void 0 || attributes === void 0) {
65
+ return;
66
+ }
67
+ for (const [key, value] of Object.entries(attributes)) {
68
+ span.setAttribute(key, value);
69
+ }
70
+ }
71
+ // Annotate the CommonJS export names for ESM import in node:
72
+ 0 && (module.exports = {
73
+ recordOperationSpan
74
+ });
@@ -0,0 +1,13 @@
1
+ import type { Logger } from '../logger/v2/types.js';
2
+ type OperationSpanAttributes = Record<string, string | number | boolean>;
3
+ export type OperationSpanOptions<T> = {
4
+ attributes?: OperationSpanAttributes;
5
+ componentName?: string;
6
+ name: string;
7
+ resultAttributes?: (result: T) => OperationSpanAttributes | undefined;
8
+ skipIfNoTelemetry?: boolean;
9
+ tracerName?: string;
10
+ };
11
+ export declare function recordOperationSpan<T>(options: OperationSpanOptions<T>, operation: () => T | Promise<T>, logger?: Logger): Promise<T>;
12
+ export {};
13
+ //# sourceMappingURL=operation-span.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation-span.d.ts","sourceRoot":"","sources":["../../src/telemetry/operation-span.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAGpD,KAAK,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAEzE,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI;IAClC,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,uBAAuB,GAAG,SAAS,CAAC;IACtE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,wBAAsB,mBAAmB,CAAC,CAAC,EACvC,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,EAChC,SAAS,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAC/B,MAAM,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,CAAC,CA0CZ"}