@ironbee-ai/cli 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (362) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +167 -39
  3. package/dist/analysis/code-changes.js.map +1 -1
  4. package/dist/analysis/cross-session.js.map +1 -1
  5. package/dist/analysis/fix-effectiveness.js.map +1 -1
  6. package/dist/analysis/time-analysis.js.map +1 -1
  7. package/dist/analysis/verdict-details.js.map +1 -1
  8. package/dist/analysis/verification-quality.js.map +1 -1
  9. package/dist/analytics/classifier.d.ts +99 -0
  10. package/dist/analytics/classifier.d.ts.map +1 -0
  11. package/dist/analytics/classifier.js +380 -0
  12. package/dist/analytics/classifier.js.map +1 -0
  13. package/dist/analytics/emit.d.ts +67 -0
  14. package/dist/analytics/emit.d.ts.map +1 -0
  15. package/dist/analytics/emit.js +901 -0
  16. package/dist/analytics/emit.js.map +1 -0
  17. package/dist/analytics/errors.d.ts +33 -0
  18. package/dist/analytics/errors.d.ts.map +1 -0
  19. package/dist/analytics/errors.js +93 -0
  20. package/dist/analytics/errors.js.map +1 -0
  21. package/dist/analytics/hook-trigger.d.ts +39 -0
  22. package/dist/analytics/hook-trigger.d.ts.map +1 -0
  23. package/dist/analytics/hook-trigger.js +127 -0
  24. package/dist/analytics/hook-trigger.js.map +1 -0
  25. package/dist/analytics/log.d.ts +44 -0
  26. package/dist/analytics/log.d.ts.map +1 -0
  27. package/dist/analytics/log.js +158 -0
  28. package/dist/analytics/log.js.map +1 -0
  29. package/dist/analytics/merge.d.ts +40 -0
  30. package/dist/analytics/merge.d.ts.map +1 -0
  31. package/dist/analytics/merge.js +527 -0
  32. package/dist/analytics/merge.js.map +1 -0
  33. package/dist/analytics/pricing.d.ts +149 -0
  34. package/dist/analytics/pricing.d.ts.map +1 -0
  35. package/dist/analytics/pricing.js +179 -0
  36. package/dist/analytics/pricing.js.map +1 -0
  37. package/dist/analytics/projection.d.ts +356 -0
  38. package/dist/analytics/projection.d.ts.map +1 -0
  39. package/dist/analytics/projection.js +2281 -0
  40. package/dist/analytics/projection.js.map +1 -0
  41. package/dist/analytics/spawn.d.ts +28 -0
  42. package/dist/analytics/spawn.d.ts.map +1 -0
  43. package/dist/analytics/spawn.js +57 -0
  44. package/dist/analytics/spawn.js.map +1 -0
  45. package/dist/analytics/state.d.ts +58 -0
  46. package/dist/analytics/state.d.ts.map +1 -0
  47. package/dist/analytics/state.js +329 -0
  48. package/dist/analytics/state.js.map +1 -0
  49. package/dist/analytics/transcript.d.ts +150 -0
  50. package/dist/analytics/transcript.d.ts.map +1 -0
  51. package/dist/analytics/transcript.js +276 -0
  52. package/dist/analytics/transcript.js.map +1 -0
  53. package/dist/analytics/types.d.ts +875 -0
  54. package/dist/analytics/types.d.ts.map +1 -0
  55. package/dist/analytics/types.js +31 -0
  56. package/dist/analytics/types.js.map +1 -0
  57. package/dist/clients/base.d.ts +21 -2
  58. package/dist/clients/base.d.ts.map +1 -1
  59. package/dist/clients/claude/commands/ironbee-verify.md +15 -7
  60. package/dist/clients/claude/fragments/command-verify.node.md +33 -0
  61. package/dist/clients/claude/fragments/rule.node.md +29 -0
  62. package/dist/clients/claude/fragments/skill.node.md +77 -0
  63. package/dist/clients/claude/hooks/activity-end.d.ts +13 -0
  64. package/dist/clients/claude/hooks/activity-end.d.ts.map +1 -0
  65. package/dist/clients/claude/hooks/activity-end.js +42 -0
  66. package/dist/clients/claude/hooks/activity-end.js.map +1 -0
  67. package/dist/clients/claude/hooks/require-verdict.d.ts +3 -2
  68. package/dist/clients/claude/hooks/require-verdict.d.ts.map +1 -1
  69. package/dist/clients/claude/hooks/require-verdict.js +6 -5
  70. package/dist/clients/claude/hooks/require-verdict.js.map +1 -1
  71. package/dist/clients/claude/hooks/require-verification.d.ts +7 -4
  72. package/dist/clients/claude/hooks/require-verification.d.ts.map +1 -1
  73. package/dist/clients/claude/hooks/require-verification.js +44 -22
  74. package/dist/clients/claude/hooks/require-verification.js.map +1 -1
  75. package/dist/clients/claude/hooks/session-end.d.ts.map +1 -1
  76. package/dist/clients/claude/hooks/session-end.js +17 -2
  77. package/dist/clients/claude/hooks/session-end.js.map +1 -1
  78. package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
  79. package/dist/clients/claude/hooks/session-start.js +2 -1
  80. package/dist/clients/claude/hooks/session-start.js.map +1 -1
  81. package/dist/clients/claude/hooks/track-action-monitor.d.ts +27 -0
  82. package/dist/clients/claude/hooks/track-action-monitor.d.ts.map +1 -0
  83. package/dist/clients/claude/hooks/track-action-monitor.js +126 -0
  84. package/dist/clients/claude/hooks/track-action-monitor.js.map +1 -0
  85. package/dist/clients/claude/hooks/track-action.d.ts.map +1 -1
  86. package/dist/clients/claude/hooks/track-action.js +29 -20
  87. package/dist/clients/claude/hooks/track-action.js.map +1 -1
  88. package/dist/clients/claude/hooks/verify-gate.d.ts.map +1 -1
  89. package/dist/clients/claude/hooks/verify-gate.js +18 -1
  90. package/dist/clients/claude/hooks/verify-gate.js.map +1 -1
  91. package/dist/clients/claude/index.d.ts +4 -1
  92. package/dist/clients/claude/index.d.ts.map +1 -1
  93. package/dist/clients/claude/index.js +171 -94
  94. package/dist/clients/claude/index.js.map +1 -1
  95. package/dist/clients/claude/rules/ironbee-verification.md +41 -33
  96. package/dist/clients/claude/skills/ironbee-verification.md +93 -76
  97. package/dist/clients/cursor/commands/ironbee-verify/SKILL.md +18 -10
  98. package/dist/clients/cursor/fragments/command-verify.node.md +33 -0
  99. package/dist/clients/cursor/fragments/rule.node.md +29 -0
  100. package/dist/clients/cursor/fragments/skill.node.md +77 -0
  101. package/dist/clients/cursor/hooks/activity-end.d.ts +14 -0
  102. package/dist/clients/cursor/hooks/activity-end.d.ts.map +1 -0
  103. package/dist/clients/cursor/hooks/activity-end.js +45 -0
  104. package/dist/clients/cursor/hooks/activity-end.js.map +1 -0
  105. package/dist/clients/cursor/hooks/require-verdict.d.ts +1 -1
  106. package/dist/clients/cursor/hooks/require-verdict.js +4 -4
  107. package/dist/clients/cursor/hooks/require-verification.d.ts.map +1 -1
  108. package/dist/clients/cursor/hooks/require-verification.js +42 -16
  109. package/dist/clients/cursor/hooks/require-verification.js.map +1 -1
  110. package/dist/clients/cursor/hooks/session-end.d.ts.map +1 -1
  111. package/dist/clients/cursor/hooks/session-end.js +18 -2
  112. package/dist/clients/cursor/hooks/session-end.js.map +1 -1
  113. package/dist/clients/cursor/hooks/session-start.d.ts.map +1 -1
  114. package/dist/clients/cursor/hooks/session-start.js +2 -1
  115. package/dist/clients/cursor/hooks/session-start.js.map +1 -1
  116. package/dist/clients/cursor/hooks/track-action-monitor.d.ts +27 -0
  117. package/dist/clients/cursor/hooks/track-action-monitor.d.ts.map +1 -0
  118. package/dist/clients/cursor/hooks/track-action-monitor.js +133 -0
  119. package/dist/clients/cursor/hooks/track-action-monitor.js.map +1 -0
  120. package/dist/clients/cursor/hooks/track-action.d.ts.map +1 -1
  121. package/dist/clients/cursor/hooks/track-action.js +51 -23
  122. package/dist/clients/cursor/hooks/track-action.js.map +1 -1
  123. package/dist/clients/cursor/hooks/verify-gate.d.ts.map +1 -1
  124. package/dist/clients/cursor/hooks/verify-gate.js +14 -1
  125. package/dist/clients/cursor/hooks/verify-gate.js.map +1 -1
  126. package/dist/clients/cursor/index.d.ts +4 -1
  127. package/dist/clients/cursor/index.d.ts.map +1 -1
  128. package/dist/clients/cursor/index.js +117 -71
  129. package/dist/clients/cursor/index.js.map +1 -1
  130. package/dist/clients/cursor/rules/ironbee-verification.mdc +37 -29
  131. package/dist/clients/cursor/skills/ironbee-verification.md +93 -76
  132. package/dist/clients/registry.d.ts +14 -0
  133. package/dist/clients/registry.d.ts.map +1 -1
  134. package/dist/clients/registry.js +34 -0
  135. package/dist/clients/registry.js.map +1 -1
  136. package/dist/commands/analyze.d.ts.map +1 -1
  137. package/dist/commands/analyze.js +40 -0
  138. package/dist/commands/analyze.js.map +1 -1
  139. package/dist/commands/backend-toggle.d.ts +45 -0
  140. package/dist/commands/backend-toggle.d.ts.map +1 -0
  141. package/dist/commands/backend-toggle.js +192 -0
  142. package/dist/commands/backend-toggle.js.map +1 -0
  143. package/dist/commands/disable-backend.d.ts +14 -0
  144. package/dist/commands/disable-backend.d.ts.map +1 -0
  145. package/dist/commands/disable-backend.js +34 -0
  146. package/dist/commands/disable-backend.js.map +1 -0
  147. package/dist/commands/disable-verification.d.ts +16 -0
  148. package/dist/commands/disable-verification.d.ts.map +1 -0
  149. package/dist/commands/disable-verification.js +36 -0
  150. package/dist/commands/disable-verification.js.map +1 -0
  151. package/dist/commands/enable-backend.d.ts +15 -0
  152. package/dist/commands/enable-backend.d.ts.map +1 -0
  153. package/dist/commands/enable-backend.js +35 -0
  154. package/dist/commands/enable-backend.js.map +1 -0
  155. package/dist/commands/enable-verification.d.ts +14 -0
  156. package/dist/commands/enable-verification.d.ts.map +1 -0
  157. package/dist/commands/enable-verification.js +34 -0
  158. package/dist/commands/enable-verification.js.map +1 -0
  159. package/dist/commands/hook.d.ts.map +1 -1
  160. package/dist/commands/hook.js +60 -0
  161. package/dist/commands/hook.js.map +1 -1
  162. package/dist/commands/import.d.ts +39 -0
  163. package/dist/commands/import.d.ts.map +1 -0
  164. package/dist/commands/import.js +369 -0
  165. package/dist/commands/import.js.map +1 -0
  166. package/dist/commands/install.d.ts.map +1 -1
  167. package/dist/commands/install.js +15 -20
  168. package/dist/commands/install.js.map +1 -1
  169. package/dist/commands/process-analytics.d.ts +18 -0
  170. package/dist/commands/process-analytics.d.ts.map +1 -0
  171. package/dist/commands/process-analytics.js +57 -0
  172. package/dist/commands/process-analytics.js.map +1 -0
  173. package/dist/commands/queue.d.ts +2 -3
  174. package/dist/commands/queue.d.ts.map +1 -1
  175. package/dist/commands/queue.js +2 -3
  176. package/dist/commands/queue.js.map +1 -1
  177. package/dist/commands/status.d.ts.map +1 -1
  178. package/dist/commands/status.js +29 -1
  179. package/dist/commands/status.js.map +1 -1
  180. package/dist/commands/verification-toggle.d.ts +47 -0
  181. package/dist/commands/verification-toggle.d.ts.map +1 -0
  182. package/dist/commands/verification-toggle.js +113 -0
  183. package/dist/commands/verification-toggle.js.map +1 -0
  184. package/dist/commands/verify.d.ts.map +1 -1
  185. package/dist/commands/verify.js +28 -0
  186. package/dist/commands/verify.js.map +1 -1
  187. package/dist/hooks/core/actions.d.ts +64 -67
  188. package/dist/hooks/core/actions.d.ts.map +1 -1
  189. package/dist/hooks/core/actions.js +39 -24
  190. package/dist/hooks/core/actions.js.map +1 -1
  191. package/dist/hooks/core/activity-end.d.ts +20 -0
  192. package/dist/hooks/core/activity-end.d.ts.map +1 -0
  193. package/dist/hooks/core/activity-end.js +23 -0
  194. package/dist/hooks/core/activity-end.js.map +1 -0
  195. package/dist/hooks/core/required-tools.d.ts +30 -0
  196. package/dist/hooks/core/required-tools.d.ts.map +1 -0
  197. package/dist/hooks/core/required-tools.js +70 -0
  198. package/dist/hooks/core/required-tools.js.map +1 -0
  199. package/dist/hooks/core/session-state.d.ts +12 -3
  200. package/dist/hooks/core/session-state.d.ts.map +1 -1
  201. package/dist/hooks/core/session-state.js +59 -0
  202. package/dist/hooks/core/session-state.js.map +1 -1
  203. package/dist/hooks/core/submit-verdict.d.ts.map +1 -1
  204. package/dist/hooks/core/submit-verdict.js +16 -12
  205. package/dist/hooks/core/submit-verdict.js.map +1 -1
  206. package/dist/hooks/core/verify-gate.d.ts +17 -3
  207. package/dist/hooks/core/verify-gate.d.ts.map +1 -1
  208. package/dist/hooks/core/verify-gate.js +312 -116
  209. package/dist/hooks/core/verify-gate.js.map +1 -1
  210. package/dist/import/claude/analytics-runner.d.ts +42 -0
  211. package/dist/import/claude/analytics-runner.d.ts.map +1 -0
  212. package/dist/import/claude/analytics-runner.js +213 -0
  213. package/dist/import/claude/analytics-runner.js.map +1 -0
  214. package/dist/import/claude/discovery.d.ts +22 -0
  215. package/dist/import/claude/discovery.d.ts.map +1 -0
  216. package/dist/import/claude/discovery.js +197 -0
  217. package/dist/import/claude/discovery.js.map +1 -0
  218. package/dist/import/claude/encoding.d.ts +50 -0
  219. package/dist/import/claude/encoding.d.ts.map +1 -0
  220. package/dist/import/claude/encoding.js +110 -0
  221. package/dist/import/claude/encoding.js.map +1 -0
  222. package/dist/import/claude/events/file-change.d.ts +28 -0
  223. package/dist/import/claude/events/file-change.d.ts.map +1 -0
  224. package/dist/import/claude/events/file-change.js +112 -0
  225. package/dist/import/claude/events/file-change.js.map +1 -0
  226. package/dist/import/claude/events/tool-call.d.ts +61 -0
  227. package/dist/import/claude/events/tool-call.d.ts.map +1 -0
  228. package/dist/import/claude/events/tool-call.js +119 -0
  229. package/dist/import/claude/events/tool-call.js.map +1 -0
  230. package/dist/import/claude/runner.d.ts +31 -0
  231. package/dist/import/claude/runner.d.ts.map +1 -0
  232. package/dist/import/claude/runner.js +280 -0
  233. package/dist/import/claude/runner.js.map +1 -0
  234. package/dist/import/claude/summary.d.ts +23 -0
  235. package/dist/import/claude/summary.d.ts.map +1 -0
  236. package/dist/import/claude/summary.js +186 -0
  237. package/dist/import/claude/summary.js.map +1 -0
  238. package/dist/import/claude/transcript-walk.d.ts +52 -0
  239. package/dist/import/claude/transcript-walk.d.ts.map +1 -0
  240. package/dist/import/claude/transcript-walk.js +187 -0
  241. package/dist/import/claude/transcript-walk.js.map +1 -0
  242. package/dist/import/concurrent-pool.d.ts +45 -0
  243. package/dist/import/concurrent-pool.d.ts.map +1 -0
  244. package/dist/import/concurrent-pool.js +95 -0
  245. package/dist/import/concurrent-pool.js.map +1 -0
  246. package/dist/import/emitter.d.ts +29 -0
  247. package/dist/import/emitter.d.ts.map +1 -0
  248. package/dist/import/emitter.js +66 -0
  249. package/dist/import/emitter.js.map +1 -0
  250. package/dist/import/events/activity.d.ts +23 -0
  251. package/dist/import/events/activity.d.ts.map +1 -0
  252. package/dist/import/events/activity.js +45 -0
  253. package/dist/import/events/activity.js.map +1 -0
  254. package/dist/import/events/session.d.ts +24 -0
  255. package/dist/import/events/session.d.ts.map +1 -0
  256. package/dist/import/events/session.js +47 -0
  257. package/dist/import/events/session.js.map +1 -0
  258. package/dist/import/filter.d.ts +47 -0
  259. package/dist/import/filter.d.ts.map +1 -0
  260. package/dist/import/filter.js +90 -0
  261. package/dist/import/filter.js.map +1 -0
  262. package/dist/import/ids.d.ts +56 -0
  263. package/dist/import/ids.d.ts.map +1 -0
  264. package/dist/import/ids.js +87 -0
  265. package/dist/import/ids.js.map +1 -0
  266. package/dist/import/index.d.ts +29 -0
  267. package/dist/import/index.d.ts.map +1 -0
  268. package/dist/import/index.js +52 -0
  269. package/dist/import/index.js.map +1 -0
  270. package/dist/import/marker.d.ts +20 -0
  271. package/dist/import/marker.d.ts.map +1 -0
  272. package/dist/import/marker.js +71 -0
  273. package/dist/import/marker.js.map +1 -0
  274. package/dist/import/pipeline.d.ts +41 -0
  275. package/dist/import/pipeline.d.ts.map +1 -0
  276. package/dist/import/pipeline.js +47 -0
  277. package/dist/import/pipeline.js.map +1 -0
  278. package/dist/import/progress.d.ts +20 -0
  279. package/dist/import/progress.d.ts.map +1 -0
  280. package/dist/import/progress.js +69 -0
  281. package/dist/import/progress.js.map +1 -0
  282. package/dist/import/skip.d.ts +13 -0
  283. package/dist/import/skip.d.ts.map +1 -0
  284. package/dist/import/skip.js +24 -0
  285. package/dist/import/skip.js.map +1 -0
  286. package/dist/import/types.d.ts +125 -0
  287. package/dist/import/types.d.ts.map +1 -0
  288. package/dist/import/types.js +28 -0
  289. package/dist/import/types.js.map +1 -0
  290. package/dist/index.js +21 -2
  291. package/dist/index.js.map +1 -1
  292. package/dist/lib/collector.d.ts +29 -3
  293. package/dist/lib/collector.d.ts.map +1 -1
  294. package/dist/lib/collector.js +118 -8
  295. package/dist/lib/collector.js.map +1 -1
  296. package/dist/lib/config.d.ts +240 -83
  297. package/dist/lib/config.d.ts.map +1 -1
  298. package/dist/lib/config.js +482 -89
  299. package/dist/lib/config.js.map +1 -1
  300. package/dist/lib/event.d.ts +72 -0
  301. package/dist/lib/event.d.ts.map +1 -0
  302. package/dist/lib/event.js +42 -0
  303. package/dist/lib/event.js.map +1 -0
  304. package/dist/lib/gitignore.d.ts +21 -0
  305. package/dist/lib/gitignore.d.ts.map +1 -0
  306. package/dist/lib/gitignore.js +54 -0
  307. package/dist/lib/gitignore.js.map +1 -0
  308. package/dist/lib/runtime-section.d.ts +118 -0
  309. package/dist/lib/runtime-section.d.ts.map +1 -0
  310. package/dist/lib/runtime-section.js +256 -0
  311. package/dist/lib/runtime-section.js.map +1 -0
  312. package/dist/lib/telemetry.d.ts +1 -1
  313. package/dist/lib/telemetry.d.ts.map +1 -1
  314. package/dist/lib/telemetry.js +4 -1
  315. package/dist/lib/telemetry.js.map +1 -1
  316. package/dist/queue/dead-letter.d.ts +5 -1
  317. package/dist/queue/dead-letter.d.ts.map +1 -1
  318. package/dist/queue/dead-letter.js +5 -1
  319. package/dist/queue/dead-letter.js.map +1 -1
  320. package/dist/queue/drain.d.ts +3 -2
  321. package/dist/queue/drain.d.ts.map +1 -1
  322. package/dist/queue/drain.js +3 -2
  323. package/dist/queue/drain.js.map +1 -1
  324. package/dist/queue/flush.d.ts +28 -12
  325. package/dist/queue/flush.d.ts.map +1 -1
  326. package/dist/queue/flush.js +43 -18
  327. package/dist/queue/flush.js.map +1 -1
  328. package/dist/queue/handlers/send-event.d.ts.map +1 -1
  329. package/dist/queue/handlers/send-event.js.map +1 -1
  330. package/dist/queue/index.d.ts +1 -2
  331. package/dist/queue/index.d.ts.map +1 -1
  332. package/dist/queue/index.js +2 -2
  333. package/dist/queue/index.js.map +1 -1
  334. package/dist/queue/paths.d.ts +4 -2
  335. package/dist/queue/paths.d.ts.map +1 -1
  336. package/dist/queue/paths.js +4 -2
  337. package/dist/queue/paths.js.map +1 -1
  338. package/dist/queue/process-file.d.ts +5 -1
  339. package/dist/queue/process-file.d.ts.map +1 -1
  340. package/dist/queue/process-file.js +5 -1
  341. package/dist/queue/process-file.js.map +1 -1
  342. package/dist/queue/snapshot.d.ts +4 -1
  343. package/dist/queue/snapshot.d.ts.map +1 -1
  344. package/dist/queue/snapshot.js +4 -1
  345. package/dist/queue/snapshot.js.map +1 -1
  346. package/dist/queue/spawn.d.ts +1 -3
  347. package/dist/queue/spawn.d.ts.map +1 -1
  348. package/dist/queue/spawn.js +1 -3
  349. package/dist/queue/spawn.js.map +1 -1
  350. package/dist/queue/submit.d.ts +6 -1
  351. package/dist/queue/submit.d.ts.map +1 -1
  352. package/dist/queue/submit.js +6 -1
  353. package/dist/queue/submit.js.map +1 -1
  354. package/dist/queue/types.d.ts +5 -1
  355. package/dist/queue/types.d.ts.map +1 -1
  356. package/dist/queue/types.js +5 -1
  357. package/dist/queue/types.js.map +1 -1
  358. package/dist/queue/worker-log.d.ts +3 -1
  359. package/dist/queue/worker-log.d.ts.map +1 -1
  360. package/dist/queue/worker-log.js +3 -1
  361. package/dist/queue/worker-log.js.map +1 -1
  362. package/package.json +1 -1
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee CLI — Import Module Progress Reporter
4
+ *
5
+ * Thin stdout-write helper for per-session progress lines + final summary.
6
+ * Stays out of `pipeline.ts` so the pipeline core is free of formatting
7
+ * concerns and easy to unit-test.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.ProgressReporter = void 0;
11
+ const output_1 = require("../lib/output");
12
+ class ProgressReporter {
13
+ constructor(totalSessions) {
14
+ this.importedCount = 0;
15
+ this.skippedCount = 0;
16
+ this.failedCount = 0;
17
+ this.startedAtMs = Date.now();
18
+ this.totalSessions = 0;
19
+ this.totalSessions = totalSessions;
20
+ }
21
+ onSessionStart(sessionId, idx) {
22
+ const idxStr = `[${idx}/${this.totalSessions}]`;
23
+ process.stdout.write(`${output_1.pc.dim(idxStr)} ${output_1.pc.cyan("→")} ${shortenSession(sessionId)} ...\n`);
24
+ }
25
+ onSessionComplete(result, idx) {
26
+ const idxStr = `[${idx}/${this.totalSessions}]`;
27
+ const session = shortenSession(result.sessionId);
28
+ if (result.status === "imported") {
29
+ this.importedCount += 1;
30
+ const totalEvents = sumEventCounts(result);
31
+ process.stdout.write(`${output_1.pc.dim(idxStr)} ${output_1.pc.green("✓")} ${session} ${output_1.pc.dim(`(${totalEvents} events)`)}\n`);
32
+ }
33
+ else if (result.status === "skipped") {
34
+ this.skippedCount += 1;
35
+ process.stdout.write(`${output_1.pc.dim(idxStr)} ${output_1.pc.dim("○")} ${session} ${output_1.pc.dim(`(skipped: ${result.reason ?? "already tracked"})`)}\n`);
36
+ }
37
+ else {
38
+ this.failedCount += 1;
39
+ process.stdout.write(`${output_1.pc.dim(idxStr)} ${output_1.pc.red("✗")} ${session} ${output_1.pc.red(`(${result.reason ?? "failed"})`)}\n`);
40
+ }
41
+ }
42
+ finalSummary() {
43
+ const elapsedSec = Math.max(0.1, (Date.now() - this.startedAtMs) / 1000);
44
+ process.stdout.write("\n");
45
+ process.stdout.write(output_1.pc.bold("Import complete\n"));
46
+ process.stdout.write(` ${output_1.pc.green(`✓ ${this.importedCount} imported`)}`);
47
+ if (this.skippedCount > 0) {
48
+ process.stdout.write(` ${output_1.pc.dim(`○ ${this.skippedCount} skipped`)}`);
49
+ }
50
+ if (this.failedCount > 0) {
51
+ process.stdout.write(` ${output_1.pc.red(`✗ ${this.failedCount} failed`)}`);
52
+ }
53
+ process.stdout.write(` ${output_1.pc.dim(`${elapsedSec.toFixed(1)}s`)}\n`);
54
+ }
55
+ }
56
+ exports.ProgressReporter = ProgressReporter;
57
+ function shortenSession(sessionId) {
58
+ if (sessionId.length <= 36) {
59
+ return sessionId;
60
+ }
61
+ return sessionId.slice(0, 8) + "…";
62
+ }
63
+ function sumEventCounts(result) {
64
+ const c = result.eventsSent;
65
+ return c.session_start + c.session_end + c.activity_start + c.activity_end
66
+ + c.tool_call + c.file_change + c.session_analytics + c.session_turn_analytics
67
+ + c.session_turn_step_analytics + c.api_request;
68
+ }
69
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/import/progress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * IronBee CLI — Import Module Skip Rule
3
+ *
4
+ * `<projectDir>/.ironbee/sessions/<session_id>/` exists → already tracked.
5
+ * Covers both live-tracked sessions (have `actions.jsonl` etc.) and
6
+ * previously-imported sessions (have `imported.json` marker).
7
+ *
8
+ * `--force` bypasses the rule.
9
+ *
10
+ *
11
+ */
12
+ export declare function shouldSkip(projectDir: string, sessionId: string, force: boolean): boolean;
13
+ //# sourceMappingURL=skip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skip.d.ts","sourceRoot":"","sources":["../../src/import/skip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAMzF"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee CLI — Import Module Skip Rule
4
+ *
5
+ * `<projectDir>/.ironbee/sessions/<session_id>/` exists → already tracked.
6
+ * Covers both live-tracked sessions (have `actions.jsonl` etc.) and
7
+ * previously-imported sessions (have `imported.json` marker).
8
+ *
9
+ * `--force` bypasses the rule.
10
+ *
11
+ *
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.shouldSkip = shouldSkip;
15
+ const fs_1 = require("fs");
16
+ const path_1 = require("path");
17
+ function shouldSkip(projectDir, sessionId, force) {
18
+ if (force) {
19
+ return false;
20
+ }
21
+ const sessionDir = (0, path_1.join)(projectDir, ".ironbee", "sessions", sessionId);
22
+ return (0, fs_1.existsSync)(sessionDir);
23
+ }
24
+ //# sourceMappingURL=skip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skip.js","sourceRoot":"","sources":["../../src/import/skip.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAKH,gCAMC;AATD,2BAAgC;AAChC,+BAA4B;AAE5B,SAAgB,UAAU,CAAC,UAAkB,EAAE,SAAiB,EAAE,KAAc;IAC5E,IAAI,KAAK,EAAE,CAAC;QACR,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,UAAU,GAAW,IAAA,WAAI,EAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC/E,OAAO,IAAA,eAAU,EAAC,UAAU,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * IronBee CLI — Import Module Types
3
+ *
4
+ * Wire types and option/result shapes used across the import pipeline.
5
+ * Pure types — no runtime imports — kept here so every other import-module
6
+ * file can depend on this without dependency cycles.
7
+ *
8
+ *
9
+ */
10
+ import { Event } from "../lib/event";
11
+ /** Scope flag selection. Mutually exclusive */
12
+ export type ImportScope = {
13
+ kind: "current-project";
14
+ } | {
15
+ kind: "projects";
16
+ paths: string[];
17
+ } | {
18
+ kind: "all-projects";
19
+ } | {
20
+ kind: "transcript";
21
+ path: string;
22
+ };
23
+ /** Time-range selection. Both bounds are inclusive epoch-ms. */
24
+ export interface ImportTimeRange {
25
+ fromMs: number;
26
+ toMs: number;
27
+ }
28
+ /** Parsed CLI options after argv resolution. */
29
+ export interface ImportOptions {
30
+ scope: ImportScope;
31
+ /** `null` means no time-range filtering (every session). */
32
+ timeRange: ImportTimeRange | null;
33
+ /** Renders summary, skips POSTs, exits 0. */
34
+ dryRun: boolean;
35
+ /** Skips the interactive `Proceed? [y/N]` prompt. */
36
+ yes: boolean;
37
+ /** Bypasses the skip rule for already-tracked sessions. */
38
+ force: boolean;
39
+ /** How many sessions to import in parallel. */
40
+ concurrency: number;
41
+ /**
42
+ * Events per collector POST. `null` defers to `target.batchSize` (from
43
+ * `collector.batchSize` config) or the built-in default (100). Set
44
+ * explicitly via `--batch-size <n>`. Useful for: low-bandwidth links
45
+ * (smaller batches), gentler backend pressure on large backfills, or
46
+ * diagnostic isolation (set to 1 so a 400 error names a single event).
47
+ */
48
+ batchSize: number | null;
49
+ }
50
+ /** A single session that survived discovery + filtering, ready for import. */
51
+ export interface ImportTarget {
52
+ sessionId: string;
53
+ transcriptPath: string;
54
+ /** Best-effort decoded project directory. May not exist on disk. */
55
+ projectDir: string;
56
+ /** Best-effort decoded project name (basename of `projectDir`). */
57
+ projectName: string;
58
+ /** First-line `timestamp` parsed from the transcript (epoch ms). */
59
+ sessionStartMs: number;
60
+ /** `fs.statSync(transcriptPath).mtimeMs` — transcript size at discovery. */
61
+ mtimeMs: number;
62
+ /** `fs.statSync(transcriptPath).size`. */
63
+ sizeBytes: number;
64
+ }
65
+ /** Per-event-type counts written to the marker on success. */
66
+ export interface ImportEventCounts {
67
+ session_start: number;
68
+ session_end: number;
69
+ activity_start: number;
70
+ activity_end: number;
71
+ tool_call: number;
72
+ file_change: number;
73
+ session_analytics: number;
74
+ session_turn_analytics: number;
75
+ session_turn_step_analytics: number;
76
+ api_request: number;
77
+ }
78
+ /** Result of importing a single session. */
79
+ export interface ImportResult {
80
+ sessionId: string;
81
+ status: "imported" | "skipped" | "failed";
82
+ /** Empty when skipped or failed pre-emit. */
83
+ eventsSent: ImportEventCounts;
84
+ /** Reason string for skipped / failed sessions. */
85
+ reason?: string;
86
+ }
87
+ /** Marker file shape — written under `<projectDir>/.ironbee/sessions/<id>/imported.json`. */
88
+ export interface ImportMarker {
89
+ imported_at: string;
90
+ transcript_path: string;
91
+ transcript_offset: number;
92
+ events_sent: ImportEventCounts;
93
+ schema_version: string;
94
+ }
95
+ /** Aggregated dry-run / live-run summary handed to the progress reporter. */
96
+ export interface ImportSummary {
97
+ /** Per-project breakdown row. */
98
+ projects: ImportProjectSummary[];
99
+ timeRange: ImportTimeRange | null;
100
+ /** Sum of `to_import` across projects — the number of sessions that will be POSTed. */
101
+ toImportCount: number;
102
+ /** Sum of `skipped` across projects — sessions covered by the skip rule. */
103
+ skippedCount: number;
104
+ /** Per-event-type estimated emit counts. */
105
+ estimatedEvents: ImportEventCounts;
106
+ /** USD — sum of analytics `cost_usd` across the to-import set. */
107
+ estimatedCostUsd: number;
108
+ /** Bytes — sum of stringified event payloads across the to-import set. */
109
+ estimatedWireBytes: number;
110
+ /** Configured concurrency (post-resolution). */
111
+ concurrency: number;
112
+ /** Resolved collector endpoint, or `null` when collector is not configured. */
113
+ collectorUrl: string | null;
114
+ }
115
+ export interface ImportProjectSummary {
116
+ projectDir: string;
117
+ found: number;
118
+ skipped: number;
119
+ toImport: number;
120
+ }
121
+ /** Empty event-counts initializer. */
122
+ export declare function emptyEventCounts(): ImportEventCounts;
123
+ /** A single derived event ready to POST to the collector. */
124
+ export type DerivedEvent = Event;
125
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/import/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee CLI — Import Module Types
4
+ *
5
+ * Wire types and option/result shapes used across the import pipeline.
6
+ * Pure types — no runtime imports — kept here so every other import-module
7
+ * file can depend on this without dependency cycles.
8
+ *
9
+ *
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.emptyEventCounts = emptyEventCounts;
13
+ /** Empty event-counts initializer. */
14
+ function emptyEventCounts() {
15
+ return {
16
+ session_start: 0,
17
+ session_end: 0,
18
+ activity_start: 0,
19
+ activity_end: 0,
20
+ tool_call: 0,
21
+ file_change: 0,
22
+ session_analytics: 0,
23
+ session_turn_analytics: 0,
24
+ session_turn_step_analytics: 0,
25
+ api_request: 0,
26
+ };
27
+ }
28
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/import/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAsHH,4CAaC;AAdD,sCAAsC;AACtC,SAAgB,gBAAgB;IAC5B,OAAO;QACH,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,CAAC;QACd,cAAc,EAAE,CAAC;QACjB,YAAY,EAAE,CAAC;QACf,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,CAAC;QACd,iBAAiB,EAAE,CAAC;QACpB,sBAAsB,EAAE,CAAC;QACzB,2BAA2B,EAAE,CAAC;QAC9B,WAAW,EAAE,CAAC;KACjB,CAAC;AACN,CAAC"}
package/dist/index.js CHANGED
@@ -13,6 +13,12 @@ const verify_1 = require("./commands/verify");
13
13
  const analyze_1 = require("./commands/analyze");
14
14
  const queue_1 = require("./commands/queue");
15
15
  const process_job_file_1 = require("./commands/process-job-file");
16
+ const process_analytics_1 = require("./commands/process-analytics");
17
+ const enable_backend_1 = require("./commands/enable-backend");
18
+ const disable_backend_1 = require("./commands/disable-backend");
19
+ const enable_verification_1 = require("./commands/enable-verification");
20
+ const disable_verification_1 = require("./commands/disable-verification");
21
+ const import_1 = require("./commands/import");
16
22
  const queue_2 = require("./queue");
17
23
  const icon_1 = require("./lib/icon");
18
24
  const version_1 = require("./lib/version");
@@ -34,10 +40,18 @@ program.addCommand(status_1.statusCommand);
34
40
  program.addCommand(verify_1.verifyCommand);
35
41
  program.addCommand(analyze_1.analyzeCommand);
36
42
  program.addCommand(queue_1.queueCommand);
43
+ program.addCommand(enable_backend_1.enableBackendCommand);
44
+ program.addCommand(disable_backend_1.disableBackendCommand);
45
+ program.addCommand(enable_verification_1.enableVerificationCommand);
46
+ program.addCommand(disable_verification_1.disableVerificationCommand);
47
+ program.addCommand(import_1.importCommand);
37
48
  program.addCommand(process_job_file_1.processJobFileCommand);
49
+ program.addCommand(process_analytics_1.processAnalyticsCommand);
38
50
  program.addCommand(hook_1.hookCommand);
39
- // hook subcommands and the queue worker run in the background — skip banner and update check
40
- const isBackgroundCommand = process.argv[2] === "hook" || process.argv[2] === "process-job-file";
51
+ // hook subcommands and detached workers run in the background — skip banner and update check
52
+ const isBackgroundCommand = process.argv[2] === "hook"
53
+ || process.argv[2] === "process-job-file"
54
+ || process.argv[2] === "process-analytics";
41
55
  if (process.argv.length === 2) {
42
56
  (0, icon_1.printBanner)();
43
57
  console.log();
@@ -53,6 +67,11 @@ if (process.argv.length === 2) {
53
67
  console.log(` ${output_1.pc.green("status")} ${output_1.pc.dim("[project-dir]")} Show verification status for sessions`);
54
68
  console.log(` ${output_1.pc.green("verify")} ${output_1.pc.dim("[session-id]")} Dry-run verdict validation`);
55
69
  console.log(` ${output_1.pc.green("analyze")} ${output_1.pc.dim("[session-id]")} Analyze session metrics (or all sessions)`);
70
+ console.log(` ${output_1.pc.green("enable-backend")} ${output_1.pc.dim("<runtime>")} Enable backend verification (e.g. node)`);
71
+ console.log(` ${output_1.pc.green("disable-backend")} ${output_1.pc.dim("<runtime>")} Disable backend verification (preserves customizations)`);
72
+ console.log(` ${output_1.pc.green("enable-verification")} Turn enforcement on (default state)`);
73
+ console.log(` ${output_1.pc.green("disable-verification")} Monitoring-only mode (sessions/tools shipped, no enforcement)`);
74
+ console.log(` ${output_1.pc.green("import")} Import historical Claude sessions to the IronBee Collector`);
56
75
  console.log();
57
76
  console.log(` ${output_1.pc.dim("Run")} ${output_1.pc.cyan("ironbee <command> --help")} ${output_1.pc.dim("for more info on a command.")}`);
58
77
  console.log();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@
16
16
  *
17
17
  * Both are no-ops when `IRONBEE_COLLECTOR=false` is set (jest harness).
18
18
  */
19
- import { AppendActionInput } from "../hooks/core/actions";
19
+ import { Event } from "./event";
20
20
  export interface CollectorTarget {
21
21
  url: string;
22
22
  apiKey?: string;
@@ -26,6 +26,12 @@ export interface CollectorTarget {
26
26
  * Undefined → handler falls back to its built-in default (100).
27
27
  */
28
28
  batchSize?: number;
29
+ /**
30
+ * Per-request HTTP timeout in milliseconds for the BATCH send path.
31
+ * Populated from `config.collector.timeoutMs`. Undefined → callers fall
32
+ * back to `BATCH_SEND_TIMEOUT_MS` (10000ms).
33
+ */
34
+ timeoutMs?: number;
29
35
  }
30
36
  export interface PostEventsResult {
31
37
  status: number;
@@ -37,7 +43,7 @@ export interface PostEventsResult {
37
43
  * connect timeout, or socket timeout. Does NOT throw on non-2xx — callers
38
44
  * decide what HTTP status means for their use case.
39
45
  */
40
- export declare function postEventsBatch(events: unknown[], target: CollectorTarget, opts?: {
46
+ export declare function postEventsBatch(events: Event[], target: CollectorTarget, opts?: {
41
47
  timeoutMs?: number;
42
48
  }): Promise<PostEventsResult>;
43
49
  /**
@@ -66,5 +72,25 @@ export declare function getCollectorTarget(projectDir?: string): CollectorTarget
66
72
  * lifecycle events made it to the collector. The line carries the event id
67
73
  * and type to make grep'ing trivial; it does not include payload content.
68
74
  */
69
- export declare function sendToCollector(entry: AppendActionInput, _sessionId: string, projectDir: string): Promise<void>;
75
+ export declare function sendToCollector(entry: Event, _sessionId: string, projectDir: string): Promise<void>;
76
+ /**
77
+ * Batched companion of {@link sendToCollector}. POSTs an entire array of
78
+ * events in a single HTTP request — collapses an N-event drain from N
79
+ * RTTs to 1 RTT, fitting comfortably inside hook timeouts that single-
80
+ * event drains overflow.
81
+ *
82
+ * Resolves on a 2xx response; rejects on network / timeout / non-2xx.
83
+ * Per-event id/timestamp/etc. are expected to be already populated on
84
+ * each entry (callers spread `baseFields()` and override `id` per event).
85
+ *
86
+ * Silent no-op when the collector isn't configured (mirrors
87
+ * `sendToCollector`).
88
+ */
89
+ export declare function sendEventsBatchToCollector(entries: Event[], _sessionId: string, projectDir: string,
90
+ /**
91
+ * Optional pre-resolved target — lets callers (e.g. analytics emit) avoid
92
+ * re-resolving config across N batches per drain. When omitted, falls
93
+ * back to {@link getCollectorTarget} like the single-event path does.
94
+ */
95
+ preResolvedTarget?: CollectorTarget | null): Promise<void>;
70
96
  //# sourceMappingURL=collector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/lib/collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAK1D,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACjC,MAAM,EAAE,OAAO,EAAE,EACjB,MAAM,EAAE,eAAe,EACvB,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAgD3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAsB9E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBrH"}
1
+ {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/lib/collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAgBhC,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACjC,MAAM,EAAE,KAAK,EAAE,EACf,MAAM,EAAE,eAAe,EACvB,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAiE3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CA+B9E;AAUD;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBzG;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,0BAA0B,CAC5C,OAAO,EAAE,KAAK,EAAE,EAChB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM;AAClB;;;;GAIG;AACH,iBAAiB,CAAC,EAAE,eAAe,GAAG,IAAI,GAC3C,OAAO,CAAC,IAAI,CAAC,CA4Cf"}
@@ -21,11 +21,23 @@ Object.defineProperty(exports, "__esModule", { value: true });
21
21
  exports.postEventsBatch = postEventsBatch;
22
22
  exports.getCollectorTarget = getCollectorTarget;
23
23
  exports.sendToCollector = sendToCollector;
24
+ exports.sendEventsBatchToCollector = sendEventsBatchToCollector;
24
25
  const https_1 = require("https");
25
26
  const http_1 = require("http");
26
27
  const config_1 = require("./config");
27
28
  const logger_1 = require("./logger");
28
29
  const SEND_TIMEOUT_MS = 3000;
30
+ /**
31
+ * Default per-request HTTP timeout for the BATCH path
32
+ * ({@link sendEventsBatchToCollector}). Single-event sends keep
33
+ * SEND_TIMEOUT_MS (3000) — they ride hooks where blocking is bad. Batches
34
+ * carry hundreds of KB on long sessions and need a longer ceiling on slow
35
+ * uplinks. Tunable per project via `config.collector.timeoutMs` (clamped
36
+ * to [1000, 60000]).
37
+ */
38
+ const BATCH_SEND_TIMEOUT_MS = 10000;
39
+ const TIMEOUT_MS_MIN = 1000;
40
+ const TIMEOUT_MS_MAX = 60000;
29
41
  const EVENTS_PATH = "/v1/events";
30
42
  /**
31
43
  * Low-level transport: POST a JSON array of events to the collector and
@@ -36,13 +48,34 @@ const EVENTS_PATH = "/v1/events";
36
48
  async function postEventsBatch(events, target, opts) {
37
49
  const timeoutMs = opts?.timeoutMs ?? SEND_TIMEOUT_MS;
38
50
  return new Promise((resolve, reject) => {
51
+ // Single-settle guard. The Node http response can fire BOTH
52
+ // "end" and "close" (close can fire after end on some Node
53
+ // versions, or instead of end on early disconnects). Without
54
+ // this, the second handler still computes work but the Promise
55
+ // ignores it; with this, the second handler is a no-op and we
56
+ // cleanly settle exactly once.
57
+ let settled = false;
58
+ const settleResolve = (r) => {
59
+ if (settled) {
60
+ return;
61
+ }
62
+ settled = true;
63
+ resolve(r);
64
+ };
65
+ const settleReject = (e) => {
66
+ if (settled) {
67
+ return;
68
+ }
69
+ settled = true;
70
+ reject(e);
71
+ };
39
72
  try {
40
73
  const body = JSON.stringify(events);
41
74
  const url = new URL(EVENTS_PATH, target.url);
42
75
  const isHttps = url.protocol === "https:";
43
76
  const doRequest = isHttps ? https_1.request : http_1.request;
44
77
  const timer = setTimeout(() => {
45
- reject(new Error("collector: send timeout"));
78
+ settleReject(new Error("collector: send timeout"));
46
79
  }, timeoutMs);
47
80
  const req = doRequest({
48
81
  hostname: url.hostname,
@@ -61,20 +94,20 @@ async function postEventsBatch(events, target, opts) {
61
94
  res.on("data", (d) => { chunks += d; });
62
95
  res.on("end", () => {
63
96
  clearTimeout(timer);
64
- resolve({ status: res.statusCode ?? 0, body: chunks });
97
+ settleResolve({ status: res.statusCode ?? 0, body: chunks });
65
98
  });
66
99
  res.on("close", () => {
67
100
  clearTimeout(timer);
68
- resolve({ status: res.statusCode ?? 0, body: chunks });
101
+ settleResolve({ status: res.statusCode ?? 0, body: chunks });
69
102
  });
70
103
  });
71
- req.on("error", (err) => { clearTimeout(timer); reject(err); });
72
- req.on("timeout", () => { clearTimeout(timer); req.destroy(); reject(new Error("collector: request timeout")); });
104
+ req.on("error", (err) => { clearTimeout(timer); settleReject(err); });
105
+ req.on("timeout", () => { clearTimeout(timer); req.destroy(); settleReject(new Error("collector: request timeout")); });
73
106
  req.write(body);
74
107
  req.end();
75
108
  }
76
109
  catch (e) {
77
- reject(e instanceof Error ? e : new Error(String(e)));
110
+ settleReject(e instanceof Error ? e : new Error(String(e)));
78
111
  }
79
112
  });
80
113
  }
@@ -109,12 +142,28 @@ function getCollectorTarget(projectDir) {
109
142
  if (typeof section.url !== "string" || section.url.length === 0) {
110
143
  return null;
111
144
  }
145
+ // apiKey is required — keeps the "configured" state aligned with
146
+ // `isCollectorConfigured` (which the auto-enable path for jobQueue /
147
+ // recording / analytics keys off). Without it we'd resolve a target,
148
+ // POST without auth, and get 401s while telling the operator everything
149
+ // is configured. Better to fail the preflight here.
150
+ if (typeof section.apiKey !== "string" || section.apiKey.length === 0) {
151
+ return null;
152
+ }
112
153
  return {
113
154
  url: section.url,
114
155
  apiKey: section.apiKey,
115
156
  batchSize: typeof section.batchSize === "number" ? section.batchSize : undefined,
157
+ timeoutMs: typeof section.timeoutMs === "number" ? clampTimeoutMs(section.timeoutMs) : undefined,
116
158
  };
117
159
  }
160
+ /** Clamp a configured timeout to the safe operational band. */
161
+ function clampTimeoutMs(value) {
162
+ if (!Number.isFinite(value)) {
163
+ return BATCH_SEND_TIMEOUT_MS;
164
+ }
165
+ return Math.min(TIMEOUT_MS_MAX, Math.max(TIMEOUT_MS_MIN, Math.floor(value)));
166
+ }
118
167
  /**
119
168
  * Fire-and-forget single-event send. Resolves on any HTTP response (status is
120
169
  * intentionally ignored so a 5xx from the collector does not propagate back
@@ -135,10 +184,71 @@ async function sendToCollector(entry, _sessionId, projectDir) {
135
184
  try {
136
185
  // entry is already enriched with id/session_id/project_name/timestamp by appendAction.
137
186
  await postEventsBatch([entry], target, { timeoutMs: SEND_TIMEOUT_MS });
138
- logger_1.logger.debug(`collector: posted type=${entry.type} id=${entry.id ?? "?"} in ${Date.now() - startedAt}ms`);
187
+ logger_1.logger.debug(`collector: posted type=${entry.type} id=${entry.id} in ${Date.now() - startedAt}ms`);
188
+ }
189
+ catch (e) {
190
+ logger_1.logger.debug(`collector: sendToCollector failed type=${entry.type} id=${entry.id}: ${e}`);
191
+ throw e instanceof Error ? e : new Error(String(e));
192
+ }
193
+ }
194
+ /**
195
+ * Batched companion of {@link sendToCollector}. POSTs an entire array of
196
+ * events in a single HTTP request — collapses an N-event drain from N
197
+ * RTTs to 1 RTT, fitting comfortably inside hook timeouts that single-
198
+ * event drains overflow.
199
+ *
200
+ * Resolves on a 2xx response; rejects on network / timeout / non-2xx.
201
+ * Per-event id/timestamp/etc. are expected to be already populated on
202
+ * each entry (callers spread `baseFields()` and override `id` per event).
203
+ *
204
+ * Silent no-op when the collector isn't configured (mirrors
205
+ * `sendToCollector`).
206
+ */
207
+ async function sendEventsBatchToCollector(entries, _sessionId, projectDir,
208
+ /**
209
+ * Optional pre-resolved target — lets callers (e.g. analytics emit) avoid
210
+ * re-resolving config across N batches per drain. When omitted, falls
211
+ * back to {@link getCollectorTarget} like the single-event path does.
212
+ */
213
+ preResolvedTarget) {
214
+ if (entries.length === 0) {
215
+ return;
216
+ }
217
+ const target = preResolvedTarget !== undefined
218
+ ? preResolvedTarget
219
+ : getCollectorTarget(projectDir);
220
+ if (!target) {
221
+ return;
222
+ }
223
+ const timeoutMs = target.timeoutMs ?? BATCH_SEND_TIMEOUT_MS;
224
+ const startedAt = Date.now();
225
+ try {
226
+ const result = await postEventsBatch(entries, target, { timeoutMs });
227
+ const ok = result.status >= 200 && result.status < 300;
228
+ if (!ok) {
229
+ // Surface the response body in the error — without it the
230
+ // operator just sees "HTTP 400" and has no path to diagnose
231
+ // which field the collector rejected. Truncate so a 10 KB
232
+ // error response doesn't blow up the progress reporter.
233
+ const BODY_CAP = 500;
234
+ const bodyExcerpt = result.body.length > BODY_CAP
235
+ ? `${result.body.slice(0, BODY_CAP)}…`
236
+ : result.body;
237
+ const firstType = entries[0]?.type ?? "(empty)";
238
+ const typeBreakdown = {};
239
+ for (const e of entries) {
240
+ typeBreakdown[e.type] = (typeBreakdown[e.type] ?? 0) + 1;
241
+ }
242
+ const breakdownStr = Object.entries(typeBreakdown)
243
+ .map(([t, n]) => `${t}=${n}`)
244
+ .join(",");
245
+ throw new Error(`collector: HTTP ${result.status} for batch of ${entries.length} (first_type=${firstType}, types=${breakdownStr})`
246
+ + (bodyExcerpt.length > 0 ? `: ${bodyExcerpt}` : ""));
247
+ }
248
+ logger_1.logger.debug(`collector: posted batch=${entries.length} first_type=${entries[0].type} in ${Date.now() - startedAt}ms`);
139
249
  }
140
250
  catch (e) {
141
- logger_1.logger.debug(`collector: sendToCollector failed type=${entry.type} id=${entry.id ?? "?"}: ${e}`);
251
+ logger_1.logger.debug(`collector: sendEventsBatchToCollector failed batch=${entries.length}: ${e}`);
142
252
  throw e instanceof Error ? e : new Error(String(e));
143
253
  }
144
254
  }
@@ -1 +1 @@
1
- {"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/lib/collector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/lib/collector.ts"],"names":[],"mappings":"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"}