@ironbee-ai/cli 0.15.0 → 0.16.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 (454) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/analytics/{emit.d.ts → claude/emit.d.ts} +1 -1
  3. package/dist/analytics/claude/emit.d.ts.map +1 -0
  4. package/dist/analytics/{emit.js → claude/emit.js} +34 -7
  5. package/dist/analytics/claude/emit.js.map +1 -0
  6. package/dist/analytics/{hook-trigger.d.ts → claude/hook-trigger.d.ts} +1 -1
  7. package/dist/analytics/claude/hook-trigger.d.ts.map +1 -0
  8. package/dist/analytics/{hook-trigger.js → claude/hook-trigger.js} +2 -2
  9. package/dist/analytics/claude/hook-trigger.js.map +1 -0
  10. package/dist/analytics/claude/log.d.ts.map +1 -0
  11. package/dist/analytics/{log.js → claude/log.js} +1 -1
  12. package/dist/analytics/claude/log.js.map +1 -0
  13. package/dist/analytics/{merge.d.ts → claude/merge.d.ts} +2 -1
  14. package/dist/analytics/claude/merge.d.ts.map +1 -0
  15. package/dist/analytics/{merge.js → claude/merge.js} +13 -1
  16. package/dist/analytics/claude/merge.js.map +1 -0
  17. package/dist/analytics/{pricing.d.ts → claude/pricing.d.ts} +1 -13
  18. package/dist/analytics/claude/pricing.d.ts.map +1 -0
  19. package/dist/analytics/{pricing.js → claude/pricing.js} +6 -14
  20. package/dist/analytics/claude/pricing.js.map +1 -0
  21. package/dist/analytics/{projection.d.ts → claude/projection.d.ts} +31 -7
  22. package/dist/analytics/claude/projection.d.ts.map +1 -0
  23. package/dist/analytics/{projection.js → claude/projection.js} +631 -327
  24. package/dist/analytics/claude/projection.js.map +1 -0
  25. package/dist/analytics/{spawn.d.ts → claude/spawn.d.ts} +4 -4
  26. package/dist/analytics/claude/spawn.d.ts.map +1 -0
  27. package/dist/analytics/{spawn.js → claude/spawn.js} +4 -3
  28. package/dist/analytics/claude/spawn.js.map +1 -0
  29. package/dist/analytics/{state.d.ts → claude/state.d.ts} +1 -1
  30. package/dist/analytics/claude/state.d.ts.map +1 -0
  31. package/dist/analytics/{state.js → claude/state.js} +2 -2
  32. package/dist/analytics/claude/state.js.map +1 -0
  33. package/dist/analytics/claude/transcript.d.ts.map +1 -0
  34. package/dist/analytics/{transcript.js → claude/transcript.js} +1 -1
  35. package/dist/analytics/claude/transcript.js.map +1 -0
  36. package/dist/analytics/codex/api-request.d.ts +108 -0
  37. package/dist/analytics/codex/api-request.d.ts.map +1 -0
  38. package/dist/analytics/codex/api-request.js +155 -0
  39. package/dist/analytics/codex/api-request.js.map +1 -0
  40. package/dist/analytics/codex/apply-patch.d.ts +21 -0
  41. package/dist/analytics/codex/apply-patch.d.ts.map +1 -0
  42. package/dist/analytics/codex/apply-patch.js +49 -0
  43. package/dist/analytics/codex/apply-patch.js.map +1 -0
  44. package/dist/analytics/codex/classifier.d.ts +28 -0
  45. package/dist/analytics/codex/classifier.d.ts.map +1 -0
  46. package/dist/analytics/codex/classifier.js +111 -0
  47. package/dist/analytics/codex/classifier.js.map +1 -0
  48. package/dist/analytics/codex/emit.d.ts +47 -0
  49. package/dist/analytics/codex/emit.d.ts.map +1 -0
  50. package/dist/analytics/codex/emit.js +158 -0
  51. package/dist/analytics/codex/emit.js.map +1 -0
  52. package/dist/analytics/codex/events-emit.d.ts +62 -0
  53. package/dist/analytics/codex/events-emit.d.ts.map +1 -0
  54. package/dist/analytics/codex/events-emit.js +555 -0
  55. package/dist/analytics/codex/events-emit.js.map +1 -0
  56. package/dist/analytics/codex/pricing.d.ts +57 -0
  57. package/dist/analytics/codex/pricing.d.ts.map +1 -0
  58. package/dist/analytics/codex/pricing.js +125 -0
  59. package/dist/analytics/codex/pricing.js.map +1 -0
  60. package/dist/analytics/codex/projection.d.ts +51 -0
  61. package/dist/analytics/codex/projection.d.ts.map +1 -0
  62. package/dist/analytics/codex/projection.js +1477 -0
  63. package/dist/analytics/codex/projection.js.map +1 -0
  64. package/dist/analytics/codex/spawn.d.ts +27 -0
  65. package/dist/analytics/codex/spawn.d.ts.map +1 -0
  66. package/dist/analytics/codex/spawn.js +64 -0
  67. package/dist/analytics/codex/spawn.js.map +1 -0
  68. package/dist/analytics/codex/status-snapshot.d.ts +80 -0
  69. package/dist/analytics/codex/status-snapshot.d.ts.map +1 -0
  70. package/dist/analytics/codex/status-snapshot.js +206 -0
  71. package/dist/analytics/codex/status-snapshot.js.map +1 -0
  72. package/dist/analytics/codex/transcript.d.ts +51 -0
  73. package/dist/analytics/codex/transcript.d.ts.map +1 -0
  74. package/dist/analytics/codex/transcript.js +134 -0
  75. package/dist/analytics/codex/transcript.js.map +1 -0
  76. package/dist/analytics/codex/types.d.ts +253 -0
  77. package/dist/analytics/codex/types.d.ts.map +1 -0
  78. package/dist/analytics/codex/types.js +29 -0
  79. package/dist/analytics/codex/types.js.map +1 -0
  80. package/dist/analytics/shared/classifier.d.ts.map +1 -0
  81. package/dist/analytics/{classifier.js → shared/classifier.js} +9 -0
  82. package/dist/analytics/shared/classifier.js.map +1 -0
  83. package/dist/analytics/shared/errors.d.ts.map +1 -0
  84. package/dist/analytics/shared/errors.js.map +1 -0
  85. package/dist/analytics/shared/tokens.d.ts +14 -0
  86. package/dist/analytics/shared/tokens.d.ts.map +1 -0
  87. package/dist/analytics/shared/tokens.js +17 -0
  88. package/dist/analytics/shared/tokens.js.map +1 -0
  89. package/dist/analytics/{types.d.ts → shared/types.d.ts} +42 -9
  90. package/dist/analytics/shared/types.d.ts.map +1 -0
  91. package/dist/analytics/shared/types.js.map +1 -0
  92. package/dist/clients/base.d.ts +9 -0
  93. package/dist/clients/base.d.ts.map +1 -1
  94. package/dist/clients/claude/hooks/activity-end.js +1 -1
  95. package/dist/clients/claude/hooks/activity-end.js.map +1 -1
  96. package/dist/clients/claude/hooks/activity-start.js +1 -1
  97. package/dist/clients/claude/hooks/activity-start.js.map +1 -1
  98. package/dist/clients/claude/hooks/clear-verdict.d.ts.map +1 -1
  99. package/dist/clients/claude/hooks/clear-verdict.js +14 -0
  100. package/dist/clients/claude/hooks/clear-verdict.js.map +1 -1
  101. package/dist/clients/claude/hooks/session-end.d.ts.map +1 -1
  102. package/dist/clients/claude/hooks/session-end.js +7 -1
  103. package/dist/clients/claude/hooks/session-end.js.map +1 -1
  104. package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
  105. package/dist/clients/claude/hooks/session-start.js +7 -1
  106. package/dist/clients/claude/hooks/session-start.js.map +1 -1
  107. package/dist/clients/claude/hooks/session-status.d.ts.map +1 -1
  108. package/dist/clients/claude/hooks/session-status.js +13 -9
  109. package/dist/clients/claude/hooks/session-status.js.map +1 -1
  110. package/dist/clients/claude/hooks/track-action.d.ts.map +1 -1
  111. package/dist/clients/claude/hooks/track-action.js +26 -1
  112. package/dist/clients/claude/hooks/track-action.js.map +1 -1
  113. package/dist/clients/claude/hooks/verify-gate.d.ts.map +1 -1
  114. package/dist/clients/claude/hooks/verify-gate.js +8 -1
  115. package/dist/clients/claude/hooks/verify-gate.js.map +1 -1
  116. package/dist/clients/claude/index.d.ts +1 -0
  117. package/dist/clients/claude/index.d.ts.map +1 -1
  118. package/dist/clients/claude/index.js +7 -0
  119. package/dist/clients/claude/index.js.map +1 -1
  120. package/dist/clients/claude/util.d.ts.map +1 -1
  121. package/dist/clients/claude/util.js +55 -0
  122. package/dist/clients/claude/util.js.map +1 -1
  123. package/dist/clients/codex/commands/ironbee-verify/SKILL.md +58 -0
  124. package/dist/clients/codex/hooks/activity-end.d.ts +9 -0
  125. package/dist/clients/codex/hooks/activity-end.d.ts.map +1 -0
  126. package/dist/clients/codex/hooks/activity-end.js +65 -0
  127. package/dist/clients/codex/hooks/activity-end.js.map +1 -0
  128. package/dist/clients/codex/hooks/activity-start.d.ts +17 -0
  129. package/dist/clients/codex/hooks/activity-start.d.ts.map +1 -0
  130. package/dist/clients/codex/hooks/activity-start.js +38 -0
  131. package/dist/clients/codex/hooks/activity-start.js.map +1 -0
  132. package/dist/clients/codex/hooks/clear-verdict.d.ts +55 -0
  133. package/dist/clients/codex/hooks/clear-verdict.d.ts.map +1 -0
  134. package/dist/clients/codex/hooks/clear-verdict.js +299 -0
  135. package/dist/clients/codex/hooks/clear-verdict.js.map +1 -0
  136. package/dist/clients/codex/hooks/require-verdict.d.ts +30 -0
  137. package/dist/clients/codex/hooks/require-verdict.d.ts.map +1 -0
  138. package/dist/clients/codex/hooks/require-verdict.js +109 -0
  139. package/dist/clients/codex/hooks/require-verdict.js.map +1 -0
  140. package/dist/clients/codex/hooks/require-verification.d.ts +12 -0
  141. package/dist/clients/codex/hooks/require-verification.d.ts.map +1 -0
  142. package/dist/clients/codex/hooks/require-verification.js +136 -0
  143. package/dist/clients/codex/hooks/require-verification.js.map +1 -0
  144. package/dist/clients/codex/hooks/session-start.d.ts +10 -0
  145. package/dist/clients/codex/hooks/session-start.d.ts.map +1 -0
  146. package/dist/clients/codex/hooks/session-start.js +94 -0
  147. package/dist/clients/codex/hooks/session-start.js.map +1 -0
  148. package/dist/clients/codex/hooks/track-action-monitor.d.ts +10 -0
  149. package/dist/clients/codex/hooks/track-action-monitor.d.ts.map +1 -0
  150. package/dist/clients/codex/hooks/track-action-monitor.js +168 -0
  151. package/dist/clients/codex/hooks/track-action-monitor.js.map +1 -0
  152. package/dist/clients/codex/hooks/track-action-pre.d.ts +18 -0
  153. package/dist/clients/codex/hooks/track-action-pre.d.ts.map +1 -0
  154. package/dist/clients/codex/hooks/track-action-pre.js +35 -0
  155. package/dist/clients/codex/hooks/track-action-pre.js.map +1 -0
  156. package/dist/clients/codex/hooks/track-action.d.ts +22 -0
  157. package/dist/clients/codex/hooks/track-action.d.ts.map +1 -0
  158. package/dist/clients/codex/hooks/track-action.js +350 -0
  159. package/dist/clients/codex/hooks/track-action.js.map +1 -0
  160. package/dist/clients/codex/hooks/verify-gate.d.ts +15 -0
  161. package/dist/clients/codex/hooks/verify-gate.d.ts.map +1 -0
  162. package/dist/clients/codex/hooks/verify-gate.js +105 -0
  163. package/dist/clients/codex/hooks/verify-gate.js.map +1 -0
  164. package/dist/clients/codex/index.d.ts +42 -0
  165. package/dist/clients/codex/index.d.ts.map +1 -0
  166. package/dist/clients/codex/index.js +427 -0
  167. package/dist/clients/codex/index.js.map +1 -0
  168. package/dist/clients/codex/platforms/command-verify.backend.md +108 -0
  169. package/dist/clients/codex/platforms/command-verify.browser.md +108 -0
  170. package/dist/clients/codex/platforms/command-verify.node.md +61 -0
  171. package/dist/clients/codex/platforms/rule.backend.md +32 -0
  172. package/dist/clients/codex/platforms/rule.browser.md +17 -0
  173. package/dist/clients/codex/platforms/rule.node.md +28 -0
  174. package/dist/clients/codex/platforms/skill.backend.md +95 -0
  175. package/dist/clients/codex/platforms/skill.browser.md +28 -0
  176. package/dist/clients/codex/platforms/skill.node.md +62 -0
  177. package/dist/clients/codex/rules/ironbee-verification.md +48 -0
  178. package/dist/clients/codex/skills/ironbee-verification.md +80 -0
  179. package/dist/clients/codex/util.d.ts +193 -0
  180. package/dist/clients/codex/util.d.ts.map +1 -0
  181. package/dist/clients/codex/util.js +784 -0
  182. package/dist/clients/codex/util.js.map +1 -0
  183. package/dist/clients/cursor/hooks/activity-end.js +1 -1
  184. package/dist/clients/cursor/hooks/activity-end.js.map +1 -1
  185. package/dist/clients/cursor/hooks/clear-verdict.d.ts +5 -2
  186. package/dist/clients/cursor/hooks/clear-verdict.d.ts.map +1 -1
  187. package/dist/clients/cursor/hooks/clear-verdict.js +12 -3
  188. package/dist/clients/cursor/hooks/clear-verdict.js.map +1 -1
  189. package/dist/clients/cursor/hooks/session-end.js +1 -1
  190. package/dist/clients/cursor/hooks/session-end.js.map +1 -1
  191. package/dist/clients/cursor/hooks/verify-gate.d.ts.map +1 -1
  192. package/dist/clients/cursor/hooks/verify-gate.js +6 -1
  193. package/dist/clients/cursor/hooks/verify-gate.js.map +1 -1
  194. package/dist/clients/cursor/index.d.ts +1 -0
  195. package/dist/clients/cursor/index.d.ts.map +1 -1
  196. package/dist/clients/cursor/index.js +13 -0
  197. package/dist/clients/cursor/index.js.map +1 -1
  198. package/dist/clients/registry.d.ts.map +1 -1
  199. package/dist/clients/registry.js +2 -1
  200. package/dist/clients/registry.js.map +1 -1
  201. package/dist/commands/{claude.d.ts → claude/index.d.ts} +1 -1
  202. package/dist/commands/claude/index.d.ts.map +1 -0
  203. package/dist/commands/{claude.js → claude/index.js} +12 -6
  204. package/dist/commands/claude/index.js.map +1 -0
  205. package/dist/commands/{otel.d.ts → claude/otel.d.ts} +5 -1
  206. package/dist/commands/claude/otel.d.ts.map +1 -0
  207. package/dist/commands/{otel.js → claude/otel.js} +9 -5
  208. package/dist/commands/claude/otel.js.map +1 -0
  209. package/dist/commands/claude/process-analytics.d.ts +19 -0
  210. package/dist/commands/claude/process-analytics.d.ts.map +1 -0
  211. package/dist/commands/{process-analytics.js → claude/process-analytics.js} +16 -15
  212. package/dist/commands/claude/process-analytics.js.map +1 -0
  213. package/dist/commands/{statusline-toggle.d.ts → claude/statusline-toggle.d.ts} +2 -2
  214. package/dist/commands/claude/statusline-toggle.d.ts.map +1 -0
  215. package/dist/commands/{statusline-toggle.js → claude/statusline-toggle.js} +8 -8
  216. package/dist/commands/claude/statusline-toggle.js.map +1 -0
  217. package/dist/commands/{statusline.d.ts → claude/statusline.d.ts} +1 -1
  218. package/dist/commands/claude/statusline.d.ts.map +1 -0
  219. package/dist/commands/{statusline.js → claude/statusline.js} +4 -4
  220. package/dist/commands/claude/statusline.js.map +1 -0
  221. package/dist/commands/codex/index.d.ts +11 -0
  222. package/dist/commands/codex/index.d.ts.map +1 -0
  223. package/dist/commands/codex/index.js +17 -0
  224. package/dist/commands/codex/index.js.map +1 -0
  225. package/dist/commands/codex/process-analytics.d.ts +14 -0
  226. package/dist/commands/codex/process-analytics.d.ts.map +1 -0
  227. package/dist/commands/codex/process-analytics.js +111 -0
  228. package/dist/commands/codex/process-analytics.js.map +1 -0
  229. package/dist/commands/hook.js +12 -0
  230. package/dist/commands/hook.js.map +1 -1
  231. package/dist/commands/import.js +3 -3
  232. package/dist/commands/import.js.map +1 -1
  233. package/dist/commands/queue.js +3 -1
  234. package/dist/commands/queue.js.map +1 -1
  235. package/dist/hooks/core/actions.d.ts +17 -1
  236. package/dist/hooks/core/actions.d.ts.map +1 -1
  237. package/dist/hooks/core/actions.js +13 -0
  238. package/dist/hooks/core/actions.js.map +1 -1
  239. package/dist/hooks/core/activity-end.d.ts.map +1 -1
  240. package/dist/hooks/core/activity-end.js +4 -0
  241. package/dist/hooks/core/activity-end.js.map +1 -1
  242. package/dist/hooks/core/session-state.d.ts +15 -1
  243. package/dist/hooks/core/session-state.d.ts.map +1 -1
  244. package/dist/hooks/core/session-state.js +102 -7
  245. package/dist/hooks/core/session-state.js.map +1 -1
  246. package/dist/import/claude/analytics-runner.d.ts +1 -1
  247. package/dist/import/claude/analytics-runner.d.ts.map +1 -1
  248. package/dist/import/claude/analytics-runner.js +5 -5
  249. package/dist/import/claude/analytics-runner.js.map +1 -1
  250. package/dist/import/claude/auth-mode.d.ts +1 -1
  251. package/dist/import/claude/auth-mode.d.ts.map +1 -1
  252. package/dist/import/claude/discovery.js +1 -1
  253. package/dist/import/claude/discovery.js.map +1 -1
  254. package/dist/import/claude/encoding.js +1 -1
  255. package/dist/import/claude/encoding.js.map +1 -1
  256. package/dist/import/claude/events/file-change.d.ts +10 -1
  257. package/dist/import/claude/events/file-change.d.ts.map +1 -1
  258. package/dist/import/claude/events/file-change.js +79 -5
  259. package/dist/import/claude/events/file-change.js.map +1 -1
  260. package/dist/import/claude/events/tool-call.d.ts +16 -1
  261. package/dist/import/claude/events/tool-call.d.ts.map +1 -1
  262. package/dist/import/claude/events/tool-call.js +122 -15
  263. package/dist/import/claude/events/tool-call.js.map +1 -1
  264. package/dist/import/claude/runner.d.ts.map +1 -1
  265. package/dist/import/claude/runner.js +45 -3
  266. package/dist/import/claude/runner.js.map +1 -1
  267. package/dist/import/claude/summary.js +1 -1
  268. package/dist/import/claude/summary.js.map +1 -1
  269. package/dist/import/claude/transcript-walk.d.ts +1 -1
  270. package/dist/import/claude/transcript-walk.d.ts.map +1 -1
  271. package/dist/import/claude/transcript-walk.js +11 -4
  272. package/dist/import/claude/transcript-walk.js.map +1 -1
  273. package/dist/import/codex/analytics-runner.d.ts +46 -0
  274. package/dist/import/codex/analytics-runner.d.ts.map +1 -0
  275. package/dist/import/codex/analytics-runner.js +116 -0
  276. package/dist/import/codex/analytics-runner.js.map +1 -0
  277. package/dist/import/codex/discovery.d.ts +33 -0
  278. package/dist/import/codex/discovery.d.ts.map +1 -0
  279. package/dist/import/codex/discovery.js +202 -0
  280. package/dist/import/codex/discovery.js.map +1 -0
  281. package/dist/import/codex/events/file-change.d.ts +42 -0
  282. package/dist/import/codex/events/file-change.d.ts.map +1 -0
  283. package/dist/import/codex/events/file-change.js +125 -0
  284. package/dist/import/codex/events/file-change.js.map +1 -0
  285. package/dist/import/codex/events/tool-call.d.ts +49 -0
  286. package/dist/import/codex/events/tool-call.d.ts.map +1 -0
  287. package/dist/import/codex/events/tool-call.js +151 -0
  288. package/dist/import/codex/events/tool-call.js.map +1 -0
  289. package/dist/import/codex/runner.d.ts +34 -0
  290. package/dist/import/codex/runner.d.ts.map +1 -0
  291. package/dist/import/codex/runner.js +456 -0
  292. package/dist/import/codex/runner.js.map +1 -0
  293. package/dist/import/codex/summary.d.ts +20 -0
  294. package/dist/import/codex/summary.d.ts.map +1 -0
  295. package/dist/import/codex/summary.js +206 -0
  296. package/dist/import/codex/summary.js.map +1 -0
  297. package/dist/import/events/activity.d.ts.map +1 -1
  298. package/dist/import/events/activity.js +17 -2
  299. package/dist/import/events/activity.js.map +1 -1
  300. package/dist/import/events/session.d.ts +11 -1
  301. package/dist/import/events/session.d.ts.map +1 -1
  302. package/dist/import/events/session.js +19 -1
  303. package/dist/import/events/session.js.map +1 -1
  304. package/dist/import/ids.js +3 -3
  305. package/dist/import/ids.js.map +1 -1
  306. package/dist/import/pipeline.d.ts +22 -15
  307. package/dist/import/pipeline.d.ts.map +1 -1
  308. package/dist/import/pipeline.js +99 -18
  309. package/dist/import/pipeline.js.map +1 -1
  310. package/dist/import/types.d.ts +4 -0
  311. package/dist/import/types.d.ts.map +1 -1
  312. package/dist/import/types.js.map +1 -1
  313. package/dist/index.js +9 -11
  314. package/dist/index.js.map +1 -1
  315. package/dist/lib/collector.d.ts +2 -1
  316. package/dist/lib/collector.d.ts.map +1 -1
  317. package/dist/lib/collector.js +28 -3
  318. package/dist/lib/collector.js.map +1 -1
  319. package/dist/lib/config.d.ts.map +1 -1
  320. package/dist/lib/config.js.map +1 -1
  321. package/dist/lib/event.d.ts +18 -1
  322. package/dist/lib/event.d.ts.map +1 -1
  323. package/dist/lib/event.js +25 -1
  324. package/dist/lib/event.js.map +1 -1
  325. package/dist/lib/platform-section.d.ts.map +1 -1
  326. package/dist/lib/platform-section.js +8 -0
  327. package/dist/lib/platform-section.js.map +1 -1
  328. package/dist/otel/{context → claude/context}/build.d.ts +1 -1
  329. package/dist/otel/claude/context/build.d.ts.map +1 -0
  330. package/dist/otel/{context → claude/context}/build.js +3 -7
  331. package/dist/otel/claude/context/build.js.map +1 -0
  332. package/dist/otel/claude/context/classify.d.ts.map +1 -0
  333. package/dist/otel/claude/context/classify.js.map +1 -0
  334. package/dist/otel/{context → claude/context}/extract.d.ts +1 -1
  335. package/dist/otel/claude/context/extract.d.ts.map +1 -0
  336. package/dist/otel/claude/context/extract.js.map +1 -0
  337. package/dist/otel/claude/context/markers.d.ts.map +1 -0
  338. package/dist/otel/{context → claude/context}/markers.js +22 -3
  339. package/dist/otel/claude/context/markers.js.map +1 -0
  340. package/dist/otel/claude/context/util.d.ts.map +1 -0
  341. package/dist/otel/claude/context/util.js.map +1 -0
  342. package/dist/otel/{daemon → claude/daemon}/ensure.d.ts +1 -1
  343. package/dist/otel/claude/daemon/ensure.d.ts.map +1 -0
  344. package/dist/otel/{daemon → claude/daemon}/ensure.js +6 -6
  345. package/dist/otel/claude/daemon/ensure.js.map +1 -0
  346. package/dist/otel/{daemon → claude/daemon}/forward.d.ts +1 -1
  347. package/dist/otel/claude/daemon/forward.d.ts.map +1 -0
  348. package/dist/otel/{daemon → claude/daemon}/forward.js +0 -0
  349. package/dist/otel/claude/daemon/forward.js.map +1 -0
  350. package/dist/otel/claude/daemon/paths.d.ts.map +1 -0
  351. package/dist/otel/claude/daemon/paths.js.map +1 -0
  352. package/dist/otel/{daemon → claude/daemon}/process.d.ts +1 -1
  353. package/dist/otel/claude/daemon/process.d.ts.map +1 -0
  354. package/dist/otel/{daemon → claude/daemon}/process.js +1 -1
  355. package/dist/otel/claude/daemon/process.js.map +1 -0
  356. package/dist/otel/claude/daemon/reprocess.d.ts.map +1 -0
  357. package/dist/otel/{daemon → claude/daemon}/reprocess.js +2 -2
  358. package/dist/otel/claude/daemon/reprocess.js.map +1 -0
  359. package/dist/otel/claude/log-handler.d.ts.map +1 -0
  360. package/dist/otel/{log-handler.js → claude/log-handler.js} +1 -1
  361. package/dist/otel/claude/log-handler.js.map +1 -0
  362. package/dist/otel/collector.js +4 -4
  363. package/dist/otel/collector.js.map +1 -1
  364. package/dist/queue/flush.d.ts +23 -0
  365. package/dist/queue/flush.d.ts.map +1 -1
  366. package/dist/queue/flush.js +44 -0
  367. package/dist/queue/flush.js.map +1 -1
  368. package/dist/queue/handlers/send-event.d.ts.map +1 -1
  369. package/dist/queue/handlers/send-event.js +5 -4
  370. package/dist/queue/handlers/send-event.js.map +1 -1
  371. package/dist/queue/index.d.ts +2 -2
  372. package/dist/queue/index.d.ts.map +1 -1
  373. package/dist/queue/index.js +4 -1
  374. package/dist/queue/index.js.map +1 -1
  375. package/dist/queue/spawn.d.ts +20 -0
  376. package/dist/queue/spawn.d.ts.map +1 -1
  377. package/dist/queue/spawn.js +37 -0
  378. package/dist/queue/spawn.js.map +1 -1
  379. package/dist/tui/import/area.js +3 -3
  380. package/dist/tui/import/area.js.map +1 -1
  381. package/package.json +2 -1
  382. package/dist/analytics/classifier.d.ts.map +0 -1
  383. package/dist/analytics/classifier.js.map +0 -1
  384. package/dist/analytics/emit.d.ts.map +0 -1
  385. package/dist/analytics/emit.js.map +0 -1
  386. package/dist/analytics/errors.d.ts.map +0 -1
  387. package/dist/analytics/errors.js.map +0 -1
  388. package/dist/analytics/hook-trigger.d.ts.map +0 -1
  389. package/dist/analytics/hook-trigger.js.map +0 -1
  390. package/dist/analytics/log.d.ts.map +0 -1
  391. package/dist/analytics/log.js.map +0 -1
  392. package/dist/analytics/merge.d.ts.map +0 -1
  393. package/dist/analytics/merge.js.map +0 -1
  394. package/dist/analytics/pricing.d.ts.map +0 -1
  395. package/dist/analytics/pricing.js.map +0 -1
  396. package/dist/analytics/projection.d.ts.map +0 -1
  397. package/dist/analytics/projection.js.map +0 -1
  398. package/dist/analytics/spawn.d.ts.map +0 -1
  399. package/dist/analytics/spawn.js.map +0 -1
  400. package/dist/analytics/state.d.ts.map +0 -1
  401. package/dist/analytics/state.js.map +0 -1
  402. package/dist/analytics/transcript.d.ts.map +0 -1
  403. package/dist/analytics/transcript.js.map +0 -1
  404. package/dist/analytics/types.d.ts.map +0 -1
  405. package/dist/analytics/types.js.map +0 -1
  406. package/dist/commands/claude.d.ts.map +0 -1
  407. package/dist/commands/claude.js.map +0 -1
  408. package/dist/commands/otel.d.ts.map +0 -1
  409. package/dist/commands/otel.js.map +0 -1
  410. package/dist/commands/process-analytics.d.ts +0 -18
  411. package/dist/commands/process-analytics.d.ts.map +0 -1
  412. package/dist/commands/process-analytics.js.map +0 -1
  413. package/dist/commands/statusline-toggle.d.ts.map +0 -1
  414. package/dist/commands/statusline-toggle.js.map +0 -1
  415. package/dist/commands/statusline.d.ts.map +0 -1
  416. package/dist/commands/statusline.js.map +0 -1
  417. package/dist/otel/context/build.d.ts.map +0 -1
  418. package/dist/otel/context/build.js.map +0 -1
  419. package/dist/otel/context/classify.d.ts.map +0 -1
  420. package/dist/otel/context/classify.js.map +0 -1
  421. package/dist/otel/context/extract.d.ts.map +0 -1
  422. package/dist/otel/context/extract.js.map +0 -1
  423. package/dist/otel/context/markers.d.ts.map +0 -1
  424. package/dist/otel/context/markers.js.map +0 -1
  425. package/dist/otel/context/util.d.ts.map +0 -1
  426. package/dist/otel/context/util.js.map +0 -1
  427. package/dist/otel/daemon/ensure.d.ts.map +0 -1
  428. package/dist/otel/daemon/ensure.js.map +0 -1
  429. package/dist/otel/daemon/forward.d.ts.map +0 -1
  430. package/dist/otel/daemon/forward.js.map +0 -1
  431. package/dist/otel/daemon/paths.d.ts.map +0 -1
  432. package/dist/otel/daemon/paths.js.map +0 -1
  433. package/dist/otel/daemon/process.d.ts.map +0 -1
  434. package/dist/otel/daemon/process.js.map +0 -1
  435. package/dist/otel/daemon/reprocess.d.ts.map +0 -1
  436. package/dist/otel/daemon/reprocess.js.map +0 -1
  437. package/dist/otel/log-handler.d.ts.map +0 -1
  438. package/dist/otel/log-handler.js.map +0 -1
  439. /package/dist/analytics/{log.d.ts → claude/log.d.ts} +0 -0
  440. /package/dist/analytics/{transcript.d.ts → claude/transcript.d.ts} +0 -0
  441. /package/dist/analytics/{classifier.d.ts → shared/classifier.d.ts} +0 -0
  442. /package/dist/analytics/{errors.d.ts → shared/errors.d.ts} +0 -0
  443. /package/dist/analytics/{errors.js → shared/errors.js} +0 -0
  444. /package/dist/analytics/{types.js → shared/types.js} +0 -0
  445. /package/dist/otel/{context → claude/context}/classify.d.ts +0 -0
  446. /package/dist/otel/{context → claude/context}/classify.js +0 -0
  447. /package/dist/otel/{context → claude/context}/extract.js +0 -0
  448. /package/dist/otel/{context → claude/context}/markers.d.ts +0 -0
  449. /package/dist/otel/{context → claude/context}/util.d.ts +0 -0
  450. /package/dist/otel/{context → claude/context}/util.js +0 -0
  451. /package/dist/otel/{daemon → claude/daemon}/paths.d.ts +0 -0
  452. /package/dist/otel/{daemon → claude/daemon}/paths.js +0 -0
  453. /package/dist/otel/{daemon → claude/daemon}/reprocess.d.ts +0 -0
  454. /package/dist/otel/{log-handler.d.ts → claude/log-handler.d.ts} +0 -0
@@ -30,8 +30,18 @@ function isHumanTextUserLine(line) {
30
30
  return false;
31
31
  }
32
32
  const content = line.message.content;
33
+ // Match `src/analytics/claude/projection.ts:isHumanTextUser` exactly
34
+ // so import-derived turn boundaries (used by `deriveTurnBoundariesFromTranscript`
35
+ // for activity_start/end emission) match live-derived ones for the
36
+ // same transcript bytes. Two prior divergences:
37
+ // (a) string content: live trims whitespace before length check;
38
+ // import did not, so a whitespace-only message would be treated
39
+ // as a real human turn opener by import but not by live.
40
+ // (b) mixed `[tool_result, text]` blocks: live keeps scanning for
41
+ // a text block (returns true if found); import short-circuited
42
+ // false on the first tool_result, missing the trailing text.
33
43
  if (typeof content === "string") {
34
- return content.length > 0;
44
+ return content.trim().length > 0;
35
45
  }
36
46
  if (Array.isArray(content)) {
37
47
  for (const block of content) {
@@ -40,9 +50,6 @@ function isHumanTextUserLine(line) {
40
50
  if (t === "text" && typeof block.text === "string") {
41
51
  return true;
42
52
  }
43
- if (t === "tool_result") {
44
- return false;
45
- }
46
53
  }
47
54
  }
48
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"transcript-walk.js","sourceRoot":"","sources":["../../../src/import/claude/transcript-walk.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transcript-walk.js","sourceRoot":"","sources":["../../../src/import/claude/transcript-walk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * IronBee CLI — Codex Import Analytics Runner
3
+ *
4
+ * Orchestrates the Codex analytics derivation for a full rollout JSONL.
5
+ * Mirror of `src/analytics/codex/emit.ts`'s projection step BUT:
6
+ *
7
+ * - never reads / writes the per-session `analytics-codex/state.json`
8
+ * - always treats the slice as final (`is_final: true`)
9
+ * - full from-zero parse — no cursor tracking
10
+ *
11
+ * Returns the `SessionAnalyticsEvent` the import pipeline should POST.
12
+ * The pipeline is responsible for POST + marker. We deliberately do NOT
13
+ * emit `session_turn_analytics` here — it's out of scope on Codex;
14
+ * the master record carries the same signals at session granularity.
15
+ *
16
+ * Independent of Claude's `import/claude/analytics-runner.ts` — Codex
17
+ * projection consumes the RolloutItem enum, not Claude's transcript
18
+ * message lines. Imports share the same `projectCodexDelta` core as the
19
+ * live `codex/emit.ts`, so live + import produce SEMANTICALLY
20
+ * identical `session_analytics` records for the same session content —
21
+ * modulo `is_final` (import=true / live=false), `end_reason`
22
+ * ("import" / undefined), `snapshot_at` (per-emit ISO timestamp), and
23
+ * envelope `timestamp` (Date.now() at emit). Aside from those four
24
+ * deliberately-divergent fields, the projection output is byte-identical.
25
+ */
26
+ import { SessionAnalyticsEvent } from "../../analytics/shared/types";
27
+ export interface CodexAnalyticsRunnerInput {
28
+ sessionId: string;
29
+ projectName: string;
30
+ transcriptPath: string;
31
+ /** Surfaced on `session_analytics.end_reason`. Defaults to `"import"`. */
32
+ endReason?: string;
33
+ }
34
+ export interface CodexAnalyticsRunnerOutput {
35
+ /** Null when the rollout couldn't be parsed (caller falls back to skipping). */
36
+ sessionAnalytics: SessionAnalyticsEvent | null;
37
+ /** Number of bytes processed — written into the import marker for resume diagnostics. */
38
+ transcriptOffset: number;
39
+ }
40
+ /**
41
+ * Run the full rollout through the Codex session-projection and return
42
+ * the master `session_analytics` event. Throws on read errors; on parse
43
+ * errors the projection itself is defensive and skips malformed lines.
44
+ */
45
+ export declare function runCodexImportAnalytics(input: CodexAnalyticsRunnerInput): CodexAnalyticsRunnerOutput;
46
+ //# sourceMappingURL=analytics-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-runner.d.ts","sourceRoot":"","sources":["../../../src/import/codex/analytics-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,EAAoB,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAQvF,MAAM,WAAW,yBAAyB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;CAMtB;AAED,MAAM,WAAW,0BAA0B;IACvC,gFAAgF;IAChF,gBAAgB,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC/C,yFAAyF;IACzF,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,yBAAyB,GAAG,0BAA0B,CAwEpG"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee CLI — Codex Import Analytics Runner
4
+ *
5
+ * Orchestrates the Codex analytics derivation for a full rollout JSONL.
6
+ * Mirror of `src/analytics/codex/emit.ts`'s projection step BUT:
7
+ *
8
+ * - never reads / writes the per-session `analytics-codex/state.json`
9
+ * - always treats the slice as final (`is_final: true`)
10
+ * - full from-zero parse — no cursor tracking
11
+ *
12
+ * Returns the `SessionAnalyticsEvent` the import pipeline should POST.
13
+ * The pipeline is responsible for POST + marker. We deliberately do NOT
14
+ * emit `session_turn_analytics` here — it's out of scope on Codex;
15
+ * the master record carries the same signals at session granularity.
16
+ *
17
+ * Independent of Claude's `import/claude/analytics-runner.ts` — Codex
18
+ * projection consumes the RolloutItem enum, not Claude's transcript
19
+ * message lines. Imports share the same `projectCodexDelta` core as the
20
+ * live `codex/emit.ts`, so live + import produce SEMANTICALLY
21
+ * identical `session_analytics` records for the same session content —
22
+ * modulo `is_final` (import=true / live=false), `end_reason`
23
+ * ("import" / undefined), `snapshot_at` (per-emit ISO timestamp), and
24
+ * envelope `timestamp` (Date.now() at emit). Aside from those four
25
+ * deliberately-divergent fields, the projection output is byte-identical.
26
+ */
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.runCodexImportAnalytics = runCodexImportAnalytics;
29
+ const fs_1 = require("fs");
30
+ const logger_1 = require("../../lib/logger");
31
+ const projection_1 = require("../../analytics/codex/projection");
32
+ /**
33
+ * Run the full rollout through the Codex session-projection and return
34
+ * the master `session_analytics` event. Throws on read errors; on parse
35
+ * errors the projection itself is defensive and skips malformed lines.
36
+ */
37
+ function runCodexImportAnalytics(input) {
38
+ const raw = (0, fs_1.readFileSync)(input.transcriptPath);
39
+ const offset = raw.length;
40
+ const text = raw.toString("utf-8");
41
+ const lines = [];
42
+ for (const line of text.split("\n")) {
43
+ if (line.length === 0) {
44
+ continue;
45
+ }
46
+ try {
47
+ lines.push(JSON.parse(line));
48
+ }
49
+ catch {
50
+ // malformed line — skip (matches live behavior)
51
+ }
52
+ }
53
+ if (lines.length === 0) {
54
+ logger_1.logger.debug(`codex import analytics: ${input.transcriptPath} parsed to zero rollout lines`);
55
+ return { sessionAnalytics: null, transcriptOffset: offset };
56
+ }
57
+ let projection;
58
+ try {
59
+ projection = (0, projection_1.projectCodexDelta)({
60
+ sessionId: input.sessionId,
61
+ projectName: input.projectName,
62
+ lines,
63
+ endReason: input.endReason ?? "import",
64
+ // Imports replay COMPLETE historical sessions — the rollout ends
65
+ // because the user already closed the session. `is_final: true`
66
+ // is correct here (mirrors Claude-import semantic). The LIVE
67
+ // path in `commands/codex/process-analytics.ts` passes false
68
+ // because each Stop is a checkpoint, not a terminal.
69
+ isFinal: true,
70
+ });
71
+ }
72
+ catch (e) {
73
+ logger_1.logger.debug(`codex import analytics: projection failed for ${input.sessionId}: ${e instanceof Error ? e.message : e}`);
74
+ return { sessionAnalytics: null, transcriptOffset: offset };
75
+ }
76
+ // Wire shape: `analytics` MUST be NESTED (mirrors Claude side; the
77
+ // collector's session_analytics envelope requires this single nested
78
+ // body field). Earlier flat version POSTed all SessionAnalytics
79
+ // fields at the top level and the collector dropped them as unknown
80
+ // properties → `analytics` missing → validation reject → 400.
81
+ //
82
+ // user_email / usage_type / usage_plan are intentionally NOT stamped
83
+ // here — `applyUsageToEvents` in runner.ts sets them on every event
84
+ // (this one included) after we return.
85
+ const analyticsBody = { ...projection.delta };
86
+ // Wire timestamp anchors to the session's last in-transcript activity,
87
+ // not the import-run wall clock — mirror of Claude import's
88
+ // analytics-runner.ts (parseIsoOrNow(merged.last_activity_time)).
89
+ // Without this, importing a months-old Codex rollout stamps every
90
+ // session_analytics event with "today", which breaks any backend
91
+ // query that windows on Event.timestamp (timeline plots, time-bucketed
92
+ // dashboards, cohort analyses cluster all imported Codex sessions on
93
+ // the import moment instead of when they actually happened). The live
94
+ // Codex emit path (analytics/codex/emit.ts) correctly uses Date.now()
95
+ // because the live emit IS the current moment — only the import path
96
+ // is wrong. Falls back to Date.now() only when last_activity_time is
97
+ // missing / unparseable.
98
+ const sessionTsMs = parseIsoOrNow(analyticsBody.last_activity_time);
99
+ const event = {
100
+ id: (0, projection_1.deriveCodexSessionAnalyticsEventId)(input.sessionId),
101
+ type: "session_analytics",
102
+ timestamp: sessionTsMs,
103
+ session_id: input.sessionId,
104
+ project_name: input.projectName,
105
+ analytics: analyticsBody,
106
+ };
107
+ return { sessionAnalytics: event, transcriptOffset: offset };
108
+ }
109
+ function parseIsoOrNow(iso) {
110
+ if (typeof iso !== "string" || iso.length === 0) {
111
+ return Date.now();
112
+ }
113
+ const ms = Date.parse(iso);
114
+ return Number.isFinite(ms) ? ms : Date.now();
115
+ }
116
+ //# sourceMappingURL=analytics-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-runner.js","sourceRoot":"","sources":["../../../src/import/codex/analytics-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * IronBee CLI — Codex Import Discovery
3
+ *
4
+ * Resolves an `ImportScope` to a list of `ImportTarget`s by walking
5
+ * `~/.codex/sessions/YYYY/MM/DD/rollout-<ISO>-<UUID>.jsonl`.
6
+ *
7
+ * Unlike Claude (encoded project folder under ~/.claude/projects/), Codex
8
+ * stores rollouts flat by date. Project association is recovered by
9
+ * reading the first line's `session_meta.payload.cwd`. So:
10
+ * - `current-project` → scan every rollout, keep those whose first-line
11
+ * cwd matches the current cwd
12
+ * - `projects <paths>` → scan every rollout, keep those whose first-line
13
+ * cwd matches any of the supplied paths
14
+ * - `all-projects` → scan every rollout, project comes from each rollout's
15
+ * own first-line cwd (one project per rollout)
16
+ * - `transcript <path>` → single file, project from its session_meta line
17
+ *
18
+ * Discovery does NOT apply the time-range filter — `filter.ts` does that
19
+ * after a session is found.
20
+ */
21
+ import { ImportScope, ImportTarget } from "../types";
22
+ /**
23
+ * Resolve the scope flag to a list of candidate transcripts. Each returned
24
+ * `ImportTarget` is fully populated EXCEPT that no time-range filter has
25
+ * been applied yet — callers run `filter.ts` over this list.
26
+ *
27
+ * Codex's flat-by-date layout means every scope (except `transcript`) does
28
+ * a full walk + per-file first-line read. That's O(rollouts) per import
29
+ * invocation — acceptable: rollouts are < 10K per machine for a typical
30
+ * dev box, and the first-line read peeks at ≤ 4 KB.
31
+ */
32
+ export declare function findCodexTranscripts(scope: ImportScope): ImportTarget[];
33
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/import/codex/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAWH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAErD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,EAAE,CA6BvE"}
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee CLI — Codex Import Discovery
4
+ *
5
+ * Resolves an `ImportScope` to a list of `ImportTarget`s by walking
6
+ * `~/.codex/sessions/YYYY/MM/DD/rollout-<ISO>-<UUID>.jsonl`.
7
+ *
8
+ * Unlike Claude (encoded project folder under ~/.claude/projects/), Codex
9
+ * stores rollouts flat by date. Project association is recovered by
10
+ * reading the first line's `session_meta.payload.cwd`. So:
11
+ * - `current-project` → scan every rollout, keep those whose first-line
12
+ * cwd matches the current cwd
13
+ * - `projects <paths>` → scan every rollout, keep those whose first-line
14
+ * cwd matches any of the supplied paths
15
+ * - `all-projects` → scan every rollout, project comes from each rollout's
16
+ * own first-line cwd (one project per rollout)
17
+ * - `transcript <path>` → single file, project from its session_meta line
18
+ *
19
+ * Discovery does NOT apply the time-range filter — `filter.ts` does that
20
+ * after a session is found.
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.findCodexTranscripts = findCodexTranscripts;
24
+ const fs_1 = require("fs");
25
+ const path_1 = require("path");
26
+ const logger_1 = require("../../lib/logger");
27
+ const actions_1 = require("../../hooks/core/actions");
28
+ const transcript_1 = require("../../analytics/codex/transcript");
29
+ /**
30
+ * Resolve the scope flag to a list of candidate transcripts. Each returned
31
+ * `ImportTarget` is fully populated EXCEPT that no time-range filter has
32
+ * been applied yet — callers run `filter.ts` over this list.
33
+ *
34
+ * Codex's flat-by-date layout means every scope (except `transcript`) does
35
+ * a full walk + per-file first-line read. That's O(rollouts) per import
36
+ * invocation — acceptable: rollouts are < 10K per machine for a typical
37
+ * dev box, and the first-line read peeks at ≤ 4 KB.
38
+ */
39
+ function findCodexTranscripts(scope) {
40
+ if (scope.kind === "transcript") {
41
+ const t = buildSingleTranscriptTarget(scope.path);
42
+ return t !== null ? [t] : [];
43
+ }
44
+ if (!(0, fs_1.existsSync)((0, transcript_1.codexSessionsRoot)())) {
45
+ return [];
46
+ }
47
+ // Canonicalize comparison paths via realpathSync — macOS resolves
48
+ // `/var/folders/...` → `/private/var/folders/...` and session_meta.cwd
49
+ // typically holds the realpath form; without canonicalization a
50
+ // symlinked `--projects /tmp/proj` silently returns zero targets when
51
+ // Codex stored `/private/tmp/proj`. Same for cwd on `current-project`.
52
+ const allowProjects = scope.kind === "current-project"
53
+ ? new Set([tryRealpath(process.cwd())])
54
+ : scope.kind === "projects"
55
+ ? new Set(scope.paths.map((p) => tryRealpath((0, path_1.resolve)(p))))
56
+ : null; // all-projects: accept every cwd
57
+ const out = [];
58
+ for (const rolloutPath of (0, transcript_1.walkAllCodexRollouts)()) {
59
+ const t = buildTargetFromRollout(rolloutPath, allowProjects);
60
+ if (t !== null) {
61
+ out.push(t);
62
+ }
63
+ }
64
+ return out;
65
+ }
66
+ function buildSingleTranscriptTarget(path) {
67
+ const absPath = (0, path_1.isAbsolute)(path) ? path : (0, path_1.resolve)(path);
68
+ if (!(0, fs_1.existsSync)(absPath)) {
69
+ logger_1.logger.debug(`codex import discovery: --transcript ${absPath} doesn't exist`);
70
+ return null;
71
+ }
72
+ if (!absPath.endsWith(".jsonl")) {
73
+ logger_1.logger.debug(`codex import discovery: --transcript ${absPath} is not a .jsonl file`);
74
+ return null;
75
+ }
76
+ // No allow-list filter for single-transcript mode — caller explicitly
77
+ // asked for this file, so we accept whatever cwd the rollout has.
78
+ return buildTargetFromRollout(absPath, null);
79
+ }
80
+ function tryRealpath(p) {
81
+ try {
82
+ return (0, fs_1.realpathSync)(p);
83
+ }
84
+ catch {
85
+ // Path doesn't exist on this machine (deleted, never created, or
86
+ // typo). Fall back to the lexical form — the allow-list will
87
+ // simply never match, which is the desired behavior.
88
+ return p;
89
+ }
90
+ }
91
+ function buildTargetFromRollout(rolloutPath, allowProjects) {
92
+ const sessionId = (0, transcript_1.sessionIdFromRolloutPath)(rolloutPath);
93
+ if (sessionId === null) {
94
+ logger_1.logger.debug(`codex import discovery: filename shape mismatch ${rolloutPath} — skipping`);
95
+ return null;
96
+ }
97
+ const meta = peekSessionMeta(rolloutPath);
98
+ if (meta === null) {
99
+ logger_1.logger.debug(`codex import discovery: ${rolloutPath} has no session_meta in header — skipping`);
100
+ return null;
101
+ }
102
+ if (allowProjects !== null && !allowProjects.has(meta.cwd)) {
103
+ return null;
104
+ }
105
+ let mtimeMs;
106
+ let sizeBytes;
107
+ try {
108
+ const s = (0, fs_1.statSync)(rolloutPath);
109
+ mtimeMs = s.mtimeMs;
110
+ sizeBytes = s.size;
111
+ }
112
+ catch (e) {
113
+ logger_1.logger.debug(`codex import discovery: stat(${rolloutPath}) failed: ${e instanceof Error ? e.message : e}`);
114
+ return null;
115
+ }
116
+ const sessionStartMs = Date.parse(meta.timestamp);
117
+ if (!Number.isFinite(sessionStartMs)) {
118
+ logger_1.logger.debug(`codex import discovery: ${rolloutPath} session_meta has unparseable timestamp ${meta.timestamp} — skipping`);
119
+ return null;
120
+ }
121
+ return {
122
+ client: "codex",
123
+ sessionId,
124
+ transcriptPath: rolloutPath,
125
+ projectDir: meta.cwd,
126
+ // Use git-aware resolveProjectName (Claude-parity) so the import
127
+ // matches the live emit's project_name. Plain basename diverges when
128
+ // a session was launched from a subdir or when the local dir name
129
+ // differs from the git remote name — backend would then see "same
130
+ // session, two different project labels" depending on which path
131
+ // (live vs import) wrote last. See `analytics/codex/emit.ts`
132
+ // for the same fix on the live side.
133
+ projectName: (0, actions_1.resolveProjectName)(meta.cwd),
134
+ sessionStartMs,
135
+ mtimeMs,
136
+ sizeBytes,
137
+ };
138
+ }
139
+ /**
140
+ * Read the first ≤ 4 KB of the rollout, parse the first complete line as
141
+ * the session_meta entry, and pull out `cwd` + `timestamp`. Returns null
142
+ * when the first line isn't a session_meta or the read fails. Sized to be
143
+ * cheap (one syscall + small alloc) so a full-store walk stays fast.
144
+ */
145
+ function peekSessionMeta(rolloutPath) {
146
+ const READ_CAP = 4 * 1024;
147
+ let fd;
148
+ try {
149
+ fd = (0, fs_1.openSync)(rolloutPath, "r");
150
+ }
151
+ catch {
152
+ return null;
153
+ }
154
+ let firstLine;
155
+ try {
156
+ const buf = Buffer.alloc(READ_CAP);
157
+ const n = (0, fs_1.readSync)(fd, buf, 0, READ_CAP, 0);
158
+ const head = buf.subarray(0, n).toString("utf-8");
159
+ const newlineIdx = head.indexOf("\n");
160
+ firstLine = newlineIdx === -1 ? head : head.slice(0, newlineIdx);
161
+ }
162
+ catch {
163
+ // Finally runs in all paths — closeSync below handles cleanup.
164
+ // No inner close here (it would double-close → EBADF).
165
+ return null;
166
+ }
167
+ finally {
168
+ try {
169
+ (0, fs_1.closeSync)(fd);
170
+ }
171
+ catch { /* ignore */ }
172
+ }
173
+ if (firstLine.length === 0) {
174
+ return null;
175
+ }
176
+ let parsed;
177
+ try {
178
+ parsed = JSON.parse(firstLine);
179
+ }
180
+ catch {
181
+ return null;
182
+ }
183
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
184
+ return null;
185
+ }
186
+ const obj = parsed;
187
+ if (obj.type !== "session_meta") {
188
+ return null;
189
+ }
190
+ const payload = obj.payload;
191
+ if (payload === null || typeof payload !== "object" || Array.isArray(payload)) {
192
+ return null;
193
+ }
194
+ const p = payload;
195
+ const cwd = p.cwd;
196
+ const timestamp = p.timestamp ?? obj.timestamp;
197
+ if (typeof cwd !== "string" || cwd.length === 0 || typeof timestamp !== "string" || timestamp.length === 0) {
198
+ return null;
199
+ }
200
+ return { cwd, timestamp };
201
+ }
202
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/import/codex/discovery.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;AAuBH,oDA6BC;AAlDD,2BAAuF;AACvF,+BAAqD;AACrD,6CAA0C;AAC1C,sDAA8D;AAC9D,iEAI0C;AAG1C;;;;;;;;;GASG;AACH,SAAgB,oBAAoB,CAAC,KAAkB;IACnD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAwB,2BAA2B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjC,CAAC;IAED,IAAI,CAAC,IAAA,eAAU,EAAC,IAAA,8BAAiB,GAAE,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC;IACd,CAAC;IAED,kEAAkE;IAClE,uEAAuE;IACvE,gEAAgE;IAChE,sEAAsE;IACtE,uEAAuE;IACvE,MAAM,aAAa,GAAuB,KAAK,CAAC,IAAI,KAAK,iBAAiB;QACtE,CAAC,CAAC,IAAI,GAAG,CAAS,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU;YACvB,CAAC,CAAC,IAAI,GAAG,CAAS,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAS,EAAU,EAAE,CAAC,WAAW,CAAC,IAAA,cAAO,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClF,CAAC,CAAC,IAAI,CAAC,CAAC,iCAAiC;IAEjD,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,MAAM,WAAW,IAAI,IAAA,iCAAoB,GAAE,EAAE,CAAC;QAC/C,MAAM,CAAC,GAAwB,sBAAsB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAClF,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,2BAA2B,CAAC,IAAY;IAC7C,MAAM,OAAO,GAAW,IAAA,iBAAU,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,cAAO,EAAC,IAAI,CAAC,CAAC;IAChE,IAAI,CAAC,IAAA,eAAU,EAAC,OAAO,CAAC,EAAE,CAAC;QACvB,eAAM,CAAC,KAAK,CAAC,wCAAwC,OAAO,gBAAgB,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,eAAM,CAAC,KAAK,CAAC,wCAAwC,OAAO,uBAAuB,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,sEAAsE;IACtE,kEAAkE;IAClE,OAAO,sBAAsB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC1B,IAAI,CAAC;QACD,OAAO,IAAA,iBAAY,EAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACL,iEAAiE;QACjE,6DAA6D;QAC7D,qDAAqD;QACrD,OAAO,CAAC,CAAC;IACb,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAAC,WAAmB,EAAE,aAAiC;IAClF,MAAM,SAAS,GAAkB,IAAA,qCAAwB,EAAC,WAAW,CAAC,CAAC;IACvE,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACrB,eAAM,CAAC,KAAK,CAAC,mDAAmD,WAAW,aAAa,CAAC,CAAC;QAC1F,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,IAAI,GAA2B,eAAe,CAAC,WAAW,CAAC,CAAC;IAClE,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAChB,eAAM,CAAC,KAAK,CAAC,2BAA2B,WAAW,2CAA2C,CAAC,CAAC;QAChG,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,aAAa,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACzD,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,OAAe,CAAC;IACpB,IAAI,SAAiB,CAAC;IACtB,IAAI,CAAC;QACD,MAAM,CAAC,GAAgC,IAAA,aAAQ,EAAC,WAAW,CAAC,CAAC;QAC7D,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QACpB,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC;IACvB,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,gCAAgC,WAAW,aAAa,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3G,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,cAAc,GAAW,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,eAAM,CAAC,KAAK,CAAC,2BAA2B,WAAW,2CAA2C,IAAI,CAAC,SAAS,aAAa,CAAC,CAAC;QAC3H,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO;QACH,MAAM,EAAE,OAAO;QACf,SAAS;QACT,cAAc,EAAE,WAAW;QAC3B,UAAU,EAAE,IAAI,CAAC,GAAG;QACpB,iEAAiE;QACjE,qEAAqE;QACrE,kEAAkE;QAClE,kEAAkE;QAClE,iEAAiE;QACjE,6DAA6D;QAC7D,qCAAqC;QACrC,WAAW,EAAE,IAAA,4BAAkB,EAAC,IAAI,CAAC,GAAG,CAAC;QACzC,cAAc;QACd,OAAO;QACP,SAAS;KACZ,CAAC;AACN,CAAC;AAOD;;;;;GAKG;AACH,SAAS,eAAe,CAAC,WAAmB;IACxC,MAAM,QAAQ,GAAW,CAAC,GAAG,IAAI,CAAC;IAClC,IAAI,EAAU,CAAC;IACf,IAAI,CAAC;QACD,EAAE,GAAG,IAAA,aAAQ,EAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,SAAiB,CAAC;IACtB,IAAI,CAAC;QACD,MAAM,GAAG,GAAW,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,CAAC,GAAW,IAAA,aAAQ,EAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,IAAI,GAAW,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAW,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9C,SAAS,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACL,+DAA+D;QAC/D,uDAAuD;QACvD,OAAO,IAAI,CAAC;IAChB,CAAC;YAAS,CAAC;QACP,IAAI,CAAC;YAAC,IAAA,cAAS,EAAC,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,GAAG,GAA4B,MAAiC,CAAC;IACvE,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,OAAO,GAAY,GAAG,CAAC,OAAO,CAAC;IACrC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5E,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,CAAC,GAA4B,OAAkC,CAAC;IACtE,MAAM,GAAG,GAAY,CAAC,CAAC,GAAG,CAAC;IAC3B,MAAM,SAAS,GAAY,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC;IACxD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzG,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * IronBee CLI — Codex import file_change derivation.
3
+ *
4
+ * One `file_change` event per file entry inside each `apply_patch`
5
+ * function_call body. Parses the patch via the SAME `parseApplyPatchBody`
6
+ * that the live `clear-verdict` hook uses, so live and import agree
7
+ * byte-for-byte on operation + line counts.
8
+ *
9
+ * Filtered by the project's `verifyPatterns` config (a Write of `foo.test.ts`
10
+ * generates no event when the verify cycle excludes test files).
11
+ *
12
+ * `changeset` parity: live emits a hunks-only V4A per-file slice as the
13
+ * captureChangeset FALLBACK (clear-verdict.ts:284-285 — used when the
14
+ * PreToolUse stash is missing or the unified-diff build fails). The same
15
+ * `e.body` slice is available offline from `parseApplyPatchBody`. When the
16
+ * operator has `fileChange.captureChangeset: true` we emit it here too —
17
+ * without parity, re-import overwrites the live `changeset` field with
18
+ * `undefined` via `(session_id, id)` latest-wins dedup. We deliberately
19
+ * skip the unified-diff primary path: that requires the prior file content
20
+ * which import predates (working tree has moved on).
21
+ */
22
+ import { FileChangeAction } from "../../../hooks/core/actions";
23
+ export interface BuildCodexFileChangeOpts {
24
+ sessionId: string;
25
+ projectName: string;
26
+ projectDir: string;
27
+ /** Parent turn's activity_id. */
28
+ activityId: string;
29
+ /** `call_id` of the apply_patch call — drives event id derivation. */
30
+ callId: string;
31
+ /** ISO-8601 timestamp from the rollout line. */
32
+ timestamp: string;
33
+ /** Raw `apply_patch.arguments.input` body string. */
34
+ patchBody: string;
35
+ }
36
+ /**
37
+ * Parse the patch body and produce one event per file. Returns an empty
38
+ * array when (a) the body is unparseable, (b) every entry's path is
39
+ * ignored, or (c) every entry's path doesn't match any active cycle.
40
+ */
41
+ export declare function buildCodexFileChanges(opts: BuildCodexFileChangeOpts): FileChangeAction[];
42
+ //# sourceMappingURL=file-change.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-change.d.ts","sourceRoot":"","sources":["../../../../src/import/codex/events/file-change.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,gBAAgB,EAAuB,MAAM,6BAA6B,CAAC;AAWpF,MAAM,WAAW,wBAAwB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,wBAAwB,GAAG,gBAAgB,EAAE,CA2DxF"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee CLI — Codex import file_change derivation.
4
+ *
5
+ * One `file_change` event per file entry inside each `apply_patch`
6
+ * function_call body. Parses the patch via the SAME `parseApplyPatchBody`
7
+ * that the live `clear-verdict` hook uses, so live and import agree
8
+ * byte-for-byte on operation + line counts.
9
+ *
10
+ * Filtered by the project's `verifyPatterns` config (a Write of `foo.test.ts`
11
+ * generates no event when the verify cycle excludes test files).
12
+ *
13
+ * `changeset` parity: live emits a hunks-only V4A per-file slice as the
14
+ * captureChangeset FALLBACK (clear-verdict.ts:284-285 — used when the
15
+ * PreToolUse stash is missing or the unified-diff build fails). The same
16
+ * `e.body` slice is available offline from `parseApplyPatchBody`. When the
17
+ * operator has `fileChange.captureChangeset: true` we emit it here too —
18
+ * without parity, re-import overwrites the live `changeset` field with
19
+ * `undefined` via `(session_id, id)` latest-wins dedup. We deliberately
20
+ * skip the unified-diff primary path: that requires the prior file content
21
+ * which import predates (working tree has moved on).
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.buildCodexFileChanges = buildCodexFileChanges;
25
+ const clear_verdict_1 = require("../../../clients/codex/hooks/clear-verdict");
26
+ const config_1 = require("../../../lib/config");
27
+ const ids_1 = require("../../ids");
28
+ /**
29
+ * Parse the patch body and produce one event per file. Returns an empty
30
+ * array when (a) the body is unparseable, (b) every entry's path is
31
+ * ignored, or (c) every entry's path doesn't match any active cycle.
32
+ */
33
+ function buildCodexFileChanges(opts) {
34
+ const config = (0, config_1.loadConfig)(opts.projectDir);
35
+ let entries;
36
+ try {
37
+ entries = (0, clear_verdict_1.parseApplyPatchBody)(opts.patchBody);
38
+ }
39
+ catch {
40
+ return [];
41
+ }
42
+ const captureChangeset = (0, config_1.getCaptureFileChangeset)(config);
43
+ const maxChangesetBytes = (0, config_1.getMaxChangesetBytes)(config);
44
+ const events = [];
45
+ const tsMs = Date.parse(opts.timestamp);
46
+ const stamp = Number.isFinite(tsMs) ? tsMs : Date.now();
47
+ for (let i = 0; i < entries.length; i++) {
48
+ const e = entries[i];
49
+ if (!shouldEmit(config, e.path)) {
50
+ continue;
51
+ }
52
+ const op = e.operation;
53
+ // Multi-file patches share one call_id — qualify the event id with
54
+ // the entry index + file path so each emits a distinct UUID.
55
+ const event = {
56
+ id: (0, ids_1.deriveFileChangeEventId)(opts.sessionId, `${opts.callId}:${i}:${e.path}`),
57
+ type: "file_change",
58
+ timestamp: stamp,
59
+ session_id: opts.sessionId,
60
+ project_name: opts.projectName,
61
+ activity_id: opts.activityId,
62
+ // Cross-event vocab parity (round 68). See clear-verdict.ts for
63
+ // full rationale: tool_call.tool_name ships "Edit" (round 67)
64
+ // and session_analytics.tools["Edit"] aggregates (round 66), so
65
+ // file_change must use the same alias to keep the backend
66
+ // tool_call ↔ file_change JOIN on tool_name working. Live ↔
67
+ // import parity: this matches `clear-verdict.ts:255`.
68
+ tool_name: "Edit",
69
+ file_path: e.path,
70
+ operation: op,
71
+ // Live parity (clear-verdict.ts). DELETE: BOTH null (whole file
72
+ // removed; prior content unrecoverable; parser's 0 isn't
73
+ // meaningful). CREATE: `lines_removed: 0` — new file has zero
74
+ // prior content, so zero lines were removed. Cross-client
75
+ // parity with Claude Write-create (clients/claude/hooks/
76
+ // clear-verdict.ts:77 + import/claude/events/file-change.ts:85).
77
+ // UPDATE: both real counts.
78
+ lines_added: op === "delete" ? null : e.linesAdded,
79
+ lines_removed: op === "delete" ? null : (op === "create" ? 0 : e.linesRemoved),
80
+ };
81
+ // Live parity for `changeset`: mirror the V4A fallback path
82
+ // (clear-verdict.ts:284-285). `e.body` is hunks-only per-file slice
83
+ // parsed from the rollout's apply_patch body — same source the live
84
+ // fallback uses. Without this, re-import dedup
85
+ // (`(session_id, id)` latest-wins) overwrites live's `changeset`
86
+ // field with `undefined` and the warehouse loses the diff.
87
+ if (captureChangeset && e.body.length > 0) {
88
+ event.changeset = truncateChangeset(e.body, maxChangesetBytes);
89
+ }
90
+ events.push(event);
91
+ }
92
+ return events;
93
+ }
94
+ /**
95
+ * Hunks-only truncation. Mirror of live's `truncateChangeset` in
96
+ * clear-verdict.ts (same head + footer shape) so the wire string is
97
+ * byte-identical when the body fits and footer-identical on overflow.
98
+ */
99
+ function truncateChangeset(s, maxBytes) {
100
+ if (maxBytes <= 0) {
101
+ return s;
102
+ }
103
+ const buf = Buffer.from(s, "utf-8");
104
+ if (buf.length <= maxBytes) {
105
+ return s;
106
+ }
107
+ const omitted = buf.length - maxBytes;
108
+ const footer = `\n... (truncated, ${omitted} bytes omitted)\n`;
109
+ const footerLen = Buffer.byteLength(footer, "utf-8");
110
+ const headLen = Math.max(0, maxBytes - footerLen);
111
+ const head = buf.subarray(0, headLen).toString("utf-8");
112
+ return head + footer;
113
+ }
114
+ /**
115
+ * Verify-pattern gate. Mirrors what live mode emits: a file_change is on
116
+ * the wire only when `requiresVerification(filePath, config)` returns true
117
+ * — i.e. some cycle's verifyPatterns matches AND the file isn't on the
118
+ * cross-cycle ignore list. Pre-fix import emitted every patch entry
119
+ * unconditionally, which is louder than live + a privacy concern for
120
+ * patterns the operator explicitly excluded.
121
+ */
122
+ function shouldEmit(config, filePath) {
123
+ return (0, config_1.requiresVerification)(filePath, config);
124
+ }
125
+ //# sourceMappingURL=file-change.js.map