@oddessentials/odd-ai-reviewers 1.0.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 (370) hide show
  1. package/README.md +190 -0
  2. package/dist/__tests__/hermetic-setup.d.ts +55 -0
  3. package/dist/__tests__/hermetic-setup.d.ts.map +1 -0
  4. package/dist/__tests__/hermetic-setup.js +62 -0
  5. package/dist/__tests__/hermetic-setup.js.map +1 -0
  6. package/dist/__tests__/test-utils/hermetic.d.ts +84 -0
  7. package/dist/__tests__/test-utils/hermetic.d.ts.map +1 -0
  8. package/dist/__tests__/test-utils/hermetic.js +147 -0
  9. package/dist/__tests__/test-utils/hermetic.js.map +1 -0
  10. package/dist/agents/ai_semantic_review.d.ts +12 -0
  11. package/dist/agents/ai_semantic_review.d.ts.map +1 -0
  12. package/dist/agents/ai_semantic_review.js +317 -0
  13. package/dist/agents/ai_semantic_review.js.map +1 -0
  14. package/dist/agents/control_flow/budget.d.ts +162 -0
  15. package/dist/agents/control_flow/budget.d.ts.map +1 -0
  16. package/dist/agents/control_flow/budget.js +331 -0
  17. package/dist/agents/control_flow/budget.js.map +1 -0
  18. package/dist/agents/control_flow/cfg-builder.d.ts +26 -0
  19. package/dist/agents/control_flow/cfg-builder.d.ts.map +1 -0
  20. package/dist/agents/control_flow/cfg-builder.js +776 -0
  21. package/dist/agents/control_flow/cfg-builder.js.map +1 -0
  22. package/dist/agents/control_flow/cfg-types.d.ts +186 -0
  23. package/dist/agents/control_flow/cfg-types.d.ts.map +1 -0
  24. package/dist/agents/control_flow/cfg-types.js +114 -0
  25. package/dist/agents/control_flow/cfg-types.js.map +1 -0
  26. package/dist/agents/control_flow/finding-generator.d.ts +118 -0
  27. package/dist/agents/control_flow/finding-generator.d.ts.map +1 -0
  28. package/dist/agents/control_flow/finding-generator.js +354 -0
  29. package/dist/agents/control_flow/finding-generator.js.map +1 -0
  30. package/dist/agents/control_flow/index.d.ts +39 -0
  31. package/dist/agents/control_flow/index.d.ts.map +1 -0
  32. package/dist/agents/control_flow/index.js +270 -0
  33. package/dist/agents/control_flow/index.js.map +1 -0
  34. package/dist/agents/control_flow/logger.d.ts +333 -0
  35. package/dist/agents/control_flow/logger.d.ts.map +1 -0
  36. package/dist/agents/control_flow/logger.js +607 -0
  37. package/dist/agents/control_flow/logger.js.map +1 -0
  38. package/dist/agents/control_flow/mitigation-detector.d.ts +207 -0
  39. package/dist/agents/control_flow/mitigation-detector.d.ts.map +1 -0
  40. package/dist/agents/control_flow/mitigation-detector.js +625 -0
  41. package/dist/agents/control_flow/mitigation-detector.js.map +1 -0
  42. package/dist/agents/control_flow/mitigation-patterns.d.ts +53 -0
  43. package/dist/agents/control_flow/mitigation-patterns.d.ts.map +1 -0
  44. package/dist/agents/control_flow/mitigation-patterns.js +620 -0
  45. package/dist/agents/control_flow/mitigation-patterns.js.map +1 -0
  46. package/dist/agents/control_flow/path-analyzer.d.ts +287 -0
  47. package/dist/agents/control_flow/path-analyzer.d.ts.map +1 -0
  48. package/dist/agents/control_flow/path-analyzer.js +695 -0
  49. package/dist/agents/control_flow/path-analyzer.js.map +1 -0
  50. package/dist/agents/control_flow/pattern-validator.d.ts +132 -0
  51. package/dist/agents/control_flow/pattern-validator.d.ts.map +1 -0
  52. package/dist/agents/control_flow/pattern-validator.js +420 -0
  53. package/dist/agents/control_flow/pattern-validator.js.map +1 -0
  54. package/dist/agents/control_flow/timeout-regex.d.ts +144 -0
  55. package/dist/agents/control_flow/timeout-regex.d.ts.map +1 -0
  56. package/dist/agents/control_flow/timeout-regex.js +339 -0
  57. package/dist/agents/control_flow/timeout-regex.js.map +1 -0
  58. package/dist/agents/control_flow/types.d.ts +782 -0
  59. package/dist/agents/control_flow/types.d.ts.map +1 -0
  60. package/dist/agents/control_flow/types.js +428 -0
  61. package/dist/agents/control_flow/types.js.map +1 -0
  62. package/dist/agents/control_flow/vulnerability-detector.d.ts +85 -0
  63. package/dist/agents/control_flow/vulnerability-detector.d.ts.map +1 -0
  64. package/dist/agents/control_flow/vulnerability-detector.js +493 -0
  65. package/dist/agents/control_flow/vulnerability-detector.js.map +1 -0
  66. package/dist/agents/date-utils.d.ts +19 -0
  67. package/dist/agents/date-utils.d.ts.map +1 -0
  68. package/dist/agents/date-utils.js +29 -0
  69. package/dist/agents/date-utils.js.map +1 -0
  70. package/dist/agents/index.d.ts +25 -0
  71. package/dist/agents/index.d.ts.map +1 -0
  72. package/dist/agents/index.js +50 -0
  73. package/dist/agents/index.js.map +1 -0
  74. package/dist/agents/json-utils.d.ts +34 -0
  75. package/dist/agents/json-utils.d.ts.map +1 -0
  76. package/dist/agents/json-utils.js +62 -0
  77. package/dist/agents/json-utils.js.map +1 -0
  78. package/dist/agents/local_llm.d.ts +24 -0
  79. package/dist/agents/local_llm.d.ts.map +1 -0
  80. package/dist/agents/local_llm.js +566 -0
  81. package/dist/agents/local_llm.js.map +1 -0
  82. package/dist/agents/metadata.d.ts +57 -0
  83. package/dist/agents/metadata.d.ts.map +1 -0
  84. package/dist/agents/metadata.js +45 -0
  85. package/dist/agents/metadata.js.map +1 -0
  86. package/dist/agents/opencode.d.ts +18 -0
  87. package/dist/agents/opencode.d.ts.map +1 -0
  88. package/dist/agents/opencode.js +364 -0
  89. package/dist/agents/opencode.js.map +1 -0
  90. package/dist/agents/path-filter.d.ts +25 -0
  91. package/dist/agents/path-filter.d.ts.map +1 -0
  92. package/dist/agents/path-filter.js +43 -0
  93. package/dist/agents/path-filter.js.map +1 -0
  94. package/dist/agents/pr_agent.d.ts +3 -0
  95. package/dist/agents/pr_agent.d.ts.map +1 -0
  96. package/dist/agents/pr_agent.js +312 -0
  97. package/dist/agents/pr_agent.js.map +1 -0
  98. package/dist/agents/retry.d.ts +12 -0
  99. package/dist/agents/retry.d.ts.map +1 -0
  100. package/dist/agents/retry.js +65 -0
  101. package/dist/agents/retry.js.map +1 -0
  102. package/dist/agents/reviewdog.d.ts +24 -0
  103. package/dist/agents/reviewdog.d.ts.map +1 -0
  104. package/dist/agents/reviewdog.js +259 -0
  105. package/dist/agents/reviewdog.js.map +1 -0
  106. package/dist/agents/security.d.ts +49 -0
  107. package/dist/agents/security.d.ts.map +1 -0
  108. package/dist/agents/security.js +302 -0
  109. package/dist/agents/security.js.map +1 -0
  110. package/dist/agents/semgrep.d.ts +8 -0
  111. package/dist/agents/semgrep.d.ts.map +1 -0
  112. package/dist/agents/semgrep.js +157 -0
  113. package/dist/agents/semgrep.js.map +1 -0
  114. package/dist/agents/types.d.ts +450 -0
  115. package/dist/agents/types.d.ts.map +1 -0
  116. package/dist/agents/types.js +127 -0
  117. package/dist/agents/types.js.map +1 -0
  118. package/dist/budget.d.ts +59 -0
  119. package/dist/budget.d.ts.map +1 -0
  120. package/dist/budget.js +82 -0
  121. package/dist/budget.js.map +1 -0
  122. package/dist/cache/key.d.ts +49 -0
  123. package/dist/cache/key.d.ts.map +1 -0
  124. package/dist/cache/key.js +71 -0
  125. package/dist/cache/key.js.map +1 -0
  126. package/dist/cache/store.d.ts +47 -0
  127. package/dist/cache/store.d.ts.map +1 -0
  128. package/dist/cache/store.js +328 -0
  129. package/dist/cache/store.js.map +1 -0
  130. package/dist/cli/commands/check.d.ts +60 -0
  131. package/dist/cli/commands/check.d.ts.map +1 -0
  132. package/dist/cli/commands/check.js +163 -0
  133. package/dist/cli/commands/check.js.map +1 -0
  134. package/dist/cli/commands/index.d.ts +12 -0
  135. package/dist/cli/commands/index.d.ts.map +1 -0
  136. package/dist/cli/commands/index.js +12 -0
  137. package/dist/cli/commands/index.js.map +1 -0
  138. package/dist/cli/commands/local-review.d.ts +149 -0
  139. package/dist/cli/commands/local-review.d.ts.map +1 -0
  140. package/dist/cli/commands/local-review.js +755 -0
  141. package/dist/cli/commands/local-review.js.map +1 -0
  142. package/dist/cli/config-wizard.d.ts +87 -0
  143. package/dist/cli/config-wizard.d.ts.map +1 -0
  144. package/dist/cli/config-wizard.js +240 -0
  145. package/dist/cli/config-wizard.js.map +1 -0
  146. package/dist/cli/dependencies/catalog.d.ts +44 -0
  147. package/dist/cli/dependencies/catalog.d.ts.map +1 -0
  148. package/dist/cli/dependencies/catalog.js +89 -0
  149. package/dist/cli/dependencies/catalog.js.map +1 -0
  150. package/dist/cli/dependencies/checker.d.ts +42 -0
  151. package/dist/cli/dependencies/checker.d.ts.map +1 -0
  152. package/dist/cli/dependencies/checker.js +240 -0
  153. package/dist/cli/dependencies/checker.js.map +1 -0
  154. package/dist/cli/dependencies/index.d.ts +16 -0
  155. package/dist/cli/dependencies/index.d.ts.map +1 -0
  156. package/dist/cli/dependencies/index.js +16 -0
  157. package/dist/cli/dependencies/index.js.map +1 -0
  158. package/dist/cli/dependencies/messages.d.ts +58 -0
  159. package/dist/cli/dependencies/messages.d.ts.map +1 -0
  160. package/dist/cli/dependencies/messages.js +183 -0
  161. package/dist/cli/dependencies/messages.js.map +1 -0
  162. package/dist/cli/dependencies/platform.d.ts +25 -0
  163. package/dist/cli/dependencies/platform.d.ts.map +1 -0
  164. package/dist/cli/dependencies/platform.js +42 -0
  165. package/dist/cli/dependencies/platform.js.map +1 -0
  166. package/dist/cli/dependencies/schemas.d.ts +65 -0
  167. package/dist/cli/dependencies/schemas.d.ts.map +1 -0
  168. package/dist/cli/dependencies/schemas.js +42 -0
  169. package/dist/cli/dependencies/schemas.js.map +1 -0
  170. package/dist/cli/dependencies/types.d.ts +112 -0
  171. package/dist/cli/dependencies/types.d.ts.map +1 -0
  172. package/dist/cli/dependencies/types.js +6 -0
  173. package/dist/cli/dependencies/types.js.map +1 -0
  174. package/dist/cli/dependencies/version.d.ts +67 -0
  175. package/dist/cli/dependencies/version.d.ts.map +1 -0
  176. package/dist/cli/dependencies/version.js +125 -0
  177. package/dist/cli/dependencies/version.js.map +1 -0
  178. package/dist/cli/git-context.d.ts +105 -0
  179. package/dist/cli/git-context.d.ts.map +1 -0
  180. package/dist/cli/git-context.js +313 -0
  181. package/dist/cli/git-context.js.map +1 -0
  182. package/dist/cli/interactive-prompts.d.ts +126 -0
  183. package/dist/cli/interactive-prompts.d.ts.map +1 -0
  184. package/dist/cli/interactive-prompts.js +128 -0
  185. package/dist/cli/interactive-prompts.js.map +1 -0
  186. package/dist/cli/options/index.d.ts +7 -0
  187. package/dist/cli/options/index.d.ts.map +1 -0
  188. package/dist/cli/options/index.js +11 -0
  189. package/dist/cli/options/index.js.map +1 -0
  190. package/dist/cli/options/local-review-options.d.ts +221 -0
  191. package/dist/cli/options/local-review-options.d.ts.map +1 -0
  192. package/dist/cli/options/local-review-options.js +332 -0
  193. package/dist/cli/options/local-review-options.js.map +1 -0
  194. package/dist/cli/output/colors.d.ts +154 -0
  195. package/dist/cli/output/colors.d.ts.map +1 -0
  196. package/dist/cli/output/colors.js +255 -0
  197. package/dist/cli/output/colors.js.map +1 -0
  198. package/dist/cli/output/errors.d.ts +157 -0
  199. package/dist/cli/output/errors.d.ts.map +1 -0
  200. package/dist/cli/output/errors.js +266 -0
  201. package/dist/cli/output/errors.js.map +1 -0
  202. package/dist/cli/output/index.d.ts +12 -0
  203. package/dist/cli/output/index.d.ts.map +1 -0
  204. package/dist/cli/output/index.js +15 -0
  205. package/dist/cli/output/index.js.map +1 -0
  206. package/dist/cli/output/progress.d.ts +237 -0
  207. package/dist/cli/output/progress.d.ts.map +1 -0
  208. package/dist/cli/output/progress.js +405 -0
  209. package/dist/cli/output/progress.js.map +1 -0
  210. package/dist/cli/signals.d.ts +145 -0
  211. package/dist/cli/signals.d.ts.map +1 -0
  212. package/dist/cli/signals.js +223 -0
  213. package/dist/cli/signals.js.map +1 -0
  214. package/dist/cli/validation-report.d.ts +106 -0
  215. package/dist/cli/validation-report.d.ts.map +1 -0
  216. package/dist/cli/validation-report.js +108 -0
  217. package/dist/cli/validation-report.js.map +1 -0
  218. package/dist/config/index.d.ts +9 -0
  219. package/dist/config/index.d.ts.map +1 -0
  220. package/dist/config/index.js +12 -0
  221. package/dist/config/index.js.map +1 -0
  222. package/dist/config/mitigation-config.d.ts +94 -0
  223. package/dist/config/mitigation-config.d.ts.map +1 -0
  224. package/dist/config/mitigation-config.js +430 -0
  225. package/dist/config/mitigation-config.js.map +1 -0
  226. package/dist/config/providers.d.ts +118 -0
  227. package/dist/config/providers.d.ts.map +1 -0
  228. package/dist/config/providers.js +229 -0
  229. package/dist/config/providers.js.map +1 -0
  230. package/dist/config/schemas.d.ts +278 -0
  231. package/dist/config/schemas.d.ts.map +1 -0
  232. package/dist/config/schemas.js +111 -0
  233. package/dist/config/schemas.js.map +1 -0
  234. package/dist/config/zero-config.d.ts +126 -0
  235. package/dist/config/zero-config.d.ts.map +1 -0
  236. package/dist/config/zero-config.js +243 -0
  237. package/dist/config/zero-config.js.map +1 -0
  238. package/dist/config.d.ts +110 -0
  239. package/dist/config.d.ts.map +1 -0
  240. package/dist/config.js +302 -0
  241. package/dist/config.js.map +1 -0
  242. package/dist/diff.d.ts +224 -0
  243. package/dist/diff.d.ts.map +1 -0
  244. package/dist/diff.js +832 -0
  245. package/dist/diff.js.map +1 -0
  246. package/dist/git-validators.d.ts +106 -0
  247. package/dist/git-validators.d.ts.map +1 -0
  248. package/dist/git-validators.js +224 -0
  249. package/dist/git-validators.js.map +1 -0
  250. package/dist/main.d.ts +61 -0
  251. package/dist/main.d.ts.map +1 -0
  252. package/dist/main.js +704 -0
  253. package/dist/main.js.map +1 -0
  254. package/dist/phases/execute.d.ts +60 -0
  255. package/dist/phases/execute.d.ts.map +1 -0
  256. package/dist/phases/execute.js +168 -0
  257. package/dist/phases/execute.js.map +1 -0
  258. package/dist/phases/index.d.ts +9 -0
  259. package/dist/phases/index.d.ts.map +1 -0
  260. package/dist/phases/index.js +9 -0
  261. package/dist/phases/index.js.map +1 -0
  262. package/dist/phases/preflight.d.ts +40 -0
  263. package/dist/phases/preflight.d.ts.map +1 -0
  264. package/dist/phases/preflight.js +122 -0
  265. package/dist/phases/preflight.js.map +1 -0
  266. package/dist/phases/report.d.ts +51 -0
  267. package/dist/phases/report.d.ts.map +1 -0
  268. package/dist/phases/report.js +152 -0
  269. package/dist/phases/report.js.map +1 -0
  270. package/dist/policy.d.ts +33 -0
  271. package/dist/policy.d.ts.map +1 -0
  272. package/dist/policy.js +34 -0
  273. package/dist/policy.js.map +1 -0
  274. package/dist/preflight.d.ts +181 -0
  275. package/dist/preflight.d.ts.map +1 -0
  276. package/dist/preflight.js +627 -0
  277. package/dist/preflight.js.map +1 -0
  278. package/dist/report/ado.d.ts +53 -0
  279. package/dist/report/ado.d.ts.map +1 -0
  280. package/dist/report/ado.js +411 -0
  281. package/dist/report/ado.js.map +1 -0
  282. package/dist/report/agent-icons.d.ts +36 -0
  283. package/dist/report/agent-icons.d.ts.map +1 -0
  284. package/dist/report/agent-icons.js +46 -0
  285. package/dist/report/agent-icons.js.map +1 -0
  286. package/dist/report/base.d.ts +30 -0
  287. package/dist/report/base.d.ts.map +1 -0
  288. package/dist/report/base.js +64 -0
  289. package/dist/report/base.js.map +1 -0
  290. package/dist/report/formats.d.ts +206 -0
  291. package/dist/report/formats.d.ts.map +1 -0
  292. package/dist/report/formats.js +481 -0
  293. package/dist/report/formats.js.map +1 -0
  294. package/dist/report/github.d.ts +44 -0
  295. package/dist/report/github.d.ts.map +1 -0
  296. package/dist/report/github.js +409 -0
  297. package/dist/report/github.js.map +1 -0
  298. package/dist/report/line-resolver.d.ts +208 -0
  299. package/dist/report/line-resolver.d.ts.map +1 -0
  300. package/dist/report/line-resolver.js +578 -0
  301. package/dist/report/line-resolver.js.map +1 -0
  302. package/dist/report/resolution.d.ts +158 -0
  303. package/dist/report/resolution.d.ts.map +1 -0
  304. package/dist/report/resolution.js +272 -0
  305. package/dist/report/resolution.js.map +1 -0
  306. package/dist/report/sanitize.d.ts +32 -0
  307. package/dist/report/sanitize.d.ts.map +1 -0
  308. package/dist/report/sanitize.js +84 -0
  309. package/dist/report/sanitize.js.map +1 -0
  310. package/dist/report/terminal.d.ts +440 -0
  311. package/dist/report/terminal.d.ts.map +1 -0
  312. package/dist/report/terminal.js +840 -0
  313. package/dist/report/terminal.js.map +1 -0
  314. package/dist/reviewignore.d.ts +125 -0
  315. package/dist/reviewignore.d.ts.map +1 -0
  316. package/dist/reviewignore.js +335 -0
  317. package/dist/reviewignore.js.map +1 -0
  318. package/dist/security-logger.d.ts +178 -0
  319. package/dist/security-logger.d.ts.map +1 -0
  320. package/dist/security-logger.js +256 -0
  321. package/dist/security-logger.js.map +1 -0
  322. package/dist/telemetry/backends/console.d.ts +24 -0
  323. package/dist/telemetry/backends/console.d.ts.map +1 -0
  324. package/dist/telemetry/backends/console.js +54 -0
  325. package/dist/telemetry/backends/console.js.map +1 -0
  326. package/dist/telemetry/backends/jsonl.d.ts +31 -0
  327. package/dist/telemetry/backends/jsonl.d.ts.map +1 -0
  328. package/dist/telemetry/backends/jsonl.js +121 -0
  329. package/dist/telemetry/backends/jsonl.js.map +1 -0
  330. package/dist/telemetry/emitter.d.ts +43 -0
  331. package/dist/telemetry/emitter.d.ts.map +1 -0
  332. package/dist/telemetry/emitter.js +83 -0
  333. package/dist/telemetry/emitter.js.map +1 -0
  334. package/dist/telemetry/hook.d.ts +53 -0
  335. package/dist/telemetry/hook.d.ts.map +1 -0
  336. package/dist/telemetry/hook.js +118 -0
  337. package/dist/telemetry/hook.js.map +1 -0
  338. package/dist/telemetry/index.d.ts +58 -0
  339. package/dist/telemetry/index.d.ts.map +1 -0
  340. package/dist/telemetry/index.js +143 -0
  341. package/dist/telemetry/index.js.map +1 -0
  342. package/dist/telemetry/types.d.ts +139 -0
  343. package/dist/telemetry/types.d.ts.map +1 -0
  344. package/dist/telemetry/types.js +133 -0
  345. package/dist/telemetry/types.js.map +1 -0
  346. package/dist/trust.d.ts +65 -0
  347. package/dist/trust.d.ts.map +1 -0
  348. package/dist/trust.js +78 -0
  349. package/dist/trust.js.map +1 -0
  350. package/dist/types/assert-never.d.ts +30 -0
  351. package/dist/types/assert-never.d.ts.map +1 -0
  352. package/dist/types/assert-never.js +32 -0
  353. package/dist/types/assert-never.js.map +1 -0
  354. package/dist/types/branded.d.ts +172 -0
  355. package/dist/types/branded.d.ts.map +1 -0
  356. package/dist/types/branded.js +262 -0
  357. package/dist/types/branded.js.map +1 -0
  358. package/dist/types/errors.d.ts +320 -0
  359. package/dist/types/errors.d.ts.map +1 -0
  360. package/dist/types/errors.js +551 -0
  361. package/dist/types/errors.js.map +1 -0
  362. package/dist/types/index.d.ts +37 -0
  363. package/dist/types/index.d.ts.map +1 -0
  364. package/dist/types/index.js +77 -0
  365. package/dist/types/index.js.map +1 -0
  366. package/dist/types/result.d.ts +323 -0
  367. package/dist/types/result.d.ts.map +1 -0
  368. package/dist/types/result.js +423 -0
  369. package/dist/types/result.js.map +1 -0
  370. package/package.json +63 -0
@@ -0,0 +1,121 @@
1
+ /**
2
+ * JSONL File Telemetry Backend
3
+ *
4
+ * Feature: 007-pnpm-timeout-telemetry
5
+ * Implements: FR-011, FR-014a
6
+ *
7
+ * Appends JSON objects to a file in JSONL format (one JSON object per line).
8
+ * Uses append-mode writes for durability without explicit flush.
9
+ */
10
+ import { appendFile } from 'node:fs/promises';
11
+ /**
12
+ * Formats a timeout event for JSONL output based on verbosity level.
13
+ */
14
+ function formatEvent(event, verbosity) {
15
+ switch (verbosity) {
16
+ case 'minimal':
17
+ return JSON.stringify({
18
+ operation_id: event.operation_id,
19
+ duration_ms: event.duration_ms,
20
+ severity: event.severity,
21
+ });
22
+ case 'standard':
23
+ return JSON.stringify({
24
+ operation_id: event.operation_id,
25
+ duration_ms: event.duration_ms,
26
+ threshold_ms: event.threshold_ms,
27
+ timestamp: event.timestamp,
28
+ severity: event.severity,
29
+ });
30
+ case 'verbose':
31
+ return JSON.stringify(event);
32
+ }
33
+ }
34
+ /**
35
+ * Creates a JSONL file telemetry backend.
36
+ *
37
+ * @param options - Configuration options
38
+ * @returns TelemetryBackend implementation
39
+ */
40
+ export function createJsonlBackend(options) {
41
+ const { filePath, verbosity, bufferSize = 100, flushIntervalMs = 5000 } = options;
42
+ const buffer = [];
43
+ let flushTimer = null;
44
+ let hasLoggedError = false;
45
+ let closed = false;
46
+ /**
47
+ * Writes buffered events to file.
48
+ * @param force - If true, write even if closed (used during shutdown)
49
+ */
50
+ async function writeBuffer(force = false) {
51
+ if (buffer.length === 0)
52
+ return;
53
+ if (closed && !force)
54
+ return;
55
+ const lines = buffer.splice(0).join('\n') + '\n';
56
+ try {
57
+ // Use append mode for durability
58
+ await appendFile(filePath, lines, { encoding: 'utf8' });
59
+ }
60
+ catch (error) {
61
+ // Log error once per run (FR-014)
62
+ if (!hasLoggedError) {
63
+ hasLoggedError = true;
64
+ console.error(`[TELEMETRY] JSONL write error: ${error}`);
65
+ }
66
+ }
67
+ }
68
+ /**
69
+ * Starts periodic flush timer.
70
+ */
71
+ function startFlushTimer() {
72
+ if (flushTimer === null && flushIntervalMs > 0) {
73
+ flushTimer = setInterval(() => {
74
+ writeBuffer().catch(() => {
75
+ // Swallow errors in timer callback
76
+ });
77
+ }, flushIntervalMs);
78
+ // Unref timer so it doesn't keep the process alive
79
+ flushTimer.unref();
80
+ }
81
+ }
82
+ /**
83
+ * Stops periodic flush timer.
84
+ */
85
+ function stopFlushTimer() {
86
+ if (flushTimer !== null) {
87
+ clearInterval(flushTimer);
88
+ flushTimer = null;
89
+ }
90
+ }
91
+ return {
92
+ async emit(event) {
93
+ if (closed)
94
+ return;
95
+ try {
96
+ const line = formatEvent(event, verbosity);
97
+ buffer.push(line);
98
+ // Start timer on first event
99
+ startFlushTimer();
100
+ // Auto-flush if buffer is full
101
+ if (buffer.length >= bufferSize) {
102
+ await writeBuffer();
103
+ }
104
+ }
105
+ catch {
106
+ // Best-effort: swallow errors to avoid affecting control flow (FR-014)
107
+ }
108
+ },
109
+ async flush() {
110
+ await writeBuffer();
111
+ },
112
+ async close() {
113
+ if (closed)
114
+ return;
115
+ closed = true;
116
+ stopFlushTimer();
117
+ await writeBuffer(true); // Force write remaining buffer
118
+ },
119
+ };
120
+ }
121
+ //# sourceMappingURL=jsonl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl.js","sourceRoot":"","sources":["../../../src/telemetry/backends/jsonl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Telemetry Emitter
3
+ *
4
+ * Feature: 007-pnpm-timeout-telemetry
5
+ * Implements: FR-014
6
+ *
7
+ * Low-overhead event emission with failure logging (once per run).
8
+ */
9
+ import type { TelemetryBackend, TimeoutEvent } from './types.js';
10
+ /**
11
+ * Emitter that dispatches events to multiple backends.
12
+ * Implements best-effort semantics with failure logging.
13
+ */
14
+ export declare class TelemetryEmitter {
15
+ private backends;
16
+ private hasLoggedEmitError;
17
+ /**
18
+ * Registers a backend for event dispatch.
19
+ */
20
+ addBackend(backend: TelemetryBackend): void;
21
+ /**
22
+ * Removes all registered backends.
23
+ */
24
+ clearBackends(): void;
25
+ /**
26
+ * Emits an event to all registered backends.
27
+ * Best-effort: failures are logged once per run (FR-014).
28
+ */
29
+ emit(event: TimeoutEvent): Promise<void>;
30
+ /**
31
+ * Flushes all backends.
32
+ */
33
+ flush(): Promise<void>;
34
+ /**
35
+ * Closes all backends and releases resources.
36
+ */
37
+ close(): Promise<void>;
38
+ /**
39
+ * Returns the number of registered backends.
40
+ */
41
+ get backendCount(): number;
42
+ }
43
+ //# sourceMappingURL=emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/telemetry/emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjE;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,kBAAkB,CAAS;IAEnC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAI3C;;OAEG;IACH,aAAa,IAAI,IAAI;IAIrB;;;OAGG;IACG,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB9C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B;;OAEG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;CACF"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Telemetry Emitter
3
+ *
4
+ * Feature: 007-pnpm-timeout-telemetry
5
+ * Implements: FR-014
6
+ *
7
+ * Low-overhead event emission with failure logging (once per run).
8
+ */
9
+ /**
10
+ * Emitter that dispatches events to multiple backends.
11
+ * Implements best-effort semantics with failure logging.
12
+ */
13
+ export class TelemetryEmitter {
14
+ backends = [];
15
+ hasLoggedEmitError = false;
16
+ /**
17
+ * Registers a backend for event dispatch.
18
+ */
19
+ addBackend(backend) {
20
+ this.backends.push(backend);
21
+ }
22
+ /**
23
+ * Removes all registered backends.
24
+ */
25
+ clearBackends() {
26
+ this.backends = [];
27
+ }
28
+ /**
29
+ * Emits an event to all registered backends.
30
+ * Best-effort: failures are logged once per run (FR-014).
31
+ */
32
+ async emit(event) {
33
+ if (this.backends.length === 0)
34
+ return;
35
+ // Fire-and-forget to all backends in parallel
36
+ await Promise.all(this.backends.map(async (backend) => {
37
+ try {
38
+ await backend.emit(event);
39
+ }
40
+ catch (error) {
41
+ // Log once per run
42
+ if (!this.hasLoggedEmitError) {
43
+ this.hasLoggedEmitError = true;
44
+ console.error(`[TELEMETRY] Emit error: ${error}`);
45
+ }
46
+ }
47
+ }));
48
+ }
49
+ /**
50
+ * Flushes all backends.
51
+ */
52
+ async flush() {
53
+ await Promise.all(this.backends.map(async (backend) => {
54
+ try {
55
+ await backend.flush();
56
+ }
57
+ catch {
58
+ // Swallow flush errors
59
+ }
60
+ }));
61
+ }
62
+ /**
63
+ * Closes all backends and releases resources.
64
+ */
65
+ async close() {
66
+ await Promise.all(this.backends.map(async (backend) => {
67
+ try {
68
+ await backend.close();
69
+ }
70
+ catch {
71
+ // Swallow close errors
72
+ }
73
+ }));
74
+ this.clearBackends();
75
+ }
76
+ /**
77
+ * Returns the number of registered backends.
78
+ */
79
+ get backendCount() {
80
+ return this.backends.length;
81
+ }
82
+ }
83
+ //# sourceMappingURL=emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../src/telemetry/emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IACnB,QAAQ,GAAuB,EAAE,CAAC;IAClC,kBAAkB,GAAG,KAAK,CAAC;IAEnC;;OAEG;IACH,UAAU,CAAC,OAAyB;QAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,aAAa;QACX,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,KAAmB;QAC5B,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEvC,8CAA8C;QAC9C,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAClC,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,mBAAmB;gBACnB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAC7B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;oBAC/B,OAAO,CAAC,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAClC,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAClC,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QACF,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Telemetry Hook Orchestrator
3
+ *
4
+ * Feature: 007-pnpm-timeout-telemetry
5
+ * Implements: FR-008, FR-014
6
+ *
7
+ * Coordinates telemetry configuration and event dispatch.
8
+ */
9
+ import type { TelemetryConfig, TimeoutEventInput } from './types.js';
10
+ /**
11
+ * TelemetryHook manages the telemetry lifecycle and dispatches events.
12
+ */
13
+ export declare class TelemetryHook {
14
+ private config;
15
+ private emitter;
16
+ private initialized;
17
+ /**
18
+ * Configures telemetry with the given settings.
19
+ * Creates backends based on the configuration.
20
+ */
21
+ configure(config: Partial<TelemetryConfig>): Promise<void>;
22
+ /**
23
+ * Initializes backends based on current configuration.
24
+ */
25
+ private initializeBackends;
26
+ /**
27
+ * Emits a timeout event if telemetry is enabled.
28
+ * Best-effort: failures do not affect control flow.
29
+ */
30
+ emit(input: TimeoutEventInput): Promise<void>;
31
+ /**
32
+ * Flushes all pending events.
33
+ * Called at shutdown/run summary points.
34
+ */
35
+ flush(): Promise<void>;
36
+ /**
37
+ * Closes all backends and releases resources.
38
+ */
39
+ close(): Promise<void>;
40
+ /**
41
+ * Returns whether telemetry is enabled.
42
+ */
43
+ isEnabled(): boolean;
44
+ /**
45
+ * Returns the current configuration (for testing).
46
+ */
47
+ getConfig(): TelemetryConfig;
48
+ }
49
+ /**
50
+ * Factory function for creating TelemetryHook (for testability).
51
+ */
52
+ export declare function createTelemetryHook(): TelemetryHook;
53
+ //# sourceMappingURL=hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/telemetry/hook.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAoB,MAAM,YAAY,CAAC;AAMvF;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAoD;IAClE,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,WAAW,CAAS;IAE5B;;;OAGG;IACG,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBhE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA6B1B;;;OAGG;IACG,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWnD;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,SAAS,IAAI,eAAe;CAG7B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAEnD"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Telemetry Hook Orchestrator
3
+ *
4
+ * Feature: 007-pnpm-timeout-telemetry
5
+ * Implements: FR-008, FR-014
6
+ *
7
+ * Coordinates telemetry configuration and event dispatch.
8
+ */
9
+ import { DEFAULT_TELEMETRY_CONFIG, createTimeoutEvent, TelemetryConfigSchema } from './types.js';
10
+ import { TelemetryEmitter } from './emitter.js';
11
+ import { createConsoleBackend } from './backends/console.js';
12
+ import { createJsonlBackend } from './backends/jsonl.js';
13
+ /**
14
+ * TelemetryHook manages the telemetry lifecycle and dispatches events.
15
+ */
16
+ export class TelemetryHook {
17
+ config = { ...DEFAULT_TELEMETRY_CONFIG };
18
+ emitter = new TelemetryEmitter();
19
+ initialized = false;
20
+ /**
21
+ * Configures telemetry with the given settings.
22
+ * Creates backends based on the configuration.
23
+ */
24
+ async configure(config) {
25
+ // Merge with defaults and validate
26
+ const merged = TelemetryConfigSchema.parse({
27
+ ...this.config,
28
+ ...config,
29
+ });
30
+ // Close existing backends if reconfiguring
31
+ // Await close() to prevent race condition - close() already clears backends
32
+ if (this.initialized) {
33
+ await this.emitter.close();
34
+ }
35
+ this.config = merged;
36
+ // Create backends if enabled
37
+ if (this.config.enabled) {
38
+ this.initializeBackends();
39
+ }
40
+ this.initialized = true;
41
+ }
42
+ /**
43
+ * Initializes backends based on current configuration.
44
+ */
45
+ initializeBackends() {
46
+ for (const backendType of this.config.backends) {
47
+ let backend;
48
+ switch (backendType) {
49
+ case 'console':
50
+ backend = createConsoleBackend({
51
+ verbosity: this.config.verbosity,
52
+ });
53
+ break;
54
+ case 'jsonl':
55
+ if (!this.config.jsonl_path) {
56
+ console.error('[TELEMETRY] JSONL backend requires jsonl_path');
57
+ continue;
58
+ }
59
+ backend = createJsonlBackend({
60
+ filePath: this.config.jsonl_path,
61
+ verbosity: this.config.verbosity,
62
+ bufferSize: this.config.buffer_size,
63
+ flushIntervalMs: this.config.flush_interval_ms,
64
+ });
65
+ break;
66
+ }
67
+ this.emitter.addBackend(backend);
68
+ }
69
+ }
70
+ /**
71
+ * Emits a timeout event if telemetry is enabled.
72
+ * Best-effort: failures do not affect control flow.
73
+ */
74
+ async emit(input) {
75
+ if (!this.config.enabled)
76
+ return;
77
+ try {
78
+ const event = createTimeoutEvent(input);
79
+ await this.emitter.emit(event);
80
+ }
81
+ catch {
82
+ // Best-effort: swallow errors
83
+ }
84
+ }
85
+ /**
86
+ * Flushes all pending events.
87
+ * Called at shutdown/run summary points.
88
+ */
89
+ async flush() {
90
+ await this.emitter.flush();
91
+ }
92
+ /**
93
+ * Closes all backends and releases resources.
94
+ */
95
+ async close() {
96
+ await this.emitter.close();
97
+ this.initialized = false;
98
+ }
99
+ /**
100
+ * Returns whether telemetry is enabled.
101
+ */
102
+ isEnabled() {
103
+ return this.config.enabled;
104
+ }
105
+ /**
106
+ * Returns the current configuration (for testing).
107
+ */
108
+ getConfig() {
109
+ return { ...this.config };
110
+ }
111
+ }
112
+ /**
113
+ * Factory function for creating TelemetryHook (for testability).
114
+ */
115
+ export function createTelemetryHook() {
116
+ return new TelemetryHook();
117
+ }
118
+ //# sourceMappingURL=hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/telemetry/hook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Timeout Telemetry Public API
3
+ *
4
+ * Feature: 007-pnpm-timeout-telemetry
5
+ * Implements: FR-010
6
+ *
7
+ * Public exports for the telemetry module.
8
+ */
9
+ import { TelemetryHook, createTelemetryHook } from './hook.js';
10
+ import type { TelemetryConfig, TimeoutEventInput, TimeoutEvent, TelemetryBackend, TelemetryBackendType, TelemetryVerbosity, TimeoutSeverity, AllowedContext } from './types.js';
11
+ import { TelemetryConfigSchema } from './types.js';
12
+ /**
13
+ * Parses telemetry configuration from environment variables.
14
+ *
15
+ * Environment Variables:
16
+ * - TELEMETRY_ENABLED: 'true' or 'false' (default: 'false')
17
+ * - TELEMETRY_BACKENDS: Comma-separated list of backends (default: 'console')
18
+ * - TELEMETRY_JSONL_PATH: Path for JSONL output (required if jsonl backend used)
19
+ * - TELEMETRY_VERBOSITY: 'minimal', 'standard', or 'verbose' (default: 'standard')
20
+ * - TELEMETRY_BUFFER_SIZE: Max events to buffer (default: 100)
21
+ * - TELEMETRY_FLUSH_INTERVAL_MS: Flush interval in ms (default: 5000)
22
+ */
23
+ export declare function parseEnvConfig(): Partial<TelemetryConfig>;
24
+ /**
25
+ * Configures the global telemetry instance.
26
+ *
27
+ * @param config - Telemetry configuration
28
+ */
29
+ export declare function configureTelemetry(config: Partial<TelemetryConfig>): Promise<void>;
30
+ /**
31
+ * Configures telemetry from environment variables.
32
+ * Convenience function that parses env vars and applies config.
33
+ */
34
+ export declare function configureFromEnv(): Promise<void>;
35
+ /**
36
+ * Emits a timeout event if telemetry is enabled.
37
+ * Best-effort: failures do not affect control flow.
38
+ *
39
+ * @param event - Timeout event data (timestamp auto-generated)
40
+ */
41
+ export declare function emitTimeoutEvent(event: TimeoutEventInput): Promise<void>;
42
+ /**
43
+ * Flushes all pending telemetry events.
44
+ * Should be called at shutdown/run summary points.
45
+ */
46
+ export declare function flushTelemetry(): Promise<void>;
47
+ /**
48
+ * Closes the telemetry system and releases resources.
49
+ */
50
+ export declare function closeTelemetry(): Promise<void>;
51
+ /**
52
+ * Returns whether telemetry is enabled.
53
+ */
54
+ export declare function isTelemetryEnabled(): boolean;
55
+ export type { TelemetryConfig, TimeoutEventInput, TimeoutEvent, TelemetryBackend, TelemetryBackendType, TelemetryVerbosity, TimeoutSeverity, AllowedContext, };
56
+ export { TelemetryConfigSchema, createTelemetryHook, TelemetryHook };
57
+ export { TimeoutEventSchema, TimeoutSeverity as TimeoutSeveritySchema } from './types.js';
58
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAA6C,MAAM,YAAY,CAAC;AAsB9F;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAwDzD;AAMD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAExF;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAKtD;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9E;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpD;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAKpD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAMD,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,cAAc,GACf,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,aAAa,EAAE,CAAC;AAGrE,OAAO,EAAE,kBAAkB,EAAE,eAAe,IAAI,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Timeout Telemetry Public API
3
+ *
4
+ * Feature: 007-pnpm-timeout-telemetry
5
+ * Implements: FR-010
6
+ *
7
+ * Public exports for the telemetry module.
8
+ */
9
+ import { TelemetryHook, createTelemetryHook } from './hook.js';
10
+ import { TelemetryConfigSchema, TelemetryBackendType as BackendTypeSchema } from './types.js';
11
+ // =============================================================================
12
+ // Global Telemetry Instance
13
+ // =============================================================================
14
+ let globalHook = null;
15
+ /**
16
+ * Gets or creates the global telemetry hook instance.
17
+ */
18
+ function getGlobalHook() {
19
+ if (globalHook === null) {
20
+ globalHook = createTelemetryHook();
21
+ }
22
+ return globalHook;
23
+ }
24
+ // =============================================================================
25
+ // Environment Variable Configuration
26
+ // =============================================================================
27
+ /**
28
+ * Parses telemetry configuration from environment variables.
29
+ *
30
+ * Environment Variables:
31
+ * - TELEMETRY_ENABLED: 'true' or 'false' (default: 'false')
32
+ * - TELEMETRY_BACKENDS: Comma-separated list of backends (default: 'console')
33
+ * - TELEMETRY_JSONL_PATH: Path for JSONL output (required if jsonl backend used)
34
+ * - TELEMETRY_VERBOSITY: 'minimal', 'standard', or 'verbose' (default: 'standard')
35
+ * - TELEMETRY_BUFFER_SIZE: Max events to buffer (default: 100)
36
+ * - TELEMETRY_FLUSH_INTERVAL_MS: Flush interval in ms (default: 5000)
37
+ */
38
+ export function parseEnvConfig() {
39
+ const config = {};
40
+ // TELEMETRY_ENABLED
41
+ const enabledStr = process.env['TELEMETRY_ENABLED'];
42
+ if (enabledStr !== undefined) {
43
+ config.enabled = enabledStr.toLowerCase() === 'true';
44
+ }
45
+ // TELEMETRY_BACKENDS
46
+ const backendsStr = process.env['TELEMETRY_BACKENDS'];
47
+ if (backendsStr) {
48
+ const backends = backendsStr.split(',').map((b) => b.trim());
49
+ const validBackends = [];
50
+ for (const b of backends) {
51
+ const result = BackendTypeSchema.safeParse(b);
52
+ if (result.success) {
53
+ validBackends.push(result.data);
54
+ }
55
+ }
56
+ if (validBackends.length > 0) {
57
+ config.backends = validBackends;
58
+ }
59
+ }
60
+ // TELEMETRY_JSONL_PATH
61
+ const jsonlPath = process.env['TELEMETRY_JSONL_PATH'];
62
+ if (jsonlPath) {
63
+ config.jsonl_path = jsonlPath;
64
+ }
65
+ // TELEMETRY_VERBOSITY
66
+ const verbosity = process.env['TELEMETRY_VERBOSITY'];
67
+ if (verbosity === 'minimal' || verbosity === 'standard' || verbosity === 'verbose') {
68
+ config.verbosity = verbosity;
69
+ }
70
+ // TELEMETRY_BUFFER_SIZE
71
+ const bufferSizeStr = process.env['TELEMETRY_BUFFER_SIZE'];
72
+ if (bufferSizeStr) {
73
+ const bufferSize = parseInt(bufferSizeStr, 10);
74
+ if (!isNaN(bufferSize) && bufferSize > 0) {
75
+ config.buffer_size = bufferSize;
76
+ }
77
+ }
78
+ // TELEMETRY_FLUSH_INTERVAL_MS
79
+ const flushIntervalStr = process.env['TELEMETRY_FLUSH_INTERVAL_MS'];
80
+ if (flushIntervalStr) {
81
+ const flushInterval = parseInt(flushIntervalStr, 10);
82
+ if (!isNaN(flushInterval) && flushInterval >= 100) {
83
+ config.flush_interval_ms = flushInterval;
84
+ }
85
+ }
86
+ return config;
87
+ }
88
+ // =============================================================================
89
+ // Public API Functions
90
+ // =============================================================================
91
+ /**
92
+ * Configures the global telemetry instance.
93
+ *
94
+ * @param config - Telemetry configuration
95
+ */
96
+ export async function configureTelemetry(config) {
97
+ await getGlobalHook().configure(config);
98
+ }
99
+ /**
100
+ * Configures telemetry from environment variables.
101
+ * Convenience function that parses env vars and applies config.
102
+ */
103
+ export async function configureFromEnv() {
104
+ const config = parseEnvConfig();
105
+ if (Object.keys(config).length > 0) {
106
+ await configureTelemetry(config);
107
+ }
108
+ }
109
+ /**
110
+ * Emits a timeout event if telemetry is enabled.
111
+ * Best-effort: failures do not affect control flow.
112
+ *
113
+ * @param event - Timeout event data (timestamp auto-generated)
114
+ */
115
+ export async function emitTimeoutEvent(event) {
116
+ await getGlobalHook().emit(event);
117
+ }
118
+ /**
119
+ * Flushes all pending telemetry events.
120
+ * Should be called at shutdown/run summary points.
121
+ */
122
+ export async function flushTelemetry() {
123
+ await getGlobalHook().flush();
124
+ }
125
+ /**
126
+ * Closes the telemetry system and releases resources.
127
+ */
128
+ export async function closeTelemetry() {
129
+ if (globalHook !== null) {
130
+ await globalHook.close();
131
+ globalHook = null;
132
+ }
133
+ }
134
+ /**
135
+ * Returns whether telemetry is enabled.
136
+ */
137
+ export function isTelemetryEnabled() {
138
+ return getGlobalHook().isEnabled();
139
+ }
140
+ export { TelemetryConfigSchema, createTelemetryHook, TelemetryHook };
141
+ // Re-export types schema for validation
142
+ export { TimeoutEventSchema, TimeoutSeverity as TimeoutSeveritySchema } from './types.js';
143
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"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"}