autotel 3.6.0 → 3.7.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 (602) hide show
  1. package/dist/attribute-redacting-processor-DtTS9xxh.d.cts +175 -0
  2. package/dist/attribute-redacting-processor-DtTS9xxh.d.cts.map +1 -0
  3. package/dist/attribute-redacting-processor-DtTS9xxh.d.ts +175 -0
  4. package/dist/attribute-redacting-processor-DtTS9xxh.d.ts.map +1 -0
  5. package/dist/attribute-redacting-processor.cjs +374 -33
  6. package/dist/attribute-redacting-processor.cjs.map +1 -1
  7. package/dist/attribute-redacting-processor.d.cts +2 -207
  8. package/dist/attribute-redacting-processor.d.ts +2 -207
  9. package/dist/attribute-redacting-processor.js +368 -2
  10. package/dist/attribute-redacting-processor.js.map +1 -1
  11. package/dist/attributes-D3etyRVc.cjs +713 -0
  12. package/dist/attributes-D3etyRVc.cjs.map +1 -0
  13. package/dist/attributes-ksn4HVbd.js +600 -0
  14. package/dist/attributes-ksn4HVbd.js.map +1 -0
  15. package/dist/attributes.cjs +21 -85
  16. package/dist/attributes.d.cts +2 -20
  17. package/dist/attributes.d.ts +2 -20
  18. package/dist/attributes.js +3 -5
  19. package/dist/auto.cjs +50 -28
  20. package/dist/auto.cjs.map +1 -1
  21. package/dist/auto.d.cts +1 -2
  22. package/dist/auto.d.ts +1 -2
  23. package/dist/auto.js +49 -23
  24. package/dist/auto.js.map +1 -1
  25. package/dist/business-baggage.cjs +357 -13
  26. package/dist/business-baggage.cjs.map +1 -1
  27. package/dist/business-baggage.d.cts +106 -139
  28. package/dist/business-baggage.d.cts.map +1 -0
  29. package/dist/business-baggage.d.ts +106 -139
  30. package/dist/business-baggage.d.ts.map +1 -0
  31. package/dist/business-baggage.js +357 -2
  32. package/dist/business-baggage.js.map +1 -1
  33. package/dist/canonical-log-line-processor--RlFDHhm.cjs +377 -0
  34. package/dist/canonical-log-line-processor--RlFDHhm.cjs.map +1 -0
  35. package/dist/canonical-log-line-processor-BcRuAdRk.d.ts +147 -0
  36. package/dist/canonical-log-line-processor-BcRuAdRk.d.ts.map +1 -0
  37. package/dist/canonical-log-line-processor-DbBQT5vY.js +366 -0
  38. package/dist/canonical-log-line-processor-DbBQT5vY.js.map +1 -0
  39. package/dist/canonical-log-line-processor-xvjMgtpF.d.cts +147 -0
  40. package/dist/canonical-log-line-processor-xvjMgtpF.d.cts.map +1 -0
  41. package/dist/config.cjs +118 -22
  42. package/dist/config.cjs.map +1 -1
  43. package/dist/config.d.cts +33 -45
  44. package/dist/config.d.cts.map +1 -0
  45. package/dist/config.d.ts +33 -45
  46. package/dist/config.d.ts.map +1 -0
  47. package/dist/config.js +116 -3
  48. package/dist/config.js.map +1 -1
  49. package/dist/correlated-events-Bzh5y-UB.js +28 -0
  50. package/dist/correlated-events-Bzh5y-UB.js.map +1 -0
  51. package/dist/correlated-events-kSwLo3mi.cjs +34 -0
  52. package/dist/correlated-events-kSwLo3mi.cjs.map +1 -0
  53. package/dist/correlation-id.cjs +11 -54
  54. package/dist/correlation-id.d.cts +6 -5
  55. package/dist/correlation-id.d.cts.map +1 -0
  56. package/dist/correlation-id.d.ts +6 -5
  57. package/dist/correlation-id.d.ts.map +1 -0
  58. package/dist/correlation-id.js +3 -17
  59. package/dist/db.cjs +244 -209
  60. package/dist/db.cjs.map +1 -1
  61. package/dist/db.d.cts +28 -26
  62. package/dist/db.d.cts.map +1 -0
  63. package/dist/db.d.ts +28 -26
  64. package/dist/db.d.ts.map +1 -0
  65. package/dist/db.js +243 -207
  66. package/dist/db.js.map +1 -1
  67. package/dist/decorators.cjs +39 -66
  68. package/dist/decorators.cjs.map +1 -1
  69. package/dist/decorators.d.cts +10 -37
  70. package/dist/decorators.d.cts.map +1 -0
  71. package/dist/decorators.d.ts +10 -37
  72. package/dist/decorators.d.ts.map +1 -0
  73. package/dist/decorators.js +38 -64
  74. package/dist/decorators.js.map +1 -1
  75. package/dist/define-event-CreknLm3.d.ts +25 -0
  76. package/dist/define-event-CreknLm3.d.ts.map +1 -0
  77. package/dist/define-event-HZRizPwz.d.cts +25 -0
  78. package/dist/define-event-HZRizPwz.d.cts.map +1 -0
  79. package/dist/drain-pipeline.cjs +111 -9
  80. package/dist/drain-pipeline.cjs.map +1 -1
  81. package/dist/drain-pipeline.d.cts +27 -32
  82. package/dist/drain-pipeline.d.cts.map +1 -0
  83. package/dist/drain-pipeline.d.ts +27 -32
  84. package/dist/drain-pipeline.d.ts.map +1 -0
  85. package/dist/drain-pipeline.js +111 -2
  86. package/dist/drain-pipeline.js.map +1 -1
  87. package/dist/enrichers.cjs +59 -66
  88. package/dist/enrichers.cjs.map +1 -1
  89. package/dist/enrichers.d.cts +15 -13
  90. package/dist/enrichers.d.cts.map +1 -0
  91. package/dist/enrichers.d.ts +15 -13
  92. package/dist/enrichers.d.ts.map +1 -0
  93. package/dist/enrichers.js +58 -65
  94. package/dist/enrichers.js.map +1 -1
  95. package/dist/event-Dlqr4ZNL.cjs +778 -0
  96. package/dist/event-Dlqr4ZNL.cjs.map +1 -0
  97. package/dist/event-_58ryBjh.js +761 -0
  98. package/dist/event-_58ryBjh.js.map +1 -0
  99. package/dist/event-subscriber-D1XLkPzi.d.cts +223 -0
  100. package/dist/event-subscriber-D1XLkPzi.d.cts.map +1 -0
  101. package/dist/event-subscriber-D1XLkPzi.d.ts +223 -0
  102. package/dist/event-subscriber-D1XLkPzi.d.ts.map +1 -0
  103. package/dist/event-subscriber.cjs +0 -6
  104. package/dist/event-subscriber.d.cts +2 -221
  105. package/dist/event-subscriber.d.ts +2 -221
  106. package/dist/event-subscriber.js +1 -3
  107. package/dist/event-testing-BqRnI0z4.d.cts +106 -0
  108. package/dist/event-testing-BqRnI0z4.d.cts.map +1 -0
  109. package/dist/event-testing-CfFs3to2.d.ts +106 -0
  110. package/dist/event-testing-CfFs3to2.d.ts.map +1 -0
  111. package/dist/event-testing.cjs +93 -17
  112. package/dist/event-testing.cjs.map +1 -1
  113. package/dist/event-testing.d.cts +2 -110
  114. package/dist/event-testing.d.ts +2 -110
  115. package/dist/event-testing.js +91 -2
  116. package/dist/event-testing.js.map +1 -1
  117. package/dist/event.cjs +5 -37
  118. package/dist/event.d.cts +295 -340
  119. package/dist/event.d.cts.map +1 -0
  120. package/dist/event.d.ts +295 -340
  121. package/dist/event.d.ts.map +1 -0
  122. package/dist/event.js +3 -21
  123. package/dist/exporters.cjs +12 -16
  124. package/dist/exporters.d.cts +86 -111
  125. package/dist/exporters.d.cts.map +1 -0
  126. package/dist/exporters.d.ts +86 -111
  127. package/dist/exporters.d.ts.map +1 -0
  128. package/dist/exporters.js +4 -4
  129. package/dist/filtering-span-processor-B8R8B7Uk.d.cts +59 -0
  130. package/dist/filtering-span-processor-B8R8B7Uk.d.cts.map +1 -0
  131. package/dist/filtering-span-processor-B8R8B7Uk.d.ts +59 -0
  132. package/dist/filtering-span-processor-B8R8B7Uk.d.ts.map +1 -0
  133. package/dist/filtering-span-processor.cjs +49 -9
  134. package/dist/filtering-span-processor.cjs.map +1 -1
  135. package/dist/filtering-span-processor.d.cts +2 -80
  136. package/dist/filtering-span-processor.d.ts +2 -80
  137. package/dist/filtering-span-processor.js +49 -2
  138. package/dist/filtering-span-processor.js.map +1 -1
  139. package/dist/functional-BGkT8J-h.js +1265 -0
  140. package/dist/functional-BGkT8J-h.js.map +1 -0
  141. package/dist/functional-C4CzoVrX.cjs +1312 -0
  142. package/dist/functional-C4CzoVrX.cjs.map +1 -0
  143. package/dist/functional.cjs +11 -57
  144. package/dist/functional.d.cts +96 -97
  145. package/dist/functional.d.cts.map +1 -0
  146. package/dist/functional.d.ts +96 -97
  147. package/dist/functional.d.ts.map +1 -0
  148. package/dist/functional.js +3 -20
  149. package/dist/http.cjs +276 -176
  150. package/dist/http.cjs.map +1 -1
  151. package/dist/http.d.cts +17 -37
  152. package/dist/http.d.cts.map +1 -0
  153. package/dist/http.d.ts +17 -37
  154. package/dist/http.d.ts.map +1 -0
  155. package/dist/http.js +275 -174
  156. package/dist/http.js.map +1 -1
  157. package/dist/index-CX0aG1Uh.d.ts +708 -0
  158. package/dist/index-CX0aG1Uh.d.ts.map +1 -0
  159. package/dist/index-DIWZFKUS.d.cts +708 -0
  160. package/dist/index-DIWZFKUS.d.cts.map +1 -0
  161. package/dist/index.cjs +1049 -1172
  162. package/dist/index.cjs.map +1 -1
  163. package/dist/index.d.cts +401 -551
  164. package/dist/index.d.cts.map +1 -0
  165. package/dist/index.d.ts +401 -551
  166. package/dist/index.d.ts.map +1 -0
  167. package/dist/index.js +912 -714
  168. package/dist/index.js.map +1 -1
  169. package/dist/init-CNp-ee80.d.cts +1157 -0
  170. package/dist/init-CNp-ee80.d.cts.map +1 -0
  171. package/dist/init-Ch6t7MNI.js +1015 -0
  172. package/dist/init-Ch6t7MNI.js.map +1 -0
  173. package/dist/init-DJQOdVlN.d.ts +1157 -0
  174. package/dist/init-DJQOdVlN.d.ts.map +1 -0
  175. package/dist/init-DvapOXCc.cjs +1092 -0
  176. package/dist/init-DvapOXCc.cjs.map +1 -0
  177. package/dist/instrumentation.cjs +159 -185
  178. package/dist/instrumentation.cjs.map +1 -1
  179. package/dist/instrumentation.d.cts +42 -40
  180. package/dist/instrumentation.d.cts.map +1 -0
  181. package/dist/instrumentation.d.ts +42 -40
  182. package/dist/instrumentation.d.ts.map +1 -0
  183. package/dist/instrumentation.js +158 -183
  184. package/dist/instrumentation.js.map +1 -1
  185. package/dist/logger-BauSUhUv.d.cts +313 -0
  186. package/dist/logger-BauSUhUv.d.cts.map +1 -0
  187. package/dist/logger-BauSUhUv.d.ts +313 -0
  188. package/dist/logger-BauSUhUv.d.ts.map +1 -0
  189. package/dist/logger.cjs +225 -25
  190. package/dist/logger.cjs.map +1 -1
  191. package/dist/logger.d.cts +2 -348
  192. package/dist/logger.d.ts +2 -348
  193. package/dist/logger.js +204 -4
  194. package/dist/logger.js.map +1 -1
  195. package/dist/messaging-adapters.cjs +292 -187
  196. package/dist/messaging-adapters.cjs.map +1 -1
  197. package/dist/messaging-adapters.d.cts +28 -66
  198. package/dist/messaging-adapters.d.cts.map +1 -0
  199. package/dist/messaging-adapters.d.ts +28 -66
  200. package/dist/messaging-adapters.d.ts.map +1 -0
  201. package/dist/messaging-adapters.js +291 -185
  202. package/dist/messaging-adapters.js.map +1 -1
  203. package/dist/messaging-testing.cjs +306 -372
  204. package/dist/messaging-testing.cjs.map +1 -1
  205. package/dist/messaging-testing.d.cts +194 -223
  206. package/dist/messaging-testing.d.cts.map +1 -0
  207. package/dist/messaging-testing.d.ts +194 -223
  208. package/dist/messaging-testing.d.ts.map +1 -0
  209. package/dist/messaging-testing.js +305 -371
  210. package/dist/messaging-testing.js.map +1 -1
  211. package/dist/messaging.cjs +757 -36
  212. package/dist/messaging.cjs.map +1 -1
  213. package/dist/messaging.d.cts +603 -644
  214. package/dist/messaging.d.cts.map +1 -0
  215. package/dist/messaging.d.ts +603 -644
  216. package/dist/messaging.d.ts.map +1 -0
  217. package/dist/messaging.js +756 -21
  218. package/dist/messaging.js.map +1 -1
  219. package/dist/metric-helpers.cjs +27 -27
  220. package/dist/metric-helpers.cjs.map +1 -1
  221. package/dist/metric-helpers.d.cts +4 -2
  222. package/dist/metric-helpers.d.cts.map +1 -0
  223. package/dist/metric-helpers.d.ts +4 -2
  224. package/dist/metric-helpers.d.ts.map +1 -0
  225. package/dist/metric-helpers.js +24 -4
  226. package/dist/metric-helpers.js.map +1 -1
  227. package/dist/metric-testing-DXdK3-Q3.d.ts +106 -0
  228. package/dist/metric-testing-DXdK3-Q3.d.ts.map +1 -0
  229. package/dist/metric-testing-MxvzChDp.d.cts +106 -0
  230. package/dist/metric-testing-MxvzChDp.d.cts.map +1 -0
  231. package/dist/metric-testing.cjs +93 -17
  232. package/dist/metric-testing.cjs.map +1 -1
  233. package/dist/metric-testing.d.cts +2 -110
  234. package/dist/metric-testing.d.ts +2 -110
  235. package/dist/metric-testing.js +91 -2
  236. package/dist/metric-testing.js.map +1 -1
  237. package/dist/metric.cjs +306 -22
  238. package/dist/metric.cjs.map +1 -1
  239. package/dist/metric.d.cts +170 -198
  240. package/dist/metric.d.cts.map +1 -0
  241. package/dist/metric.d.ts +170 -198
  242. package/dist/metric.d.ts.map +1 -0
  243. package/dist/metric.js +277 -7
  244. package/dist/metric.js.map +1 -1
  245. package/dist/node-require-DF5QBX6z.cjs +99 -0
  246. package/dist/node-require-DF5QBX6z.cjs.map +1 -0
  247. package/dist/node-require-Db1oDpLj.js +88 -0
  248. package/dist/node-require-Db1oDpLj.js.map +1 -0
  249. package/dist/operation-context-C-2hmmtP.js +59 -0
  250. package/dist/operation-context-C-2hmmtP.js.map +1 -0
  251. package/dist/operation-context-n4_obUwq.cjs +70 -0
  252. package/dist/operation-context-n4_obUwq.cjs.map +1 -0
  253. package/dist/parse-error.cjs +55 -9
  254. package/dist/parse-error.cjs.map +1 -1
  255. package/dist/parse-error.d.cts +12 -10
  256. package/dist/parse-error.d.cts.map +1 -0
  257. package/dist/parse-error.d.ts +12 -10
  258. package/dist/parse-error.d.ts.map +1 -0
  259. package/dist/parse-error.js +55 -2
  260. package/dist/parse-error.js.map +1 -1
  261. package/dist/pretty-console-exporter-CMzlrRNg.cjs +232 -0
  262. package/dist/pretty-console-exporter-CMzlrRNg.cjs.map +1 -0
  263. package/dist/pretty-console-exporter-DqKl_q9z.js +227 -0
  264. package/dist/pretty-console-exporter-DqKl_q9z.js.map +1 -0
  265. package/dist/processors.cjs +13 -17
  266. package/dist/processors.d.cts +3 -171
  267. package/dist/processors.d.ts +3 -171
  268. package/dist/processors.js +4 -4
  269. package/dist/register.cjs +35 -6
  270. package/dist/register.cjs.map +1 -1
  271. package/dist/register.d.cts +1 -2
  272. package/dist/register.d.ts +1 -2
  273. package/dist/register.js +36 -3
  274. package/dist/register.js.map +1 -1
  275. package/dist/registry-DfXA3R1L.js +184 -0
  276. package/dist/registry-DfXA3R1L.js.map +1 -0
  277. package/dist/registry-JZg2J3RZ.cjs +334 -0
  278. package/dist/registry-JZg2J3RZ.cjs.map +1 -0
  279. package/dist/sampling-CR0Va1VB.d.ts +351 -0
  280. package/dist/sampling-CR0Va1VB.d.ts.map +1 -0
  281. package/dist/sampling-DfYhDJij.d.cts +351 -0
  282. package/dist/sampling-DfYhDJij.d.cts.map +1 -0
  283. package/dist/sampling.cjs +452 -60
  284. package/dist/sampling.cjs.map +1 -1
  285. package/dist/sampling.d.cts +2 -379
  286. package/dist/sampling.d.ts +2 -379
  287. package/dist/sampling.js +441 -5
  288. package/dist/sampling.js.map +1 -1
  289. package/dist/security-schema.cjs +65 -46
  290. package/dist/security-schema.cjs.map +1 -1
  291. package/dist/security-schema.d.cts +23 -26
  292. package/dist/security-schema.d.cts.map +1 -0
  293. package/dist/security-schema.d.ts +23 -26
  294. package/dist/security-schema.d.ts.map +1 -0
  295. package/dist/security-schema.js +64 -45
  296. package/dist/security-schema.js.map +1 -1
  297. package/dist/semantic-conventions-FhSxv-bK.d.cts +32 -0
  298. package/dist/semantic-conventions-FhSxv-bK.d.cts.map +1 -0
  299. package/dist/semantic-conventions-FhSxv-bK.d.ts +32 -0
  300. package/dist/semantic-conventions-FhSxv-bK.d.ts.map +1 -0
  301. package/dist/semantic-conventions.cjs +15 -26
  302. package/dist/semantic-conventions.cjs.map +1 -1
  303. package/dist/semantic-conventions.d.cts +2 -29
  304. package/dist/semantic-conventions.d.ts +2 -29
  305. package/dist/semantic-conventions.js +12 -3
  306. package/dist/semantic-conventions.js.map +1 -1
  307. package/dist/semantic-helpers.cjs +440 -39
  308. package/dist/semantic-helpers.cjs.map +1 -1
  309. package/dist/semantic-helpers.d.cts +38 -45
  310. package/dist/semantic-helpers.d.cts.map +1 -0
  311. package/dist/semantic-helpers.d.ts +38 -45
  312. package/dist/semantic-helpers.d.ts.map +1 -0
  313. package/dist/semantic-helpers.js +438 -20
  314. package/dist/semantic-helpers.js.map +1 -1
  315. package/dist/span-name-normalizer-8ZOGJuwv.d.cts +70 -0
  316. package/dist/span-name-normalizer-8ZOGJuwv.d.cts.map +1 -0
  317. package/dist/span-name-normalizer-8ZOGJuwv.d.ts +70 -0
  318. package/dist/span-name-normalizer-8ZOGJuwv.d.ts.map +1 -0
  319. package/dist/span-name-normalizer.cjs +95 -17
  320. package/dist/span-name-normalizer.cjs.map +1 -1
  321. package/dist/span-name-normalizer.d.cts +2 -94
  322. package/dist/span-name-normalizer.d.ts +2 -94
  323. package/dist/span-name-normalizer.js +93 -2
  324. package/dist/span-name-normalizer.js.map +1 -1
  325. package/dist/stable-hash-BNTMrmdB.cjs +28 -0
  326. package/dist/stable-hash-BNTMrmdB.cjs.map +1 -0
  327. package/dist/stable-hash-Cg5cT34Q.js +23 -0
  328. package/dist/stable-hash-Cg5cT34Q.js.map +1 -0
  329. package/dist/structured-error-9--cxBay.js +143 -0
  330. package/dist/structured-error-9--cxBay.js.map +1 -0
  331. package/dist/structured-error-CHg7DoIQ.cjs +178 -0
  332. package/dist/structured-error-CHg7DoIQ.cjs.map +1 -0
  333. package/dist/tail-sampling-processor.cjs +26 -13
  334. package/dist/tail-sampling-processor.cjs.map +1 -1
  335. package/dist/tail-sampling-processor.d.cts +11 -23
  336. package/dist/tail-sampling-processor.d.cts.map +1 -0
  337. package/dist/tail-sampling-processor.d.ts +11 -23
  338. package/dist/tail-sampling-processor.d.ts.map +1 -0
  339. package/dist/tail-sampling-processor.js +27 -6
  340. package/dist/tail-sampling-processor.js.map +1 -1
  341. package/dist/test-span-collector.cjs +70 -72
  342. package/dist/test-span-collector.cjs.map +1 -1
  343. package/dist/test-span-collector.d.cts +25 -43
  344. package/dist/test-span-collector.d.cts.map +1 -0
  345. package/dist/test-span-collector.d.ts +25 -43
  346. package/dist/test-span-collector.d.ts.map +1 -0
  347. package/dist/test-span-collector.js +69 -70
  348. package/dist/test-span-collector.js.map +1 -1
  349. package/dist/testing.cjs +389 -278
  350. package/dist/testing.cjs.map +1 -1
  351. package/dist/testing.d.cts +39 -62
  352. package/dist/testing.d.cts.map +1 -0
  353. package/dist/testing.d.ts +39 -62
  354. package/dist/testing.d.ts.map +1 -0
  355. package/dist/testing.js +386 -265
  356. package/dist/testing.js.map +1 -1
  357. package/dist/trace-context-Cijqoi6e.d.cts +212 -0
  358. package/dist/trace-context-Cijqoi6e.d.cts.map +1 -0
  359. package/dist/trace-context-Cijqoi6e.d.ts +212 -0
  360. package/dist/trace-context-Cijqoi6e.d.ts.map +1 -0
  361. package/dist/trace-helpers.cjs +634 -54
  362. package/dist/trace-helpers.cjs.map +1 -1
  363. package/dist/trace-helpers.d.cts +17 -49
  364. package/dist/trace-helpers.d.cts.map +1 -0
  365. package/dist/trace-helpers.d.ts +17 -49
  366. package/dist/trace-helpers.d.ts.map +1 -0
  367. package/dist/trace-helpers.js +624 -3
  368. package/dist/trace-helpers.js.map +1 -1
  369. package/dist/tracer-provider.cjs +227 -16
  370. package/dist/tracer-provider.cjs.map +1 -1
  371. package/dist/tracer-provider.d.cts +5 -4
  372. package/dist/tracer-provider.d.cts.map +1 -0
  373. package/dist/tracer-provider.d.ts +5 -4
  374. package/dist/tracer-provider.d.ts.map +1 -0
  375. package/dist/tracer-provider.js +227 -2
  376. package/dist/tracer-provider.js.map +1 -1
  377. package/dist/track-3HY4NGV-.cjs +1212 -0
  378. package/dist/track-3HY4NGV-.cjs.map +1 -0
  379. package/dist/track-nsKVy-pj.js +1111 -0
  380. package/dist/track-nsKVy-pj.js.map +1 -0
  381. package/dist/validate.cjs +178 -115
  382. package/dist/validate.cjs.map +1 -1
  383. package/dist/validate.d.cts +40 -64
  384. package/dist/validate.d.cts.map +1 -0
  385. package/dist/validate.d.ts +40 -64
  386. package/dist/validate.d.ts.map +1 -0
  387. package/dist/validate.js +177 -113
  388. package/dist/validate.js.map +1 -1
  389. package/dist/validation-attributes.cjs +42 -17
  390. package/dist/validation-attributes.cjs.map +1 -1
  391. package/dist/validation-attributes.d.cts +13 -20
  392. package/dist/validation-attributes.d.cts.map +1 -0
  393. package/dist/validation-attributes.d.ts +13 -20
  394. package/dist/validation-attributes.d.ts.map +1 -0
  395. package/dist/validation-attributes.js +40 -2
  396. package/dist/validation-attributes.js.map +1 -1
  397. package/dist/webhook.cjs +286 -256
  398. package/dist/webhook.cjs.map +1 -1
  399. package/dist/webhook.d.cts +157 -192
  400. package/dist/webhook.d.cts.map +1 -0
  401. package/dist/webhook.d.ts +157 -192
  402. package/dist/webhook.d.ts.map +1 -0
  403. package/dist/webhook.js +285 -254
  404. package/dist/webhook.js.map +1 -1
  405. package/dist/workflow-distributed.cjs +498 -412
  406. package/dist/workflow-distributed.cjs.map +1 -1
  407. package/dist/workflow-distributed.d.cts +163 -173
  408. package/dist/workflow-distributed.d.cts.map +1 -0
  409. package/dist/workflow-distributed.d.ts +163 -173
  410. package/dist/workflow-distributed.d.ts.map +1 -0
  411. package/dist/workflow-distributed.js +497 -410
  412. package/dist/workflow-distributed.js.map +1 -1
  413. package/dist/workflow.cjs +405 -40
  414. package/dist/workflow.cjs.map +1 -1
  415. package/dist/workflow.d.cts +78 -131
  416. package/dist/workflow.d.cts.map +1 -0
  417. package/dist/workflow.d.ts +78 -131
  418. package/dist/workflow.d.ts.map +1 -0
  419. package/dist/workflow.js +403 -21
  420. package/dist/workflow.js.map +1 -1
  421. package/dist/yaml-config-B3dQ82GR.cjs +272 -0
  422. package/dist/yaml-config-B3dQ82GR.cjs.map +1 -0
  423. package/dist/yaml-config.cjs +5 -24
  424. package/dist/yaml-config.d.cts +30 -64
  425. package/dist/yaml-config.d.cts.map +1 -0
  426. package/dist/yaml-config.d.ts +30 -64
  427. package/dist/yaml-config.d.ts.map +1 -0
  428. package/dist/yaml-config.js +226 -7
  429. package/dist/yaml-config.js.map +1 -1
  430. package/package.json +4 -4
  431. package/src/index.ts +3 -0
  432. package/src/request-logger.test.ts +53 -1
  433. package/src/request-logger.ts +58 -0
  434. package/src/validate.test.ts +3 -1
  435. package/src/validate.ts +9 -3
  436. package/dist/attributes.cjs.map +0 -1
  437. package/dist/attributes.js.map +0 -1
  438. package/dist/chunk-2ZKEORFN.cjs +0 -14
  439. package/dist/chunk-2ZKEORFN.cjs.map +0 -1
  440. package/dist/chunk-3QXBFGKP.js +0 -344
  441. package/dist/chunk-3QXBFGKP.js.map +0 -1
  442. package/dist/chunk-454CH4OV.js +0 -744
  443. package/dist/chunk-454CH4OV.js.map +0 -1
  444. package/dist/chunk-4A53YIAX.js +0 -180
  445. package/dist/chunk-4A53YIAX.js.map +0 -1
  446. package/dist/chunk-4IFSYQVX.js +0 -337
  447. package/dist/chunk-4IFSYQVX.js.map +0 -1
  448. package/dist/chunk-4P6ZOARG.cjs +0 -33
  449. package/dist/chunk-4P6ZOARG.cjs.map +0 -1
  450. package/dist/chunk-55ER2KD5.js +0 -228
  451. package/dist/chunk-55ER2KD5.js.map +0 -1
  452. package/dist/chunk-5ZN622AO.js +0 -73
  453. package/dist/chunk-5ZN622AO.js.map +0 -1
  454. package/dist/chunk-66YJ66GG.js +0 -1021
  455. package/dist/chunk-66YJ66GG.js.map +0 -1
  456. package/dist/chunk-6S5RUKU3.cjs +0 -347
  457. package/dist/chunk-6S5RUKU3.cjs.map +0 -1
  458. package/dist/chunk-6UQRVUN3.js +0 -222
  459. package/dist/chunk-6UQRVUN3.js.map +0 -1
  460. package/dist/chunk-7552UTQW.js +0 -11
  461. package/dist/chunk-7552UTQW.js.map +0 -1
  462. package/dist/chunk-7EQ4G4SI.cjs +0 -146
  463. package/dist/chunk-7EQ4G4SI.cjs.map +0 -1
  464. package/dist/chunk-7SAWIN74.js +0 -285
  465. package/dist/chunk-7SAWIN74.js.map +0 -1
  466. package/dist/chunk-A4E5AQFK.js +0 -30
  467. package/dist/chunk-A4E5AQFK.js.map +0 -1
  468. package/dist/chunk-ALPYR2GC.js +0 -1061
  469. package/dist/chunk-ALPYR2GC.js.map +0 -1
  470. package/dist/chunk-B7SWBE4P.cjs +0 -799
  471. package/dist/chunk-B7SWBE4P.cjs.map +0 -1
  472. package/dist/chunk-BZHG5IZ4.js +0 -73
  473. package/dist/chunk-BZHG5IZ4.js.map +0 -1
  474. package/dist/chunk-CEAQK2QY.cjs +0 -32
  475. package/dist/chunk-CEAQK2QY.cjs.map +0 -1
  476. package/dist/chunk-CMHVQR6P.js +0 -170
  477. package/dist/chunk-CMHVQR6P.js.map +0 -1
  478. package/dist/chunk-CU6IDACR.cjs +0 -224
  479. package/dist/chunk-CU6IDACR.cjs.map +0 -1
  480. package/dist/chunk-D4TM63S3.js +0 -795
  481. package/dist/chunk-D4TM63S3.js.map +0 -1
  482. package/dist/chunk-DCEDJQGG.js +0 -28
  483. package/dist/chunk-DCEDJQGG.js.map +0 -1
  484. package/dist/chunk-DPSA4QLA.js +0 -344
  485. package/dist/chunk-DPSA4QLA.js.map +0 -1
  486. package/dist/chunk-E6TERL5O.cjs +0 -23
  487. package/dist/chunk-E6TERL5O.cjs.map +0 -1
  488. package/dist/chunk-EE6CPXKH.cjs +0 -164
  489. package/dist/chunk-EE6CPXKH.cjs.map +0 -1
  490. package/dist/chunk-EOFB7XCL.cjs +0 -837
  491. package/dist/chunk-EOFB7XCL.cjs.map +0 -1
  492. package/dist/chunk-ESLWRGAG.cjs +0 -92
  493. package/dist/chunk-ESLWRGAG.cjs.map +0 -1
  494. package/dist/chunk-ESMHTKLJ.cjs +0 -206
  495. package/dist/chunk-ESMHTKLJ.cjs.map +0 -1
  496. package/dist/chunk-FMTHVSYY.cjs +0 -1039
  497. package/dist/chunk-FMTHVSYY.cjs.map +0 -1
  498. package/dist/chunk-FU6R566Y.cjs +0 -236
  499. package/dist/chunk-FU6R566Y.cjs.map +0 -1
  500. package/dist/chunk-GYR5K654.js +0 -91
  501. package/dist/chunk-GYR5K654.js.map +0 -1
  502. package/dist/chunk-HA2WBOGQ.js +0 -57
  503. package/dist/chunk-HA2WBOGQ.js.map +0 -1
  504. package/dist/chunk-HT5JQKN2.js +0 -118
  505. package/dist/chunk-HT5JQKN2.js.map +0 -1
  506. package/dist/chunk-INJD3G4K.cjs +0 -340
  507. package/dist/chunk-INJD3G4K.cjs.map +0 -1
  508. package/dist/chunk-IOYFAFHJ.cjs +0 -95
  509. package/dist/chunk-IOYFAFHJ.cjs.map +0 -1
  510. package/dist/chunk-J5QENANM.js +0 -87
  511. package/dist/chunk-J5QENANM.js.map +0 -1
  512. package/dist/chunk-J7VGRIAJ.js +0 -64
  513. package/dist/chunk-J7VGRIAJ.js.map +0 -1
  514. package/dist/chunk-KFOHQK7X.js +0 -144
  515. package/dist/chunk-KFOHQK7X.js.map +0 -1
  516. package/dist/chunk-KIL5CUN6.js +0 -31
  517. package/dist/chunk-KIL5CUN6.js.map +0 -1
  518. package/dist/chunk-KYXZS3EA.cjs +0 -100
  519. package/dist/chunk-KYXZS3EA.cjs.map +0 -1
  520. package/dist/chunk-LITNXTTT.js +0 -3
  521. package/dist/chunk-LITNXTTT.js.map +0 -1
  522. package/dist/chunk-LVIPBYFE.js +0 -157
  523. package/dist/chunk-LVIPBYFE.js.map +0 -1
  524. package/dist/chunk-M3LFHHTN.cjs +0 -764
  525. package/dist/chunk-M3LFHHTN.cjs.map +0 -1
  526. package/dist/chunk-N25JDZSC.js +0 -95
  527. package/dist/chunk-N25JDZSC.js.map +0 -1
  528. package/dist/chunk-NEIB3TLD.cjs +0 -360
  529. package/dist/chunk-NEIB3TLD.cjs.map +0 -1
  530. package/dist/chunk-NENU7E6V.cjs +0 -344
  531. package/dist/chunk-NENU7E6V.cjs.map +0 -1
  532. package/dist/chunk-NVAI5CCN.cjs +0 -39
  533. package/dist/chunk-NVAI5CCN.cjs.map +0 -1
  534. package/dist/chunk-NZ72VDNY.cjs +0 -4
  535. package/dist/chunk-NZ72VDNY.cjs.map +0 -1
  536. package/dist/chunk-OPPXYVEZ.cjs +0 -131
  537. package/dist/chunk-OPPXYVEZ.cjs.map +0 -1
  538. package/dist/chunk-Q4EULJQY.js +0 -35
  539. package/dist/chunk-Q4EULJQY.js.map +0 -1
  540. package/dist/chunk-QF7ARNUM.js +0 -339
  541. package/dist/chunk-QF7ARNUM.js.map +0 -1
  542. package/dist/chunk-QWW3E3JM.cjs +0 -178
  543. package/dist/chunk-QWW3E3JM.cjs.map +0 -1
  544. package/dist/chunk-R7QYGZUP.cjs +0 -1075
  545. package/dist/chunk-R7QYGZUP.cjs.map +0 -1
  546. package/dist/chunk-RUPKBKUF.js +0 -352
  547. package/dist/chunk-RUPKBKUF.js.map +0 -1
  548. package/dist/chunk-SEO6NAQT.js +0 -14
  549. package/dist/chunk-SEO6NAQT.js.map +0 -1
  550. package/dist/chunk-T4B5LB6E.cjs +0 -66
  551. package/dist/chunk-T4B5LB6E.cjs.map +0 -1
  552. package/dist/chunk-T5WRA76K.cjs +0 -32
  553. package/dist/chunk-T5WRA76K.cjs.map +0 -1
  554. package/dist/chunk-T7JO2TCP.js +0 -1233
  555. package/dist/chunk-T7JO2TCP.js.map +0 -1
  556. package/dist/chunk-TC5ZPWM4.cjs +0 -289
  557. package/dist/chunk-TC5ZPWM4.cjs.map +0 -1
  558. package/dist/chunk-TQ5UWA7S.js +0 -26
  559. package/dist/chunk-TQ5UWA7S.js.map +0 -1
  560. package/dist/chunk-UIKYE2QZ.js +0 -833
  561. package/dist/chunk-UIKYE2QZ.js.map +0 -1
  562. package/dist/chunk-UNPLAVE7.js +0 -21
  563. package/dist/chunk-UNPLAVE7.js.map +0 -1
  564. package/dist/chunk-UY3UYPBZ.cjs +0 -77
  565. package/dist/chunk-UY3UYPBZ.cjs.map +0 -1
  566. package/dist/chunk-V7UBMJAB.cjs +0 -1242
  567. package/dist/chunk-V7UBMJAB.cjs.map +0 -1
  568. package/dist/chunk-VH77IPJN.cjs +0 -358
  569. package/dist/chunk-VH77IPJN.cjs.map +0 -1
  570. package/dist/chunk-VQTCQKHQ.cjs +0 -17
  571. package/dist/chunk-VQTCQKHQ.cjs.map +0 -1
  572. package/dist/chunk-WGWSHJ2N.js +0 -38
  573. package/dist/chunk-WGWSHJ2N.js.map +0 -1
  574. package/dist/chunk-WJH6IYU2.cjs +0 -32
  575. package/dist/chunk-WJH6IYU2.cjs.map +0 -1
  576. package/dist/chunk-YREV3LGG.cjs +0 -61
  577. package/dist/chunk-YREV3LGG.cjs.map +0 -1
  578. package/dist/chunk-YTXEZ4SD.cjs +0 -77
  579. package/dist/chunk-YTXEZ4SD.cjs.map +0 -1
  580. package/dist/chunk-ZNMBW67B.cjs +0 -40
  581. package/dist/chunk-ZNMBW67B.cjs.map +0 -1
  582. package/dist/correlation-id.cjs.map +0 -1
  583. package/dist/correlation-id.js.map +0 -1
  584. package/dist/define-event-BL6Li7CM.d.ts +0 -23
  585. package/dist/define-event-ClP3T1Jx.d.cts +0 -23
  586. package/dist/event-subscriber.cjs.map +0 -1
  587. package/dist/event-subscriber.js.map +0 -1
  588. package/dist/event.cjs.map +0 -1
  589. package/dist/event.js.map +0 -1
  590. package/dist/exporters.cjs.map +0 -1
  591. package/dist/exporters.js.map +0 -1
  592. package/dist/functional.cjs.map +0 -1
  593. package/dist/functional.js.map +0 -1
  594. package/dist/init-DIowiiCh.d.ts +0 -1167
  595. package/dist/init-j-A1zI16.d.cts +0 -1167
  596. package/dist/processors.cjs.map +0 -1
  597. package/dist/processors.js.map +0 -1
  598. package/dist/trace-context-DbGKd1Rn.d.cts +0 -213
  599. package/dist/trace-context-DbGKd1Rn.d.ts +0 -213
  600. package/dist/utils-BahBCFtJ.d.cts +0 -712
  601. package/dist/utils-CLKwaUlG.d.ts +0 -712
  602. package/dist/yaml-config.cjs.map +0 -1
package/dist/index.js CHANGED
@@ -1,777 +1,975 @@
1
- export { httpRequestHeaderAttribute, httpResponseHeaderAttribute } from './chunk-7552UTQW.js';
2
- export { parseError } from './chunk-J7VGRIAJ.js';
3
- export { createDrainPipeline } from './chunk-KFOHQK7X.js';
4
- export { getCurrentWorkflowContext, isInWorkflow, traceStep, traceWorkflow } from './chunk-QF7ARNUM.js';
5
- import { hashJson } from './chunk-UNPLAVE7.js';
6
- export { attrs, autoRedactPII, dbClient, httpClient, httpServer, identify, mergeAttrs, mergeServiceResource, request, safeSetAttributes, setDevice, setError, setException, setSession, setUser, validateAttribute } from './chunk-454CH4OV.js';
7
- export { HTTPAttributes, ServiceAttributes, URLAttributes } from './chunk-4A53YIAX.js';
8
- export { traceConsumer, traceProducer } from './chunk-D4TM63S3.js';
9
- import { emitCorrelatedEvent } from './chunk-KIL5CUN6.js';
10
- export { BusinessBaggage, createSafeBaggageSchema } from './chunk-4IFSYQVX.js';
11
- import { resetMetrics } from './chunk-7SAWIN74.js';
12
- export { Metric, getMetrics, resetMetrics } from './chunk-7SAWIN74.js';
13
- import './chunk-5ZN622AO.js';
14
- export { createCounter, createHistogram, createObservableGauge, createUpDownCounter, getMeter } from './chunk-TQ5UWA7S.js';
15
- export { traceDB, traceHTTP, traceLLM, traceMessaging } from './chunk-N25JDZSC.js';
16
- import { trace as trace$1 } from './chunk-T7JO2TCP.js';
17
- export { ctx, instrument, markAsImmediate, span, withBaggage, withNewContext, withTracing } from './chunk-T7JO2TCP.js';
18
- export { createDeterministicTraceId, enrichWithTraceContext, finalizeSpan, flattenMetadata, getActiveContext, getActiveSpan, getTraceContext, getTracer, isTracing, resolveTraceUrl, runWithSpan } from './chunk-HT5JQKN2.js';
19
- import { resetEvents } from './chunk-UIKYE2QZ.js';
20
- export { Event, getEvents, resetEvents } from './chunk-UIKYE2QZ.js';
21
- import './chunk-LITNXTTT.js';
22
- import './chunk-BZHG5IZ4.js';
23
- export { getOperationContext, runInOperationContext } from './chunk-SEO6NAQT.js';
24
- import { getEventQueue, resetEventQueue, track, createTraceContext } from './chunk-66YJ66GG.js';
25
- export { CORRELATION_ID_BAGGAGE_KEY, defineBaggageSchema, generateCorrelationId, getCorrelationId, getEventQueue, getOrCreateCorrelationId, runWithCorrelationId, setCorrelationId, setCorrelationIdInBaggage, track } from './chunk-66YJ66GG.js';
26
- import { flattenToAttributes, recordStructuredError, createStructuredError } from './chunk-LVIPBYFE.js';
27
- export { createStructuredError, flattenToAttributes, getStructuredErrorAttributes, recordStructuredError, structuredErrorToJSON, toAttributeValue } from './chunk-LVIPBYFE.js';
28
- import { getLogger, getSdk, _closeEmbeddedDevtools } from './chunk-ALPYR2GC.js';
29
- export { BaggageSpanProcessor, createStringRedactor, init, isInitialized, isLoggerLocked, lockLogger } from './chunk-ALPYR2GC.js';
30
- import './chunk-CMHVQR6P.js';
31
- import './chunk-A4E5AQFK.js';
32
- export { FilteringSpanProcessor } from './chunk-WGWSHJ2N.js';
33
- export { NORMALIZER_PATTERNS, NORMALIZER_PRESETS, SpanNameNormalizingProcessor } from './chunk-GYR5K654.js';
34
- export { AttributeRedactingProcessor, REDACTOR_PATTERNS, REDACTOR_PRESETS, builtinPatterns, createAttributeRedactor, createRedactedSpan, normalizeAttributeRedactorConfig } from './chunk-RUPKBKUF.js';
35
- import './chunk-6UQRVUN3.js';
36
- export { formatDuration } from './chunk-3QXBFGKP.js';
37
- import './chunk-Q4EULJQY.js';
38
- export { AUTOTEL_SAMPLING_TAIL_EVALUATED, AUTOTEL_SAMPLING_TAIL_KEEP, AdaptiveSampler, AlwaysSampler, NeverSampler, RandomSampler, UserIdSampler, createLinkFromHeaders, extractLinksFromBatch, resolveSamplingPreset, samplingPresets } from './chunk-DPSA4QLA.js';
39
- import './chunk-55ER2KD5.js';
40
- import './chunk-J5QENANM.js';
41
- export { getAutotelTracer, getAutotelTracerProvider, setAutotelTracerProvider } from './chunk-HA2WBOGQ.js';
42
- import { trace } from '@opentelemetry/api';
43
- export { ROOT_CONTEXT, SpanKind, SpanStatusCode, context, trace as otelTrace, propagation } from '@opentelemetry/api';
44
- import { AsyncLocalStorage } from 'async_hooks';
45
- import { AggregationType } from '@opentelemetry/sdk-metrics';
1
+ import { AUTOTEL_SAMPLING_TAIL_EVALUATED, AUTOTEL_SAMPLING_TAIL_KEEP, AdaptiveSampler, AlwaysSampler, NeverSampler, RandomSampler, UserIdSampler, createLinkFromHeaders, extractLinksFromBatch, resolveSamplingPreset, samplingPresets } from "./sampling.js";
2
+ import { a as getSdk, c as isInitialized, f as createStringRedactor, i as getLogger, l as isLoggerLocked, p as BaggageSpanProcessor, s as init, t as _closeEmbeddedDevtools, u as lockLogger } from "./init-Ch6t7MNI.js";
3
+ import { FilteringSpanProcessor } from "./filtering-span-processor.js";
4
+ import { NORMALIZER_PATTERNS, NORMALIZER_PRESETS, SpanNameNormalizingProcessor } from "./span-name-normalizer.js";
5
+ import { AttributeRedactingProcessor, REDACTOR_PATTERNS, REDACTOR_PRESETS, builtinPatterns, createAttributeRedactor, createRedactedSpan, normalizeAttributeRedactorConfig } from "./attribute-redacting-processor.js";
6
+ import { n as formatDuration } from "./canonical-log-line-processor-DbBQT5vY.js";
7
+ import { getAutotelTracer, getAutotelTracerProvider, setAutotelTracerProvider } from "./tracer-provider.js";
8
+ import { a as CORRELATION_ID_BAGGAGE_KEY, d as setCorrelationId, f as setCorrelationIdInBaggage, l as getOrCreateCorrelationId, m as defineBaggageSchema, n as resetEventQueue, o as generateCorrelationId, p as createTraceContext, r as track, s as getCorrelationId, t as getEventQueue, u as runWithCorrelationId } from "./track-nsKVy-pj.js";
9
+ import { a as flattenToAttributes, i as structuredErrorToJSON, n as getStructuredErrorAttributes, o as toAttributeValue, r as recordStructuredError, t as createStructuredError } from "./structured-error-9--cxBay.js";
10
+ import { createDeterministicTraceId, enrichWithTraceContext, finalizeSpan, flattenMetadata, getActiveContext, getActiveSpan, getTraceContext, getTracer, isTracing, resolveTraceUrl, runWithSpan } from "./trace-helpers.js";
11
+ import { n as runInOperationContext, t as getOperationContext } from "./operation-context-C-2hmmtP.js";
12
+ import { a as trace$2, c as withTracing, i as span, n as instrument, o as withBaggage, r as markAsImmediate, s as withNewContext, t as ctx } from "./functional-BGkT8J-h.js";
13
+ import { t as hashJson } from "./stable-hash-Cg5cT34Q.js";
14
+ import { n as getEvents, r as resetEvents, t as Event } from "./event-_58ryBjh.js";
15
+ import { Metric, getMetrics, resetMetrics } from "./metric.js";
16
+ import { t as emitCorrelatedEvent } from "./correlated-events-Bzh5y-UB.js";
17
+ import { parseError } from "./parse-error.js";
18
+ import { createDrainPipeline } from "./drain-pipeline.js";
19
+ import { createCounter, createHistogram, createObservableGauge, createUpDownCounter, getMeter } from "./metric-helpers.js";
20
+ import { traceDB, traceHTTP, traceLLM, traceMessaging } from "./semantic-helpers.js";
21
+ import { b as ServiceAttributes, f as HTTPAttributes, w as URLAttributes } from "./registry-DfXA3R1L.js";
22
+ import { httpRequestHeaderAttribute, httpResponseHeaderAttribute } from "./semantic-conventions.js";
23
+ import { a as identify, c as setDevice, d as setSession, f as setUser, h as autoRedactPII, i as httpServer, l as setError, m as safeSetAttributes, n as dbClient, o as mergeServiceResource, p as mergeAttrs, r as httpClient, s as request, u as setException, v as validateAttribute, y as attrs } from "./attributes-ksn4HVbd.js";
24
+ import { traceConsumer, traceProducer } from "./messaging.js";
25
+ import { BusinessBaggage, createSafeBaggageSchema } from "./business-baggage.js";
26
+ import { getCurrentWorkflowContext, isInWorkflow, traceStep, traceWorkflow } from "./workflow.js";
27
+ import { ROOT_CONTEXT, SpanKind, SpanStatusCode, context, propagation, trace as otelTrace, trace as trace$1 } from "@opentelemetry/api";
28
+ import { AggregationType } from "@opentelemetry/sdk-metrics";
29
+ import { AsyncLocalStorage } from "node:async_hooks";
46
30
 
47
- var otelMethods = {
48
- // Class methods on TraceAPI — bind to the singleton.
49
- setGlobalTracerProvider: trace.setGlobalTracerProvider.bind(trace),
50
- getTracerProvider: trace.getTracerProvider.bind(trace),
51
- getTracer: trace.getTracer.bind(trace),
52
- disable: trace.disable.bind(trace),
53
- // Instance fields on TraceAPI — already standalone, copy by reference.
54
- wrapSpanContext: trace.wrapSpanContext,
55
- isSpanContextValid: trace.isSpanContextValid,
56
- deleteSpan: trace.deleteSpan,
57
- getSpan: trace.getSpan,
58
- getActiveSpan: trace.getActiveSpan,
59
- getSpanContext: trace.getSpanContext,
60
- setSpan: trace.setSpan,
61
- setSpanContext: trace.setSpanContext
31
+ //#region src/trace-hybrid.ts
32
+ /**
33
+ * Hybrid `trace` export: callable like autotel's `trace(fn)`, AND exposes the
34
+ * full `@opentelemetry/api` `TraceAPI` surface (`trace.getActiveSpan()`,
35
+ * `trace.getTracer()`, …) so existing OTel code "just works" when imported
36
+ * from `autotel`.
37
+ *
38
+ * Implementation: `Object.assign` mutates the autotel `trace` function to
39
+ * attach the OTel TraceAPI methods. Because every reference to `trace` across
40
+ * autotel resolves to the same function instance, this is a one-time, global
41
+ * augmentation.
42
+ */
43
+ const otelMethods = {
44
+ setGlobalTracerProvider: trace$1.setGlobalTracerProvider.bind(trace$1),
45
+ getTracerProvider: trace$1.getTracerProvider.bind(trace$1),
46
+ getTracer: trace$1.getTracer.bind(trace$1),
47
+ disable: trace$1.disable.bind(trace$1),
48
+ wrapSpanContext: trace$1.wrapSpanContext,
49
+ isSpanContextValid: trace$1.isSpanContextValid,
50
+ deleteSpan: trace$1.deleteSpan,
51
+ getSpan: trace$1.getSpan,
52
+ getActiveSpan: trace$1.getActiveSpan,
53
+ getSpanContext: trace$1.getSpanContext,
54
+ setSpan: trace$1.setSpan,
55
+ setSpanContext: trace$1.setSpanContext
62
56
  };
63
- var trace2 = Object.assign(
64
- trace$1,
65
- otelMethods
66
- );
57
+ const trace = Object.assign(trace$2, otelMethods);
67
58
 
68
- // src/define-event.ts
59
+ //#endregion
60
+ //#region src/define-event.ts
69
61
  function defineEvent(name, schema, options = {}) {
70
- const jsonSchema = options.toJsonSchema?.(schema);
71
- const schemaMetadata = jsonSchema ? {
72
- source: "zod",
73
- jsonSchema,
74
- hash: hashJson(jsonSchema)
75
- } : void 0;
76
- return {
77
- name,
78
- schemaMetadata,
79
- track(payload) {
80
- const parsed = schema.safeParse(payload);
81
- if (!parsed.success) {
82
- throw new Error(
83
- `Invalid payload for event "${name}". Schema validation failed.`
84
- );
85
- }
86
- track(
87
- name,
88
- parsed.data,
89
- schemaMetadata ? { schema: schemaMetadata } : void 0
90
- );
91
- }
92
- };
62
+ const jsonSchema = options.toJsonSchema?.(schema);
63
+ const schemaMetadata = jsonSchema ? {
64
+ source: "zod",
65
+ jsonSchema,
66
+ hash: hashJson(jsonSchema)
67
+ } : void 0;
68
+ return {
69
+ name,
70
+ schemaMetadata,
71
+ track(payload) {
72
+ const parsed = schema.safeParse(payload);
73
+ if (!parsed.success) throw new Error(`Invalid payload for event "${name}". Schema validation failed.`);
74
+ track(name, parsed.data, schemaMetadata ? { schema: schemaMetadata } : void 0);
75
+ }
76
+ };
93
77
  }
94
78
 
95
- // src/shutdown.ts
79
+ //#endregion
80
+ //#region src/shutdown.ts
81
+ /**
82
+ * Graceful shutdown with flush and cleanup
83
+ */
84
+ /**
85
+ * Flush all pending telemetry
86
+ *
87
+ * Flushes both events events and OpenTelemetry spans to their destinations.
88
+ * Includes timeout protection to prevent hanging in serverless environments.
89
+ *
90
+ * Safe to call multiple times.
91
+ *
92
+ * @param options - Optional configuration
93
+ * @param options.timeout - Timeout in milliseconds (default: 2000ms)
94
+ * @param options.forShutdown - If true, permanently disables the events queue after flush (used internally by shutdown())
95
+ *
96
+ * @example Manual flush in serverless
97
+ * ```typescript
98
+ * import { flush } from 'autotel';
99
+ *
100
+ * export const handler = async (event) => {
101
+ * // ... process event
102
+ * await flush(); // Flush before function returns
103
+ * return result;
104
+ * };
105
+ * ```
106
+ *
107
+ * @example With custom timeout
108
+ * ```typescript
109
+ * await flush({ timeout: 5000 }); // 5 second timeout
110
+ * ```
111
+ */
96
112
  async function flush(options) {
97
- const timeout = options?.timeout ?? 2e3;
98
- const forShutdown = options?.forShutdown ?? false;
99
- const doFlush = async () => {
100
- const eventsQueue = getEventQueue();
101
- if (eventsQueue) {
102
- if (forShutdown) {
103
- await eventsQueue.shutdown();
104
- } else {
105
- await eventsQueue.flush();
106
- }
107
- }
108
- const sdk = getSdk();
109
- if (sdk) {
110
- try {
111
- const sdkAny = sdk;
112
- if (typeof sdkAny.getTracerProvider === "function") {
113
- const tracerProvider = sdkAny.getTracerProvider();
114
- if (tracerProvider && typeof tracerProvider.forceFlush === "function") {
115
- await tracerProvider.forceFlush();
116
- }
117
- }
118
- } catch {
119
- }
120
- }
121
- };
122
- let timeoutHandle;
123
- try {
124
- await Promise.race([
125
- doFlush().finally(() => {
126
- if (timeoutHandle) {
127
- clearTimeout(timeoutHandle);
128
- }
129
- }),
130
- new Promise((_, reject) => {
131
- timeoutHandle = setTimeout(
132
- () => reject(new Error("Flush timeout")),
133
- timeout
134
- );
135
- timeoutHandle.unref();
136
- })
137
- ]);
138
- } catch (error) {
139
- if (timeoutHandle) {
140
- clearTimeout(timeoutHandle);
141
- }
142
- const logger = getLogger();
143
- logger.error(
144
- {
145
- err: error instanceof Error ? error : new Error(String(error))
146
- },
147
- "[autotel] Flush error"
148
- );
149
- throw error;
150
- }
151
- }
113
+ const timeout = options?.timeout ?? 2e3;
114
+ const forShutdown = options?.forShutdown ?? false;
115
+ const doFlush = async () => {
116
+ const eventsQueue = getEventQueue();
117
+ if (eventsQueue) if (forShutdown) await eventsQueue.shutdown();
118
+ else await eventsQueue.flush();
119
+ const sdk = getSdk();
120
+ if (sdk) try {
121
+ const sdkAny = sdk;
122
+ if (typeof sdkAny.getTracerProvider === "function") {
123
+ const tracerProvider = sdkAny.getTracerProvider();
124
+ if (tracerProvider && typeof tracerProvider.forceFlush === "function") await tracerProvider.forceFlush();
125
+ }
126
+ } catch {}
127
+ };
128
+ let timeoutHandle;
129
+ try {
130
+ await Promise.race([doFlush().finally(() => {
131
+ if (timeoutHandle) clearTimeout(timeoutHandle);
132
+ }), new Promise((_, reject) => {
133
+ timeoutHandle = setTimeout(() => reject(/* @__PURE__ */ new Error("Flush timeout")), timeout);
134
+ timeoutHandle.unref();
135
+ })]);
136
+ } catch (error) {
137
+ if (timeoutHandle) clearTimeout(timeoutHandle);
138
+ getLogger().error({ err: error instanceof Error ? error : new Error(String(error)) }, "[autotel] Flush error");
139
+ throw error;
140
+ }
141
+ }
142
+ /**
143
+ * Shutdown telemetry and cleanup resources
144
+ *
145
+ * - Flushes all pending data
146
+ * - Shuts down OpenTelemetry SDK
147
+ * - Cleans up resources
148
+ *
149
+ * Call this before process exit.
150
+ *
151
+ * Always performs cleanup even if flush fails, preventing resource leaks
152
+ * in serverless handlers or tests.
153
+ *
154
+ * @example Express server
155
+ * ```typescript
156
+ * const server = app.listen(3000)
157
+ *
158
+ * process.on('SIGTERM', async () => {
159
+ * await server.close()
160
+ * await shutdown()
161
+ * process.exit(0)
162
+ * })
163
+ * ```
164
+ */
152
165
  async function shutdown() {
153
- const logger = getLogger();
154
- let shutdownError = null;
155
- try {
156
- await flush({ forShutdown: true });
157
- } catch (error) {
158
- const err = error instanceof Error ? error : new Error(String(error));
159
- shutdownError = err;
160
- logger.error(
161
- {
162
- err
163
- },
164
- "[autotel] Flush failed during shutdown, continuing cleanup"
165
- );
166
- }
167
- try {
168
- const sdk = getSdk();
169
- if (sdk) {
170
- await sdk.shutdown();
171
- }
172
- } catch (error) {
173
- const err = error instanceof Error ? error : new Error(String(error));
174
- const isConnectionRefused = typeof error === "object" && error !== null && "code" in error && error.code === "ECONNREFUSED";
175
- if (!isConnectionRefused) {
176
- if (!shutdownError) {
177
- shutdownError = err;
178
- }
179
- logger.error({ err }, "[autotel] SDK shutdown failed");
180
- }
181
- } finally {
182
- await _closeEmbeddedDevtools();
183
- const eventsQueue = getEventQueue();
184
- if (eventsQueue && typeof eventsQueue.cleanup === "function") {
185
- eventsQueue.cleanup();
186
- }
187
- resetEvents();
188
- resetMetrics();
189
- resetEventQueue();
190
- }
191
- if (shutdownError) {
192
- throw shutdownError;
193
- }
194
- }
166
+ const logger = getLogger();
167
+ let shutdownError = null;
168
+ try {
169
+ await flush({ forShutdown: true });
170
+ } catch (error) {
171
+ const err = error instanceof Error ? error : new Error(String(error));
172
+ shutdownError = err;
173
+ logger.error({ err }, "[autotel] Flush failed during shutdown, continuing cleanup");
174
+ }
175
+ try {
176
+ const sdk = getSdk();
177
+ if (sdk) await sdk.shutdown();
178
+ } catch (error) {
179
+ const err = error instanceof Error ? error : new Error(String(error));
180
+ if (!(typeof error === "object" && error !== null && "code" in error && error.code === "ECONNREFUSED")) {
181
+ if (!shutdownError) shutdownError = err;
182
+ logger.error({ err }, "[autotel] SDK shutdown failed");
183
+ }
184
+ } finally {
185
+ await _closeEmbeddedDevtools();
186
+ const eventsQueue = getEventQueue();
187
+ if (eventsQueue && typeof eventsQueue.cleanup === "function") eventsQueue.cleanup();
188
+ resetEvents();
189
+ resetMetrics();
190
+ resetEventQueue();
191
+ }
192
+ if (shutdownError) throw shutdownError;
193
+ }
194
+ /**
195
+ * Register automatic shutdown hooks for common signals
196
+ *
197
+ * Handles:
198
+ * - SIGTERM (Docker/K8s graceful shutdown)
199
+ * - SIGINT (Ctrl+C)
200
+ *
201
+ * @internal Called automatically on module load
202
+ */
195
203
  function registerShutdownHooks() {
196
- if (typeof process === "undefined") return;
197
- const signals = ["SIGTERM", "SIGINT"];
198
- let shuttingDown = false;
199
- for (const signal of signals) {
200
- process.on(signal, async () => {
201
- if (shuttingDown) return;
202
- shuttingDown = true;
203
- if (process.env.NODE_ENV !== "test") {
204
- getLogger().info(
205
- {},
206
- `[autotel] Received ${signal}, flushing telemetry...`
207
- );
208
- }
209
- try {
210
- await shutdown();
211
- } catch (error) {
212
- getLogger().error(
213
- {
214
- err: error instanceof Error ? error : void 0
215
- },
216
- "[autotel] Error during shutdown"
217
- );
218
- } finally {
219
- process.exit(0);
220
- }
221
- });
222
- }
204
+ if (typeof process === "undefined") return;
205
+ const signals = ["SIGTERM", "SIGINT"];
206
+ let shuttingDown = false;
207
+ for (const signal of signals) process.on(signal, async () => {
208
+ if (shuttingDown) return;
209
+ shuttingDown = true;
210
+ if (process.env.NODE_ENV !== "test") getLogger().info({}, `[autotel] Received ${signal}, flushing telemetry...`);
211
+ try {
212
+ await shutdown();
213
+ } catch (error) {
214
+ getLogger().error({ err: error instanceof Error ? error : void 0 }, "[autotel] Error during shutdown");
215
+ } finally {
216
+ process.exit(0);
217
+ }
218
+ });
223
219
  }
224
220
  registerShutdownHooks();
225
- var POST_EMIT_FORK_HINT = "For intentional background work tied to this request, use log.fork('label', fn) when available.";
221
+
222
+ //#endregion
223
+ //#region src/request-logger.ts
224
+ const POST_EMIT_FORK_HINT = "For intentional background work tied to this request, use log.fork('label', fn) when available.";
226
225
  function warnPostEmit(method, detail) {
227
- console.warn(
228
- `[autotel] ${method} called after the wide event was emitted \u2014 ${detail} This data will not appear in observability. ${POST_EMIT_FORK_HINT}`
229
- );
230
- }
231
- function mergeInto(target, source) {
232
- for (const key in source) {
233
- const sourceVal = source[key];
234
- if (sourceVal === void 0) continue;
235
- const targetVal = target[key];
236
- if (sourceVal !== null && typeof sourceVal === "object" && !Array.isArray(sourceVal) && targetVal !== null && typeof targetVal === "object" && !Array.isArray(targetVal)) {
237
- mergeInto(
238
- targetVal,
239
- sourceVal
240
- );
241
- } else if (Array.isArray(targetVal) && Array.isArray(sourceVal)) {
242
- target[key] = [...targetVal, ...sourceVal];
243
- } else {
244
- target[key] = sourceVal;
245
- }
246
- }
247
- }
248
- var requestContextStore = new AsyncLocalStorage();
249
- function runWithRequestContext(ctx2, fn) {
250
- return requestContextStore.run(ctx2, fn);
251
- }
252
- function resolveContext(ctx2) {
253
- if (ctx2) return ctx2;
254
- const stored = requestContextStore.getStore();
255
- if (stored) return stored;
256
- const span2 = trace.getActiveSpan();
257
- if (!span2) {
258
- throw new Error(
259
- "[autotel] getRequestLogger() requires an active span or runWithRequestContext(). Wrap your handler with trace() or use runWithRequestContext()."
260
- );
261
- }
262
- return createTraceContext(span2);
263
- }
264
- function getRequestLogger(ctx2, options) {
265
- const activeContext = resolveContext(ctx2);
266
- let contextState = {};
267
- let emitted = false;
268
- let lastSnapshot = null;
269
- const addLogEvent = (level, message, fields) => {
270
- const attrs2 = fields ? flattenToAttributes(fields) : void 0;
271
- emitCorrelatedEvent(activeContext, `log.${level}`, {
272
- message,
273
- ...attrs2 ?? {}
274
- });
275
- };
276
- const sealCheck = (method, keys) => {
277
- if (emitted) {
278
- warnPostEmit(
279
- method,
280
- `Keys dropped: ${keys.length ? keys.join(", ") : "(empty)"}.`
281
- );
282
- }
283
- };
284
- return {
285
- set(fields) {
286
- sealCheck("log.set()", Object.keys(fields));
287
- if (emitted) return;
288
- mergeInto(contextState, fields);
289
- activeContext.setAttributes(flattenToAttributes(fields));
290
- },
291
- info(message, fields) {
292
- const keys = fields ? ["message", ...Object.keys(fields).filter((k) => k !== "requestLogs")] : ["message"];
293
- sealCheck("log.info()", keys);
294
- if (emitted) return;
295
- addLogEvent("info", message, fields);
296
- if (fields) {
297
- mergeInto(contextState, fields);
298
- activeContext.setAttributes(flattenToAttributes(fields));
299
- }
300
- },
301
- warn(message, fields) {
302
- const keys = fields ? ["message", ...Object.keys(fields).filter((k) => k !== "requestLogs")] : ["message"];
303
- sealCheck("log.warn()", keys);
304
- if (emitted) return;
305
- addLogEvent("warn", message, fields);
306
- activeContext.setAttribute("autotel.log.level", "warn");
307
- if (fields) {
308
- mergeInto(contextState, fields);
309
- activeContext.setAttributes(flattenToAttributes(fields));
310
- }
311
- },
312
- error(error, fields) {
313
- const keys = fields ? [...Object.keys(fields), "error"] : ["error"];
314
- sealCheck("log.error()", keys);
315
- if (emitted) return;
316
- const err = typeof error === "string" ? new Error(error) : error;
317
- recordStructuredError(activeContext, err);
318
- addLogEvent("error", err.message, fields);
319
- if (fields) {
320
- mergeInto(contextState, fields);
321
- activeContext.setAttributes(flattenToAttributes(fields));
322
- }
323
- activeContext.setAttribute("autotel.log.level", "error");
324
- },
325
- getContext() {
326
- return { ...contextState };
327
- },
328
- emitNow(overrides) {
329
- if (emitted) {
330
- warnPostEmit("log.emitNow()", "Ignoring duplicate emit.");
331
- return lastSnapshot;
332
- }
333
- const mergedContext = {
334
- ...contextState,
335
- ...overrides ?? {}
336
- };
337
- const flattened = flattenToAttributes(mergedContext);
338
- activeContext.setAttributes(flattened);
339
- const snapshot = {
340
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
341
- traceId: activeContext.traceId,
342
- spanId: activeContext.spanId,
343
- correlationId: activeContext.correlationId,
344
- context: mergedContext
345
- };
346
- emitCorrelatedEvent(activeContext, "log.emit.manual", {
347
- ...flattened
348
- });
349
- if (options?.onEmit) {
350
- Promise.resolve(options.onEmit(snapshot)).catch((error) => {
351
- console.warn("[autotel] request logger onEmit failed:", error);
352
- });
353
- }
354
- emitted = true;
355
- lastSnapshot = snapshot;
356
- return snapshot;
357
- },
358
- fork(label, fn, forkOptions) {
359
- const parentRequestId = activeContext.correlationId;
360
- if (typeof parentRequestId !== "string" || parentRequestId.length === 0) {
361
- throw new Error(
362
- "[autotel] log.fork() requires the parent logger to have a correlationId. Ensure the request was created by autotel middleware."
363
- );
364
- }
365
- const tracer = trace.getTracer("autotel.request-logger");
366
- const lifecycle = forkOptions?.lifecycle;
367
- void tracer.startActiveSpan(`request.fork:${label}`, (childSpan) => {
368
- const childContext = {
369
- ...createTraceContext(childSpan),
370
- correlationId: crypto.randomUUID()
371
- };
372
- requestContextStore.run(childContext, () => {
373
- const childLog = getRequestLogger(childContext);
374
- childLog.set({
375
- operation: label,
376
- _parentCorrelationId: parentRequestId
377
- });
378
- lifecycle?.onChildEnter?.(childLog);
379
- void Promise.resolve().then(() => fn()).then(() => {
380
- childLog.emitNow();
381
- }).catch((err) => {
382
- const error = err instanceof Error ? err : new Error(String(err));
383
- childLog.error(error);
384
- childLog.emitNow();
385
- }).finally(() => {
386
- try {
387
- lifecycle?.onChildExit?.(childLog);
388
- } catch (hookError) {
389
- console.warn(
390
- "[autotel] fork onChildExit hook threw:",
391
- hookError
392
- );
393
- }
394
- childSpan.end();
395
- });
396
- });
397
- });
398
- }
399
- };
226
+ console.warn(`[autotel] ${method} called after the wide event was emitted — ${detail} This data will not appear in observability. ${POST_EMIT_FORK_HINT}`);
227
+ }
228
+ function mergeInto$1(target, source) {
229
+ for (const key in source) {
230
+ const sourceVal = source[key];
231
+ if (sourceVal === void 0) continue;
232
+ const targetVal = target[key];
233
+ if (sourceVal !== null && typeof sourceVal === "object" && !Array.isArray(sourceVal) && targetVal !== null && typeof targetVal === "object" && !Array.isArray(targetVal)) mergeInto$1(targetVal, sourceVal);
234
+ else if (Array.isArray(targetVal) && Array.isArray(sourceVal)) target[key] = [...targetVal, ...sourceVal];
235
+ else target[key] = sourceVal;
236
+ }
237
+ }
238
+ const requestContextStore = new AsyncLocalStorage();
239
+ function runWithRequestContext(ctx, fn) {
240
+ return requestContextStore.run(ctx, fn);
241
+ }
242
+ function resolveContext(ctx) {
243
+ if (ctx) return ctx;
244
+ const stored = requestContextStore.getStore();
245
+ if (stored) return stored;
246
+ const span = trace$1.getActiveSpan();
247
+ if (!span) throw new Error("[autotel] getRequestLogger() requires an active span or runWithRequestContext(). Wrap your handler with trace() or use runWithRequestContext().");
248
+ return createTraceContext(span);
249
+ }
250
+ function getRequestLogger(ctx, options) {
251
+ const activeContext = resolveContext(ctx);
252
+ let contextState = {};
253
+ let emitted = false;
254
+ let lastSnapshot = null;
255
+ const addLogEvent = (level, message, fields) => {
256
+ const attrs = fields ? flattenToAttributes(fields) : void 0;
257
+ emitCorrelatedEvent(activeContext, `log.${level}`, {
258
+ message,
259
+ ...attrs ?? {}
260
+ });
261
+ };
262
+ const sealCheck = (method, keys) => {
263
+ if (emitted) warnPostEmit(method, `Keys dropped: ${keys.length ? keys.join(", ") : "(empty)"}.`);
264
+ };
265
+ return {
266
+ set(fields) {
267
+ sealCheck("log.set()", Object.keys(fields));
268
+ if (emitted) return;
269
+ mergeInto$1(contextState, fields);
270
+ activeContext.setAttributes(flattenToAttributes(fields));
271
+ },
272
+ info(message, fields) {
273
+ sealCheck("log.info()", fields ? ["message", ...Object.keys(fields).filter((k) => k !== "requestLogs")] : ["message"]);
274
+ if (emitted) return;
275
+ addLogEvent("info", message, fields);
276
+ if (fields) {
277
+ mergeInto$1(contextState, fields);
278
+ activeContext.setAttributes(flattenToAttributes(fields));
279
+ }
280
+ },
281
+ warn(message, fields) {
282
+ sealCheck("log.warn()", fields ? ["message", ...Object.keys(fields).filter((k) => k !== "requestLogs")] : ["message"]);
283
+ if (emitted) return;
284
+ addLogEvent("warn", message, fields);
285
+ activeContext.setAttribute("autotel.log.level", "warn");
286
+ if (fields) {
287
+ mergeInto$1(contextState, fields);
288
+ activeContext.setAttributes(flattenToAttributes(fields));
289
+ }
290
+ },
291
+ error(error, fields) {
292
+ sealCheck("log.error()", fields ? [...Object.keys(fields), "error"] : ["error"]);
293
+ if (emitted) return;
294
+ const err = typeof error === "string" ? new Error(error) : error;
295
+ recordStructuredError(activeContext, err);
296
+ addLogEvent("error", err.message, fields);
297
+ if (fields) {
298
+ mergeInto$1(contextState, fields);
299
+ activeContext.setAttributes(flattenToAttributes(fields));
300
+ }
301
+ activeContext.setAttribute("autotel.log.level", "error");
302
+ },
303
+ getContext() {
304
+ return { ...contextState };
305
+ },
306
+ emitNow(overrides) {
307
+ if (emitted) {
308
+ warnPostEmit("log.emitNow()", "Ignoring duplicate emit.");
309
+ return lastSnapshot;
310
+ }
311
+ const mergedContext = {
312
+ ...contextState,
313
+ ...overrides ?? {}
314
+ };
315
+ const flattened = flattenToAttributes(mergedContext);
316
+ activeContext.setAttributes(flattened);
317
+ const snapshot = {
318
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
319
+ traceId: activeContext.traceId,
320
+ spanId: activeContext.spanId,
321
+ correlationId: activeContext.correlationId,
322
+ context: mergedContext
323
+ };
324
+ emitCorrelatedEvent(activeContext, "log.emit.manual", { ...flattened });
325
+ if (options?.onEmit) Promise.resolve(options.onEmit(snapshot)).catch((error) => {
326
+ console.warn("[autotel] request logger onEmit failed:", error);
327
+ });
328
+ emitted = true;
329
+ lastSnapshot = snapshot;
330
+ return snapshot;
331
+ },
332
+ fork(label, fn, forkOptions) {
333
+ const parentRequestId = activeContext.correlationId;
334
+ if (typeof parentRequestId !== "string" || parentRequestId.length === 0) throw new Error("[autotel] log.fork() requires the parent logger to have a correlationId. Ensure the request was created by autotel middleware.");
335
+ const tracer = trace$1.getTracer("autotel.request-logger");
336
+ const lifecycle = forkOptions?.lifecycle;
337
+ tracer.startActiveSpan(`request.fork:${label}`, (childSpan) => {
338
+ const childContext = {
339
+ ...createTraceContext(childSpan),
340
+ correlationId: crypto.randomUUID()
341
+ };
342
+ requestContextStore.run(childContext, () => {
343
+ const childLog = getRequestLogger(childContext);
344
+ childLog.set({
345
+ operation: label,
346
+ _parentCorrelationId: parentRequestId
347
+ });
348
+ lifecycle?.onChildEnter?.(childLog);
349
+ Promise.resolve().then(() => fn()).then(() => {
350
+ childLog.emitNow();
351
+ }).catch((err) => {
352
+ const error = err instanceof Error ? err : new Error(String(err));
353
+ childLog.error(error);
354
+ childLog.emitNow();
355
+ }).finally(() => {
356
+ try {
357
+ lifecycle?.onChildExit?.(childLog);
358
+ } catch (hookError) {
359
+ console.warn("[autotel] fork onChildExit hook threw:", hookError);
360
+ }
361
+ childSpan.end();
362
+ });
363
+ });
364
+ });
365
+ }
366
+ };
367
+ }
368
+ /**
369
+ * Returns `true` when a request-logger context can be resolved without throwing —
370
+ * i.e. an explicit `ctx` was provided, a `runWithRequestContext()` scope is active,
371
+ * or there is an active OpenTelemetry span.
372
+ *
373
+ * Use this to branch on observability availability instead of wrapping
374
+ * {@link getRequestLogger} in try/catch.
375
+ */
376
+ function hasRequestContext(ctx) {
377
+ if (ctx) return true;
378
+ if (requestContextStore.getStore()) return true;
379
+ return trace$1.getActiveSpan() != null;
380
+ }
381
+ /**
382
+ * Like {@link getRequestLogger}, but returns `null` instead of throwing when no
383
+ * request context is available. Intended for best-effort instrumentation where a
384
+ * missing telemetry context must never crash business logic.
385
+ */
386
+ function getRequestLoggerSafe(ctx, options) {
387
+ if (!hasRequestContext(ctx)) return null;
388
+ return getRequestLogger(ctx, options);
389
+ }
390
+ /**
391
+ * A no-op {@link RequestLogger} whose methods do nothing. Used as a fallback by
392
+ * best-effort instrumentation so wrapped handlers can run un-instrumented without
393
+ * branching on logger presence.
394
+ */
395
+ function createNoopRequestLogger() {
396
+ const snapshot = () => ({
397
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
398
+ traceId: "",
399
+ spanId: "",
400
+ correlationId: "",
401
+ context: {}
402
+ });
403
+ return {
404
+ set() {},
405
+ info() {},
406
+ warn() {},
407
+ error() {},
408
+ getContext() {
409
+ return {};
410
+ },
411
+ emitNow() {
412
+ return snapshot();
413
+ },
414
+ fork(_label, fn) {
415
+ Promise.resolve().then(() => fn());
416
+ }
417
+ };
400
418
  }
401
419
 
402
- // src/error-catalog.ts
403
- var catalogCodeKey = /* @__PURE__ */ Symbol.for("autotel.catalog.code");
420
+ //#endregion
421
+ //#region src/error-catalog.ts
422
+ /**
423
+ * Typed error and audit catalogs.
424
+ *
425
+ * Group related errors into one catalog and get a refactor-safe builder per
426
+ * code, with autocomplete at every call site and typed message parameters.
427
+ *
428
+ * @example
429
+ * ```typescript
430
+ * import { defineErrorCatalog } from 'autotel';
431
+ *
432
+ * export const billing = defineErrorCatalog('billing', {
433
+ * PAYMENT_DECLINED: {
434
+ * status: 402,
435
+ * message: 'Card declined',
436
+ * why: 'The issuer rejected the charge',
437
+ * fix: 'Try a different payment method',
438
+ * },
439
+ * INSUFFICIENT_FUNDS: {
440
+ * status: 402,
441
+ * message: ({ available, required }: { available: number; required: number }) =>
442
+ * `Insufficient funds: $${available} of $${required}`,
443
+ * },
444
+ * });
445
+ *
446
+ * throw billing.PAYMENT_DECLINED({ cause: stripeError });
447
+ * throw billing.INSUFFICIENT_FUNDS({ available: 5, required: 100 });
448
+ *
449
+ * // In a catch block — refactor-safe, no magic strings:
450
+ * if (billing.PAYMENT_DECLINED.match(err)) { ... }
451
+ * ```
452
+ */
453
+ const catalogCodeKey = Symbol.for("autotel.catalog.code");
404
454
  function readCatalogCode(error) {
405
- if (error === null || typeof error !== "object") return void 0;
406
- return error[catalogCodeKey];
455
+ if (error === null || typeof error !== "object") return void 0;
456
+ return error[catalogCodeKey];
407
457
  }
458
+ /** True when `error` was produced by any autotel error catalog. */
408
459
  function isCatalogError(error) {
409
- return readCatalogCode(error) !== void 0;
460
+ return readCatalogCode(error) !== void 0;
410
461
  }
462
+ /** Returns the catalog code of `error`, or `undefined` if it has none. */
411
463
  function getCatalogCode(error) {
412
- return readCatalogCode(error);
464
+ return readCatalogCode(error);
413
465
  }
466
+ /**
467
+ * Define a typed error catalog. Returns an object whose keys are error
468
+ * builders. Each builder produces a {@link StructuredError} carrying the
469
+ * entry's message, status, code, why, fix, and link.
470
+ */
414
471
  function defineErrorCatalog(namespace, entries) {
415
- const catalog = {};
416
- for (const [key, entry] of Object.entries(entries)) {
417
- const code = entry.code ?? `${namespace}.${key}`;
418
- const usesParams = typeof entry.message === "function" || typeof entry.why === "function";
419
- const builder = ((paramsOrOptions, maybeOptions) => {
420
- const params = usesParams ? paramsOrOptions : void 0;
421
- const options = usesParams ? maybeOptions : paramsOrOptions;
422
- const message = typeof entry.message === "function" ? entry.message(params) : entry.message;
423
- const why = typeof entry.why === "function" ? entry.why(params) : entry.why;
424
- const error = createStructuredError({
425
- message,
426
- name: entry.name ?? key,
427
- code,
428
- ...entry.status === void 0 ? {} : { status: entry.status },
429
- ...why === void 0 ? {} : { why },
430
- ...entry.fix === void 0 ? {} : { fix: entry.fix },
431
- ...entry.link === void 0 ? {} : { link: entry.link },
432
- ...options?.cause === void 0 ? {} : { cause: options.cause },
433
- ...options?.details === void 0 ? {} : { details: options.details },
434
- ...options?.internal === void 0 ? {} : { internal: options.internal }
435
- });
436
- Object.defineProperty(error, catalogCodeKey, {
437
- value: code,
438
- enumerable: false,
439
- writable: false,
440
- configurable: true
441
- });
442
- return error;
443
- });
444
- Object.defineProperty(builder, "code", {
445
- value: code,
446
- enumerable: true
447
- });
448
- Object.defineProperty(builder, "match", {
449
- value: (error) => readCatalogCode(error) === code,
450
- enumerable: false
451
- });
452
- catalog[key] = builder;
453
- }
454
- return Object.freeze(catalog);
455
- }
472
+ const catalog = {};
473
+ for (const [key, entry] of Object.entries(entries)) {
474
+ const code = entry.code ?? `${namespace}.${key}`;
475
+ const usesParams = typeof entry.message === "function" || typeof entry.why === "function";
476
+ const builder = ((paramsOrOptions, maybeOptions) => {
477
+ const params = usesParams ? paramsOrOptions : void 0;
478
+ const options = usesParams ? maybeOptions : paramsOrOptions;
479
+ const message = typeof entry.message === "function" ? entry.message(params) : entry.message;
480
+ const why = typeof entry.why === "function" ? entry.why(params) : entry.why;
481
+ const error = createStructuredError({
482
+ message,
483
+ name: entry.name ?? key,
484
+ code,
485
+ ...entry.status === void 0 ? {} : { status: entry.status },
486
+ ...why === void 0 ? {} : { why },
487
+ ...entry.fix === void 0 ? {} : { fix: entry.fix },
488
+ ...entry.link === void 0 ? {} : { link: entry.link },
489
+ ...options?.cause === void 0 ? {} : { cause: options.cause },
490
+ ...options?.details === void 0 ? {} : { details: options.details },
491
+ ...options?.internal === void 0 ? {} : { internal: options.internal }
492
+ });
493
+ Object.defineProperty(error, catalogCodeKey, {
494
+ value: code,
495
+ enumerable: false,
496
+ writable: false,
497
+ configurable: true
498
+ });
499
+ return error;
500
+ });
501
+ Object.defineProperty(builder, "code", {
502
+ value: code,
503
+ enumerable: true
504
+ });
505
+ Object.defineProperty(builder, "match", {
506
+ value: (error) => readCatalogCode(error) === code,
507
+ enumerable: false
508
+ });
509
+ catalog[key] = builder;
510
+ }
511
+ return Object.freeze(catalog);
512
+ }
513
+ /**
514
+ * Define a typed audit catalog. Returns typed action descriptors you can pass
515
+ * to `track()` or audit helpers without scattering magic strings.
516
+ */
456
517
  function defineAuditCatalog(namespace, entries) {
457
- const catalog = {};
458
- for (const [key, entry] of Object.entries(entries)) {
459
- const action = entry.action ?? `${namespace}.${key}`;
460
- const severity = entry.severity ?? "info";
461
- const descriptor = ((params) => {
462
- const message = typeof entry.message === "function" ? entry.message(params) : entry.message;
463
- return Object.freeze({
464
- action,
465
- severity,
466
- ...message === void 0 ? {} : { message }
467
- });
468
- });
469
- Object.defineProperty(descriptor, "action", {
470
- value: action,
471
- enumerable: true
472
- });
473
- Object.defineProperty(descriptor, "severity", {
474
- value: severity,
475
- enumerable: true
476
- });
477
- catalog[key] = descriptor;
478
- }
479
- return Object.freeze(catalog);
518
+ const catalog = {};
519
+ for (const [key, entry] of Object.entries(entries)) {
520
+ const action = entry.action ?? `${namespace}.${key}`;
521
+ const severity = entry.severity ?? "info";
522
+ const descriptor = ((params) => {
523
+ const message = typeof entry.message === "function" ? entry.message(params) : entry.message;
524
+ return Object.freeze({
525
+ action,
526
+ severity,
527
+ ...message === void 0 ? {} : { message }
528
+ });
529
+ });
530
+ Object.defineProperty(descriptor, "action", {
531
+ value: action,
532
+ enumerable: true
533
+ });
534
+ Object.defineProperty(descriptor, "severity", {
535
+ value: severity,
536
+ enumerable: true
537
+ });
538
+ catalog[key] = descriptor;
539
+ }
540
+ return Object.freeze(catalog);
480
541
  }
481
542
 
482
- // src/drain-toolkit.ts
483
- var DEFAULT_TIMEOUT_MS = 5e3;
484
- var DEFAULT_RETRIES = 2;
543
+ //#endregion
544
+ //#region src/drain-toolkit.ts
545
+ const DEFAULT_TIMEOUT_MS = 5e3;
546
+ const DEFAULT_RETRIES = 2;
485
547
  function delay(ms) {
486
- return new Promise((resolve) => {
487
- const t = setTimeout(resolve, ms);
488
- t.unref?.();
489
- });
548
+ return new Promise((resolve) => {
549
+ setTimeout(resolve, ms).unref?.();
550
+ });
490
551
  }
491
552
  async function postWithRetry(options) {
492
- const { name, request: request2, timeoutMs, retries } = options;
493
- const attempts = Math.max(1, retries);
494
- let lastError;
495
- for (let attempt = 1; attempt <= attempts; attempt++) {
496
- const controller = new AbortController();
497
- const timeout = setTimeout(() => controller.abort(), timeoutMs);
498
- timeout.unref?.();
499
- try {
500
- const response = await fetch(request2.url, {
501
- method: "POST",
502
- headers: request2.headers,
503
- body: request2.body,
504
- signal: controller.signal
505
- });
506
- if (!response.ok) {
507
- throw new Error(
508
- `[autotel/${name}] HTTP ${response.status} draining ${request2.url}`
509
- );
510
- }
511
- return;
512
- } catch (error) {
513
- lastError = error;
514
- if (attempt < attempts) {
515
- await delay(100 * attempt);
516
- }
517
- } finally {
518
- clearTimeout(timeout);
519
- }
520
- }
521
- throw lastError;
553
+ const { name, request, timeoutMs, retries } = options;
554
+ const attempts = Math.max(1, retries);
555
+ let lastError;
556
+ for (let attempt = 1; attempt <= attempts; attempt++) {
557
+ const controller = new AbortController();
558
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
559
+ timeout.unref?.();
560
+ try {
561
+ const response = await fetch(request.url, {
562
+ method: "POST",
563
+ headers: request.headers,
564
+ body: request.body,
565
+ signal: controller.signal
566
+ });
567
+ if (!response.ok) throw new Error(`[autotel/${name}] HTTP ${response.status} draining ${request.url}`);
568
+ return;
569
+ } catch (error) {
570
+ lastError = error;
571
+ if (attempt < attempts) await delay(100 * attempt);
572
+ } finally {
573
+ clearTimeout(timeout);
574
+ }
575
+ }
576
+ throw lastError;
522
577
  }
523
578
  function defineDrain(options) {
524
- return async (ctx2) => {
525
- const contexts = Array.isArray(ctx2) ? ctx2 : [ctx2];
526
- if (contexts.length === 0) return;
527
- const config = await options.resolve();
528
- if (!config) return;
529
- const payloads = options.transform ? options.transform(contexts) : contexts;
530
- if (payloads.length === 0) return;
531
- try {
532
- await options.send(payloads, config);
533
- } catch (error) {
534
- console.error(`[autotel/${options.name}] drain failed:`, error);
535
- }
536
- };
579
+ return async (ctx) => {
580
+ const contexts = Array.isArray(ctx) ? ctx : [ctx];
581
+ if (contexts.length === 0) return;
582
+ const config = await options.resolve();
583
+ if (!config) return;
584
+ const payloads = options.transform ? options.transform(contexts) : contexts;
585
+ if (payloads.length === 0) return;
586
+ try {
587
+ await options.send(payloads, config);
588
+ } catch (error) {
589
+ console.error(`[autotel/${options.name}] drain failed:`, error);
590
+ }
591
+ };
537
592
  }
538
593
  function defineHttpDrain(options) {
539
- return defineDrain({
540
- name: options.name,
541
- resolve: options.resolve,
542
- transform: options.transform,
543
- send: async (payloads, config) => {
544
- const request2 = options.encode(payloads, config);
545
- if (!request2) return;
546
- const timeoutMs = options.resolveTimeoutMs?.(config) ?? options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
547
- const retries = options.resolveRetries?.(config) ?? options.retries ?? DEFAULT_RETRIES;
548
- await postWithRetry({
549
- name: options.name,
550
- request: request2,
551
- timeoutMs,
552
- retries
553
- });
554
- }
555
- });
594
+ return defineDrain({
595
+ name: options.name,
596
+ resolve: options.resolve,
597
+ transform: options.transform,
598
+ send: async (payloads, config) => {
599
+ const request = options.encode(payloads, config);
600
+ if (!request) return;
601
+ const timeoutMs = options.resolveTimeoutMs?.(config) ?? options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
602
+ const retries = options.resolveRetries?.(config) ?? options.retries ?? DEFAULT_RETRIES;
603
+ await postWithRetry({
604
+ name: options.name,
605
+ request,
606
+ timeoutMs,
607
+ retries
608
+ });
609
+ }
610
+ });
556
611
  }
557
612
 
558
- // src/enricher-toolkit.ts
613
+ //#endregion
614
+ //#region src/enricher-toolkit.ts
559
615
  function isPlainObject(value) {
560
- return value !== null && typeof value === "object" && !Array.isArray(value);
561
- }
562
- function mergeInto2(target, source) {
563
- for (const key in source) {
564
- const sourceVal = source[key];
565
- if (sourceVal === void 0) continue;
566
- const targetVal = target[key];
567
- if (isPlainObject(sourceVal) && isPlainObject(targetVal)) {
568
- mergeInto2(targetVal, sourceVal);
569
- } else {
570
- target[key] = sourceVal;
571
- }
572
- }
616
+ return value !== null && typeof value === "object" && !Array.isArray(value);
617
+ }
618
+ function mergeInto(target, source) {
619
+ for (const key in source) {
620
+ const sourceVal = source[key];
621
+ if (sourceVal === void 0) continue;
622
+ const targetVal = target[key];
623
+ if (isPlainObject(sourceVal) && isPlainObject(targetVal)) mergeInto(targetVal, sourceVal);
624
+ else target[key] = sourceVal;
625
+ }
573
626
  }
574
627
  function defineEnricher(def, options = {}) {
575
- return (ctx2) => {
576
- let computed;
577
- try {
578
- computed = def.compute(ctx2);
579
- } catch (error) {
580
- console.error(`[autotel/${def.name}] enrich failed:`, error);
581
- return;
582
- }
583
- if (!computed) return;
584
- if (options.overwrite || !isPlainObject(ctx2.event[def.field])) {
585
- ctx2.event[def.field] = computed;
586
- return;
587
- }
588
- mergeInto2(
589
- ctx2.event[def.field],
590
- computed
591
- );
592
- };
593
- }
594
- var GEN_AI_DURATION_BUCKETS_SECONDS = Object.freeze(
595
- [0.01, 0.05, 0.1, 0.25, 0.5, 1, 2, 5, 10, 20, 30, 60, 120, 300]
596
- );
597
- var GEN_AI_TOKEN_USAGE_BUCKETS = Object.freeze([
598
- 1,
599
- 4,
600
- 16,
601
- 64,
602
- 256,
603
- 1024,
604
- 4096,
605
- 16384,
606
- 65536,
607
- 262144,
608
- 1048576,
609
- 4194304
628
+ return (ctx) => {
629
+ let computed;
630
+ try {
631
+ computed = def.compute(ctx);
632
+ } catch (error) {
633
+ console.error(`[autotel/${def.name}] enrich failed:`, error);
634
+ return;
635
+ }
636
+ if (!computed) return;
637
+ if (options.overwrite || !isPlainObject(ctx.event[def.field])) {
638
+ ctx.event[def.field] = computed;
639
+ return;
640
+ }
641
+ mergeInto(ctx.event[def.field], computed);
642
+ };
643
+ }
644
+
645
+ //#endregion
646
+ //#region src/gen-ai-metrics.ts
647
+ /**
648
+ * LLM-tuned histogram buckets.
649
+ *
650
+ * Default OpenTelemetry histogram buckets target HTTP latency (0ms–10s)
651
+ * and small counter values. LLM workloads have very different shapes:
652
+ *
653
+ * - **Duration**: single-token prompts can be fast (50ms), long
654
+ * generations and reasoning models can run for minutes. Default buckets
655
+ * crush everything above 10s into one bucket.
656
+ * - **Token usage**: heavily right-skewed. A single request can range
657
+ * from tens of tokens to the million-token context windows.
658
+ * - **Cost (USD)**: per-request values are tiny (fractions of a cent),
659
+ * so linear buckets waste resolution at the low end.
660
+ *
661
+ * This module exposes empirically-chosen bucket arrays and a View helper
662
+ * so users can apply them to their `MeterProvider` without knowing the
663
+ * exact instrument names emitted by OpenAI/Anthropic/Traceloop plugins.
664
+ *
665
+ * @example
666
+ * ```typescript
667
+ * import { NodeSDK } from '@opentelemetry/sdk-node';
668
+ * import { genAiMetricViews } from 'autotel';
669
+ *
670
+ * const sdk = new NodeSDK({
671
+ * serviceName: 'my-agent',
672
+ * views: [...genAiMetricViews()],
673
+ * });
674
+ * sdk.start();
675
+ * ```
676
+ */
677
+ /**
678
+ * Duration buckets for LLM operations, in **seconds**. Covers fast
679
+ * completions (50ms) through long-running reasoning jobs (5 min).
680
+ *
681
+ * Aligns with the OTel GenAI semantic conventions' published advice for
682
+ * `gen_ai.client.operation.duration`.
683
+ */
684
+ const GEN_AI_DURATION_BUCKETS_SECONDS = Object.freeze([
685
+ .01,
686
+ .05,
687
+ .1,
688
+ .25,
689
+ .5,
690
+ 1,
691
+ 2,
692
+ 5,
693
+ 10,
694
+ 20,
695
+ 30,
696
+ 60,
697
+ 120,
698
+ 300
699
+ ]);
700
+ /**
701
+ * Token-count buckets for prompt, completion, and total token histograms.
702
+ * Ranges from tiny prompts to million-token context windows.
703
+ *
704
+ * Aligns with the OTel GenAI semantic conventions' published advice for
705
+ * `gen_ai.client.token.usage`.
706
+ */
707
+ const GEN_AI_TOKEN_USAGE_BUCKETS = Object.freeze([
708
+ 1,
709
+ 4,
710
+ 16,
711
+ 64,
712
+ 256,
713
+ 1024,
714
+ 4096,
715
+ 16384,
716
+ 65536,
717
+ 262144,
718
+ 1048576,
719
+ 4194304
610
720
  ]);
611
- var GEN_AI_COST_USD_BUCKETS = Object.freeze([
612
- 1e-5,
613
- 1e-4,
614
- 1e-3,
615
- 5e-3,
616
- 0.01,
617
- 0.05,
618
- 0.1,
619
- 0.5,
620
- 1,
621
- 5,
622
- 10,
623
- 50
721
+ /**
722
+ * USD cost buckets. Sub-cent resolution at the low end (fractions of a
723
+ * cent per small call) up to tens of dollars (batch jobs, Opus/o1 runs).
724
+ */
725
+ const GEN_AI_COST_USD_BUCKETS = Object.freeze([
726
+ 1e-5,
727
+ 1e-4,
728
+ .001,
729
+ .005,
730
+ .01,
731
+ .05,
732
+ .1,
733
+ .5,
734
+ 1,
735
+ 5,
736
+ 10,
737
+ 50
624
738
  ]);
739
+ /**
740
+ * Instrument-level advice object for `createHistogram(name, advice)`.
741
+ * Use when you control the instrument creation (e.g. custom business
742
+ * LLM metrics); `genAiMetricViews()` is better when the metric comes
743
+ * from a third-party plugin.
744
+ */
625
745
  function llmHistogramAdvice(kind) {
626
- const boundaries = kind === "duration" ? GEN_AI_DURATION_BUCKETS_SECONDS : kind === "tokens" ? GEN_AI_TOKEN_USAGE_BUCKETS : GEN_AI_COST_USD_BUCKETS;
627
- return { advice: { explicitBucketBoundaries: [...boundaries] } };
628
- }
746
+ return { advice: { explicitBucketBoundaries: [...kind === "duration" ? GEN_AI_DURATION_BUCKETS_SECONDS : kind === "tokens" ? GEN_AI_TOKEN_USAGE_BUCKETS : GEN_AI_COST_USD_BUCKETS] } };
747
+ }
748
+ /**
749
+ * Returns `View`s that re-bucket the standard OTel GenAI histograms. Pass
750
+ * the result to your `MeterProvider`'s `views` option.
751
+ *
752
+ * Matches instrument names emitted by:
753
+ * - OpenTelemetry GenAI autoinstrumentation
754
+ * - OpenInference / OpenLLMetry (traceloop)
755
+ * - Arize Phoenix, LangSmith, etc. that follow the OTel spec
756
+ *
757
+ * Add more instrument patterns via the `extra` argument if you emit
758
+ * custom LLM metrics.
759
+ */
629
760
  function genAiMetricViews(extra = []) {
630
- const defaults = [
631
- { instrumentName: "gen_ai.client.operation.duration", kind: "duration" },
632
- { instrumentName: "gen_ai.client.token.usage", kind: "tokens" },
633
- // Autotel-emitted cost metric. No-op if you don't emit it.
634
- { instrumentName: "gen_ai.client.cost.usd", kind: "cost" }
635
- ];
636
- return [...defaults, ...extra].map(
637
- ({ instrumentName, kind }) => ({
638
- instrumentName,
639
- aggregation: {
640
- type: AggregationType.EXPLICIT_BUCKET_HISTOGRAM,
641
- options: {
642
- boundaries: kind === "duration" ? [...GEN_AI_DURATION_BUCKETS_SECONDS] : kind === "tokens" ? [...GEN_AI_TOKEN_USAGE_BUCKETS] : [...GEN_AI_COST_USD_BUCKETS]
643
- }
644
- }
645
- })
646
- );
761
+ return [...[
762
+ {
763
+ instrumentName: "gen_ai.client.operation.duration",
764
+ kind: "duration"
765
+ },
766
+ {
767
+ instrumentName: "gen_ai.client.token.usage",
768
+ kind: "tokens"
769
+ },
770
+ {
771
+ instrumentName: "gen_ai.client.cost.usd",
772
+ kind: "cost"
773
+ }
774
+ ], ...extra].map(({ instrumentName, kind }) => ({
775
+ instrumentName,
776
+ aggregation: {
777
+ type: AggregationType.EXPLICIT_BUCKET_HISTOGRAM,
778
+ options: { boundaries: kind === "duration" ? [...GEN_AI_DURATION_BUCKETS_SECONDS] : kind === "tokens" ? [...GEN_AI_TOKEN_USAGE_BUCKETS] : [...GEN_AI_COST_USD_BUCKETS] }
779
+ }
780
+ }));
647
781
  }
648
782
 
649
- // src/gen-ai-events.ts
650
- function recordPromptSent(ctx2, event = {}) {
651
- emitCorrelatedEvent(ctx2, "gen_ai.prompt.sent", buildPromptSentAttrs(event));
652
- }
653
- function recordResponseReceived(ctx2, event = {}) {
654
- emitCorrelatedEvent(
655
- ctx2,
656
- "gen_ai.response.received",
657
- buildResponseAttrs(event)
658
- );
659
- }
660
- function recordRetry(ctx2, event) {
661
- emitCorrelatedEvent(ctx2, "gen_ai.retry", buildRetryAttrs(event));
662
- }
663
- function recordToolCall(ctx2, event) {
664
- emitCorrelatedEvent(ctx2, "gen_ai.tool.call", buildToolCallAttrs(event));
665
- }
666
- function recordStreamFirstToken(ctx2, event = {}) {
667
- emitCorrelatedEvent(
668
- ctx2,
669
- "gen_ai.stream.first_token",
670
- buildStreamFirstTokenAttrs(event)
671
- );
783
+ //#endregion
784
+ //#region src/gen-ai-events.ts
785
+ /**
786
+ * Record that a prompt was dispatched to the provider. Typically called
787
+ * before `await provider.chat.completions.create(...)`.
788
+ */
789
+ function recordPromptSent(ctx, event = {}) {
790
+ emitCorrelatedEvent(ctx, "gen_ai.prompt.sent", buildPromptSentAttrs(event));
791
+ }
792
+ /**
793
+ * Record a successful provider response. Call after the response arrives
794
+ * (for non-streaming) or after the stream completes.
795
+ */
796
+ function recordResponseReceived(ctx, event = {}) {
797
+ emitCorrelatedEvent(ctx, "gen_ai.response.received", buildResponseAttrs(event));
798
+ }
799
+ /**
800
+ * Record a retry attempt on an LLM call. Call *before* sleeping for
801
+ * `delayMs` so the event timestamp accurately marks when the retry
802
+ * decision was made.
803
+ */
804
+ function recordRetry(ctx, event) {
805
+ emitCorrelatedEvent(ctx, "gen_ai.retry", buildRetryAttrs(event));
806
+ }
807
+ /**
808
+ * Record a tool / function call made in the course of an agent step.
809
+ * Emits an event rather than a child span because many frameworks fire
810
+ * several tool calls within a single provider response.
811
+ */
812
+ function recordToolCall(ctx, event) {
813
+ emitCorrelatedEvent(ctx, "gen_ai.tool.call", buildToolCallAttrs(event));
814
+ }
815
+ /**
816
+ * Record the time-to-first-token for a streaming response. Pair with
817
+ * `recordResponseReceived` at the end so the span carries both the TTFT
818
+ * marker and the final usage numbers.
819
+ */
820
+ function recordStreamFirstToken(ctx, event = {}) {
821
+ emitCorrelatedEvent(ctx, "gen_ai.stream.first_token", buildStreamFirstTokenAttrs(event));
672
822
  }
673
823
  function buildPromptSentAttrs(event) {
674
- const attrs2 = {};
675
- if (event.model) attrs2["gen_ai.request.model"] = event.model;
676
- if (event.promptTokens !== void 0)
677
- attrs2["gen_ai.usage.input_tokens"] = event.promptTokens;
678
- if (event.messageCount !== void 0)
679
- attrs2["gen_ai.request.message_count"] = event.messageCount;
680
- if (event.operation) attrs2["gen_ai.operation.name"] = event.operation;
681
- return attrs2;
824
+ const attrs = {};
825
+ if (event.model) attrs["gen_ai.request.model"] = event.model;
826
+ if (event.promptTokens !== void 0) attrs["gen_ai.usage.input_tokens"] = event.promptTokens;
827
+ if (event.messageCount !== void 0) attrs["gen_ai.request.message_count"] = event.messageCount;
828
+ if (event.operation) attrs["gen_ai.operation.name"] = event.operation;
829
+ return attrs;
682
830
  }
683
831
  function buildResponseAttrs(event) {
684
- const attrs2 = {};
685
- if (event.model) attrs2["gen_ai.response.model"] = event.model;
686
- if (event.promptTokens !== void 0)
687
- attrs2["gen_ai.usage.input_tokens"] = event.promptTokens;
688
- if (event.completionTokens !== void 0)
689
- attrs2["gen_ai.usage.output_tokens"] = event.completionTokens;
690
- if (event.totalTokens !== void 0)
691
- attrs2["gen_ai.usage.total_tokens"] = event.totalTokens;
692
- if (event.finishReasons && event.finishReasons.length > 0) {
693
- attrs2["gen_ai.response.finish_reasons"] = event.finishReasons.join(",");
694
- }
695
- return attrs2;
832
+ const attrs = {};
833
+ if (event.model) attrs["gen_ai.response.model"] = event.model;
834
+ if (event.promptTokens !== void 0) attrs["gen_ai.usage.input_tokens"] = event.promptTokens;
835
+ if (event.completionTokens !== void 0) attrs["gen_ai.usage.output_tokens"] = event.completionTokens;
836
+ if (event.totalTokens !== void 0) attrs["gen_ai.usage.total_tokens"] = event.totalTokens;
837
+ if (event.finishReasons && event.finishReasons.length > 0) attrs["gen_ai.response.finish_reasons"] = event.finishReasons.join(",");
838
+ return attrs;
696
839
  }
697
840
  function buildRetryAttrs(event) {
698
- const attrs2 = { "retry.attempt": event.attempt };
699
- if (event.reason) attrs2["retry.reason"] = event.reason;
700
- if (event.delayMs !== void 0) attrs2["retry.delay_ms"] = event.delayMs;
701
- if (event.statusCode !== void 0)
702
- attrs2["http.response.status_code"] = event.statusCode;
703
- return attrs2;
841
+ const attrs = { "retry.attempt": event.attempt };
842
+ if (event.reason) attrs["retry.reason"] = event.reason;
843
+ if (event.delayMs !== void 0) attrs["retry.delay_ms"] = event.delayMs;
844
+ if (event.statusCode !== void 0) attrs["http.response.status_code"] = event.statusCode;
845
+ return attrs;
704
846
  }
705
847
  function buildToolCallAttrs(event) {
706
- const attrs2 = { "gen_ai.tool.name": event.toolName };
707
- if (event.toolCallId) attrs2["gen_ai.tool.call.id"] = event.toolCallId;
708
- if (event.arguments) attrs2["gen_ai.tool.arguments"] = event.arguments;
709
- return attrs2;
848
+ const attrs = { "gen_ai.tool.name": event.toolName };
849
+ if (event.toolCallId) attrs["gen_ai.tool.call.id"] = event.toolCallId;
850
+ if (event.arguments) attrs["gen_ai.tool.arguments"] = event.arguments;
851
+ return attrs;
710
852
  }
711
853
  function buildStreamFirstTokenAttrs(event) {
712
- const attrs2 = {};
713
- if (event.tokensSoFar !== void 0)
714
- attrs2["gen_ai.stream.tokens_so_far"] = event.tokensSoFar;
715
- return attrs2;
854
+ const attrs = {};
855
+ if (event.tokensSoFar !== void 0) attrs["gen_ai.stream.tokens_so_far"] = event.tokensSoFar;
856
+ return attrs;
716
857
  }
717
858
 
718
- // src/gen-ai-cost.ts
719
- var GEN_AI_COST_ATTRIBUTE = "gen_ai.usage.cost.usd";
720
- var MODEL_PRICING = {
721
- // OpenAI
722
- "gpt-4o": { inputPer1M: 2.5, outputPer1M: 10 },
723
- "gpt-4o-mini": { inputPer1M: 0.15, outputPer1M: 0.6 },
724
- "gpt-4.1": { inputPer1M: 2, outputPer1M: 8 },
725
- "gpt-4.1-mini": { inputPer1M: 0.4, outputPer1M: 1.6 },
726
- "gpt-4.1-nano": { inputPer1M: 0.1, outputPer1M: 0.4 },
727
- "o3-mini": { inputPer1M: 1.1, outputPer1M: 4.4 },
728
- // Anthropic Claude
729
- "claude-opus-4": { inputPer1M: 15, outputPer1M: 75 },
730
- "claude-sonnet-4": { inputPer1M: 3, outputPer1M: 15 },
731
- "claude-3-5-sonnet": { inputPer1M: 3, outputPer1M: 15 },
732
- "claude-3-5-haiku": { inputPer1M: 0.8, outputPer1M: 4 },
733
- "claude-3-opus": { inputPer1M: 15, outputPer1M: 75 },
734
- "claude-3-haiku": { inputPer1M: 0.25, outputPer1M: 1.25 },
735
- // Google Gemini
736
- "gemini-1.5-pro": { inputPer1M: 1.25, outputPer1M: 5 },
737
- "gemini-1.5-flash": { inputPer1M: 0.075, outputPer1M: 0.3 },
738
- "gemini-2.0-flash": { inputPer1M: 0.1, outputPer1M: 0.4 }
859
+ //#endregion
860
+ //#region src/gen-ai-cost.ts
861
+ /** Span attribute key autotel sets for an estimated call cost. */
862
+ const GEN_AI_COST_ATTRIBUTE = "gen_ai.usage.cost.usd";
863
+ /**
864
+ * Approximate public list prices (USD per 1M tokens) at the time of writing.
865
+ * Prices change; treat these as convenience defaults, not a billing source of
866
+ * truth. Override per call via `options.pricing` or mutate this table at init.
867
+ * Matching is exact first, then by longest key prefix, so versioned model ids
868
+ * (`claude-sonnet-4-6-20251101`) resolve to a base entry (`claude-sonnet-4-6`).
869
+ */
870
+ const MODEL_PRICING = {
871
+ "gpt-4o": {
872
+ inputPer1M: 2.5,
873
+ outputPer1M: 10
874
+ },
875
+ "gpt-4o-mini": {
876
+ inputPer1M: .15,
877
+ outputPer1M: .6
878
+ },
879
+ "gpt-4.1": {
880
+ inputPer1M: 2,
881
+ outputPer1M: 8
882
+ },
883
+ "gpt-4.1-mini": {
884
+ inputPer1M: .4,
885
+ outputPer1M: 1.6
886
+ },
887
+ "gpt-4.1-nano": {
888
+ inputPer1M: .1,
889
+ outputPer1M: .4
890
+ },
891
+ "o3-mini": {
892
+ inputPer1M: 1.1,
893
+ outputPer1M: 4.4
894
+ },
895
+ "claude-opus-4": {
896
+ inputPer1M: 15,
897
+ outputPer1M: 75
898
+ },
899
+ "claude-sonnet-4": {
900
+ inputPer1M: 3,
901
+ outputPer1M: 15
902
+ },
903
+ "claude-3-5-sonnet": {
904
+ inputPer1M: 3,
905
+ outputPer1M: 15
906
+ },
907
+ "claude-3-5-haiku": {
908
+ inputPer1M: .8,
909
+ outputPer1M: 4
910
+ },
911
+ "claude-3-opus": {
912
+ inputPer1M: 15,
913
+ outputPer1M: 75
914
+ },
915
+ "claude-3-haiku": {
916
+ inputPer1M: .25,
917
+ outputPer1M: 1.25
918
+ },
919
+ "gemini-1.5-pro": {
920
+ inputPer1M: 1.25,
921
+ outputPer1M: 5
922
+ },
923
+ "gemini-1.5-flash": {
924
+ inputPer1M: .075,
925
+ outputPer1M: .3
926
+ },
927
+ "gemini-2.0-flash": {
928
+ inputPer1M: .1,
929
+ outputPer1M: .4
930
+ }
739
931
  };
740
932
  function resolvePricing(table, model) {
741
- const exact = table[model];
742
- if (exact) return exact;
743
- let best;
744
- let bestLength = 0;
745
- for (const key of Object.keys(table)) {
746
- if (model.startsWith(key) && key.length > bestLength) {
747
- best = table[key];
748
- bestLength = key.length;
749
- }
750
- }
751
- return best;
933
+ const exact = table[model];
934
+ if (exact) return exact;
935
+ let best;
936
+ let bestLength = 0;
937
+ for (const key of Object.keys(table)) if (model.startsWith(key) && key.length > bestLength) {
938
+ best = table[key];
939
+ bestLength = key.length;
940
+ }
941
+ return best;
752
942
  }
753
943
  function round(value) {
754
- return Math.round(value * 1e6) / 1e6;
944
+ return Math.round(value * 1e6) / 1e6;
755
945
  }
946
+ /**
947
+ * Estimate the USD cost of an LLM call. Returns `undefined` when the model has
948
+ * no known pricing (supply one via `options.pricing`).
949
+ */
756
950
  function estimateLLMCost(model, usage, options) {
757
- const table = options?.pricing ? { ...MODEL_PRICING, ...options.pricing } : MODEL_PRICING;
758
- const price = resolvePricing(table, model);
759
- if (!price) return void 0;
760
- const cachedInput = usage.cachedInputTokens ?? 0;
761
- const billedInput = Math.max(0, (usage.inputTokens ?? 0) - cachedInput);
762
- const output = usage.outputTokens ?? 0;
763
- const cachedRate = price.cachedInputPer1M ?? price.inputPer1M;
764
- const cost = billedInput / 1e6 * price.inputPer1M + cachedInput / 1e6 * cachedRate + output / 1e6 * price.outputPer1M;
765
- return round(cost);
766
- }
767
- function recordLLMCost(ctx2, model, usage, options) {
768
- const cost = estimateLLMCost(model, usage, options);
769
- if (cost !== void 0) {
770
- ctx2.setAttribute(GEN_AI_COST_ATTRIBUTE, cost);
771
- }
772
- return cost;
951
+ const price = resolvePricing(options?.pricing ? {
952
+ ...MODEL_PRICING,
953
+ ...options.pricing
954
+ } : MODEL_PRICING, model);
955
+ if (!price) return void 0;
956
+ const cachedInput = usage.cachedInputTokens ?? 0;
957
+ const billedInput = Math.max(0, (usage.inputTokens ?? 0) - cachedInput);
958
+ const output = usage.outputTokens ?? 0;
959
+ const cachedRate = price.cachedInputPer1M ?? price.inputPer1M;
960
+ return round(billedInput / 1e6 * price.inputPer1M + cachedInput / 1e6 * cachedRate + output / 1e6 * price.outputPer1M);
961
+ }
962
+ /**
963
+ * Estimate cost and record it on `ctx` as the `gen_ai.usage.cost.usd` span
964
+ * attribute. Returns the estimated cost, or `undefined` when the model is
965
+ * unknown (in which case no attribute is set).
966
+ */
967
+ function recordLLMCost(ctx, model, usage, options) {
968
+ const cost = estimateLLMCost(model, usage, options);
969
+ if (cost !== void 0) ctx.setAttribute(GEN_AI_COST_ATTRIBUTE, cost);
970
+ return cost;
773
971
  }
774
972
 
775
- export { GEN_AI_COST_ATTRIBUTE, GEN_AI_COST_USD_BUCKETS, GEN_AI_DURATION_BUCKETS_SECONDS, GEN_AI_TOKEN_USAGE_BUCKETS, MODEL_PRICING, defineAuditCatalog, defineDrain, defineEnricher, defineErrorCatalog, defineEvent, defineHttpDrain, estimateLLMCost, flush, genAiMetricViews, getCatalogCode, getRequestLogger, isCatalogError, llmHistogramAdvice, recordLLMCost, recordPromptSent, recordResponseReceived, recordRetry, recordStreamFirstToken, recordToolCall, runWithRequestContext, shutdown, trace2 as trace };
776
- //# sourceMappingURL=index.js.map
973
+ //#endregion
974
+ export { AUTOTEL_SAMPLING_TAIL_EVALUATED, AUTOTEL_SAMPLING_TAIL_KEEP, AdaptiveSampler, AlwaysSampler, AttributeRedactingProcessor, BaggageSpanProcessor, BusinessBaggage, CORRELATION_ID_BAGGAGE_KEY, Event, FilteringSpanProcessor, GEN_AI_COST_ATTRIBUTE, GEN_AI_COST_USD_BUCKETS, GEN_AI_DURATION_BUCKETS_SECONDS, GEN_AI_TOKEN_USAGE_BUCKETS, HTTPAttributes, MODEL_PRICING, Metric, NORMALIZER_PATTERNS, NORMALIZER_PRESETS, NeverSampler, REDACTOR_PATTERNS, REDACTOR_PRESETS, ROOT_CONTEXT, RandomSampler, ServiceAttributes, SpanKind, SpanNameNormalizingProcessor, SpanStatusCode, URLAttributes, UserIdSampler, attrs, autoRedactPII, builtinPatterns, context, createAttributeRedactor, createCounter, createDeterministicTraceId, createDrainPipeline, createHistogram, createLinkFromHeaders, createNoopRequestLogger, createObservableGauge, createRedactedSpan, createSafeBaggageSchema, createStringRedactor, createStructuredError, createUpDownCounter, ctx, dbClient, defineAuditCatalog, defineBaggageSchema, defineDrain, defineEnricher, defineErrorCatalog, defineEvent, defineHttpDrain, enrichWithTraceContext, estimateLLMCost, extractLinksFromBatch, finalizeSpan, flattenMetadata, flattenToAttributes, flush, formatDuration, genAiMetricViews, generateCorrelationId, getActiveContext, getActiveSpan, getAutotelTracer, getAutotelTracerProvider, getCatalogCode, getCorrelationId, getCurrentWorkflowContext, getEventQueue, getEvents, getMeter, getMetrics, getOperationContext, getOrCreateCorrelationId, getRequestLogger, getRequestLoggerSafe, getStructuredErrorAttributes, getTraceContext, getTracer, hasRequestContext, httpClient, httpRequestHeaderAttribute, httpResponseHeaderAttribute, httpServer, identify, init, instrument, isCatalogError, isInWorkflow, isInitialized, isLoggerLocked, isTracing, llmHistogramAdvice, lockLogger, markAsImmediate, mergeAttrs, mergeServiceResource, normalizeAttributeRedactorConfig, otelTrace, parseError, propagation, recordLLMCost, recordPromptSent, recordResponseReceived, recordRetry, recordStreamFirstToken, recordStructuredError, recordToolCall, request, resetEvents, resetMetrics, resolveSamplingPreset, resolveTraceUrl, runInOperationContext, runWithCorrelationId, runWithRequestContext, runWithSpan, safeSetAttributes, samplingPresets, setAutotelTracerProvider, setCorrelationId, setCorrelationIdInBaggage, setDevice, setError, setException, setSession, setUser, shutdown, span, structuredErrorToJSON, toAttributeValue, trace, traceConsumer, traceDB, traceHTTP, traceLLM, traceMessaging, traceProducer, traceStep, traceWorkflow, track, validateAttribute, withBaggage, withNewContext, withTracing };
777
975
  //# sourceMappingURL=index.js.map