@ironbee-ai/cli 0.6.2 → 0.7.1

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 +12 -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 +122 -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 +72 -70
  188. package/dist/hooks/core/actions.d.ts.map +1 -1
  189. package/dist/hooks/core/actions.js +191 -28
  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,356 @@
1
+ /**
2
+ * IronBee CLI — Analytics Projection
3
+ *
4
+ * Projects a slice of host transcript JSONL lines into a delta
5
+ * `SessionAnalytics`. Operates on a slice (not the full file) so
6
+ * incremental projection is cheap; emits no content (privacy fence).
7
+ *
8
+ * Inputs:
9
+ * - parsed transcript lines (already JSON-parsed by transcript.ts)
10
+ * - `startingTurnIndex`: 1-based assistant message index for the FIRST
11
+ * assistant message in this slice. Used by the turn-bucket logic to
12
+ * assign global turn buckets across multiple incremental projections.
13
+ *
14
+ * Output: `DeltaAnalytics` — same shape as `AccumulatedAnalytics` plus
15
+ * delta-local signals merge needs (`has_assistant_with_usage`,
16
+ * `closing_pending_tool_uses`, `closing_current_turn`).
17
+ *
18
+ * Privacy: the function reads everything (Bash command body, Edit
19
+ * old_string/new_string, Write content, tool_result.content, user msg
20
+ * text for classifier keyword matching) but emits ONLY counts, categories,
21
+ * paths, timestamps, byte sizes, and boolean flags. No raw text leaves
22
+ * this function. Per-tool / per-category attribution operate on the
23
+ * read-once-locally pattern.
24
+ */
25
+ import { CategoryStats, CurrentTurnState, DeltaAnalytics, PendingToolUse, SessionTurnAnalytics, SessionTurnStepAnalytics, TranscriptSource, TurnCategory, TurnEndReason } from "./types";
26
+ interface MessageUsage {
27
+ input_tokens?: number;
28
+ output_tokens?: number;
29
+ cache_creation_input_tokens?: number;
30
+ cache_read_input_tokens?: number;
31
+ /**
32
+ * Anthropic's split of cache_creation tokens by ephemeral tier.
33
+ * `cache_creation_input_tokens` is the SUM of these. We track them
34
+ * separately so 1h cache writes (more expensive) get billed at the
35
+ * correct rate. Many real agent loop sessions are dominated by 1h.
36
+ */
37
+ cache_creation?: {
38
+ ephemeral_5m_input_tokens?: number;
39
+ ephemeral_1h_input_tokens?: number;
40
+ };
41
+ /**
42
+ * Server-side tool use counts. `web_search_requests` is the only
43
+ * billable one currently — Anthropic charges $0.01 per request.
44
+ */
45
+ server_tool_use?: {
46
+ web_search_requests?: number;
47
+ };
48
+ /**
49
+ * Speed tier for fast-mode pricing. `"fast"` triggers the Opus 4.6
50
+ * fast tier (6× regular Opus 4.5+ rate). Any other value or undefined
51
+ * falls back to the model's regular pricing.
52
+ */
53
+ speed?: string;
54
+ /**
55
+ * Sub-iteration usages for compound calls (e.g. `advisor` server tool).
56
+ * Each entry typed `"advisor_message"` represents an advisor sub-call
57
+ * whose tokens are NOT in the parent `usage` totals — they're billed
58
+ * separately at their own model's rate. We loop these and add per-iter
59
+ * cost to the unattributed bucket. Other iteration types (`"message"`)
60
+ * mirror the parent usage and are ignored to avoid double counting.
61
+ */
62
+ iterations?: Array<{
63
+ type?: string;
64
+ model?: string;
65
+ input_tokens?: number;
66
+ output_tokens?: number;
67
+ cache_creation_input_tokens?: number;
68
+ cache_read_input_tokens?: number;
69
+ cache_creation?: {
70
+ ephemeral_5m_input_tokens?: number;
71
+ ephemeral_1h_input_tokens?: number;
72
+ };
73
+ }>;
74
+ }
75
+ interface MessageBody {
76
+ content?: unknown;
77
+ usage?: MessageUsage;
78
+ /**
79
+ * Model identifier on assistant messages (e.g. `"claude-opus-4-7"`).
80
+ * Sub-agent / skill turns may run on a different model than the host
81
+ * conversation, so we count per-message rather than picking one label.
82
+ */
83
+ model?: string;
84
+ /**
85
+ * Anthropic API message id (e.g. `"msg_01ABCdef..."`). Set on assistant
86
+ * messages by the API. Claude Code's transcript writer occasionally
87
+ * persists the same API response on multiple JSONL lines (different
88
+ * top-level `uuid`s but identical `message.id` + `requestId` + `usage`
89
+ * — likely stream finalization re-emit / per-tool_use re-serialization).
90
+ * Projection deduplicates by this field so a single API call counts
91
+ * once toward tokens / cost / per-tool attribution / step+turn opens.
92
+ * Without this, totals can be ~2x inflated on real sessions.
93
+ */
94
+ id?: string;
95
+ }
96
+ export interface RawTranscriptLine {
97
+ type?: string;
98
+ message?: MessageBody;
99
+ timestamp?: string;
100
+ /** Some Claude transcript versions include `cwd` on lines — currently unused. */
101
+ cwd?: string;
102
+ /**
103
+ * Claude Code marks host-injected user messages (slash command bodies,
104
+ * Stop-hook feedback strings, etc.) with this top-level boolean. Real
105
+ * user prompts do not carry it. This is the structurally robust signal
106
+ * we use to skip these lines from `isHumanTextUser` so they don't open
107
+ * synthetic user_turns. Content-based detection (keyword sniffing) was
108
+ * the prior approach — it was fragile across Claude Code wrapper format
109
+ * changes; `isMeta` is part of the documented JSONL schema.
110
+ */
111
+ isMeta?: boolean;
112
+ /**
113
+ * Top-level Anthropic API request id (e.g. `"req_011CaYGn..."`). Set on
114
+ * SUCCESSFUL assistant lines by Claude Code. Verified absent on every
115
+ * `isApiErrorMessage:true` line (transcript-side: failure lines carry no
116
+ * join key back to the original API request).
117
+ */
118
+ requestId?: string;
119
+ /**
120
+ * Top-level discriminator set on assistant lines representing a final
121
+ * API failure (after retry exhaustion). When `true`, `message.model` is
122
+ * `"<synthetic>"`, all `usage.*` token counts are zero, and the line
123
+ * carries `error` (and sometimes `apiErrorStatus`) at top level.
124
+ */
125
+ isApiErrorMessage?: boolean;
126
+ /**
127
+ * Top-level error category on `isApiErrorMessage:true` lines. Observed
128
+ * values: `"rate_limit"` / `"authentication_failed"` / `"server_error"`
129
+ * / `"unknown"`. Absent on success lines.
130
+ */
131
+ error?: string;
132
+ /**
133
+ * HTTP status code on `isApiErrorMessage:true` lines. Verified ~5%
134
+ * presence even on failure lines (only seen on explicit HTTP status
135
+ * errors like 429 rate-limit). Absent on success and most failures.
136
+ */
137
+ apiErrorStatus?: number;
138
+ /**
139
+ * Per-line UUID generated by Claude Code at line-write time. Verified
140
+ * 100% presence across all assistant lines (success + failure). Used
141
+ * as the deterministic `Event.id` for the api_request wire event so
142
+ * re-projections of the same transcript bytes produce identical event
143
+ * ids → backend can dedupe on `(session_id, id)` for both success
144
+ * (where `request_id` is also available) and failure (where it isn't).
145
+ */
146
+ uuid?: string;
147
+ }
148
+ export interface ProjectionInput {
149
+ /** The transcript lines we just parsed (only those with `parsed !== null` and matching shape are walked). */
150
+ lines: RawTranscriptLine[];
151
+ /** 1-based global turn index for the first assistant message in this slice. */
152
+ startingTurnIndex: number;
153
+ /** Used to set identity fields on the delta. */
154
+ sessionId: string;
155
+ /** Project name (basename of git root or project dir) — see `resolveProjectName` in `actions.ts`. */
156
+ projectName: string;
157
+ transcriptSource: TranscriptSource;
158
+ /**
159
+ * ms-since-epoch of the LAST assistant message seen in prior slices.
160
+ * Used to compute the user_response_times_ms gap to the first human-text
161
+ * user message of THIS slice. Pass `undefined` for the first ever slice.
162
+ */
163
+ priorLastAssistantTsMs?: number;
164
+ /**
165
+ * Pending tool_uses carried over from prior slices (a tool_use emitted
166
+ * in slice K may have its tool_result / consumer in slice K+1 or K+2).
167
+ * Keyed by `tool_use.id`. Pass `undefined` / `{}` for the first slice
168
+ * or when no in-flight tools.
169
+ */
170
+ priorPendingToolUses?: Record<string, PendingToolUse>;
171
+ /**
172
+ * ms-since-epoch of the most recent message timestamp seen across all
173
+ * prior slices (used to attribute the cross-slice gap to active vs
174
+ * idle: if THIS slice opens with a human-user message, the
175
+ * `firstMsg.ts - priorLastActivityTsMs` gap counts as user-idle).
176
+ *
177
+ * `undefined` for the first slice. Derived from
178
+ * `Date.parse(state.accumulated.last_activity_time)`.
179
+ */
180
+ priorLastActivityTsMs?: number;
181
+ /**
182
+ * In-flight per-turn classifier state from the prior slice. The turn
183
+ * may have been opened by a human-user msg in a prior slice and is
184
+ * still accumulating signals. The new slice OR's in its own signals;
185
+ * the turn closes when the next human-user msg arrives.
186
+ */
187
+ priorCurrentTurn?: CurrentTurnState;
188
+ /**
189
+ * Next turn_index to assign when a fresh turn opens. Carries the
190
+ * monotonic counter across slice boundaries. Defaults to 1 on the
191
+ * first slice. The projection consumes this seed and reports the
192
+ * post-walk value via `DeltaInternal.next_turn_index`.
193
+ */
194
+ priorNextTurnIndex?: number;
195
+ /**
196
+ * Anthropic API message ids already counted in prior slices. The projection
197
+ * skips any assistant line whose `message.id` is in this set (or appears
198
+ * twice in the current slice) so a single API response counted once
199
+ * regardless of how many times the transcript writer persisted it.
200
+ * Reported back via `DeltaInternal.seen_assistant_message_ids` and merged
201
+ * into `state.internal.seen_assistant_message_ids` for cross-slice continuity.
202
+ */
203
+ priorSeenAssistantMessageIds?: string[];
204
+ }
205
+ /**
206
+ * Deterministic turn id — `sha256(session_id|turn_index|start_time)`
207
+ * sliced to 16 hex chars. Re-emits of the same turn produce the same
208
+ * id, so backend LWW per `(session_id, turn_id)` is well-defined.
209
+ */
210
+ /**
211
+ * Deterministic per-step identifier — `sha256(turn_id|step_index|start_time)`
212
+ * sliced to 16 hex chars. Same property as {@link deriveTurnId}: same
213
+ * inputs always map to the same id, so backend LWW per `(session_id,
214
+ * step_id)` is well-defined and re-emits are idempotent.
215
+ */
216
+ export declare function deriveStepId(turnId: string, stepIndex: number, startTime: string): string;
217
+ export declare function deriveTurnId(sessionId: string, turnIndex: number, startTime: string): string;
218
+ /**
219
+ * Format a 32-char hex string into UUID-shaped layout (8-4-4-4-12). NOT
220
+ * RFC 4122-compliant (no version/variant bits) but matches the regex
221
+ * shape collectors expect for `Event.id`. Pure presentation — collisions
222
+ * impossible because the source hash space is the same 32 hex chars.
223
+ */
224
+ export declare function formatHexAsUuid(hex32: string): string;
225
+ /**
226
+ * Deterministic Event.id for `session_analytics` wire records.
227
+ * `sha256("session_analytics:" + session_id + ":" + offset)`, formatted as
228
+ * UUID. Re-emits of the same `(session_id, offset)` produce the same id —
229
+ * backend treats them as updates to the same logical checkpoint:
230
+ * - First Stop @ offset=100 (`is_final=false`) → row inserted
231
+ * - SessionEnd @ offset=100 (carve-out, `is_final=true`) → ON CONFLICT update
232
+ * - Worker re-projects same slice after crash → ON CONFLICT update
233
+ * `snapshot_at` is intentionally NOT in the id — it's metadata for
234
+ * tiebreaking on collision (`UPDATE ... WHERE EXCLUDED.snapshot_at >=
235
+ * stored.snapshot_at`). This keeps `(session_id, id)` as a uniform dedup
236
+ * key across all analytics event types.
237
+ */
238
+ export declare function deriveSessionAnalyticsEventId(sessionId: string, offset: number): string;
239
+ /**
240
+ * Deterministic Event.id for `session_turn_analytics` wire records.
241
+ * Derives from the turn's deterministic `turn_id` namespaced under the
242
+ * session — re-emits of the same turn produce the same Event.id.
243
+ */
244
+ export declare function deriveTurnEventId(sessionId: string, turnId: string): string;
245
+ /**
246
+ * Deterministic Event.id for `session_turn_step_analytics` wire records.
247
+ * Same pattern as {@link deriveTurnEventId} — derives from the step's
248
+ * deterministic `step_id` namespaced under the session. Re-emits idempotent.
249
+ */
250
+ export declare function deriveStepEventId(sessionId: string, stepId: string): string;
251
+ /**
252
+ * Options for {@link closeTurn} — bundles the projection-time identity
253
+ * fields + boundary metadata. Bundled into an object to keep the call
254
+ * sites readable (the alternative is a 7-positional-arg call).
255
+ */
256
+ export interface CloseTurnOpts {
257
+ endTime: string;
258
+ endReason: TurnEndReason;
259
+ sessionId: string;
260
+ projectName: string;
261
+ transcriptSource: TranscriptSource;
262
+ }
263
+ /**
264
+ * Per-category-breakdown delta produced by closing one turn. Cleanly
265
+ * separable from the caller's accumulator state — caller applies via
266
+ * {@link applyBreakdownDelta} or its own merge logic. Keeps `closeTurn`
267
+ * a pure function with no input mutation.
268
+ */
269
+ export interface CloseTurnResult {
270
+ category: TurnCategory;
271
+ turns_with_retry_inc: number;
272
+ one_shot_inc: number;
273
+ breakdown_delta: {
274
+ turns_inc: number;
275
+ turns_with_edit_inc: number;
276
+ total_retries_inc: number;
277
+ cost_usd_inc: number;
278
+ };
279
+ turn_event: SessionTurnAnalytics;
280
+ /**
281
+ * Per-step events for every step that ran in this turn, in
282
+ * `(turn_index, step_index)` order. The LAST entry carries
283
+ * `is_last_step=true` plus the turn-bookend fields
284
+ * (`turn_end_reason`, `turn_end_time`, `turn_duration`,
285
+ * `turn_category`, `turn_was_one_shot`, `turn_was_interrupted`)
286
+ * — backend reads `is_last_step=true` to know "this turn is now
287
+ * fully reconstructable from steps."
288
+ *
289
+ * Empty when the turn had no assistant message (defensive — should
290
+ * not happen in a normal transcript but we tolerate it).
291
+ */
292
+ step_events: SessionTurnStepAnalytics[];
293
+ }
294
+ /**
295
+ * Apply a {@link CloseTurnResult}'s `breakdown_delta` onto a category-
296
+ * breakdown map. Always WRITES A FRESH SLOT — never mutates the existing
297
+ * one in place. This decouples the post-merge mutation in emit.ts's
298
+ * finalize block from the slot-reference assumptions of any future
299
+ * `mergeCategoryBreakdown` refactor.
300
+ */
301
+ export declare function applyBreakdownDelta(breakdown: Record<string, CategoryStats>, r: CloseTurnResult): void;
302
+ /**
303
+ * Close a turn — finalizes the per-turn record, runs the classifier,
304
+ * and produces a fully-built `SessionTurnAnalytics` for the wire plus
305
+ * the per-category breakdown delta the caller should apply.
306
+ *
307
+ * Pure function — does not mutate any input. `opts.endTime` is the
308
+ * closing event timestamp (next human-user msg, or session_end when
309
+ * finalizing). `opts.endReason` records which boundary fired so backend
310
+ * can distinguish normal turn ends from session-end forced closes.
311
+ */
312
+ export declare function closeTurn(turn: CurrentTurnState, opts: CloseTurnOpts): CloseTurnResult;
313
+ export declare function projectDelta(input: ProjectionInput): DeltaAnalytics;
314
+ /** Exposed for the merge step + tests — the per-delta top-K map. */
315
+ export interface DeltaInternal {
316
+ file_path_change_counts: Record<string, number>;
317
+ distinct_file_paths_seen: string[];
318
+ /**
319
+ * ms-since-epoch of the LAST assistant message timestamp seen in this
320
+ * slice. Used by merge to update `internal.last_assistant_ts_ms` so the
321
+ * NEXT slice's projection can seed `priorLastAssistantTsMs` and compute
322
+ * cross-slice user-response-time gaps.
323
+ */
324
+ last_assistant_ts_ms?: number;
325
+ /**
326
+ * Idle ms accumulated WITHIN this slice — sum of `(human_user.ts - prior.ts)`
327
+ * gaps. Includes the cross-slice gap when this slice opens with a
328
+ * human-user message and `priorLastActivityTsMs` was supplied. Merge
329
+ * adds this to `internal.idle_ms_total` and recomputes
330
+ * `accumulated.idle_minutes` + `accumulated.active_minutes`.
331
+ */
332
+ idle_ms_delta?: number;
333
+ /**
334
+ * Post-walk value of the monotonic per-session turn index. Merge
335
+ * persists this into `state.internal.next_turn_index` so the next
336
+ * slice's projection seeds `priorNextTurnIndex` from it.
337
+ */
338
+ next_turn_index?: number;
339
+ /**
340
+ * Anthropic message ids newly counted in THIS slice (not present in
341
+ * priorSeenAssistantMessageIds). Merge appends these to
342
+ * `state.internal.seen_assistant_message_ids` so the next slice can
343
+ * detect cross-slice duplicate API responses.
344
+ */
345
+ new_assistant_message_ids?: string[];
346
+ }
347
+ /**
348
+ * Re-walk the same lines to extract the per-delta internal aggregation
349
+ * fields (path→count map + distinct set + last assistant timestamp) the
350
+ * merge step needs to update `internal.*` on the state file. Kept separate
351
+ * so the wire-level `DeltaAnalytics` (sent through merge) doesn't carry
352
+ * these maps.
353
+ */
354
+ export declare function projectDeltaInternal(input: ProjectionInput): DeltaInternal;
355
+ export {};
356
+ //# sourceMappingURL=projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../../src/analytics/projection.ts"],"names":[],"mappings":"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"}