@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 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/analytics/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * IronBee CLI — Transcript Locator + Parser
3
+ *
4
+ * Resolves the host transcript JSONL path for a session_id and tail-parses
5
+ * a slice of new bytes into individual messages.
6
+ *
7
+ * Claude Code stores per-session transcripts at:
8
+ * ~/.claude/projects/<sanitized(projectDir)>/<session_id>.jsonl
9
+ *
10
+ * where `sanitized` replaces every non-[a-zA-Z0-9] char with `-`.
11
+ *
12
+ * For Cursor: not wired up — `findClaudeTranscriptPath` returns null and
13
+ * the projector skips with `transcript_source: "missing"` until a Cursor
14
+ * path-resolution strategy lands.
15
+ *
16
+ * The parser is "tolerant of trailing partial lines and corrupt mid-file
17
+ * lines": it returns `last_complete_byte` so callers can bound their
18
+ * boundary detection to fully-parseable bytes only.
19
+ */
20
+ /**
21
+ * Sanitize a project directory path the same way Claude Code does.
22
+ * Replaces every non-alphanumeric character with `-`.
23
+ *
24
+ * Note: Claude Code also handles paths >200 chars by appending a hash
25
+ * suffix; we don't reproduce that here because (a) such long paths are
26
+ * rare and (b) the fallback {@link findClaudeTranscriptPath} can still
27
+ * locate the file by scanning the projects dir for `<session_id>.jsonl`
28
+ * if the simple-encoded path doesn't exist.
29
+ */
30
+ export declare function sanitizeProjectPath(projectDir: string): string;
31
+ /**
32
+ * Resolve the Claude Code transcript JSONL path for a (projectDir, session_id).
33
+ *
34
+ * Tries the deterministic encoded path first; if missing, falls back to
35
+ * scanning `~/.claude/projects/*` for a matching `<session_id>.jsonl`.
36
+ * Returns null if no file is found.
37
+ */
38
+ export declare function findClaudeTranscriptPath(projectDir: string, sessionId: string): string | null;
39
+ /** How many bytes the first-KB hash covers when computing a fresh fingerprint. */
40
+ export declare const FIRST_KB_HASH_LENGTH: number;
41
+ /**
42
+ * Compute sha256 over the first `maxBytes` (default 1024) bytes of the file.
43
+ * Returns empty string if the file doesn't exist or can't be opened. The
44
+ * hash is used by reset detection to catch in-place truncate+refill scenarios
45
+ * that would otherwise leave inode + size unchanged but content different.
46
+ *
47
+ * Important: callers MUST pass the SAME `maxBytes` on the recompute side as
48
+ * was used on the record side — otherwise the hash range differs between
49
+ * calls and a growing small file (< 1024 bytes) will spuriously trigger a
50
+ * "content_replaced" reset just because the hash now covers more bytes.
51
+ *
52
+ * The emit pipeline records the file's size-at-hash (`transcript_size_at_last_read`,
53
+ * capped at 1024) and uses that on every re-check so the comparison
54
+ * is stable across growth.
55
+ */
56
+ export declare function firstKbSha256(transcriptPath: string, maxBytes?: number): string;
57
+ export interface SliceReadResult {
58
+ /** The bytes actually read (may be shorter than expected on truncate). */
59
+ bytes: Buffer;
60
+ /** True if file was truncated mid-read; caller should NOT advance state. */
61
+ truncated: boolean;
62
+ }
63
+ /**
64
+ * Read [from, to) bytes from `path`. If fewer bytes than expected come back
65
+ * (file was truncated between stat and read), returns `truncated: true` so
66
+ * the caller can bail out of the trigger without advancing state. Eventual
67
+ * consistency: the next trigger detects via inode/size/first-KB checks.
68
+ */
69
+ export declare function readSlice(path: string, from: number, to: number): SliceReadResult;
70
+ export interface FileStat {
71
+ inode: number;
72
+ size: number;
73
+ }
74
+ /** Best-effort stat → {inode, size}. Throws on missing/inaccessible file. */
75
+ export declare function statTranscript(path: string): FileStat;
76
+ /** A single parsed transcript line plus its byte position in the file. */
77
+ export interface ParsedLine<T = unknown> {
78
+ /** Byte offset (file-relative) where this line starts. */
79
+ start: number;
80
+ /** Byte offset (file-relative) where the next line starts (= start + line bytes including the trailing newline). */
81
+ end: number;
82
+ /** Parsed JSON value. Null if the line was malformed (caller may filter). */
83
+ parsed: T | null;
84
+ }
85
+ export interface ParseJsonlResult<T = unknown> {
86
+ /** Parseable lines in order. Malformed mid-file lines have `parsed: null` (caller decides). */
87
+ lines: ParsedLine<T>[];
88
+ /**
89
+ * Byte offset (file-relative) of the end of the last fully-parseable line.
90
+ * Trailing partial / unterminated bytes are EXCLUDED. If no complete line
91
+ * was seen, equals `base_offset`.
92
+ */
93
+ last_complete_byte: number;
94
+ }
95
+ /**
96
+ * Parse a buffer of JSONL bytes that begins at file-position `baseOffset`.
97
+ * Splits on `\n`; for each segment with a terminating newline, attempts
98
+ * JSON.parse — failures get `parsed: null` (so position math still works
99
+ * for subsequent lines) and a debug log.
100
+ *
101
+ * The trailing segment after the last `\n` is treated as an INCOMPLETE
102
+ * line: it's neither parsed nor reflected in `last_complete_byte`, so the
103
+ * next read picks it up once more bytes arrive (or never if it's a true
104
+ * partial-write at SessionEnd).
105
+ */
106
+ export declare function parseJsonl<T = unknown>(buf: Buffer, baseOffset: number): ParseJsonlResult<T>;
107
+ /** Minimal Claude transcript line shape this module reasons about. */
108
+ export interface TranscriptLine {
109
+ type: "user" | "assistant" | "system" | "summary" | string;
110
+ message?: {
111
+ content?: unknown;
112
+ };
113
+ /**
114
+ * Claude Code's structural marker for host-injected user messages (slash
115
+ * command bodies, Stop-hook feedback strings, etc.). Boundary detection
116
+ * does NOT skip these — they ARE valid turn-safe boundary candidates
117
+ * because they advance the agent (e.g., a hook feedback message at slice
118
+ * tail SHOULD defer the cut until the agent's retry response lands).
119
+ * Projection-time turn semantics (open new vs continuation) are decided
120
+ * separately in `projection.ts`.
121
+ */
122
+ isMeta?: boolean;
123
+ }
124
+ /**
125
+ * Returns true iff the given line is a "human-text" user message — i.e.,
126
+ * a user message whose content carries actual typed text (not a tool_result).
127
+ *
128
+ * Both real user prompts AND host-injected user messages (isMeta=true) qualify
129
+ * here: from the boundary-detection perspective, both advance the agent and
130
+ * trigger response activity, so the cut should defer at either to avoid
131
+ * splitting a turn mid-response. Per-turn projection semantics decide
132
+ * separately whether an isMeta line opens a new turn or continues an open one.
133
+ *
134
+ * Detection mirrors Claude Code's extractToolStats:599-609.
135
+ */
136
+ export declare function isHumanTextUserMessage(line: TranscriptLine | null): boolean;
137
+ /** Returns true iff the line is an assistant message. */
138
+ export declare function isAssistantMessage(line: TranscriptLine | null): boolean;
139
+ /**
140
+ * Turn-safe boundary detection per §4.8.2:
141
+ *
142
+ * Boundary = byte position of the latest human-text user message in the
143
+ * new data that has NO assistant message line after it.
144
+ * If no such message exists, boundary = lastCompleteByte.
145
+ *
146
+ * `isFinal` overrides: at SessionEnd, return `lastCompleteByte` directly
147
+ * (don't defer the trailing partial-turn) — the host is done writing.
148
+ */
149
+ export declare function findTurnSafeBoundary(lines: ParsedLine<TranscriptLine>[], lastCompleteByte: number, isFinal: boolean): number;
150
+ //# sourceMappingURL=transcript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../src/analytics/transcript.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAYH;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsB7F;AAMD,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,EAAE,MAAa,CAAC;AAEjD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,GAAE,MAA6B,GAAG,MAAM,CAwBrG;AAMD,MAAM,WAAW,eAAe;IAC5B,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,SAAS,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,CAoBjF;AAED,MAAM,WAAW,QAAQ;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAGrD;AAMD,0EAA0E;AAC1E,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACnC,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,oHAAoH;IACpH,GAAG,EAAE,MAAM,CAAC;IACZ,6EAA6E;IAC7E,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,OAAO;IACzC,+FAA+F;IAC/F,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IACvB;;;;OAIG;IACH,kBAAkB,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAgC5F;AAMD,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IAC3D,OAAO,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;IACF;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CAqB3E;AAED,yDAAyD;AACzD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CAEvE;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAChC,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,EACnC,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,OAAO,GACjB,MAAM,CAuBR"}
@@ -0,0 +1,276 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee CLI — Transcript Locator + Parser
4
+ *
5
+ * Resolves the host transcript JSONL path for a session_id and tail-parses
6
+ * a slice of new bytes into individual messages.
7
+ *
8
+ * Claude Code stores per-session transcripts at:
9
+ * ~/.claude/projects/<sanitized(projectDir)>/<session_id>.jsonl
10
+ *
11
+ * where `sanitized` replaces every non-[a-zA-Z0-9] char with `-`.
12
+ *
13
+ * For Cursor: not wired up — `findClaudeTranscriptPath` returns null and
14
+ * the projector skips with `transcript_source: "missing"` until a Cursor
15
+ * path-resolution strategy lands.
16
+ *
17
+ * The parser is "tolerant of trailing partial lines and corrupt mid-file
18
+ * lines": it returns `last_complete_byte` so callers can bound their
19
+ * boundary detection to fully-parseable bytes only.
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.FIRST_KB_HASH_LENGTH = void 0;
23
+ exports.sanitizeProjectPath = sanitizeProjectPath;
24
+ exports.findClaudeTranscriptPath = findClaudeTranscriptPath;
25
+ exports.firstKbSha256 = firstKbSha256;
26
+ exports.readSlice = readSlice;
27
+ exports.statTranscript = statTranscript;
28
+ exports.parseJsonl = parseJsonl;
29
+ exports.isHumanTextUserMessage = isHumanTextUserMessage;
30
+ exports.isAssistantMessage = isAssistantMessage;
31
+ exports.findTurnSafeBoundary = findTurnSafeBoundary;
32
+ const crypto_1 = require("crypto");
33
+ const fs_1 = require("fs");
34
+ const os_1 = require("os");
35
+ const path_1 = require("path");
36
+ const logger_1 = require("../lib/logger");
37
+ // ─────────────────────────────────────────────────────────────────────────
38
+ // Path resolution
39
+ // ─────────────────────────────────────────────────────────────────────────
40
+ /**
41
+ * Sanitize a project directory path the same way Claude Code does.
42
+ * Replaces every non-alphanumeric character with `-`.
43
+ *
44
+ * Note: Claude Code also handles paths >200 chars by appending a hash
45
+ * suffix; we don't reproduce that here because (a) such long paths are
46
+ * rare and (b) the fallback {@link findClaudeTranscriptPath} can still
47
+ * locate the file by scanning the projects dir for `<session_id>.jsonl`
48
+ * if the simple-encoded path doesn't exist.
49
+ */
50
+ function sanitizeProjectPath(projectDir) {
51
+ return projectDir.replace(/[^a-zA-Z0-9]/g, "-");
52
+ }
53
+ /**
54
+ * Resolve the Claude Code transcript JSONL path for a (projectDir, session_id).
55
+ *
56
+ * Tries the deterministic encoded path first; if missing, falls back to
57
+ * scanning `~/.claude/projects/*` for a matching `<session_id>.jsonl`.
58
+ * Returns null if no file is found.
59
+ */
60
+ function findClaudeTranscriptPath(projectDir, sessionId) {
61
+ const projectsDir = (0, path_1.join)((0, os_1.homedir)(), ".claude", "projects");
62
+ const directPath = (0, path_1.join)(projectsDir, sanitizeProjectPath(projectDir), `${sessionId}.jsonl`);
63
+ if ((0, fs_1.existsSync)(directPath)) {
64
+ return directPath;
65
+ }
66
+ // Fallback: scan project subdirs for a transcript with this session_id.
67
+ if (!(0, fs_1.existsSync)(projectsDir)) {
68
+ return null;
69
+ }
70
+ try {
71
+ const subdirs = (0, fs_1.readdirSync)(projectsDir);
72
+ for (const sub of subdirs) {
73
+ const candidate = (0, path_1.join)(projectsDir, sub, `${sessionId}.jsonl`);
74
+ if ((0, fs_1.existsSync)(candidate)) {
75
+ return candidate;
76
+ }
77
+ }
78
+ }
79
+ catch (e) {
80
+ logger_1.logger.debug(`transcript: scan ${projectsDir} failed: ${e instanceof Error ? e.message : e}`);
81
+ }
82
+ return null;
83
+ }
84
+ // ─────────────────────────────────────────────────────────────────────────
85
+ // First-KB hash (for in-place truncate+refill detection — §4.11)
86
+ // ─────────────────────────────────────────────────────────────────────────
87
+ /** How many bytes the first-KB hash covers when computing a fresh fingerprint. */
88
+ exports.FIRST_KB_HASH_LENGTH = 1024;
89
+ /**
90
+ * Compute sha256 over the first `maxBytes` (default 1024) bytes of the file.
91
+ * Returns empty string if the file doesn't exist or can't be opened. The
92
+ * hash is used by reset detection to catch in-place truncate+refill scenarios
93
+ * that would otherwise leave inode + size unchanged but content different.
94
+ *
95
+ * Important: callers MUST pass the SAME `maxBytes` on the recompute side as
96
+ * was used on the record side — otherwise the hash range differs between
97
+ * calls and a growing small file (< 1024 bytes) will spuriously trigger a
98
+ * "content_replaced" reset just because the hash now covers more bytes.
99
+ *
100
+ * The emit pipeline records the file's size-at-hash (`transcript_size_at_last_read`,
101
+ * capped at 1024) and uses that on every re-check so the comparison
102
+ * is stable across growth.
103
+ */
104
+ function firstKbSha256(transcriptPath, maxBytes = exports.FIRST_KB_HASH_LENGTH) {
105
+ let fd = null;
106
+ try {
107
+ if (!(0, fs_1.existsSync)(transcriptPath) || maxBytes <= 0) {
108
+ return "";
109
+ }
110
+ fd = (0, fs_1.openSync)(transcriptPath, "r");
111
+ const buf = Buffer.alloc(maxBytes);
112
+ const n = (0, fs_1.readSync)(fd, buf, 0, maxBytes, 0);
113
+ const h = (0, crypto_1.createHash)("sha256");
114
+ h.update(buf.subarray(0, n));
115
+ return h.digest("hex");
116
+ }
117
+ catch (e) {
118
+ logger_1.logger.debug(`transcript: first-KB hash failed for ${transcriptPath}: ${e instanceof Error ? e.message : e}`);
119
+ return "";
120
+ }
121
+ finally {
122
+ if (fd !== null) {
123
+ try {
124
+ (0, fs_1.closeSync)(fd);
125
+ }
126
+ catch {
127
+ // ignore
128
+ }
129
+ }
130
+ }
131
+ }
132
+ /**
133
+ * Read [from, to) bytes from `path`. If fewer bytes than expected come back
134
+ * (file was truncated between stat and read), returns `truncated: true` so
135
+ * the caller can bail out of the trigger without advancing state. Eventual
136
+ * consistency: the next trigger detects via inode/size/first-KB checks.
137
+ */
138
+ function readSlice(path, from, to) {
139
+ const expected = Math.max(0, to - from);
140
+ if (expected === 0) {
141
+ return { bytes: Buffer.alloc(0), truncated: false };
142
+ }
143
+ const fd = (0, fs_1.openSync)(path, "r");
144
+ try {
145
+ const buf = Buffer.alloc(expected);
146
+ const n = (0, fs_1.readSync)(fd, buf, 0, expected, from);
147
+ return {
148
+ bytes: buf.subarray(0, n),
149
+ truncated: n < expected,
150
+ };
151
+ }
152
+ finally {
153
+ try {
154
+ (0, fs_1.closeSync)(fd);
155
+ }
156
+ catch {
157
+ // ignore
158
+ }
159
+ }
160
+ }
161
+ /** Best-effort stat → {inode, size}. Throws on missing/inaccessible file. */
162
+ function statTranscript(path) {
163
+ const s = (0, fs_1.statSync)(path);
164
+ return { inode: Number(s.ino), size: Number(s.size) };
165
+ }
166
+ /**
167
+ * Parse a buffer of JSONL bytes that begins at file-position `baseOffset`.
168
+ * Splits on `\n`; for each segment with a terminating newline, attempts
169
+ * JSON.parse — failures get `parsed: null` (so position math still works
170
+ * for subsequent lines) and a debug log.
171
+ *
172
+ * The trailing segment after the last `\n` is treated as an INCOMPLETE
173
+ * line: it's neither parsed nor reflected in `last_complete_byte`, so the
174
+ * next read picks it up once more bytes arrive (or never if it's a true
175
+ * partial-write at SessionEnd).
176
+ */
177
+ function parseJsonl(buf, baseOffset) {
178
+ const lines = [];
179
+ let cursor = 0;
180
+ let lastCompleteByte = baseOffset;
181
+ while (cursor < buf.length) {
182
+ const nlIdx = buf.indexOf(0x0a /* '\n' */, cursor);
183
+ if (nlIdx === -1) {
184
+ // Trailing incomplete line — leave for next read.
185
+ break;
186
+ }
187
+ const lineBytes = buf.subarray(cursor, nlIdx);
188
+ const start = baseOffset + cursor;
189
+ const end = baseOffset + nlIdx + 1;
190
+ const text = lineBytes.toString("utf-8");
191
+ let parsed = null;
192
+ if (text.length > 0) {
193
+ try {
194
+ parsed = JSON.parse(text);
195
+ }
196
+ catch (e) {
197
+ logger_1.logger.debug(`transcript: dropped malformed line at byte ${start}: ${e instanceof Error ? e.message : e}`);
198
+ parsed = null;
199
+ }
200
+ }
201
+ lines.push({ start, end, parsed });
202
+ lastCompleteByte = end;
203
+ cursor = nlIdx + 1;
204
+ }
205
+ return { lines, last_complete_byte: lastCompleteByte };
206
+ }
207
+ /**
208
+ * Returns true iff the given line is a "human-text" user message — i.e.,
209
+ * a user message whose content carries actual typed text (not a tool_result).
210
+ *
211
+ * Both real user prompts AND host-injected user messages (isMeta=true) qualify
212
+ * here: from the boundary-detection perspective, both advance the agent and
213
+ * trigger response activity, so the cut should defer at either to avoid
214
+ * splitting a turn mid-response. Per-turn projection semantics decide
215
+ * separately whether an isMeta line opens a new turn or continues an open one.
216
+ *
217
+ * Detection mirrors Claude Code's extractToolStats:599-609.
218
+ */
219
+ function isHumanTextUserMessage(line) {
220
+ if (line === null || line.type !== "user" || line.message === undefined) {
221
+ return false;
222
+ }
223
+ const content = line.message.content;
224
+ if (typeof content === "string") {
225
+ return content.trim().length > 0;
226
+ }
227
+ if (Array.isArray(content)) {
228
+ for (const block of content) {
229
+ if (block !== null
230
+ && typeof block === "object"
231
+ && block.type === "text"
232
+ && "text" in block) {
233
+ return true;
234
+ }
235
+ }
236
+ }
237
+ return false;
238
+ }
239
+ /** Returns true iff the line is an assistant message. */
240
+ function isAssistantMessage(line) {
241
+ return line !== null && line.type === "assistant";
242
+ }
243
+ /**
244
+ * Turn-safe boundary detection per §4.8.2:
245
+ *
246
+ * Boundary = byte position of the latest human-text user message in the
247
+ * new data that has NO assistant message line after it.
248
+ * If no such message exists, boundary = lastCompleteByte.
249
+ *
250
+ * `isFinal` overrides: at SessionEnd, return `lastCompleteByte` directly
251
+ * (don't defer the trailing partial-turn) — the host is done writing.
252
+ */
253
+ function findTurnSafeBoundary(lines, lastCompleteByte, isFinal) {
254
+ if (isFinal) {
255
+ return lastCompleteByte;
256
+ }
257
+ // Walk lines once, recording the position of the latest human-text user
258
+ // line and tracking whether any assistant line follows it.
259
+ let latestHumanTextStart = -1;
260
+ let hasAssistantAfterLatest = false;
261
+ for (const ln of lines) {
262
+ if (isHumanTextUserMessage(ln.parsed)) {
263
+ latestHumanTextStart = ln.start;
264
+ hasAssistantAfterLatest = false;
265
+ }
266
+ else if (latestHumanTextStart !== -1
267
+ && isAssistantMessage(ln.parsed)) {
268
+ hasAssistantAfterLatest = true;
269
+ }
270
+ }
271
+ if (latestHumanTextStart === -1 || hasAssistantAfterLatest) {
272
+ return lastCompleteByte;
273
+ }
274
+ return latestHumanTextStart;
275
+ }
276
+ //# sourceMappingURL=transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../src/analytics/transcript.ts"],"names":[],"mappings":"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"}