@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,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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/import/claude/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * IronBee CLI — Claude Import Dry-Run Summary Estimator
3
+ *
4
+ * Pre-pass over each candidate Claude transcript to estimate event counts
5
+ * + cost + wire bytes. Same projection primitives as the live pipeline
6
+ * (`runImportAnalytics`) but discarding events instead of POSTing.
7
+ *
8
+ * Produces the `ImportSummary` rendered by `commands/import.ts` before
9
+ * the confirm prompt. The estimate is a real walk over file bytes —
10
+ * not a heuristic — so the displayed cost is the exact `cost_usd` users
11
+ * will see in the dashboard after import completes.
12
+ *
13
+ *
14
+ */
15
+ import { ImportSummary, ImportTarget, ImportTimeRange } from "../types";
16
+ export interface SummaryOpts {
17
+ targets: ImportTarget[];
18
+ timeRange: ImportTimeRange | null;
19
+ concurrency: number;
20
+ force: boolean;
21
+ }
22
+ export declare function estimateClaudeImport(opts: SummaryOpts): ImportSummary;
23
+ //# sourceMappingURL=summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../../src/import/claude/summary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAUH,OAAO,EAIH,aAAa,EACb,YAAY,EACZ,eAAe,EAClB,MAAM,UAAU,CAAC;AAOlB,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,eAAe,GAAG,IAAI,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,aAAa,CAgErE"}
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee CLI — Claude Import Dry-Run Summary Estimator
4
+ *
5
+ * Pre-pass over each candidate Claude transcript to estimate event counts
6
+ * + cost + wire bytes. Same projection primitives as the live pipeline
7
+ * (`runImportAnalytics`) but discarding events instead of POSTing.
8
+ *
9
+ * Produces the `ImportSummary` rendered by `commands/import.ts` before
10
+ * the confirm prompt. The estimate is a real walk over file bytes —
11
+ * not a heuristic — so the displayed cost is the exact `cost_usd` users
12
+ * will see in the dashboard after import completes.
13
+ *
14
+ *
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.estimateClaudeImport = estimateClaudeImport;
18
+ const fs_1 = require("fs");
19
+ const buffer_1 = require("buffer");
20
+ const logger_1 = require("../../lib/logger");
21
+ const collector_1 = require("../../lib/collector");
22
+ const config_1 = require("../../lib/config");
23
+ const transcript_1 = require("../../analytics/transcript");
24
+ const analytics_runner_1 = require("./analytics-runner");
25
+ const skip_1 = require("../skip");
26
+ const types_1 = require("../types");
27
+ const transcript_walk_1 = require("./transcript-walk");
28
+ function estimateClaudeImport(opts) {
29
+ const counts = (0, types_1.emptyEventCounts)();
30
+ let costUsdSum = 0;
31
+ let wireBytesSum = 0;
32
+ let toImport = 0;
33
+ let skipped = 0;
34
+ const perProject = new Map();
35
+ for (const target of opts.targets) {
36
+ const key = target.projectDir;
37
+ let row = perProject.get(key);
38
+ if (row === undefined) {
39
+ row = { projectDir: key, found: 0, skipped: 0, toImport: 0 };
40
+ perProject.set(key, row);
41
+ }
42
+ row.found += 1;
43
+ if ((0, skip_1.shouldSkip)(target.projectDir, target.sessionId, opts.force)) {
44
+ row.skipped += 1;
45
+ skipped += 1;
46
+ continue;
47
+ }
48
+ row.toImport += 1;
49
+ toImport += 1;
50
+ try {
51
+ // Per-target gate: import emits analytics events only when the
52
+ // target project's `analytics` config is enabled (presence + not
53
+ // explicitly disabled). Mirrors live mode's master-switch
54
+ // semantic; --skip-analytics CLI flag is intentionally NOT a thing.
55
+ const analyticsEnabled = (0, config_1.isAnalyticsEnabled)(target.projectDir);
56
+ const perSession = estimateOne(target, !analyticsEnabled);
57
+ counts.session_start += perSession.counts.session_start;
58
+ counts.session_end += perSession.counts.session_end;
59
+ counts.activity_start += perSession.counts.activity_start;
60
+ counts.activity_end += perSession.counts.activity_end;
61
+ counts.tool_call += perSession.counts.tool_call;
62
+ counts.file_change += perSession.counts.file_change;
63
+ counts.session_analytics += perSession.counts.session_analytics;
64
+ counts.session_turn_analytics += perSession.counts.session_turn_analytics;
65
+ counts.session_turn_step_analytics += perSession.counts.session_turn_step_analytics;
66
+ counts.api_request += perSession.counts.api_request;
67
+ costUsdSum += perSession.costUsd;
68
+ wireBytesSum += perSession.wireBytes;
69
+ }
70
+ catch (e) {
71
+ logger_1.logger.debug(`import summary: estimate failed for session ${target.sessionId}: ${e instanceof Error ? e.message : e}`);
72
+ }
73
+ }
74
+ const collectorTarget = opts.targets.length > 0
75
+ ? (0, collector_1.getCollectorTarget)(opts.targets[0].projectDir)
76
+ : null;
77
+ return {
78
+ projects: Array.from(perProject.values()),
79
+ timeRange: opts.timeRange,
80
+ toImportCount: toImport,
81
+ skippedCount: skipped,
82
+ estimatedEvents: counts,
83
+ estimatedCostUsd: costUsdSum,
84
+ estimatedWireBytes: wireBytesSum,
85
+ concurrency: opts.concurrency,
86
+ collectorUrl: collectorTarget !== null ? collectorTarget.url : null,
87
+ };
88
+ }
89
+ function estimateOne(target, skipAnalytics) {
90
+ const counts = (0, types_1.emptyEventCounts)();
91
+ counts.session_start = 1;
92
+ counts.session_end = 1;
93
+ const analytics = (0, analytics_runner_1.runImportAnalytics)({
94
+ sessionId: target.sessionId,
95
+ projectName: target.projectName,
96
+ projectDir: target.projectDir,
97
+ transcriptPath: target.transcriptPath,
98
+ });
99
+ if (!skipAnalytics) {
100
+ counts.session_analytics = 1;
101
+ counts.session_turn_analytics = analytics.turnEvents.length;
102
+ counts.session_turn_step_analytics = analytics.stepEvents.length;
103
+ counts.api_request = analytics.apiRequestEvents.length;
104
+ }
105
+ const fileBytes = (0, fs_1.readFileSync)(target.transcriptPath);
106
+ const parsed = (0, transcript_1.parseJsonl)(fileBytes, 0);
107
+ const lines = parsed.lines
108
+ .filter((ln) => ln.parsed !== null)
109
+ .map((ln) => ln.parsed);
110
+ const activityCount = analytics.turnEvents.length > 0
111
+ ? analytics.turnEvents.filter((te) => te.turn.triggered_by === "user_msg").length
112
+ : countNonHostInjectTurnsFromTranscript(lines);
113
+ counts.activity_start = activityCount;
114
+ counts.activity_end = activityCount;
115
+ const config = (0, config_1.loadConfig)(target.projectDir);
116
+ let toolCalls = 0;
117
+ let fileChanges = 0;
118
+ for (const line of lines) {
119
+ if (line.type !== "assistant") {
120
+ continue;
121
+ }
122
+ const toolUses = (0, transcript_walk_1.extractToolUsesFromLine)(line);
123
+ toolCalls += toolUses.length;
124
+ for (const tu of toolUses) {
125
+ if (tu.name === "Write" || tu.name === "Edit") {
126
+ const filePath = tu.input.file_path;
127
+ if (typeof filePath === "string" && (0, config_1.requiresVerification)(filePath, config)) {
128
+ fileChanges += 1;
129
+ }
130
+ }
131
+ }
132
+ }
133
+ counts.tool_call = toolCalls;
134
+ counts.file_change = fileChanges;
135
+ // cost_usd is shown to the operator regardless of skipAnalytics — it's
136
+ // useful "what the agent actually cost" info even when the session_analytics
137
+ // event itself isn't shipping. Set to 0 when skipped to avoid implying
138
+ // we'll surface it in the dashboard.
139
+ const costUsd = skipAnalytics ? 0 : analytics.sessionAnalytics.analytics.usage.cost_usd;
140
+ const analyticsWireBytes = skipAnalytics
141
+ ? 0
142
+ : buffer_1.Buffer.byteLength(JSON.stringify(analytics.sessionAnalytics), "utf-8")
143
+ + analytics.turnEvents.reduce((acc, te) => acc + buffer_1.Buffer.byteLength(JSON.stringify(te), "utf-8"), 0)
144
+ + analytics.stepEvents.reduce((acc, se) => acc + buffer_1.Buffer.byteLength(JSON.stringify(se), "utf-8"), 0)
145
+ + analytics.apiRequestEvents.reduce((acc, are) => acc + buffer_1.Buffer.byteLength(JSON.stringify(are), "utf-8"), 0);
146
+ const ESTIMATED_NON_ANALYTICS_EVENT_BYTES = 256;
147
+ const nonAnalyticsCount = counts.session_start + counts.session_end
148
+ + counts.activity_start + counts.activity_end
149
+ + counts.tool_call + counts.file_change;
150
+ const wireBytes = analyticsWireBytes + nonAnalyticsCount * ESTIMATED_NON_ANALYTICS_EVENT_BYTES;
151
+ return { counts, costUsd, wireBytes };
152
+ }
153
+ function countNonHostInjectTurnsFromTranscript(lines) {
154
+ let count = 0;
155
+ let opened = false;
156
+ let openHasAssistant = false;
157
+ let openIsHostInject = false;
158
+ const close = () => {
159
+ if (opened && !openIsHostInject) {
160
+ count += 1;
161
+ }
162
+ };
163
+ for (const line of lines) {
164
+ if (line.type === "user") {
165
+ const isMeta = line.isMeta === true;
166
+ if (!(0, transcript_walk_1.isHumanTextUserLine)(line)) {
167
+ continue;
168
+ }
169
+ if (isMeta && opened && openHasAssistant) {
170
+ continue;
171
+ }
172
+ close();
173
+ opened = true;
174
+ openHasAssistant = false;
175
+ openIsHostInject = isMeta;
176
+ }
177
+ else if (line.type === "assistant") {
178
+ if (opened) {
179
+ openHasAssistant = true;
180
+ }
181
+ }
182
+ }
183
+ close();
184
+ return count;
185
+ }
186
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../../src/import/claude/summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * IronBee CLI — Claude Transcript Walker Helpers
3
+ *
4
+ * Shared between `claude/runner.ts` (pipeline) and `claude/summary.ts`
5
+ * (dry-run estimator). Pure helpers — no I/O, no config — that operate
6
+ * on parsed Claude transcript lines.
7
+ *
8
+ * Claude transcript shape: each `.jsonl` line is a `TranscriptLine` with
9
+ * `type` ∈ {`user`, `assistant`, `system`, `summary`}. Tool calls live in
10
+ * assistant `message.content[]` as `tool_use` blocks; tool_results live
11
+ * in the next user `message.content[]` as `tool_result` blocks (joined by
12
+ * `tool_use_id`).
13
+ */
14
+ import { TranscriptLine } from "../../analytics/transcript";
15
+ import { RawToolUse, RawToolResult } from "./events/tool-call";
16
+ /**
17
+ * `true` iff the user line carries human-typed text (not a tool_result-only
18
+ * synthesized user line). Mirrors `src/analytics/projection.ts:isHumanTextUser`
19
+ * but typed against `TranscriptLine` — equivalent semantics.
20
+ */
21
+ export declare function isHumanTextUserLine(line: TranscriptLine): boolean;
22
+ /** Extract every `tool_use` block from an assistant line's `message.content[]`. */
23
+ export declare function extractToolUsesFromLine(assistantLine: TranscriptLine): RawToolUse[];
24
+ /** Map `tool_use_id` → `tool_result` from a user line's `message.content[]`. */
25
+ export declare function extractToolResultsByToolUseId(userLine: TranscriptLine): Map<string, RawToolResult>;
26
+ /** Find the next user line after `afterIdx`, or undefined. */
27
+ export declare function findNextUserLine(lines: TranscriptLine[], afterIdx: number): TranscriptLine | undefined;
28
+ /** Read the optional `summary` line at the tail; returns its `endReason` field. */
29
+ export declare function readSummaryEndReason(lines: TranscriptLine[]): string | null;
30
+ export interface TurnDescriptor {
31
+ turnIndex: number;
32
+ startTime: string;
33
+ endTime: string;
34
+ triggeredBy: "user_msg" | "host_inject";
35
+ }
36
+ /**
37
+ * Walk transcript lines and produce per-turn descriptors. Used as a
38
+ * fallback when `analytics.emitTurnEvents=false` suppresses analytics-runner's
39
+ * `turnEvents` array (we still need turn metadata for activity_*).
40
+ *
41
+ * Mirrors analytics' projection-side turn-open logic:
42
+ * - `isMeta=true` user msg with no open turn → host_inject opener
43
+ * - `isMeta=true` user msg with an open turn that has assistants → continuation
44
+ * - human-text user msg without isMeta → new user_msg turn
45
+ */
46
+ export declare function deriveTurnBoundariesFromTranscript(lines: TranscriptLine[]): TurnDescriptor[];
47
+ /** Build a fast turn lookup: assistant line timestamp → owning turn_index. */
48
+ export interface TurnLookup {
49
+ lookup: (timestamp: string) => number | null;
50
+ }
51
+ export declare function buildTurnLookup(boundaries: TurnDescriptor[]): TurnLookup;
52
+ //# sourceMappingURL=transcript-walk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-walk.d.ts","sourceRoot":"","sources":["../../../src/import/claude/transcript-walk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE/D;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAsBjE;AAED,mFAAmF;AACnF,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,cAAc,GAAG,UAAU,EAAE,CAmBnF;AAED,gFAAgF;AAChF,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAmBlG;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAOtG;AAED,mFAAmF;AACnF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,GAAG,IAAI,CAY3E;AAED,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,UAAU,GAAG,aAAa,CAAC;CAC3C;AAED;;;;;;;;;GASG;AACH,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAqC5F;AAED,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACvB,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAChD;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,UAAU,CAsBxE"}