@dexto/core 1.6.25 → 1.6.27

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 (150) hide show
  1. package/dist/agent/DextoAgent.cjs +102 -104
  2. package/dist/agent/DextoAgent.d.ts +11 -10
  3. package/dist/agent/DextoAgent.d.ts.map +1 -1
  4. package/dist/agent/DextoAgent.js +103 -105
  5. package/dist/agent/error-codes.cjs +1 -0
  6. package/dist/agent/error-codes.d.ts +1 -0
  7. package/dist/agent/error-codes.d.ts.map +1 -1
  8. package/dist/agent/error-codes.js +1 -0
  9. package/dist/agent/errors.cjs +13 -0
  10. package/dist/agent/errors.d.ts +6 -0
  11. package/dist/agent/errors.d.ts.map +1 -1
  12. package/dist/agent/errors.js +13 -0
  13. package/dist/agent/index.d.ts +1 -0
  14. package/dist/agent/index.d.ts.map +1 -1
  15. package/dist/agent/schemas.d.ts +2 -2
  16. package/dist/agent/types.d.ts +11 -0
  17. package/dist/agent/types.d.ts.map +1 -1
  18. package/dist/approval/factory.cjs +1 -0
  19. package/dist/approval/factory.d.ts.map +1 -1
  20. package/dist/approval/factory.js +1 -0
  21. package/dist/approval/manager.cjs +345 -182
  22. package/dist/approval/manager.d.ts +45 -31
  23. package/dist/approval/manager.d.ts.map +1 -1
  24. package/dist/approval/manager.js +345 -182
  25. package/dist/approval/schemas.cjs +10 -0
  26. package/dist/approval/schemas.d.ts +305 -0
  27. package/dist/approval/schemas.d.ts.map +1 -1
  28. package/dist/approval/schemas.js +10 -0
  29. package/dist/approval/session-approval-store.cjs +91 -0
  30. package/dist/approval/session-approval-store.d.ts +55 -0
  31. package/dist/approval/session-approval-store.d.ts.map +1 -0
  32. package/dist/approval/session-approval-store.js +68 -0
  33. package/dist/events/index.cjs +210 -75
  34. package/dist/events/index.d.ts +44 -181
  35. package/dist/events/index.d.ts.map +1 -1
  36. package/dist/events/index.js +206 -74
  37. package/dist/hooks/manager.cjs +5 -2
  38. package/dist/hooks/manager.d.ts +2 -0
  39. package/dist/hooks/manager.d.ts.map +1 -1
  40. package/dist/hooks/manager.js +5 -2
  41. package/dist/hooks/types.d.ts +3 -0
  42. package/dist/hooks/types.d.ts.map +1 -1
  43. package/dist/index.browser.d.ts +1 -0
  44. package/dist/index.browser.d.ts.map +1 -1
  45. package/dist/index.cjs +3 -1
  46. package/dist/index.d.ts +1 -0
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +1 -0
  49. package/dist/llm/executor/turn-executor.cjs +15 -7
  50. package/dist/llm/executor/turn-executor.d.ts +3 -1
  51. package/dist/llm/executor/turn-executor.d.ts.map +1 -1
  52. package/dist/llm/executor/turn-executor.js +15 -7
  53. package/dist/llm/services/factory.cjs +10 -4
  54. package/dist/llm/services/factory.d.ts +2 -21
  55. package/dist/llm/services/factory.d.ts.map +1 -1
  56. package/dist/llm/services/factory.js +11 -7
  57. package/dist/llm/services/types.d.ts +33 -2
  58. package/dist/llm/services/types.d.ts.map +1 -1
  59. package/dist/llm/services/vercel.cjs +33 -11
  60. package/dist/llm/services/vercel.d.ts +6 -3
  61. package/dist/llm/services/vercel.d.ts.map +1 -1
  62. package/dist/llm/services/vercel.js +29 -8
  63. package/dist/logger/default-logger-factory.d.ts +12 -12
  64. package/dist/logger/v2/schemas.d.ts +6 -6
  65. package/dist/mcp/manager.cjs +7 -2
  66. package/dist/mcp/manager.d.ts +3 -1
  67. package/dist/mcp/manager.d.ts.map +1 -1
  68. package/dist/mcp/manager.js +7 -2
  69. package/dist/mcp/mcp-client.cjs +71 -62
  70. package/dist/mcp/mcp-client.d.ts +3 -2
  71. package/dist/mcp/mcp-client.d.ts.map +1 -1
  72. package/dist/mcp/mcp-client.js +71 -62
  73. package/dist/mcp/schemas.d.ts +10 -10
  74. package/dist/resources/handlers/filesystem-handler.cjs +22 -3
  75. package/dist/resources/handlers/filesystem-handler.d.ts.map +1 -1
  76. package/dist/resources/handlers/filesystem-handler.js +22 -3
  77. package/dist/runtime/host-runtime.cjs +163 -0
  78. package/dist/runtime/host-runtime.d.ts +23 -0
  79. package/dist/runtime/host-runtime.d.ts.map +1 -0
  80. package/dist/runtime/host-runtime.js +133 -0
  81. package/dist/runtime/index.cjs +42 -0
  82. package/dist/runtime/index.d.ts +2 -0
  83. package/dist/runtime/index.d.ts.map +1 -0
  84. package/dist/runtime/index.js +21 -0
  85. package/dist/runtime/run-context.cjs +53 -0
  86. package/dist/runtime/run-context.d.ts +13 -0
  87. package/dist/runtime/run-context.d.ts.map +1 -0
  88. package/dist/runtime/run-context.js +34 -0
  89. package/dist/session/chat-session.cjs +67 -71
  90. package/dist/session/chat-session.d.ts +25 -25
  91. package/dist/session/chat-session.d.ts.map +1 -1
  92. package/dist/session/chat-session.js +68 -72
  93. package/dist/session/error-codes.cjs +1 -0
  94. package/dist/session/error-codes.d.ts +2 -1
  95. package/dist/session/error-codes.d.ts.map +1 -1
  96. package/dist/session/error-codes.js +1 -0
  97. package/dist/session/errors.cjs +13 -0
  98. package/dist/session/errors.d.ts +6 -0
  99. package/dist/session/errors.d.ts.map +1 -1
  100. package/dist/session/errors.js +13 -0
  101. package/dist/session/message-queue-store.cjs +75 -0
  102. package/dist/session/message-queue-store.d.ts +16 -0
  103. package/dist/session/message-queue-store.d.ts.map +1 -0
  104. package/dist/session/message-queue-store.js +52 -0
  105. package/dist/session/message-queue.cjs +140 -46
  106. package/dist/session/message-queue.d.ts +18 -6
  107. package/dist/session/message-queue.d.ts.map +1 -1
  108. package/dist/session/message-queue.js +140 -46
  109. package/dist/session/session-manager.cjs +130 -25
  110. package/dist/session/session-manager.d.ts +18 -1
  111. package/dist/session/session-manager.d.ts.map +1 -1
  112. package/dist/session/session-manager.js +130 -25
  113. package/dist/session/title-generator.cjs +9 -2
  114. package/dist/session/title-generator.d.ts +2 -0
  115. package/dist/session/title-generator.d.ts.map +1 -1
  116. package/dist/session/title-generator.js +9 -2
  117. package/dist/telemetry/decorators.cjs +75 -57
  118. package/dist/telemetry/decorators.d.ts +2 -0
  119. package/dist/telemetry/decorators.d.ts.map +1 -1
  120. package/dist/telemetry/decorators.js +75 -57
  121. package/dist/telemetry/errors.cjs +2 -2
  122. package/dist/telemetry/errors.js +2 -2
  123. package/dist/telemetry/index.d.ts +1 -1
  124. package/dist/telemetry/index.d.ts.map +1 -1
  125. package/dist/telemetry/index.js +3 -1
  126. package/dist/telemetry/telemetry.cjs +62 -21
  127. package/dist/telemetry/telemetry.d.ts +14 -0
  128. package/dist/telemetry/telemetry.d.ts.map +1 -1
  129. package/dist/telemetry/telemetry.js +62 -21
  130. package/dist/telemetry/utils.cjs +9 -6
  131. package/dist/telemetry/utils.d.ts +3 -0
  132. package/dist/telemetry/utils.d.ts.map +1 -1
  133. package/dist/telemetry/utils.js +9 -6
  134. package/dist/test-utils/session-state-stores.cjs +68 -0
  135. package/dist/test-utils/session-state-stores.js +42 -0
  136. package/dist/tools/session-tool-preferences-store.cjs +86 -0
  137. package/dist/tools/session-tool-preferences-store.d.ts +29 -0
  138. package/dist/tools/session-tool-preferences-store.d.ts.map +1 -0
  139. package/dist/tools/session-tool-preferences-store.js +63 -0
  140. package/dist/tools/tool-manager.cjs +223 -68
  141. package/dist/tools/tool-manager.d.ts +29 -9
  142. package/dist/tools/tool-manager.d.ts.map +1 -1
  143. package/dist/tools/tool-manager.js +223 -68
  144. package/dist/tools/types.d.ts +7 -1
  145. package/dist/tools/types.d.ts.map +1 -1
  146. package/dist/utils/service-initializer.cjs +38 -5
  147. package/dist/utils/service-initializer.d.ts +11 -1
  148. package/dist/utils/service-initializer.d.ts.map +1 -1
  149. package/dist/utils/service-initializer.js +36 -4
  150. package/package.json +1 -1
@@ -8,6 +8,7 @@ import {
8
8
  } from "@opentelemetry/api";
9
9
  import { hasActiveTelemetry, getBaggageValues } from "./utils.js";
10
10
  import { safeStringify } from "../utils/safe-stringify.js";
11
+ import { getHostRuntimeAttributes, getHostRuntimeBaggageEntries } from "../runtime/index.js";
11
12
  function withSpan(options) {
12
13
  return function(_target, propertyKey, descriptor) {
13
14
  if (!descriptor || typeof descriptor === "number") return;
@@ -36,7 +37,15 @@ function withSpan(options) {
36
37
  args.forEach((arg, index) => {
37
38
  span.setAttribute(`${spanName}.argument.${index}`, safeStringify(arg, 8192));
38
39
  });
39
- const { requestId, componentName, runId, threadId, resourceId, sessionId } = getBaggageValues(ctx);
40
+ const {
41
+ requestId,
42
+ componentName,
43
+ runId,
44
+ threadId,
45
+ resourceId,
46
+ sessionId,
47
+ hostRuntime
48
+ } = getBaggageValues(ctx);
40
49
  if (sessionId) {
41
50
  span.setAttribute("sessionId", sessionId);
42
51
  span.setAttribute("baggage.sessionId", sessionId);
@@ -57,65 +66,73 @@ function withSpan(options) {
57
66
  span.setAttribute("runId", String(runId));
58
67
  span.setAttribute("baggage.runId", String(runId));
59
68
  }
69
+ for (const [key, value] of Object.entries(getHostRuntimeAttributes(hostRuntime))) {
70
+ span.setAttribute(key, value);
71
+ }
72
+ const inferredComponentName = options?.componentName;
73
+ const effectiveHostRuntime = hostRuntime;
74
+ const effectiveRunId = effectiveHostRuntime?.ids?.runId ?? runId;
60
75
  if (componentName) {
61
76
  span.setAttribute("componentName", componentName);
62
77
  span.setAttribute("baggage.componentName", componentName);
63
- } else if (this && typeof this === "object") {
64
- const contextObj = this;
65
- const inferredName = contextObj.name ?? contextObj.constructor?.name;
66
- if (inferredName) {
67
- span.setAttribute("componentName", inferredName);
68
- }
69
- if (contextObj.runId) {
70
- span.setAttribute("runId", contextObj.runId);
71
- span.setAttribute("baggage.runId", contextObj.runId);
72
- }
73
- const existingBaggage = propagation.getBaggage(ctx);
74
- const baggageEntries = {};
75
- if (existingBaggage) {
76
- existingBaggage.getAllEntries().forEach(([key, entry]) => {
77
- baggageEntries[key] = entry;
78
- });
79
- }
80
- if (sessionId !== void 0) {
81
- baggageEntries.sessionId = {
82
- ...baggageEntries.sessionId,
83
- value: String(sessionId)
84
- };
85
- }
86
- if (requestId !== void 0) {
87
- baggageEntries["http.request_id"] = {
88
- ...baggageEntries["http.request_id"],
89
- value: String(requestId)
90
- };
91
- }
92
- if (threadId !== void 0) {
93
- baggageEntries.threadId = {
94
- ...baggageEntries.threadId,
95
- value: String(threadId)
96
- };
97
- }
98
- if (resourceId !== void 0) {
99
- baggageEntries.resourceId = {
100
- ...baggageEntries.resourceId,
101
- value: String(resourceId)
102
- };
103
- }
104
- if (inferredName !== void 0) {
105
- baggageEntries.componentName = {
106
- ...baggageEntries.componentName,
107
- value: String(inferredName)
108
- };
109
- }
110
- if (contextObj.runId !== void 0) {
111
- baggageEntries.runId = {
112
- ...baggageEntries.runId,
113
- value: String(contextObj.runId)
114
- };
115
- }
116
- if (Object.keys(baggageEntries).length > 0) {
117
- ctx = propagation.setBaggage(ctx, propagation.createBaggage(baggageEntries));
118
- }
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
+ const existingBaggage = propagation.getBaggage(ctx);
91
+ const baggageEntries = {};
92
+ if (existingBaggage) {
93
+ existingBaggage.getAllEntries().forEach(([key, entry]) => {
94
+ baggageEntries[key] = entry;
95
+ });
96
+ }
97
+ if (sessionId !== void 0) {
98
+ baggageEntries.sessionId = {
99
+ ...baggageEntries.sessionId,
100
+ value: String(sessionId)
101
+ };
102
+ }
103
+ if (requestId !== void 0) {
104
+ baggageEntries["http.request_id"] = {
105
+ ...baggageEntries["http.request_id"],
106
+ value: String(requestId)
107
+ };
108
+ }
109
+ if (threadId !== void 0) {
110
+ baggageEntries.threadId = {
111
+ ...baggageEntries.threadId,
112
+ value: String(threadId)
113
+ };
114
+ }
115
+ if (resourceId !== void 0) {
116
+ baggageEntries.resourceId = {
117
+ ...baggageEntries.resourceId,
118
+ value: String(resourceId)
119
+ };
120
+ }
121
+ if (componentName === void 0 && inferredComponentName !== void 0) {
122
+ baggageEntries.componentName = {
123
+ ...baggageEntries.componentName,
124
+ value: String(inferredComponentName)
125
+ };
126
+ }
127
+ if (effectiveRunId !== void 0) {
128
+ baggageEntries.runId = {
129
+ ...baggageEntries.runId,
130
+ value: String(effectiveRunId)
131
+ };
132
+ }
133
+ Object.assign(baggageEntries, getHostRuntimeBaggageEntries(effectiveHostRuntime));
134
+ if (Object.keys(baggageEntries).length > 0) {
135
+ ctx = propagation.setBaggage(ctx, propagation.createBaggage(baggageEntries));
119
136
  }
120
137
  let result;
121
138
  try {
@@ -180,6 +197,7 @@ function InstrumentClass(options) {
180
197
  spanName: options?.prefix ? `${options.prefix}.${method}` : method,
181
198
  skipIfNoTelemetry: true,
182
199
  spanKind: options?.spanKind || SpanKind.INTERNAL,
200
+ componentName: options?.componentName ?? target.name,
183
201
  ...options?.tracerName !== void 0 && {
184
202
  tracerName: options.tracerName
185
203
  }
@@ -80,9 +80,9 @@ class TelemetryError {
80
80
  import_error_codes.TelemetryErrorCode.NOT_INITIALIZED,
81
81
  import_types.ErrorScope.TELEMETRY,
82
82
  import_types.ErrorType.USER,
83
- "Telemetry not initialized. Call Telemetry.init() first.",
83
+ "Telemetry not initialized. Call Telemetry.init() or Telemetry.registerGlobal() first.",
84
84
  {
85
- hint: "Ensure telemetry is initialized before accessing the global instance."
85
+ hint: "Ensure telemetry is initialized via Telemetry.init() or Telemetry.registerGlobal() before accessing the global instance."
86
86
  }
87
87
  );
88
88
  }
@@ -58,9 +58,9 @@ class TelemetryError {
58
58
  TelemetryErrorCode.NOT_INITIALIZED,
59
59
  ErrorScope.TELEMETRY,
60
60
  ErrorType.USER,
61
- "Telemetry not initialized. Call Telemetry.init() first.",
61
+ "Telemetry not initialized. Call Telemetry.init() or Telemetry.registerGlobal() first.",
62
62
  {
63
- hint: "Ensure telemetry is initialized before accessing the global instance."
63
+ hint: "Ensure telemetry is initialized via Telemetry.init() or Telemetry.registerGlobal() before accessing the global instance."
64
64
  }
65
65
  );
66
66
  }
@@ -1,4 +1,4 @@
1
- export { Telemetry } from './telemetry.js';
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
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,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"}
@@ -1,5 +1,7 @@
1
1
  import "../chunk-PTJYTZNU.js";
2
- import { Telemetry } from "./telemetry.js";
2
+ import {
3
+ Telemetry
4
+ } from "./telemetry.js";
3
5
  import { OtelConfigurationSchema } from "./schemas.js";
4
6
  export {
5
7
  OtelConfigurationSchema,
@@ -40,17 +40,17 @@ class Telemetry {
40
40
  name = "dexto-service";
41
41
  _isInitialized = false;
42
42
  _sdk;
43
+ _shutdownHandler;
43
44
  static _initPromise;
44
45
  static _signalHandlers;
45
- constructor(config, enabled, sdk) {
46
+ constructor(config, options) {
46
47
  const serviceName = config.serviceName ?? "dexto-service";
47
48
  const tracerName = config.tracerName ?? serviceName;
48
49
  this.name = serviceName;
49
50
  this.tracer = import_api.trace.getTracer(tracerName);
50
- if (sdk) {
51
- this._sdk = sdk;
52
- }
53
- this._isInitialized = enabled && !!sdk;
51
+ this._sdk = options.sdk;
52
+ this._shutdownHandler = options.shutdown;
53
+ this._isInitialized = options.initialized;
54
54
  }
55
55
  static async buildTraceExporter(config) {
56
56
  const e = config?.export;
@@ -178,7 +178,10 @@ class Telemetry {
178
178
  process.once("SIGINT", sigint);
179
179
  Telemetry._signalHandlers = { sigterm, sigint };
180
180
  }
181
- globalThis.__TELEMETRY__ = new Telemetry(config, enabled, sdk);
181
+ globalThis.__TELEMETRY__ = new Telemetry(config, {
182
+ initialized: enabled && !!sdk,
183
+ ...sdk !== void 0 && { sdk }
184
+ });
182
185
  }
183
186
  return globalThis.__TELEMETRY__;
184
187
  })();
@@ -194,6 +197,38 @@ class Telemetry {
194
197
  );
195
198
  }
196
199
  }
200
+ /**
201
+ * Register a global telemetry instance after a host installs its own provider/exporter lifecycle.
202
+ *
203
+ * This keeps core instrumentation active without forcing the default Node SDK bootstrap path.
204
+ */
205
+ static async registerGlobal(options = {}) {
206
+ try {
207
+ if (globalThis.__TELEMETRY__) return globalThis.__TELEMETRY__;
208
+ if (Telemetry._initPromise) return Telemetry._initPromise;
209
+ const config = options.config ?? {};
210
+ const initialized = options.initialized ?? true;
211
+ Telemetry._initPromise = Promise.resolve().then(() => {
212
+ if (!globalThis.__TELEMETRY__) {
213
+ globalThis.__TELEMETRY__ = new Telemetry(config, {
214
+ initialized,
215
+ ...options.shutdown !== void 0 && { shutdown: options.shutdown }
216
+ });
217
+ }
218
+ return globalThis.__TELEMETRY__;
219
+ });
220
+ return await Telemetry._initPromise;
221
+ } catch (error) {
222
+ Telemetry._initPromise = void 0;
223
+ if (error instanceof import_DextoRuntimeError.DextoRuntimeError) {
224
+ throw error;
225
+ }
226
+ throw import_errors.TelemetryError.initializationFailed(
227
+ error instanceof Error ? error.message : String(error),
228
+ error
229
+ );
230
+ }
231
+ }
197
232
  static getActiveSpan() {
198
233
  const span = import_api.trace.getActiveSpan();
199
234
  return span;
@@ -275,25 +310,31 @@ class Telemetry {
275
310
  * This ensures agent switching works even when telemetry export fails.
276
311
  */
277
312
  async shutdown() {
278
- if (this._sdk) {
279
- try {
313
+ try {
314
+ if (this._shutdownHandler) {
315
+ await this._shutdownHandler();
316
+ } else if (this._sdk) {
280
317
  await this._sdk.shutdown();
281
- } catch (error) {
282
- const errorMsg = error instanceof Error ? error.message : String(error);
283
- import_logger.logger.warn(`Telemetry shutdown failed to flush spans (non-blocking): ${errorMsg}`);
284
- } finally {
285
- this._isInitialized = false;
286
- globalThis.__TELEMETRY__ = void 0;
287
- if (Telemetry._signalHandlers) {
288
- process.off("SIGTERM", Telemetry._signalHandlers.sigterm);
289
- process.off("SIGINT", Telemetry._signalHandlers.sigint);
290
- Telemetry._signalHandlers = void 0;
291
- }
292
- this._sdk = void 0;
293
- Telemetry._initPromise = void 0;
294
318
  }
319
+ } catch (error) {
320
+ const errorMsg = error instanceof Error ? error.message : String(error);
321
+ import_logger.logger.warn(`Telemetry shutdown failed to flush spans (non-blocking): ${errorMsg}`);
322
+ } finally {
323
+ this.cleanupAfterShutdown();
295
324
  }
296
325
  }
326
+ cleanupAfterShutdown() {
327
+ this._isInitialized = false;
328
+ globalThis.__TELEMETRY__ = void 0;
329
+ if (Telemetry._signalHandlers) {
330
+ process.off("SIGTERM", Telemetry._signalHandlers.sigterm);
331
+ process.off("SIGINT", Telemetry._signalHandlers.sigint);
332
+ Telemetry._signalHandlers = void 0;
333
+ }
334
+ this._sdk = void 0;
335
+ this._shutdownHandler = void 0;
336
+ Telemetry._initPromise = void 0;
337
+ }
297
338
  }
298
339
  // Annotate the CommonJS export names for ESM import in node:
299
340
  0 && (module.exports = {
@@ -1,5 +1,11 @@
1
1
  import type { Tracer, Context, BaggageEntry } from '@opentelemetry/api';
2
2
  import type { OtelConfiguration } from './schemas.js';
3
+ export type TelemetryShutdownHandler = () => Promise<void>;
4
+ export type TelemetryRegistrationOptions = {
5
+ config?: OtelConfiguration | undefined;
6
+ initialized?: boolean | undefined;
7
+ shutdown?: TelemetryShutdownHandler | undefined;
8
+ };
3
9
  declare global {
4
10
  var __TELEMETRY__: Telemetry | undefined;
5
11
  }
@@ -17,6 +23,7 @@ export declare class Telemetry {
17
23
  name: string;
18
24
  private _isInitialized;
19
25
  private _sdk?;
26
+ private _shutdownHandler?;
20
27
  private static _initPromise?;
21
28
  private static _signalHandlers?;
22
29
  private constructor();
@@ -28,6 +35,12 @@ export declare class Telemetry {
28
35
  * @returns Telemetry instance that can be used for tracing
29
36
  */
30
37
  static init(config?: OtelConfiguration, exporter?: import('@opentelemetry/sdk-trace-base').SpanExporter): Promise<Telemetry>;
38
+ /**
39
+ * Register a global telemetry instance after a host installs its own provider/exporter lifecycle.
40
+ *
41
+ * This keeps core instrumentation active without forcing the default Node SDK bootstrap path.
42
+ */
43
+ static registerGlobal(options?: TelemetryRegistrationOptions): Promise<Telemetry>;
31
44
  static getActiveSpan(): import("@opentelemetry/api").Span | undefined;
32
45
  /**
33
46
  * Get the global telemetry instance
@@ -70,5 +83,6 @@ export declare class Telemetry {
70
83
  * This ensures agent switching works even when telemetry export fails.
71
84
  */
72
85
  shutdown(): Promise<void>;
86
+ private cleanupAfterShutdown;
73
87
  }
74
88
  //# sourceMappingURL=telemetry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/telemetry/telemetry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAYtD,OAAO,CAAC,MAAM,CAAC;IACX,IAAI,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;CAC5C;AAED;;;;;;;;GAQG;AACH,qBAAa,SAAS;IACX,MAAM,EAAE,MAAM,CAA4B;IACjD,IAAI,EAAE,MAAM,CAAmB;IAC/B,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,IAAI,CAAC,CAA0B;IACvC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAiC;IAC7D,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAA0D;IAEzF,OAAO;mBAYc,kBAAkB;IA0DvC;;;;;OAKG;WACU,IAAI,CACb,MAAM,GAAE,iBAAsB,EAC9B,QAAQ,CAAC,EAAE,OAAO,+BAA+B,EAAE,YAAY,GAChE,OAAO,CAAC,SAAS,CAAC;IA8HrB,MAAM,CAAC,aAAa;IAKpB;;;;OAIG;IACH,MAAM,CAAC,GAAG,IAAI,SAAS;IAOvB;;;OAGG;IACH,MAAM,CAAC,iBAAiB,IAAI,OAAO;IAInC;;;;;OAKG;WACU,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5C;;;OAGG;IACI,aAAa,IAAI,OAAO;IAI/B,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG,GAAE,OAA8B;IAc5F,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,IAAI;IAI/C;;;OAGG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUxC;;;;;;;;;OASG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CA8BzC"}
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/telemetry/telemetry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAUtD,MAAM,MAAM,wBAAwB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3D,MAAM,MAAM,4BAA4B,GAAG;IACvC,MAAM,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACvC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,EAAE,wBAAwB,GAAG,SAAS,CAAC;CACnD,CAAC;AASF,OAAO,CAAC,MAAM,CAAC;IACX,IAAI,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;CAC5C;AAED;;;;;;;;GAQG;AACH,qBAAa,SAAS;IACX,MAAM,EAAE,MAAM,CAA4B;IACjD,IAAI,EAAE,MAAM,CAAmB;IAC/B,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,IAAI,CAAC,CAA0B;IACvC,OAAO,CAAC,gBAAgB,CAAC,CAAuC;IAChE,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAiC;IAC7D,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAA0D;IAEzF,OAAO;mBAWc,kBAAkB;IA0DvC;;;;;OAKG;WACU,IAAI,CACb,MAAM,GAAE,iBAAsB,EAC9B,QAAQ,CAAC,EAAE,OAAO,+BAA+B,EAAE,YAAY,GAChE,OAAO,CAAC,SAAS,CAAC;IAiIrB;;;;OAIG;WACU,cAAc,CAAC,OAAO,GAAE,4BAAiC,GAAG,OAAO,CAAC,SAAS,CAAC;IAiC3F,MAAM,CAAC,aAAa;IAKpB;;;;OAIG;IACH,MAAM,CAAC,GAAG,IAAI,SAAS;IAOvB;;;OAGG;IACH,MAAM,CAAC,iBAAiB,IAAI,OAAO;IAInC;;;;;OAKG;WACU,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5C;;;OAGG;IACI,aAAa,IAAI,OAAO;IAI/B,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG,GAAE,OAA8B;IAc5F,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,IAAI;IAI/C;;;OAGG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUxC;;;;;;;;;OASG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBtC,OAAO,CAAC,oBAAoB;CAiB/B"}
@@ -8,17 +8,17 @@ class Telemetry {
8
8
  name = "dexto-service";
9
9
  _isInitialized = false;
10
10
  _sdk;
11
+ _shutdownHandler;
11
12
  static _initPromise;
12
13
  static _signalHandlers;
13
- constructor(config, enabled, sdk) {
14
+ constructor(config, options) {
14
15
  const serviceName = config.serviceName ?? "dexto-service";
15
16
  const tracerName = config.tracerName ?? serviceName;
16
17
  this.name = serviceName;
17
18
  this.tracer = trace.getTracer(tracerName);
18
- if (sdk) {
19
- this._sdk = sdk;
20
- }
21
- this._isInitialized = enabled && !!sdk;
19
+ this._sdk = options.sdk;
20
+ this._shutdownHandler = options.shutdown;
21
+ this._isInitialized = options.initialized;
22
22
  }
23
23
  static async buildTraceExporter(config) {
24
24
  const e = config?.export;
@@ -146,7 +146,10 @@ class Telemetry {
146
146
  process.once("SIGINT", sigint);
147
147
  Telemetry._signalHandlers = { sigterm, sigint };
148
148
  }
149
- globalThis.__TELEMETRY__ = new Telemetry(config, enabled, sdk);
149
+ globalThis.__TELEMETRY__ = new Telemetry(config, {
150
+ initialized: enabled && !!sdk,
151
+ ...sdk !== void 0 && { sdk }
152
+ });
150
153
  }
151
154
  return globalThis.__TELEMETRY__;
152
155
  })();
@@ -162,6 +165,38 @@ class Telemetry {
162
165
  );
163
166
  }
164
167
  }
168
+ /**
169
+ * Register a global telemetry instance after a host installs its own provider/exporter lifecycle.
170
+ *
171
+ * This keeps core instrumentation active without forcing the default Node SDK bootstrap path.
172
+ */
173
+ static async registerGlobal(options = {}) {
174
+ try {
175
+ if (globalThis.__TELEMETRY__) return globalThis.__TELEMETRY__;
176
+ if (Telemetry._initPromise) return Telemetry._initPromise;
177
+ const config = options.config ?? {};
178
+ const initialized = options.initialized ?? true;
179
+ Telemetry._initPromise = Promise.resolve().then(() => {
180
+ if (!globalThis.__TELEMETRY__) {
181
+ globalThis.__TELEMETRY__ = new Telemetry(config, {
182
+ initialized,
183
+ ...options.shutdown !== void 0 && { shutdown: options.shutdown }
184
+ });
185
+ }
186
+ return globalThis.__TELEMETRY__;
187
+ });
188
+ return await Telemetry._initPromise;
189
+ } catch (error) {
190
+ Telemetry._initPromise = void 0;
191
+ if (error instanceof DextoRuntimeError) {
192
+ throw error;
193
+ }
194
+ throw TelemetryError.initializationFailed(
195
+ error instanceof Error ? error.message : String(error),
196
+ error
197
+ );
198
+ }
199
+ }
165
200
  static getActiveSpan() {
166
201
  const span = trace.getActiveSpan();
167
202
  return span;
@@ -243,25 +278,31 @@ class Telemetry {
243
278
  * This ensures agent switching works even when telemetry export fails.
244
279
  */
245
280
  async shutdown() {
246
- if (this._sdk) {
247
- try {
281
+ try {
282
+ if (this._shutdownHandler) {
283
+ await this._shutdownHandler();
284
+ } else if (this._sdk) {
248
285
  await this._sdk.shutdown();
249
- } catch (error) {
250
- const errorMsg = error instanceof Error ? error.message : String(error);
251
- logger.warn(`Telemetry shutdown failed to flush spans (non-blocking): ${errorMsg}`);
252
- } finally {
253
- this._isInitialized = false;
254
- globalThis.__TELEMETRY__ = void 0;
255
- if (Telemetry._signalHandlers) {
256
- process.off("SIGTERM", Telemetry._signalHandlers.sigterm);
257
- process.off("SIGINT", Telemetry._signalHandlers.sigint);
258
- Telemetry._signalHandlers = void 0;
259
- }
260
- this._sdk = void 0;
261
- Telemetry._initPromise = void 0;
262
286
  }
287
+ } catch (error) {
288
+ const errorMsg = error instanceof Error ? error.message : String(error);
289
+ logger.warn(`Telemetry shutdown failed to flush spans (non-blocking): ${errorMsg}`);
290
+ } finally {
291
+ this.cleanupAfterShutdown();
263
292
  }
264
293
  }
294
+ cleanupAfterShutdown() {
295
+ this._isInitialized = false;
296
+ globalThis.__TELEMETRY__ = void 0;
297
+ if (Telemetry._signalHandlers) {
298
+ process.off("SIGTERM", Telemetry._signalHandlers.sigterm);
299
+ process.off("SIGINT", Telemetry._signalHandlers.sigint);
300
+ Telemetry._signalHandlers = void 0;
301
+ }
302
+ this._sdk = void 0;
303
+ this._shutdownHandler = void 0;
304
+ Telemetry._initPromise = void 0;
305
+ }
265
306
  }
266
307
  export {
267
308
  Telemetry
@@ -25,6 +25,7 @@ __export(utils_exports, {
25
25
  module.exports = __toCommonJS(utils_exports);
26
26
  var import_api = require("@opentelemetry/api");
27
27
  var import_telemetry = require("./telemetry.js");
28
+ var import_runtime = require("../runtime/index.js");
28
29
  function hasActiveTelemetry(logger) {
29
30
  logger?.silly("hasActiveTelemetry called.");
30
31
  try {
@@ -48,8 +49,9 @@ function getBaggageValues(ctx, logger) {
48
49
  const threadId = currentBaggage?.getEntry("threadId")?.value;
49
50
  const resourceId = currentBaggage?.getEntry("resourceId")?.value;
50
51
  const sessionId = currentBaggage?.getEntry("sessionId")?.value;
52
+ const hostRuntime = (0, import_runtime.getHostRuntimeContextFromBaggage)(ctx);
51
53
  logger?.silly(
52
- `getBaggageValues: Extracted - requestId: ${requestId}, componentName: ${componentName}, runId: ${runId}, threadId: ${threadId}, resourceId: ${resourceId}, sessionId: ${sessionId}`
54
+ `getBaggageValues: Extracted - requestId: ${requestId}, componentName: ${componentName}, runId: ${runId}, threadId: ${threadId}, resourceId: ${resourceId}, sessionId: ${sessionId}, hostRuntimeIds: ${JSON.stringify(hostRuntime?.ids ?? {})}`
53
55
  );
54
56
  return {
55
57
  requestId,
@@ -57,15 +59,13 @@ function getBaggageValues(ctx, logger) {
57
59
  runId,
58
60
  threadId,
59
61
  resourceId,
60
- sessionId
62
+ sessionId,
63
+ hostRuntime
61
64
  };
62
65
  }
63
66
  function addBaggageAttributesToSpan(span, ctx, logger) {
64
67
  logger?.debug("addBaggageAttributesToSpan called.");
65
- const { requestId, componentName, runId, threadId, resourceId, sessionId } = getBaggageValues(
66
- ctx,
67
- logger
68
- );
68
+ const { requestId, componentName, runId, threadId, resourceId, sessionId, hostRuntime } = getBaggageValues(ctx, logger);
69
69
  if (componentName) {
70
70
  span.setAttribute("componentName", componentName);
71
71
  }
@@ -84,6 +84,9 @@ function addBaggageAttributesToSpan(span, ctx, logger) {
84
84
  if (sessionId) {
85
85
  span.setAttribute("sessionId", sessionId);
86
86
  }
87
+ for (const [key, value] of Object.entries((0, import_runtime.getHostRuntimeAttributes)(hostRuntime))) {
88
+ span.setAttribute(key, value);
89
+ }
87
90
  logger?.debug("addBaggageAttributesToSpan: Baggage attributes added to span.");
88
91
  }
89
92
  // Annotate the CommonJS export names for ESM import in node:
@@ -14,6 +14,9 @@ export declare function getBaggageValues(ctx: Context, logger?: Logger): {
14
14
  threadId: string | undefined;
15
15
  resourceId: string | undefined;
16
16
  sessionId: string | undefined;
17
+ hostRuntime: {
18
+ ids?: Record<string, string> | undefined;
19
+ } | undefined;
17
20
  };
18
21
  /**
19
22
  * Attaches baggage values from the given context to the provided span as attributes.
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/telemetry/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAGpD,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAa3D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM;;;;;;;EAoB7D;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CA0B1F"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/telemetry/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAIpD,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAa3D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM;;;;;;;;;;EAsB7D;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CA2B1F"}
@@ -1,6 +1,7 @@
1
1
  import "../chunk-PTJYTZNU.js";
2
2
  import { propagation } from "@opentelemetry/api";
3
3
  import { Telemetry } from "./telemetry.js";
4
+ import { getHostRuntimeAttributes, getHostRuntimeContextFromBaggage } from "../runtime/index.js";
4
5
  function hasActiveTelemetry(logger) {
5
6
  logger?.silly("hasActiveTelemetry called.");
6
7
  try {
@@ -24,8 +25,9 @@ function getBaggageValues(ctx, logger) {
24
25
  const threadId = currentBaggage?.getEntry("threadId")?.value;
25
26
  const resourceId = currentBaggage?.getEntry("resourceId")?.value;
26
27
  const sessionId = currentBaggage?.getEntry("sessionId")?.value;
28
+ const hostRuntime = getHostRuntimeContextFromBaggage(ctx);
27
29
  logger?.silly(
28
- `getBaggageValues: Extracted - requestId: ${requestId}, componentName: ${componentName}, runId: ${runId}, threadId: ${threadId}, resourceId: ${resourceId}, sessionId: ${sessionId}`
30
+ `getBaggageValues: Extracted - requestId: ${requestId}, componentName: ${componentName}, runId: ${runId}, threadId: ${threadId}, resourceId: ${resourceId}, sessionId: ${sessionId}, hostRuntimeIds: ${JSON.stringify(hostRuntime?.ids ?? {})}`
29
31
  );
30
32
  return {
31
33
  requestId,
@@ -33,15 +35,13 @@ function getBaggageValues(ctx, logger) {
33
35
  runId,
34
36
  threadId,
35
37
  resourceId,
36
- sessionId
38
+ sessionId,
39
+ hostRuntime
37
40
  };
38
41
  }
39
42
  function addBaggageAttributesToSpan(span, ctx, logger) {
40
43
  logger?.debug("addBaggageAttributesToSpan called.");
41
- const { requestId, componentName, runId, threadId, resourceId, sessionId } = getBaggageValues(
42
- ctx,
43
- logger
44
- );
44
+ const { requestId, componentName, runId, threadId, resourceId, sessionId, hostRuntime } = getBaggageValues(ctx, logger);
45
45
  if (componentName) {
46
46
  span.setAttribute("componentName", componentName);
47
47
  }
@@ -60,6 +60,9 @@ function addBaggageAttributesToSpan(span, ctx, logger) {
60
60
  if (sessionId) {
61
61
  span.setAttribute("sessionId", sessionId);
62
62
  }
63
+ for (const [key, value] of Object.entries(getHostRuntimeAttributes(hostRuntime))) {
64
+ span.setAttribute(key, value);
65
+ }
63
66
  logger?.debug("addBaggageAttributesToSpan: Baggage attributes added to span.");
64
67
  }
65
68
  export {