managed-deepagents 0.10.0-dev.8 → 0.10.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 (397) hide show
  1. package/README.md +881 -139
  2. package/dist/browser.d.ts +37 -0
  3. package/dist/browser.d.ts.map +1 -0
  4. package/dist/browser.js +31 -0
  5. package/dist/browser.js.map +1 -0
  6. package/dist/channels/actor.d.ts +57 -0
  7. package/dist/channels/actor.d.ts.map +1 -0
  8. package/dist/channels/actor.js +24 -0
  9. package/dist/channels/actor.js.map +1 -0
  10. package/dist/channels/assistant-text.d.ts +29 -0
  11. package/dist/channels/assistant-text.d.ts.map +1 -1
  12. package/dist/channels/assistant-text.js +81 -4
  13. package/dist/channels/assistant-text.js.map +1 -1
  14. package/dist/channels/binding.d.ts +20 -1
  15. package/dist/channels/binding.d.ts.map +1 -1
  16. package/dist/channels/binding.js +44 -11
  17. package/dist/channels/binding.js.map +1 -1
  18. package/dist/channels/delivery.d.ts +51 -0
  19. package/dist/channels/delivery.d.ts.map +1 -0
  20. package/dist/channels/delivery.js +424 -0
  21. package/dist/channels/delivery.js.map +1 -0
  22. package/dist/channels/github/app-setup.d.ts +32 -0
  23. package/dist/channels/github/app-setup.d.ts.map +1 -0
  24. package/dist/channels/github/app-setup.js +146 -0
  25. package/dist/channels/github/app-setup.js.map +1 -0
  26. package/dist/channels/github/index.d.ts +5 -1
  27. package/dist/channels/github/index.d.ts.map +1 -1
  28. package/dist/channels/github/index.js +49 -51
  29. package/dist/channels/github/index.js.map +1 -1
  30. package/dist/channels/github/mentions.d.ts +12 -0
  31. package/dist/channels/github/mentions.d.ts.map +1 -0
  32. package/dist/channels/github/mentions.js +185 -0
  33. package/dist/channels/github/mentions.js.map +1 -0
  34. package/dist/channels/github/schema.d.ts +271 -0
  35. package/dist/channels/github/schema.d.ts.map +1 -1
  36. package/dist/channels/github/schema.js +33 -0
  37. package/dist/channels/github/schema.js.map +1 -1
  38. package/dist/channels/github/types.d.ts +55 -15
  39. package/dist/channels/github/types.d.ts.map +1 -1
  40. package/dist/channels/http/endpoint.d.ts +137 -0
  41. package/dist/channels/http/endpoint.d.ts.map +1 -0
  42. package/dist/channels/http/endpoint.js +286 -0
  43. package/dist/channels/http/endpoint.js.map +1 -0
  44. package/dist/channels/http/http.d.ts.map +1 -1
  45. package/dist/channels/http/http.js +240 -95
  46. package/dist/channels/http/http.js.map +1 -1
  47. package/dist/channels/http/index.d.ts +7 -1
  48. package/dist/channels/http/index.d.ts.map +1 -1
  49. package/dist/channels/http/index.js +32 -32
  50. package/dist/channels/http/index.js.map +1 -1
  51. package/dist/channels/http/ingress.d.ts +30 -24
  52. package/dist/channels/http/ingress.d.ts.map +1 -1
  53. package/dist/channels/http/ingress.js +61 -57
  54. package/dist/channels/http/ingress.js.map +1 -1
  55. package/dist/channels/http/provider.d.ts +51 -9
  56. package/dist/channels/http/provider.d.ts.map +1 -1
  57. package/dist/channels/http/provider.js +66 -15
  58. package/dist/channels/http/provider.js.map +1 -1
  59. package/dist/channels/http/studio.d.ts +14 -5
  60. package/dist/channels/http/studio.d.ts.map +1 -1
  61. package/dist/channels/http/studio.js +20 -5
  62. package/dist/channels/http/studio.js.map +1 -1
  63. package/dist/channels/http/types.d.ts +110 -56
  64. package/dist/channels/http/types.d.ts.map +1 -1
  65. package/dist/channels/linear/app-setup.d.ts +29 -0
  66. package/dist/channels/linear/app-setup.d.ts.map +1 -0
  67. package/dist/channels/linear/app-setup.js +102 -0
  68. package/dist/channels/linear/app-setup.js.map +1 -0
  69. package/dist/channels/linear/index.d.ts +5 -1
  70. package/dist/channels/linear/index.d.ts.map +1 -1
  71. package/dist/channels/linear/index.js +75 -93
  72. package/dist/channels/linear/index.js.map +1 -1
  73. package/dist/channels/linear/schema.d.ts +11 -25
  74. package/dist/channels/linear/schema.d.ts.map +1 -1
  75. package/dist/channels/linear/schema.js +6 -0
  76. package/dist/channels/linear/schema.js.map +1 -1
  77. package/dist/channels/linear/types.d.ts +38 -16
  78. package/dist/channels/linear/types.d.ts.map +1 -1
  79. package/dist/channels/messaging-registry.d.ts +16 -0
  80. package/dist/channels/messaging-registry.d.ts.map +1 -1
  81. package/dist/channels/messaging-registry.js +29 -0
  82. package/dist/channels/messaging-registry.js.map +1 -1
  83. package/dist/channels/reserved-connections.d.ts.map +1 -1
  84. package/dist/channels/reserved-connections.js +10 -0
  85. package/dist/channels/reserved-connections.js.map +1 -1
  86. package/dist/channels/resolve-user-endpoint.d.ts +34 -0
  87. package/dist/channels/resolve-user-endpoint.d.ts.map +1 -0
  88. package/dist/channels/resolve-user-endpoint.js +51 -0
  89. package/dist/channels/resolve-user-endpoint.js.map +1 -0
  90. package/dist/channels/resolve-user.d.ts +95 -0
  91. package/dist/channels/resolve-user.d.ts.map +1 -0
  92. package/dist/channels/resolve-user.js +143 -0
  93. package/dist/channels/resolve-user.js.map +1 -0
  94. package/dist/channels/run-input.d.ts +46 -4
  95. package/dist/channels/run-input.d.ts.map +1 -1
  96. package/dist/channels/run-input.js +94 -30
  97. package/dist/channels/run-input.js.map +1 -1
  98. package/dist/channels/runtime.d.ts +5 -2
  99. package/dist/channels/runtime.d.ts.map +1 -1
  100. package/dist/channels/runtime.js +19 -10
  101. package/dist/channels/runtime.js.map +1 -1
  102. package/dist/channels/schedule-delivery.d.ts +2 -13
  103. package/dist/channels/schedule-delivery.d.ts.map +1 -1
  104. package/dist/channels/schedule-delivery.js +9 -76
  105. package/dist/channels/schedule-delivery.js.map +1 -1
  106. package/dist/channels/slack/api.d.ts +2 -0
  107. package/dist/channels/slack/api.d.ts.map +1 -1
  108. package/dist/channels/slack/api.js +6 -0
  109. package/dist/channels/slack/api.js.map +1 -1
  110. package/dist/channels/slack/connections.d.ts +6 -0
  111. package/dist/channels/slack/connections.d.ts.map +1 -0
  112. package/dist/channels/slack/connections.js +6 -0
  113. package/dist/channels/slack/connections.js.map +1 -0
  114. package/dist/channels/slack/events.d.ts +278 -0
  115. package/dist/channels/slack/events.d.ts.map +1 -0
  116. package/dist/channels/slack/events.js +235 -0
  117. package/dist/channels/slack/events.js.map +1 -0
  118. package/dist/channels/slack/files.d.ts.map +1 -1
  119. package/dist/channels/slack/files.js +2 -3
  120. package/dist/channels/slack/files.js.map +1 -1
  121. package/dist/channels/slack/index.d.ts +90 -2
  122. package/dist/channels/slack/index.d.ts.map +1 -1
  123. package/dist/channels/slack/index.js +188 -6
  124. package/dist/channels/slack/index.js.map +1 -1
  125. package/dist/channels/slack/message-content.d.ts.map +1 -1
  126. package/dist/channels/slack/message-content.js +23 -28
  127. package/dist/channels/slack/message-content.js.map +1 -1
  128. package/dist/channels/slack/status.d.ts +76 -0
  129. package/dist/channels/slack/status.d.ts.map +1 -0
  130. package/dist/channels/slack/status.js +427 -0
  131. package/dist/channels/slack/status.js.map +1 -0
  132. package/dist/channels/trigger/client.d.ts.map +1 -1
  133. package/dist/channels/trigger/client.js +9 -11
  134. package/dist/channels/trigger/client.js.map +1 -1
  135. package/dist/channels/trigger/conversation.d.ts +11 -0
  136. package/dist/channels/trigger/conversation.d.ts.map +1 -0
  137. package/dist/channels/trigger/conversation.js +72 -0
  138. package/dist/channels/trigger/conversation.js.map +1 -0
  139. package/dist/channels/trigger/http.d.ts +130 -4
  140. package/dist/channels/trigger/http.d.ts.map +1 -1
  141. package/dist/channels/trigger/http.js +419 -82
  142. package/dist/channels/trigger/http.js.map +1 -1
  143. package/dist/channels/trigger/identity-context.d.ts +1 -1
  144. package/dist/channels/trigger/identity-context.d.ts.map +1 -1
  145. package/dist/channels/trigger/identity-context.js +3 -5
  146. package/dist/channels/trigger/identity-context.js.map +1 -1
  147. package/dist/channels/trigger/ingress.d.ts +70 -1
  148. package/dist/channels/trigger/ingress.d.ts.map +1 -1
  149. package/dist/channels/trigger/ingress.js +141 -9
  150. package/dist/channels/trigger/ingress.js.map +1 -1
  151. package/dist/channels/trigger/transport.d.ts +10 -0
  152. package/dist/channels/trigger/transport.d.ts.map +1 -1
  153. package/dist/channels/trigger/transport.js +25 -9
  154. package/dist/channels/trigger/transport.js.map +1 -1
  155. package/dist/channels/trigger/types.d.ts +92 -3
  156. package/dist/channels/trigger/types.d.ts.map +1 -1
  157. package/dist/channels/trigger/types.js +37 -0
  158. package/dist/channels/trigger/types.js.map +1 -1
  159. package/dist/channels/types.d.ts +53 -4
  160. package/dist/channels/types.d.ts.map +1 -1
  161. package/dist/channels/types.js +2 -0
  162. package/dist/channels/types.js.map +1 -1
  163. package/dist/concurrency/batch-processor.d.ts +51 -0
  164. package/dist/concurrency/batch-processor.d.ts.map +1 -0
  165. package/dist/concurrency/batch-processor.js +99 -0
  166. package/dist/concurrency/batch-processor.js.map +1 -0
  167. package/dist/connections.d.ts +5 -12
  168. package/dist/connections.d.ts.map +1 -1
  169. package/dist/connections.js +28 -30
  170. package/dist/connections.js.map +1 -1
  171. package/dist/connectors/mcp/langsmith-url.d.ts.map +1 -1
  172. package/dist/connectors/mcp/langsmith-url.js +0 -1
  173. package/dist/connectors/mcp/langsmith-url.js.map +1 -1
  174. package/dist/credential-gate.js +3 -3
  175. package/dist/credential-gate.js.map +1 -1
  176. package/dist/define-deep-agent.d.ts +2 -2
  177. package/dist/define-deep-agent.d.ts.map +1 -1
  178. package/dist/define-deep-agent.js +53 -2
  179. package/dist/define-deep-agent.js.map +1 -1
  180. package/dist/identity/index.d.ts.map +1 -1
  181. package/dist/identity/index.js +3 -1
  182. package/dist/identity/index.js.map +1 -1
  183. package/dist/identity/loopback.d.ts +7 -2
  184. package/dist/identity/loopback.d.ts.map +1 -1
  185. package/dist/identity/loopback.js +15 -4
  186. package/dist/identity/loopback.js.map +1 -1
  187. package/dist/identity/options.d.ts +9 -0
  188. package/dist/identity/options.d.ts.map +1 -1
  189. package/dist/identity/options.js +1 -1
  190. package/dist/identity/options.js.map +1 -1
  191. package/dist/identity/slack/links.js +3 -2
  192. package/dist/identity/slack/links.js.map +1 -1
  193. package/dist/identity/types.d.ts +3 -0
  194. package/dist/identity/types.d.ts.map +1 -1
  195. package/dist/index.d.ts +15 -5
  196. package/dist/index.d.ts.map +1 -1
  197. package/dist/index.js +2 -1
  198. package/dist/index.js.map +1 -1
  199. package/dist/ingress/index.d.ts +8 -0
  200. package/dist/ingress/index.d.ts.map +1 -1
  201. package/dist/ingress/index.js +32 -2
  202. package/dist/ingress/index.js.map +1 -1
  203. package/dist/ingress/loopback.d.ts +1 -0
  204. package/dist/ingress/loopback.d.ts.map +1 -1
  205. package/dist/ingress/loopback.js +7 -3
  206. package/dist/ingress/loopback.js.map +1 -1
  207. package/dist/ingress/runs.d.ts +27 -1
  208. package/dist/ingress/runs.d.ts.map +1 -1
  209. package/dist/ingress/runs.js +69 -6
  210. package/dist/ingress/runs.js.map +1 -1
  211. package/dist/managed-composition.d.ts +3 -0
  212. package/dist/managed-composition.d.ts.map +1 -1
  213. package/dist/managed-composition.js +29 -13
  214. package/dist/managed-composition.js.map +1 -1
  215. package/dist/memory/instructions-middleware.d.ts.map +1 -1
  216. package/dist/memory/instructions-middleware.js +6 -5
  217. package/dist/memory/instructions-middleware.js.map +1 -1
  218. package/dist/namespaces.d.ts +4 -21
  219. package/dist/namespaces.d.ts.map +1 -1
  220. package/dist/namespaces.js +0 -29
  221. package/dist/namespaces.js.map +1 -1
  222. package/dist/resilience/retry.d.ts +21 -0
  223. package/dist/resilience/retry.d.ts.map +1 -0
  224. package/dist/resilience/retry.js +40 -0
  225. package/dist/resilience/retry.js.map +1 -0
  226. package/dist/runtime/async-subagents.d.ts +27 -0
  227. package/dist/runtime/async-subagents.d.ts.map +1 -0
  228. package/dist/runtime/async-subagents.js +139 -0
  229. package/dist/runtime/async-subagents.js.map +1 -0
  230. package/dist/runtime/auth.d.ts +1 -2
  231. package/dist/runtime/auth.d.ts.map +1 -1
  232. package/dist/runtime/auth.js +138 -72
  233. package/dist/runtime/auth.js.map +1 -1
  234. package/dist/runtime/backend.d.ts +9 -1
  235. package/dist/runtime/backend.d.ts.map +1 -1
  236. package/dist/runtime/backend.js +36 -11
  237. package/dist/runtime/backend.js.map +1 -1
  238. package/dist/runtime/browser-facade.d.ts +10 -0
  239. package/dist/runtime/browser-facade.d.ts.map +1 -0
  240. package/dist/runtime/browser-facade.js +23 -0
  241. package/dist/runtime/browser-facade.js.map +1 -0
  242. package/dist/runtime/browser-langsmith.d.ts +143 -0
  243. package/dist/runtime/browser-langsmith.d.ts.map +1 -0
  244. package/dist/runtime/browser-langsmith.js +507 -0
  245. package/dist/runtime/browser-langsmith.js.map +1 -0
  246. package/dist/runtime/browser-recorder.py +831 -0
  247. package/dist/runtime/browser-selection.d.ts +10 -0
  248. package/dist/runtime/browser-selection.d.ts.map +1 -0
  249. package/dist/runtime/browser-selection.js +21 -0
  250. package/dist/runtime/browser-selection.js.map +1 -0
  251. package/dist/runtime/browser.d.ts +138 -0
  252. package/dist/runtime/browser.d.ts.map +1 -0
  253. package/dist/runtime/browser.js +802 -0
  254. package/dist/runtime/browser.js.map +1 -0
  255. package/dist/runtime/channel-icon.d.ts.map +1 -1
  256. package/dist/runtime/channel-icon.js +18 -7
  257. package/dist/runtime/channel-icon.js.map +1 -1
  258. package/dist/runtime/channel.d.ts +5 -0
  259. package/dist/runtime/channel.d.ts.map +1 -1
  260. package/dist/runtime/channel.js.map +1 -1
  261. package/dist/runtime/graph-build-timing.d.ts +30 -0
  262. package/dist/runtime/graph-build-timing.d.ts.map +1 -0
  263. package/dist/runtime/graph-build-timing.js +50 -0
  264. package/dist/runtime/graph-build-timing.js.map +1 -0
  265. package/dist/runtime/http.d.ts +15 -0
  266. package/dist/runtime/http.d.ts.map +1 -1
  267. package/dist/runtime/http.js +37 -0
  268. package/dist/runtime/http.js.map +1 -1
  269. package/dist/runtime/identity-http.d.ts.map +1 -1
  270. package/dist/runtime/identity-http.js +19 -7
  271. package/dist/runtime/identity-http.js.map +1 -1
  272. package/dist/runtime/identity-runtime.d.ts +4 -9
  273. package/dist/runtime/identity-runtime.d.ts.map +1 -1
  274. package/dist/runtime/identity-runtime.js +12 -25
  275. package/dist/runtime/identity-runtime.js.map +1 -1
  276. package/dist/runtime/index.d.ts +38 -1
  277. package/dist/runtime/index.d.ts.map +1 -1
  278. package/dist/runtime/index.js +104 -52
  279. package/dist/runtime/index.js.map +1 -1
  280. package/dist/runtime/langsmith-env.d.ts +19 -0
  281. package/dist/runtime/langsmith-env.d.ts.map +1 -0
  282. package/dist/runtime/langsmith-env.js +38 -0
  283. package/dist/runtime/langsmith-env.js.map +1 -0
  284. package/dist/runtime/log.d.ts +8 -14
  285. package/dist/runtime/log.d.ts.map +1 -1
  286. package/dist/runtime/log.js +16 -7
  287. package/dist/runtime/log.js.map +1 -1
  288. package/dist/runtime/managed-middleware.d.ts.map +1 -1
  289. package/dist/runtime/managed-middleware.js +1 -14
  290. package/dist/runtime/managed-middleware.js.map +1 -1
  291. package/dist/runtime/managed-thread.d.ts +61 -0
  292. package/dist/runtime/managed-thread.d.ts.map +1 -0
  293. package/dist/runtime/managed-thread.js +76 -0
  294. package/dist/runtime/managed-thread.js.map +1 -0
  295. package/dist/runtime/managed-tools.d.ts +18 -2
  296. package/dist/runtime/managed-tools.d.ts.map +1 -1
  297. package/dist/runtime/managed-tools.js +26 -22
  298. package/dist/runtime/managed-tools.js.map +1 -1
  299. package/dist/runtime/memory/mounts.d.ts +82 -11
  300. package/dist/runtime/memory/mounts.d.ts.map +1 -1
  301. package/dist/runtime/memory/mounts.js +173 -34
  302. package/dist/runtime/memory/mounts.js.map +1 -1
  303. package/dist/runtime/memory/policy.d.ts.map +1 -1
  304. package/dist/runtime/memory/policy.js +1 -3
  305. package/dist/runtime/memory/policy.js.map +1 -1
  306. package/dist/runtime/parent-run.d.ts +33 -0
  307. package/dist/runtime/parent-run.d.ts.map +1 -0
  308. package/dist/runtime/parent-run.js +114 -0
  309. package/dist/runtime/parent-run.js.map +1 -0
  310. package/dist/runtime/run-input.d.ts +14 -1
  311. package/dist/runtime/run-input.d.ts.map +1 -1
  312. package/dist/runtime/run-input.js +118 -7
  313. package/dist/runtime/run-input.js.map +1 -1
  314. package/dist/runtime/sandbox-manager.d.ts +31 -17
  315. package/dist/runtime/sandbox-manager.d.ts.map +1 -1
  316. package/dist/runtime/sandbox-manager.js +112 -70
  317. package/dist/runtime/sandbox-manager.js.map +1 -1
  318. package/dist/runtime/schedule-auth.d.ts +79 -0
  319. package/dist/runtime/schedule-auth.d.ts.map +1 -1
  320. package/dist/runtime/schedule-auth.js +165 -7
  321. package/dist/runtime/schedule-auth.js.map +1 -1
  322. package/dist/runtime/selected-skills-backend.d.ts +3 -3
  323. package/dist/runtime/selected-skills-backend.d.ts.map +1 -1
  324. package/dist/runtime/selected-skills-backend.js +5 -5
  325. package/dist/runtime/selected-skills-backend.js.map +1 -1
  326. package/dist/runtime/static-entry.d.ts.map +1 -1
  327. package/dist/runtime/static-entry.js +1 -0
  328. package/dist/runtime/static-entry.js.map +1 -1
  329. package/dist/runtime/thread-record.d.ts +88 -0
  330. package/dist/runtime/thread-record.d.ts.map +1 -0
  331. package/dist/runtime/thread-record.js +213 -0
  332. package/dist/runtime/thread-record.js.map +1 -0
  333. package/dist/runtime/types.d.ts +12 -1
  334. package/dist/runtime/types.d.ts.map +1 -1
  335. package/dist/runtime-schedules.d.ts +15 -0
  336. package/dist/runtime-schedules.d.ts.map +1 -1
  337. package/dist/runtime-schedules.js +85 -23
  338. package/dist/runtime-schedules.js.map +1 -1
  339. package/dist/sandbox.d.ts +0 -6
  340. package/dist/sandbox.d.ts.map +1 -1
  341. package/dist/sandbox.js +3 -7
  342. package/dist/sandbox.js.map +1 -1
  343. package/dist/schedule-channel.d.ts +5 -2
  344. package/dist/schedule-channel.d.ts.map +1 -1
  345. package/dist/schedule-channel.js +13 -12
  346. package/dist/schedule-channel.js.map +1 -1
  347. package/dist/telemetry/lifecycle.d.ts +26 -0
  348. package/dist/telemetry/lifecycle.d.ts.map +1 -0
  349. package/dist/telemetry/lifecycle.js +49 -0
  350. package/dist/telemetry/lifecycle.js.map +1 -0
  351. package/dist/telemetry/metadata.d.ts.map +1 -1
  352. package/dist/telemetry/metadata.js +4 -4
  353. package/dist/telemetry/metadata.js.map +1 -1
  354. package/dist/telemetry/otel/context.d.ts +57 -0
  355. package/dist/telemetry/otel/context.d.ts.map +1 -0
  356. package/dist/telemetry/otel/context.js +122 -0
  357. package/dist/telemetry/otel/context.js.map +1 -0
  358. package/dist/telemetry/otel/exporter.d.ts +53 -0
  359. package/dist/telemetry/otel/exporter.d.ts.map +1 -0
  360. package/dist/telemetry/otel/exporter.js +190 -0
  361. package/dist/telemetry/otel/exporter.js.map +1 -0
  362. package/dist/telemetry/otel/index.d.ts +6 -0
  363. package/dist/telemetry/otel/index.d.ts.map +1 -0
  364. package/dist/telemetry/otel/index.js +3 -0
  365. package/dist/telemetry/otel/index.js.map +1 -0
  366. package/dist/telemetry/otel/otlp.d.ts +44 -0
  367. package/dist/telemetry/otel/otlp.d.ts.map +1 -0
  368. package/dist/telemetry/otel/otlp.js +7 -0
  369. package/dist/telemetry/otel/otlp.js.map +1 -0
  370. package/dist/telemetry/otel/truncate.d.ts +10 -0
  371. package/dist/telemetry/otel/truncate.d.ts.map +1 -0
  372. package/dist/telemetry/otel/truncate.js +39 -0
  373. package/dist/telemetry/otel/truncate.js.map +1 -0
  374. package/dist/telemetry/run-listener.d.ts +1 -1
  375. package/dist/telemetry/run-listener.d.ts.map +1 -1
  376. package/dist/telemetry/run-listener.js +32 -2
  377. package/dist/telemetry/run-listener.js.map +1 -1
  378. package/dist/telemetry/transport/posthog.d.ts +13 -1
  379. package/dist/telemetry/transport/posthog.d.ts.map +1 -1
  380. package/dist/telemetry/transport/posthog.js +68 -30
  381. package/dist/telemetry/transport/posthog.js.map +1 -1
  382. package/dist/types.d.ts +19 -2
  383. package/dist/types.d.ts.map +1 -1
  384. package/dist/types.js.map +1 -1
  385. package/dist/values.d.ts +15 -0
  386. package/dist/values.d.ts.map +1 -0
  387. package/dist/values.js +31 -0
  388. package/dist/values.js.map +1 -0
  389. package/package.json +26 -12
  390. package/dist/channels/http/forward.d.ts +0 -13
  391. package/dist/channels/http/forward.d.ts.map +0 -1
  392. package/dist/channels/http/forward.js +0 -128
  393. package/dist/channels/http/forward.js.map +0 -1
  394. package/dist/channels/http/reply.d.ts +0 -20
  395. package/dist/channels/http/reply.d.ts.map +0 -1
  396. package/dist/channels/http/reply.js +0 -116
  397. package/dist/channels/http/reply.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../../../src/telemetry/otel/exporter.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAc7D,OAAO,KAAK,EAAoC,SAAS,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,KAAK,EACV,wBAAwB,EAGxB,aAAa,EACd,MAAM,WAAW,CAAC;AAUnB,6EAA6E;AAC7E,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,wEAAwE;AACxE,eAAO,MAAM,iBAAiB,QAAU,CAAC;AAOzC,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAMD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,aAAa,GAAG,SAAS,CAqB3B;AAmBD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,aAAa,CAahE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,aAAa,EAAE,EACxB,cAAc,GAAE,MAAyB,GACxC,wBAAwB,CAgB1B;AAWD,2DAA2D;AAC3D,MAAM,WAAW,OAAO;IACtB,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,0DAA0D;IAC1D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AASD,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAsBnE;AA0BD;;;GAGG;AACH,wBAAgB,OAAO,IAAI,OAAO,CAOjC;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAEtE"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * The process-wide log sink: sends records from every log context to the
3
+ * LangSmith MDA log collection endpoint as OTLP/HTTP JSON, which forwards them
4
+ * to Datadog.
5
+ *
6
+ * Built on our own `BatchProcessor` and `withRetry` rather than the OTel SDK.
7
+ * PostHog events need the same batching and retry, so both sinks share one
8
+ * mechanism, and the Python runtime mirrors it.
9
+ */
10
+ import { agentAuthHeaders } from "../../agent-auth.js";
11
+ import { resolveAgentAuthBaseUrl } from "../../connections.js";
12
+ import { sendsKeySecurely } from "../../identity/loopback.js";
13
+ import { BatchProcessor } from "../../concurrency/batch-processor.js";
14
+ import { withRetry } from "../../resilience/retry.js";
15
+ import { fetchWithTimeout, HttpStatusError, isRetryable, requestedDelayMs, } from "../../runtime/http.js";
16
+ import { resolveServerApiKey, resolveTenantWorkspaceId, } from "../../runtime/langsmith-env.js";
17
+ import { isTelemetryDisabled } from "../gates.js";
18
+ import { onShutdown } from "../lifecycle.js";
19
+ import { packageVersion } from "../metadata.js";
20
+ const LOGS_PATH = "/v1/platform/mda/otel/v1/logs";
21
+ const SERVICE_NAME = "mda-node";
22
+ /** Bounds one export request; the OTel exporters' default. */
23
+ const EXPORT_TIMEOUT_MS = 10_000;
24
+ /** How long a partial batch waits for more records. */
25
+ const BATCH_WAIT_MS = 1_000;
26
+ /** Records waiting to send; later ones are dropped. */
27
+ const MAX_QUEUED_RECORDS = 10_000;
28
+ /** The collection endpoint accepts at most this many records per request. */
29
+ export const MAX_RECORDS_PER_REQUEST = 200;
30
+ /** Encoded records per request, under the endpoint's 5MB body limit. */
31
+ export const MAX_REQUEST_BYTES = 4 << 20;
32
+ /** OTel semantic-convention attribute for a log record's unique id. */
33
+ const RECORD_UID_KEY = "log.record.uid";
34
+ const SEVERITY_NUMBER = { INFO: 9, WARN: 13, ERROR: 17 };
35
+ function nonempty(value) {
36
+ return value?.trim() || undefined;
37
+ }
38
+ /**
39
+ * Where and how to send logs, or `undefined` when logs must not be sent:
40
+ * telemetry is off, the process is not a LangSmith deployment, there is no
41
+ * key, or the key would cross the network in cleartext.
42
+ */
43
+ export function resolveOtelLogConfig(env = process.env) {
44
+ if (isTelemetryDisabled(env))
45
+ return undefined;
46
+ if (env.MDA_LOCAL_DEV === "1" || !nonempty(env.LANGSMITH_HOST_PROJECT_ID)) {
47
+ return undefined;
48
+ }
49
+ const apiKey = resolveServerApiKey(env);
50
+ if (!apiKey)
51
+ return undefined;
52
+ let url;
53
+ try {
54
+ url = new URL(LOGS_PATH, resolveAgentAuthBaseUrl(env));
55
+ }
56
+ catch {
57
+ return undefined;
58
+ }
59
+ if (!sendsKeySecurely(url))
60
+ return undefined;
61
+ return {
62
+ url: url.toString(),
63
+ headers: agentAuthHeaders({
64
+ apiKey,
65
+ workspaceId: resolveTenantWorkspaceId(env),
66
+ }),
67
+ };
68
+ }
69
+ function anyValue(value) {
70
+ if (typeof value === "boolean")
71
+ return { boolValue: value };
72
+ if (typeof value === "number") {
73
+ return Number.isInteger(value)
74
+ ? { intValue: String(value) }
75
+ : { doubleValue: value };
76
+ }
77
+ return { stringValue: value };
78
+ }
79
+ function keyValues(attributes) {
80
+ return Object.entries(attributes).map(([key, value]) => ({
81
+ key,
82
+ value: anyValue(value),
83
+ }));
84
+ }
85
+ export function toOtlpLogRecord(record) {
86
+ return {
87
+ timeUnixNano: record.timeUnixNano,
88
+ severityNumber: SEVERITY_NUMBER[record.severity],
89
+ severityText: record.severity,
90
+ body: { stringValue: record.body },
91
+ attributes: [
92
+ ...keyValues(record.attributes),
93
+ { key: RECORD_UID_KEY, value: { stringValue: record.uid } },
94
+ ],
95
+ traceId: record.traceId,
96
+ spanId: record.spanId,
97
+ };
98
+ }
99
+ /**
100
+ * One OTLP `ExportLogsServiceRequest`. Records from many contexts can share a
101
+ * request; each keeps its own trace and span ids.
102
+ */
103
+ export function encodeLogs(records, serviceVersion = packageVersion()) {
104
+ return {
105
+ resourceLogs: [
106
+ {
107
+ resource: {
108
+ attributes: keyValues({
109
+ "service.name": SERVICE_NAME,
110
+ "service.version": serviceVersion,
111
+ }),
112
+ },
113
+ scopeLogs: [
114
+ { scope: { name: "managed-deepagents" }, logRecords: records },
115
+ ],
116
+ },
117
+ ],
118
+ };
119
+ }
120
+ /** 429 and 5xx (including timeouts and network failures) are tried again. */
121
+ const EXPORT_RETRY = {
122
+ maxAttempts: 5,
123
+ baseDelayMs: 1_000,
124
+ maxDelayMs: 30_000,
125
+ retryOn: isRetryable,
126
+ delayFor: requestedDelayMs,
127
+ };
128
+ const NOOP_SINK = {
129
+ enabled: false,
130
+ push: () => undefined,
131
+ idle: async () => undefined,
132
+ shutdown: async () => undefined,
133
+ };
134
+ /**
135
+ * A sink that batches records in the background and sends them to the
136
+ * collection endpoint. Drops everything when {@link resolveOtelLogConfig}
137
+ * returns nothing.
138
+ */
139
+ export function createLogSink(options = {}) {
140
+ const config = resolveOtelLogConfig(options.env);
141
+ if (!config)
142
+ return NOOP_SINK;
143
+ const processor = new BatchProcessor({
144
+ handle: withRetry((batch, signal) => postLogs(config, batch, signal, options.fetch), options.retry ?? EXPORT_RETRY),
145
+ maxBatchSize: MAX_RECORDS_PER_REQUEST,
146
+ maxBatchBytes: MAX_REQUEST_BYTES,
147
+ sizeOf: (record) => Buffer.byteLength(JSON.stringify(record)),
148
+ maxWaitMs: options.maxWaitMs ?? BATCH_WAIT_MS,
149
+ maxQueued: MAX_QUEUED_RECORDS,
150
+ });
151
+ return {
152
+ enabled: true,
153
+ push: (record) => {
154
+ processor.push(toOtlpLogRecord(record));
155
+ },
156
+ idle: () => processor.idle(),
157
+ shutdown: (deadlineMs) => processor.shutdown(deadlineMs),
158
+ };
159
+ }
160
+ async function postLogs(config, batch, signal, fetchImpl) {
161
+ const response = await fetchWithTimeout(config.url, {
162
+ method: "POST",
163
+ headers: config.headers,
164
+ body: JSON.stringify(encodeLogs(batch)),
165
+ redirect: "error",
166
+ signal,
167
+ }, EXPORT_TIMEOUT_MS, fetchImpl);
168
+ await response.body?.cancel();
169
+ if (!response.ok)
170
+ throw HttpStatusError.from(response);
171
+ }
172
+ let sink;
173
+ /**
174
+ * The process-wide sink, created on first use. When it exports, it drains at
175
+ * process shutdown.
176
+ */
177
+ export function logSink() {
178
+ if (!sink) {
179
+ const created = createLogSink();
180
+ if (created !== NOOP_SINK)
181
+ onShutdown((ms) => created.shutdown(ms));
182
+ sink = created;
183
+ }
184
+ return sink;
185
+ }
186
+ /** @internal Test-only sink override; `undefined` restores the default. */
187
+ export function setLogSinkForTests(override) {
188
+ sink = override;
189
+ }
190
+ //# sourceMappingURL=exporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporter.js","sourceRoot":"","sources":["../../../src/telemetry/otel/exporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { createLogContext, currentLogContext, exceptionAttributes, holdLogContext, newSpanId, newTraceId, recordLog, runInLogContext, setLogAttributes, TRACE_ID_METADATA_KEY, traceIdFromMetadata, traceIdFromTraceparent, withLogContext, } from "./context.js";
2
+ export type { LogAttributes, LogAttributeValue, LogContext, LogRecord, LogSeverity, } from "./context.js";
3
+ export { createLogSink, encodeLogs, logSink, MAX_RECORDS_PER_REQUEST, MAX_REQUEST_BYTES, resolveOtelLogConfig, setLogSinkForTests, toOtlpLogRecord, } from "./exporter.js";
4
+ export type { LogSink, LogSinkOptions, OtelLogConfig } from "./exporter.js";
5
+ export type { ExportLogsServiceRequest, OtlpAnyValue, OtlpKeyValue, OtlpLogRecord, OtlpResourceLogs, OtlpScopeLogs, } from "./otlp.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/telemetry/otel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,SAAS,EACT,UAAU,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,aAAa,EACb,UAAU,EACV,OAAO,EACP,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5E,YAAY,EACV,wBAAwB,EACxB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,aAAa,GACd,MAAM,WAAW,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createLogContext, currentLogContext, exceptionAttributes, holdLogContext, newSpanId, newTraceId, recordLog, runInLogContext, setLogAttributes, TRACE_ID_METADATA_KEY, traceIdFromMetadata, traceIdFromTraceparent, withLogContext, } from "./context.js";
2
+ export { createLogSink, encodeLogs, logSink, MAX_RECORDS_PER_REQUEST, MAX_REQUEST_BYTES, resolveOtelLogConfig, setLogSinkForTests, toOtlpLogRecord, } from "./exporter.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/telemetry/otel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,SAAS,EACT,UAAU,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,GACf,MAAM,cAAc,CAAC;AAQtB,OAAO,EACL,aAAa,EACb,UAAU,EACV,OAAO,EACP,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,GAChB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * The OTLP/HTTP JSON shapes the log collection endpoint accepts: the subset of
3
+ * `ExportLogsServiceRequest` this runtime sends. Field names follow the OTLP
4
+ * JSON encoding (lowerCamelCase; 64-bit integers as decimal strings).
5
+ */
6
+ export type OtlpAnyValue = {
7
+ stringValue: string;
8
+ } | {
9
+ boolValue: boolean;
10
+ } | {
11
+ intValue: string;
12
+ } | {
13
+ doubleValue: number;
14
+ };
15
+ export interface OtlpKeyValue {
16
+ key: string;
17
+ value: OtlpAnyValue;
18
+ }
19
+ /** One record, carrying its own context's trace and span ids. */
20
+ export interface OtlpLogRecord {
21
+ timeUnixNano: string;
22
+ severityNumber: number;
23
+ severityText: string;
24
+ body: OtlpAnyValue;
25
+ attributes: OtlpKeyValue[];
26
+ traceId: string;
27
+ spanId: string;
28
+ }
29
+ export interface OtlpScopeLogs {
30
+ scope: {
31
+ name: string;
32
+ };
33
+ logRecords: OtlpLogRecord[];
34
+ }
35
+ export interface OtlpResourceLogs {
36
+ resource: {
37
+ attributes: OtlpKeyValue[];
38
+ };
39
+ scopeLogs: OtlpScopeLogs[];
40
+ }
41
+ export interface ExportLogsServiceRequest {
42
+ resourceLogs: OtlpResourceLogs[];
43
+ }
44
+ //# sourceMappingURL=otlp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp.d.ts","sourceRoot":"","sources":["../../../src/telemetry/otel/otlp.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,YAAY,GACpB;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GACvB;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,GACtB;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GACpB;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5B,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,iEAAiE;AACjE,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACxB,UAAU,EAAE,aAAa,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE;QAAE,UAAU,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC;IACzC,SAAS,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,gBAAgB,EAAE,CAAC;CAClC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The OTLP/HTTP JSON shapes the log collection endpoint accepts: the subset of
3
+ * `ExportLogsServiceRequest` this runtime sends. Field names follow the OTLP
4
+ * JSON encoding (lowerCamelCase; 64-bit integers as decimal strings).
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=otlp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp.js","sourceRoot":"","sources":["../../../src/telemetry/otel/otlp.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Keeps a log value within the collection endpoint's per-value limit by
3
+ * cutting its middle, as the CLI does: the start says what failed, and the end
4
+ * of a stacktrace or a child's output usually says why.
5
+ */
6
+ /** The collection endpoint keeps up to this many bytes of a value. */
7
+ export declare const MAX_VALUE_BYTES: number;
8
+ /** `value` within `maxBytes` of UTF-8: its start and end, with the cut size. */
9
+ export declare function truncateMiddle(value: string, maxBytes?: number): string;
10
+ //# sourceMappingURL=truncate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../../../src/telemetry/otel/truncate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sEAAsE;AACtE,eAAO,MAAM,eAAe,QAAW,CAAC;AAMxC,gFAAgF;AAChF,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,QAAQ,GAAE,MAAwB,GACjC,MAAM,CAaR"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Keeps a log value within the collection endpoint's per-value limit by
3
+ * cutting its middle, as the CLI does: the start says what failed, and the end
4
+ * of a stacktrace or a child's output usually says why.
5
+ */
6
+ /** The collection endpoint keeps up to this many bytes of a value. */
7
+ export const MAX_VALUE_BYTES = 32 << 10;
8
+ /** Kept from the start of a value that is too long; the rest keeps its end. */
9
+ const HEAD_BYTES = 1 << 10;
10
+ /** Room for the omission marker. */
11
+ const MARKER_BYTES = 48;
12
+ /** `value` within `maxBytes` of UTF-8: its start and end, with the cut size. */
13
+ export function truncateMiddle(value, maxBytes = MAX_VALUE_BYTES) {
14
+ // A UTF-16 code unit is at most 3 UTF-8 bytes.
15
+ if (value.length * 3 <= maxBytes)
16
+ return value;
17
+ const bytes = Buffer.from(value, "utf8");
18
+ if (bytes.length <= maxBytes)
19
+ return value;
20
+ const headEnd = floorBoundary(bytes, HEAD_BYTES);
21
+ const tailStart = ceilBoundary(bytes, bytes.length - (maxBytes - HEAD_BYTES - MARKER_BYTES));
22
+ return `${bytes.subarray(0, headEnd).toString("utf8")}\n… ${tailStart - headEnd} bytes omitted …\n${bytes.subarray(tailStart).toString("utf8")}`;
23
+ }
24
+ function isContinuation(byte) {
25
+ return byte !== undefined && (byte & 0xc0) === 0x80;
26
+ }
27
+ function floorBoundary(bytes, index) {
28
+ let at = index;
29
+ while (at > 0 && isContinuation(bytes[at]))
30
+ at--;
31
+ return at;
32
+ }
33
+ function ceilBoundary(bytes, index) {
34
+ let at = index;
35
+ while (at < bytes.length && isContinuation(bytes[at]))
36
+ at++;
37
+ return at;
38
+ }
39
+ //# sourceMappingURL=truncate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncate.js","sourceRoot":"","sources":["../../../src/telemetry/otel/truncate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sEAAsE;AACtE,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,IAAI,EAAE,CAAC;AACxC,+EAA+E;AAC/E,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,CAAC;AAC3B,oCAAoC;AACpC,MAAM,YAAY,GAAG,EAAE,CAAC;AAExB,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAC5B,KAAa,EACb,QAAQ,GAAW,eAAe;IAElC,+CAA+C;IAC/C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC3C,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,YAAY,CAC5B,KAAK,EACL,KAAK,CAAC,MAAM,GAAG,CAAC,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC,CACtD,CAAC;IACF,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OACnD,SAAS,GAAG,OACd,qBAAqB,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,SAAS,cAAc,CAAC,IAAwB;IAC9C,OAAO,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;AACtD,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,KAAa;IACjD,IAAI,EAAE,GAAG,KAAK,CAAC;IACf,OAAO,EAAE,GAAG,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAAE,EAAE,EAAE,CAAC;IACjD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,KAAa;IAChD,IAAI,EAAE,GAAG,KAAK,CAAC;IACf,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAAE,EAAE,EAAE,CAAC;IAC5D,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -14,7 +14,7 @@ export declare class RunTelemetryListener extends GraphCallbackHandler {
14
14
  handleChainStart(_chain: unknown, _inputs: unknown, runId: string): void;
15
15
  handleInterrupt(event: GraphInterruptEvent): void;
16
16
  handleChainEnd(_outputs: unknown, runId: string): void;
17
- handleChainError(_error: unknown, runId: string): void;
17
+ handleChainError(error: unknown, runId: string): void;
18
18
  private report;
19
19
  }
20
20
  //# sourceMappingURL=run-listener.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-listener.d.ts","sourceRoot":"","sources":["../../src/telemetry/run-listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAc,MAAM,UAAU,CAAC;AAY1E,8CAA8C;AAC9C,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,eAAe,CAAC,iBAAiB,CAAC,GAAG,SAAS,GACvD,IAAI,CAEN;AAED,qBAAa,oBAAqB,SAAQ,oBAAoB;IAMhD,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,IAAI,SAA0B;IAC9B,aAAa,UAAQ;IACrB,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAS;IAE5B,YAA6B,OAAO,EAAE,UAAU,EAE/C;IAED,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAGvE;IAED,eAAe,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAIhD;IAED,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIrD;IAED,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIrD;IAED,OAAO,CAAC,MAAM;CAQf"}
1
+ {"version":3,"file":"run-listener.d.ts","sourceRoot":"","sources":["../../src/telemetry/run-listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAK9C,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAc,MAAM,UAAU,CAAC;AAY1E,8CAA8C;AAC9C,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,eAAe,CAAC,iBAAiB,CAAC,GAAG,SAAS,GACvD,IAAI,CAEN;AAED,qBAAa,oBAAqB,SAAQ,oBAAoB;IAMhD,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,IAAI,SAA0B;IAC9B,aAAa,UAAQ;IACrB,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAS;IAE5B,YAA6B,OAAO,EAAE,UAAU,EAE/C;IAED,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAGvE;IAED,eAAe,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAIhD;IAED,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIrD;IAED,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAKpD;IAED,OAAO,CAAC,MAAM;CAYf"}
@@ -1,5 +1,6 @@
1
1
  import { GraphCallbackHandler } from "@langchain/langgraph";
2
2
  import { TelemetryClient } from "./client.js";
3
+ import { recordLog } from "./otel/index.js";
3
4
  import { isTelemetryDisabled } from "./gates.js";
4
5
  import { finishRun } from "./run.js";
5
6
  import { posthogTransport } from "./transport/posthog.js";
@@ -36,8 +37,9 @@ export class RunTelemetryListener extends GraphCallbackHandler {
36
37
  this.report(this.interrupted ? "interrupted" : "success");
37
38
  }
38
39
  }
39
- handleChainError(_error, runId) {
40
+ handleChainError(error, runId) {
40
41
  if (runId === this.rootRunId) {
42
+ recordLog("ERROR", "run failed", { error });
41
43
  this.report("failure");
42
44
  }
43
45
  }
@@ -45,10 +47,38 @@ export class RunTelemetryListener extends GraphCallbackHandler {
45
47
  if (this.pending.emitted)
46
48
  return;
47
49
  this.pending.emitted = true;
50
+ const event = finishRun(this.pending, outcome);
51
+ recordLog("INFO", "run completed", {
52
+ attributes: completionAttributes(event),
53
+ });
48
54
  // Delivery must not delay the run result.
49
55
  runClient()
50
- .record(finishRun(this.pending, outcome))
56
+ .record(event)
51
57
  .catch(() => { });
52
58
  }
53
59
  }
60
+ /**
61
+ * Event bookkeeping that says nothing about the run. `event_id` stays, so the
62
+ * record joins to its PostHog event.
63
+ */
64
+ const EVENT_ONLY_FIELDS = new Set([
65
+ "event_type",
66
+ "schema_version",
67
+ "created_at",
68
+ "distinct_id",
69
+ ]);
70
+ /** The `run_completed` fields as attributes of the completion log record. */
71
+ function completionAttributes(event) {
72
+ const attributes = {};
73
+ for (const [key, value] of Object.entries(event)) {
74
+ if (EVENT_ONLY_FIELDS.has(key))
75
+ continue;
76
+ if (typeof value === "string" ||
77
+ typeof value === "number" ||
78
+ typeof value === "boolean") {
79
+ attributes[key] = value;
80
+ }
81
+ }
82
+ return attributes;
83
+ }
54
84
  //# sourceMappingURL=run-listener.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-listener.js","sourceRoot":"","sources":["../../src/telemetry/run-listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,IAAI,MAAsD,CAAC;AAE3D,SAAS,SAAS;IAChB,MAAM,KAAK,IAAI,eAAe,CAC5B,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAClE,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,6BAA6B,CAC3C,QAAwD;IAExD,MAAM,GAAG,QAAQ,CAAC;AACpB,CAAC;AAED,MAAM,OAAO,oBAAqB,SAAQ,oBAAoB;IAM/B,OAAO;IALpC,IAAI,GAAG,sBAAsB,CAAC;IAC9B,aAAa,GAAG,IAAI,CAAC;IACb,SAAS,CAAU;IACnB,WAAW,GAAG,KAAK,CAAC;IAE5B,YAA6B,OAAmB;QAC9C,KAAK,EAAE,CAAC;uBADmB,OAAO;IAEpC,CAAC;IAED,gBAAgB,CAAC,MAAe,EAAE,OAAgB,EAAE,KAAa;QAC/D,mEAAmE;QACnE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;IAC3B,CAAC;IAED,eAAe,CAAC,KAA0B;QACxC,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,cAAc,CAAC,QAAiB,EAAE,KAAa;QAC7C,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,gBAAgB,CAAC,MAAe,EAAE,KAAa;QAC7C,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,OAAmB;QAChC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,OAAO;QACjC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QAC5B,0CAA0C;QAC1C,SAAS,EAAE;aACR,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;aACxC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrB,CAAC;CACF"}
1
+ {"version":3,"file":"run-listener.js","sourceRoot":"","sources":["../../src/telemetry/run-listener.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { RetryPolicy } from "../../resilience/retry.js";
1
2
  import type { TelemetryEvent } from "../event.js";
2
3
  import type { TelemetryTransport } from "./types.js";
3
4
  interface PosthogConfig {
@@ -10,13 +11,24 @@ export interface PosthogTransportOptions {
10
11
  host?: string;
11
12
  /** Fetch override for tests. */
12
13
  fetch?: typeof fetch;
14
+ /** Batch timing and retry overrides for tests. */
15
+ maxWaitMs?: number;
16
+ retry?: RetryPolicy;
13
17
  }
18
+ /**
19
+ * Sends events to PostHog in the background, in batches. `send` only queues
20
+ * the event, so delivery never delays a run.
21
+ */
14
22
  export declare class PosthogTransport implements TelemetryTransport {
15
23
  private readonly apiKey;
16
- private readonly captureUrl;
24
+ private readonly batchUrl;
17
25
  private readonly fetchImpl;
26
+ private readonly processor;
18
27
  constructor(options: PosthogTransportOptions);
19
28
  send(event: TelemetryEvent): Promise<void>;
29
+ /** Refuse new events and drain what is queued until `deadlineMs`. */
30
+ shutdown(deadlineMs: number): Promise<void>;
31
+ private post;
20
32
  }
21
33
  export declare function posthogTransport(env?: Record<string, string | undefined>): PosthogTransport | undefined;
22
34
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"posthog.d.ts","sourceRoot":"","sources":["../../../src/telemetry/transport/posthog.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA2BrD,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,WAAW,GAAE,MAAgC,GAC5C,aAAa,GAAG,SAAS,CAS3B;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,qBAAa,gBAAiB,YAAW,kBAAkB;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IAEzC,YAAY,OAAO,EAAE,uBAAuB,EAO3C;IAEK,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B/C;CACF;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,gBAAgB,GAAG,SAAS,CAW9B"}
1
+ {"version":3,"file":"posthog.d.ts","sourceRoot":"","sources":["../../../src/telemetry/transport/posthog.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAwCrD,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,WAAW,GAAE,MAAgC,GAC5C,aAAa,GAAG,SAAS,CAS3B;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,kBAAkB;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAM;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;IAE3D,YAAY,OAAO,EAAE,uBAAuB,EAgB3C;IAEK,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;IAED,qEAAqE;IACrE,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1C;YAEa,IAAI;CAmCnB;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,gBAAgB,GAAG,SAAS,CAgB9B"}
@@ -1,19 +1,34 @@
1
- import { fetchWithTimeout } from "../../runtime/http.js";
1
+ import { BatchProcessor } from "../../concurrency/batch-processor.js";
2
+ import { withRetry } from "../../resilience/retry.js";
3
+ import { fetchWithTimeout, HttpStatusError, isRetryable, requestedDelayMs, } from "../../runtime/http.js";
4
+ import { onShutdown } from "../lifecycle.js";
2
5
  const POSTHOG_API_KEY_ENV = "MDA_POSTHOG_API_KEY";
3
6
  const POSTHOG_HOST_ENV = "MDA_POSTHOG_HOST";
4
7
  const DEFAULT_POSTHOG_HOST = "https://us.i.posthog.com";
5
- const POSTHOG_CAPTURE_PATH = "/i/v0/e/";
6
- /** A send is awaited at the end of a run, so it must not extend the wall clock. */
7
- const REQUEST_TIMEOUT_MS = 1_000;
8
+ const POSTHOG_BATCH_PATH = "/batch/";
9
+ /** Bounds one batch request; the OTel exporters' default. */
10
+ const REQUEST_TIMEOUT_MS = 10_000;
11
+ const MAX_BATCH_EVENTS = 100;
12
+ const BATCH_WAIT_MS = 1_000;
13
+ /** Events waiting to send; later ones are dropped. */
14
+ const MAX_QUEUED_EVENTS = 1_000;
15
+ /** 429 and 5xx (including timeouts and network failures) are tried again. */
16
+ const SEND_RETRY = {
17
+ maxAttempts: 5,
18
+ baseDelayMs: 1_000,
19
+ maxDelayMs: 30_000,
20
+ retryOn: isRetryable,
21
+ delayFor: requestedDelayMs,
22
+ };
8
23
  /** Public write-only key: submission only, and already in every released binary. */
9
24
  const DEFAULT_POSTHOG_API_KEY = "phc_C6RmkdQQ3kWHgj6o7kby3aP6dbewjpLzfanw9WcmU65V";
10
25
  function nonempty(value) {
11
26
  const trimmed = value?.trim();
12
27
  return trimmed ? trimmed : undefined;
13
28
  }
14
- /** `new URL` alone accepts `ftp:`/`file:`. Python's `capture_url` rejects them. */
15
- function captureUrl(host) {
16
- const url = new URL(`${host.replace(/\/+$/, "")}${POSTHOG_CAPTURE_PATH}`);
29
+ /** `new URL` alone accepts `ftp:`/`file:`. Python's `batch_url` rejects them. */
30
+ function batchUrl(host) {
31
+ const url = new URL(`${host.replace(/\/+$/, "")}${POSTHOG_BATCH_PATH}`);
17
32
  if (url.protocol !== "http:" && url.protocol !== "https:") {
18
33
  throw new Error("PostHog host must be a valid URL");
19
34
  }
@@ -29,45 +44,63 @@ export function resolvePosthogConfig(env, bakedApiKey = DEFAULT_POSTHOG_API_KEY)
29
44
  host: nonempty(env[POSTHOG_HOST_ENV]) ?? DEFAULT_POSTHOG_HOST,
30
45
  };
31
46
  }
47
+ /**
48
+ * Sends events to PostHog in the background, in batches. `send` only queues
49
+ * the event, so delivery never delays a run.
50
+ */
32
51
  export class PosthogTransport {
33
52
  apiKey;
34
- captureUrl;
53
+ batchUrl;
35
54
  fetchImpl;
55
+ processor;
36
56
  constructor(options) {
37
57
  if (!options.apiKey) {
38
58
  throw new Error("PostHog project ingestion key is required");
39
59
  }
40
60
  this.apiKey = options.apiKey;
41
- this.captureUrl = captureUrl(options.host ?? DEFAULT_POSTHOG_HOST);
61
+ this.batchUrl = batchUrl(options.host ?? DEFAULT_POSTHOG_HOST);
42
62
  this.fetchImpl = options.fetch ?? fetch;
63
+ this.processor = new BatchProcessor({
64
+ handle: withRetry((batch, signal) => this.post(batch, signal), options.retry ?? SEND_RETRY),
65
+ maxBatchSize: MAX_BATCH_EVENTS,
66
+ maxWaitMs: options.maxWaitMs ?? BATCH_WAIT_MS,
67
+ maxQueued: MAX_QUEUED_EVENTS,
68
+ });
43
69
  }
44
70
  async send(event) {
45
- const response = await fetchWithTimeout(this.captureUrl.toString(), {
71
+ this.processor.push(event);
72
+ }
73
+ /** Refuse new events and drain what is queued until `deadlineMs`. */
74
+ shutdown(deadlineMs) {
75
+ return this.processor.shutdown(deadlineMs);
76
+ }
77
+ async post(batch, signal) {
78
+ const response = await fetchWithTimeout(this.batchUrl.toString(), {
46
79
  method: "POST",
47
80
  headers: { "content-type": "application/json" },
48
81
  body: JSON.stringify({
49
82
  api_key: this.apiKey,
50
- event: event.event_type,
51
- distinct_id: event.distinct_id,
52
- timestamp: event.created_at,
53
- properties: {
54
- // The subject is an organization, and the request leaves our
55
- // infrastructure rather than the customer's, so a person profile
56
- // and a geoip lookup would both describe the wrong thing.
57
- $process_person_profile: false,
58
- $geoip_disable: true,
59
- ...event,
60
- },
83
+ batch: batch.map((event) => ({
84
+ // PostHog drops a retried event it already ingested by `uuid`.
85
+ uuid: event.event_id,
86
+ event: event.event_type,
87
+ distinct_id: event.distinct_id,
88
+ timestamp: event.created_at,
89
+ properties: {
90
+ // The subject is an organization, and the request leaves our
91
+ // infrastructure rather than the customer's, so a person profile
92
+ // and a geoip lookup would both describe the wrong thing.
93
+ $process_person_profile: false,
94
+ $geoip_disable: true,
95
+ ...event,
96
+ },
97
+ })),
61
98
  }),
99
+ signal,
62
100
  }, REQUEST_TIMEOUT_MS, this.fetchImpl);
63
- try {
64
- if (!response.ok) {
65
- throw new Error(`PostHog rejected analytics event: ${response.status}`);
66
- }
67
- }
68
- finally {
69
- await response.body?.cancel();
70
- }
101
+ await response.body?.cancel();
102
+ if (!response.ok)
103
+ throw HttpStatusError.from(response);
71
104
  }
72
105
  }
73
106
  export function posthogTransport(env = process.env) {
@@ -76,7 +109,12 @@ export function posthogTransport(env = process.env) {
76
109
  return undefined;
77
110
  }
78
111
  try {
79
- return new PosthogTransport({ apiKey: config.apiKey, host: config.host });
112
+ const transport = new PosthogTransport({
113
+ apiKey: config.apiKey,
114
+ host: config.host,
115
+ });
116
+ onShutdown((ms) => transport.shutdown(ms));
117
+ return transport;
80
118
  }
81
119
  catch {
82
120
  // A malformed host must not take the runtime down with it.
@@ -1 +1 @@
1
- {"version":3,"file":"posthog.js","sourceRoot":"","sources":["../../../src/telemetry/transport/posthog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"posthog.js","sourceRoot":"","sources":["../../../src/telemetry/transport/posthog.ts"],"names":[],"mappings":"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"}