@ironbee-ai/cli 0.6.1 → 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 (381) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +167 -39
  3. package/dist/analysis/code-changes.js +3 -3
  4. package/dist/analysis/code-changes.js.map +1 -1
  5. package/dist/analysis/cross-session.js.map +1 -1
  6. package/dist/analysis/fix-effectiveness.js.map +1 -1
  7. package/dist/analysis/time-analysis.js.map +1 -1
  8. package/dist/analysis/verdict-details.js.map +1 -1
  9. package/dist/analysis/verification-quality.js.map +1 -1
  10. package/dist/analytics/classifier.d.ts +99 -0
  11. package/dist/analytics/classifier.d.ts.map +1 -0
  12. package/dist/analytics/classifier.js +380 -0
  13. package/dist/analytics/classifier.js.map +1 -0
  14. package/dist/analytics/emit.d.ts +67 -0
  15. package/dist/analytics/emit.d.ts.map +1 -0
  16. package/dist/analytics/emit.js +901 -0
  17. package/dist/analytics/emit.js.map +1 -0
  18. package/dist/analytics/errors.d.ts +33 -0
  19. package/dist/analytics/errors.d.ts.map +1 -0
  20. package/dist/analytics/errors.js +93 -0
  21. package/dist/analytics/errors.js.map +1 -0
  22. package/dist/analytics/hook-trigger.d.ts +39 -0
  23. package/dist/analytics/hook-trigger.d.ts.map +1 -0
  24. package/dist/analytics/hook-trigger.js +127 -0
  25. package/dist/analytics/hook-trigger.js.map +1 -0
  26. package/dist/analytics/log.d.ts +44 -0
  27. package/dist/analytics/log.d.ts.map +1 -0
  28. package/dist/analytics/log.js +158 -0
  29. package/dist/analytics/log.js.map +1 -0
  30. package/dist/analytics/merge.d.ts +40 -0
  31. package/dist/analytics/merge.d.ts.map +1 -0
  32. package/dist/analytics/merge.js +527 -0
  33. package/dist/analytics/merge.js.map +1 -0
  34. package/dist/analytics/pricing.d.ts +149 -0
  35. package/dist/analytics/pricing.d.ts.map +1 -0
  36. package/dist/analytics/pricing.js +179 -0
  37. package/dist/analytics/pricing.js.map +1 -0
  38. package/dist/analytics/projection.d.ts +356 -0
  39. package/dist/analytics/projection.d.ts.map +1 -0
  40. package/dist/analytics/projection.js +2281 -0
  41. package/dist/analytics/projection.js.map +1 -0
  42. package/dist/analytics/spawn.d.ts +28 -0
  43. package/dist/analytics/spawn.d.ts.map +1 -0
  44. package/dist/analytics/spawn.js +57 -0
  45. package/dist/analytics/spawn.js.map +1 -0
  46. package/dist/analytics/state.d.ts +58 -0
  47. package/dist/analytics/state.d.ts.map +1 -0
  48. package/dist/analytics/state.js +329 -0
  49. package/dist/analytics/state.js.map +1 -0
  50. package/dist/analytics/transcript.d.ts +150 -0
  51. package/dist/analytics/transcript.d.ts.map +1 -0
  52. package/dist/analytics/transcript.js +276 -0
  53. package/dist/analytics/transcript.js.map +1 -0
  54. package/dist/analytics/types.d.ts +875 -0
  55. package/dist/analytics/types.d.ts.map +1 -0
  56. package/dist/analytics/types.js +31 -0
  57. package/dist/analytics/types.js.map +1 -0
  58. package/dist/clients/base.d.ts +21 -2
  59. package/dist/clients/base.d.ts.map +1 -1
  60. package/dist/clients/claude/commands/ironbee-verify.md +15 -7
  61. package/dist/clients/claude/fragments/command-verify.node.md +33 -0
  62. package/dist/clients/claude/fragments/rule.node.md +29 -0
  63. package/dist/clients/claude/fragments/skill.node.md +77 -0
  64. package/dist/clients/claude/hooks/activity-end.d.ts +13 -0
  65. package/dist/clients/claude/hooks/activity-end.d.ts.map +1 -0
  66. package/dist/clients/claude/hooks/activity-end.js +42 -0
  67. package/dist/clients/claude/hooks/activity-end.js.map +1 -0
  68. package/dist/clients/claude/hooks/clear-verdict.d.ts +9 -4
  69. package/dist/clients/claude/hooks/clear-verdict.d.ts.map +1 -1
  70. package/dist/clients/claude/hooks/clear-verdict.js +50 -12
  71. package/dist/clients/claude/hooks/clear-verdict.js.map +1 -1
  72. package/dist/clients/claude/hooks/require-verdict.d.ts +8 -3
  73. package/dist/clients/claude/hooks/require-verdict.d.ts.map +1 -1
  74. package/dist/clients/claude/hooks/require-verdict.js +17 -6
  75. package/dist/clients/claude/hooks/require-verdict.js.map +1 -1
  76. package/dist/clients/claude/hooks/require-verification.d.ts +7 -4
  77. package/dist/clients/claude/hooks/require-verification.d.ts.map +1 -1
  78. package/dist/clients/claude/hooks/require-verification.js +44 -22
  79. package/dist/clients/claude/hooks/require-verification.js.map +1 -1
  80. package/dist/clients/claude/hooks/session-end.d.ts.map +1 -1
  81. package/dist/clients/claude/hooks/session-end.js +17 -2
  82. package/dist/clients/claude/hooks/session-end.js.map +1 -1
  83. package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
  84. package/dist/clients/claude/hooks/session-start.js +2 -1
  85. package/dist/clients/claude/hooks/session-start.js.map +1 -1
  86. package/dist/clients/claude/hooks/track-action-monitor.d.ts +27 -0
  87. package/dist/clients/claude/hooks/track-action-monitor.d.ts.map +1 -0
  88. package/dist/clients/claude/hooks/track-action-monitor.js +126 -0
  89. package/dist/clients/claude/hooks/track-action-monitor.js.map +1 -0
  90. package/dist/clients/claude/hooks/track-action.d.ts.map +1 -1
  91. package/dist/clients/claude/hooks/track-action.js +29 -20
  92. package/dist/clients/claude/hooks/track-action.js.map +1 -1
  93. package/dist/clients/claude/hooks/verify-gate.d.ts.map +1 -1
  94. package/dist/clients/claude/hooks/verify-gate.js +18 -1
  95. package/dist/clients/claude/hooks/verify-gate.js.map +1 -1
  96. package/dist/clients/claude/index.d.ts +4 -1
  97. package/dist/clients/claude/index.d.ts.map +1 -1
  98. package/dist/clients/claude/index.js +185 -94
  99. package/dist/clients/claude/index.js.map +1 -1
  100. package/dist/clients/claude/rules/ironbee-verification.md +41 -33
  101. package/dist/clients/claude/skills/ironbee-verification.md +93 -76
  102. package/dist/clients/cursor/commands/ironbee-verify/SKILL.md +18 -10
  103. package/dist/clients/cursor/fragments/command-verify.node.md +33 -0
  104. package/dist/clients/cursor/fragments/rule.node.md +29 -0
  105. package/dist/clients/cursor/fragments/skill.node.md +77 -0
  106. package/dist/clients/cursor/hooks/activity-end.d.ts +14 -0
  107. package/dist/clients/cursor/hooks/activity-end.d.ts.map +1 -0
  108. package/dist/clients/cursor/hooks/activity-end.js +45 -0
  109. package/dist/clients/cursor/hooks/activity-end.js.map +1 -0
  110. package/dist/clients/cursor/hooks/clear-verdict.d.ts +13 -4
  111. package/dist/clients/cursor/hooks/clear-verdict.d.ts.map +1 -1
  112. package/dist/clients/cursor/hooks/clear-verdict.js +59 -14
  113. package/dist/clients/cursor/hooks/clear-verdict.js.map +1 -1
  114. package/dist/clients/cursor/hooks/require-verdict.d.ts +8 -3
  115. package/dist/clients/cursor/hooks/require-verdict.d.ts.map +1 -1
  116. package/dist/clients/cursor/hooks/require-verdict.js +17 -6
  117. package/dist/clients/cursor/hooks/require-verdict.js.map +1 -1
  118. package/dist/clients/cursor/hooks/require-verification.d.ts.map +1 -1
  119. package/dist/clients/cursor/hooks/require-verification.js +42 -16
  120. package/dist/clients/cursor/hooks/require-verification.js.map +1 -1
  121. package/dist/clients/cursor/hooks/session-end.d.ts.map +1 -1
  122. package/dist/clients/cursor/hooks/session-end.js +18 -2
  123. package/dist/clients/cursor/hooks/session-end.js.map +1 -1
  124. package/dist/clients/cursor/hooks/session-start.d.ts.map +1 -1
  125. package/dist/clients/cursor/hooks/session-start.js +2 -1
  126. package/dist/clients/cursor/hooks/session-start.js.map +1 -1
  127. package/dist/clients/cursor/hooks/track-action-monitor.d.ts +27 -0
  128. package/dist/clients/cursor/hooks/track-action-monitor.d.ts.map +1 -0
  129. package/dist/clients/cursor/hooks/track-action-monitor.js +133 -0
  130. package/dist/clients/cursor/hooks/track-action-monitor.js.map +1 -0
  131. package/dist/clients/cursor/hooks/track-action.d.ts.map +1 -1
  132. package/dist/clients/cursor/hooks/track-action.js +51 -23
  133. package/dist/clients/cursor/hooks/track-action.js.map +1 -1
  134. package/dist/clients/cursor/hooks/verify-gate.d.ts.map +1 -1
  135. package/dist/clients/cursor/hooks/verify-gate.js +14 -1
  136. package/dist/clients/cursor/hooks/verify-gate.js.map +1 -1
  137. package/dist/clients/cursor/index.d.ts +4 -1
  138. package/dist/clients/cursor/index.d.ts.map +1 -1
  139. package/dist/clients/cursor/index.js +131 -65
  140. package/dist/clients/cursor/index.js.map +1 -1
  141. package/dist/clients/cursor/rules/ironbee-verification.mdc +37 -29
  142. package/dist/clients/cursor/skills/ironbee-verification.md +93 -76
  143. package/dist/clients/registry.d.ts +14 -0
  144. package/dist/clients/registry.d.ts.map +1 -1
  145. package/dist/clients/registry.js +34 -0
  146. package/dist/clients/registry.js.map +1 -1
  147. package/dist/commands/analyze.d.ts.map +1 -1
  148. package/dist/commands/analyze.js +40 -0
  149. package/dist/commands/analyze.js.map +1 -1
  150. package/dist/commands/backend-toggle.d.ts +45 -0
  151. package/dist/commands/backend-toggle.d.ts.map +1 -0
  152. package/dist/commands/backend-toggle.js +192 -0
  153. package/dist/commands/backend-toggle.js.map +1 -0
  154. package/dist/commands/disable-backend.d.ts +14 -0
  155. package/dist/commands/disable-backend.d.ts.map +1 -0
  156. package/dist/commands/disable-backend.js +34 -0
  157. package/dist/commands/disable-backend.js.map +1 -0
  158. package/dist/commands/disable-verification.d.ts +16 -0
  159. package/dist/commands/disable-verification.d.ts.map +1 -0
  160. package/dist/commands/disable-verification.js +36 -0
  161. package/dist/commands/disable-verification.js.map +1 -0
  162. package/dist/commands/enable-backend.d.ts +15 -0
  163. package/dist/commands/enable-backend.d.ts.map +1 -0
  164. package/dist/commands/enable-backend.js +35 -0
  165. package/dist/commands/enable-backend.js.map +1 -0
  166. package/dist/commands/enable-verification.d.ts +14 -0
  167. package/dist/commands/enable-verification.d.ts.map +1 -0
  168. package/dist/commands/enable-verification.js +34 -0
  169. package/dist/commands/enable-verification.js.map +1 -0
  170. package/dist/commands/hook.d.ts.map +1 -1
  171. package/dist/commands/hook.js +60 -0
  172. package/dist/commands/hook.js.map +1 -1
  173. package/dist/commands/import.d.ts +39 -0
  174. package/dist/commands/import.d.ts.map +1 -0
  175. package/dist/commands/import.js +369 -0
  176. package/dist/commands/import.js.map +1 -0
  177. package/dist/commands/install.d.ts.map +1 -1
  178. package/dist/commands/install.js +15 -20
  179. package/dist/commands/install.js.map +1 -1
  180. package/dist/commands/process-analytics.d.ts +18 -0
  181. package/dist/commands/process-analytics.d.ts.map +1 -0
  182. package/dist/commands/process-analytics.js +57 -0
  183. package/dist/commands/process-analytics.js.map +1 -0
  184. package/dist/commands/queue.d.ts +2 -3
  185. package/dist/commands/queue.d.ts.map +1 -1
  186. package/dist/commands/queue.js +2 -3
  187. package/dist/commands/queue.js.map +1 -1
  188. package/dist/commands/status.d.ts.map +1 -1
  189. package/dist/commands/status.js +29 -1
  190. package/dist/commands/status.js.map +1 -1
  191. package/dist/commands/verification-toggle.d.ts +47 -0
  192. package/dist/commands/verification-toggle.d.ts.map +1 -0
  193. package/dist/commands/verification-toggle.js +113 -0
  194. package/dist/commands/verification-toggle.js.map +1 -0
  195. package/dist/commands/verify.d.ts.map +1 -1
  196. package/dist/commands/verify.js +28 -0
  197. package/dist/commands/verify.js.map +1 -1
  198. package/dist/hooks/core/actions.d.ts +77 -70
  199. package/dist/hooks/core/actions.d.ts.map +1 -1
  200. package/dist/hooks/core/actions.js +45 -30
  201. package/dist/hooks/core/actions.js.map +1 -1
  202. package/dist/hooks/core/activity-end.d.ts +20 -0
  203. package/dist/hooks/core/activity-end.d.ts.map +1 -0
  204. package/dist/hooks/core/activity-end.js +23 -0
  205. package/dist/hooks/core/activity-end.js.map +1 -0
  206. package/dist/hooks/core/file-diff.d.ts +19 -0
  207. package/dist/hooks/core/file-diff.d.ts.map +1 -0
  208. package/dist/hooks/core/file-diff.js +39 -0
  209. package/dist/hooks/core/file-diff.js.map +1 -0
  210. package/dist/hooks/core/required-tools.d.ts +30 -0
  211. package/dist/hooks/core/required-tools.d.ts.map +1 -0
  212. package/dist/hooks/core/required-tools.js +70 -0
  213. package/dist/hooks/core/required-tools.js.map +1 -0
  214. package/dist/hooks/core/session-state.d.ts +12 -3
  215. package/dist/hooks/core/session-state.d.ts.map +1 -1
  216. package/dist/hooks/core/session-state.js +59 -0
  217. package/dist/hooks/core/session-state.js.map +1 -1
  218. package/dist/hooks/core/submit-verdict.d.ts.map +1 -1
  219. package/dist/hooks/core/submit-verdict.js +16 -12
  220. package/dist/hooks/core/submit-verdict.js.map +1 -1
  221. package/dist/hooks/core/tool-use-stash.d.ts +41 -0
  222. package/dist/hooks/core/tool-use-stash.d.ts.map +1 -0
  223. package/dist/hooks/core/tool-use-stash.js +82 -0
  224. package/dist/hooks/core/tool-use-stash.js.map +1 -0
  225. package/dist/hooks/core/verify-gate.d.ts +17 -3
  226. package/dist/hooks/core/verify-gate.d.ts.map +1 -1
  227. package/dist/hooks/core/verify-gate.js +315 -119
  228. package/dist/hooks/core/verify-gate.js.map +1 -1
  229. package/dist/import/claude/analytics-runner.d.ts +42 -0
  230. package/dist/import/claude/analytics-runner.d.ts.map +1 -0
  231. package/dist/import/claude/analytics-runner.js +213 -0
  232. package/dist/import/claude/analytics-runner.js.map +1 -0
  233. package/dist/import/claude/discovery.d.ts +22 -0
  234. package/dist/import/claude/discovery.d.ts.map +1 -0
  235. package/dist/import/claude/discovery.js +197 -0
  236. package/dist/import/claude/discovery.js.map +1 -0
  237. package/dist/import/claude/encoding.d.ts +50 -0
  238. package/dist/import/claude/encoding.d.ts.map +1 -0
  239. package/dist/import/claude/encoding.js +110 -0
  240. package/dist/import/claude/encoding.js.map +1 -0
  241. package/dist/import/claude/events/file-change.d.ts +28 -0
  242. package/dist/import/claude/events/file-change.d.ts.map +1 -0
  243. package/dist/import/claude/events/file-change.js +112 -0
  244. package/dist/import/claude/events/file-change.js.map +1 -0
  245. package/dist/import/claude/events/tool-call.d.ts +61 -0
  246. package/dist/import/claude/events/tool-call.d.ts.map +1 -0
  247. package/dist/import/claude/events/tool-call.js +119 -0
  248. package/dist/import/claude/events/tool-call.js.map +1 -0
  249. package/dist/import/claude/runner.d.ts +31 -0
  250. package/dist/import/claude/runner.d.ts.map +1 -0
  251. package/dist/import/claude/runner.js +280 -0
  252. package/dist/import/claude/runner.js.map +1 -0
  253. package/dist/import/claude/summary.d.ts +23 -0
  254. package/dist/import/claude/summary.d.ts.map +1 -0
  255. package/dist/import/claude/summary.js +186 -0
  256. package/dist/import/claude/summary.js.map +1 -0
  257. package/dist/import/claude/transcript-walk.d.ts +52 -0
  258. package/dist/import/claude/transcript-walk.d.ts.map +1 -0
  259. package/dist/import/claude/transcript-walk.js +187 -0
  260. package/dist/import/claude/transcript-walk.js.map +1 -0
  261. package/dist/import/concurrent-pool.d.ts +45 -0
  262. package/dist/import/concurrent-pool.d.ts.map +1 -0
  263. package/dist/import/concurrent-pool.js +95 -0
  264. package/dist/import/concurrent-pool.js.map +1 -0
  265. package/dist/import/emitter.d.ts +29 -0
  266. package/dist/import/emitter.d.ts.map +1 -0
  267. package/dist/import/emitter.js +66 -0
  268. package/dist/import/emitter.js.map +1 -0
  269. package/dist/import/events/activity.d.ts +23 -0
  270. package/dist/import/events/activity.d.ts.map +1 -0
  271. package/dist/import/events/activity.js +45 -0
  272. package/dist/import/events/activity.js.map +1 -0
  273. package/dist/import/events/session.d.ts +24 -0
  274. package/dist/import/events/session.d.ts.map +1 -0
  275. package/dist/import/events/session.js +47 -0
  276. package/dist/import/events/session.js.map +1 -0
  277. package/dist/import/filter.d.ts +47 -0
  278. package/dist/import/filter.d.ts.map +1 -0
  279. package/dist/import/filter.js +90 -0
  280. package/dist/import/filter.js.map +1 -0
  281. package/dist/import/ids.d.ts +56 -0
  282. package/dist/import/ids.d.ts.map +1 -0
  283. package/dist/import/ids.js +87 -0
  284. package/dist/import/ids.js.map +1 -0
  285. package/dist/import/index.d.ts +29 -0
  286. package/dist/import/index.d.ts.map +1 -0
  287. package/dist/import/index.js +52 -0
  288. package/dist/import/index.js.map +1 -0
  289. package/dist/import/marker.d.ts +20 -0
  290. package/dist/import/marker.d.ts.map +1 -0
  291. package/dist/import/marker.js +71 -0
  292. package/dist/import/marker.js.map +1 -0
  293. package/dist/import/pipeline.d.ts +41 -0
  294. package/dist/import/pipeline.d.ts.map +1 -0
  295. package/dist/import/pipeline.js +47 -0
  296. package/dist/import/pipeline.js.map +1 -0
  297. package/dist/import/progress.d.ts +20 -0
  298. package/dist/import/progress.d.ts.map +1 -0
  299. package/dist/import/progress.js +69 -0
  300. package/dist/import/progress.js.map +1 -0
  301. package/dist/import/skip.d.ts +13 -0
  302. package/dist/import/skip.d.ts.map +1 -0
  303. package/dist/import/skip.js +24 -0
  304. package/dist/import/skip.js.map +1 -0
  305. package/dist/import/types.d.ts +125 -0
  306. package/dist/import/types.d.ts.map +1 -0
  307. package/dist/import/types.js +28 -0
  308. package/dist/import/types.js.map +1 -0
  309. package/dist/index.js +21 -2
  310. package/dist/index.js.map +1 -1
  311. package/dist/lib/collector.d.ts +29 -3
  312. package/dist/lib/collector.d.ts.map +1 -1
  313. package/dist/lib/collector.js +118 -8
  314. package/dist/lib/collector.js.map +1 -1
  315. package/dist/lib/config.d.ts +240 -83
  316. package/dist/lib/config.d.ts.map +1 -1
  317. package/dist/lib/config.js +482 -89
  318. package/dist/lib/config.js.map +1 -1
  319. package/dist/lib/event.d.ts +72 -0
  320. package/dist/lib/event.d.ts.map +1 -0
  321. package/dist/lib/event.js +42 -0
  322. package/dist/lib/event.js.map +1 -0
  323. package/dist/lib/gitignore.d.ts +21 -0
  324. package/dist/lib/gitignore.d.ts.map +1 -0
  325. package/dist/lib/gitignore.js +54 -0
  326. package/dist/lib/gitignore.js.map +1 -0
  327. package/dist/lib/runtime-section.d.ts +118 -0
  328. package/dist/lib/runtime-section.d.ts.map +1 -0
  329. package/dist/lib/runtime-section.js +256 -0
  330. package/dist/lib/runtime-section.js.map +1 -0
  331. package/dist/lib/telemetry.d.ts +1 -1
  332. package/dist/lib/telemetry.d.ts.map +1 -1
  333. package/dist/lib/telemetry.js +4 -1
  334. package/dist/lib/telemetry.js.map +1 -1
  335. package/dist/queue/dead-letter.d.ts +5 -1
  336. package/dist/queue/dead-letter.d.ts.map +1 -1
  337. package/dist/queue/dead-letter.js +5 -1
  338. package/dist/queue/dead-letter.js.map +1 -1
  339. package/dist/queue/drain.d.ts +3 -2
  340. package/dist/queue/drain.d.ts.map +1 -1
  341. package/dist/queue/drain.js +3 -2
  342. package/dist/queue/drain.js.map +1 -1
  343. package/dist/queue/flush.d.ts +28 -12
  344. package/dist/queue/flush.d.ts.map +1 -1
  345. package/dist/queue/flush.js +43 -18
  346. package/dist/queue/flush.js.map +1 -1
  347. package/dist/queue/handlers/send-event.d.ts.map +1 -1
  348. package/dist/queue/handlers/send-event.js.map +1 -1
  349. package/dist/queue/index.d.ts +1 -2
  350. package/dist/queue/index.d.ts.map +1 -1
  351. package/dist/queue/index.js +2 -2
  352. package/dist/queue/index.js.map +1 -1
  353. package/dist/queue/paths.d.ts +4 -2
  354. package/dist/queue/paths.d.ts.map +1 -1
  355. package/dist/queue/paths.js +4 -2
  356. package/dist/queue/paths.js.map +1 -1
  357. package/dist/queue/process-file.d.ts +5 -1
  358. package/dist/queue/process-file.d.ts.map +1 -1
  359. package/dist/queue/process-file.js +5 -1
  360. package/dist/queue/process-file.js.map +1 -1
  361. package/dist/queue/snapshot.d.ts +4 -1
  362. package/dist/queue/snapshot.d.ts.map +1 -1
  363. package/dist/queue/snapshot.js +4 -1
  364. package/dist/queue/snapshot.js.map +1 -1
  365. package/dist/queue/spawn.d.ts +1 -3
  366. package/dist/queue/spawn.d.ts.map +1 -1
  367. package/dist/queue/spawn.js +1 -3
  368. package/dist/queue/spawn.js.map +1 -1
  369. package/dist/queue/submit.d.ts +6 -1
  370. package/dist/queue/submit.d.ts.map +1 -1
  371. package/dist/queue/submit.js +6 -1
  372. package/dist/queue/submit.js.map +1 -1
  373. package/dist/queue/types.d.ts +5 -1
  374. package/dist/queue/types.d.ts.map +1 -1
  375. package/dist/queue/types.js +5 -1
  376. package/dist/queue/types.js.map +1 -1
  377. package/dist/queue/worker-log.d.ts +3 -1
  378. package/dist/queue/worker-log.d.ts.map +1 -1
  379. package/dist/queue/worker-log.js +3 -1
  380. package/dist/queue/worker-log.js.map +1 -1
  381. package/package.json +3 -1
@@ -0,0 +1,28 @@
1
+ /**
2
+ * IronBee CLI — Import file_change derivation.
3
+ *
4
+ * One `file_change` event per `Write`/`Edit` tool_use. Filters via the
5
+ * current project config's verifyPatterns / ignoredVerifyPatterns (since
6
+ * historical config values are unrecoverable, we use the current snapshot).
7
+ *
8
+ * Operation heuristic: live mode uses pre-tool-use `existsSync`, which we
9
+ * cannot replay. We inspect the matched `tool_result.content` for a
10
+ * "created"/"updated" marker and default to "update" on miss.
11
+ */
12
+ import { FileChangeAction } from "../../../hooks/core/actions";
13
+ import { IronBeeConfig } from "../../../lib/config";
14
+ import { RawToolUse, RawToolResult } from "./tool-call";
15
+ export interface BuildFileChangeOpts {
16
+ sessionId: string;
17
+ projectName: string;
18
+ /** Parent turn's activity_id. */
19
+ activityId: string;
20
+ /** ISO timestamp from the assistant line. */
21
+ timestamp: string;
22
+ toolUse: RawToolUse;
23
+ toolResult: RawToolResult | null;
24
+ config: IronBeeConfig;
25
+ }
26
+ /** Returns null when the tool_use is not a Write/Edit, or the file is filtered. */
27
+ export declare function buildFileChange(opts: BuildFileChangeOpts): FileChangeAction | null;
28
+ //# sourceMappingURL=file-change.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-change.d.ts","sourceRoot":"","sources":["../../../../src/import/claude/events/file-change.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gBAAgB,EAAuB,MAAM,6BAA6B,CAAC;AAEpF,OAAO,EAAE,aAAa,EAAwB,MAAM,qBAAqB,CAAC;AAE1E,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,UAAU,CAAC;IACpB,UAAU,EAAE,aAAa,GAAG,IAAI,CAAC;IACjC,MAAM,EAAE,aAAa,CAAC;CACzB;AAED,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,gBAAgB,GAAG,IAAI,CAuDlF"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee CLI — Import file_change derivation.
4
+ *
5
+ * One `file_change` event per `Write`/`Edit` tool_use. Filters via the
6
+ * current project config's verifyPatterns / ignoredVerifyPatterns (since
7
+ * historical config values are unrecoverable, we use the current snapshot).
8
+ *
9
+ * Operation heuristic: live mode uses pre-tool-use `existsSync`, which we
10
+ * cannot replay. We inspect the matched `tool_result.content` for a
11
+ * "created"/"updated" marker and default to "update" on miss.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.buildFileChange = buildFileChange;
15
+ const file_diff_1 = require("../../../hooks/core/file-diff");
16
+ const config_1 = require("../../../lib/config");
17
+ const ids_1 = require("../../ids");
18
+ /** Returns null when the tool_use is not a Write/Edit, or the file is filtered. */
19
+ function buildFileChange(opts) {
20
+ const { sessionId, projectName, activityId, timestamp, toolUse, toolResult, config } = opts;
21
+ const toolName = toolUse.name;
22
+ if (toolName !== "Write" && toolName !== "Edit") {
23
+ return null;
24
+ }
25
+ const filePath = readString(toolUse.input, "file_path");
26
+ if (filePath === undefined) {
27
+ return null;
28
+ }
29
+ if (!(0, config_1.requiresVerification)(filePath, config)) {
30
+ return null;
31
+ }
32
+ let operation;
33
+ let linesAdded;
34
+ let linesRemoved;
35
+ if (toolName === "Edit") {
36
+ const oldStr = readString(toolUse.input, "old_string") ?? "";
37
+ const newStr = readString(toolUse.input, "new_string") ?? "";
38
+ const counts = (0, file_diff_1.diffLineCounts)(oldStr, newStr);
39
+ operation = "update";
40
+ linesAdded = counts.added;
41
+ linesRemoved = counts.removed;
42
+ }
43
+ else {
44
+ // Write
45
+ const content = readString(toolUse.input, "content") ?? "";
46
+ operation = inferOperationFromResult(toolResult);
47
+ linesAdded = (0, file_diff_1.countLines)(content);
48
+ linesRemoved = null; // we don't pre-read prior content; matches live behavior
49
+ }
50
+ const tsMs = Date.parse(timestamp);
51
+ // Import has no fix cycles, so `fix_id` is OMITTED from the wire payload
52
+ // (matches live mode's behavior when no fix is active — `getActiveFixId`
53
+ // returns undefined and JSON.stringify drops the key). Earlier we set
54
+ // `fix_id: ""` literally, which made it past TS `FixAwareEvent.fix_id:
55
+ // string` typing but was rejected by the collector's schema validator
56
+ // (Java side likely has `@NotBlank` on the field). The cast lets us
57
+ // satisfy the TS type without emitting the empty value on the wire.
58
+ const event = {
59
+ id: (0, ids_1.deriveFileChangeEventId)(sessionId, toolUse.id),
60
+ type: "file_change",
61
+ timestamp: Number.isFinite(tsMs) ? tsMs : Date.now(),
62
+ session_id: sessionId,
63
+ project_name: projectName,
64
+ activity_id: activityId,
65
+ tool_name: toolName,
66
+ file_path: filePath,
67
+ operation,
68
+ lines_added: linesAdded,
69
+ lines_removed: linesRemoved,
70
+ };
71
+ return event;
72
+ }
73
+ /**
74
+ * Operation heuristic for `Write`. Inspects the matched
75
+ * `tool_result.content` text for "created"/"File created"/"updated" markers.
76
+ * Defaults to `"update"` on miss (the safer fallback — we'd rather mislabel
77
+ * a create as update than the reverse, since "update" is the dominant case
78
+ * in real sessions). Always returns a definite operation.
79
+ */
80
+ function inferOperationFromResult(result) {
81
+ if (result === null || result.is_error) {
82
+ return "update";
83
+ }
84
+ const text = stringifyContent(result.content).toLowerCase();
85
+ if (text.includes("file created") || text.includes("created successfully")) {
86
+ return "create";
87
+ }
88
+ return "update";
89
+ }
90
+ function stringifyContent(content) {
91
+ if (typeof content === "string") {
92
+ return content;
93
+ }
94
+ if (Array.isArray(content)) {
95
+ const parts = [];
96
+ for (const block of content) {
97
+ if (block !== null && typeof block === "object") {
98
+ const text = block.text;
99
+ if (typeof text === "string") {
100
+ parts.push(text);
101
+ }
102
+ }
103
+ }
104
+ return parts.join("\n");
105
+ }
106
+ return "";
107
+ }
108
+ function readString(input, key) {
109
+ const value = input[key];
110
+ return typeof value === "string" ? value : undefined;
111
+ }
112
+ //# sourceMappingURL=file-change.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-change.js","sourceRoot":"","sources":["../../../../src/import/claude/events/file-change.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * IronBee CLI — Import tool_call derivation.
3
+ *
4
+ * One `tool_call` event per `tool_use` block in any assistant message.
5
+ *
6
+ * For `bdt_` / `ndt_` (devtools-MCP) tools: when `_metadata.toolCallId` is
7
+ * present in the transcript, use it as the event `id`
8
+ * verbatim. Live MCP-shipped events use the same id, so collector dedup on
9
+ * `(session_id, id)` collapses live↔import duplicates. For older transcripts
10
+ * without `toolCallId` (or for any non-devtools tool), fall back to the
11
+ * deterministic formula from `tool_use.id`.
12
+ *
13
+ * `tool_input` is whitelisted via `extractClaudeToolInput` — same projection
14
+ * the live track-action hook applies. `tool_response` is not shipped on the
15
+ * wire, only its byte size.
16
+ *
17
+ *
18
+ */
19
+ import { ToolCallAction } from "../../../hooks/core/actions";
20
+ /** Lightly-typed tool_use shape we walk out of the transcript. */
21
+ export interface RawToolUse {
22
+ /** `tool_use.id` — host-supplied per-call identifier. */
23
+ id: string;
24
+ /** Raw tool name with prefix (e.g. `mcp__browser-devtools__bdt_navigation_go-to`). */
25
+ name: string;
26
+ /** Raw input — may contain `_metadata` for devtools (bdt_/ndt_) tools. */
27
+ input: Record<string, unknown>;
28
+ }
29
+ /** Lightly-typed tool_result shape. `null` means no matching result yet. */
30
+ export interface RawToolResult {
31
+ /** Joined to `tool_use.id`. */
32
+ tool_use_id: string;
33
+ /** `is_error: true` is propagated to event.error. */
34
+ is_error: boolean;
35
+ /** Content block — string or array. Used for size + error message extraction. */
36
+ content: unknown;
37
+ }
38
+ export interface BuildToolCallOpts {
39
+ sessionId: string;
40
+ projectName: string;
41
+ /** Parent turn's activity_id (from `deriveActivityId`). */
42
+ activityId: string;
43
+ /** ISO timestamp from the assistant line carrying the tool_use. */
44
+ timestamp: string;
45
+ toolUse: RawToolUse;
46
+ /** Matched tool_result for this tool_use, or null when unmatched. */
47
+ toolResult: RawToolResult | null;
48
+ /**
49
+ * Estimated duration in ms. Live mode reads `duration_ms` from the
50
+ * PostToolUse hook stdin (exact wall-clock per call). Transcripts don't
51
+ * carry per-tool latency, so the import runner approximates by computing
52
+ * the bracket between the assistant message timestamp and the next user
53
+ * message timestamp — accurate for messages with a single tool_use,
54
+ * approximate (an upper bound) for parallel multi-tool messages. The
55
+ * runner passes `null` in those ambiguous cases; we forward `null`
56
+ * verbatim and downstream treats it as "unknown" (NOT zero).
57
+ */
58
+ durationMs?: number | null;
59
+ }
60
+ export declare function buildToolCall(opts: BuildToolCallOpts): ToolCallAction;
61
+ //# sourceMappingURL=tool-call.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-call.d.ts","sourceRoot":"","sources":["../../../../src/import/claude/events/tool-call.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAM7D,kEAAkE;AAClE,MAAM,WAAW,UAAU;IACvB,yDAAyD;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,sFAAsF;IACtF,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC1B,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;IAClB,iFAAiF;IACjF,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,UAAU,CAAC;IACpB,qEAAqE;IACrE,UAAU,EAAE,aAAa,GAAG,IAAI,CAAC;IACjC;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,cAAc,CAgDrE"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee CLI — Import tool_call derivation.
4
+ *
5
+ * One `tool_call` event per `tool_use` block in any assistant message.
6
+ *
7
+ * For `bdt_` / `ndt_` (devtools-MCP) tools: when `_metadata.toolCallId` is
8
+ * present in the transcript, use it as the event `id`
9
+ * verbatim. Live MCP-shipped events use the same id, so collector dedup on
10
+ * `(session_id, id)` collapses live↔import duplicates. For older transcripts
11
+ * without `toolCallId` (or for any non-devtools tool), fall back to the
12
+ * deterministic formula from `tool_use.id`.
13
+ *
14
+ * `tool_input` is whitelisted via `extractClaudeToolInput` — same projection
15
+ * the live track-action hook applies. `tool_response` is not shipped on the
16
+ * wire, only its byte size.
17
+ *
18
+ *
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.buildToolCall = buildToolCall;
22
+ const util_1 = require("../../../clients/claude/util");
23
+ const ids_1 = require("../../ids");
24
+ const DEVTOOLS_MCP_SERVERS = new Set(["browser-devtools", "node-devtools"]);
25
+ function buildToolCall(opts) {
26
+ const { sessionId, projectName, activityId, timestamp, toolUse, toolResult } = opts;
27
+ const classified = (0, util_1.classifyTool)(toolUse.name, toolUse.input);
28
+ // Event id: prefer _metadata.toolCallId for devtools (bdt_/ndt_) tools
29
+ // when present in the transcript; otherwise fall back to
30
+ // deterministic-from-tool_use_id.
31
+ const eventId = resolveEventId(sessionId, classified, toolUse);
32
+ // tool_input projection: whitelist via extractClaudeToolInput. For
33
+ // browser-devtools/node-devtools tools, util.ts intentionally bypasses
34
+ // extraction and returns the raw input — that's fine for actions.jsonl
35
+ // but on the wire we still want it pruned. Since we are NOT going through
36
+ // the live track-action queue path, we just ship whatever extractClaudeToolInput
37
+ // returns (matches live wire shape for non-devtools; for devtools, includes
38
+ // _metadata which collector consumers already tolerate).
39
+ const projectedInput = (0, util_1.extractClaudeToolInput)(toolUse.name, toolUse.input);
40
+ const inputSize = byteLengthOf(toolUse.input);
41
+ const responseSize = toolResult !== null ? byteLengthOf(toolResult.content) : 0;
42
+ const errorMsg = toolResult !== null && toolResult.is_error
43
+ ? extractErrorMessage(toolResult.content)
44
+ : undefined;
45
+ const tsMs = Date.parse(timestamp);
46
+ const event = {
47
+ id: eventId,
48
+ type: "tool_call",
49
+ timestamp: Number.isFinite(tsMs) ? tsMs : Date.now(),
50
+ session_id: sessionId,
51
+ project_name: projectName,
52
+ activity_id: activityId,
53
+ tool_name: classified.tool_name,
54
+ tool_use_id: toolUse.id,
55
+ tool_input: projectedInput,
56
+ tool_input_size: inputSize,
57
+ tool_response_size: responseSize,
58
+ duration: opts.durationMs ?? null,
59
+ };
60
+ if (classified.tool_type !== null) {
61
+ event.tool_type = classified.tool_type;
62
+ }
63
+ if (classified.mcp_server !== null) {
64
+ event.mcp_server = classified.mcp_server;
65
+ }
66
+ if (errorMsg !== undefined) {
67
+ event.error = errorMsg;
68
+ }
69
+ return event;
70
+ }
71
+ function resolveEventId(sessionId, classified, toolUse) {
72
+ if (classified.tool_type === "mcp"
73
+ && classified.mcp_server !== null
74
+ && DEVTOOLS_MCP_SERVERS.has(classified.mcp_server)) {
75
+ const meta = toolUse.input._metadata;
76
+ if (meta !== null && typeof meta === "object") {
77
+ const toolCallId = meta.toolCallId;
78
+ if (typeof toolCallId === "string" && toolCallId.length > 0) {
79
+ return toolCallId;
80
+ }
81
+ }
82
+ }
83
+ return (0, ids_1.deriveToolCallEventIdFromToolUseId)(sessionId, toolUse.id);
84
+ }
85
+ function byteLengthOf(value) {
86
+ if (value === undefined || value === null) {
87
+ return 0;
88
+ }
89
+ try {
90
+ return Buffer.byteLength(JSON.stringify(value), "utf-8");
91
+ }
92
+ catch {
93
+ return 0;
94
+ }
95
+ }
96
+ function extractErrorMessage(content) {
97
+ if (typeof content === "string") {
98
+ return content;
99
+ }
100
+ if (Array.isArray(content)) {
101
+ const parts = [];
102
+ for (const block of content) {
103
+ if (block !== null && typeof block === "object") {
104
+ const text = block.text;
105
+ if (typeof text === "string") {
106
+ parts.push(text);
107
+ }
108
+ }
109
+ }
110
+ return parts.join("\n");
111
+ }
112
+ try {
113
+ return JSON.stringify(content);
114
+ }
115
+ catch {
116
+ return String(content);
117
+ }
118
+ }
119
+ //# sourceMappingURL=tool-call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-call.js","sourceRoot":"","sources":["../../../../src/import/claude/events/tool-call.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * IronBee CLI — Claude Per-Session Import Runner
3
+ *
4
+ * Orchestrates the full import of one Claude transcript:
5
+ * 1. Skip check (`<projectDir>/.ironbee/sessions/<id>/`).
6
+ * 2. Run analytics-runner — produces session_analytics + turn + step +
7
+ * api_request events.
8
+ * 3. Walk the Claude transcript separately for non-analytics events:
9
+ * session_start, session_end, activity_start/end (per turn,
10
+ * host_inject suppressed), tool_call (per tool_use), file_change
11
+ * (Write/Edit).
12
+ * 4. POST all events via the import emitter (transient retry).
13
+ * 5. Write the marker.
14
+ *
15
+ * Claude-specific because the transcript walk depends on Claude's JSONL
16
+ * shape. When Cursor support lands, a parallel `cursor/runner.ts` will
17
+ * implement the same `IClientRunner` contract — never mixed in this file.
18
+ *
19
+ * Per-session atomicity: on any unrecoverable failure mid-emit,
20
+ * the marker is NOT written and the session re-attempts on the next
21
+ * `ironbee import` run.
22
+ */
23
+ import { ImportResult, ImportTarget } from "../types";
24
+ export interface ClaudeRunnerOpts {
25
+ target: ImportTarget;
26
+ force: boolean;
27
+ /** Events per collector POST; null = use target/default. */
28
+ batchSize?: number | null;
29
+ }
30
+ export declare function importClaudeSession(opts: ClaudeRunnerOpts): Promise<ImportResult>;
31
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/import/claude/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAQH,OAAO,EAIH,YAAY,EACZ,YAAY,EACf,MAAM,UAAU,CAAC;AAqBlB,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAoNvF"}
@@ -0,0 +1,280 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee CLI — Claude Per-Session Import Runner
4
+ *
5
+ * Orchestrates the full import of one Claude transcript:
6
+ * 1. Skip check (`<projectDir>/.ironbee/sessions/<id>/`).
7
+ * 2. Run analytics-runner — produces session_analytics + turn + step +
8
+ * api_request events.
9
+ * 3. Walk the Claude transcript separately for non-analytics events:
10
+ * session_start, session_end, activity_start/end (per turn,
11
+ * host_inject suppressed), tool_call (per tool_use), file_change
12
+ * (Write/Edit).
13
+ * 4. POST all events via the import emitter (transient retry).
14
+ * 5. Write the marker.
15
+ *
16
+ * Claude-specific because the transcript walk depends on Claude's JSONL
17
+ * shape. When Cursor support lands, a parallel `cursor/runner.ts` will
18
+ * implement the same `IClientRunner` contract — never mixed in this file.
19
+ *
20
+ * Per-session atomicity: on any unrecoverable failure mid-emit,
21
+ * the marker is NOT written and the session re-attempts on the next
22
+ * `ironbee import` run.
23
+ */
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.importClaudeSession = importClaudeSession;
26
+ const fs_1 = require("fs");
27
+ const collector_1 = require("../../lib/collector");
28
+ const config_1 = require("../../lib/config");
29
+ const logger_1 = require("../../lib/logger");
30
+ const transcript_1 = require("../../analytics/transcript");
31
+ const types_1 = require("../types");
32
+ const skip_1 = require("../skip");
33
+ const marker_1 = require("../marker");
34
+ const analytics_runner_1 = require("./analytics-runner");
35
+ const session_1 = require("../events/session");
36
+ const activity_1 = require("../events/activity");
37
+ const tool_call_1 = require("./events/tool-call");
38
+ const file_change_1 = require("./events/file-change");
39
+ const ids_1 = require("../ids");
40
+ const emitter_1 = require("../emitter");
41
+ const transcript_walk_1 = require("./transcript-walk");
42
+ async function importClaudeSession(opts) {
43
+ const { target, force } = opts;
44
+ const batchSize = opts.batchSize ?? null;
45
+ // Analytics events (session_analytics + turn + step + api_request) ride
46
+ // the existing `analytics` master switch — opt-in by config presence,
47
+ // opt-out by `analytics.enable: false`. When disabled, import still
48
+ // emits structural events (session/activity/tool_call/file_change) but
49
+ // skips analytics-derived emission.
50
+ const analyticsEnabled = (0, config_1.isAnalyticsEnabled)(target.projectDir);
51
+ const { sessionId, transcriptPath, projectDir, projectName } = target;
52
+ if ((0, skip_1.shouldSkip)(projectDir, sessionId, force)) {
53
+ return {
54
+ sessionId,
55
+ status: "skipped",
56
+ eventsSent: (0, types_1.emptyEventCounts)(),
57
+ reason: "already tracked",
58
+ };
59
+ }
60
+ try {
61
+ const collectorTarget = (0, collector_1.getCollectorTarget)(projectDir);
62
+ const config = (0, config_1.loadConfig)(projectDir);
63
+ // Step 1 — analytics events.
64
+ const analytics = (0, analytics_runner_1.runImportAnalytics)({
65
+ sessionId,
66
+ projectName,
67
+ projectDir,
68
+ transcriptPath,
69
+ });
70
+ // Step 2 — non-analytics events. Re-read transcript, walk lines.
71
+ const fileBytes = (0, fs_1.readFileSync)(transcriptPath);
72
+ const parsed = (0, transcript_1.parseJsonl)(fileBytes, 0);
73
+ const transcriptLines = parsed.lines
74
+ .filter((ln) => ln.parsed !== null)
75
+ .map((ln) => ln.parsed);
76
+ const counts = (0, types_1.emptyEventCounts)();
77
+ const events = [];
78
+ events.push((0, session_1.buildSessionStart)(target, "claude"));
79
+ counts.session_start = 1;
80
+ // Walk BACKWARDS to find the last line carrying a top-level
81
+ // `timestamp`. Some Claude transcripts end with non-message rows
82
+ // (`summary`, host telemetry) that don't expose a timestamp; an
83
+ // earlier version peeked only at the very last line and fell back
84
+ // to `sessionStartMs`, which produced session_end == session_start
85
+ // and made session_end appear chronologically before its own
86
+ // activity_end on the wire.
87
+ const lastTimestampMs = findLastLineTimestamp(transcriptLines, target.sessionStartMs);
88
+ const endReason = (0, transcript_walk_1.readSummaryEndReason)(transcriptLines) ?? "unknown";
89
+ events.push((0, session_1.buildSessionEnd)(target, lastTimestampMs, endReason));
90
+ counts.session_end = 1;
91
+ // Use analytics-runner's turn events as authoritative when available.
92
+ // When `analytics.emitTurnEvents=false` (the default), fall back to
93
+ // a transcript-derived turn walker so activity_* still emits.
94
+ const turnBoundaries = analytics.turnEvents.length > 0
95
+ ? analytics.turnEvents.map((te) => ({
96
+ turnIndex: te.turn.turn_index,
97
+ startTime: te.turn.start_time,
98
+ endTime: te.turn.end_time,
99
+ triggeredBy: te.turn.triggered_by,
100
+ }))
101
+ : (0, transcript_walk_1.deriveTurnBoundariesFromTranscript)(transcriptLines);
102
+ for (const tb of turnBoundaries) {
103
+ if (tb.triggeredBy === "host_inject") {
104
+ continue;
105
+ }
106
+ const boundary = {
107
+ turnIndex: tb.turnIndex,
108
+ startTime: tb.startTime,
109
+ endTime: tb.endTime,
110
+ };
111
+ events.push((0, activity_1.buildActivityStart)(sessionId, projectName, boundary));
112
+ events.push((0, activity_1.buildActivityEnd)(sessionId, projectName, boundary));
113
+ counts.activity_start += 1;
114
+ counts.activity_end += 1;
115
+ }
116
+ const turnLookup = (0, transcript_walk_1.buildTurnLookup)(turnBoundaries);
117
+ for (let i = 0; i < transcriptLines.length; i++) {
118
+ const line = transcriptLines[i];
119
+ if (line.type !== "assistant") {
120
+ continue;
121
+ }
122
+ const lineTimestamp = line.timestamp ?? "";
123
+ const turnIdx = turnLookup.lookup(lineTimestamp);
124
+ if (turnIdx === null) {
125
+ continue;
126
+ }
127
+ const tb = turnBoundaries.find((b) => b.turnIndex === turnIdx);
128
+ if (tb === undefined) {
129
+ continue;
130
+ }
131
+ const activityId = (0, ids_1.deriveActivityId)(sessionId, tb.turnIndex, tb.startTime);
132
+ const toolUses = (0, transcript_walk_1.extractToolUsesFromLine)(line);
133
+ if (toolUses.length === 0) {
134
+ continue;
135
+ }
136
+ const nextUser = (0, transcript_walk_1.findNextUserLine)(transcriptLines, i);
137
+ const resultsByToolUseId = nextUser !== undefined
138
+ ? (0, transcript_walk_1.extractToolResultsByToolUseId)(nextUser)
139
+ : new Map();
140
+ // Bracket-time duration approximation: assistant emits the
141
+ // tool_use at `lineTimestamp`; the next user message carries
142
+ // the tool_result with its own timestamp. The delta is the
143
+ // round-trip from "agent dispatched the tool" to "result was
144
+ // delivered back". Live mode reads this from `duration_ms` on
145
+ // PostToolUse stdin — exact per-call. Transcripts don't carry
146
+ // that, so we use the bracket as a best-effort estimate. We
147
+ // ONLY apply it when the assistant message has a single
148
+ // tool_use; with multiple parallel tool_uses the bracket is
149
+ // an upper bound on the slowest tool (≠ each individual
150
+ // tool's duration), and overstating per-tool latency would
151
+ // distort downstream aggregates. In that case duration stays
152
+ // null (matches "unknown, not zero" semantics).
153
+ const bracketMs = toolUses.length === 1
154
+ ? computeBracketMs(lineTimestamp, nextUser)
155
+ : null;
156
+ for (const tu of toolUses) {
157
+ const result = resultsByToolUseId.get(tu.id) ?? null;
158
+ // Only assign a duration when the tool_result is actually
159
+ // present in the next user message — without that, the
160
+ // tool didn't complete (interrupted / session ended) and
161
+ // any timestamp delta would be a fiction.
162
+ const durationMs = (bracketMs !== null && result !== null) ? bracketMs : null;
163
+ events.push((0, tool_call_1.buildToolCall)({
164
+ sessionId,
165
+ projectName,
166
+ activityId,
167
+ timestamp: lineTimestamp,
168
+ toolUse: tu,
169
+ toolResult: result,
170
+ durationMs,
171
+ }));
172
+ counts.tool_call += 1;
173
+ const fcEvent = (0, file_change_1.buildFileChange)({
174
+ sessionId,
175
+ projectName,
176
+ activityId,
177
+ timestamp: lineTimestamp,
178
+ toolUse: tu,
179
+ toolResult: result,
180
+ config,
181
+ });
182
+ if (fcEvent !== null) {
183
+ events.push(fcEvent);
184
+ counts.file_change += 1;
185
+ }
186
+ }
187
+ }
188
+ // Add analytics events — gated by `analytics` config master switch.
189
+ // Even when gated off, we keep the analytics-runner output: (1)
190
+ // `transcriptOffset` is the marker's source-of-truth, (2) the turn-
191
+ // boundary lookup we just used for activity_id derivation is more
192
+ // accurate than the fallback walker. Cost is just ~2× transcript
193
+ // read; events are dropped before POST.
194
+ if (analyticsEnabled) {
195
+ events.push(analytics.sessionAnalytics);
196
+ counts.session_analytics = 1;
197
+ for (const te of analytics.turnEvents) {
198
+ events.push(te);
199
+ }
200
+ counts.session_turn_analytics = analytics.turnEvents.length;
201
+ for (const se of analytics.stepEvents) {
202
+ events.push(se);
203
+ }
204
+ counts.session_turn_step_analytics = analytics.stepEvents.length;
205
+ for (const are of analytics.apiRequestEvents) {
206
+ events.push(are);
207
+ }
208
+ counts.api_request = analytics.apiRequestEvents.length;
209
+ }
210
+ else {
211
+ logger_1.logger.debug(`import claude-runner: session ${sessionId} — analytics disabled, suppressing ${analytics.turnEvents.length} turn / ${analytics.stepEvents.length} step / ${analytics.apiRequestEvents.length} api_request / 1 session_analytics events`);
212
+ }
213
+ // POST.
214
+ await (0, emitter_1.postEvents)(events, {
215
+ sessionId,
216
+ projectDir,
217
+ target: collectorTarget,
218
+ ...(batchSize !== null ? { batchSize } : {}),
219
+ });
220
+ // Marker.
221
+ (0, marker_1.writeImportMarker)(projectDir, sessionId, transcriptPath, analytics.transcriptOffset, counts);
222
+ return {
223
+ sessionId,
224
+ status: "imported",
225
+ eventsSent: counts,
226
+ };
227
+ }
228
+ catch (e) {
229
+ const reason = e instanceof Error ? e.message : String(e);
230
+ logger_1.logger.debug(`import claude-runner: session ${sessionId} failed: ${reason}`);
231
+ return {
232
+ sessionId,
233
+ status: "failed",
234
+ eventsSent: (0, types_1.emptyEventCounts)(),
235
+ reason,
236
+ };
237
+ }
238
+ }
239
+ /**
240
+ * Bracket time between an assistant tool_use and the matching tool_result
241
+ * in the next user message. Returns null when either timestamp is missing
242
+ * or unparseable, or when the next user line is absent. See `runner.ts`
243
+ * for the full rationale and the single-vs-multi-tool gating decision.
244
+ */
245
+ function computeBracketMs(assistantTs, nextUser) {
246
+ if (nextUser === undefined) {
247
+ return null;
248
+ }
249
+ const nextTs = nextUser.timestamp;
250
+ if (typeof nextTs !== "string") {
251
+ return null;
252
+ }
253
+ const startMs = Date.parse(assistantTs);
254
+ const endMs = Date.parse(nextTs);
255
+ if (!Number.isFinite(startMs) || !Number.isFinite(endMs)) {
256
+ return null;
257
+ }
258
+ const delta = endMs - startMs;
259
+ return delta >= 0 ? delta : null;
260
+ }
261
+ /**
262
+ * Walk transcript lines from the tail forward and return the first
263
+ * top-level `timestamp` we find (parsed to epoch ms). Falls back to
264
+ * `fallbackMs` when no row in the transcript exposes a top-level
265
+ * timestamp — should never happen with real Claude transcripts but
266
+ * keeps the contract safe.
267
+ */
268
+ function findLastLineTimestamp(lines, fallbackMs) {
269
+ for (let i = lines.length - 1; i >= 0; i--) {
270
+ const ts = lines[i].timestamp;
271
+ if (typeof ts === "string") {
272
+ const ms = Date.parse(ts);
273
+ if (Number.isFinite(ms)) {
274
+ return ms;
275
+ }
276
+ }
277
+ }
278
+ return fallbackMs;
279
+ }
280
+ //# sourceMappingURL=runner.js.map