autotel-devtools 16.0.0 → 17.1.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 (58) hide show
  1. package/dist/cli.cjs +2 -3
  2. package/dist/cli.js +2 -3
  3. package/dist/{error-aggregator-BrgYNNoC.d.ts → error-aggregator-CGgWr2OH.d.cts} +2 -3
  4. package/dist/{error-aggregator-bZ-prq97.d.cts → error-aggregator-DufjI2IG.d.ts} +2 -3
  5. package/dist/{exporter-BLqTs00O.d.ts → exporter-BJwufQwg.d.ts} +10 -2
  6. package/dist/{exporter-BSIS3Qgy.d.cts → exporter-CEKKJTci.d.cts} +10 -2
  7. package/dist/genai/index.cjs +1 -2
  8. package/dist/genai/index.d.cts +1 -2
  9. package/dist/genai/index.d.ts +1 -2
  10. package/dist/genai/index.js +1 -2
  11. package/dist/{http-yIS667nX.js → http-BLmWVZP0.js} +12 -8
  12. package/dist/{http-BUHnkhrC.cjs → http-bOYC2_Z0.cjs} +12 -8
  13. package/dist/index.cjs +2 -3
  14. package/dist/index.d.cts +3 -4
  15. package/dist/index.d.ts +3 -4
  16. package/dist/index.js +2 -3
  17. package/dist/listen-DGzVi7DE.cjs +1 -2
  18. package/dist/listen-NVMbBWHw.js +1 -2
  19. package/dist/resource-utils-B4UVvfnH.js +1 -2
  20. package/dist/resource-utils-DjHJB6uc.cjs +1 -2
  21. package/dist/server/exporter.cjs +5 -4
  22. package/dist/server/exporter.d.cts +1 -1
  23. package/dist/server/exporter.d.ts +1 -1
  24. package/dist/server/exporter.js +6 -4
  25. package/dist/server/index.cjs +1 -1
  26. package/dist/server/index.d.cts +3 -4
  27. package/dist/server/index.d.ts +3 -4
  28. package/dist/server/index.js +1 -1
  29. package/dist/server/log-exporter.cjs +1 -2
  30. package/dist/server/log-exporter.d.cts +1 -2
  31. package/dist/server/log-exporter.d.ts +1 -2
  32. package/dist/server/log-exporter.js +1 -2
  33. package/dist/server/remote-exporter.cjs +1 -2
  34. package/dist/server/remote-exporter.d.cts +1 -2
  35. package/dist/server/remote-exporter.d.ts +1 -2
  36. package/dist/server/remote-exporter.js +1 -2
  37. package/dist/trace-root-BMa667jK.cjs +36 -0
  38. package/dist/trace-root-EHnvuA7f.js +30 -0
  39. package/dist/widget.global.js +14 -13
  40. package/package.json +18 -18
  41. package/dist/cli.cjs.map +0 -1
  42. package/dist/cli.js.map +0 -1
  43. package/dist/genai/index.cjs.map +0 -1
  44. package/dist/genai/index.js.map +0 -1
  45. package/dist/http-BUHnkhrC.cjs.map +0 -1
  46. package/dist/http-yIS667nX.js.map +0 -1
  47. package/dist/index.cjs.map +0 -1
  48. package/dist/index.js.map +0 -1
  49. package/dist/listen-DGzVi7DE.cjs.map +0 -1
  50. package/dist/listen-NVMbBWHw.js.map +0 -1
  51. package/dist/resource-utils-B4UVvfnH.js.map +0 -1
  52. package/dist/resource-utils-DjHJB6uc.cjs.map +0 -1
  53. package/dist/server/exporter.cjs.map +0 -1
  54. package/dist/server/exporter.js.map +0 -1
  55. package/dist/server/log-exporter.cjs.map +0 -1
  56. package/dist/server/log-exporter.js.map +0 -1
  57. package/dist/server/remote-exporter.cjs.map +0 -1
  58. package/dist/server/remote-exporter.js.map +0 -1
package/dist/cli.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- const require_http = require('./http-BUHnkhrC.cjs');
2
+ const require_http = require('./http-bOYC2_Z0.cjs');
3
3
  const require_listen = require('./listen-DGzVi7DE.cjs');
4
4
  let node_http = require("node:http");
5
5
  let node_fs = require("node:fs");
@@ -227,5 +227,4 @@ main().catch((error) => {
227
227
  process.exit(1);
228
228
  });
229
229
 
230
- //#endregion
231
- //# sourceMappingURL=cli.cjs.map
230
+ //#endregion
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { d as DevtoolsServer, i as probePortHolder, p as hostHeaderIsLoopback, t as attachDevtoolsRoutes } from "./http-yIS667nX.js";
2
+ import { d as DevtoolsServer, i as probePortHolder, p as hostHeaderIsLoopback, t as attachDevtoolsRoutes } from "./http-BLmWVZP0.js";
3
3
  import { t as listenLoopbackDualStack } from "./listen-NVMbBWHw.js";
4
4
  import { createServer } from "node:http";
5
5
  import { readFileSync } from "node:fs";
@@ -228,5 +228,4 @@ main().catch((error) => {
228
228
  });
229
229
 
230
230
  //#endregion
231
- export { };
232
- //# sourceMappingURL=cli.js.map
231
+ export { };
@@ -1,4 +1,4 @@
1
- import { a as ErrorGroup, o as ErrorOccurrence, u as TraceData } from "./exporter-BLqTs00O.js";
1
+ import { a as ErrorGroup, o as ErrorOccurrence, u as TraceData } from "./exporter-CEKKJTci.cjs";
2
2
  //#region src/server/error-aggregator.d.ts
3
3
  interface ErrorAggregatorOptions {
4
4
  /**
@@ -115,5 +115,4 @@ declare class ErrorAggregator {
115
115
  clearOlderThan(maxAgeMs: number): number;
116
116
  }
117
117
  //#endregion
118
- export { ErrorAggregator as t };
119
- //# sourceMappingURL=error-aggregator-BrgYNNoC.d.ts.map
118
+ export { ErrorAggregator as t };
@@ -1,4 +1,4 @@
1
- import { a as ErrorGroup, o as ErrorOccurrence, u as TraceData } from "./exporter-BSIS3Qgy.cjs";
1
+ import { a as ErrorGroup, o as ErrorOccurrence, u as TraceData } from "./exporter-BJwufQwg.js";
2
2
  //#region src/server/error-aggregator.d.ts
3
3
  interface ErrorAggregatorOptions {
4
4
  /**
@@ -115,5 +115,4 @@ declare class ErrorAggregator {
115
115
  clearOlderThan(maxAgeMs: number): number;
116
116
  }
117
117
  //#endregion
118
- export { ErrorAggregator as t };
119
- //# sourceMappingURL=error-aggregator-bZ-prq97.d.cts.map
118
+ export { ErrorAggregator as t };
@@ -42,6 +42,15 @@ interface TraceData {
42
42
  duration: number;
43
43
  status: 'OK' | 'ERROR' | 'UNSET';
44
44
  service: string;
45
+ /**
46
+ * True when no span in this trace is a true root: every span received has a
47
+ * parent that did not arrive. The trace is a fragment, normally because
48
+ * sampling kept only part of it or because the rest is still in flight.
49
+ * `rootSpan` is then the earliest span whose parent is absent rather than the
50
+ * real root, and the duration covers only the part present. Recomputed as
51
+ * spans merge, so it clears once the real root arrives.
52
+ */
53
+ partial?: boolean;
45
54
  }
46
55
  interface LogData {
47
56
  id: string;
@@ -187,5 +196,4 @@ declare class DevtoolsSpanExporter implements SpanExporter {
187
196
  private convertSpanKind;
188
197
  }
189
198
  //#endregion
190
- export { ErrorGroup as a, MetricData as c, DevtoolsData as i, SpanData as l, DevtoolsServer as n, ErrorOccurrence as o, DevtoolsServerOptions as r, LogData as s, DevtoolsSpanExporter as t, TraceData as u };
191
- //# sourceMappingURL=exporter-BLqTs00O.d.ts.map
199
+ export { ErrorGroup as a, MetricData as c, DevtoolsData as i, SpanData as l, DevtoolsServer as n, ErrorOccurrence as o, DevtoolsServerOptions as r, LogData as s, DevtoolsSpanExporter as t, TraceData as u };
@@ -42,6 +42,15 @@ interface TraceData {
42
42
  duration: number;
43
43
  status: 'OK' | 'ERROR' | 'UNSET';
44
44
  service: string;
45
+ /**
46
+ * True when no span in this trace is a true root: every span received has a
47
+ * parent that did not arrive. The trace is a fragment, normally because
48
+ * sampling kept only part of it or because the rest is still in flight.
49
+ * `rootSpan` is then the earliest span whose parent is absent rather than the
50
+ * real root, and the duration covers only the part present. Recomputed as
51
+ * spans merge, so it clears once the real root arrives.
52
+ */
53
+ partial?: boolean;
45
54
  }
46
55
  interface LogData {
47
56
  id: string;
@@ -187,5 +196,4 @@ declare class DevtoolsSpanExporter implements SpanExporter {
187
196
  private convertSpanKind;
188
197
  }
189
198
  //#endregion
190
- export { ErrorGroup as a, MetricData as c, DevtoolsData as i, SpanData as l, DevtoolsServer as n, ErrorOccurrence as o, DevtoolsServerOptions as r, LogData as s, DevtoolsSpanExporter as t, TraceData as u };
191
- //# sourceMappingURL=exporter-BSIS3Qgy.d.cts.map
199
+ export { ErrorGroup as a, MetricData as c, DevtoolsData as i, SpanData as l, DevtoolsServer as n, ErrorOccurrence as o, DevtoolsServerOptions as r, LogData as s, DevtoolsSpanExporter as t, TraceData as u };
@@ -874,5 +874,4 @@ exports.hydrateToolResults = hydrateToolResults;
874
874
  exports.isGenAiSpan = isGenAiSpan;
875
875
  exports.lookupPrice = lookupPrice;
876
876
  exports.priceCall = priceCall;
877
- exports.toGenAiSpan = toGenAiSpan;
878
- //# sourceMappingURL=index.cjs.map
877
+ exports.toGenAiSpan = toGenAiSpan;
@@ -243,5 +243,4 @@ interface PriceOutputs {
243
243
  }
244
244
  declare function priceCall(inputs: PriceInputs): PriceOutputs;
245
245
  //#endregion
246
- export { type GenAiCost, type GenAiGuard, type GenAiMessage, type GenAiMessagePart, type GenAiOperation, type GenAiRole, type GenAiSession, type GenAiSpan, type GenAiStreaming, type GenAiToolCall, type GenAiToolDef, type GenAiUsage, type GenAiWarning, buildToolResultIndex, hydrateToolResults, isGenAiSpan, lookupPrice, priceCall, toGenAiSpan };
247
- //# sourceMappingURL=index.d.cts.map
246
+ export { type GenAiCost, type GenAiGuard, type GenAiMessage, type GenAiMessagePart, type GenAiOperation, type GenAiRole, type GenAiSession, type GenAiSpan, type GenAiStreaming, type GenAiToolCall, type GenAiToolDef, type GenAiUsage, type GenAiWarning, buildToolResultIndex, hydrateToolResults, isGenAiSpan, lookupPrice, priceCall, toGenAiSpan };
@@ -243,5 +243,4 @@ interface PriceOutputs {
243
243
  }
244
244
  declare function priceCall(inputs: PriceInputs): PriceOutputs;
245
245
  //#endregion
246
- export { type GenAiCost, type GenAiGuard, type GenAiMessage, type GenAiMessagePart, type GenAiOperation, type GenAiRole, type GenAiSession, type GenAiSpan, type GenAiStreaming, type GenAiToolCall, type GenAiToolDef, type GenAiUsage, type GenAiWarning, buildToolResultIndex, hydrateToolResults, isGenAiSpan, lookupPrice, priceCall, toGenAiSpan };
247
- //# sourceMappingURL=index.d.ts.map
246
+ export { type GenAiCost, type GenAiGuard, type GenAiMessage, type GenAiMessagePart, type GenAiOperation, type GenAiRole, type GenAiSession, type GenAiSpan, type GenAiStreaming, type GenAiToolCall, type GenAiToolDef, type GenAiUsage, type GenAiWarning, buildToolResultIndex, hydrateToolResults, isGenAiSpan, lookupPrice, priceCall, toGenAiSpan };
@@ -867,5 +867,4 @@ function hydrateToolResults(genAiSpan, index) {
867
867
  }
868
868
 
869
869
  //#endregion
870
- export { buildToolResultIndex, hydrateToolResults, isGenAiSpan, lookupPrice, priceCall, toGenAiSpan };
871
- //# sourceMappingURL=index.js.map
870
+ export { buildToolResultIndex, hydrateToolResults, isGenAiSpan, lookupPrice, priceCall, toGenAiSpan };
@@ -1,3 +1,4 @@
1
+ import { t as pickRoot } from "./trace-root-EHnvuA7f.js";
1
2
  import { t as getResourceName } from "./resource-utils-B4UVvfnH.js";
2
3
  import { createServer } from "node:http";
3
4
  import { WebSocket, WebSocketServer } from "ws";
@@ -426,10 +427,13 @@ var DevtoolsServer = class {
426
427
  existing.endTime = Math.max(existing.endTime, trace.endTime);
427
428
  existing.duration = existing.endTime - existing.startTime;
428
429
  if (trace.status === "ERROR") existing.status = "ERROR";
429
- const root = existing.spans.find((s) => !s.parentSpanId);
430
- if (root) {
431
- existing.rootSpan = root;
432
- const rootService = root.attributes?.["service.name"];
430
+ existing.spans.sort((a, b) => a.startTime - b.startTime);
431
+ const { rootSpan, partial } = pickRoot(existing.spans);
432
+ existing.rootSpan = rootSpan;
433
+ if (partial) existing.partial = true;
434
+ else {
435
+ delete existing.partial;
436
+ const rootService = rootSpan.attributes?.["service.name"];
433
437
  if (typeof rootService === "string" && rootService.length > 0) existing.service = rootService;
434
438
  }
435
439
  } else this.traces = appendWithLimit(this.traces, trace, this.limits.maxTraceCount);
@@ -635,7 +639,7 @@ function parseOtlpTraces(payload) {
635
639
  const traces = [];
636
640
  for (const [traceId, { spans, service }] of traceMap) {
637
641
  const sorted = spans.sort((a, b) => a.startTime - b.startTime);
638
- const rootSpan = sorted.find((s) => !s.parentSpanId) || sorted[0];
642
+ const { rootSpan, partial } = pickRoot(sorted);
639
643
  const startTime = Math.min(...sorted.map((s) => s.startTime));
640
644
  const endTime = Math.max(...sorted.map((s) => s.endTime));
641
645
  const hasError = sorted.some((s) => s.status.code === "ERROR");
@@ -648,7 +652,8 @@ function parseOtlpTraces(payload) {
648
652
  endTime,
649
653
  duration: endTime - startTime,
650
654
  status: hasError ? "ERROR" : "OK",
651
- service
655
+ service,
656
+ ...partial ? { partial: true } : {}
652
657
  });
653
658
  }
654
659
  return traces;
@@ -1281,5 +1286,4 @@ function createDevtoolsHttpServer(devtools, _options = {}) {
1281
1286
  }
1282
1287
 
1283
1288
  //#endregion
1284
- export { appendWithLimit as _, decodeOtlpLogsRequest as a, ErrorAggregator as b, isProtobufContentType as c, DevtoolsServer as d, allowSensitiveRequest as f, appendManyWithLimit as g, originIsLoopback as h, probePortHolder as i, parseOtlpLogs as l, isLoopbackHostname as m, createDevtoolsHttpServer as n, decodeOtlpMetricsRequest as o, hostHeaderIsLoopback as p, DEVTOOLS_IDENTITY as r, decodeOtlpTraceRequest as s, attachDevtoolsRoutes as t, parseOtlpTraces as u, applyTelemetryLimits as v, resolveTelemetryLimits as y };
1285
- //# sourceMappingURL=http-yIS667nX.js.map
1289
+ export { appendWithLimit as _, decodeOtlpLogsRequest as a, ErrorAggregator as b, isProtobufContentType as c, DevtoolsServer as d, allowSensitiveRequest as f, appendManyWithLimit as g, originIsLoopback as h, probePortHolder as i, parseOtlpLogs as l, isLoopbackHostname as m, createDevtoolsHttpServer as n, decodeOtlpMetricsRequest as o, hostHeaderIsLoopback as p, DEVTOOLS_IDENTITY as r, decodeOtlpTraceRequest as s, attachDevtoolsRoutes as t, parseOtlpTraces as u, applyTelemetryLimits as v, resolveTelemetryLimits as y };
@@ -25,6 +25,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
25
25
  }) : target, mod));
26
26
 
27
27
  //#endregion
28
+ const require_trace_root = require('./trace-root-BMa667jK.cjs');
28
29
  const require_resource_utils = require('./resource-utils-DjHJB6uc.cjs');
29
30
  let node_http = require("node:http");
30
31
  let ws = require("ws");
@@ -454,10 +455,13 @@ var DevtoolsServer = class {
454
455
  existing.endTime = Math.max(existing.endTime, trace.endTime);
455
456
  existing.duration = existing.endTime - existing.startTime;
456
457
  if (trace.status === "ERROR") existing.status = "ERROR";
457
- const root = existing.spans.find((s) => !s.parentSpanId);
458
- if (root) {
459
- existing.rootSpan = root;
460
- const rootService = root.attributes?.["service.name"];
458
+ existing.spans.sort((a, b) => a.startTime - b.startTime);
459
+ const { rootSpan, partial } = require_trace_root.pickRoot(existing.spans);
460
+ existing.rootSpan = rootSpan;
461
+ if (partial) existing.partial = true;
462
+ else {
463
+ delete existing.partial;
464
+ const rootService = rootSpan.attributes?.["service.name"];
461
465
  if (typeof rootService === "string" && rootService.length > 0) existing.service = rootService;
462
466
  }
463
467
  } else this.traces = appendWithLimit(this.traces, trace, this.limits.maxTraceCount);
@@ -663,7 +667,7 @@ function parseOtlpTraces(payload) {
663
667
  const traces = [];
664
668
  for (const [traceId, { spans, service }] of traceMap) {
665
669
  const sorted = spans.sort((a, b) => a.startTime - b.startTime);
666
- const rootSpan = sorted.find((s) => !s.parentSpanId) || sorted[0];
670
+ const { rootSpan, partial } = require_trace_root.pickRoot(sorted);
667
671
  const startTime = Math.min(...sorted.map((s) => s.startTime));
668
672
  const endTime = Math.max(...sorted.map((s) => s.endTime));
669
673
  const hasError = sorted.some((s) => s.status.code === "ERROR");
@@ -676,7 +680,8 @@ function parseOtlpTraces(payload) {
676
680
  endTime,
677
681
  duration: endTime - startTime,
678
682
  status: hasError ? "ERROR" : "OK",
679
- service
683
+ service,
684
+ ...partial ? { partial: true } : {}
680
685
  });
681
686
  }
682
687
  return traces;
@@ -1428,5 +1433,4 @@ Object.defineProperty(exports, 'resolveTelemetryLimits', {
1428
1433
  get: function () {
1429
1434
  return resolveTelemetryLimits;
1430
1435
  }
1431
- });
1432
- //# sourceMappingURL=http-BUHnkhrC.cjs.map
1436
+ });
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_http = require('./http-BUHnkhrC.cjs');
2
+ const require_http = require('./http-bOYC2_Z0.cjs');
3
3
  const require_listen = require('./listen-DGzVi7DE.cjs');
4
4
  const require_server_exporter = require('./server/exporter.cjs');
5
5
  const require_server_log_exporter = require('./server/log-exporter.cjs');
@@ -49,5 +49,4 @@ exports.DevtoolsRemoteExporter = require_server_remote_exporter.DevtoolsRemoteEx
49
49
  exports.DevtoolsServer = require_http.DevtoolsServer;
50
50
  exports.DevtoolsSpanExporter = require_server_exporter.DevtoolsSpanExporter;
51
51
  exports.ErrorAggregator = require_http.ErrorAggregator;
52
- exports.createDevtools = createDevtools;
53
- //# sourceMappingURL=index.cjs.map
52
+ exports.createDevtools = createDevtools;
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
- import { a as ErrorGroup, c as MetricData, i as DevtoolsData, l as SpanData, n as DevtoolsServer, s as LogData, t as DevtoolsSpanExporter, u as TraceData } from "./exporter-BSIS3Qgy.cjs";
1
+ import { a as ErrorGroup, c as MetricData, i as DevtoolsData, l as SpanData, n as DevtoolsServer, s as LogData, t as DevtoolsSpanExporter, u as TraceData } from "./exporter-CEKKJTci.cjs";
2
2
  import { DevtoolsLogExporter } from "./server/log-exporter.cjs";
3
3
  import { DevtoolsRemoteExporter } from "./server/remote-exporter.cjs";
4
- import { t as ErrorAggregator } from "./error-aggregator-bZ-prq97.cjs";
4
+ import { t as ErrorAggregator } from "./error-aggregator-CGgWr2OH.cjs";
5
5
  import { Server } from "node:http";
6
6
  //#region src/index.d.ts
7
7
  interface CreateDevtoolsOptions {
@@ -22,5 +22,4 @@ interface DevtoolsInstance {
22
22
  }
23
23
  declare function createDevtools(options?: CreateDevtoolsOptions): DevtoolsInstance;
24
24
  //#endregion
25
- export { CreateDevtoolsOptions, type DevtoolsData, DevtoolsInstance, DevtoolsLogExporter, DevtoolsRemoteExporter, DevtoolsServer, DevtoolsSpanExporter, ErrorAggregator, type ErrorGroup, type LogData, type MetricData, type SpanData, type TraceData, createDevtools };
26
- //# sourceMappingURL=index.d.cts.map
25
+ export { CreateDevtoolsOptions, type DevtoolsData, DevtoolsInstance, DevtoolsLogExporter, DevtoolsRemoteExporter, DevtoolsServer, DevtoolsSpanExporter, ErrorAggregator, type ErrorGroup, type LogData, type MetricData, type SpanData, type TraceData, createDevtools };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { a as ErrorGroup, c as MetricData, i as DevtoolsData, l as SpanData, n as DevtoolsServer, s as LogData, t as DevtoolsSpanExporter, u as TraceData } from "./exporter-BLqTs00O.js";
1
+ import { a as ErrorGroup, c as MetricData, i as DevtoolsData, l as SpanData, n as DevtoolsServer, s as LogData, t as DevtoolsSpanExporter, u as TraceData } from "./exporter-BJwufQwg.js";
2
2
  import { DevtoolsLogExporter } from "./server/log-exporter.js";
3
3
  import { DevtoolsRemoteExporter } from "./server/remote-exporter.js";
4
- import { t as ErrorAggregator } from "./error-aggregator-BrgYNNoC.js";
4
+ import { t as ErrorAggregator } from "./error-aggregator-DufjI2IG.js";
5
5
  import { Server } from "node:http";
6
6
  //#region src/index.d.ts
7
7
  interface CreateDevtoolsOptions {
@@ -22,5 +22,4 @@ interface DevtoolsInstance {
22
22
  }
23
23
  declare function createDevtools(options?: CreateDevtoolsOptions): DevtoolsInstance;
24
24
  //#endregion
25
- export { CreateDevtoolsOptions, type DevtoolsData, DevtoolsInstance, DevtoolsLogExporter, DevtoolsRemoteExporter, DevtoolsServer, DevtoolsSpanExporter, ErrorAggregator, type ErrorGroup, type LogData, type MetricData, type SpanData, type TraceData, createDevtools };
26
- //# sourceMappingURL=index.d.ts.map
25
+ export { CreateDevtoolsOptions, type DevtoolsData, DevtoolsInstance, DevtoolsLogExporter, DevtoolsRemoteExporter, DevtoolsServer, DevtoolsSpanExporter, ErrorAggregator, type ErrorGroup, type LogData, type MetricData, type SpanData, type TraceData, createDevtools };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { b as ErrorAggregator, d as DevtoolsServer, p as hostHeaderIsLoopback, t as attachDevtoolsRoutes } from "./http-yIS667nX.js";
1
+ import { b as ErrorAggregator, d as DevtoolsServer, p as hostHeaderIsLoopback, t as attachDevtoolsRoutes } from "./http-BLmWVZP0.js";
2
2
  import { t as listenLoopbackDualStack } from "./listen-NVMbBWHw.js";
3
3
  import { DevtoolsSpanExporter } from "./server/exporter.js";
4
4
  import { DevtoolsLogExporter } from "./server/log-exporter.js";
@@ -43,5 +43,4 @@ function createDevtools(options = {}) {
43
43
  }
44
44
 
45
45
  //#endregion
46
- export { DevtoolsLogExporter, DevtoolsRemoteExporter, DevtoolsServer, DevtoolsSpanExporter, ErrorAggregator, createDevtools };
47
- //# sourceMappingURL=index.js.map
46
+ export { DevtoolsLogExporter, DevtoolsRemoteExporter, DevtoolsServer, DevtoolsSpanExporter, ErrorAggregator, createDevtools };
@@ -121,5 +121,4 @@ Object.defineProperty(exports, 'listenLoopbackDualStack', {
121
121
  get: function () {
122
122
  return listenLoopbackDualStack;
123
123
  }
124
- });
125
- //# sourceMappingURL=listen-DGzVi7DE.cjs.map
124
+ });
@@ -116,5 +116,4 @@ function listenLoopbackDualStack(args) {
116
116
  }
117
117
 
118
118
  //#endregion
119
- export { listenLoopbackDualStack as t };
120
- //# sourceMappingURL=listen-NVMbBWHw.js.map
119
+ export { listenLoopbackDualStack as t };
@@ -14,5 +14,4 @@ function getResourceName(resource, fallback = "unknown") {
14
14
  }
15
15
 
16
16
  //#endregion
17
- export { getResourceName as t };
18
- //# sourceMappingURL=resource-utils-B4UVvfnH.js.map
17
+ export { getResourceName as t };
@@ -20,5 +20,4 @@ Object.defineProperty(exports, 'getResourceName', {
20
20
  get: function () {
21
21
  return getResourceName;
22
22
  }
23
- });
24
- //# sourceMappingURL=resource-utils-DjHJB6uc.cjs.map
23
+ });
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_trace_root = require('../trace-root-BMa667jK.cjs');
2
3
 
3
4
  //#region src/server/exporter.ts
4
5
  var DevtoolsSpanExporter = class {
@@ -45,8 +46,8 @@ var DevtoolsSpanExporter = class {
45
46
  */
46
47
  convertToTraceData(traceId, spans) {
47
48
  const spanData = spans.map((span) => this.convertSpan(span));
48
- const rootSpan = spanData.find((s) => !s.parentSpanId) || spanData[0];
49
49
  spanData.sort((a, b) => a.startTime - b.startTime);
50
+ const { rootSpan, partial } = require_trace_root.pickRoot(spanData);
50
51
  const startTime = Math.min(...spanData.map((s) => s.startTime));
51
52
  const endTime = Math.max(...spanData.map((s) => s.endTime));
52
53
  const status = spanData.some((s) => s.status.code === "ERROR") ? "ERROR" : "OK";
@@ -59,7 +60,8 @@ var DevtoolsSpanExporter = class {
59
60
  endTime,
60
61
  duration: endTime - startTime,
61
62
  status,
62
- service: this.serviceName
63
+ service: this.serviceName,
64
+ ...partial ? { partial: true } : {}
63
65
  };
64
66
  }
65
67
  /**
@@ -137,5 +139,4 @@ var DevtoolsSpanExporter = class {
137
139
  };
138
140
 
139
141
  //#endregion
140
- exports.DevtoolsSpanExporter = DevtoolsSpanExporter;
141
- //# sourceMappingURL=exporter.cjs.map
142
+ exports.DevtoolsSpanExporter = DevtoolsSpanExporter;
@@ -1,2 +1,2 @@
1
- import { t as DevtoolsSpanExporter } from "../exporter-BSIS3Qgy.cjs";
1
+ import { t as DevtoolsSpanExporter } from "../exporter-CEKKJTci.cjs";
2
2
  export { DevtoolsSpanExporter };
@@ -1,2 +1,2 @@
1
- import { t as DevtoolsSpanExporter } from "../exporter-BLqTs00O.js";
1
+ import { t as DevtoolsSpanExporter } from "../exporter-BJwufQwg.js";
2
2
  export { DevtoolsSpanExporter };
@@ -1,3 +1,5 @@
1
+ import { t as pickRoot } from "../trace-root-EHnvuA7f.js";
2
+
1
3
  //#region src/server/exporter.ts
2
4
  var DevtoolsSpanExporter = class {
3
5
  server;
@@ -43,8 +45,8 @@ var DevtoolsSpanExporter = class {
43
45
  */
44
46
  convertToTraceData(traceId, spans) {
45
47
  const spanData = spans.map((span) => this.convertSpan(span));
46
- const rootSpan = spanData.find((s) => !s.parentSpanId) || spanData[0];
47
48
  spanData.sort((a, b) => a.startTime - b.startTime);
49
+ const { rootSpan, partial } = pickRoot(spanData);
48
50
  const startTime = Math.min(...spanData.map((s) => s.startTime));
49
51
  const endTime = Math.max(...spanData.map((s) => s.endTime));
50
52
  const status = spanData.some((s) => s.status.code === "ERROR") ? "ERROR" : "OK";
@@ -57,7 +59,8 @@ var DevtoolsSpanExporter = class {
57
59
  endTime,
58
60
  duration: endTime - startTime,
59
61
  status,
60
- service: this.serviceName
62
+ service: this.serviceName,
63
+ ...partial ? { partial: true } : {}
61
64
  };
62
65
  }
63
66
  /**
@@ -135,5 +138,4 @@ var DevtoolsSpanExporter = class {
135
138
  };
136
139
 
137
140
  //#endregion
138
- export { DevtoolsSpanExporter };
139
- //# sourceMappingURL=exporter.js.map
141
+ export { DevtoolsSpanExporter };
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_http = require('../http-BUHnkhrC.cjs');
2
+ const require_http = require('../http-bOYC2_Z0.cjs');
3
3
  const require_server_exporter = require('./exporter.cjs');
4
4
  const require_server_log_exporter = require('./log-exporter.cjs');
5
5
  const require_server_remote_exporter = require('./remote-exporter.cjs');
@@ -1,7 +1,7 @@
1
- import { a as ErrorGroup, c as MetricData, i as DevtoolsData, l as SpanData, n as DevtoolsServer, o as ErrorOccurrence, r as DevtoolsServerOptions, s as LogData, t as DevtoolsSpanExporter, u as TraceData } from "../exporter-BSIS3Qgy.cjs";
1
+ import { a as ErrorGroup, c as MetricData, i as DevtoolsData, l as SpanData, n as DevtoolsServer, o as ErrorOccurrence, r as DevtoolsServerOptions, s as LogData, t as DevtoolsSpanExporter, u as TraceData } from "../exporter-CEKKJTci.cjs";
2
2
  import { DevtoolsLogExporter } from "./log-exporter.cjs";
3
3
  import { DevtoolsRemoteExporter, DevtoolsRemoteExporterOptions } from "./remote-exporter.cjs";
4
- import { t as ErrorAggregator } from "../error-aggregator-bZ-prq97.cjs";
4
+ import { t as ErrorAggregator } from "../error-aggregator-CGgWr2OH.cjs";
5
5
  import { Server } from "node:http";
6
6
  import { AgentRawEvent, OtelMetricRecord } from "autotel-agents";
7
7
  //#region src/server/http.d.ts
@@ -91,5 +91,4 @@ declare function appendWithLimit<T>(items: T[], item: T, limit: number): T[];
91
91
  declare function appendManyWithLimit<T>(items: T[], incoming: T[], limit: number): T[];
92
92
  declare function applyTelemetryLimits(data: DevtoolsData, limits: TelemetryLimits): DevtoolsData;
93
93
  //#endregion
94
- export { DEVTOOLS_IDENTITY, type DevtoolsData, DevtoolsLogExporter, DevtoolsRemoteExporter, type DevtoolsRemoteExporterOptions, type DevtoolsRoutesOptions, DevtoolsServer, type DevtoolsServerOptions, DevtoolsSpanExporter, ErrorAggregator, type ErrorGroup, type ErrorOccurrence, type HttpServerOptions, type LogData, type MetricData, type PortHolder, type SpanData, type TelemetryLimits, type TraceData, allowSensitiveRequest, appendManyWithLimit, appendWithLimit, applyTelemetryLimits, attachDevtoolsRoutes, createDevtoolsHttpServer, decodeOtlpLogsRequest, decodeOtlpMetricsRequest, decodeOtlpTraceRequest, hostHeaderIsLoopback, isLoopbackHostname, isProtobufContentType, originIsLoopback, parseOtlpLogs, parseOtlpTraces, probePortHolder, resolveTelemetryLimits };
95
- //# sourceMappingURL=index.d.cts.map
94
+ export { DEVTOOLS_IDENTITY, type DevtoolsData, DevtoolsLogExporter, DevtoolsRemoteExporter, type DevtoolsRemoteExporterOptions, type DevtoolsRoutesOptions, DevtoolsServer, type DevtoolsServerOptions, DevtoolsSpanExporter, ErrorAggregator, type ErrorGroup, type ErrorOccurrence, type HttpServerOptions, type LogData, type MetricData, type PortHolder, type SpanData, type TelemetryLimits, type TraceData, allowSensitiveRequest, appendManyWithLimit, appendWithLimit, applyTelemetryLimits, attachDevtoolsRoutes, createDevtoolsHttpServer, decodeOtlpLogsRequest, decodeOtlpMetricsRequest, decodeOtlpTraceRequest, hostHeaderIsLoopback, isLoopbackHostname, isProtobufContentType, originIsLoopback, parseOtlpLogs, parseOtlpTraces, probePortHolder, resolveTelemetryLimits };
@@ -1,7 +1,7 @@
1
- import { a as ErrorGroup, c as MetricData, i as DevtoolsData, l as SpanData, n as DevtoolsServer, o as ErrorOccurrence, r as DevtoolsServerOptions, s as LogData, t as DevtoolsSpanExporter, u as TraceData } from "../exporter-BLqTs00O.js";
1
+ import { a as ErrorGroup, c as MetricData, i as DevtoolsData, l as SpanData, n as DevtoolsServer, o as ErrorOccurrence, r as DevtoolsServerOptions, s as LogData, t as DevtoolsSpanExporter, u as TraceData } from "../exporter-BJwufQwg.js";
2
2
  import { DevtoolsLogExporter } from "./log-exporter.js";
3
3
  import { DevtoolsRemoteExporter, DevtoolsRemoteExporterOptions } from "./remote-exporter.js";
4
- import { t as ErrorAggregator } from "../error-aggregator-BrgYNNoC.js";
4
+ import { t as ErrorAggregator } from "../error-aggregator-DufjI2IG.js";
5
5
  import { Server } from "node:http";
6
6
  import { AgentRawEvent, OtelMetricRecord } from "autotel-agents";
7
7
  //#region src/server/http.d.ts
@@ -91,5 +91,4 @@ declare function appendWithLimit<T>(items: T[], item: T, limit: number): T[];
91
91
  declare function appendManyWithLimit<T>(items: T[], incoming: T[], limit: number): T[];
92
92
  declare function applyTelemetryLimits(data: DevtoolsData, limits: TelemetryLimits): DevtoolsData;
93
93
  //#endregion
94
- export { DEVTOOLS_IDENTITY, type DevtoolsData, DevtoolsLogExporter, DevtoolsRemoteExporter, type DevtoolsRemoteExporterOptions, type DevtoolsRoutesOptions, DevtoolsServer, type DevtoolsServerOptions, DevtoolsSpanExporter, ErrorAggregator, type ErrorGroup, type ErrorOccurrence, type HttpServerOptions, type LogData, type MetricData, type PortHolder, type SpanData, type TelemetryLimits, type TraceData, allowSensitiveRequest, appendManyWithLimit, appendWithLimit, applyTelemetryLimits, attachDevtoolsRoutes, createDevtoolsHttpServer, decodeOtlpLogsRequest, decodeOtlpMetricsRequest, decodeOtlpTraceRequest, hostHeaderIsLoopback, isLoopbackHostname, isProtobufContentType, originIsLoopback, parseOtlpLogs, parseOtlpTraces, probePortHolder, resolveTelemetryLimits };
95
- //# sourceMappingURL=index.d.ts.map
94
+ export { DEVTOOLS_IDENTITY, type DevtoolsData, DevtoolsLogExporter, DevtoolsRemoteExporter, type DevtoolsRemoteExporterOptions, type DevtoolsRoutesOptions, DevtoolsServer, type DevtoolsServerOptions, DevtoolsSpanExporter, ErrorAggregator, type ErrorGroup, type ErrorOccurrence, type HttpServerOptions, type LogData, type MetricData, type PortHolder, type SpanData, type TelemetryLimits, type TraceData, allowSensitiveRequest, appendManyWithLimit, appendWithLimit, applyTelemetryLimits, attachDevtoolsRoutes, createDevtoolsHttpServer, decodeOtlpLogsRequest, decodeOtlpMetricsRequest, decodeOtlpTraceRequest, hostHeaderIsLoopback, isLoopbackHostname, isProtobufContentType, originIsLoopback, parseOtlpLogs, parseOtlpTraces, probePortHolder, resolveTelemetryLimits };
@@ -1,4 +1,4 @@
1
- import { _ as appendWithLimit, a as decodeOtlpLogsRequest, b as ErrorAggregator, c as isProtobufContentType, d as DevtoolsServer, f as allowSensitiveRequest, g as appendManyWithLimit, h as originIsLoopback, i as probePortHolder, l as parseOtlpLogs, m as isLoopbackHostname, n as createDevtoolsHttpServer, o as decodeOtlpMetricsRequest, p as hostHeaderIsLoopback, r as DEVTOOLS_IDENTITY, s as decodeOtlpTraceRequest, t as attachDevtoolsRoutes, u as parseOtlpTraces, v as applyTelemetryLimits, y as resolveTelemetryLimits } from "../http-yIS667nX.js";
1
+ import { _ as appendWithLimit, a as decodeOtlpLogsRequest, b as ErrorAggregator, c as isProtobufContentType, d as DevtoolsServer, f as allowSensitiveRequest, g as appendManyWithLimit, h as originIsLoopback, i as probePortHolder, l as parseOtlpLogs, m as isLoopbackHostname, n as createDevtoolsHttpServer, o as decodeOtlpMetricsRequest, p as hostHeaderIsLoopback, r as DEVTOOLS_IDENTITY, s as decodeOtlpTraceRequest, t as attachDevtoolsRoutes, u as parseOtlpTraces, v as applyTelemetryLimits, y as resolveTelemetryLimits } from "../http-BLmWVZP0.js";
2
2
  import { DevtoolsSpanExporter } from "./exporter.js";
3
3
  import { DevtoolsLogExporter } from "./log-exporter.js";
4
4
  import { DevtoolsRemoteExporter } from "./remote-exporter.js";
@@ -83,5 +83,4 @@ var DevtoolsLogExporter = class {
83
83
  };
84
84
 
85
85
  //#endregion
86
- exports.DevtoolsLogExporter = DevtoolsLogExporter;
87
- //# sourceMappingURL=log-exporter.cjs.map
86
+ exports.DevtoolsLogExporter = DevtoolsLogExporter;
@@ -27,5 +27,4 @@ declare class DevtoolsLogExporter implements LogRecordExporter {
27
27
  forceFlush(): Promise<void>;
28
28
  }
29
29
  //#endregion
30
- export { DevtoolsLogExporter, DevtoolsLogExporterOptions };
31
- //# sourceMappingURL=log-exporter.d.cts.map
30
+ export { DevtoolsLogExporter, DevtoolsLogExporterOptions };
@@ -27,5 +27,4 @@ declare class DevtoolsLogExporter implements LogRecordExporter {
27
27
  forceFlush(): Promise<void>;
28
28
  }
29
29
  //#endregion
30
- export { DevtoolsLogExporter, DevtoolsLogExporterOptions };
31
- //# sourceMappingURL=log-exporter.d.ts.map
30
+ export { DevtoolsLogExporter, DevtoolsLogExporterOptions };
@@ -82,5 +82,4 @@ var DevtoolsLogExporter = class {
82
82
  };
83
83
 
84
84
  //#endregion
85
- export { DevtoolsLogExporter };
86
- //# sourceMappingURL=log-exporter.js.map
85
+ export { DevtoolsLogExporter };
@@ -173,5 +173,4 @@ var DevtoolsRemoteExporter = class {
173
173
  };
174
174
 
175
175
  //#endregion
176
- exports.DevtoolsRemoteExporter = DevtoolsRemoteExporter;
177
- //# sourceMappingURL=remote-exporter.cjs.map
176
+ exports.DevtoolsRemoteExporter = DevtoolsRemoteExporter;
@@ -62,5 +62,4 @@ declare class DevtoolsRemoteExporter implements SpanExporter {
62
62
  private log;
63
63
  }
64
64
  //#endregion
65
- export { DevtoolsRemoteExporter, DevtoolsRemoteExporterOptions };
66
- //# sourceMappingURL=remote-exporter.d.cts.map
65
+ export { DevtoolsRemoteExporter, DevtoolsRemoteExporterOptions };
@@ -62,5 +62,4 @@ declare class DevtoolsRemoteExporter implements SpanExporter {
62
62
  private log;
63
63
  }
64
64
  //#endregion
65
- export { DevtoolsRemoteExporter, DevtoolsRemoteExporterOptions };
66
- //# sourceMappingURL=remote-exporter.d.ts.map
65
+ export { DevtoolsRemoteExporter, DevtoolsRemoteExporterOptions };
@@ -171,5 +171,4 @@ var DevtoolsRemoteExporter = class {
171
171
  };
172
172
 
173
173
  //#endregion
174
- export { DevtoolsRemoteExporter };
175
- //# sourceMappingURL=remote-exporter.js.map
174
+ export { DevtoolsRemoteExporter };
@@ -0,0 +1,36 @@
1
+
2
+ //#region src/server/trace-root.ts
3
+ /**
4
+ * Pick the span to present as the top of a trace, and report whether the real
5
+ * root is missing from `spans`.
6
+ *
7
+ * A true root has no parent at all. Failing that the trace is a fragment, so
8
+ * fall back to the earliest span whose parent did not arrive rather than
9
+ * presenting an arbitrary child as though it were the root. Sampling makes this
10
+ * ordinary: a sender may keep a failed span and drop the routine parent above
11
+ * it, and a receiver that hides the difference makes a half-trace look complete.
12
+ *
13
+ * `partial` is a fact about the span set passed in, not about a batch — spans of
14
+ * one trace arrive across several exports, so recompute this wherever the set
15
+ * grows instead of caching the first answer.
16
+ *
17
+ * Pass spans sorted by start time; the fallbacks then pick the earliest
18
+ * candidate rather than whichever one the caller happened to receive first.
19
+ */
20
+ function pickRoot(spans) {
21
+ const present = new Set(spans.map((s) => s.spanId));
22
+ const trueRoot = spans.find((s) => !s.parentSpanId);
23
+ const orphan = spans.find((s) => s.parentSpanId && !present.has(s.parentSpanId));
24
+ return {
25
+ rootSpan: trueRoot ?? orphan ?? spans[0],
26
+ partial: !trueRoot
27
+ };
28
+ }
29
+
30
+ //#endregion
31
+ Object.defineProperty(exports, 'pickRoot', {
32
+ enumerable: true,
33
+ get: function () {
34
+ return pickRoot;
35
+ }
36
+ });
@@ -0,0 +1,30 @@
1
+ //#region src/server/trace-root.ts
2
+ /**
3
+ * Pick the span to present as the top of a trace, and report whether the real
4
+ * root is missing from `spans`.
5
+ *
6
+ * A true root has no parent at all. Failing that the trace is a fragment, so
7
+ * fall back to the earliest span whose parent did not arrive rather than
8
+ * presenting an arbitrary child as though it were the root. Sampling makes this
9
+ * ordinary: a sender may keep a failed span and drop the routine parent above
10
+ * it, and a receiver that hides the difference makes a half-trace look complete.
11
+ *
12
+ * `partial` is a fact about the span set passed in, not about a batch — spans of
13
+ * one trace arrive across several exports, so recompute this wherever the set
14
+ * grows instead of caching the first answer.
15
+ *
16
+ * Pass spans sorted by start time; the fallbacks then pick the earliest
17
+ * candidate rather than whichever one the caller happened to receive first.
18
+ */
19
+ function pickRoot(spans) {
20
+ const present = new Set(spans.map((s) => s.spanId));
21
+ const trueRoot = spans.find((s) => !s.parentSpanId);
22
+ const orphan = spans.find((s) => s.parentSpanId && !present.has(s.parentSpanId));
23
+ return {
24
+ rootSpan: trueRoot ?? orphan ?? spans[0],
25
+ partial: !trueRoot
26
+ };
27
+ }
28
+
29
+ //#endregion
30
+ export { pickRoot as t };