autotel 6.1.0 → 6.2.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 (411) hide show
  1. package/dist/analysis.cjs +1 -2
  2. package/dist/analysis.d.cts +1 -2
  3. package/dist/analysis.d.ts +1 -2
  4. package/dist/analysis.js +1 -2
  5. package/dist/attribute-redacting-processor-Pk7lAzWd.d.cts +1 -2
  6. package/dist/attribute-redacting-processor-Pk7lAzWd.d.ts +1 -2
  7. package/dist/attribute-redacting-processor.cjs +1 -2
  8. package/dist/attribute-redacting-processor.js +1 -2
  9. package/dist/attributes-B7wix2VG.js +1 -2
  10. package/dist/attributes-aDmJYral.cjs +1 -2
  11. package/dist/auto.cjs +2 -3
  12. package/dist/auto.js +2 -3
  13. package/dist/business-baggage.cjs +1 -2
  14. package/dist/business-baggage.d.cts +1 -2
  15. package/dist/business-baggage.d.ts +1 -2
  16. package/dist/business-baggage.js +1 -2
  17. package/dist/canonical-log-line-processor-B4WgG-VS.d.cts +1 -2
  18. package/dist/canonical-log-line-processor-CL_J7gb5.d.ts +1 -2
  19. package/dist/canonical-log-line-processor-DOjb6Kxy.cjs +1 -2
  20. package/dist/canonical-log-line-processor-mKABvGP0.js +1 -2
  21. package/dist/config.cjs +1 -2
  22. package/dist/config.d.cts +1 -2
  23. package/dist/config.d.ts +1 -2
  24. package/dist/config.js +1 -2
  25. package/dist/correlated-events-Bzh5y-UB.js +1 -2
  26. package/dist/correlated-events-kSwLo3mi.cjs +1 -2
  27. package/dist/correlation-id.cjs +1 -1
  28. package/dist/correlation-id.d.cts +1 -2
  29. package/dist/correlation-id.d.ts +1 -2
  30. package/dist/correlation-id.js +1 -1
  31. package/dist/db.cjs +1 -2
  32. package/dist/db.d.cts +1 -2
  33. package/dist/db.d.ts +1 -2
  34. package/dist/db.js +1 -2
  35. package/dist/decorators.cjs +2 -3
  36. package/dist/decorators.d.cts +1 -2
  37. package/dist/decorators.d.ts +1 -2
  38. package/dist/decorators.js +2 -3
  39. package/dist/define-event-B2z1SBe7.d.ts +1 -2
  40. package/dist/define-event-CGG048HE.d.cts +1 -2
  41. package/dist/diagnostics.cjs +1 -2
  42. package/dist/diagnostics.d.cts +1 -2
  43. package/dist/diagnostics.d.ts +1 -2
  44. package/dist/diagnostics.js +1 -2
  45. package/dist/drain-pipeline.cjs +1 -2
  46. package/dist/drain-pipeline.d.cts +1 -2
  47. package/dist/drain-pipeline.d.ts +1 -2
  48. package/dist/drain-pipeline.js +1 -2
  49. package/dist/enrichers.cjs +1 -2
  50. package/dist/enrichers.d.cts +1 -2
  51. package/dist/enrichers.d.ts +1 -2
  52. package/dist/enrichers.js +1 -2
  53. package/dist/event-subscriber-CWh8sTGh.d.cts +1 -2
  54. package/dist/event-subscriber-CWh8sTGh.d.ts +1 -2
  55. package/dist/event-testing-CA2mIx1E.d.ts +1 -2
  56. package/dist/event-testing-D0qWfqAy.d.cts +1 -2
  57. package/dist/event-testing.cjs +1 -2
  58. package/dist/event-testing.js +1 -2
  59. package/dist/event.cjs +1 -1
  60. package/dist/event.d.cts +1 -2
  61. package/dist/event.d.ts +1 -2
  62. package/dist/event.js +1 -1
  63. package/dist/exporters.d.cts +1 -2
  64. package/dist/exporters.d.ts +1 -2
  65. package/dist/filtering-span-processor-BpDagWNa.d.cts +1 -2
  66. package/dist/filtering-span-processor-BpDagWNa.d.ts +1 -2
  67. package/dist/filtering-span-processor.cjs +1 -2
  68. package/dist/filtering-span-processor.js +1 -2
  69. package/dist/{functional-DcLBuCPz.cjs → functional-D545J0Ba.cjs} +2 -3
  70. package/dist/{functional-BnDUxnSl.js → functional-DYAZiYxr.js} +2 -3
  71. package/dist/functional.cjs +1 -1
  72. package/dist/functional.d.cts +1 -2
  73. package/dist/functional.d.ts +1 -2
  74. package/dist/functional.js +1 -1
  75. package/dist/http.cjs +2 -3
  76. package/dist/http.d.cts +1 -2
  77. package/dist/http.d.ts +1 -2
  78. package/dist/http.js +2 -3
  79. package/dist/index-BPcxVucm.d.cts +1 -2
  80. package/dist/index-DolOVX6F.d.ts +1 -2
  81. package/dist/index.cjs +3 -4
  82. package/dist/index.d.cts +2 -3
  83. package/dist/index.d.ts +2 -3
  84. package/dist/index.js +3 -4
  85. package/dist/{init-D6n2diBy.d.ts → init-BHp-kqLJ.d.ts} +12 -4
  86. package/dist/{init-XzXzrarP.d.cts → init-BoIYyB6Q.d.cts} +12 -4
  87. package/dist/{init-C3RApHKJ.cjs → init-CzNFWUd8.cjs} +38 -5
  88. package/dist/{init-R-gSEXkJ.js → init-DDkh2brw.js} +38 -5
  89. package/dist/instrumentation.cjs +2 -3
  90. package/dist/instrumentation.d.cts +1 -2
  91. package/dist/instrumentation.d.ts +1 -2
  92. package/dist/instrumentation.js +2 -3
  93. package/dist/logger-CN4xpzMd.d.cts +1 -2
  94. package/dist/logger-CN4xpzMd.d.ts +1 -2
  95. package/dist/logger-D3Ej3DII.js +1 -2
  96. package/dist/logger-thMPLpOG.cjs +1 -2
  97. package/dist/messaging-adapters.cjs +1 -2
  98. package/dist/messaging-adapters.d.cts +1 -2
  99. package/dist/messaging-adapters.d.ts +1 -2
  100. package/dist/messaging-adapters.js +1 -2
  101. package/dist/messaging-testing.cjs +1 -2
  102. package/dist/messaging-testing.d.cts +1 -2
  103. package/dist/messaging-testing.d.ts +1 -2
  104. package/dist/messaging-testing.js +1 -2
  105. package/dist/messaging.cjs +2 -3
  106. package/dist/messaging.d.cts +1 -2
  107. package/dist/messaging.d.ts +1 -2
  108. package/dist/messaging.js +2 -3
  109. package/dist/metric-helpers.cjs +1 -2
  110. package/dist/metric-helpers.d.cts +1 -2
  111. package/dist/metric-helpers.d.ts +1 -2
  112. package/dist/metric-helpers.js +1 -2
  113. package/dist/metric-testing-CWm6UhaR.d.ts +1 -2
  114. package/dist/metric-testing-CpvP3ZIa.d.cts +1 -2
  115. package/dist/metric-testing.cjs +1 -2
  116. package/dist/metric-testing.js +1 -2
  117. package/dist/metric.cjs +1 -2
  118. package/dist/metric.d.cts +1 -2
  119. package/dist/metric.d.ts +1 -2
  120. package/dist/metric.js +1 -2
  121. package/dist/node-require-PFqDihze.cjs +1 -2
  122. package/dist/node-require-vROmTeJ8.js +1 -2
  123. package/dist/parse-error.cjs +1 -2
  124. package/dist/parse-error.d.cts +1 -2
  125. package/dist/parse-error.d.ts +1 -2
  126. package/dist/parse-error.js +1 -2
  127. package/dist/pretty-console-exporter-CMzlrRNg.cjs +1 -2
  128. package/dist/pretty-console-exporter-DqKl_q9z.js +1 -2
  129. package/dist/register.cjs +1 -2
  130. package/dist/register.js +1 -2
  131. package/dist/registry-DVSmWg6Y.js +1 -2
  132. package/dist/registry-DYgvb62e.cjs +1 -2
  133. package/dist/sampling-BR9fkSwx.d.cts +1 -2
  134. package/dist/sampling-CP3e7-Yr.d.ts +1 -2
  135. package/dist/sampling.cjs +1 -2
  136. package/dist/sampling.js +1 -2
  137. package/dist/security-schema.cjs +1 -2
  138. package/dist/security-schema.d.cts +1 -2
  139. package/dist/security-schema.d.ts +1 -2
  140. package/dist/security-schema.js +1 -2
  141. package/dist/semantic-conventions-FhSxv-bK.d.cts +1 -2
  142. package/dist/semantic-conventions-FhSxv-bK.d.ts +1 -2
  143. package/dist/semantic-conventions.cjs +1 -2
  144. package/dist/semantic-conventions.js +1 -2
  145. package/dist/semantic-helpers.cjs +2 -3
  146. package/dist/semantic-helpers.d.cts +1 -2
  147. package/dist/semantic-helpers.d.ts +1 -2
  148. package/dist/semantic-helpers.js +2 -3
  149. package/dist/slo.cjs +1 -2
  150. package/dist/slo.d.cts +1 -2
  151. package/dist/slo.d.ts +1 -2
  152. package/dist/slo.js +1 -2
  153. package/dist/span-name-normalizer-CN1-8C76.d.cts +1 -2
  154. package/dist/span-name-normalizer-CN1-8C76.d.ts +1 -2
  155. package/dist/span-name-normalizer.cjs +1 -2
  156. package/dist/span-name-normalizer.js +1 -2
  157. package/dist/stable-hash-CS9BxvVQ.cjs +1 -2
  158. package/dist/stable-hash-ChFBIhNt.js +1 -2
  159. package/dist/structured-error-9--cxBay.js +1 -2
  160. package/dist/structured-error-CHg7DoIQ.cjs +1 -2
  161. package/dist/tail-sampling-processor.cjs +1 -2
  162. package/dist/tail-sampling-processor.d.cts +1 -2
  163. package/dist/tail-sampling-processor.d.ts +1 -2
  164. package/dist/tail-sampling-processor.js +1 -2
  165. package/dist/test-span-collector.cjs +1 -2
  166. package/dist/test-span-collector.d.cts +1 -2
  167. package/dist/test-span-collector.d.ts +1 -2
  168. package/dist/test-span-collector.js +1 -2
  169. package/dist/testing.cjs +1 -2
  170. package/dist/testing.d.cts +1 -2
  171. package/dist/testing.d.ts +1 -2
  172. package/dist/testing.js +1 -2
  173. package/dist/trace-context-IuyoPyNq.d.cts +1 -2
  174. package/dist/trace-context-IuyoPyNq.d.ts +1 -2
  175. package/dist/trace-factory-validation-BjVAinz6.js +1 -2
  176. package/dist/trace-factory-validation-Dc8epn87.cjs +1 -2
  177. package/dist/trace-helpers.cjs +1 -2
  178. package/dist/trace-helpers.d.cts +1 -2
  179. package/dist/trace-helpers.d.ts +1 -2
  180. package/dist/trace-helpers.js +1 -2
  181. package/dist/tracer-provider.cjs +1 -2
  182. package/dist/tracer-provider.d.cts +1 -2
  183. package/dist/tracer-provider.d.ts +1 -2
  184. package/dist/tracer-provider.js +1 -2
  185. package/dist/validate.cjs +1 -2
  186. package/dist/validate.d.cts +1 -2
  187. package/dist/validate.d.ts +1 -2
  188. package/dist/validate.js +1 -2
  189. package/dist/validation-attributes.cjs +1 -2
  190. package/dist/validation-attributes.d.cts +1 -2
  191. package/dist/validation-attributes.d.ts +1 -2
  192. package/dist/validation-attributes.js +1 -2
  193. package/dist/webhook.cjs +2 -3
  194. package/dist/webhook.d.cts +1 -2
  195. package/dist/webhook.d.ts +1 -2
  196. package/dist/webhook.js +2 -3
  197. package/dist/workflow-distributed.cjs +2 -3
  198. package/dist/workflow-distributed.d.cts +1 -2
  199. package/dist/workflow-distributed.d.ts +1 -2
  200. package/dist/workflow-distributed.js +2 -3
  201. package/dist/workflow.cjs +2 -3
  202. package/dist/workflow.d.cts +1 -2
  203. package/dist/workflow.d.ts +1 -2
  204. package/dist/workflow.js +2 -3
  205. package/dist/yaml-config.cjs +1 -2
  206. package/dist/yaml-config.d.cts +4 -5
  207. package/dist/yaml-config.d.ts +4 -5
  208. package/dist/yaml-config.js +1 -2
  209. package/package.json +47 -32
  210. package/dist/analysis.cjs.map +0 -1
  211. package/dist/analysis.d.cts.map +0 -1
  212. package/dist/analysis.d.ts.map +0 -1
  213. package/dist/analysis.js.map +0 -1
  214. package/dist/attribute-redacting-processor-Pk7lAzWd.d.cts.map +0 -1
  215. package/dist/attribute-redacting-processor-Pk7lAzWd.d.ts.map +0 -1
  216. package/dist/attribute-redacting-processor.cjs.map +0 -1
  217. package/dist/attribute-redacting-processor.js.map +0 -1
  218. package/dist/attributes-B7wix2VG.js.map +0 -1
  219. package/dist/attributes-aDmJYral.cjs.map +0 -1
  220. package/dist/auto.cjs.map +0 -1
  221. package/dist/auto.js.map +0 -1
  222. package/dist/business-baggage.cjs.map +0 -1
  223. package/dist/business-baggage.d.cts.map +0 -1
  224. package/dist/business-baggage.d.ts.map +0 -1
  225. package/dist/business-baggage.js.map +0 -1
  226. package/dist/canonical-log-line-processor-B4WgG-VS.d.cts.map +0 -1
  227. package/dist/canonical-log-line-processor-CL_J7gb5.d.ts.map +0 -1
  228. package/dist/canonical-log-line-processor-DOjb6Kxy.cjs.map +0 -1
  229. package/dist/canonical-log-line-processor-mKABvGP0.js.map +0 -1
  230. package/dist/config.cjs.map +0 -1
  231. package/dist/config.d.cts.map +0 -1
  232. package/dist/config.d.ts.map +0 -1
  233. package/dist/config.js.map +0 -1
  234. package/dist/correlated-events-Bzh5y-UB.js.map +0 -1
  235. package/dist/correlated-events-kSwLo3mi.cjs.map +0 -1
  236. package/dist/correlation-id.d.cts.map +0 -1
  237. package/dist/correlation-id.d.ts.map +0 -1
  238. package/dist/db.cjs.map +0 -1
  239. package/dist/db.d.cts.map +0 -1
  240. package/dist/db.d.ts.map +0 -1
  241. package/dist/db.js.map +0 -1
  242. package/dist/decorators.cjs.map +0 -1
  243. package/dist/decorators.d.cts.map +0 -1
  244. package/dist/decorators.d.ts.map +0 -1
  245. package/dist/decorators.js.map +0 -1
  246. package/dist/define-event-B2z1SBe7.d.ts.map +0 -1
  247. package/dist/define-event-CGG048HE.d.cts.map +0 -1
  248. package/dist/diagnostics.cjs.map +0 -1
  249. package/dist/diagnostics.d.cts.map +0 -1
  250. package/dist/diagnostics.d.ts.map +0 -1
  251. package/dist/diagnostics.js.map +0 -1
  252. package/dist/drain-pipeline.cjs.map +0 -1
  253. package/dist/drain-pipeline.d.cts.map +0 -1
  254. package/dist/drain-pipeline.d.ts.map +0 -1
  255. package/dist/drain-pipeline.js.map +0 -1
  256. package/dist/enrichers.cjs.map +0 -1
  257. package/dist/enrichers.d.cts.map +0 -1
  258. package/dist/enrichers.d.ts.map +0 -1
  259. package/dist/enrichers.js.map +0 -1
  260. package/dist/event-subscriber-CWh8sTGh.d.cts.map +0 -1
  261. package/dist/event-subscriber-CWh8sTGh.d.ts.map +0 -1
  262. package/dist/event-testing-CA2mIx1E.d.ts.map +0 -1
  263. package/dist/event-testing-D0qWfqAy.d.cts.map +0 -1
  264. package/dist/event-testing.cjs.map +0 -1
  265. package/dist/event-testing.js.map +0 -1
  266. package/dist/event.d.cts.map +0 -1
  267. package/dist/event.d.ts.map +0 -1
  268. package/dist/exporters.d.cts.map +0 -1
  269. package/dist/exporters.d.ts.map +0 -1
  270. package/dist/filtering-span-processor-BpDagWNa.d.cts.map +0 -1
  271. package/dist/filtering-span-processor-BpDagWNa.d.ts.map +0 -1
  272. package/dist/filtering-span-processor.cjs.map +0 -1
  273. package/dist/filtering-span-processor.js.map +0 -1
  274. package/dist/functional-BnDUxnSl.js.map +0 -1
  275. package/dist/functional-DcLBuCPz.cjs.map +0 -1
  276. package/dist/functional.d.cts.map +0 -1
  277. package/dist/functional.d.ts.map +0 -1
  278. package/dist/http.cjs.map +0 -1
  279. package/dist/http.d.cts.map +0 -1
  280. package/dist/http.d.ts.map +0 -1
  281. package/dist/http.js.map +0 -1
  282. package/dist/index-BPcxVucm.d.cts.map +0 -1
  283. package/dist/index-DolOVX6F.d.ts.map +0 -1
  284. package/dist/index.cjs.map +0 -1
  285. package/dist/index.d.cts.map +0 -1
  286. package/dist/index.d.ts.map +0 -1
  287. package/dist/index.js.map +0 -1
  288. package/dist/init-C3RApHKJ.cjs.map +0 -1
  289. package/dist/init-D6n2diBy.d.ts.map +0 -1
  290. package/dist/init-R-gSEXkJ.js.map +0 -1
  291. package/dist/init-XzXzrarP.d.cts.map +0 -1
  292. package/dist/instrumentation.cjs.map +0 -1
  293. package/dist/instrumentation.d.cts.map +0 -1
  294. package/dist/instrumentation.d.ts.map +0 -1
  295. package/dist/instrumentation.js.map +0 -1
  296. package/dist/logger-CN4xpzMd.d.cts.map +0 -1
  297. package/dist/logger-CN4xpzMd.d.ts.map +0 -1
  298. package/dist/logger-D3Ej3DII.js.map +0 -1
  299. package/dist/logger-thMPLpOG.cjs.map +0 -1
  300. package/dist/messaging-adapters.cjs.map +0 -1
  301. package/dist/messaging-adapters.d.cts.map +0 -1
  302. package/dist/messaging-adapters.d.ts.map +0 -1
  303. package/dist/messaging-adapters.js.map +0 -1
  304. package/dist/messaging-testing.cjs.map +0 -1
  305. package/dist/messaging-testing.d.cts.map +0 -1
  306. package/dist/messaging-testing.d.ts.map +0 -1
  307. package/dist/messaging-testing.js.map +0 -1
  308. package/dist/messaging.cjs.map +0 -1
  309. package/dist/messaging.d.cts.map +0 -1
  310. package/dist/messaging.d.ts.map +0 -1
  311. package/dist/messaging.js.map +0 -1
  312. package/dist/metric-helpers.cjs.map +0 -1
  313. package/dist/metric-helpers.d.cts.map +0 -1
  314. package/dist/metric-helpers.d.ts.map +0 -1
  315. package/dist/metric-helpers.js.map +0 -1
  316. package/dist/metric-testing-CWm6UhaR.d.ts.map +0 -1
  317. package/dist/metric-testing-CpvP3ZIa.d.cts.map +0 -1
  318. package/dist/metric-testing.cjs.map +0 -1
  319. package/dist/metric-testing.js.map +0 -1
  320. package/dist/metric.cjs.map +0 -1
  321. package/dist/metric.d.cts.map +0 -1
  322. package/dist/metric.d.ts.map +0 -1
  323. package/dist/metric.js.map +0 -1
  324. package/dist/node-require-PFqDihze.cjs.map +0 -1
  325. package/dist/node-require-vROmTeJ8.js.map +0 -1
  326. package/dist/parse-error.cjs.map +0 -1
  327. package/dist/parse-error.d.cts.map +0 -1
  328. package/dist/parse-error.d.ts.map +0 -1
  329. package/dist/parse-error.js.map +0 -1
  330. package/dist/pretty-console-exporter-CMzlrRNg.cjs.map +0 -1
  331. package/dist/pretty-console-exporter-DqKl_q9z.js.map +0 -1
  332. package/dist/register.cjs.map +0 -1
  333. package/dist/register.js.map +0 -1
  334. package/dist/registry-DVSmWg6Y.js.map +0 -1
  335. package/dist/registry-DYgvb62e.cjs.map +0 -1
  336. package/dist/sampling-BR9fkSwx.d.cts.map +0 -1
  337. package/dist/sampling-CP3e7-Yr.d.ts.map +0 -1
  338. package/dist/sampling.cjs.map +0 -1
  339. package/dist/sampling.js.map +0 -1
  340. package/dist/security-schema.cjs.map +0 -1
  341. package/dist/security-schema.d.cts.map +0 -1
  342. package/dist/security-schema.d.ts.map +0 -1
  343. package/dist/security-schema.js.map +0 -1
  344. package/dist/semantic-conventions-FhSxv-bK.d.cts.map +0 -1
  345. package/dist/semantic-conventions-FhSxv-bK.d.ts.map +0 -1
  346. package/dist/semantic-conventions.cjs.map +0 -1
  347. package/dist/semantic-conventions.js.map +0 -1
  348. package/dist/semantic-helpers.cjs.map +0 -1
  349. package/dist/semantic-helpers.d.cts.map +0 -1
  350. package/dist/semantic-helpers.d.ts.map +0 -1
  351. package/dist/semantic-helpers.js.map +0 -1
  352. package/dist/slo.cjs.map +0 -1
  353. package/dist/slo.d.cts.map +0 -1
  354. package/dist/slo.d.ts.map +0 -1
  355. package/dist/slo.js.map +0 -1
  356. package/dist/span-name-normalizer-CN1-8C76.d.cts.map +0 -1
  357. package/dist/span-name-normalizer-CN1-8C76.d.ts.map +0 -1
  358. package/dist/span-name-normalizer.cjs.map +0 -1
  359. package/dist/span-name-normalizer.js.map +0 -1
  360. package/dist/stable-hash-CS9BxvVQ.cjs.map +0 -1
  361. package/dist/stable-hash-ChFBIhNt.js.map +0 -1
  362. package/dist/structured-error-9--cxBay.js.map +0 -1
  363. package/dist/structured-error-CHg7DoIQ.cjs.map +0 -1
  364. package/dist/tail-sampling-processor.cjs.map +0 -1
  365. package/dist/tail-sampling-processor.d.cts.map +0 -1
  366. package/dist/tail-sampling-processor.d.ts.map +0 -1
  367. package/dist/tail-sampling-processor.js.map +0 -1
  368. package/dist/test-span-collector.cjs.map +0 -1
  369. package/dist/test-span-collector.d.cts.map +0 -1
  370. package/dist/test-span-collector.d.ts.map +0 -1
  371. package/dist/test-span-collector.js.map +0 -1
  372. package/dist/testing.cjs.map +0 -1
  373. package/dist/testing.d.cts.map +0 -1
  374. package/dist/testing.d.ts.map +0 -1
  375. package/dist/testing.js.map +0 -1
  376. package/dist/trace-context-IuyoPyNq.d.cts.map +0 -1
  377. package/dist/trace-context-IuyoPyNq.d.ts.map +0 -1
  378. package/dist/trace-factory-validation-BjVAinz6.js.map +0 -1
  379. package/dist/trace-factory-validation-Dc8epn87.cjs.map +0 -1
  380. package/dist/trace-helpers.cjs.map +0 -1
  381. package/dist/trace-helpers.d.cts.map +0 -1
  382. package/dist/trace-helpers.d.ts.map +0 -1
  383. package/dist/trace-helpers.js.map +0 -1
  384. package/dist/tracer-provider.cjs.map +0 -1
  385. package/dist/tracer-provider.d.cts.map +0 -1
  386. package/dist/tracer-provider.d.ts.map +0 -1
  387. package/dist/tracer-provider.js.map +0 -1
  388. package/dist/validate.cjs.map +0 -1
  389. package/dist/validate.d.cts.map +0 -1
  390. package/dist/validate.d.ts.map +0 -1
  391. package/dist/validate.js.map +0 -1
  392. package/dist/validation-attributes.cjs.map +0 -1
  393. package/dist/validation-attributes.d.cts.map +0 -1
  394. package/dist/validation-attributes.d.ts.map +0 -1
  395. package/dist/validation-attributes.js.map +0 -1
  396. package/dist/webhook.cjs.map +0 -1
  397. package/dist/webhook.d.cts.map +0 -1
  398. package/dist/webhook.d.ts.map +0 -1
  399. package/dist/webhook.js.map +0 -1
  400. package/dist/workflow-distributed.cjs.map +0 -1
  401. package/dist/workflow-distributed.d.cts.map +0 -1
  402. package/dist/workflow-distributed.d.ts.map +0 -1
  403. package/dist/workflow-distributed.js.map +0 -1
  404. package/dist/workflow.cjs.map +0 -1
  405. package/dist/workflow.d.cts.map +0 -1
  406. package/dist/workflow.d.ts.map +0 -1
  407. package/dist/workflow.js.map +0 -1
  408. package/dist/yaml-config.cjs.map +0 -1
  409. package/dist/yaml-config.d.cts.map +0 -1
  410. package/dist/yaml-config.d.ts.map +0 -1
  411. package/dist/yaml-config.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"enrichers.js","names":[],"sources":["../src/enrichers.ts"],"sourcesContent":["type Headers = Record<string, string | string[] | undefined>;\n\nfunction get(headers: Headers, key: string): string | undefined {\n const lower = key.toLowerCase();\n for (const [k, v] of Object.entries(headers)) {\n if (k.toLowerCase() === lower) {\n return Array.isArray(v) ? v[0] : v;\n }\n }\n return undefined;\n}\n\n// --- User Agent ---\n\nexport interface UserAgentAttributes {\n 'user_agent.raw': string;\n 'user_agent.browser'?: string;\n 'user_agent.os'?: string;\n 'user_agent.device'?: string;\n}\n\nconst BROWSER_RE = /(Firefox|OPR|Edg|Chrome|Safari|MSIE|Trident)[\\s/]?([\\d.]*)/;\nconst OS_RE =\n /(Windows NT|Mac OS X|Linux|Android|iPhone OS|iPad|CrOS)[\\s]?([\\d._]*)/;\n\nfunction parseBrowser(ua: string): string | undefined {\n const m = BROWSER_RE.exec(ua);\n if (!m) return undefined;\n const name =\n m[1] === 'OPR'\n ? 'Opera'\n : m[1] === 'Edg'\n ? 'Edge'\n : m[1] === 'Trident'\n ? 'IE'\n : m[1];\n return m[2] ? `${name} ${m[2]}` : name;\n}\n\nfunction parseOS(ua: string): string | undefined {\n const m = OS_RE.exec(ua);\n if (!m) return undefined;\n const name =\n m[1] === 'iPhone OS'\n ? 'iOS'\n : m[1] === 'Windows NT'\n ? 'Windows'\n : m[1] === 'Mac OS X'\n ? 'macOS'\n : m[1];\n const ver = m[2]?.replaceAll('_', '.') || undefined;\n return ver ? `${name} ${ver}` : name;\n}\n\nfunction parseDevice(ua: string): string | undefined {\n if (/Mobi|Android.*Mobile|iPhone/.test(ua)) return 'mobile';\n if (/iPad|Android(?!.*Mobile)|Tablet/.test(ua)) return 'tablet';\n if (/Bot|Crawler|Spider|Lighthouse/i.test(ua)) return 'bot';\n return 'desktop';\n}\n\nexport function userAgent(headers: Headers): UserAgentAttributes | undefined {\n const raw = get(headers, 'user-agent');\n if (!raw) return undefined;\n\n const attrs: UserAgentAttributes = { 'user_agent.raw': raw };\n const browser = parseBrowser(raw);\n if (browser) attrs['user_agent.browser'] = browser;\n const os = parseOS(raw);\n if (os) attrs['user_agent.os'] = os;\n const device = parseDevice(raw);\n if (device) attrs['user_agent.device'] = device;\n\n return attrs;\n}\n\n// --- Geo ---\n\nexport interface GeoAttributes {\n 'geo.country'?: string;\n 'geo.region'?: string;\n 'geo.city'?: string;\n 'geo.latitude'?: string;\n 'geo.longitude'?: string;\n}\n\nexport function geo(headers: Headers): GeoAttributes | undefined {\n const country =\n get(headers, 'x-vercel-ip-country') ?? get(headers, 'cf-ipcountry');\n const region = get(headers, 'x-vercel-ip-country-region');\n const city = get(headers, 'x-vercel-ip-city');\n const latitude = get(headers, 'x-vercel-ip-latitude');\n const longitude = get(headers, 'x-vercel-ip-longitude');\n\n if (!country && !region && !city && !latitude && !longitude) return undefined;\n\n const attrs: GeoAttributes = {};\n if (country) attrs['geo.country'] = country;\n if (region) attrs['geo.region'] = region;\n if (city) {\n try {\n attrs['geo.city'] = decodeURIComponent(city);\n } catch {\n attrs['geo.city'] = city;\n }\n }\n if (latitude) attrs['geo.latitude'] = latitude;\n if (longitude) attrs['geo.longitude'] = longitude;\n\n return attrs;\n}\n\n// --- Request Size ---\n\nexport interface RequestSizeAttributes {\n 'http.request.body.size'?: number;\n 'http.response.body.size'?: number;\n}\n\nconst DIGITS_RE = /^\\d+$/;\n\nfunction parseContentLength(value: string | undefined): number | undefined {\n if (!value || !DIGITS_RE.test(value)) return undefined;\n return Number(value);\n}\n\nexport function requestSize(\n requestHeaders: Headers,\n responseHeaders?: Headers,\n): RequestSizeAttributes | undefined {\n const reqLen = get(requestHeaders, 'content-length');\n const resLen = responseHeaders\n ? get(responseHeaders, 'content-length')\n : undefined;\n\n if (!reqLen && !resLen) return undefined;\n\n const attrs: RequestSizeAttributes = {};\n const reqBytes = parseContentLength(reqLen);\n if (reqBytes !== undefined) attrs['http.request.body.size'] = reqBytes;\n const resBytes = parseContentLength(resLen);\n if (resBytes !== undefined) attrs['http.response.body.size'] = resBytes;\n\n return Object.keys(attrs).length > 0 ? attrs : undefined;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-subscriber-CWh8sTGh.d.cts","names":[],"sources":["../src/event-subscriber.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2CY,kBAAkB;;;;;;;;;;;;;;;;;KAkBlB,uBAAuB;;;;KAQvB;;;;KAKA;;;;;;;UAQK;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;;;;UAOe;;EAEf;;EAEA;;EAEA;;;;;UAMe;;EAEf,UAAU;;EAEV,SAAS;;;;;;;;;;;;;;UAeM;;;;;;;;;EASf,WACE,cACA,aAAa,iBACb,UAAU,uBACT;;;;;;;;;;EAWH,gBACE,oBACA,MAAM,cACN,aAAa,iBACb,UAAU,uBACT;;;;;;;;;;EAWH,aACE,uBACA,SAAS,eACT,aAAa,iBACb,UAAU,uBACT;;;;;;;;;;EAWH,WACE,cACA,eACA,aAAa,iBACb,UAAU,uBACT;;;;;;;;;;;;;;;;;;;;;;EAuBH,wBACE,oBACA,kBACA,qBACA,aAAa,iBACb,UAAU,uBACT;;;;;;;;;;;;;;;;;EAkBH,aAAa;;;;;;WAOJ;;;;;;WAOA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-subscriber-CWh8sTGh.d.ts","names":[],"sources":["../src/event-subscriber.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2CY,kBAAkB;;;;;;;;;;;;;;;;;KAkBlB,uBAAuB;;;;KAQvB;;;;KAKA;;;;;;;UAQK;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;;;;UAOe;;EAEf;;EAEA;;EAEA;;;;;UAMe;;EAEf,UAAU;;EAEV,SAAS;;;;;;;;;;;;;;UAeM;;;;;;;;;EASf,WACE,cACA,aAAa,iBACb,UAAU,uBACT;;;;;;;;;;EAWH,gBACE,oBACA,MAAM,cACN,aAAa,iBACb,UAAU,uBACT;;;;;;;;;;EAWH,aACE,uBACA,SAAS,eACT,aAAa,iBACb,UAAU,uBACT;;;;;;;;;;EAWH,WACE,cACA,eACA,aAAa,iBACb,UAAU,uBACT;;;;;;;;;;;;;;;;;;;;;;EAuBH,wBACE,oBACA,kBACA,qBACA,aAAa,iBACb,UAAU,uBACT;;;;;;;;;;;;;;;;;EAkBH,aAAa;;;;;;WAOJ;;;;;;WAOA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-testing-CA2mIx1E.d.ts","names":[],"sources":["../src/event-testing.ts"],"mappings":";;UAYiB;EACf;EACA,aAAa;EACb;EACA;;UAGe;EACf;EACA,QAAQ;EACR,aAAa;EACb;EACA;;UAGe;EACf;EACA,QAAQ;EACR,aAAa;EACb;EACA;;UAGe;EACf;EACA;EACA,aAAa;EACb;EACA;;;;;UAMe;;EAEf,aAAa;;EAEb,kBAAkB;;EAElB,eAAe;;EAEf,aAAa;;EAEb;;EAEA,YAAY,OAAO;;EAEnB,iBAAiB,MAAM;;EAEvB,cAAc,SAAS;;EAEvB,YAAY,OAAO;;;;;;;;;;;;;;;;;iBAkBL,wBAAwB;;;;;;;;;;;;;iBA4DxB,mBAAmB;EACjC,WAAW;EACX;EACA,aAAa;;;;;;;;;;;;;;iBAoCC,qBAAqB;EACnC,WAAW;EACX;EACA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-testing-D0qWfqAy.d.cts","names":[],"sources":["../src/event-testing.ts"],"mappings":";;UAYiB;EACf;EACA,aAAa;EACb;EACA;;UAGe;EACf;EACA,QAAQ;EACR,aAAa;EACb;EACA;;UAGe;EACf;EACA,QAAQ;EACR,aAAa;EACb;EACA;;UAGe;EACf;EACA;EACA,aAAa;EACb;EACA;;;;;UAMe;;EAEf,aAAa;;EAEb,kBAAkB;;EAElB,eAAe;;EAEf,aAAa;;EAEb;;EAEA,YAAY,OAAO;;EAEnB,iBAAiB,MAAM;;EAEvB,cAAc,SAAS;;EAEvB,YAAY,OAAO;;;;;;;;;;;;;;;;;iBAkBL,wBAAwB;;;;;;;;;;;;;iBA4DxB,mBAAmB;EACjC,WAAW;EACX;EACA,aAAa;;;;;;;;;;;;;;iBAoCC,qBAAqB;EACnC,WAAW;EACX;EACA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-testing.cjs","names":[],"sources":["../src/event-testing.ts"],"sourcesContent":["/**\n * Testing utilities for Events\n *\n * Provides in-memory collection of events for testing purposes.\n */\n\nimport type {\n EventAttributes,\n FunnelStatus,\n OutcomeStatus,\n} from './event-subscriber';\n\nexport interface EventData {\n event: string;\n attributes?: EventAttributes;\n service: string;\n timestamp: number;\n}\n\nexport interface EventsFunnelStep {\n funnel: string;\n status: FunnelStatus;\n attributes?: EventAttributes;\n service: string;\n timestamp: number;\n}\n\nexport interface EventsOutcome {\n operation: string;\n status: OutcomeStatus;\n attributes?: EventAttributes;\n service: string;\n timestamp: number;\n}\n\nexport interface EventsValue {\n metric: string;\n value: number;\n attributes?: EventAttributes;\n service: string;\n timestamp: number;\n}\n\n/**\n * In-memory events collector for testing\n */\nexport interface EventCollector {\n /** Get all collected events */\n getEvents(): EventData[];\n /** Get all collected funnel steps */\n getFunnelSteps(): EventsFunnelStep[];\n /** Get all collected outcomes */\n getOutcomes(): EventsOutcome[];\n /** Get all collected values */\n getValues(): EventsValue[];\n /** Clear all collected events */\n clear(): void;\n /** Record an event (internal use) */\n recordEvent(event: EventData): void;\n /** Record a funnel step (internal use) */\n recordFunnelStep(step: EventsFunnelStep): void;\n /** Record an outcome (internal use) */\n recordOutcome(outcome: EventsOutcome): void;\n /** Record a value (internal use) */\n recordValue(value: EventsValue): void;\n}\n\n/**\n * Create an in-memory events collector for testing\n *\n * @example\n * ```typescript\n * const collector = createEventCollector()\n *\n * const events = new Event('test-service', { collector })\n * events.trackEvent('application.submitted', { jobId: '123' })\n *\n * const event =collector.getEvents()\n * expect(events).toHaveLength(1)\n * expect(events[0].event).toBe('application.submitted')\n * ```\n */\nexport function createEventCollector(): EventCollector {\n const events: EventData[] = [];\n const funnelSteps: EventsFunnelStep[] = [];\n const outcomes: EventsOutcome[] = [];\n const values: EventsValue[] = [];\n\n return {\n getEvents(): EventData[] {\n return [...events];\n },\n\n getFunnelSteps(): EventsFunnelStep[] {\n return [...funnelSteps];\n },\n\n getOutcomes(): EventsOutcome[] {\n return [...outcomes];\n },\n\n getValues(): EventsValue[] {\n return [...values];\n },\n\n clear(): void {\n events.length = 0;\n funnelSteps.length = 0;\n outcomes.length = 0;\n values.length = 0;\n },\n\n recordEvent(event: EventData): void {\n events.push(event);\n },\n\n recordFunnelStep(step: EventsFunnelStep): void {\n funnelSteps.push(step);\n },\n\n recordOutcome(outcome: EventsOutcome): void {\n outcomes.push(outcome);\n },\n\n recordValue(value: EventsValue): void {\n values.push(value);\n },\n };\n}\n\n/**\n * Assert that an events event was tracked\n *\n * @example\n * ```typescript\n * assertEventTracked({\n * collector,\n * eventName: 'application.submitted',\n * attributes: { jobId: '123' }\n * })\n * ```\n */\nexport function assertEventTracked(options: {\n collector: EventCollector;\n eventName: string;\n attributes?: Record<string, unknown>;\n}): void {\n const events = options.collector.getEvents();\n const matching = events.filter((e) => e.event === options.eventName);\n\n if (matching.length === 0) {\n throw new Error(`No events found with name: ${options.eventName}`);\n }\n\n if (options.attributes) {\n const matchingWithAttrs = matching.filter((e) =>\n Object.entries(options.attributes!).every(\n ([key, value]) => e.attributes && e.attributes[key] === value,\n ),\n );\n\n if (matchingWithAttrs.length === 0) {\n throw new Error(\n `Event ${options.eventName} found but attributes don't match: ${JSON.stringify(options.attributes)}`,\n );\n }\n }\n}\n\n/**\n * Assert that an outcome was tracked\n *\n * @example\n * ```typescript\n * assertOutcomeTracked({\n * collector,\n * operation: 'email.delivery',\n * status: 'success'\n * })\n * ```\n */\nexport function assertOutcomeTracked(options: {\n collector: EventCollector;\n operation: string;\n status: 'success' | 'failure' | 'partial';\n}): void {\n const outcomes = options.collector.getOutcomes();\n const matching = outcomes.filter(\n (o) => o.operation === options.operation && o.status === options.status,\n );\n\n if (matching.length === 0) {\n throw new Error(\n `No outcomes found with operation: ${options.operation} and status: ${options.status}`,\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkFA,SAAgB,uBAAuC;CACrD,MAAM,SAAsB,CAAC;CAC7B,MAAM,cAAkC,CAAC;CACzC,MAAM,WAA4B,CAAC;CACnC,MAAM,SAAwB,CAAC;CAE/B,OAAO;EACL,YAAyB;GACvB,OAAO,CAAC,GAAG,MAAM;EACnB;EAEA,iBAAqC;GACnC,OAAO,CAAC,GAAG,WAAW;EACxB;EAEA,cAA+B;GAC7B,OAAO,CAAC,GAAG,QAAQ;EACrB;EAEA,YAA2B;GACzB,OAAO,CAAC,GAAG,MAAM;EACnB;EAEA,QAAc;GACZ,OAAO,SAAS;GAChB,YAAY,SAAS;GACrB,SAAS,SAAS;GAClB,OAAO,SAAS;EAClB;EAEA,YAAY,OAAwB;GAClC,OAAO,KAAK,KAAK;EACnB;EAEA,iBAAiB,MAA8B;GAC7C,YAAY,KAAK,IAAI;EACvB;EAEA,cAAc,SAA8B;GAC1C,SAAS,KAAK,OAAO;EACvB;EAEA,YAAY,OAA0B;GACpC,OAAO,KAAK,KAAK;EACnB;CACF;AACF;;;;;;;;;;;;;AAcA,SAAgB,mBAAmB,SAI1B;CAEP,MAAM,WADS,QAAQ,UAAU,UACX,CAAC,CAAC,QAAQ,MAAM,EAAE,UAAU,QAAQ,SAAS;CAEnE,IAAI,SAAS,WAAW,GACtB,MAAM,IAAI,MAAM,8BAA8B,QAAQ,WAAW;CAGnE,IAAI,QAAQ,YAOV;MAN0B,SAAS,QAAQ,MACzC,OAAO,QAAQ,QAAQ,UAAW,CAAC,CAAC,OACjC,CAAC,KAAK,WAAW,EAAE,cAAc,EAAE,WAAW,SAAS,KAC1D,CAGkB,CAAC,CAAC,WAAW,GAC/B,MAAM,IAAI,MACR,SAAS,QAAQ,UAAU,qCAAqC,KAAK,UAAU,QAAQ,UAAU,GACnG;CACF;AAEJ;;;;;;;;;;;;;AAcA,SAAgB,qBAAqB,SAI5B;CAMP,IALiB,QAAQ,UAAU,YACX,CAAC,CAAC,QACvB,MAAM,EAAE,cAAc,QAAQ,aAAa,EAAE,WAAW,QAAQ,MAGxD,CAAC,CAAC,WAAW,GACtB,MAAM,IAAI,MACR,qCAAqC,QAAQ,UAAU,eAAe,QAAQ,QAChF;AAEJ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-testing.js","names":[],"sources":["../src/event-testing.ts"],"sourcesContent":["/**\n * Testing utilities for Events\n *\n * Provides in-memory collection of events for testing purposes.\n */\n\nimport type {\n EventAttributes,\n FunnelStatus,\n OutcomeStatus,\n} from './event-subscriber';\n\nexport interface EventData {\n event: string;\n attributes?: EventAttributes;\n service: string;\n timestamp: number;\n}\n\nexport interface EventsFunnelStep {\n funnel: string;\n status: FunnelStatus;\n attributes?: EventAttributes;\n service: string;\n timestamp: number;\n}\n\nexport interface EventsOutcome {\n operation: string;\n status: OutcomeStatus;\n attributes?: EventAttributes;\n service: string;\n timestamp: number;\n}\n\nexport interface EventsValue {\n metric: string;\n value: number;\n attributes?: EventAttributes;\n service: string;\n timestamp: number;\n}\n\n/**\n * In-memory events collector for testing\n */\nexport interface EventCollector {\n /** Get all collected events */\n getEvents(): EventData[];\n /** Get all collected funnel steps */\n getFunnelSteps(): EventsFunnelStep[];\n /** Get all collected outcomes */\n getOutcomes(): EventsOutcome[];\n /** Get all collected values */\n getValues(): EventsValue[];\n /** Clear all collected events */\n clear(): void;\n /** Record an event (internal use) */\n recordEvent(event: EventData): void;\n /** Record a funnel step (internal use) */\n recordFunnelStep(step: EventsFunnelStep): void;\n /** Record an outcome (internal use) */\n recordOutcome(outcome: EventsOutcome): void;\n /** Record a value (internal use) */\n recordValue(value: EventsValue): void;\n}\n\n/**\n * Create an in-memory events collector for testing\n *\n * @example\n * ```typescript\n * const collector = createEventCollector()\n *\n * const events = new Event('test-service', { collector })\n * events.trackEvent('application.submitted', { jobId: '123' })\n *\n * const event =collector.getEvents()\n * expect(events).toHaveLength(1)\n * expect(events[0].event).toBe('application.submitted')\n * ```\n */\nexport function createEventCollector(): EventCollector {\n const events: EventData[] = [];\n const funnelSteps: EventsFunnelStep[] = [];\n const outcomes: EventsOutcome[] = [];\n const values: EventsValue[] = [];\n\n return {\n getEvents(): EventData[] {\n return [...events];\n },\n\n getFunnelSteps(): EventsFunnelStep[] {\n return [...funnelSteps];\n },\n\n getOutcomes(): EventsOutcome[] {\n return [...outcomes];\n },\n\n getValues(): EventsValue[] {\n return [...values];\n },\n\n clear(): void {\n events.length = 0;\n funnelSteps.length = 0;\n outcomes.length = 0;\n values.length = 0;\n },\n\n recordEvent(event: EventData): void {\n events.push(event);\n },\n\n recordFunnelStep(step: EventsFunnelStep): void {\n funnelSteps.push(step);\n },\n\n recordOutcome(outcome: EventsOutcome): void {\n outcomes.push(outcome);\n },\n\n recordValue(value: EventsValue): void {\n values.push(value);\n },\n };\n}\n\n/**\n * Assert that an events event was tracked\n *\n * @example\n * ```typescript\n * assertEventTracked({\n * collector,\n * eventName: 'application.submitted',\n * attributes: { jobId: '123' }\n * })\n * ```\n */\nexport function assertEventTracked(options: {\n collector: EventCollector;\n eventName: string;\n attributes?: Record<string, unknown>;\n}): void {\n const events = options.collector.getEvents();\n const matching = events.filter((e) => e.event === options.eventName);\n\n if (matching.length === 0) {\n throw new Error(`No events found with name: ${options.eventName}`);\n }\n\n if (options.attributes) {\n const matchingWithAttrs = matching.filter((e) =>\n Object.entries(options.attributes!).every(\n ([key, value]) => e.attributes && e.attributes[key] === value,\n ),\n );\n\n if (matchingWithAttrs.length === 0) {\n throw new Error(\n `Event ${options.eventName} found but attributes don't match: ${JSON.stringify(options.attributes)}`,\n );\n }\n }\n}\n\n/**\n * Assert that an outcome was tracked\n *\n * @example\n * ```typescript\n * assertOutcomeTracked({\n * collector,\n * operation: 'email.delivery',\n * status: 'success'\n * })\n * ```\n */\nexport function assertOutcomeTracked(options: {\n collector: EventCollector;\n operation: string;\n status: 'success' | 'failure' | 'partial';\n}): void {\n const outcomes = options.collector.getOutcomes();\n const matching = outcomes.filter(\n (o) => o.operation === options.operation && o.status === options.status,\n );\n\n if (matching.length === 0) {\n throw new Error(\n `No outcomes found with operation: ${options.operation} and status: ${options.status}`,\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAkFA,SAAgB,uBAAuC;CACrD,MAAM,SAAsB,CAAC;CAC7B,MAAM,cAAkC,CAAC;CACzC,MAAM,WAA4B,CAAC;CACnC,MAAM,SAAwB,CAAC;CAE/B,OAAO;EACL,YAAyB;GACvB,OAAO,CAAC,GAAG,MAAM;EACnB;EAEA,iBAAqC;GACnC,OAAO,CAAC,GAAG,WAAW;EACxB;EAEA,cAA+B;GAC7B,OAAO,CAAC,GAAG,QAAQ;EACrB;EAEA,YAA2B;GACzB,OAAO,CAAC,GAAG,MAAM;EACnB;EAEA,QAAc;GACZ,OAAO,SAAS;GAChB,YAAY,SAAS;GACrB,SAAS,SAAS;GAClB,OAAO,SAAS;EAClB;EAEA,YAAY,OAAwB;GAClC,OAAO,KAAK,KAAK;EACnB;EAEA,iBAAiB,MAA8B;GAC7C,YAAY,KAAK,IAAI;EACvB;EAEA,cAAc,SAA8B;GAC1C,SAAS,KAAK,OAAO;EACvB;EAEA,YAAY,OAA0B;GACpC,OAAO,KAAK,KAAK;EACnB;CACF;AACF;;;;;;;;;;;;;AAcA,SAAgB,mBAAmB,SAI1B;CAEP,MAAM,WADS,QAAQ,UAAU,UACX,CAAC,CAAC,QAAQ,MAAM,EAAE,UAAU,QAAQ,SAAS;CAEnE,IAAI,SAAS,WAAW,GACtB,MAAM,IAAI,MAAM,8BAA8B,QAAQ,WAAW;CAGnE,IAAI,QAAQ,YAOV;MAN0B,SAAS,QAAQ,MACzC,OAAO,QAAQ,QAAQ,UAAW,CAAC,CAAC,OACjC,CAAC,KAAK,WAAW,EAAE,cAAc,EAAE,WAAW,SAAS,KAC1D,CAGkB,CAAC,CAAC,WAAW,GAC/B,MAAM,IAAI,MACR,SAAS,QAAQ,UAAU,qCAAqC,KAAK,UAAU,QAAQ,UAAU,GACnG;CACF;AAEJ;;;;;;;;;;;;;AAcA,SAAgB,qBAAqB,SAI5B;CAMP,IALiB,QAAQ,UAAU,YACX,CAAC,CAAC,QACvB,MAAM,EAAE,cAAc,QAAQ,aAAa,EAAE,WAAW,QAAQ,MAGxD,CAAC,CAAC,WAAW,GACtB,MAAM,IAAI,MACR,qCAAqC,QAAQ,UAAU,eAAe,QAAQ,QAChF;AAEJ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"event.d.cts","names":[],"sources":["../src/event.ts"],"mappings":";;;;;;;;;;;;;;;;;;;UA4FiB;;EAEf,SAAS;;EAET,YAAY;;;;;;;;;;;;EAYZ,cAAc;;cAGH;UACH;UACA;UACA;UACA;UACA;UACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8CI,YAAA,qBAAqB,UAAS;;;;;;;;;UAsClC;;;;;;;;;;;;UAiDA;;;;;;;UA4FA;;;;UAsEA;;;;;UA2BA;;;;;;;;;;;;;;;;;;;;;;;;;;EAiCR,WAAW,mBAAmB,aAAa;;;;;;UAoD7B;;;;;;;;;;;;;;;;;;;EAwDd,gBACE,oBACA,QAAQ,cACR,aAAa;;;;;;;;;;;;;;;;;;;;;;;;EA2Df,aACE,uBACA,QAAQ,eACR,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8Df,WACE,oBACA,eACA,aAAa;;;;;;;;;;;;;;EAoDT,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CT,YAAY;;;;;;;;;;;;;;;;;;;;;EA6ClB,uBACE,oBACA,kBACA,qBACA,aAAa;;;;;;;;;;;;;;;;;;EA4Ef,WACE,QAAQ;IAAQ;IAAc,aAAa;;;;;;;;;;;;;;;;iBAoC/B,UAAU,qBAAqB,SAAS,SAAS;;;;iBAUjD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"event.d.ts","names":[],"sources":["../src/event.ts"],"mappings":";;;;;;;;;;;;;;;;;;;UA4FiB;;EAEf,SAAS;;EAET,YAAY;;;;;;;;;;;;EAYZ,cAAc;;cAGH;UACH;UACA;UACA;UACA;UACA;UACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8CI,YAAA,qBAAqB,UAAS;;;;;;;;;UAsClC;;;;;;;;;;;;UAiDA;;;;;;;UA4FA;;;;UAsEA;;;;;UA2BA;;;;;;;;;;;;;;;;;;;;;;;;;;EAiCR,WAAW,mBAAmB,aAAa;;;;;;UAoD7B;;;;;;;;;;;;;;;;;;;EAwDd,gBACE,oBACA,QAAQ,cACR,aAAa;;;;;;;;;;;;;;;;;;;;;;;;EA2Df,aACE,uBACA,QAAQ,eACR,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8Df,WACE,oBACA,eACA,aAAa;;;;;;;;;;;;;;EAoDT,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CT,YAAY;;;;;;;;;;;;;;;;;;;;;EA6ClB,uBACE,oBACA,kBACA,qBACA,aAAa;;;;;;;;;;;;;;;;;;EA4Ef,WACE,QAAQ;IAAQ;IAAc,aAAa;;;;;;;;;;;;;;;;iBAoC/B,UAAU,qBAAqB,SAAS,SAAS;;;;iBAUjD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"exporters.d.cts","names":[],"sources":["../src/pretty-console-exporter.ts"],"mappings":";;;;;UA2CU;EACR;EACA,QAAQ;;;;;UAuBO;;;;;EAKf;;;;;EAMA;;;;;EAMA;;;;;EAMA;;;;;EAMA;;;;;EAMA;;;;;;;;;;;;cAqBW,iCAAiC;mBAC3B;EAEL,YAAA,UAAS;;;;EAcrB,OACE,OAAO,gBACP,iBAAiB,QAAQ;;;;UA0BnB;;;;UAgBA;;;;UA4BA;;;;UA+BA;;;;UA+DA;;;;UAaA;;;;UA4BA;;;;UAQA;;;;EAQR,YAAY;;;;EAOZ,cAAc"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"exporters.d.ts","names":[],"sources":["../src/pretty-console-exporter.ts"],"mappings":";;;;;UA2CU;EACR;EACA,QAAQ;;;;;UAuBO;;;;;EAKf;;;;;EAMA;;;;;EAMA;;;;;EAMA;;;;;EAMA;;;;;EAMA;;;;;;;;;;;;cAqBW,iCAAiC;mBAC3B;EAEL,YAAA,UAAS;;;;EAcrB,OACE,OAAO,gBACP,iBAAiB,QAAQ;;;;UA0BnB;;;;UAgBA;;;;UA4BA;;;;UA+BA;;;;UA+DA;;;;UAaA;;;;UA4BA;;;;UAQA;;;;EAQR,YAAY;;;;EAOZ,cAAc"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"filtering-span-processor-BpDagWNa.d.cts","names":[],"sources":["../src/filtering-span-processor.ts"],"mappings":";;;;;;;;;;;;;;;;;KA4CY,uBAAuB,MAAM;UAExB;;;;;EAKf,QAAQ;;;;;;;;;;;;;;;;cAiBG,kCAAkC;mBAC5B;mBACA;EAGf,YAAA,kBAAkB,eAClB,SAAS;;;;EASX,QAAQ,MAAM,MAAM,eAAe;;;;;EAQnC,MAAM,MAAM;EAYZ,cAAc;EAId,YAAY"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"filtering-span-processor-BpDagWNa.d.ts","names":[],"sources":["../src/filtering-span-processor.ts"],"mappings":";;;;;;;;;;;;;;;;;KA4CY,uBAAuB,MAAM;UAExB;;;;;EAKf,QAAQ;;;;;;;;;;;;;;;;cAiBG,kCAAkC;mBAC5B;mBACA;EAGf,YAAA,kBAAkB,eAClB,SAAS;;;;EASX,QAAQ,MAAM,MAAM,eAAe;;;;;EAQnC,MAAM,MAAM;EAYZ,cAAc;EAId,YAAY"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"filtering-span-processor.cjs","names":[],"sources":["../src/filtering-span-processor.ts"],"sourcesContent":["/**\n * Filtering Span Processor\n *\n * Filters spans based on a user-provided predicate function.\n * Runs filtering on onEnd() to have access to complete span data.\n *\n * @example Filter out Next.js instrumentation spans\n * ```typescript\n * init({\n * service: 'my-app',\n * spanFilter: (span) => span.instrumentationScope.name !== 'next.js'\n * })\n * ```\n *\n * @example Filter out health check endpoints\n * ```typescript\n * init({\n * service: 'my-app',\n * spanFilter: (span) => !span.name.includes('/health')\n * })\n * ```\n */\n\nimport type {\n SpanProcessor,\n ReadableSpan,\n} from '@opentelemetry/sdk-trace-base';\nimport type { Context } from '@opentelemetry/api';\nimport type { Span } from '@opentelemetry/sdk-trace-base';\n\n/**\n * Predicate function for filtering spans\n *\n * @param span - The completed span (ReadableSpan) with all attributes and metadata\n * @returns true to keep the span, false to drop it\n *\n * Available span properties for filtering:\n * - `span.name` - Span name\n * - `span.attributes` - All span attributes\n * - `span.instrumentationScope` - `{ name, version }` of the instrumentation\n * - `span.status` - Span status code and message\n * - `span.duration` - Span duration as `[seconds, nanoseconds]`\n * - `span.kind` - SpanKind (INTERNAL, SERVER, CLIENT, etc.)\n */\nexport type SpanFilterPredicate = (span: ReadableSpan) => boolean;\n\nexport interface FilteringSpanProcessorOptions {\n /**\n * Predicate function to determine if a span should be kept\n * Return true to keep the span, false to drop it\n */\n filter: SpanFilterPredicate;\n}\n\n/**\n * Span processor that filters spans based on a predicate function.\n *\n * The filter is applied on onEnd() when the span has complete data including:\n * - All attributes\n * - Status code and message\n * - Duration\n * - Events and links\n * - Instrumentation scope (useful for filtering by library)\n *\n * onStart() passes through unchanged to ensure child spans can still be created.\n *\n * Error handling: If the filter predicate throws, the span is forwarded (fail-open).\n */\nexport class FilteringSpanProcessor implements SpanProcessor {\n private readonly wrappedProcessor: SpanProcessor;\n private readonly filter: SpanFilterPredicate;\n\n constructor(\n wrappedProcessor: SpanProcessor,\n options: FilteringSpanProcessorOptions,\n ) {\n this.wrappedProcessor = wrappedProcessor;\n this.filter = options.filter;\n }\n\n /**\n * Pass through onStart - we need spans to start so child spans work\n */\n onStart(span: Span, parentContext: Context): void {\n this.wrappedProcessor.onStart(span, parentContext);\n }\n\n /**\n * Apply filter predicate on span end\n * If filter returns false, span is dropped (not forwarded)\n */\n onEnd(span: ReadableSpan): void {\n try {\n if (this.filter(span)) {\n this.wrappedProcessor.onEnd(span);\n }\n // If filter returns false, span is silently dropped\n } catch {\n // If filter throws, forward the span (fail-open behavior)\n this.wrappedProcessor.onEnd(span);\n }\n }\n\n forceFlush(): Promise<void> {\n return this.wrappedProcessor.forceFlush();\n }\n\n shutdown(): Promise<void> {\n return this.wrappedProcessor.shutdown();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAoEA,IAAa,yBAAb,MAA6D;CAC3D,AAAiB;CACjB,AAAiB;CAEjB,YACE,kBACA,SACA;EACA,KAAK,mBAAmB;EACxB,KAAK,SAAS,QAAQ;CACxB;;;;CAKA,QAAQ,MAAY,eAA8B;EAChD,KAAK,iBAAiB,QAAQ,MAAM,aAAa;CACnD;;;;;CAMA,MAAM,MAA0B;EAC9B,IAAI;GACF,IAAI,KAAK,OAAO,IAAI,GAClB,KAAK,iBAAiB,MAAM,IAAI;EAGpC,QAAQ;GAEN,KAAK,iBAAiB,MAAM,IAAI;EAClC;CACF;CAEA,aAA4B;EAC1B,OAAO,KAAK,iBAAiB,WAAW;CAC1C;CAEA,WAA0B;EACxB,OAAO,KAAK,iBAAiB,SAAS;CACxC;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"filtering-span-processor.js","names":[],"sources":["../src/filtering-span-processor.ts"],"sourcesContent":["/**\n * Filtering Span Processor\n *\n * Filters spans based on a user-provided predicate function.\n * Runs filtering on onEnd() to have access to complete span data.\n *\n * @example Filter out Next.js instrumentation spans\n * ```typescript\n * init({\n * service: 'my-app',\n * spanFilter: (span) => span.instrumentationScope.name !== 'next.js'\n * })\n * ```\n *\n * @example Filter out health check endpoints\n * ```typescript\n * init({\n * service: 'my-app',\n * spanFilter: (span) => !span.name.includes('/health')\n * })\n * ```\n */\n\nimport type {\n SpanProcessor,\n ReadableSpan,\n} from '@opentelemetry/sdk-trace-base';\nimport type { Context } from '@opentelemetry/api';\nimport type { Span } from '@opentelemetry/sdk-trace-base';\n\n/**\n * Predicate function for filtering spans\n *\n * @param span - The completed span (ReadableSpan) with all attributes and metadata\n * @returns true to keep the span, false to drop it\n *\n * Available span properties for filtering:\n * - `span.name` - Span name\n * - `span.attributes` - All span attributes\n * - `span.instrumentationScope` - `{ name, version }` of the instrumentation\n * - `span.status` - Span status code and message\n * - `span.duration` - Span duration as `[seconds, nanoseconds]`\n * - `span.kind` - SpanKind (INTERNAL, SERVER, CLIENT, etc.)\n */\nexport type SpanFilterPredicate = (span: ReadableSpan) => boolean;\n\nexport interface FilteringSpanProcessorOptions {\n /**\n * Predicate function to determine if a span should be kept\n * Return true to keep the span, false to drop it\n */\n filter: SpanFilterPredicate;\n}\n\n/**\n * Span processor that filters spans based on a predicate function.\n *\n * The filter is applied on onEnd() when the span has complete data including:\n * - All attributes\n * - Status code and message\n * - Duration\n * - Events and links\n * - Instrumentation scope (useful for filtering by library)\n *\n * onStart() passes through unchanged to ensure child spans can still be created.\n *\n * Error handling: If the filter predicate throws, the span is forwarded (fail-open).\n */\nexport class FilteringSpanProcessor implements SpanProcessor {\n private readonly wrappedProcessor: SpanProcessor;\n private readonly filter: SpanFilterPredicate;\n\n constructor(\n wrappedProcessor: SpanProcessor,\n options: FilteringSpanProcessorOptions,\n ) {\n this.wrappedProcessor = wrappedProcessor;\n this.filter = options.filter;\n }\n\n /**\n * Pass through onStart - we need spans to start so child spans work\n */\n onStart(span: Span, parentContext: Context): void {\n this.wrappedProcessor.onStart(span, parentContext);\n }\n\n /**\n * Apply filter predicate on span end\n * If filter returns false, span is dropped (not forwarded)\n */\n onEnd(span: ReadableSpan): void {\n try {\n if (this.filter(span)) {\n this.wrappedProcessor.onEnd(span);\n }\n // If filter returns false, span is silently dropped\n } catch {\n // If filter throws, forward the span (fail-open behavior)\n this.wrappedProcessor.onEnd(span);\n }\n }\n\n forceFlush(): Promise<void> {\n return this.wrappedProcessor.forceFlush();\n }\n\n shutdown(): Promise<void> {\n return this.wrappedProcessor.shutdown();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAoEA,IAAa,yBAAb,MAA6D;CAC3D,AAAiB;CACjB,AAAiB;CAEjB,YACE,kBACA,SACA;EACA,KAAK,mBAAmB;EACxB,KAAK,SAAS,QAAQ;CACxB;;;;CAKA,QAAQ,MAAY,eAA8B;EAChD,KAAK,iBAAiB,QAAQ,MAAM,aAAa;CACnD;;;;;CAMA,MAAM,MAA0B;EAC9B,IAAI;GACF,IAAI,KAAK,OAAO,IAAI,GAClB,KAAK,iBAAiB,MAAM,IAAI;EAGpC,QAAQ;GAEN,KAAK,iBAAiB,MAAM,IAAI;EAClC;CACF;CAEA,aAA4B;EAC1B,OAAO,KAAK,iBAAiB,WAAW;CAC1C;CAEA,WAA0B;EACxB,OAAO,KAAK,iBAAiB,SAAS;CACxC;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"functional-BnDUxnSl.js","names":["getInitConfig","otelTrace","trace"],"sources":["../src/variable-name-inference.ts","../src/functional.ts"],"sourcesContent":["/**\n * Variable Name Inference Utility\n *\n * Attempts to infer variable names from const/export const assignments\n * by analyzing the call stack and parsing source code.\n *\n * This is a best-effort approach with graceful degradation - if inference\n * fails for any reason, it returns undefined without breaking the application.\n */\n\n// namespace imports for browser-bundler compat — see node-require.ts\nimport * as nodeFs from 'node:fs';\nimport * as nodeUrl from 'node:url';\n\ninterface CallLocation {\n file: string;\n line: number;\n column: number;\n}\n\n/**\n * LRU Cache for inferred variable names\n * Key: \"file:line\" (e.g., \"/path/to/file.ts:42\")\n * Value: inferred variable name or undefined\n */\nconst inferenceCache = new Map<string, string | undefined>();\nconst MAX_CACHE_SIZE = 50;\n\n/**\n * Captures the current call stack\n */\nfunction captureStackTrace(): string {\n const originalStackTraceLimit = Error.stackTraceLimit;\n Error.stackTraceLimit = 10; // Only need first few frames\n\n const err = new Error('Stack trace capture');\n const stack = err.stack || '';\n\n Error.stackTraceLimit = originalStackTraceLimit;\n return stack;\n}\n\n/**\n * Parses the stack trace to find where trace() was called\n *\n * Stack trace format (Node.js):\n * at functionName (file:line:column)\n * at file:line:column\n *\n * We skip frames until we find one that's NOT in functional.ts or this file.\n * We also need to skip one additional frame (the trace/span/instrument function itself)\n * to get to the actual user code.\n */\nfunction parseCallLocation(stack: string): CallLocation | undefined {\n const lines = stack.split('\\n');\n let skippedExternalFrame = false;\n\n for (const line of lines) {\n // Skip if line contains this file or functional.ts (internal frames)\n // Be specific about the filename to avoid matching test files\n if (\n line.includes('variable-name-inference.ts') ||\n line.includes('variable-name-inference.js') ||\n line.includes('functional.ts') ||\n line.includes('functional.js')\n ) {\n continue;\n }\n\n // Match various stack trace formats\n // Format 1: at functionName (file:line:column)\n // Format 2: at file:line:column\n const match =\n line.match(/at\\s+(?:.*\\s+)?\\(?([^:]+):(\\d+):(\\d+)\\)?/) ||\n line.match(/^.*?([^:]+):(\\d+):(\\d+)/);\n\n if (match) {\n let filePath = match[1]!.trim();\n\n // Handle file:// URLs (convert to paths)\n if (filePath.startsWith('file://')) {\n try {\n filePath = nodeUrl.fileURLToPath(filePath);\n } catch {\n continue;\n }\n }\n\n // Skip the first external frame (the trace/span function itself)\n // We want the frame where the user CALLS trace(), not inside trace()\n if (!skippedExternalFrame) {\n skippedExternalFrame = true;\n continue;\n }\n\n return {\n file: filePath,\n line: Number.parseInt(match[2]!, 10),\n column: Number.parseInt(match[3]!, 10),\n };\n }\n }\n\n return undefined;\n}\n\n/**\n * Reads a specific line from a source file\n */\nfunction readSourceLine(\n filePath: string,\n lineNumber: number,\n): string | undefined {\n try {\n // Check if we can access the file system (not available in edge runtimes)\n if (typeof nodeFs.readFileSync !== 'function') {\n return undefined;\n }\n\n const content = nodeFs.readFileSync(filePath, 'utf8');\n const lines = content.split('\\n');\n\n // Line numbers are 1-based\n return lines[lineNumber - 1];\n } catch {\n // File doesn't exist, permission denied, or other error\n return undefined;\n }\n}\n\n/**\n * Extracts variable name from source code line using regex patterns\n *\n * Supported patterns:\n * - const varName = anyFunction(\n * - export const varName = anyFunction(\n * - let varName = anyFunction(\n * - var varName = anyFunction(\n *\n * Note: This won't work with destructuring assignments or complex patterns\n */\nfunction extractVariableName(sourceLine: string): string | undefined {\n // Remove leading/trailing whitespace\n const trimmed = sourceLine.trim();\n\n // Pattern: (export)? (const|let|var) varName = anyFunctionCall(\n // We match any function call, not just trace(), to support wrapper functions\n const patterns = [\n // export const varName = anyFunction(\n /export\\s+const\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*=\\s*[a-zA-Z_$][a-zA-Z0-9_$]*\\s*\\(/,\n // const varName = anyFunction(\n /const\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*=\\s*[a-zA-Z_$][a-zA-Z0-9_$]*\\s*\\(/,\n // export let varName = anyFunction(\n /export\\s+let\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*=\\s*[a-zA-Z_$][a-zA-Z0-9_$]*\\s*\\(/,\n // let varName = anyFunction(\n /let\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*=\\s*[a-zA-Z_$][a-zA-Z0-9_$]*\\s*\\(/,\n // export var varName = anyFunction(\n /export\\s+var\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*=\\s*[a-zA-Z_$][a-zA-Z0-9_$]*\\s*\\(/,\n // var varName = anyFunction(\n /var\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*=\\s*[a-zA-Z_$][a-zA-Z0-9_$]*\\s*\\(/,\n ];\n\n for (const pattern of patterns) {\n const match = trimmed.match(pattern);\n if (match && match[1]) {\n return match[1];\n }\n }\n\n return undefined;\n}\n\n/**\n * Adds an entry to the cache with LRU eviction\n */\nfunction cacheInference(key: string, value: string | undefined): void {\n // If cache is full, remove oldest entry (first entry in Map)\n if (inferenceCache.size >= MAX_CACHE_SIZE) {\n const firstKey = inferenceCache.keys().next().value;\n if (firstKey) {\n inferenceCache.delete(firstKey);\n }\n }\n\n inferenceCache.set(key, value);\n}\n\n/**\n * Main entry point: Attempts to infer the variable name from the call stack\n *\n * This function:\n * 1. Captures the call stack\n * 2. Parses it to find where trace() was called (file + line)\n * 3. Reads that line from the source file\n * 4. Extracts the variable name using regex\n *\n * Returns undefined if inference fails at any step (graceful degradation).\n * Results are cached to avoid repeated file I/O.\n *\n * @returns The inferred variable name, or undefined if inference failed\n */\nexport function inferVariableNameFromCallStack(): string | undefined {\n try {\n // Capture stack trace\n const stack = captureStackTrace();\n\n // Parse stack to find trace() call location\n const callLocation = parseCallLocation(stack);\n if (!callLocation) {\n return undefined;\n }\n\n // Check cache\n const cacheKey = `${callLocation.file}:${callLocation.line}`;\n if (inferenceCache.has(cacheKey)) {\n return inferenceCache.get(cacheKey);\n }\n\n // Read source line\n const sourceLine = readSourceLine(callLocation.file, callLocation.line);\n if (!sourceLine) {\n return undefined;\n }\n\n // Extract variable name\n const variableName = extractVariableName(sourceLine);\n\n // Cache result (even if undefined, to avoid repeated failed attempts)\n cacheInference(cacheKey, variableName);\n\n return variableName;\n } catch {\n // Graceful degradation - don't break the app if inference fails\n return undefined;\n }\n}\n\n/**\n * Clears the inference cache (useful for testing)\n */\nexport function clearInferenceCache(): void {\n inferenceCache.clear();\n}\n","/**\n * Functional API for non-class code\n *\n * Three approaches for different use cases:\n * 1. trace() - Zero-ceremony HOF for single functions\n * 2. withTracing() - Middleware-style composable wrapper\n * 3. instrument() - Batch auto-instrumentation for modules\n *\n * @example trace() - Single function\n * ```typescript\n * export const createUser = trace(async (data) => {\n * getActiveTraceContext()?.setAttribute('user.id', data.id)\n * return await db.users.create(data)\n * })\n * ```\n *\n * @example withTracing() - Composable middleware\n * ```typescript\n * export const createUser = withTracing({\n * name: 'user.create'\n * })(ctx => async (data) => {\n * ctx.setAttribute('user.id', data.id)\n * return await db.users.create(data)\n * })\n * ```\n *\n * @example instrument() - Batch instrumentation\n * ```typescript\n * export default instrument({\n * createUser: async (data) => { },\n * updateUser: async (id, data) => { }\n * }, { serviceName: 'user' })\n * ```\n */\n\nimport {\n SpanStatusCode,\n trace as otelTrace,\n context,\n propagation,\n type Span,\n type Counter,\n type Histogram,\n type Attributes,\n} from '@opentelemetry/api';\nimport { getConfig } from './config';\nimport { getConfig as getInitConfig, getSdk } from './init';\nimport { getForceFlushableProvider } from './tracer-provider';\nimport {\n type Sampler,\n type SamplingContext,\n AlwaysSampler,\n AUTOTEL_SAMPLING_TAIL_KEEP,\n AUTOTEL_SAMPLING_TAIL_EVALUATED,\n AUTOTEL_SAMPLING_RATE,\n} from './sampling';\nimport { getEventQueue } from './track';\nimport type { TraceContext } from './trace-context';\nimport {\n createTraceContext,\n getActiveContextWithBaggage,\n getContextStorage,\n} from './trace-context';\nimport { setSpanName } from './trace-helpers';\nimport { runInOperationContext } from './operation-context';\nimport { inferVariableNameFromCallStack } from './variable-name-inference';\n\n/**\n * Complete trace context containing trace identifiers and span methods\n *\n * The ctx parameter in trace() functions provides:\n * - traceId, spanId, correlationId from the active span\n * - Span manipulation methods (setAttribute, setAttributes, setStatus, recordException)\n *\n * For custom context, access it directly in your functions (standard OpenTelemetry pattern).\n *\n * @example\n * ```typescript\n * import { trace } from 'autotel'\n *\n * export const createUser = withTracing({})((ctx) => async (data: CreateUserData) => {\n * // Get custom context directly (standard OTel approach)\n * const userId = getCurrentUserId()\n * const tenantId = getCurrentTenant()\n *\n * // Use ctx for span operations and trace IDs\n * ctx.setAttribute('user.id', data.id)\n * ctx.setAttribute('user.tenant', tenantId)\n * console.log(ctx.traceId) // Trace IDs available\n * })\n * ```\n */\nexport type { TraceContext } from './trace-context';\n\nlet unknownSpanNameWarningEmitted = false;\n\ntype WrappedFunction<TArgs extends unknown[], TReturn> = (\n ...args: TArgs\n) => TReturn | Promise<TReturn>;\n\nfunction resolveVariableName(\n named: InstrumentableFunction,\n variableName?: string,\n): string | undefined {\n const suppliedFunctionName = inferFunctionName(named);\n const callStackVariableName = suppliedFunctionName\n ? undefined\n : inferVariableNameFromCallStack();\n return variableName || suppliedFunctionName || callStackVariableName;\n}\n\n/**\n * Wrap an explicit context factory `(ctx) => (...args) => result`.\n * Used by {@link withTracing}; the input is a factory by contract, so there is\n * no plain-vs-factory detection. The factory is never invoked at construction\n * time — only when the wrapper is called.\n */\nfunction wrapFactoryWithTracing<TArgs extends unknown[], TReturn>(\n factory: (\n ctx: TraceContext,\n ) => (...args: TArgs) => TReturn | Promise<TReturn>,\n options: TracingOptions<TArgs, TReturn>,\n variableName?: string,\n): WrappedFunction<TArgs, TReturn> {\n const effectiveVariableName = resolveVariableName(\n factory as InstrumentableFunction,\n variableName,\n );\n return wrapWithTracingSync(\n factory,\n options,\n effectiveVariableName,\n ) as WrappedFunction<TArgs, TReturn>;\n}\n\n/**\n * Wrap a plain function `(...args) => result`. Used by {@link trace} and\n * {@link instrument}: the function receives its real arguments and no context\n * is injected. Reach the active span via {@link getActiveTraceContext} inside\n * the body (or any helper it calls).\n */\nfunction wrapPlainWithTracing<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => TReturn | Promise<TReturn>,\n options: TracingOptions<TArgs, TReturn>,\n variableName?: string,\n): WrappedFunction<TArgs, TReturn> {\n const effectiveVariableName = resolveVariableName(\n fn as InstrumentableFunction,\n variableName,\n );\n const factory = (_ctx: TraceContext) => fn;\n return wrapWithTracingSync(\n factory,\n options,\n effectiveVariableName,\n ) as WrappedFunction<TArgs, TReturn>;\n}\n\n/**\n * Common options for functional tracing\n */\nexport interface TracingOptions<\n TArgs extends unknown[] = unknown[],\n TReturn = unknown,\n> {\n /**\n * Span name (highest priority)\n * If provided, this is used as the span name\n */\n name?: string;\n\n /**\n * Service name (used to compose final span name)\n * If name not provided, span name becomes: ${serviceName}.${functionName}\n */\n serviceName?: string;\n\n /**\n * Sampling strategy\n * @default AlwaysSampler\n */\n sampler?: Sampler;\n\n /**\n * Enable metrics collection (counter, histogram)\n * @default false\n */\n withMetrics?: boolean;\n\n /**\n * Extract attributes from function arguments\n */\n attributesFromArgs?: (args: TArgs) => Record<string, unknown>;\n\n /**\n * Extract attributes from function result\n */\n attributesFromResult?: (result: TReturn) => Record<string, unknown>;\n\n /**\n * Capture the function arguments onto the span as `autotel.input`\n * (JSON, truncated). One arg is captured directly; multiple are captured as\n * an array. Off by default — opt in per call. Tools (visualizers, devtools)\n * read this alongside `ai.toolCall.args` to show function I/O uniformly.\n * Avoid on args with secrets/PII, or pair with a redacting processor.\n */\n captureInput?: boolean;\n\n /**\n * Capture the function return value onto the span as `autotel.output`\n * (JSON, truncated). Off by default. Same caveats as {@link captureInput}.\n */\n captureOutput?: boolean;\n\n /**\n * Start a new root span instead of creating a child\n * Useful for serverless entry points\n * @default false\n */\n startNewRoot?: boolean;\n\n /**\n * Flush events queue when span ends\n * Only flushes on root spans (to avoid excessive flushing)\n * @default true\n */\n flushOnRootSpanEnd?: boolean;\n\n /**\n * Span kind for semantic convention compliance\n * Used for messaging (PRODUCER/CONSUMER), HTTP (CLIENT/SERVER), etc.\n * @default SpanKind.INTERNAL\n */\n spanKind?: import('@opentelemetry/api').SpanKind;\n\n /**\n * Classify a thrown value as a real error. Return `false` to treat the throw\n * as expected control flow: the span is marked OK, no exception is recorded,\n * and the value is rethrown untouched. Use this for framework control-flow\n * signals that propagate via `throw` but are not failures — e.g. TanStack\n * Router / Next.js `redirect()` and `notFound()`.\n * @default every throw is treated as an error\n */\n isError?: (error: unknown) => boolean;\n}\n\n/**\n * Options for instrument() batch instrumentation\n */\nexport interface InstrumentOptions<\n T extends Record<string, AnyInstrumentable> = Record<\n string,\n AnyInstrumentable\n >,\n> extends TracingOptions {\n /** Object whose function properties should be instrumented */\n functions: T;\n /**\n * Per-function configuration overrides\n */\n overrides?: Record<string, Partial<TracingOptions>>;\n\n /**\n * Functions to skip (won't be instrumented)\n * Supports:\n * - String keys: 'functionName'\n * - RegExp: /^_internal/\n * - Predicate: (key, fn) => boolean\n *\n * By default, functions starting with _ are skipped\n */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n skip?: (string | RegExp | ((key: string, fn: Function) => boolean))[];\n}\n\n/**\n * Options for instrumenting one function with an explicit stable key.\n */\nexport interface SingleInstrumentOptions<\n TFunction extends AnyInstrumentable = AnyInstrumentable,\n> extends TracingOptions {\n /** Stable function key used for span naming */\n key: string;\n /** Function to instrument */\n fn: TFunction;\n}\n\n// Maximum error message length to prevent span bloat\nconst MAX_ERROR_MESSAGE_LENGTH = 500;\n\nfunction createDummyCtx<\n TBaggage extends Record<string, unknown> | undefined = undefined,\n>(): TraceContext<TBaggage> {\n // `recordException` / `addEvent` are no-op shims kept for the same\n // compatibility window as `createTraceContext` (see trace-context.ts).\n return {\n traceId: '',\n spanId: '',\n correlationId: '',\n setAttribute: () => {},\n setAttributes: () => {},\n setStatus: () => {},\n recordException: () => {},\n addEvent: () => {},\n addLink: () => {},\n addLinks: () => {},\n updateName: () => {},\n isRecording: () => false,\n getBaggage: () => {},\n setBaggage: () => '',\n deleteBaggage: () => {},\n getAllBaggage: () => new Map(),\n } as unknown as TraceContext<TBaggage>;\n}\n\n/** Attribute keys for opt-in function I/O capture (see TracingOptions). */\nconst AUTOTEL_INPUT_ATTR = 'autotel.input';\nconst AUTOTEL_OUTPUT_ATTR = 'autotel.output';\nconst CAPTURE_MAX_CHARS = 4096;\n\n/** JSON-serialize a captured value, defensively (truncate, swallow cycles). */\nfunction serializeCapture(value: unknown): string | undefined {\n if (value === undefined) return undefined;\n try {\n const json = typeof value === 'string' ? value : JSON.stringify(value);\n if (json === undefined) return undefined;\n return json.length > CAPTURE_MAX_CHARS\n ? `${json.slice(0, CAPTURE_MAX_CHARS)}…[truncated]`\n : json;\n } catch {\n return undefined;\n }\n}\n\n/** `autotel.input` from args (single arg captured directly, else the array). */\nfunction captureInputAttrs(\n args: unknown[],\n enabled?: boolean,\n): Record<string, unknown> {\n if (!enabled) return {};\n const s = serializeCapture(args.length === 1 ? args[0] : args);\n return s === undefined ? {} : { [AUTOTEL_INPUT_ATTR]: s };\n}\n\n/** `autotel.output` from the return value. */\nfunction captureOutputAttrs(\n result: unknown,\n enabled?: boolean,\n): Record<string, unknown> {\n if (!enabled) return {};\n const s = serializeCapture(result);\n return s === undefined ? {} : { [AUTOTEL_OUTPUT_ATTR]: s };\n}\n\n// Symbol to prevent double-instrumentation (idempotency flag)\nconst INSTRUMENTED_SYMBOL = Symbol.for('autotel.functional.instrumented');\n\ntype InstrumentedFlag = {\n [INSTRUMENTED_SYMBOL]?: true;\n};\n\nfunction hasInstrumentationFlag(value: unknown): value is InstrumentedFlag {\n return (\n (typeof value === 'function' || typeof value === 'object') &&\n value !== null &&\n Boolean((value as InstrumentedFlag)[INSTRUMENTED_SYMBOL])\n );\n}\n\n/**\n * Truncate error message to prevent span bloat\n */\nfunction truncateErrorMessage(message: string): string {\n if (message.length <= MAX_ERROR_MESSAGE_LENGTH) {\n return message;\n }\n return `${message.slice(0, MAX_ERROR_MESSAGE_LENGTH)}... (truncated)`;\n}\n\n/** Per-invocation state the terminal span handlers close over. */\ninterface SpanFinalizeContext {\n span: Span;\n spanName: string;\n duration: number;\n callCounter?: Counter;\n durationHistogram?: Histogram;\n handleTailSampling: (\n success: boolean,\n duration: number,\n error?: Error,\n ) => void;\n /** Extra attributes to merge (e.g. captured args); absent on immediate-exec paths. */\n extraAttributes?: Attributes;\n}\n\n/**\n * Terminal handling for a value thrown by a traced function. Shared by all four\n * `trace()` execution paths (immediate + wrapper, sync + async) so the outcome\n * rules live in exactly one place. Ends the span; the caller flushes (await/void)\n * and rethrows.\n *\n * If `isError` classifies the throw as expected control flow — e.g. a framework\n * `redirect()` / `notFound()` signal — it is recorded as a success outcome with\n * an OK status and no exception. Otherwise it is recorded as an error.\n */\nfunction finalizeThrownSpan(\n error: unknown,\n isError: ((error: unknown) => boolean) | undefined,\n ctx: SpanFinalizeContext,\n): void {\n const {\n span,\n spanName,\n duration,\n callCounter,\n durationHistogram,\n handleTailSampling,\n extraAttributes,\n } = ctx;\n\n const baseAttributes: Attributes = {\n ...extraAttributes,\n 'operation.name': spanName,\n 'code.function': spanName,\n 'operation.duration': duration,\n };\n\n if (isError && !isError(error)) {\n callCounter?.add(1, { operation: spanName, status: 'success' });\n durationHistogram?.record(duration, {\n operation: spanName,\n status: 'success',\n });\n span.setStatus({ code: SpanStatusCode.OK });\n span.setAttributes({ ...baseAttributes, 'operation.success': true });\n handleTailSampling(true, duration);\n span.end();\n return;\n }\n\n callCounter?.add(1, { operation: spanName, status: 'error' });\n durationHistogram?.record(duration, { operation: spanName, status: 'error' });\n\n const truncatedMessage = truncateErrorMessage(\n error instanceof Error ? error.message : 'Unknown error',\n );\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: truncatedMessage });\n span.setAttributes({\n ...baseAttributes,\n 'operation.success': false,\n error: true,\n 'exception.type': error instanceof Error ? error.constructor.name : 'Error',\n 'exception.message': truncatedMessage,\n });\n if (error instanceof Error && error.stack) {\n span.setAttribute(\n 'exception.stack',\n error.stack.slice(0, MAX_ERROR_MESSAGE_LENGTH),\n );\n }\n const thrown = error instanceof Error ? error : new Error(String(error));\n span.recordException(thrown);\n // Samplers read result.error, so hand them a real Error rather than\n // whatever the code threw.\n handleTailSampling(false, duration, thrown);\n span.end();\n}\n\ntype InstrumentableFunction<\n TArgs extends unknown[] = unknown[],\n TReturn = unknown,\n> = ((...args: TArgs) => TReturn | Promise<TReturn>) & {\n displayName?: string;\n name?: string;\n};\n\n/**\n * Constraint alias for `instrument()` and friends. `never[]` parameters make\n * every concretely-typed function (e.g. `(name: string) => Promise<User>`)\n * satisfy the constraint under `strictFunctionTypes` without resorting to\n * `any`. Use ONLY in constraint positions — the concrete `T` is still\n * inferred from the actual argument, so call-site argument and return types\n * are fully preserved.\n */\ntype AnyInstrumentable = ((...args: never[]) => unknown) & {\n displayName?: string;\n name?: string;\n};\n\n/**\n * Try to infer function name from function properties\n * Checks for displayName, name, or other metadata that might be set\n */\nfunction inferFunctionName<\n TArgs extends unknown[] = unknown[],\n TReturn = unknown,\n>(fn: InstrumentableFunction<TArgs, TReturn>): string | undefined {\n // Check for displayName property (sometimes set by bundlers)\n const displayName = (fn as { displayName?: string }).displayName;\n if (displayName) {\n return displayName;\n }\n\n // Check function.name (works for named functions and modern arrow function assignment)\n // Note: Empty string is falsy, so this handles both undefined and ''\n if (fn.name && fn.name !== 'anonymous' && fn.name !== '') {\n return fn.name;\n }\n\n // Try to extract name from function source (for function declarations)\n const source = Function.prototype.toString.call(fn);\n const match = source.match(/function\\s+([^(\\s]+)/);\n if (match && match[1] && match[1] !== 'anonymous') {\n return match[1];\n }\n\n return undefined;\n}\n\n/**\n * Determine span name using priority:\n * 1. Explicit name option\n * 2. serviceName + functionName\n * 3. Inferred from function/variable name (including stack trace fallback)\n * 4. Fallback to 'unknown'\n */\nfunction getSpanName<TArgs extends unknown[], TReturn>(\n options: TracingOptions<TArgs, TReturn>,\n fn: InstrumentableFunction<TArgs, TReturn>,\n variableName?: string,\n): string {\n // 1. Explicit name\n if (options.name) {\n return options.name;\n }\n\n // 2. Try variable name, function name, or function properties\n let fnName = variableName || inferFunctionName(fn);\n\n // Default to 'anonymous' if still no name\n fnName = fnName || 'anonymous';\n\n // 2. serviceName + functionName\n if (options.serviceName) {\n return `${options.serviceName}.${fnName}`;\n }\n\n // 3. Inferred from function name\n if (fnName && fnName !== 'anonymous') {\n return fnName;\n }\n\n // 4. Fallback\n const initConfig = getInitConfig();\n if (\n typeof process !== 'undefined' &&\n process.env.NODE_ENV !== 'production' &&\n !unknownSpanNameWarningEmitted &&\n initConfig?.logger?.warn\n ) {\n unknownSpanNameWarningEmitted = true;\n initConfig.logger.warn(\n {},\n '[autotel] Span name resolved to \"unknown\". Pass an explicit name, for example trace(\"operation.name\", fn).',\n );\n }\n return 'unknown';\n}\n\n/**\n * Check if function should be skipped\n */\nfunction shouldSkip(\n key: string,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n fn: Function,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n skip?: (string | RegExp | ((key: string, fn: Function) => boolean))[],\n): boolean {\n // Default: skip functions starting with _\n if (key.startsWith('_')) {\n return true;\n }\n\n if (!skip || skip.length === 0) {\n return false;\n }\n\n for (const rule of skip) {\n if (typeof rule === 'string' && key === rule) {\n return true;\n } else if (rule instanceof RegExp && rule.test(key)) {\n return true;\n } else if (typeof rule === 'function' && rule(key, fn)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Get current trace context value (internal helper)\n *\n * Returns base context (trace IDs) + span methods from the active span.\n */\nfunction getCtxValue<\n TBaggage extends Record<string, unknown> | undefined = undefined,\n>(): TraceContext<TBaggage> | null {\n const activeSpan = otelTrace.getActiveSpan();\n if (!activeSpan) return null;\n\n // Use shared utility to create trace context\n return createTraceContext<TBaggage>(activeSpan);\n}\n\n/**\n * Get the autotel {@link TraceContext} for the currently active span.\n *\n * This is the ambient accessor for the functional API: instead of threading a\n * `ctx` parameter through a factory, call this inside any traced function (or a\n * helper it calls) to reach `setAttribute`, `setUser`, `getBaggage`, and the\n * rest of the context surface. Returns `undefined` when no span is active.\n *\n * @example\n * ```typescript\n * const getUser = trace('getUser', async (id: string) => {\n * getActiveTraceContext()?.setAttribute('user.id', id);\n * return db.users.find(id);\n * });\n * ```\n *\n * @see getActiveSpan for the raw OpenTelemetry span\n * @see getRequestLogger which reads the active context when called with no args\n */\nexport function getActiveTraceContext<\n TBaggage extends Record<string, unknown> | undefined = undefined,\n>(): TraceContext<TBaggage> | undefined {\n return getCtxValue<TBaggage>() ?? undefined;\n}\n\n/**\n * Context object that lazily evaluates the active span on property access\n *\n * Access trace context directly without function call syntax.\n *\n * @example\n * ```typescript\n * import { trace, ctx } from 'autotel'\n *\n * export const createUser = trace(async (data) => {\n * // Direct property access - no function call!\n * if (ctx.traceId) {\n * ctx.setAttribute('user.id', data.id)\n * console.log('Trace:', ctx.traceId)\n * }\n * })\n * ```\n */\nexport const ctx = new Proxy({} as TraceContext, {\n get(_target, prop) {\n const ctxValue = getCtxValue();\n if (!ctxValue) {\n return;\n }\n return ctxValue[prop as keyof typeof ctxValue];\n },\n\n has(_target, prop) {\n const ctxValue = getCtxValue();\n if (!ctxValue) {\n return false;\n }\n return prop in ctxValue;\n },\n\n ownKeys() {\n const ctxValue = getCtxValue();\n if (!ctxValue) {\n return [];\n }\n return Object.keys(ctxValue);\n },\n\n getOwnPropertyDescriptor(_target, prop) {\n const ctxValue = getCtxValue();\n if (!ctxValue) {\n return;\n }\n return Object.getOwnPropertyDescriptor(ctxValue, prop);\n },\n});\n\n/**\n * Build the root-operation flush policy once and reuse it for wrapped and\n * immediate execution. Async operations await this function; sync operations\n * trigger it without blocking.\n */\nfunction createRootTelemetryFlusher(\n options: Pick<TracingOptions, 'flushOnRootSpanEnd'>,\n isRootSpan: boolean,\n): () => Promise<void> {\n const initConfig = getInitConfig();\n const shouldFlush =\n options.flushOnRootSpanEnd ?? initConfig?.flushOnRootSpanEnd ?? true;\n const shouldFlushSpans = initConfig?.forceFlushOnShutdown ?? false;\n\n return async () => {\n if (!shouldFlush || !isRootSpan) return;\n\n try {\n const queue = getEventQueue();\n if (queue && queue.size() > 0) {\n await queue.flush();\n }\n\n if (shouldFlushSpans) {\n const tracerProvider = getForceFlushableProvider(getSdk());\n await tracerProvider?.forceFlush();\n }\n } catch (error) {\n const logger = getInitConfig()?.logger;\n logger?.error?.(\n { err: error instanceof Error ? error : undefined },\n `[autotel] Auto-flush failed${error instanceof Error ? '' : `: ${String(error)}`}`,\n );\n }\n };\n}\n\n/**\n * Give every root operation its own baggage context without replacing a\n * caller's existing scope. AsyncLocalStorage keeps the scope alive until an\n * async result settles and restores the previous store afterwards.\n */\nfunction runWithTraceContextStorage<TResult>(fn: () => TResult): TResult {\n const storage = getContextStorage();\n if (storage.getStore()) return fn();\n return storage.run({ value: context.active() }, fn);\n}\n\n/**\n * Core tracing wrapper for sync functions (internal implementation)\n */\nfunction wrapWithTracingSync<TArgs extends unknown[], TReturn>(\n fnFactory: (\n ctx: TraceContext,\n ) => (...args: TArgs) => TReturn | Promise<TReturn>,\n options: TracingOptions<TArgs, TReturn>,\n variableName?: string,\n): WrappedFunction<TArgs, TReturn> {\n // Idempotency check: if already instrumented, return as-is\n if (hasInstrumentationFlag(fnFactory)) {\n // If already instrumented, we need to extract the original factory\n // For now, we'll just proceed - this edge case is handled by the wrapped function check\n }\n\n const config = getConfig();\n const tracer = config.tracer;\n const meter = config.meter;\n // Annotate as Sampler so the optional hooks stay visible. Inference would\n // narrow to AlwaysSampler and hide them behind `in` checks.\n const sampler: Sampler = options.sampler || new AlwaysSampler();\n\n const spanName = getSpanName(\n options,\n fnFactory as unknown as InstrumentableFunction<TArgs, TReturn>,\n variableName,\n );\n\n // Metrics setup (if enabled)\n const callCounter = options.withMetrics\n ? meter.createCounter(`${spanName}.calls`, {\n description: `Call count for ${spanName}`,\n unit: '1',\n })\n : undefined;\n\n const durationHistogram = options.withMetrics\n ? meter.createHistogram(`${spanName}.duration`, {\n description: `Duration for ${spanName}`,\n unit: 'ms',\n })\n : undefined;\n\n // Return wrapped function\n function wrappedFunction(\n this: unknown,\n ...args: TArgs\n ): TReturn | Promise<TReturn> {\n const samplingContext: SamplingContext = {\n operationName: spanName,\n args,\n metadata: {},\n };\n\n const shouldSample = sampler.shouldSample(samplingContext);\n // Read the rate next to the decision that produced it: a windowed sampler\n // can move on to a new rate before the span closes.\n const sampleRate = sampler.sampleRate?.(samplingContext);\n const needsTailSampling = sampler.needsTailSampling?.() ?? false;\n\n // If not sampling and no tail sampling, execute without tracing\n if (!shouldSample && !needsTailSampling) {\n const fn = fnFactory(createDummyCtx());\n return fn.call(this, ...args);\n }\n\n const startTime = performance.now();\n\n const isRootSpan =\n options.startNewRoot || otelTrace.getActiveSpan() === undefined;\n const flushRootTelemetry = createRootTelemetryFlusher(options, isRootSpan);\n\n // Build span options including root and kind\n const spanOptions: import('@opentelemetry/api').SpanOptions = {};\n if (options.startNewRoot) {\n spanOptions.root = true;\n }\n if (options.spanKind !== undefined) {\n spanOptions.kind = options.spanKind;\n }\n\n const parentContext = getActiveContextWithBaggage();\n return tracer.startActiveSpan(\n spanName,\n spanOptions,\n parentContext,\n (span) => {\n // Run within operation context so events can auto-capture operation.name\n return runInOperationContext(spanName, () =>\n runWithTraceContextStorage(() => {\n let shouldKeepSpan = true;\n\n // Store span name for trace context helpers\n setSpanName(span, spanName);\n\n // Only worth recording when the sampler actually dropped events.\n if (sampleRate !== undefined && sampleRate > 1) {\n span.setAttribute(AUTOTEL_SAMPLING_RATE, sampleRate);\n }\n\n // Create trace context for this span using shared utility\n const ctxValue = createTraceContext(span);\n\n // Get the actual function from the factory\n const fn = fnFactory(ctxValue);\n\n // Extract attributes only when actually tracing\n // This avoids expensive preprocessing when sampling rejects the trace\n const argsAttributes: Attributes = {\n ...captureInputAttrs(args, options.captureInput),\n ...(options.attributesFromArgs\n ? options.attributesFromArgs(args)\n : {}),\n } as Attributes;\n\n const handleTailSampling = (\n success: boolean,\n duration: number,\n error?: Error,\n ) => {\n if (needsTailSampling && sampler.shouldKeepTrace) {\n shouldKeepSpan = sampler.shouldKeepTrace(samplingContext, {\n success,\n duration,\n error,\n });\n span.setAttribute(AUTOTEL_SAMPLING_TAIL_KEEP, shouldKeepSpan);\n span.setAttribute(AUTOTEL_SAMPLING_TAIL_EVALUATED, true);\n }\n };\n\n const onSuccess = (result: TReturn) => {\n const duration = performance.now() - startTime;\n\n callCounter?.add(1, {\n operation: spanName,\n status: 'success',\n });\n\n durationHistogram?.record(duration, {\n operation: spanName,\n status: 'success',\n });\n\n const resultAttributes = {\n ...captureOutputAttrs(result, options.captureOutput),\n ...(options.attributesFromResult\n ? options.attributesFromResult(result)\n : {}),\n };\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.setAttributes({\n ...argsAttributes,\n ...resultAttributes,\n 'operation.name': spanName,\n 'code.function': spanName,\n 'operation.duration': duration,\n 'operation.success': true,\n });\n\n handleTailSampling(true, duration);\n\n span.end();\n return result;\n };\n\n const onError = (error: unknown): never => {\n finalizeThrownSpan(error, options.isError, {\n span,\n spanName,\n duration: performance.now() - startTime,\n callCounter,\n durationHistogram,\n handleTailSampling,\n extraAttributes: argsAttributes,\n });\n throw error;\n };\n\n try {\n callCounter?.add(1, {\n operation: spanName,\n status: 'started',\n });\n\n const result = context.with(getActiveContextWithBaggage(), () =>\n fn.call(this, ...args),\n );\n\n if (result instanceof Promise) {\n return result.then(\n async (value) => {\n const completed = onSuccess(value);\n await flushRootTelemetry();\n return completed;\n },\n async (error) => {\n try {\n return onError(error);\n } finally {\n await flushRootTelemetry();\n }\n },\n );\n }\n\n const completed = onSuccess(result);\n void flushRootTelemetry();\n return completed;\n } catch (error) {\n try {\n return onError(error);\n } finally {\n void flushRootTelemetry();\n }\n }\n }),\n );\n },\n );\n }\n\n // Mark as instrumented to prevent double-wrapping\n (wrappedFunction as InstrumentedFlag)[INSTRUMENTED_SYMBOL] = true;\n\n Object.defineProperty(wrappedFunction, 'name', {\n value: variableName || 'trace',\n configurable: true,\n });\n\n return wrappedFunction as WrappedFunction<TArgs, TReturn>;\n}\n\n/**\n * Approach 1: trace() - Zero-ceremony HOF\n *\n * Wrap a plain function with automatic tracing. The function receives its real\n * arguments; no context parameter is injected. Use\n * {@link getActiveTraceContext} inside the function, or use {@link withTracing}\n * for the explicit `(ctx) => (...args) => result` factory form.\n *\n * @example Auto-inferred name - Plain function\n * ```typescript\n * export const createUser = trace(async (data) => {\n * return await db.users.create(data)\n * })\n * // → Traced as \"createUser\"\n * ```\n *\n * @example Ambient context access\n * ```typescript\n * export const createUser = trace(async (data) => {\n * getActiveTraceContext()?.setAttribute('user.id', data.id)\n * return await db.users.create(data)\n * })\n * ```\n *\n * @example Custom name - Plain function\n * ```typescript\n * export const createUser = trace('user.create', async (data) => {\n * return await db.users.create(data)\n * })\n * // → Traced as \"user.create\"\n * ```\n *\n * @example Explicit factory context with withTracing()\n * ```typescript\n * export const createUser = withTracing({ name: 'user.create' })((ctx) => async (data) => {\n * ctx.setAttribute('user.id', data.id)\n * return await db.users.create(data)\n * })\n * ```\n *\n * @example Full options - Plain function\n * ```typescript\n * export const createUser = trace({\n * name: 'user.create',\n * sampler: new AdaptiveSampler(),\n * withMetrics: true\n * }, async (data) => {\n * return await db.users.create(data)\n * })\n * ```\n *\n */\n// Plain-function overloads. `trace()` always wraps a plain function that\n// receives its real arguments; it never injects a context parameter and never\n// inspects the function. Reach the active span via getActiveTraceContext()\n// inside the body. For the explicit `(ctx) => (args) => result` factory form,\n// use withTracing(). `TReturn` captures the return type verbatim, so async\n// functions infer `(...args) => Promise<...>` with no separate overload.\n\n// trace(fn)\nexport function trace<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n// trace(name, fn)\nexport function trace<TArgs extends unknown[], TReturn>(\n name: string,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n// trace(options, fn)\nexport function trace<TArgs extends unknown[], TReturn>(\n options: TracingOptions<TArgs, TReturn>,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n// Implementation\nexport function trace<TArgs extends unknown[] = unknown[], TReturn = unknown>(\n fnOrNameOrOptions:\n | ((...args: TArgs) => TReturn)\n | ((...args: TArgs) => Promise<TReturn>)\n | string\n | TracingOptions<TArgs, TReturn>,\n maybeFn?:\n ((...args: TArgs) => TReturn) | ((...args: TArgs) => Promise<TReturn>),\n): WrappedFunction<TArgs, TReturn> {\n // trace(fn) - the function is plain; it receives its real arguments and no\n // context is injected. Reach the active span via getActiveTraceContext().\n if (typeof fnOrNameOrOptions === 'function') {\n return wrapPlainWithTracing(\n fnOrNameOrOptions as (...args: TArgs) => TReturn,\n {} as TracingOptions<TArgs, TReturn>,\n );\n }\n\n // trace(name, fn) or trace(options, fn)\n if (!maybeFn) {\n throw new Error('trace(name|options, fn): fn is required');\n }\n\n const options: TracingOptions<TArgs, TReturn> =\n typeof fnOrNameOrOptions === 'string'\n ? ({ name: fnOrNameOrOptions } as TracingOptions<TArgs, TReturn>)\n : fnOrNameOrOptions;\n\n return wrapPlainWithTracing(maybeFn as (...args: TArgs) => TReturn, options);\n}\n\n/**\n * Approach 2: withTracing() - Middleware-style composable wrapper\n *\n * Returns a HOF that wraps functions with tracing.\n * Perfect for composition and reusable configuration.\n *\n * @example Standard usage\n * ```typescript\n * export const createUser = withTracing({\n * name: 'user.create'\n * })(ctx => async (data) => {\n * ctx.setAttribute('user.id', data.id)\n * return await db.users.create(data)\n * })\n * ```\n *\n * @example Composable\n * ```typescript\n * const tracer = withTracing({ serviceName: 'user' })\n *\n * export const createUser = tracer(ctx => async (data) => { })\n * export const updateUser = tracer(ctx => async (id, data) => { })\n * ```\n *\n * @example With other middleware\n * ```typescript\n * export const createUser = compose(\n * withAuth({ role: 'admin' }),\n * withTracing({ name: 'user.create' }),\n * withRateLimit({ max: 100 })\n * )(ctx => async (data) => { })\n * ```\n */\nexport function withTracing<\n TCfgArgs extends unknown[] = unknown[],\n TCfgReturn = unknown,\n>(options: TracingOptions<TCfgArgs, TCfgReturn> = {}) {\n return <TArgs extends TCfgArgs, TReturn extends TCfgReturn>(\n fnFactory: (\n ctx: TraceContext,\n ) => (...args: TArgs) => TReturn | Promise<TReturn>,\n ): WrappedFunction<TArgs, TReturn> =>\n wrapFactoryWithTracing<TArgs, TReturn>(fnFactory, options);\n}\n\n/**\n * Approach 3: instrument() - Batch auto-instrumentation\n *\n * Instrument an entire module/object at once.\n * Closest to @Instrumented decorator pattern.\n *\n * @example Basic usage\n * ```typescript\n * export default instrument({\n * functions: {\n * createUser: async (data) => { },\n * updateUser: async (id, data) => { },\n * deleteUser: async (id) => { }\n * },\n * serviceName: 'user',\n * sampler: new AdaptiveSampler()\n * })\n * // → Traced as \"user.createUser\", \"user.updateUser\", \"user.deleteUser\"\n * ```\n *\n * @example Per-function overrides\n * ```typescript\n * export default instrument({\n * functions: {\n * createUser: async (data) => { },\n * deleteUser: async (id) => { }\n * },\n * serviceName: 'user',\n * overrides: {\n * deleteUser: {\n * sampler: new AlwaysSampler(),\n * withMetrics: true\n * }\n * }\n * })\n * ```\n *\n * @example Skip functions\n * ```typescript\n * export default instrument({\n * functions: {\n * createUser: async (data) => { },\n * _internal: async () => { }, // Auto-skipped (_-prefix)\n * deleteUser: async (id) => { }\n * },\n * serviceName: 'user',\n * skip: [/^test/, (key) => key.includes('debug')]\n * })\n * ```\n */\nexport function instrument<TFunction extends AnyInstrumentable>(\n options: SingleInstrumentOptions<TFunction>,\n): TFunction;\nexport function instrument<T extends Record<string, AnyInstrumentable>>(\n options: InstrumentOptions<T>,\n): T;\nexport function instrument<\n T extends Record<string, AnyInstrumentable>,\n TFunction extends AnyInstrumentable,\n>(\n options: InstrumentOptions<T> | SingleInstrumentOptions<TFunction>,\n): T | TFunction {\n if (!options || typeof options !== 'object') {\n throw new TypeError(\n 'instrument: expected { key, fn } or { functions: { name: fn } }',\n );\n }\n\n if ('key' in options || 'fn' in options) {\n const { key, fn, ...tracingOptions } =\n options as SingleInstrumentOptions<TFunction>;\n if (typeof key !== 'string' || key.trim() === '') {\n throw new TypeError(\n 'instrument: \"key\" must be a non-empty string in the { key, fn } form',\n );\n }\n if (typeof fn !== 'function') {\n throw new TypeError(\n 'instrument: \"fn\" must be a function in the { key, fn } form',\n );\n }\n return wrapPlainWithTracing(fn, tracingOptions, key) as TFunction;\n }\n\n const { functions, ...tracingOptions } = options as InstrumentOptions<T>;\n if (!functions || typeof functions !== 'object') {\n throw new TypeError(\n 'instrument: expected { key, fn } or { functions: { name: fn } }',\n );\n }\n const instrumented: Partial<T> = {};\n\n for (const key of Object.keys(functions)) {\n const typedKey = key as keyof T;\n const fn = functions[typedKey];\n\n // Skip if not a function or undefined - just pass through the value\n if (!fn || typeof fn !== 'function') {\n instrumented[typedKey] = fn as T[typeof typedKey];\n continue;\n }\n\n // Only instrument own enumerable async functions\n // Check if should skip\n if (shouldSkip(key, fn, tracingOptions.skip)) {\n instrumented[typedKey] = fn as T[typeof typedKey];\n continue;\n }\n\n // Merge base options with per-function overrides\n const fnOptions: TracingOptions = {\n ...tracingOptions,\n ...tracingOptions.overrides?.[key],\n // If no explicit name, use key as function name\n name: tracingOptions.overrides?.[key]?.name,\n };\n\n // Bind function to original object to preserve 'this' context\n // This ensures methods can access state on the original object\n const boundFn = fn.bind(functions);\n\n // Convert plain function to factory pattern for trace()\n // For instrument(), we create a factory that ignores ctx and returns the original function\n const fnFactory = (ctx: TraceContext) => {\n void ctx;\n return boundFn;\n };\n\n // Wrap with tracing (sync or async based on implementation)\n instrumented[typedKey] = wrapFactoryWithTracing(\n fnFactory,\n fnOptions,\n key,\n ) as unknown as T[typeof typedKey];\n }\n\n return instrumented as T;\n}\n\n/**\n * Options for span() function\n */\nexport interface SpanOptions {\n /** Span name */\n name: string;\n /** Attributes to set on the span */\n attributes?: Record<string, string | number | boolean>;\n /** OpenTelemetry span kind */\n spanKind?: import('@opentelemetry/api').SpanKind;\n}\n\n/**\n * Execute a function within a named span\n *\n * Useful for adding tracing to specific code blocks without wrapping\n * the entire function. Supports both synchronous and asynchronous functions.\n *\n * Mirrors `trace()`: pass a span name as the first argument for the common\n * case, or full `SpanOptions` when you need to attach attributes.\n *\n * @example\n * ```typescript\n * // Name shorthand\n * await span('payment.charge', async (span) => {\n * await chargeCustomer(order);\n * })\n *\n * // Full options when attributes are needed\n * await span(\n * { name: 'payment.charge', attributes: { amount: order.total } },\n * async (span) => {\n * await chargeCustomer(order);\n * },\n * )\n *\n * // Sync\n * const total = span('calculateTotal', (span) => {\n * return items.reduce((sum, item) => sum + item.price, 0);\n * })\n * ```\n */\n// Overloads — sync first (more specific match), then async.\n// Each shape is offered with a string name OR a full SpanOptions object so\n// span() aligns with trace()'s argument flexibility.\nexport function span<T = unknown>(name: string, fn: (span: Span) => T): T;\nexport function span<T = unknown>(\n name: string,\n fn: (span: Span) => Promise<T>,\n): Promise<T>;\nexport function span<T = unknown>(\n options: SpanOptions,\n fn: (span: Span) => T,\n): T;\nexport function span<T = unknown>(\n options: SpanOptions,\n fn: (span: Span) => Promise<T>,\n): Promise<T>;\n// Implementation\nexport function span<T = unknown>(\n nameOrOptions: string | SpanOptions,\n fn: (span: Span) => T | Promise<T>,\n): T | Promise<T> {\n const options: SpanOptions =\n typeof nameOrOptions === 'string' ? { name: nameOrOptions } : nameOrOptions;\n const config = getConfig();\n const tracer = config.tracer;\n const { name, attributes, spanKind } = options;\n\n const executeSpan = (span: Span) => {\n // Run within operation context so events can auto-capture operation.name\n return runInOperationContext(name, () => {\n try {\n // Set attributes\n if (attributes) {\n for (const [key, value] of Object.entries(attributes)) {\n span.setAttribute(key, value);\n }\n }\n\n const result = fn(span);\n\n // Check if result is a Promise\n if (result instanceof Promise) {\n return result\n .then((resolved) => {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return resolved;\n })\n .catch((error) => {\n const errorMessage =\n error instanceof Error\n ? error.message.slice(0, MAX_ERROR_MESSAGE_LENGTH)\n : String(error).slice(0, MAX_ERROR_MESSAGE_LENGTH);\n\n span.setAttribute('error.message', errorMessage);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: errorMessage,\n });\n\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n span.end();\n throw error;\n });\n } else {\n // Synchronous function\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n }\n } catch (error) {\n // Synchronous error handling\n const errorMessage =\n error instanceof Error\n ? error.message.slice(0, MAX_ERROR_MESSAGE_LENGTH)\n : String(error).slice(0, MAX_ERROR_MESSAGE_LENGTH);\n\n span.setAttribute('error.message', errorMessage);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: errorMessage,\n });\n\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n span.end();\n throw error;\n }\n });\n };\n\n const parentContext = getActiveContextWithBaggage();\n const result = tracer.startActiveSpan(\n name,\n spanKind === undefined ? {} : { kind: spanKind },\n parentContext,\n executeSpan,\n );\n\n // tracer.startActiveSpan might return a Promise even for sync callbacks\n // Check if it's a Promise and handle accordingly\n if (result instanceof Promise) {\n return result;\n }\n\n return result as T;\n}\n\n/**\n * Options for withNewContext() function\n */\nexport interface WithNewContextOptions<T = unknown> {\n /** Function to execute in new root context */\n fn: () => Promise<T>;\n}\n\n/**\n * Execute a function in a new root context (prevents span propagation)\n *\n * Useful when you want to start a completely new trace without\n * parent-child relationships.\n *\n * @example\n * ```typescript\n * async function handleWebhook(payload: WebhookPayload) {\n * // This creates a new root trace, not connected to the HTTP request trace\n * await withNewContext({\n * fn: async () => {\n * await span('webhook.process', async () => {\n * await processWebhookPayload(payload)\n * })\n * }\n * })\n * }\n * ```\n */\nexport async function withNewContext<T = unknown>(\n options: WithNewContextOptions<T>,\n): Promise<T> {\n const { fn } = options;\n const config = getConfig();\n const tracer = config.tracer;\n\n // Start a new root span (breaks trace propagation)\n return tracer.startActiveSpan('root', { root: true }, async (span) => {\n try {\n const result = await fn();\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n span.setStatus({ code: SpanStatusCode.ERROR });\n throw error;\n } finally {\n span.end();\n }\n });\n}\n\n/**\n * Options for withBaggage() function\n */\nexport interface WithBaggageOptions<T = unknown> {\n /** Baggage entries to set (key-value pairs) */\n baggage: Record<string, string>;\n /** Function to execute with the updated baggage */\n fn: () => T | Promise<T>;\n}\n\n/**\n * Execute a function with updated baggage entries\n *\n * Baggage is immutable in OpenTelemetry, so this helper creates a new context\n * with the specified baggage entries and runs the function within that context.\n * All child spans created within the function will inherit the baggage.\n *\n * @example Setting baggage for downstream services\n * ```typescript\n * import { withTracing, withBaggage } from 'autotel';\n *\n * export const createOrder = withTracing({ name: 'order.create' })((ctx) => async (order: Order) => {\n * // Set baggage that will be propagated to downstream HTTP calls\n * return await withBaggage({\n * baggage: {\n * 'tenant.id': order.tenantId,\n * 'user.id': order.userId,\n * },\n * fn: async () => {\n * // This HTTP call will include the baggage in headers\n * await fetch('/api/charge', {\n * method: 'POST',\n * body: JSON.stringify(order),\n * });\n * },\n * });\n * });\n * ```\n *\n * @example Using with existing baggage\n * ```typescript\n * export const processOrder = withTracing({ name: 'order.process' })((ctx) => async (order: Order) => {\n * // Read existing baggage\n * const tenantId = ctx.getBaggage('tenant.id');\n *\n * // Add additional baggage entries\n * return await withBaggage({\n * baggage: {\n * 'order.id': order.id,\n * 'order.amount': String(order.amount),\n * },\n * fn: async () => {\n * await charge(order);\n * },\n * });\n * });\n * ```\n */\nexport function withBaggage<T = unknown>(\n options: WithBaggageOptions<T>,\n): T | Promise<T> {\n const { baggage: baggageEntries, fn } = options;\n const currentContext = context.active();\n\n // Get existing baggage or create new\n let updatedBaggage =\n propagation.getBaggage(currentContext) ?? propagation.createBaggage();\n\n // Set all baggage entries\n for (const [key, value] of Object.entries(baggageEntries)) {\n updatedBaggage = updatedBaggage.setEntry(key, { value });\n }\n\n // Create new context with updated baggage\n const newContext = propagation.setBaggage(currentContext, updatedBaggage);\n\n // Sync contextStorage so nested traces (via getActiveContextWithBaggage) see the baggage.\n // Use run() instead of enterWith() to properly scope the context changes.\n const ctxStorage = getContextStorage();\n const previousStored = ctxStorage.getStore();\n const baggageEnrichedStored = previousStored\n ? { value: propagation.setBaggage(previousStored.value, updatedBaggage) }\n : { value: newContext };\n\n // Run the function within the new context, scoped properly\n const result = previousStored\n ? ctxStorage.run(baggageEnrichedStored, () => context.with(newContext, fn))\n : context.with(newContext, fn);\n\n if (result instanceof Promise) {\n // For async operations, ensure context is restored after the promise settles\n return result.then(\n (value) => {\n // Restore original context before resolving\n if (previousStored) {\n return ctxStorage.run(previousStored, () => value);\n }\n return value;\n },\n (error) => {\n // Restore original context before rejecting\n if (previousStored) {\n return ctxStorage.run(previousStored, () => {\n throw error;\n });\n }\n throw error;\n },\n );\n }\n\n // Sync function - context automatically restored when scope exits\n return result;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"functional-DcLBuCPz.cjs","names":["nodeUrl","nodeFs","SpanStatusCode","getInitConfig","otelTrace","createTraceContext","getEventQueue","getForceFlushableProvider","getSdk","getContextStorage","context","getConfig","AlwaysSampler","getActiveContextWithBaggage","runInOperationContext","AUTOTEL_SAMPLING_RATE","AUTOTEL_SAMPLING_TAIL_KEEP","AUTOTEL_SAMPLING_TAIL_EVALUATED","propagation"],"sources":["../src/variable-name-inference.ts","../src/functional.ts"],"sourcesContent":["/**\n * Variable Name Inference Utility\n *\n * Attempts to infer variable names from const/export const assignments\n * by analyzing the call stack and parsing source code.\n *\n * This is a best-effort approach with graceful degradation - if inference\n * fails for any reason, it returns undefined without breaking the application.\n */\n\n// namespace imports for browser-bundler compat — see node-require.ts\nimport * as nodeFs from 'node:fs';\nimport * as nodeUrl from 'node:url';\n\ninterface CallLocation {\n file: string;\n line: number;\n column: number;\n}\n\n/**\n * LRU Cache for inferred variable names\n * Key: \"file:line\" (e.g., \"/path/to/file.ts:42\")\n * Value: inferred variable name or undefined\n */\nconst inferenceCache = new Map<string, string | undefined>();\nconst MAX_CACHE_SIZE = 50;\n\n/**\n * Captures the current call stack\n */\nfunction captureStackTrace(): string {\n const originalStackTraceLimit = Error.stackTraceLimit;\n Error.stackTraceLimit = 10; // Only need first few frames\n\n const err = new Error('Stack trace capture');\n const stack = err.stack || '';\n\n Error.stackTraceLimit = originalStackTraceLimit;\n return stack;\n}\n\n/**\n * Parses the stack trace to find where trace() was called\n *\n * Stack trace format (Node.js):\n * at functionName (file:line:column)\n * at file:line:column\n *\n * We skip frames until we find one that's NOT in functional.ts or this file.\n * We also need to skip one additional frame (the trace/span/instrument function itself)\n * to get to the actual user code.\n */\nfunction parseCallLocation(stack: string): CallLocation | undefined {\n const lines = stack.split('\\n');\n let skippedExternalFrame = false;\n\n for (const line of lines) {\n // Skip if line contains this file or functional.ts (internal frames)\n // Be specific about the filename to avoid matching test files\n if (\n line.includes('variable-name-inference.ts') ||\n line.includes('variable-name-inference.js') ||\n line.includes('functional.ts') ||\n line.includes('functional.js')\n ) {\n continue;\n }\n\n // Match various stack trace formats\n // Format 1: at functionName (file:line:column)\n // Format 2: at file:line:column\n const match =\n line.match(/at\\s+(?:.*\\s+)?\\(?([^:]+):(\\d+):(\\d+)\\)?/) ||\n line.match(/^.*?([^:]+):(\\d+):(\\d+)/);\n\n if (match) {\n let filePath = match[1]!.trim();\n\n // Handle file:// URLs (convert to paths)\n if (filePath.startsWith('file://')) {\n try {\n filePath = nodeUrl.fileURLToPath(filePath);\n } catch {\n continue;\n }\n }\n\n // Skip the first external frame (the trace/span function itself)\n // We want the frame where the user CALLS trace(), not inside trace()\n if (!skippedExternalFrame) {\n skippedExternalFrame = true;\n continue;\n }\n\n return {\n file: filePath,\n line: Number.parseInt(match[2]!, 10),\n column: Number.parseInt(match[3]!, 10),\n };\n }\n }\n\n return undefined;\n}\n\n/**\n * Reads a specific line from a source file\n */\nfunction readSourceLine(\n filePath: string,\n lineNumber: number,\n): string | undefined {\n try {\n // Check if we can access the file system (not available in edge runtimes)\n if (typeof nodeFs.readFileSync !== 'function') {\n return undefined;\n }\n\n const content = nodeFs.readFileSync(filePath, 'utf8');\n const lines = content.split('\\n');\n\n // Line numbers are 1-based\n return lines[lineNumber - 1];\n } catch {\n // File doesn't exist, permission denied, or other error\n return undefined;\n }\n}\n\n/**\n * Extracts variable name from source code line using regex patterns\n *\n * Supported patterns:\n * - const varName = anyFunction(\n * - export const varName = anyFunction(\n * - let varName = anyFunction(\n * - var varName = anyFunction(\n *\n * Note: This won't work with destructuring assignments or complex patterns\n */\nfunction extractVariableName(sourceLine: string): string | undefined {\n // Remove leading/trailing whitespace\n const trimmed = sourceLine.trim();\n\n // Pattern: (export)? (const|let|var) varName = anyFunctionCall(\n // We match any function call, not just trace(), to support wrapper functions\n const patterns = [\n // export const varName = anyFunction(\n /export\\s+const\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*=\\s*[a-zA-Z_$][a-zA-Z0-9_$]*\\s*\\(/,\n // const varName = anyFunction(\n /const\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*=\\s*[a-zA-Z_$][a-zA-Z0-9_$]*\\s*\\(/,\n // export let varName = anyFunction(\n /export\\s+let\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*=\\s*[a-zA-Z_$][a-zA-Z0-9_$]*\\s*\\(/,\n // let varName = anyFunction(\n /let\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*=\\s*[a-zA-Z_$][a-zA-Z0-9_$]*\\s*\\(/,\n // export var varName = anyFunction(\n /export\\s+var\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*=\\s*[a-zA-Z_$][a-zA-Z0-9_$]*\\s*\\(/,\n // var varName = anyFunction(\n /var\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*=\\s*[a-zA-Z_$][a-zA-Z0-9_$]*\\s*\\(/,\n ];\n\n for (const pattern of patterns) {\n const match = trimmed.match(pattern);\n if (match && match[1]) {\n return match[1];\n }\n }\n\n return undefined;\n}\n\n/**\n * Adds an entry to the cache with LRU eviction\n */\nfunction cacheInference(key: string, value: string | undefined): void {\n // If cache is full, remove oldest entry (first entry in Map)\n if (inferenceCache.size >= MAX_CACHE_SIZE) {\n const firstKey = inferenceCache.keys().next().value;\n if (firstKey) {\n inferenceCache.delete(firstKey);\n }\n }\n\n inferenceCache.set(key, value);\n}\n\n/**\n * Main entry point: Attempts to infer the variable name from the call stack\n *\n * This function:\n * 1. Captures the call stack\n * 2. Parses it to find where trace() was called (file + line)\n * 3. Reads that line from the source file\n * 4. Extracts the variable name using regex\n *\n * Returns undefined if inference fails at any step (graceful degradation).\n * Results are cached to avoid repeated file I/O.\n *\n * @returns The inferred variable name, or undefined if inference failed\n */\nexport function inferVariableNameFromCallStack(): string | undefined {\n try {\n // Capture stack trace\n const stack = captureStackTrace();\n\n // Parse stack to find trace() call location\n const callLocation = parseCallLocation(stack);\n if (!callLocation) {\n return undefined;\n }\n\n // Check cache\n const cacheKey = `${callLocation.file}:${callLocation.line}`;\n if (inferenceCache.has(cacheKey)) {\n return inferenceCache.get(cacheKey);\n }\n\n // Read source line\n const sourceLine = readSourceLine(callLocation.file, callLocation.line);\n if (!sourceLine) {\n return undefined;\n }\n\n // Extract variable name\n const variableName = extractVariableName(sourceLine);\n\n // Cache result (even if undefined, to avoid repeated failed attempts)\n cacheInference(cacheKey, variableName);\n\n return variableName;\n } catch {\n // Graceful degradation - don't break the app if inference fails\n return undefined;\n }\n}\n\n/**\n * Clears the inference cache (useful for testing)\n */\nexport function clearInferenceCache(): void {\n inferenceCache.clear();\n}\n","/**\n * Functional API for non-class code\n *\n * Three approaches for different use cases:\n * 1. trace() - Zero-ceremony HOF for single functions\n * 2. withTracing() - Middleware-style composable wrapper\n * 3. instrument() - Batch auto-instrumentation for modules\n *\n * @example trace() - Single function\n * ```typescript\n * export const createUser = trace(async (data) => {\n * getActiveTraceContext()?.setAttribute('user.id', data.id)\n * return await db.users.create(data)\n * })\n * ```\n *\n * @example withTracing() - Composable middleware\n * ```typescript\n * export const createUser = withTracing({\n * name: 'user.create'\n * })(ctx => async (data) => {\n * ctx.setAttribute('user.id', data.id)\n * return await db.users.create(data)\n * })\n * ```\n *\n * @example instrument() - Batch instrumentation\n * ```typescript\n * export default instrument({\n * createUser: async (data) => { },\n * updateUser: async (id, data) => { }\n * }, { serviceName: 'user' })\n * ```\n */\n\nimport {\n SpanStatusCode,\n trace as otelTrace,\n context,\n propagation,\n type Span,\n type Counter,\n type Histogram,\n type Attributes,\n} from '@opentelemetry/api';\nimport { getConfig } from './config';\nimport { getConfig as getInitConfig, getSdk } from './init';\nimport { getForceFlushableProvider } from './tracer-provider';\nimport {\n type Sampler,\n type SamplingContext,\n AlwaysSampler,\n AUTOTEL_SAMPLING_TAIL_KEEP,\n AUTOTEL_SAMPLING_TAIL_EVALUATED,\n AUTOTEL_SAMPLING_RATE,\n} from './sampling';\nimport { getEventQueue } from './track';\nimport type { TraceContext } from './trace-context';\nimport {\n createTraceContext,\n getActiveContextWithBaggage,\n getContextStorage,\n} from './trace-context';\nimport { setSpanName } from './trace-helpers';\nimport { runInOperationContext } from './operation-context';\nimport { inferVariableNameFromCallStack } from './variable-name-inference';\n\n/**\n * Complete trace context containing trace identifiers and span methods\n *\n * The ctx parameter in trace() functions provides:\n * - traceId, spanId, correlationId from the active span\n * - Span manipulation methods (setAttribute, setAttributes, setStatus, recordException)\n *\n * For custom context, access it directly in your functions (standard OpenTelemetry pattern).\n *\n * @example\n * ```typescript\n * import { trace } from 'autotel'\n *\n * export const createUser = withTracing({})((ctx) => async (data: CreateUserData) => {\n * // Get custom context directly (standard OTel approach)\n * const userId = getCurrentUserId()\n * const tenantId = getCurrentTenant()\n *\n * // Use ctx for span operations and trace IDs\n * ctx.setAttribute('user.id', data.id)\n * ctx.setAttribute('user.tenant', tenantId)\n * console.log(ctx.traceId) // Trace IDs available\n * })\n * ```\n */\nexport type { TraceContext } from './trace-context';\n\nlet unknownSpanNameWarningEmitted = false;\n\ntype WrappedFunction<TArgs extends unknown[], TReturn> = (\n ...args: TArgs\n) => TReturn | Promise<TReturn>;\n\nfunction resolveVariableName(\n named: InstrumentableFunction,\n variableName?: string,\n): string | undefined {\n const suppliedFunctionName = inferFunctionName(named);\n const callStackVariableName = suppliedFunctionName\n ? undefined\n : inferVariableNameFromCallStack();\n return variableName || suppliedFunctionName || callStackVariableName;\n}\n\n/**\n * Wrap an explicit context factory `(ctx) => (...args) => result`.\n * Used by {@link withTracing}; the input is a factory by contract, so there is\n * no plain-vs-factory detection. The factory is never invoked at construction\n * time — only when the wrapper is called.\n */\nfunction wrapFactoryWithTracing<TArgs extends unknown[], TReturn>(\n factory: (\n ctx: TraceContext,\n ) => (...args: TArgs) => TReturn | Promise<TReturn>,\n options: TracingOptions<TArgs, TReturn>,\n variableName?: string,\n): WrappedFunction<TArgs, TReturn> {\n const effectiveVariableName = resolveVariableName(\n factory as InstrumentableFunction,\n variableName,\n );\n return wrapWithTracingSync(\n factory,\n options,\n effectiveVariableName,\n ) as WrappedFunction<TArgs, TReturn>;\n}\n\n/**\n * Wrap a plain function `(...args) => result`. Used by {@link trace} and\n * {@link instrument}: the function receives its real arguments and no context\n * is injected. Reach the active span via {@link getActiveTraceContext} inside\n * the body (or any helper it calls).\n */\nfunction wrapPlainWithTracing<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => TReturn | Promise<TReturn>,\n options: TracingOptions<TArgs, TReturn>,\n variableName?: string,\n): WrappedFunction<TArgs, TReturn> {\n const effectiveVariableName = resolveVariableName(\n fn as InstrumentableFunction,\n variableName,\n );\n const factory = (_ctx: TraceContext) => fn;\n return wrapWithTracingSync(\n factory,\n options,\n effectiveVariableName,\n ) as WrappedFunction<TArgs, TReturn>;\n}\n\n/**\n * Common options for functional tracing\n */\nexport interface TracingOptions<\n TArgs extends unknown[] = unknown[],\n TReturn = unknown,\n> {\n /**\n * Span name (highest priority)\n * If provided, this is used as the span name\n */\n name?: string;\n\n /**\n * Service name (used to compose final span name)\n * If name not provided, span name becomes: ${serviceName}.${functionName}\n */\n serviceName?: string;\n\n /**\n * Sampling strategy\n * @default AlwaysSampler\n */\n sampler?: Sampler;\n\n /**\n * Enable metrics collection (counter, histogram)\n * @default false\n */\n withMetrics?: boolean;\n\n /**\n * Extract attributes from function arguments\n */\n attributesFromArgs?: (args: TArgs) => Record<string, unknown>;\n\n /**\n * Extract attributes from function result\n */\n attributesFromResult?: (result: TReturn) => Record<string, unknown>;\n\n /**\n * Capture the function arguments onto the span as `autotel.input`\n * (JSON, truncated). One arg is captured directly; multiple are captured as\n * an array. Off by default — opt in per call. Tools (visualizers, devtools)\n * read this alongside `ai.toolCall.args` to show function I/O uniformly.\n * Avoid on args with secrets/PII, or pair with a redacting processor.\n */\n captureInput?: boolean;\n\n /**\n * Capture the function return value onto the span as `autotel.output`\n * (JSON, truncated). Off by default. Same caveats as {@link captureInput}.\n */\n captureOutput?: boolean;\n\n /**\n * Start a new root span instead of creating a child\n * Useful for serverless entry points\n * @default false\n */\n startNewRoot?: boolean;\n\n /**\n * Flush events queue when span ends\n * Only flushes on root spans (to avoid excessive flushing)\n * @default true\n */\n flushOnRootSpanEnd?: boolean;\n\n /**\n * Span kind for semantic convention compliance\n * Used for messaging (PRODUCER/CONSUMER), HTTP (CLIENT/SERVER), etc.\n * @default SpanKind.INTERNAL\n */\n spanKind?: import('@opentelemetry/api').SpanKind;\n\n /**\n * Classify a thrown value as a real error. Return `false` to treat the throw\n * as expected control flow: the span is marked OK, no exception is recorded,\n * and the value is rethrown untouched. Use this for framework control-flow\n * signals that propagate via `throw` but are not failures — e.g. TanStack\n * Router / Next.js `redirect()` and `notFound()`.\n * @default every throw is treated as an error\n */\n isError?: (error: unknown) => boolean;\n}\n\n/**\n * Options for instrument() batch instrumentation\n */\nexport interface InstrumentOptions<\n T extends Record<string, AnyInstrumentable> = Record<\n string,\n AnyInstrumentable\n >,\n> extends TracingOptions {\n /** Object whose function properties should be instrumented */\n functions: T;\n /**\n * Per-function configuration overrides\n */\n overrides?: Record<string, Partial<TracingOptions>>;\n\n /**\n * Functions to skip (won't be instrumented)\n * Supports:\n * - String keys: 'functionName'\n * - RegExp: /^_internal/\n * - Predicate: (key, fn) => boolean\n *\n * By default, functions starting with _ are skipped\n */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n skip?: (string | RegExp | ((key: string, fn: Function) => boolean))[];\n}\n\n/**\n * Options for instrumenting one function with an explicit stable key.\n */\nexport interface SingleInstrumentOptions<\n TFunction extends AnyInstrumentable = AnyInstrumentable,\n> extends TracingOptions {\n /** Stable function key used for span naming */\n key: string;\n /** Function to instrument */\n fn: TFunction;\n}\n\n// Maximum error message length to prevent span bloat\nconst MAX_ERROR_MESSAGE_LENGTH = 500;\n\nfunction createDummyCtx<\n TBaggage extends Record<string, unknown> | undefined = undefined,\n>(): TraceContext<TBaggage> {\n // `recordException` / `addEvent` are no-op shims kept for the same\n // compatibility window as `createTraceContext` (see trace-context.ts).\n return {\n traceId: '',\n spanId: '',\n correlationId: '',\n setAttribute: () => {},\n setAttributes: () => {},\n setStatus: () => {},\n recordException: () => {},\n addEvent: () => {},\n addLink: () => {},\n addLinks: () => {},\n updateName: () => {},\n isRecording: () => false,\n getBaggage: () => {},\n setBaggage: () => '',\n deleteBaggage: () => {},\n getAllBaggage: () => new Map(),\n } as unknown as TraceContext<TBaggage>;\n}\n\n/** Attribute keys for opt-in function I/O capture (see TracingOptions). */\nconst AUTOTEL_INPUT_ATTR = 'autotel.input';\nconst AUTOTEL_OUTPUT_ATTR = 'autotel.output';\nconst CAPTURE_MAX_CHARS = 4096;\n\n/** JSON-serialize a captured value, defensively (truncate, swallow cycles). */\nfunction serializeCapture(value: unknown): string | undefined {\n if (value === undefined) return undefined;\n try {\n const json = typeof value === 'string' ? value : JSON.stringify(value);\n if (json === undefined) return undefined;\n return json.length > CAPTURE_MAX_CHARS\n ? `${json.slice(0, CAPTURE_MAX_CHARS)}…[truncated]`\n : json;\n } catch {\n return undefined;\n }\n}\n\n/** `autotel.input` from args (single arg captured directly, else the array). */\nfunction captureInputAttrs(\n args: unknown[],\n enabled?: boolean,\n): Record<string, unknown> {\n if (!enabled) return {};\n const s = serializeCapture(args.length === 1 ? args[0] : args);\n return s === undefined ? {} : { [AUTOTEL_INPUT_ATTR]: s };\n}\n\n/** `autotel.output` from the return value. */\nfunction captureOutputAttrs(\n result: unknown,\n enabled?: boolean,\n): Record<string, unknown> {\n if (!enabled) return {};\n const s = serializeCapture(result);\n return s === undefined ? {} : { [AUTOTEL_OUTPUT_ATTR]: s };\n}\n\n// Symbol to prevent double-instrumentation (idempotency flag)\nconst INSTRUMENTED_SYMBOL = Symbol.for('autotel.functional.instrumented');\n\ntype InstrumentedFlag = {\n [INSTRUMENTED_SYMBOL]?: true;\n};\n\nfunction hasInstrumentationFlag(value: unknown): value is InstrumentedFlag {\n return (\n (typeof value === 'function' || typeof value === 'object') &&\n value !== null &&\n Boolean((value as InstrumentedFlag)[INSTRUMENTED_SYMBOL])\n );\n}\n\n/**\n * Truncate error message to prevent span bloat\n */\nfunction truncateErrorMessage(message: string): string {\n if (message.length <= MAX_ERROR_MESSAGE_LENGTH) {\n return message;\n }\n return `${message.slice(0, MAX_ERROR_MESSAGE_LENGTH)}... (truncated)`;\n}\n\n/** Per-invocation state the terminal span handlers close over. */\ninterface SpanFinalizeContext {\n span: Span;\n spanName: string;\n duration: number;\n callCounter?: Counter;\n durationHistogram?: Histogram;\n handleTailSampling: (\n success: boolean,\n duration: number,\n error?: Error,\n ) => void;\n /** Extra attributes to merge (e.g. captured args); absent on immediate-exec paths. */\n extraAttributes?: Attributes;\n}\n\n/**\n * Terminal handling for a value thrown by a traced function. Shared by all four\n * `trace()` execution paths (immediate + wrapper, sync + async) so the outcome\n * rules live in exactly one place. Ends the span; the caller flushes (await/void)\n * and rethrows.\n *\n * If `isError` classifies the throw as expected control flow — e.g. a framework\n * `redirect()` / `notFound()` signal — it is recorded as a success outcome with\n * an OK status and no exception. Otherwise it is recorded as an error.\n */\nfunction finalizeThrownSpan(\n error: unknown,\n isError: ((error: unknown) => boolean) | undefined,\n ctx: SpanFinalizeContext,\n): void {\n const {\n span,\n spanName,\n duration,\n callCounter,\n durationHistogram,\n handleTailSampling,\n extraAttributes,\n } = ctx;\n\n const baseAttributes: Attributes = {\n ...extraAttributes,\n 'operation.name': spanName,\n 'code.function': spanName,\n 'operation.duration': duration,\n };\n\n if (isError && !isError(error)) {\n callCounter?.add(1, { operation: spanName, status: 'success' });\n durationHistogram?.record(duration, {\n operation: spanName,\n status: 'success',\n });\n span.setStatus({ code: SpanStatusCode.OK });\n span.setAttributes({ ...baseAttributes, 'operation.success': true });\n handleTailSampling(true, duration);\n span.end();\n return;\n }\n\n callCounter?.add(1, { operation: spanName, status: 'error' });\n durationHistogram?.record(duration, { operation: spanName, status: 'error' });\n\n const truncatedMessage = truncateErrorMessage(\n error instanceof Error ? error.message : 'Unknown error',\n );\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: truncatedMessage });\n span.setAttributes({\n ...baseAttributes,\n 'operation.success': false,\n error: true,\n 'exception.type': error instanceof Error ? error.constructor.name : 'Error',\n 'exception.message': truncatedMessage,\n });\n if (error instanceof Error && error.stack) {\n span.setAttribute(\n 'exception.stack',\n error.stack.slice(0, MAX_ERROR_MESSAGE_LENGTH),\n );\n }\n const thrown = error instanceof Error ? error : new Error(String(error));\n span.recordException(thrown);\n // Samplers read result.error, so hand them a real Error rather than\n // whatever the code threw.\n handleTailSampling(false, duration, thrown);\n span.end();\n}\n\ntype InstrumentableFunction<\n TArgs extends unknown[] = unknown[],\n TReturn = unknown,\n> = ((...args: TArgs) => TReturn | Promise<TReturn>) & {\n displayName?: string;\n name?: string;\n};\n\n/**\n * Constraint alias for `instrument()` and friends. `never[]` parameters make\n * every concretely-typed function (e.g. `(name: string) => Promise<User>`)\n * satisfy the constraint under `strictFunctionTypes` without resorting to\n * `any`. Use ONLY in constraint positions — the concrete `T` is still\n * inferred from the actual argument, so call-site argument and return types\n * are fully preserved.\n */\ntype AnyInstrumentable = ((...args: never[]) => unknown) & {\n displayName?: string;\n name?: string;\n};\n\n/**\n * Try to infer function name from function properties\n * Checks for displayName, name, or other metadata that might be set\n */\nfunction inferFunctionName<\n TArgs extends unknown[] = unknown[],\n TReturn = unknown,\n>(fn: InstrumentableFunction<TArgs, TReturn>): string | undefined {\n // Check for displayName property (sometimes set by bundlers)\n const displayName = (fn as { displayName?: string }).displayName;\n if (displayName) {\n return displayName;\n }\n\n // Check function.name (works for named functions and modern arrow function assignment)\n // Note: Empty string is falsy, so this handles both undefined and ''\n if (fn.name && fn.name !== 'anonymous' && fn.name !== '') {\n return fn.name;\n }\n\n // Try to extract name from function source (for function declarations)\n const source = Function.prototype.toString.call(fn);\n const match = source.match(/function\\s+([^(\\s]+)/);\n if (match && match[1] && match[1] !== 'anonymous') {\n return match[1];\n }\n\n return undefined;\n}\n\n/**\n * Determine span name using priority:\n * 1. Explicit name option\n * 2. serviceName + functionName\n * 3. Inferred from function/variable name (including stack trace fallback)\n * 4. Fallback to 'unknown'\n */\nfunction getSpanName<TArgs extends unknown[], TReturn>(\n options: TracingOptions<TArgs, TReturn>,\n fn: InstrumentableFunction<TArgs, TReturn>,\n variableName?: string,\n): string {\n // 1. Explicit name\n if (options.name) {\n return options.name;\n }\n\n // 2. Try variable name, function name, or function properties\n let fnName = variableName || inferFunctionName(fn);\n\n // Default to 'anonymous' if still no name\n fnName = fnName || 'anonymous';\n\n // 2. serviceName + functionName\n if (options.serviceName) {\n return `${options.serviceName}.${fnName}`;\n }\n\n // 3. Inferred from function name\n if (fnName && fnName !== 'anonymous') {\n return fnName;\n }\n\n // 4. Fallback\n const initConfig = getInitConfig();\n if (\n typeof process !== 'undefined' &&\n process.env.NODE_ENV !== 'production' &&\n !unknownSpanNameWarningEmitted &&\n initConfig?.logger?.warn\n ) {\n unknownSpanNameWarningEmitted = true;\n initConfig.logger.warn(\n {},\n '[autotel] Span name resolved to \"unknown\". Pass an explicit name, for example trace(\"operation.name\", fn).',\n );\n }\n return 'unknown';\n}\n\n/**\n * Check if function should be skipped\n */\nfunction shouldSkip(\n key: string,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n fn: Function,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n skip?: (string | RegExp | ((key: string, fn: Function) => boolean))[],\n): boolean {\n // Default: skip functions starting with _\n if (key.startsWith('_')) {\n return true;\n }\n\n if (!skip || skip.length === 0) {\n return false;\n }\n\n for (const rule of skip) {\n if (typeof rule === 'string' && key === rule) {\n return true;\n } else if (rule instanceof RegExp && rule.test(key)) {\n return true;\n } else if (typeof rule === 'function' && rule(key, fn)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Get current trace context value (internal helper)\n *\n * Returns base context (trace IDs) + span methods from the active span.\n */\nfunction getCtxValue<\n TBaggage extends Record<string, unknown> | undefined = undefined,\n>(): TraceContext<TBaggage> | null {\n const activeSpan = otelTrace.getActiveSpan();\n if (!activeSpan) return null;\n\n // Use shared utility to create trace context\n return createTraceContext<TBaggage>(activeSpan);\n}\n\n/**\n * Get the autotel {@link TraceContext} for the currently active span.\n *\n * This is the ambient accessor for the functional API: instead of threading a\n * `ctx` parameter through a factory, call this inside any traced function (or a\n * helper it calls) to reach `setAttribute`, `setUser`, `getBaggage`, and the\n * rest of the context surface. Returns `undefined` when no span is active.\n *\n * @example\n * ```typescript\n * const getUser = trace('getUser', async (id: string) => {\n * getActiveTraceContext()?.setAttribute('user.id', id);\n * return db.users.find(id);\n * });\n * ```\n *\n * @see getActiveSpan for the raw OpenTelemetry span\n * @see getRequestLogger which reads the active context when called with no args\n */\nexport function getActiveTraceContext<\n TBaggage extends Record<string, unknown> | undefined = undefined,\n>(): TraceContext<TBaggage> | undefined {\n return getCtxValue<TBaggage>() ?? undefined;\n}\n\n/**\n * Context object that lazily evaluates the active span on property access\n *\n * Access trace context directly without function call syntax.\n *\n * @example\n * ```typescript\n * import { trace, ctx } from 'autotel'\n *\n * export const createUser = trace(async (data) => {\n * // Direct property access - no function call!\n * if (ctx.traceId) {\n * ctx.setAttribute('user.id', data.id)\n * console.log('Trace:', ctx.traceId)\n * }\n * })\n * ```\n */\nexport const ctx = new Proxy({} as TraceContext, {\n get(_target, prop) {\n const ctxValue = getCtxValue();\n if (!ctxValue) {\n return;\n }\n return ctxValue[prop as keyof typeof ctxValue];\n },\n\n has(_target, prop) {\n const ctxValue = getCtxValue();\n if (!ctxValue) {\n return false;\n }\n return prop in ctxValue;\n },\n\n ownKeys() {\n const ctxValue = getCtxValue();\n if (!ctxValue) {\n return [];\n }\n return Object.keys(ctxValue);\n },\n\n getOwnPropertyDescriptor(_target, prop) {\n const ctxValue = getCtxValue();\n if (!ctxValue) {\n return;\n }\n return Object.getOwnPropertyDescriptor(ctxValue, prop);\n },\n});\n\n/**\n * Build the root-operation flush policy once and reuse it for wrapped and\n * immediate execution. Async operations await this function; sync operations\n * trigger it without blocking.\n */\nfunction createRootTelemetryFlusher(\n options: Pick<TracingOptions, 'flushOnRootSpanEnd'>,\n isRootSpan: boolean,\n): () => Promise<void> {\n const initConfig = getInitConfig();\n const shouldFlush =\n options.flushOnRootSpanEnd ?? initConfig?.flushOnRootSpanEnd ?? true;\n const shouldFlushSpans = initConfig?.forceFlushOnShutdown ?? false;\n\n return async () => {\n if (!shouldFlush || !isRootSpan) return;\n\n try {\n const queue = getEventQueue();\n if (queue && queue.size() > 0) {\n await queue.flush();\n }\n\n if (shouldFlushSpans) {\n const tracerProvider = getForceFlushableProvider(getSdk());\n await tracerProvider?.forceFlush();\n }\n } catch (error) {\n const logger = getInitConfig()?.logger;\n logger?.error?.(\n { err: error instanceof Error ? error : undefined },\n `[autotel] Auto-flush failed${error instanceof Error ? '' : `: ${String(error)}`}`,\n );\n }\n };\n}\n\n/**\n * Give every root operation its own baggage context without replacing a\n * caller's existing scope. AsyncLocalStorage keeps the scope alive until an\n * async result settles and restores the previous store afterwards.\n */\nfunction runWithTraceContextStorage<TResult>(fn: () => TResult): TResult {\n const storage = getContextStorage();\n if (storage.getStore()) return fn();\n return storage.run({ value: context.active() }, fn);\n}\n\n/**\n * Core tracing wrapper for sync functions (internal implementation)\n */\nfunction wrapWithTracingSync<TArgs extends unknown[], TReturn>(\n fnFactory: (\n ctx: TraceContext,\n ) => (...args: TArgs) => TReturn | Promise<TReturn>,\n options: TracingOptions<TArgs, TReturn>,\n variableName?: string,\n): WrappedFunction<TArgs, TReturn> {\n // Idempotency check: if already instrumented, return as-is\n if (hasInstrumentationFlag(fnFactory)) {\n // If already instrumented, we need to extract the original factory\n // For now, we'll just proceed - this edge case is handled by the wrapped function check\n }\n\n const config = getConfig();\n const tracer = config.tracer;\n const meter = config.meter;\n // Annotate as Sampler so the optional hooks stay visible. Inference would\n // narrow to AlwaysSampler and hide them behind `in` checks.\n const sampler: Sampler = options.sampler || new AlwaysSampler();\n\n const spanName = getSpanName(\n options,\n fnFactory as unknown as InstrumentableFunction<TArgs, TReturn>,\n variableName,\n );\n\n // Metrics setup (if enabled)\n const callCounter = options.withMetrics\n ? meter.createCounter(`${spanName}.calls`, {\n description: `Call count for ${spanName}`,\n unit: '1',\n })\n : undefined;\n\n const durationHistogram = options.withMetrics\n ? meter.createHistogram(`${spanName}.duration`, {\n description: `Duration for ${spanName}`,\n unit: 'ms',\n })\n : undefined;\n\n // Return wrapped function\n function wrappedFunction(\n this: unknown,\n ...args: TArgs\n ): TReturn | Promise<TReturn> {\n const samplingContext: SamplingContext = {\n operationName: spanName,\n args,\n metadata: {},\n };\n\n const shouldSample = sampler.shouldSample(samplingContext);\n // Read the rate next to the decision that produced it: a windowed sampler\n // can move on to a new rate before the span closes.\n const sampleRate = sampler.sampleRate?.(samplingContext);\n const needsTailSampling = sampler.needsTailSampling?.() ?? false;\n\n // If not sampling and no tail sampling, execute without tracing\n if (!shouldSample && !needsTailSampling) {\n const fn = fnFactory(createDummyCtx());\n return fn.call(this, ...args);\n }\n\n const startTime = performance.now();\n\n const isRootSpan =\n options.startNewRoot || otelTrace.getActiveSpan() === undefined;\n const flushRootTelemetry = createRootTelemetryFlusher(options, isRootSpan);\n\n // Build span options including root and kind\n const spanOptions: import('@opentelemetry/api').SpanOptions = {};\n if (options.startNewRoot) {\n spanOptions.root = true;\n }\n if (options.spanKind !== undefined) {\n spanOptions.kind = options.spanKind;\n }\n\n const parentContext = getActiveContextWithBaggage();\n return tracer.startActiveSpan(\n spanName,\n spanOptions,\n parentContext,\n (span) => {\n // Run within operation context so events can auto-capture operation.name\n return runInOperationContext(spanName, () =>\n runWithTraceContextStorage(() => {\n let shouldKeepSpan = true;\n\n // Store span name for trace context helpers\n setSpanName(span, spanName);\n\n // Only worth recording when the sampler actually dropped events.\n if (sampleRate !== undefined && sampleRate > 1) {\n span.setAttribute(AUTOTEL_SAMPLING_RATE, sampleRate);\n }\n\n // Create trace context for this span using shared utility\n const ctxValue = createTraceContext(span);\n\n // Get the actual function from the factory\n const fn = fnFactory(ctxValue);\n\n // Extract attributes only when actually tracing\n // This avoids expensive preprocessing when sampling rejects the trace\n const argsAttributes: Attributes = {\n ...captureInputAttrs(args, options.captureInput),\n ...(options.attributesFromArgs\n ? options.attributesFromArgs(args)\n : {}),\n } as Attributes;\n\n const handleTailSampling = (\n success: boolean,\n duration: number,\n error?: Error,\n ) => {\n if (needsTailSampling && sampler.shouldKeepTrace) {\n shouldKeepSpan = sampler.shouldKeepTrace(samplingContext, {\n success,\n duration,\n error,\n });\n span.setAttribute(AUTOTEL_SAMPLING_TAIL_KEEP, shouldKeepSpan);\n span.setAttribute(AUTOTEL_SAMPLING_TAIL_EVALUATED, true);\n }\n };\n\n const onSuccess = (result: TReturn) => {\n const duration = performance.now() - startTime;\n\n callCounter?.add(1, {\n operation: spanName,\n status: 'success',\n });\n\n durationHistogram?.record(duration, {\n operation: spanName,\n status: 'success',\n });\n\n const resultAttributes = {\n ...captureOutputAttrs(result, options.captureOutput),\n ...(options.attributesFromResult\n ? options.attributesFromResult(result)\n : {}),\n };\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.setAttributes({\n ...argsAttributes,\n ...resultAttributes,\n 'operation.name': spanName,\n 'code.function': spanName,\n 'operation.duration': duration,\n 'operation.success': true,\n });\n\n handleTailSampling(true, duration);\n\n span.end();\n return result;\n };\n\n const onError = (error: unknown): never => {\n finalizeThrownSpan(error, options.isError, {\n span,\n spanName,\n duration: performance.now() - startTime,\n callCounter,\n durationHistogram,\n handleTailSampling,\n extraAttributes: argsAttributes,\n });\n throw error;\n };\n\n try {\n callCounter?.add(1, {\n operation: spanName,\n status: 'started',\n });\n\n const result = context.with(getActiveContextWithBaggage(), () =>\n fn.call(this, ...args),\n );\n\n if (result instanceof Promise) {\n return result.then(\n async (value) => {\n const completed = onSuccess(value);\n await flushRootTelemetry();\n return completed;\n },\n async (error) => {\n try {\n return onError(error);\n } finally {\n await flushRootTelemetry();\n }\n },\n );\n }\n\n const completed = onSuccess(result);\n void flushRootTelemetry();\n return completed;\n } catch (error) {\n try {\n return onError(error);\n } finally {\n void flushRootTelemetry();\n }\n }\n }),\n );\n },\n );\n }\n\n // Mark as instrumented to prevent double-wrapping\n (wrappedFunction as InstrumentedFlag)[INSTRUMENTED_SYMBOL] = true;\n\n Object.defineProperty(wrappedFunction, 'name', {\n value: variableName || 'trace',\n configurable: true,\n });\n\n return wrappedFunction as WrappedFunction<TArgs, TReturn>;\n}\n\n/**\n * Approach 1: trace() - Zero-ceremony HOF\n *\n * Wrap a plain function with automatic tracing. The function receives its real\n * arguments; no context parameter is injected. Use\n * {@link getActiveTraceContext} inside the function, or use {@link withTracing}\n * for the explicit `(ctx) => (...args) => result` factory form.\n *\n * @example Auto-inferred name - Plain function\n * ```typescript\n * export const createUser = trace(async (data) => {\n * return await db.users.create(data)\n * })\n * // → Traced as \"createUser\"\n * ```\n *\n * @example Ambient context access\n * ```typescript\n * export const createUser = trace(async (data) => {\n * getActiveTraceContext()?.setAttribute('user.id', data.id)\n * return await db.users.create(data)\n * })\n * ```\n *\n * @example Custom name - Plain function\n * ```typescript\n * export const createUser = trace('user.create', async (data) => {\n * return await db.users.create(data)\n * })\n * // → Traced as \"user.create\"\n * ```\n *\n * @example Explicit factory context with withTracing()\n * ```typescript\n * export const createUser = withTracing({ name: 'user.create' })((ctx) => async (data) => {\n * ctx.setAttribute('user.id', data.id)\n * return await db.users.create(data)\n * })\n * ```\n *\n * @example Full options - Plain function\n * ```typescript\n * export const createUser = trace({\n * name: 'user.create',\n * sampler: new AdaptiveSampler(),\n * withMetrics: true\n * }, async (data) => {\n * return await db.users.create(data)\n * })\n * ```\n *\n */\n// Plain-function overloads. `trace()` always wraps a plain function that\n// receives its real arguments; it never injects a context parameter and never\n// inspects the function. Reach the active span via getActiveTraceContext()\n// inside the body. For the explicit `(ctx) => (args) => result` factory form,\n// use withTracing(). `TReturn` captures the return type verbatim, so async\n// functions infer `(...args) => Promise<...>` with no separate overload.\n\n// trace(fn)\nexport function trace<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n// trace(name, fn)\nexport function trace<TArgs extends unknown[], TReturn>(\n name: string,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n// trace(options, fn)\nexport function trace<TArgs extends unknown[], TReturn>(\n options: TracingOptions<TArgs, TReturn>,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n// Implementation\nexport function trace<TArgs extends unknown[] = unknown[], TReturn = unknown>(\n fnOrNameOrOptions:\n | ((...args: TArgs) => TReturn)\n | ((...args: TArgs) => Promise<TReturn>)\n | string\n | TracingOptions<TArgs, TReturn>,\n maybeFn?:\n ((...args: TArgs) => TReturn) | ((...args: TArgs) => Promise<TReturn>),\n): WrappedFunction<TArgs, TReturn> {\n // trace(fn) - the function is plain; it receives its real arguments and no\n // context is injected. Reach the active span via getActiveTraceContext().\n if (typeof fnOrNameOrOptions === 'function') {\n return wrapPlainWithTracing(\n fnOrNameOrOptions as (...args: TArgs) => TReturn,\n {} as TracingOptions<TArgs, TReturn>,\n );\n }\n\n // trace(name, fn) or trace(options, fn)\n if (!maybeFn) {\n throw new Error('trace(name|options, fn): fn is required');\n }\n\n const options: TracingOptions<TArgs, TReturn> =\n typeof fnOrNameOrOptions === 'string'\n ? ({ name: fnOrNameOrOptions } as TracingOptions<TArgs, TReturn>)\n : fnOrNameOrOptions;\n\n return wrapPlainWithTracing(maybeFn as (...args: TArgs) => TReturn, options);\n}\n\n/**\n * Approach 2: withTracing() - Middleware-style composable wrapper\n *\n * Returns a HOF that wraps functions with tracing.\n * Perfect for composition and reusable configuration.\n *\n * @example Standard usage\n * ```typescript\n * export const createUser = withTracing({\n * name: 'user.create'\n * })(ctx => async (data) => {\n * ctx.setAttribute('user.id', data.id)\n * return await db.users.create(data)\n * })\n * ```\n *\n * @example Composable\n * ```typescript\n * const tracer = withTracing({ serviceName: 'user' })\n *\n * export const createUser = tracer(ctx => async (data) => { })\n * export const updateUser = tracer(ctx => async (id, data) => { })\n * ```\n *\n * @example With other middleware\n * ```typescript\n * export const createUser = compose(\n * withAuth({ role: 'admin' }),\n * withTracing({ name: 'user.create' }),\n * withRateLimit({ max: 100 })\n * )(ctx => async (data) => { })\n * ```\n */\nexport function withTracing<\n TCfgArgs extends unknown[] = unknown[],\n TCfgReturn = unknown,\n>(options: TracingOptions<TCfgArgs, TCfgReturn> = {}) {\n return <TArgs extends TCfgArgs, TReturn extends TCfgReturn>(\n fnFactory: (\n ctx: TraceContext,\n ) => (...args: TArgs) => TReturn | Promise<TReturn>,\n ): WrappedFunction<TArgs, TReturn> =>\n wrapFactoryWithTracing<TArgs, TReturn>(fnFactory, options);\n}\n\n/**\n * Approach 3: instrument() - Batch auto-instrumentation\n *\n * Instrument an entire module/object at once.\n * Closest to @Instrumented decorator pattern.\n *\n * @example Basic usage\n * ```typescript\n * export default instrument({\n * functions: {\n * createUser: async (data) => { },\n * updateUser: async (id, data) => { },\n * deleteUser: async (id) => { }\n * },\n * serviceName: 'user',\n * sampler: new AdaptiveSampler()\n * })\n * // → Traced as \"user.createUser\", \"user.updateUser\", \"user.deleteUser\"\n * ```\n *\n * @example Per-function overrides\n * ```typescript\n * export default instrument({\n * functions: {\n * createUser: async (data) => { },\n * deleteUser: async (id) => { }\n * },\n * serviceName: 'user',\n * overrides: {\n * deleteUser: {\n * sampler: new AlwaysSampler(),\n * withMetrics: true\n * }\n * }\n * })\n * ```\n *\n * @example Skip functions\n * ```typescript\n * export default instrument({\n * functions: {\n * createUser: async (data) => { },\n * _internal: async () => { }, // Auto-skipped (_-prefix)\n * deleteUser: async (id) => { }\n * },\n * serviceName: 'user',\n * skip: [/^test/, (key) => key.includes('debug')]\n * })\n * ```\n */\nexport function instrument<TFunction extends AnyInstrumentable>(\n options: SingleInstrumentOptions<TFunction>,\n): TFunction;\nexport function instrument<T extends Record<string, AnyInstrumentable>>(\n options: InstrumentOptions<T>,\n): T;\nexport function instrument<\n T extends Record<string, AnyInstrumentable>,\n TFunction extends AnyInstrumentable,\n>(\n options: InstrumentOptions<T> | SingleInstrumentOptions<TFunction>,\n): T | TFunction {\n if (!options || typeof options !== 'object') {\n throw new TypeError(\n 'instrument: expected { key, fn } or { functions: { name: fn } }',\n );\n }\n\n if ('key' in options || 'fn' in options) {\n const { key, fn, ...tracingOptions } =\n options as SingleInstrumentOptions<TFunction>;\n if (typeof key !== 'string' || key.trim() === '') {\n throw new TypeError(\n 'instrument: \"key\" must be a non-empty string in the { key, fn } form',\n );\n }\n if (typeof fn !== 'function') {\n throw new TypeError(\n 'instrument: \"fn\" must be a function in the { key, fn } form',\n );\n }\n return wrapPlainWithTracing(fn, tracingOptions, key) as TFunction;\n }\n\n const { functions, ...tracingOptions } = options as InstrumentOptions<T>;\n if (!functions || typeof functions !== 'object') {\n throw new TypeError(\n 'instrument: expected { key, fn } or { functions: { name: fn } }',\n );\n }\n const instrumented: Partial<T> = {};\n\n for (const key of Object.keys(functions)) {\n const typedKey = key as keyof T;\n const fn = functions[typedKey];\n\n // Skip if not a function or undefined - just pass through the value\n if (!fn || typeof fn !== 'function') {\n instrumented[typedKey] = fn as T[typeof typedKey];\n continue;\n }\n\n // Only instrument own enumerable async functions\n // Check if should skip\n if (shouldSkip(key, fn, tracingOptions.skip)) {\n instrumented[typedKey] = fn as T[typeof typedKey];\n continue;\n }\n\n // Merge base options with per-function overrides\n const fnOptions: TracingOptions = {\n ...tracingOptions,\n ...tracingOptions.overrides?.[key],\n // If no explicit name, use key as function name\n name: tracingOptions.overrides?.[key]?.name,\n };\n\n // Bind function to original object to preserve 'this' context\n // This ensures methods can access state on the original object\n const boundFn = fn.bind(functions);\n\n // Convert plain function to factory pattern for trace()\n // For instrument(), we create a factory that ignores ctx and returns the original function\n const fnFactory = (ctx: TraceContext) => {\n void ctx;\n return boundFn;\n };\n\n // Wrap with tracing (sync or async based on implementation)\n instrumented[typedKey] = wrapFactoryWithTracing(\n fnFactory,\n fnOptions,\n key,\n ) as unknown as T[typeof typedKey];\n }\n\n return instrumented as T;\n}\n\n/**\n * Options for span() function\n */\nexport interface SpanOptions {\n /** Span name */\n name: string;\n /** Attributes to set on the span */\n attributes?: Record<string, string | number | boolean>;\n /** OpenTelemetry span kind */\n spanKind?: import('@opentelemetry/api').SpanKind;\n}\n\n/**\n * Execute a function within a named span\n *\n * Useful for adding tracing to specific code blocks without wrapping\n * the entire function. Supports both synchronous and asynchronous functions.\n *\n * Mirrors `trace()`: pass a span name as the first argument for the common\n * case, or full `SpanOptions` when you need to attach attributes.\n *\n * @example\n * ```typescript\n * // Name shorthand\n * await span('payment.charge', async (span) => {\n * await chargeCustomer(order);\n * })\n *\n * // Full options when attributes are needed\n * await span(\n * { name: 'payment.charge', attributes: { amount: order.total } },\n * async (span) => {\n * await chargeCustomer(order);\n * },\n * )\n *\n * // Sync\n * const total = span('calculateTotal', (span) => {\n * return items.reduce((sum, item) => sum + item.price, 0);\n * })\n * ```\n */\n// Overloads — sync first (more specific match), then async.\n// Each shape is offered with a string name OR a full SpanOptions object so\n// span() aligns with trace()'s argument flexibility.\nexport function span<T = unknown>(name: string, fn: (span: Span) => T): T;\nexport function span<T = unknown>(\n name: string,\n fn: (span: Span) => Promise<T>,\n): Promise<T>;\nexport function span<T = unknown>(\n options: SpanOptions,\n fn: (span: Span) => T,\n): T;\nexport function span<T = unknown>(\n options: SpanOptions,\n fn: (span: Span) => Promise<T>,\n): Promise<T>;\n// Implementation\nexport function span<T = unknown>(\n nameOrOptions: string | SpanOptions,\n fn: (span: Span) => T | Promise<T>,\n): T | Promise<T> {\n const options: SpanOptions =\n typeof nameOrOptions === 'string' ? { name: nameOrOptions } : nameOrOptions;\n const config = getConfig();\n const tracer = config.tracer;\n const { name, attributes, spanKind } = options;\n\n const executeSpan = (span: Span) => {\n // Run within operation context so events can auto-capture operation.name\n return runInOperationContext(name, () => {\n try {\n // Set attributes\n if (attributes) {\n for (const [key, value] of Object.entries(attributes)) {\n span.setAttribute(key, value);\n }\n }\n\n const result = fn(span);\n\n // Check if result is a Promise\n if (result instanceof Promise) {\n return result\n .then((resolved) => {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return resolved;\n })\n .catch((error) => {\n const errorMessage =\n error instanceof Error\n ? error.message.slice(0, MAX_ERROR_MESSAGE_LENGTH)\n : String(error).slice(0, MAX_ERROR_MESSAGE_LENGTH);\n\n span.setAttribute('error.message', errorMessage);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: errorMessage,\n });\n\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n span.end();\n throw error;\n });\n } else {\n // Synchronous function\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n }\n } catch (error) {\n // Synchronous error handling\n const errorMessage =\n error instanceof Error\n ? error.message.slice(0, MAX_ERROR_MESSAGE_LENGTH)\n : String(error).slice(0, MAX_ERROR_MESSAGE_LENGTH);\n\n span.setAttribute('error.message', errorMessage);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: errorMessage,\n });\n\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n span.end();\n throw error;\n }\n });\n };\n\n const parentContext = getActiveContextWithBaggage();\n const result = tracer.startActiveSpan(\n name,\n spanKind === undefined ? {} : { kind: spanKind },\n parentContext,\n executeSpan,\n );\n\n // tracer.startActiveSpan might return a Promise even for sync callbacks\n // Check if it's a Promise and handle accordingly\n if (result instanceof Promise) {\n return result;\n }\n\n return result as T;\n}\n\n/**\n * Options for withNewContext() function\n */\nexport interface WithNewContextOptions<T = unknown> {\n /** Function to execute in new root context */\n fn: () => Promise<T>;\n}\n\n/**\n * Execute a function in a new root context (prevents span propagation)\n *\n * Useful when you want to start a completely new trace without\n * parent-child relationships.\n *\n * @example\n * ```typescript\n * async function handleWebhook(payload: WebhookPayload) {\n * // This creates a new root trace, not connected to the HTTP request trace\n * await withNewContext({\n * fn: async () => {\n * await span('webhook.process', async () => {\n * await processWebhookPayload(payload)\n * })\n * }\n * })\n * }\n * ```\n */\nexport async function withNewContext<T = unknown>(\n options: WithNewContextOptions<T>,\n): Promise<T> {\n const { fn } = options;\n const config = getConfig();\n const tracer = config.tracer;\n\n // Start a new root span (breaks trace propagation)\n return tracer.startActiveSpan('root', { root: true }, async (span) => {\n try {\n const result = await fn();\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n span.setStatus({ code: SpanStatusCode.ERROR });\n throw error;\n } finally {\n span.end();\n }\n });\n}\n\n/**\n * Options for withBaggage() function\n */\nexport interface WithBaggageOptions<T = unknown> {\n /** Baggage entries to set (key-value pairs) */\n baggage: Record<string, string>;\n /** Function to execute with the updated baggage */\n fn: () => T | Promise<T>;\n}\n\n/**\n * Execute a function with updated baggage entries\n *\n * Baggage is immutable in OpenTelemetry, so this helper creates a new context\n * with the specified baggage entries and runs the function within that context.\n * All child spans created within the function will inherit the baggage.\n *\n * @example Setting baggage for downstream services\n * ```typescript\n * import { withTracing, withBaggage } from 'autotel';\n *\n * export const createOrder = withTracing({ name: 'order.create' })((ctx) => async (order: Order) => {\n * // Set baggage that will be propagated to downstream HTTP calls\n * return await withBaggage({\n * baggage: {\n * 'tenant.id': order.tenantId,\n * 'user.id': order.userId,\n * },\n * fn: async () => {\n * // This HTTP call will include the baggage in headers\n * await fetch('/api/charge', {\n * method: 'POST',\n * body: JSON.stringify(order),\n * });\n * },\n * });\n * });\n * ```\n *\n * @example Using with existing baggage\n * ```typescript\n * export const processOrder = withTracing({ name: 'order.process' })((ctx) => async (order: Order) => {\n * // Read existing baggage\n * const tenantId = ctx.getBaggage('tenant.id');\n *\n * // Add additional baggage entries\n * return await withBaggage({\n * baggage: {\n * 'order.id': order.id,\n * 'order.amount': String(order.amount),\n * },\n * fn: async () => {\n * await charge(order);\n * },\n * });\n * });\n * ```\n */\nexport function withBaggage<T = unknown>(\n options: WithBaggageOptions<T>,\n): T | Promise<T> {\n const { baggage: baggageEntries, fn } = options;\n const currentContext = context.active();\n\n // Get existing baggage or create new\n let updatedBaggage =\n propagation.getBaggage(currentContext) ?? propagation.createBaggage();\n\n // Set all baggage entries\n for (const [key, value] of Object.entries(baggageEntries)) {\n updatedBaggage = updatedBaggage.setEntry(key, { value });\n }\n\n // Create new context with updated baggage\n const newContext = propagation.setBaggage(currentContext, updatedBaggage);\n\n // Sync contextStorage so nested traces (via getActiveContextWithBaggage) see the baggage.\n // Use run() instead of enterWith() to properly scope the context changes.\n const ctxStorage = getContextStorage();\n const previousStored = ctxStorage.getStore();\n const baggageEnrichedStored = previousStored\n ? { value: propagation.setBaggage(previousStored.value, updatedBaggage) }\n : { value: newContext };\n\n // Run the function within the new context, scoped properly\n const result = previousStored\n ? ctxStorage.run(baggageEnrichedStored, () => context.with(newContext, fn))\n : context.with(newContext, fn);\n\n if (result instanceof Promise) {\n // For async operations, ensure context is restored after the promise settles\n return result.then(\n (value) => {\n // Restore original context before resolving\n if (previousStored) {\n return ctxStorage.run(previousStored, () => value);\n }\n return value;\n },\n (error) => {\n // Restore original context before rejecting\n if (previousStored) {\n return ctxStorage.run(previousStored, () => {\n throw error;\n });\n }\n throw error;\n },\n );\n }\n\n // Sync function - context automatically restored when scope exits\n return result;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"functional.d.cts","names":[],"sources":["../src/functional.ts"],"mappings":";;;;KAgGK,gBAAgB,yBAAyB,eACzC,MAAM,UACN,UAAU,QAAQ;;;;UA+DN,eACf,qCACA;;;;;EAMA;;;;;EAMA;;;;;EAMA,UAAU;;;;;EAMV;;;;EAKA,sBAAsB,MAAM,UAAU;;;;EAKtC,wBAAwB,QAAQ,YAAY;;;;;;;;EAS5C;;;;;EAMA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA,wCAAwC;;;;;;;;;EAUxC,WAAW;;;;;UAMI,kBACf,UAAU,eAAe,qBAAqB,eAE5C,4BAEM;;EAER,WAAW;;;;EAIX,YAAY,eAAe,QAAQ;;;;;;;;;;EAYnC,iBAAiB,WAAW,aAAa,IAAI;;;;;UAM9B,wBACf,kBAAkB,oBAAoB,2BAC9B;;EAER;;EAEA,IAAI;;;;;;;;;;KAyMD,yBAAyB;EAC5B;EACA;;;;;;;;;;;;;;;;;;;;;iBAqJc,sBACd,iBAAiB,oDACd,aAAa;;;;;;;;;;;;;;;;;;;cAsBL,KAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyXA,MAAM,yBAAyB,SAC7C,QAAQ,MAAM,UAAU,cACnB,MAAM,UAAU;iBAEP,MAAM,yBAAyB,SAC7C,cACA,QAAQ,MAAM,UAAU,cACnB,MAAM,UAAU;iBAEP,MAAM,yBAAyB,SAC7C,SAAS,eAAe,OAAO,UAC/B,QAAQ,MAAM,UAAU,cACnB,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkEP,YACd,wCACA,sBACA,UAAS,eAAe,UAAU,eAC1B,cAAc,UAAU,gBAAgB,YAC9C,YACE,KAAK,qBACE,MAAM,UAAU,UAAU,QAAQ,aAC1C,gBAAgB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsDZ,WAAW,kBAAkB,mBAC3C,SAAS,wBAAwB,aAChC;iBACa,WAAW,UAAU,eAAe,oBAClD,SAAS,kBAAkB,KAC1B;;;;UAuFc;;EAEf;;EAEA,aAAa;;EAEb,wCAAwC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoC1B,KAAK,aAAa,cAAc,KAAK,MAAM,SAAS,IAAI;iBACxD,KAAK,aACnB,cACA,KAAK,MAAM,SAAS,QAAQ,KAC3B,QAAQ;iBACK,KAAK,aACnB,SAAS,aACT,KAAK,MAAM,SAAS,IACnB;iBACa,KAAK,aACnB,SAAS,aACT,KAAK,MAAM,SAAS,QAAQ,KAC3B,QAAQ;;;;UAmGM,sBAAsB;;EAErC,UAAU,QAAQ;;;;;;;;;;;;;;;;;;;;;;iBAuBE,eAAe,aACnC,SAAS,sBAAsB,KAC9B,QAAQ;;;;UA0BM,mBAAmB;;EAElC,SAAS;;EAET,UAAU,IAAI,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmDR,YAAY,aAC1B,SAAS,mBAAmB,KAC3B,IAAI,QAAQ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"functional.d.ts","names":[],"sources":["../src/functional.ts"],"mappings":";;;;KAgGK,gBAAgB,yBAAyB,eACzC,MAAM,UACN,UAAU,QAAQ;;;;UA+DN,eACf,qCACA;;;;;EAMA;;;;;EAMA;;;;;EAMA,UAAU;;;;;EAMV;;;;EAKA,sBAAsB,MAAM,UAAU;;;;EAKtC,wBAAwB,QAAQ,YAAY;;;;;;;;EAS5C;;;;;EAMA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA,wCAAwC;;;;;;;;;EAUxC,WAAW;;;;;UAMI,kBACf,UAAU,eAAe,qBAAqB,eAE5C,4BAEM;;EAER,WAAW;;;;EAIX,YAAY,eAAe,QAAQ;;;;;;;;;;EAYnC,iBAAiB,WAAW,aAAa,IAAI;;;;;UAM9B,wBACf,kBAAkB,oBAAoB,2BAC9B;;EAER;;EAEA,IAAI;;;;;;;;;;KAyMD,yBAAyB;EAC5B;EACA;;;;;;;;;;;;;;;;;;;;;iBAqJc,sBACd,iBAAiB,oDACd,aAAa;;;;;;;;;;;;;;;;;;;cAsBL,KAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyXA,MAAM,yBAAyB,SAC7C,QAAQ,MAAM,UAAU,cACnB,MAAM,UAAU;iBAEP,MAAM,yBAAyB,SAC7C,cACA,QAAQ,MAAM,UAAU,cACnB,MAAM,UAAU;iBAEP,MAAM,yBAAyB,SAC7C,SAAS,eAAe,OAAO,UAC/B,QAAQ,MAAM,UAAU,cACnB,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkEP,YACd,wCACA,sBACA,UAAS,eAAe,UAAU,eAC1B,cAAc,UAAU,gBAAgB,YAC9C,YACE,KAAK,qBACE,MAAM,UAAU,UAAU,QAAQ,aAC1C,gBAAgB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsDZ,WAAW,kBAAkB,mBAC3C,SAAS,wBAAwB,aAChC;iBACa,WAAW,UAAU,eAAe,oBAClD,SAAS,kBAAkB,KAC1B;;;;UAuFc;;EAEf;;EAEA,aAAa;;EAEb,wCAAwC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoC1B,KAAK,aAAa,cAAc,KAAK,MAAM,SAAS,IAAI;iBACxD,KAAK,aACnB,cACA,KAAK,MAAM,SAAS,QAAQ,KAC3B,QAAQ;iBACK,KAAK,aACnB,SAAS,aACT,KAAK,MAAM,SAAS,IACnB;iBACa,KAAK,aACnB,SAAS,aACT,KAAK,MAAM,SAAS,QAAQ,KAC3B,QAAQ;;;;UAmGM,sBAAsB;;EAErC,UAAU,QAAQ;;;;;;;;;;;;;;;;;;;;;;iBAuBE,eAAe,aACnC,SAAS,sBAAsB,KAC9B,QAAQ;;;;UA0BM,mBAAmB;;EAElC,SAAS;;EAET,UAAU,IAAI,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmDR,YAAY,aAC1B,SAAS,mBAAmB,KAC3B,IAAI,QAAQ"}
package/dist/http.cjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"http.cjs","names":["getConfig","SpanStatusCode","getActiveContextWithBaggage","propagation","context"],"sources":["../src/http.ts"],"sourcesContent":["/**\n * HTTP Instrumentation Helpers\n *\n * Optional import: Not included in main bundle\n * Import from: 'autotel/http'\n *\n * Provides decorators and utilities for HTTP client instrumentation.\n * Works with fetch, axios, and other HTTP clients.\n *\n * @example\n * ```typescript\n * import { HttpInstrumented } from 'autotel/http'\n *\n * @HttpInstrumented()\n * class ApiClient {\n * async getUser(id: string) {\n * return fetch(`/api/users/${id}`)\n * }\n * }\n * ```\n */\n\nimport { SpanStatusCode, context, propagation } from '@opentelemetry/api';\nimport { getConfig } from './config';\nimport { getActiveContextWithBaggage } from './trace-context';\n\nexport interface HttpInstrumentedOptions {\n /** Service name for HTTP calls (default: 'http-client') */\n serviceName?: string;\n /** Extract URL from method arguments (default: first arg) */\n urlExtractor?: (args: unknown[]) => string | undefined;\n /** Extract HTTP method from method name or args */\n methodExtractor?: (methodName: string, args: unknown[]) => string;\n /** Add custom attributes to spans */\n attributesFromArgs?: (args: unknown[]) => Record<string, string | number>;\n /** Slow request threshold in milliseconds (adds warning attribute) - default: 3000ms */\n slowRequestThresholdMs?: number;\n}\n\n/**\n * Decorator for auto-instrumenting HTTP client methods\n *\n * @example Basic usage\n * ```typescript\n * @HttpInstrumented()\n * class ApiClient {\n * async fetchUser(userId: string) {\n * const res = await fetch(`https://api.example.com/users/${userId}`)\n * return res.json()\n * }\n *\n * async createOrder(order: Order) {\n * const res = await fetch('https://api.example.com/orders', {\n * method: 'POST',\n * body: JSON.stringify(order)\n * })\n * return res.json()\n * }\n * }\n * ```\n *\n * @example Advanced usage with custom extractors\n * ```typescript\n * @HttpInstrumented({\n * serviceName: 'payment-gateway',\n * urlExtractor: (args) => {\n * const config = args[0] as RequestConfig\n * return config.url\n * },\n * attributesFromArgs: (args) => ({\n * 'http.request_id': args[0]?.requestId,\n * 'http.retry_count': args[0]?.retryCount || 0\n * })\n * })\n * class PaymentClient {\n * async charge(config: RequestConfig) {\n * return axios(config)\n * }\n * }\n * ```\n */\nexport function HttpInstrumented(options: HttpInstrumentedOptions = {}) {\n const serviceName = options.serviceName || 'http-client';\n const slowRequestThresholdMs = options.slowRequestThresholdMs ?? 3000;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-empty-object-type\n return function <T extends { new (...args: any[]): {} }>(\n target: T,\n _context: ClassDecoratorContext,\n ) {\n return class extends target {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(...args: any[]) {\n super(...args);\n\n const proto = target.prototype;\n const methodNames = Object.getOwnPropertyNames(proto).filter(\n (name) =>\n name !== 'constructor' &&\n typeof proto[name] === 'function' &&\n !name.startsWith('_'),\n );\n\n for (const methodName of methodNames) {\n const originalMethod = proto[methodName];\n\n if (\n originalMethod.constructor.name === 'AsyncFunction' ||\n originalMethod.toString().startsWith('async ')\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wrappedMethod = async (...args: any[]) => {\n const config = getConfig();\n const tracer = config.tracer;\n\n const url = options.urlExtractor\n ? options.urlExtractor(args)\n : (args[0] as string | undefined);\n\n const method = options.methodExtractor\n ? options.methodExtractor(methodName, args)\n : inferHttpMethod(methodName);\n\n const spanName = url\n ? `HTTP ${method} ${extractPath(url)}`\n : `HTTP ${method}`;\n\n return tracer.startActiveSpan(spanName, async (span) => {\n const startTime = performance.now();\n\n try {\n span.setAttributes({\n 'http.method': method,\n 'http.url': url || 'unknown',\n 'service.name': serviceName,\n 'operation.name': `${serviceName}.${methodName}`,\n });\n\n if (url) {\n const urlObj = parseUrl(url);\n span.setAttributes({\n 'http.scheme': urlObj.protocol,\n 'http.host': urlObj.host,\n 'http.target': urlObj.path,\n });\n }\n\n if (options.attributesFromArgs) {\n span.setAttributes(options.attributesFromArgs(args));\n }\n\n const result = await originalMethod.apply(this, args);\n\n const duration = performance.now() - startTime;\n\n // Extract status code from response\n const statusCode = extractStatusCode(result);\n if (statusCode) {\n span.setAttribute('http.status_code', statusCode);\n\n if (statusCode >= 400) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: `HTTP ${statusCode}`,\n });\n } else {\n span.setStatus({ code: SpanStatusCode.OK });\n }\n } else {\n span.setStatus({ code: SpanStatusCode.OK });\n }\n\n span.setAttributes({\n 'http.duration_ms': duration,\n });\n\n // Mark slow requests for investigation\n if (duration > slowRequestThresholdMs) {\n span.setAttribute('http.slow_request', true);\n span.setAttribute(\n 'http.slow_request_threshold_ms',\n slowRequestThresholdMs,\n );\n }\n\n return result;\n } catch (error) {\n const duration = performance.now() - startTime;\n\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message:\n error instanceof Error ? error.message : 'Unknown error',\n });\n\n span.setAttributes({\n 'http.duration_ms': duration,\n 'error.type':\n error instanceof Error\n ? error.constructor.name\n : 'Unknown',\n 'error.message':\n error instanceof Error ? error.message : 'Unknown error',\n });\n\n throw error;\n } finally {\n span.end();\n }\n });\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any)[methodName] = wrappedMethod;\n }\n }\n }\n };\n };\n}\n\n/**\n * Helper: Trace a single HTTP request\n *\n * @example\n * ```typescript\n * import { traceHttpRequest } from 'autotel/http'\n *\n * const data = await traceHttpRequest(\n * 'GET /api/users',\n * () => fetch('https://api.example.com/users')\n * )\n * ```\n */\nexport async function traceHttpRequest<T>(\n spanName: string,\n fn: () => Promise<T>,\n attributes?: Record<string, string | number>,\n): Promise<T> {\n const config = getConfig();\n const tracer = config.tracer;\n\n return tracer.startActiveSpan(spanName, async (span) => {\n try {\n if (attributes) {\n span.setAttributes(attributes);\n }\n\n const result = await fn();\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n } finally {\n span.end();\n }\n });\n}\n\n// Helper functions\n\nfunction inferHttpMethod(methodName: string): string {\n const lower = methodName.toLowerCase();\n if (\n lower.includes('get') ||\n lower.includes('fetch') ||\n lower.includes('list')\n )\n return 'GET';\n if (lower.includes('post') || lower.includes('create')) return 'POST';\n if (lower.includes('put') || lower.includes('update')) return 'PUT';\n if (lower.includes('delete') || lower.includes('remove')) return 'DELETE';\n if (lower.includes('patch')) return 'PATCH';\n return 'GET'; // Default\n}\n\nfunction extractPath(url: string): string {\n try {\n const urlObj = new URL(url);\n return urlObj.pathname;\n } catch {\n // Relative URL or invalid\n return url.split('?')[0] || url;\n }\n}\n\nfunction parseUrl(url: string): {\n protocol: string;\n host: string;\n path: string;\n} {\n try {\n const urlObj = new URL(url);\n return {\n protocol: urlObj.protocol.replace(':', ''),\n host: urlObj.host,\n path: urlObj.pathname + urlObj.search,\n };\n } catch {\n return {\n protocol: 'http',\n host: 'unknown',\n path: url,\n };\n }\n}\n\nfunction extractStatusCode(result: unknown): number | undefined {\n if (result && typeof result === 'object') {\n // Check for Response.status (fetch API)\n if ('status' in result && typeof result.status === 'number') {\n return result.status;\n }\n // Check for statusCode (axios, node http)\n if ('statusCode' in result && typeof result.statusCode === 'number') {\n return result.statusCode;\n }\n }\n return undefined;\n}\n\n/**\n * Inject trace context into HTTP headers (for distributed tracing)\n *\n * This includes W3C Trace Context (traceparent, tracestate) and W3C Baggage headers.\n * Uses OpenTelemetry's propagation system for full compatibility.\n *\n * @example\n * ```typescript\n * import { injectTraceContext } from 'autotel/http'\n *\n * const headers = injectTraceContext({\n * 'Content-Type': 'application/json'\n * })\n *\n * fetch('/api/users', { headers })\n * ```\n *\n * @example With baggage\n * ```typescript\n * import { trace, withTracing, withBaggage, injectTraceContext } from 'autotel'\n *\n * export const createOrder = withTracing({})((ctx) => async (order: Order) => {\n * return await withBaggage({\n * baggage: { 'tenant.id': order.tenantId },\n * fn: async () => {\n * const headers = injectTraceContext();\n * // Headers now include 'baggage' header with tenant.id\n * await fetch('/api/charge', { headers });\n * },\n * });\n * });\n * ```\n */\nexport function injectTraceContext(\n headers: Record<string, string> = {},\n): Record<string, string> {\n // Use getActiveContextWithBaggage to check stored context (from baggage setters)\n // This ensures ctx.setBaggage() changes are included in injected headers\n const currentContext = getActiveContextWithBaggage();\n\n // Use OpenTelemetry's propagation.inject for full W3C support\n // This includes traceparent, tracestate, and baggage headers\n propagation.inject(currentContext, headers);\n\n return headers;\n}\n\n/**\n * Extract trace context from HTTP headers (for distributed tracing)\n *\n * This extracts W3C Trace Context (traceparent, tracestate) and W3C Baggage headers.\n * Uses OpenTelemetry's propagation system for full compatibility.\n *\n * Returns a context that can be used with context.with() to run code\n * with the extracted trace context and baggage.\n *\n * @example\n * ```typescript\n * import { extractTraceContext, trace, withTracing } from 'autotel'\n * import { context } from 'autotel'\n *\n * // In Express middleware\n * app.use((req, res, next) => {\n * const extractedContext = extractTraceContext(req.headers);\n * context.with(extractedContext, () => {\n * next();\n * });\n * });\n * ```\n *\n * @example In a traced function\n * ```typescript\n * export const handleWebhook = withTracing({})((ctx) => async (req: Request) => {\n * const extractedContext = extractTraceContext(req.headers);\n * return await context.with(extractedContext, async () => {\n * // Now ctx.getBaggage() will return baggage from the incoming request\n * const tenantId = ctx.getBaggage('tenant.id');\n * await processWebhook(req.body);\n * });\n * });\n * ```\n */\nexport function extractTraceContext(\n headers: Record<string, string | string[] | undefined>,\n): ReturnType<typeof context.active> {\n const carrier: Record<string, string> = {};\n\n // Convert headers to flat string format expected by propagation\n for (const [key, value] of Object.entries(headers)) {\n if (value !== undefined) {\n carrier[key] = Array.isArray(value) ? (value[0] ?? '') : value;\n }\n }\n\n // Extract context using OpenTelemetry's propagation system\n // Returns a Context that can be used with context.with()\n return propagation.extract(context.active(), carrier);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"http.d.cts","names":[],"sources":["../src/http.ts"],"mappings":";;UA0BiB;;EAEf;;EAEA,gBAAgB;;EAEhB,mBAAmB,oBAAoB;;EAEvC,sBAAsB,oBAAoB;;EAE1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA6Cc,iBAAiB,UAAS,2BAKvB;UAAoB;GACnC,QAAQ,GACR,UAAU;UAIa;IA+H1B;;;;;;;;;;;;;;iBAeqB,iBAAiB,GACrC,kBACA,UAAU,QAAQ,IAClB,aAAa,kCACZ,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwHK,mBACd,UAAS,yBACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+Ca,oBACd,SAAS,gDACR,kBAAkB,QAAQ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"http.d.ts","names":[],"sources":["../src/http.ts"],"mappings":";;UA0BiB;;EAEf;;EAEA,gBAAgB;;EAEhB,mBAAmB,oBAAoB;;EAEvC,sBAAsB,oBAAoB;;EAE1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA6Cc,iBAAiB,UAAS,2BAKvB;UAAoB;GACnC,QAAQ,GACR,UAAU;UAIa;IA+H1B;;;;;;;;;;;;;;iBAeqB,iBAAiB,GACrC,kBACA,UAAU,QAAQ,IAClB,aAAa,kCACZ,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwHK,mBACd,UAAS,yBACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+Ca,oBACd,SAAS,gDACR,kBAAkB,QAAQ"}