@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,178 @@
1
+ /**
2
+ * Security Logger Module
3
+ *
4
+ * Single aggregation point for security-related logging events.
5
+ * All security-relevant code paths MUST use this module.
6
+ *
7
+ * Key guarantees:
8
+ * - Raw patterns are NEVER logged (only hashes)
9
+ * - Logging failures don't block execution
10
+ * - Consistent structured format across all events
11
+ *
12
+ * @see FR-021, FR-022, FR-023, FR-024
13
+ * @see specs/006-quality-enforcement/contracts/security-event.ts
14
+ */
15
+ import { z } from 'zod';
16
+ /**
17
+ * Security event categories
18
+ */
19
+ export declare const SecurityEventCategory: z.ZodEnum<{
20
+ regex_validation: "regex_validation";
21
+ mitigation_applied: "mitigation_applied";
22
+ mitigation_failed: "mitigation_failed";
23
+ }>;
24
+ export type SecurityEventCategory = z.infer<typeof SecurityEventCategory>;
25
+ /**
26
+ * Event outcome states
27
+ */
28
+ export declare const SecurityEventOutcome: z.ZodEnum<{
29
+ success: "success";
30
+ timeout: "timeout";
31
+ failure: "failure";
32
+ }>;
33
+ export type SecurityEventOutcome = z.infer<typeof SecurityEventOutcome>;
34
+ /**
35
+ * Error reasons for failed events
36
+ */
37
+ export declare const MitigationErrorReason: z.ZodEnum<{
38
+ timeout: "timeout";
39
+ invalid_regex: "invalid_regex";
40
+ runtime_error: "runtime_error";
41
+ }>;
42
+ export type MitigationErrorReason = z.infer<typeof MitigationErrorReason>;
43
+ /**
44
+ * Pattern hash format: 16 hex characters (truncated SHA-256)
45
+ */
46
+ export declare const PatternHash: z.ZodString;
47
+ export type PatternHash = z.infer<typeof PatternHash>;
48
+ /**
49
+ * Security event schema
50
+ */
51
+ export declare const SecurityEventSchema: z.ZodObject<{
52
+ category: z.ZodEnum<{
53
+ regex_validation: "regex_validation";
54
+ mitigation_applied: "mitigation_applied";
55
+ mitigation_failed: "mitigation_failed";
56
+ }>;
57
+ ruleId: z.ZodString;
58
+ file: z.ZodString;
59
+ patternHash: z.ZodString;
60
+ durationMs: z.ZodNumber;
61
+ outcome: z.ZodEnum<{
62
+ success: "success";
63
+ timeout: "timeout";
64
+ failure: "failure";
65
+ }>;
66
+ errorReason: z.ZodOptional<z.ZodEnum<{
67
+ timeout: "timeout";
68
+ invalid_regex: "invalid_regex";
69
+ runtime_error: "runtime_error";
70
+ }>>;
71
+ timestamp: z.ZodString;
72
+ runId: z.ZodString;
73
+ }, z.core.$strip>;
74
+ export type SecurityEvent = z.infer<typeof SecurityEventSchema>;
75
+ /**
76
+ * Hash a regex pattern using SHA-256 and truncate to 16 hex characters.
77
+ *
78
+ * This ensures raw patterns are NEVER included in logs while still
79
+ * allowing correlation of events related to the same pattern.
80
+ *
81
+ * @param pattern - The regex pattern to hash
82
+ * @returns 16-character hex string (truncated SHA-256)
83
+ */
84
+ export declare function hashPattern(pattern: string): PatternHash;
85
+ /**
86
+ * Run summary statistics
87
+ */
88
+ export interface RunSummary {
89
+ runId: string;
90
+ totalEvents: number;
91
+ successCount: number;
92
+ failureCount: number;
93
+ timeoutCount: number;
94
+ totalDurationMs: number;
95
+ loggingFailuresTotal: number;
96
+ loggingFailuresByCategory: Record<string, number>;
97
+ loggingDegraded: boolean;
98
+ }
99
+ /**
100
+ * Input for creating a security event
101
+ */
102
+ export interface SecurityEventInput {
103
+ category: SecurityEventCategory;
104
+ ruleId: string;
105
+ file: string;
106
+ pattern: string;
107
+ durationMs: number;
108
+ outcome: SecurityEventOutcome;
109
+ errorReason?: MitigationErrorReason;
110
+ }
111
+ /**
112
+ * Security logger instance interface
113
+ */
114
+ export interface SecurityLogger {
115
+ /** Log a security event */
116
+ logSecurityEvent(input: SecurityEventInput): void;
117
+ /** Start a new logging run */
118
+ startRun(): string;
119
+ /** Get the current run ID */
120
+ getCurrentRunId(): string;
121
+ /** Get summary statistics for the current run */
122
+ getRunSummary(): RunSummary;
123
+ /** Get all events for the current run */
124
+ getRunEvents(): readonly SecurityEvent[];
125
+ /** Check if logging is in degraded mode */
126
+ isLoggingDegraded(): boolean;
127
+ }
128
+ /**
129
+ * Create a new security logger instance.
130
+ *
131
+ * Use this factory when you need isolated logger state (e.g., for testing).
132
+ * For most production use cases, use the default exported functions.
133
+ *
134
+ * @returns A new SecurityLogger instance with its own isolated state
135
+ */
136
+ export declare function createSecurityLogger(): SecurityLogger;
137
+ /**
138
+ * Log a security event.
139
+ *
140
+ * This is the SOLE export for security logging. All security-relevant
141
+ * code paths MUST use this function.
142
+ *
143
+ * Guarantees (FR-023):
144
+ * - Logging failures don't block execution
145
+ * - Falls back to stderr on validation errors
146
+ * - Never throws exceptions
147
+ *
148
+ * @param input - Security event input (raw pattern will be hashed)
149
+ */
150
+ export declare function logSecurityEvent(input: SecurityEventInput): void;
151
+ /**
152
+ * Start a new logging run
153
+ */
154
+ export declare function startRun(): string;
155
+ /**
156
+ * Get the current run ID
157
+ */
158
+ export declare function getCurrentRunId(): string;
159
+ /**
160
+ * Get summary statistics for the current run
161
+ */
162
+ export declare function getRunSummary(): RunSummary;
163
+ /**
164
+ * Get all events for the current run (for testing/debugging)
165
+ */
166
+ export declare function getRunEvents(): readonly SecurityEvent[];
167
+ /**
168
+ * Check if logging is in degraded mode
169
+ */
170
+ export declare function isLoggingDegraded(): boolean;
171
+ /**
172
+ * Reset the default logger state for testing.
173
+ * This ensures test isolation when using module-level exports.
174
+ *
175
+ * @internal - Only use in test files
176
+ */
177
+ export declare function resetForTesting(): void;
178
+ //# sourceMappingURL=security-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-logger.d.ts","sourceRoot":"","sources":["../src/security-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;EAIhC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;EAA4C,CAAC;AAC9E,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAExE;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;EAAwD,CAAC;AAC3F,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,WAAW,aAAkE,CAAC;AAC3F,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;iBAwB5B,CAAC;AAEL,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAMhE;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAGxD;AAMD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,eAAe,EAAE,OAAO,CAAC;CAC1B;AAiCD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,qBAAqB,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,WAAW,CAAC,EAAE,qBAAqB,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2BAA2B;IAC3B,gBAAgB,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAClD,8BAA8B;IAC9B,QAAQ,IAAI,MAAM,CAAC;IACnB,6BAA6B;IAC7B,eAAe,IAAI,MAAM,CAAC;IAC1B,iDAAiD;IACjD,aAAa,IAAI,UAAU,CAAC;IAC5B,yCAAyC;IACzC,YAAY,IAAI,SAAS,aAAa,EAAE,CAAC;IACzC,2CAA2C;IAC3C,iBAAiB,IAAI,OAAO,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAoGrD;AAYD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAEhE;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAE1C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,aAAa,EAAE,CAEvD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
@@ -0,0 +1,256 @@
1
+ /**
2
+ * Security Logger Module
3
+ *
4
+ * Single aggregation point for security-related logging events.
5
+ * All security-relevant code paths MUST use this module.
6
+ *
7
+ * Key guarantees:
8
+ * - Raw patterns are NEVER logged (only hashes)
9
+ * - Logging failures don't block execution
10
+ * - Consistent structured format across all events
11
+ *
12
+ * @see FR-021, FR-022, FR-023, FR-024
13
+ * @see specs/006-quality-enforcement/contracts/security-event.ts
14
+ */
15
+ import { createHash } from 'crypto';
16
+ import { z } from 'zod';
17
+ // =============================================================================
18
+ // Schema Definitions (FR-021)
19
+ // =============================================================================
20
+ /**
21
+ * Security event categories
22
+ */
23
+ export const SecurityEventCategory = z.enum([
24
+ 'regex_validation',
25
+ 'mitigation_applied',
26
+ 'mitigation_failed',
27
+ ]);
28
+ /**
29
+ * Event outcome states
30
+ */
31
+ export const SecurityEventOutcome = z.enum(['success', 'failure', 'timeout']);
32
+ /**
33
+ * Error reasons for failed events
34
+ */
35
+ export const MitigationErrorReason = z.enum(['invalid_regex', 'timeout', 'runtime_error']);
36
+ /**
37
+ * Pattern hash format: 16 hex characters (truncated SHA-256)
38
+ */
39
+ export const PatternHash = z.string().regex(/^[a-f0-9]{16}$/, 'Must be 16 hex characters');
40
+ /**
41
+ * Security event schema
42
+ */
43
+ export const SecurityEventSchema = z
44
+ .object({
45
+ /** Event type classification */
46
+ category: SecurityEventCategory,
47
+ /** Rule or pattern identifier being validated */
48
+ ruleId: z.string().min(1),
49
+ /** File path being analyzed */
50
+ file: z.string().min(1),
51
+ /** SHA-256 hash of pattern (first 16 chars) - never raw pattern */
52
+ patternHash: PatternHash,
53
+ /** Processing duration in milliseconds */
54
+ durationMs: z.number().min(0),
55
+ /** Result of the operation */
56
+ outcome: SecurityEventOutcome,
57
+ /** Error reason (required when outcome is 'failure') */
58
+ errorReason: MitigationErrorReason.optional(),
59
+ /** ISO 8601 timestamp */
60
+ timestamp: z.string().datetime(),
61
+ /** Unique identifier for the analysis run */
62
+ runId: z.string().min(1),
63
+ })
64
+ .refine((data) => data.outcome !== 'failure' || data.errorReason !== undefined, {
65
+ message: 'errorReason is required when outcome is failure',
66
+ path: ['errorReason'],
67
+ });
68
+ // =============================================================================
69
+ // Pattern Hashing (FR-022)
70
+ // =============================================================================
71
+ /**
72
+ * Hash a regex pattern using SHA-256 and truncate to 16 hex characters.
73
+ *
74
+ * This ensures raw patterns are NEVER included in logs while still
75
+ * allowing correlation of events related to the same pattern.
76
+ *
77
+ * @param pattern - The regex pattern to hash
78
+ * @returns 16-character hex string (truncated SHA-256)
79
+ */
80
+ export function hashPattern(pattern) {
81
+ const hash = createHash('sha256').update(pattern).digest('hex');
82
+ return hash.slice(0, 16);
83
+ }
84
+ /**
85
+ * Generate a unique run ID
86
+ */
87
+ function generateRunId() {
88
+ return `run-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
89
+ }
90
+ function createInitialState() {
91
+ return {
92
+ runId: generateRunId(),
93
+ events: [],
94
+ loggingFailures: [],
95
+ isDegraded: false,
96
+ };
97
+ }
98
+ /**
99
+ * Create a new security logger instance.
100
+ *
101
+ * Use this factory when you need isolated logger state (e.g., for testing).
102
+ * For most production use cases, use the default exported functions.
103
+ *
104
+ * @returns A new SecurityLogger instance with its own isolated state
105
+ */
106
+ export function createSecurityLogger() {
107
+ let state = createInitialState();
108
+ /**
109
+ * Handle logging failures gracefully (FR-023)
110
+ */
111
+ function handleLoggingFailure(category, error) {
112
+ state.loggingFailures.push({ category, error });
113
+ state.isDegraded = true;
114
+ // Fallback to stderr
115
+ try {
116
+ process.stderr.write(`[security] LOGGING_DEGRADED category=${category} error=${error}\n`);
117
+ }
118
+ catch {
119
+ // Silently ignore if stderr is unavailable
120
+ }
121
+ }
122
+ return {
123
+ logSecurityEvent(input) {
124
+ try {
125
+ const event = {
126
+ category: input.category,
127
+ ruleId: input.ruleId,
128
+ file: input.file,
129
+ patternHash: hashPattern(input.pattern),
130
+ durationMs: input.durationMs,
131
+ outcome: input.outcome,
132
+ errorReason: input.errorReason,
133
+ timestamp: new Date().toISOString(),
134
+ runId: state.runId,
135
+ };
136
+ // Validate the event
137
+ const result = SecurityEventSchema.safeParse(event);
138
+ if (!result.success) {
139
+ handleLoggingFailure(input.category, `Validation failed: ${result.error.message}`);
140
+ return;
141
+ }
142
+ // Store the event
143
+ state.events.push(event);
144
+ // Log to stderr for immediate visibility (structured JSON)
145
+ const logLine = JSON.stringify({
146
+ level: 'security',
147
+ ...event,
148
+ });
149
+ process.stderr.write(`[security] ${logLine}\n`);
150
+ }
151
+ catch (error) {
152
+ // FR-023: Logging failures don't block execution
153
+ handleLoggingFailure(input.category, error instanceof Error ? error.message : 'Unknown error');
154
+ }
155
+ },
156
+ startRun() {
157
+ state = createInitialState();
158
+ return state.runId;
159
+ },
160
+ getCurrentRunId() {
161
+ return state.runId;
162
+ },
163
+ getRunSummary() {
164
+ const successCount = state.events.filter((e) => e.outcome === 'success').length;
165
+ const failureCount = state.events.filter((e) => e.outcome === 'failure').length;
166
+ const timeoutCount = state.events.filter((e) => e.outcome === 'timeout').length;
167
+ const totalDurationMs = state.events.reduce((sum, e) => sum + e.durationMs, 0);
168
+ const loggingFailuresByCategory = {};
169
+ for (const failure of state.loggingFailures) {
170
+ loggingFailuresByCategory[failure.category] =
171
+ (loggingFailuresByCategory[failure.category] ?? 0) + 1;
172
+ }
173
+ return {
174
+ runId: state.runId,
175
+ totalEvents: state.events.length,
176
+ successCount,
177
+ failureCount,
178
+ timeoutCount,
179
+ totalDurationMs,
180
+ loggingFailuresTotal: state.loggingFailures.length,
181
+ loggingFailuresByCategory,
182
+ loggingDegraded: state.isDegraded,
183
+ };
184
+ },
185
+ getRunEvents() {
186
+ return [...state.events];
187
+ },
188
+ isLoggingDegraded() {
189
+ return state.isDegraded;
190
+ },
191
+ };
192
+ }
193
+ // =============================================================================
194
+ // Default Instance (Backwards Compatibility)
195
+ // =============================================================================
196
+ /**
197
+ * Default logger instance for module-level exports.
198
+ * Use createSecurityLogger() for isolated instances in tests.
199
+ */
200
+ const defaultLogger = createSecurityLogger();
201
+ /**
202
+ * Log a security event.
203
+ *
204
+ * This is the SOLE export for security logging. All security-relevant
205
+ * code paths MUST use this function.
206
+ *
207
+ * Guarantees (FR-023):
208
+ * - Logging failures don't block execution
209
+ * - Falls back to stderr on validation errors
210
+ * - Never throws exceptions
211
+ *
212
+ * @param input - Security event input (raw pattern will be hashed)
213
+ */
214
+ export function logSecurityEvent(input) {
215
+ defaultLogger.logSecurityEvent(input);
216
+ }
217
+ /**
218
+ * Start a new logging run
219
+ */
220
+ export function startRun() {
221
+ return defaultLogger.startRun();
222
+ }
223
+ /**
224
+ * Get the current run ID
225
+ */
226
+ export function getCurrentRunId() {
227
+ return defaultLogger.getCurrentRunId();
228
+ }
229
+ /**
230
+ * Get summary statistics for the current run
231
+ */
232
+ export function getRunSummary() {
233
+ return defaultLogger.getRunSummary();
234
+ }
235
+ /**
236
+ * Get all events for the current run (for testing/debugging)
237
+ */
238
+ export function getRunEvents() {
239
+ return defaultLogger.getRunEvents();
240
+ }
241
+ /**
242
+ * Check if logging is in degraded mode
243
+ */
244
+ export function isLoggingDegraded() {
245
+ return defaultLogger.isLoggingDegraded();
246
+ }
247
+ /**
248
+ * Reset the default logger state for testing.
249
+ * This ensures test isolation when using module-level exports.
250
+ *
251
+ * @internal - Only use in test files
252
+ */
253
+ export function resetForTesting() {
254
+ defaultLogger.startRun();
255
+ }
256
+ //# sourceMappingURL=security-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-logger.js","sourceRoot":"","sources":["../src/security-logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Console Telemetry Backend
3
+ *
4
+ * Feature: 007-pnpm-timeout-telemetry
5
+ * Implements: FR-011
6
+ *
7
+ * Writes structured log lines to stdout for immediate visibility.
8
+ */
9
+ import type { TelemetryBackend, TelemetryVerbosity } from '../types.js';
10
+ /**
11
+ * Console backend configuration options.
12
+ */
13
+ export interface ConsoleBackendOptions {
14
+ /** Verbosity level controls which fields are logged */
15
+ verbosity: TelemetryVerbosity;
16
+ }
17
+ /**
18
+ * Creates a console telemetry backend.
19
+ *
20
+ * @param options - Configuration options
21
+ * @returns TelemetryBackend implementation
22
+ */
23
+ export declare function createConsoleBackend(options: ConsoleBackendOptions): TelemetryBackend;
24
+ //# sourceMappingURL=console.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../../src/telemetry/backends/console.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAgB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtF;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,uDAAuD;IACvD,SAAS,EAAE,kBAAkB,CAAC;CAC/B;AAwBD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,gBAAgB,CAsBrF"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Console Telemetry Backend
3
+ *
4
+ * Feature: 007-pnpm-timeout-telemetry
5
+ * Implements: FR-011
6
+ *
7
+ * Writes structured log lines to stdout for immediate visibility.
8
+ */
9
+ /**
10
+ * Formats a timeout event for console output based on verbosity level.
11
+ */
12
+ function formatEvent(event, verbosity) {
13
+ const prefix = `[TIMEOUT] [${event.severity.toUpperCase()}]`;
14
+ switch (verbosity) {
15
+ case 'minimal':
16
+ return `${prefix} ${event.operation_id} duration=${event.duration_ms}ms`;
17
+ case 'standard':
18
+ return `${prefix} ${event.operation_id} duration=${event.duration_ms}ms threshold=${event.threshold_ms}ms at=${event.timestamp}`;
19
+ case 'verbose': {
20
+ const contextStr = event.allowed_context
21
+ ? ` context=${JSON.stringify(event.allowed_context)}`
22
+ : '';
23
+ return `${prefix} ${event.operation_id} duration=${event.duration_ms}ms threshold=${event.threshold_ms}ms at=${event.timestamp}${contextStr}`;
24
+ }
25
+ }
26
+ }
27
+ /**
28
+ * Creates a console telemetry backend.
29
+ *
30
+ * @param options - Configuration options
31
+ * @returns TelemetryBackend implementation
32
+ */
33
+ export function createConsoleBackend(options) {
34
+ const { verbosity } = options;
35
+ return {
36
+ async emit(event) {
37
+ try {
38
+ const message = formatEvent(event, verbosity);
39
+ // Use stderr for telemetry to avoid mixing with stdout
40
+ console.error(message);
41
+ }
42
+ catch {
43
+ // Best-effort: swallow errors to avoid affecting control flow (FR-014)
44
+ }
45
+ },
46
+ async flush() {
47
+ // Console writes are immediate, nothing to flush
48
+ },
49
+ async close() {
50
+ // No resources to release
51
+ },
52
+ };
53
+ }
54
+ //# sourceMappingURL=console.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console.js","sourceRoot":"","sources":["../../../src/telemetry/backends/console.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH;;GAEG;AACH,SAAS,WAAW,CAAC,KAAmB,EAAE,SAA6B;IACrE,MAAM,MAAM,GAAG,cAAc,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC;IAE7D,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,YAAY,aAAa,KAAK,CAAC,WAAW,IAAI,CAAC;QAE3E,KAAK,UAAU;YACb,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,YAAY,aAAa,KAAK,CAAC,WAAW,gBAAgB,KAAK,CAAC,YAAY,SAAS,KAAK,CAAC,SAAS,EAAE,CAAC;QAEnI,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe;gBACtC,CAAC,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE;gBACrD,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,YAAY,aAAa,KAAK,CAAC,WAAW,gBAAgB,KAAK,CAAC,YAAY,SAAS,KAAK,CAAC,SAAS,GAAG,UAAU,EAAE,CAAC;QAChJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA8B;IACjE,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAE9B,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,KAAmB;YAC5B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;gBAC9C,uDAAuD;gBACvD,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,uEAAuE;YACzE,CAAC;QACH,CAAC;QAED,KAAK,CAAC,KAAK;YACT,iDAAiD;QACnD,CAAC;QAED,KAAK,CAAC,KAAK;YACT,0BAA0B;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
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 type { TelemetryBackend, TelemetryVerbosity } from '../types.js';
11
+ /**
12
+ * JSONL backend configuration options.
13
+ */
14
+ export interface JsonlBackendOptions {
15
+ /** Path to the JSONL output file */
16
+ filePath: string;
17
+ /** Verbosity level controls which fields are written */
18
+ verbosity: TelemetryVerbosity;
19
+ /** Max events to buffer before auto-flush (default: 100) */
20
+ bufferSize?: number;
21
+ /** Periodic flush interval in ms (default: 5000) */
22
+ flushIntervalMs?: number;
23
+ }
24
+ /**
25
+ * Creates a JSONL file telemetry backend.
26
+ *
27
+ * @param options - Configuration options
28
+ * @returns TelemetryBackend implementation
29
+ */
30
+ export declare function createJsonlBackend(options: JsonlBackendOptions): TelemetryBackend;
31
+ //# sourceMappingURL=jsonl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl.d.ts","sourceRoot":"","sources":["../../../src/telemetry/backends/jsonl.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAgB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtF;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,SAAS,EAAE,kBAAkB,CAAC;IAC9B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA4BD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,gBAAgB,CAuFjF"}