@ironbee-ai/cli 0.15.0 → 0.17.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 (494) hide show
  1. package/CHANGELOG.md +8 -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 +26 -4
  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 +20 -1
  100. package/dist/clients/claude/hooks/clear-verdict.js.map +1 -1
  101. package/dist/clients/claude/hooks/require-verdict.d.ts +8 -1
  102. package/dist/clients/claude/hooks/require-verdict.d.ts.map +1 -1
  103. package/dist/clients/claude/hooks/require-verdict.js +9 -2
  104. package/dist/clients/claude/hooks/require-verdict.js.map +1 -1
  105. package/dist/clients/claude/hooks/require-verification.d.ts +10 -1
  106. package/dist/clients/claude/hooks/require-verification.d.ts.map +1 -1
  107. package/dist/clients/claude/hooks/require-verification.js +34 -6
  108. package/dist/clients/claude/hooks/require-verification.js.map +1 -1
  109. package/dist/clients/claude/hooks/session-end.d.ts.map +1 -1
  110. package/dist/clients/claude/hooks/session-end.js +7 -1
  111. package/dist/clients/claude/hooks/session-end.js.map +1 -1
  112. package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
  113. package/dist/clients/claude/hooks/session-start.js +7 -1
  114. package/dist/clients/claude/hooks/session-start.js.map +1 -1
  115. package/dist/clients/claude/hooks/session-status.d.ts.map +1 -1
  116. package/dist/clients/claude/hooks/session-status.js +13 -9
  117. package/dist/clients/claude/hooks/session-status.js.map +1 -1
  118. package/dist/clients/claude/hooks/track-action.d.ts.map +1 -1
  119. package/dist/clients/claude/hooks/track-action.js +26 -1
  120. package/dist/clients/claude/hooks/track-action.js.map +1 -1
  121. package/dist/clients/claude/hooks/verify-gate.d.ts.map +1 -1
  122. package/dist/clients/claude/hooks/verify-gate.js +8 -1
  123. package/dist/clients/claude/hooks/verify-gate.js.map +1 -1
  124. package/dist/clients/claude/index.d.ts +7 -2
  125. package/dist/clients/claude/index.d.ts.map +1 -1
  126. package/dist/clients/claude/index.js +72 -32
  127. package/dist/clients/claude/index.js.map +1 -1
  128. package/dist/clients/claude/util.d.ts.map +1 -1
  129. package/dist/clients/claude/util.js +55 -0
  130. package/dist/clients/claude/util.js.map +1 -1
  131. package/dist/clients/codex/commands/ironbee-verify/SKILL.md +58 -0
  132. package/dist/clients/codex/hooks/activity-end.d.ts +9 -0
  133. package/dist/clients/codex/hooks/activity-end.d.ts.map +1 -0
  134. package/dist/clients/codex/hooks/activity-end.js +65 -0
  135. package/dist/clients/codex/hooks/activity-end.js.map +1 -0
  136. package/dist/clients/codex/hooks/activity-start.d.ts +17 -0
  137. package/dist/clients/codex/hooks/activity-start.d.ts.map +1 -0
  138. package/dist/clients/codex/hooks/activity-start.js +38 -0
  139. package/dist/clients/codex/hooks/activity-start.js.map +1 -0
  140. package/dist/clients/codex/hooks/clear-verdict.d.ts +55 -0
  141. package/dist/clients/codex/hooks/clear-verdict.d.ts.map +1 -0
  142. package/dist/clients/codex/hooks/clear-verdict.js +303 -0
  143. package/dist/clients/codex/hooks/clear-verdict.js.map +1 -0
  144. package/dist/clients/codex/hooks/require-verdict.d.ts +36 -0
  145. package/dist/clients/codex/hooks/require-verdict.d.ts.map +1 -0
  146. package/dist/clients/codex/hooks/require-verdict.js +115 -0
  147. package/dist/clients/codex/hooks/require-verdict.js.map +1 -0
  148. package/dist/clients/codex/hooks/require-verification.d.ts +20 -0
  149. package/dist/clients/codex/hooks/require-verification.d.ts.map +1 -0
  150. package/dist/clients/codex/hooks/require-verification.js +156 -0
  151. package/dist/clients/codex/hooks/require-verification.js.map +1 -0
  152. package/dist/clients/codex/hooks/session-start.d.ts +10 -0
  153. package/dist/clients/codex/hooks/session-start.d.ts.map +1 -0
  154. package/dist/clients/codex/hooks/session-start.js +94 -0
  155. package/dist/clients/codex/hooks/session-start.js.map +1 -0
  156. package/dist/clients/codex/hooks/track-action-monitor.d.ts +10 -0
  157. package/dist/clients/codex/hooks/track-action-monitor.d.ts.map +1 -0
  158. package/dist/clients/codex/hooks/track-action-monitor.js +168 -0
  159. package/dist/clients/codex/hooks/track-action-monitor.js.map +1 -0
  160. package/dist/clients/codex/hooks/track-action-pre.d.ts +18 -0
  161. package/dist/clients/codex/hooks/track-action-pre.d.ts.map +1 -0
  162. package/dist/clients/codex/hooks/track-action-pre.js +35 -0
  163. package/dist/clients/codex/hooks/track-action-pre.js.map +1 -0
  164. package/dist/clients/codex/hooks/track-action.d.ts +22 -0
  165. package/dist/clients/codex/hooks/track-action.d.ts.map +1 -0
  166. package/dist/clients/codex/hooks/track-action.js +350 -0
  167. package/dist/clients/codex/hooks/track-action.js.map +1 -0
  168. package/dist/clients/codex/hooks/verify-gate.d.ts +15 -0
  169. package/dist/clients/codex/hooks/verify-gate.d.ts.map +1 -0
  170. package/dist/clients/codex/hooks/verify-gate.js +105 -0
  171. package/dist/clients/codex/hooks/verify-gate.js.map +1 -0
  172. package/dist/clients/codex/index.d.ts +52 -0
  173. package/dist/clients/codex/index.d.ts.map +1 -0
  174. package/dist/clients/codex/index.js +463 -0
  175. package/dist/clients/codex/index.js.map +1 -0
  176. package/dist/clients/codex/platforms/command-verify.backend.md +108 -0
  177. package/dist/clients/codex/platforms/command-verify.browser.md +108 -0
  178. package/dist/clients/codex/platforms/command-verify.node.md +61 -0
  179. package/dist/clients/codex/platforms/rule.backend.md +32 -0
  180. package/dist/clients/codex/platforms/rule.browser.md +17 -0
  181. package/dist/clients/codex/platforms/rule.node.md +28 -0
  182. package/dist/clients/codex/platforms/skill.backend.md +95 -0
  183. package/dist/clients/codex/platforms/skill.browser.md +28 -0
  184. package/dist/clients/codex/platforms/skill.node.md +62 -0
  185. package/dist/clients/codex/rules/ironbee-verification.md +48 -0
  186. package/dist/clients/codex/skills/ironbee-verification.md +80 -0
  187. package/dist/clients/codex/util.d.ts +193 -0
  188. package/dist/clients/codex/util.d.ts.map +1 -0
  189. package/dist/clients/codex/util.js +784 -0
  190. package/dist/clients/codex/util.js.map +1 -0
  191. package/dist/clients/cursor/hooks/activity-end.js +1 -1
  192. package/dist/clients/cursor/hooks/activity-end.js.map +1 -1
  193. package/dist/clients/cursor/hooks/clear-verdict.d.ts +5 -2
  194. package/dist/clients/cursor/hooks/clear-verdict.d.ts.map +1 -1
  195. package/dist/clients/cursor/hooks/clear-verdict.js +16 -4
  196. package/dist/clients/cursor/hooks/clear-verdict.js.map +1 -1
  197. package/dist/clients/cursor/hooks/require-verdict.d.ts +7 -1
  198. package/dist/clients/cursor/hooks/require-verdict.d.ts.map +1 -1
  199. package/dist/clients/cursor/hooks/require-verdict.js +8 -2
  200. package/dist/clients/cursor/hooks/require-verdict.js.map +1 -1
  201. package/dist/clients/cursor/hooks/require-verification.d.ts +8 -1
  202. package/dist/clients/cursor/hooks/require-verification.d.ts.map +1 -1
  203. package/dist/clients/cursor/hooks/require-verification.js +27 -6
  204. package/dist/clients/cursor/hooks/require-verification.js.map +1 -1
  205. package/dist/clients/cursor/hooks/session-end.js +1 -1
  206. package/dist/clients/cursor/hooks/session-end.js.map +1 -1
  207. package/dist/clients/cursor/hooks/verify-gate.d.ts.map +1 -1
  208. package/dist/clients/cursor/hooks/verify-gate.js +6 -1
  209. package/dist/clients/cursor/hooks/verify-gate.js.map +1 -1
  210. package/dist/clients/cursor/index.d.ts +7 -2
  211. package/dist/clients/cursor/index.d.ts.map +1 -1
  212. package/dist/clients/cursor/index.js +69 -30
  213. package/dist/clients/cursor/index.js.map +1 -1
  214. package/dist/clients/registry.d.ts.map +1 -1
  215. package/dist/clients/registry.js +2 -1
  216. package/dist/clients/registry.js.map +1 -1
  217. package/dist/commands/{claude.d.ts → claude/index.d.ts} +1 -1
  218. package/dist/commands/claude/index.d.ts.map +1 -0
  219. package/dist/commands/{claude.js → claude/index.js} +12 -6
  220. package/dist/commands/claude/index.js.map +1 -0
  221. package/dist/commands/{otel.d.ts → claude/otel.d.ts} +5 -1
  222. package/dist/commands/claude/otel.d.ts.map +1 -0
  223. package/dist/commands/{otel.js → claude/otel.js} +9 -5
  224. package/dist/commands/claude/otel.js.map +1 -0
  225. package/dist/commands/claude/process-analytics.d.ts +19 -0
  226. package/dist/commands/claude/process-analytics.d.ts.map +1 -0
  227. package/dist/commands/{process-analytics.js → claude/process-analytics.js} +16 -15
  228. package/dist/commands/claude/process-analytics.js.map +1 -0
  229. package/dist/commands/{statusline-toggle.d.ts → claude/statusline-toggle.d.ts} +2 -2
  230. package/dist/commands/claude/statusline-toggle.d.ts.map +1 -0
  231. package/dist/commands/{statusline-toggle.js → claude/statusline-toggle.js} +8 -8
  232. package/dist/commands/claude/statusline-toggle.js.map +1 -0
  233. package/dist/commands/{statusline.d.ts → claude/statusline.d.ts} +1 -1
  234. package/dist/commands/claude/statusline.d.ts.map +1 -0
  235. package/dist/commands/{statusline.js → claude/statusline.js} +4 -4
  236. package/dist/commands/claude/statusline.js.map +1 -0
  237. package/dist/commands/codex/index.d.ts +11 -0
  238. package/dist/commands/codex/index.d.ts.map +1 -0
  239. package/dist/commands/codex/index.js +17 -0
  240. package/dist/commands/codex/index.js.map +1 -0
  241. package/dist/commands/codex/process-analytics.d.ts +14 -0
  242. package/dist/commands/codex/process-analytics.d.ts.map +1 -0
  243. package/dist/commands/codex/process-analytics.js +111 -0
  244. package/dist/commands/codex/process-analytics.js.map +1 -0
  245. package/dist/commands/hook.js +16 -2
  246. package/dist/commands/hook.js.map +1 -1
  247. package/dist/commands/import.js +3 -3
  248. package/dist/commands/import.js.map +1 -1
  249. package/dist/commands/queue.js +3 -1
  250. package/dist/commands/queue.js.map +1 -1
  251. package/dist/commands/verification-toggle.d.ts +19 -0
  252. package/dist/commands/verification-toggle.d.ts.map +1 -1
  253. package/dist/commands/verification-toggle.js +88 -5
  254. package/dist/commands/verification-toggle.js.map +1 -1
  255. package/dist/commands/verification.d.ts +3 -0
  256. package/dist/commands/verification.d.ts.map +1 -1
  257. package/dist/commands/verification.js +34 -3
  258. package/dist/commands/verification.js.map +1 -1
  259. package/dist/hooks/core/actions.d.ts +17 -1
  260. package/dist/hooks/core/actions.d.ts.map +1 -1
  261. package/dist/hooks/core/actions.js +13 -0
  262. package/dist/hooks/core/actions.js.map +1 -1
  263. package/dist/hooks/core/activity-end.d.ts +8 -0
  264. package/dist/hooks/core/activity-end.d.ts.map +1 -1
  265. package/dist/hooks/core/activity-end.js +19 -0
  266. package/dist/hooks/core/activity-end.js.map +1 -1
  267. package/dist/hooks/core/session-state.d.ts +15 -1
  268. package/dist/hooks/core/session-state.d.ts.map +1 -1
  269. package/dist/hooks/core/session-state.js +102 -7
  270. package/dist/hooks/core/session-state.js.map +1 -1
  271. package/dist/hooks/core/submit-verdict.d.ts.map +1 -1
  272. package/dist/hooks/core/submit-verdict.js +29 -17
  273. package/dist/hooks/core/submit-verdict.js.map +1 -1
  274. package/dist/hooks/core/verification-lifecycle.d.ts +20 -0
  275. package/dist/hooks/core/verification-lifecycle.d.ts.map +1 -1
  276. package/dist/hooks/core/verification-lifecycle.js +41 -0
  277. package/dist/hooks/core/verification-lifecycle.js.map +1 -1
  278. package/dist/hooks/core/verify-gate.d.ts.map +1 -1
  279. package/dist/hooks/core/verify-gate.js +11 -5
  280. package/dist/hooks/core/verify-gate.js.map +1 -1
  281. package/dist/import/claude/analytics-runner.d.ts +1 -1
  282. package/dist/import/claude/analytics-runner.d.ts.map +1 -1
  283. package/dist/import/claude/analytics-runner.js +5 -5
  284. package/dist/import/claude/analytics-runner.js.map +1 -1
  285. package/dist/import/claude/auth-mode.d.ts +1 -1
  286. package/dist/import/claude/auth-mode.d.ts.map +1 -1
  287. package/dist/import/claude/discovery.js +1 -1
  288. package/dist/import/claude/discovery.js.map +1 -1
  289. package/dist/import/claude/encoding.js +1 -1
  290. package/dist/import/claude/encoding.js.map +1 -1
  291. package/dist/import/claude/events/file-change.d.ts +10 -1
  292. package/dist/import/claude/events/file-change.d.ts.map +1 -1
  293. package/dist/import/claude/events/file-change.js +79 -5
  294. package/dist/import/claude/events/file-change.js.map +1 -1
  295. package/dist/import/claude/events/tool-call.d.ts +16 -1
  296. package/dist/import/claude/events/tool-call.d.ts.map +1 -1
  297. package/dist/import/claude/events/tool-call.js +122 -15
  298. package/dist/import/claude/events/tool-call.js.map +1 -1
  299. package/dist/import/claude/runner.d.ts.map +1 -1
  300. package/dist/import/claude/runner.js +45 -3
  301. package/dist/import/claude/runner.js.map +1 -1
  302. package/dist/import/claude/summary.js +1 -1
  303. package/dist/import/claude/summary.js.map +1 -1
  304. package/dist/import/claude/transcript-walk.d.ts +1 -1
  305. package/dist/import/claude/transcript-walk.d.ts.map +1 -1
  306. package/dist/import/claude/transcript-walk.js +11 -4
  307. package/dist/import/claude/transcript-walk.js.map +1 -1
  308. package/dist/import/codex/analytics-runner.d.ts +46 -0
  309. package/dist/import/codex/analytics-runner.d.ts.map +1 -0
  310. package/dist/import/codex/analytics-runner.js +116 -0
  311. package/dist/import/codex/analytics-runner.js.map +1 -0
  312. package/dist/import/codex/discovery.d.ts +33 -0
  313. package/dist/import/codex/discovery.d.ts.map +1 -0
  314. package/dist/import/codex/discovery.js +202 -0
  315. package/dist/import/codex/discovery.js.map +1 -0
  316. package/dist/import/codex/events/file-change.d.ts +42 -0
  317. package/dist/import/codex/events/file-change.d.ts.map +1 -0
  318. package/dist/import/codex/events/file-change.js +125 -0
  319. package/dist/import/codex/events/file-change.js.map +1 -0
  320. package/dist/import/codex/events/tool-call.d.ts +49 -0
  321. package/dist/import/codex/events/tool-call.d.ts.map +1 -0
  322. package/dist/import/codex/events/tool-call.js +151 -0
  323. package/dist/import/codex/events/tool-call.js.map +1 -0
  324. package/dist/import/codex/runner.d.ts +34 -0
  325. package/dist/import/codex/runner.d.ts.map +1 -0
  326. package/dist/import/codex/runner.js +456 -0
  327. package/dist/import/codex/runner.js.map +1 -0
  328. package/dist/import/codex/summary.d.ts +20 -0
  329. package/dist/import/codex/summary.d.ts.map +1 -0
  330. package/dist/import/codex/summary.js +206 -0
  331. package/dist/import/codex/summary.js.map +1 -0
  332. package/dist/import/events/activity.d.ts.map +1 -1
  333. package/dist/import/events/activity.js +17 -2
  334. package/dist/import/events/activity.js.map +1 -1
  335. package/dist/import/events/session.d.ts +11 -1
  336. package/dist/import/events/session.d.ts.map +1 -1
  337. package/dist/import/events/session.js +19 -1
  338. package/dist/import/events/session.js.map +1 -1
  339. package/dist/import/ids.js +3 -3
  340. package/dist/import/ids.js.map +1 -1
  341. package/dist/import/pipeline.d.ts +22 -15
  342. package/dist/import/pipeline.d.ts.map +1 -1
  343. package/dist/import/pipeline.js +99 -18
  344. package/dist/import/pipeline.js.map +1 -1
  345. package/dist/import/types.d.ts +4 -0
  346. package/dist/import/types.d.ts.map +1 -1
  347. package/dist/import/types.js.map +1 -1
  348. package/dist/index.js +9 -11
  349. package/dist/index.js.map +1 -1
  350. package/dist/lib/collector.d.ts +2 -1
  351. package/dist/lib/collector.d.ts.map +1 -1
  352. package/dist/lib/collector.js +28 -3
  353. package/dist/lib/collector.js.map +1 -1
  354. package/dist/lib/config.d.ts +40 -0
  355. package/dist/lib/config.d.ts.map +1 -1
  356. package/dist/lib/config.js +52 -1
  357. package/dist/lib/config.js.map +1 -1
  358. package/dist/lib/event.d.ts +18 -1
  359. package/dist/lib/event.d.ts.map +1 -1
  360. package/dist/lib/event.js +25 -1
  361. package/dist/lib/event.js.map +1 -1
  362. package/dist/lib/platform-section.d.ts.map +1 -1
  363. package/dist/lib/platform-section.js +8 -0
  364. package/dist/lib/platform-section.js.map +1 -1
  365. package/dist/otel/{context → claude/context}/build.d.ts +1 -1
  366. package/dist/otel/claude/context/build.d.ts.map +1 -0
  367. package/dist/otel/{context → claude/context}/build.js +3 -7
  368. package/dist/otel/claude/context/build.js.map +1 -0
  369. package/dist/otel/claude/context/classify.d.ts.map +1 -0
  370. package/dist/otel/claude/context/classify.js.map +1 -0
  371. package/dist/otel/{context → claude/context}/extract.d.ts +1 -1
  372. package/dist/otel/claude/context/extract.d.ts.map +1 -0
  373. package/dist/otel/claude/context/extract.js.map +1 -0
  374. package/dist/otel/claude/context/markers.d.ts.map +1 -0
  375. package/dist/otel/{context → claude/context}/markers.js +22 -3
  376. package/dist/otel/claude/context/markers.js.map +1 -0
  377. package/dist/otel/claude/context/util.d.ts.map +1 -0
  378. package/dist/otel/claude/context/util.js.map +1 -0
  379. package/dist/otel/{daemon → claude/daemon}/ensure.d.ts +1 -1
  380. package/dist/otel/claude/daemon/ensure.d.ts.map +1 -0
  381. package/dist/otel/{daemon → claude/daemon}/ensure.js +6 -6
  382. package/dist/otel/claude/daemon/ensure.js.map +1 -0
  383. package/dist/otel/{daemon → claude/daemon}/forward.d.ts +1 -1
  384. package/dist/otel/claude/daemon/forward.d.ts.map +1 -0
  385. package/dist/otel/{daemon → claude/daemon}/forward.js +0 -0
  386. package/dist/otel/claude/daemon/forward.js.map +1 -0
  387. package/dist/otel/claude/daemon/paths.d.ts.map +1 -0
  388. package/dist/otel/claude/daemon/paths.js.map +1 -0
  389. package/dist/otel/{daemon → claude/daemon}/process.d.ts +1 -1
  390. package/dist/otel/claude/daemon/process.d.ts.map +1 -0
  391. package/dist/otel/{daemon → claude/daemon}/process.js +1 -1
  392. package/dist/otel/claude/daemon/process.js.map +1 -0
  393. package/dist/otel/claude/daemon/reprocess.d.ts.map +1 -0
  394. package/dist/otel/{daemon → claude/daemon}/reprocess.js +2 -2
  395. package/dist/otel/claude/daemon/reprocess.js.map +1 -0
  396. package/dist/otel/claude/log-handler.d.ts.map +1 -0
  397. package/dist/otel/{log-handler.js → claude/log-handler.js} +1 -1
  398. package/dist/otel/claude/log-handler.js.map +1 -0
  399. package/dist/otel/collector.js +4 -4
  400. package/dist/otel/collector.js.map +1 -1
  401. package/dist/queue/flush.d.ts +23 -0
  402. package/dist/queue/flush.d.ts.map +1 -1
  403. package/dist/queue/flush.js +44 -0
  404. package/dist/queue/flush.js.map +1 -1
  405. package/dist/queue/handlers/send-event.d.ts.map +1 -1
  406. package/dist/queue/handlers/send-event.js +5 -4
  407. package/dist/queue/handlers/send-event.js.map +1 -1
  408. package/dist/queue/index.d.ts +2 -2
  409. package/dist/queue/index.d.ts.map +1 -1
  410. package/dist/queue/index.js +4 -1
  411. package/dist/queue/index.js.map +1 -1
  412. package/dist/queue/spawn.d.ts +20 -0
  413. package/dist/queue/spawn.d.ts.map +1 -1
  414. package/dist/queue/spawn.js +37 -0
  415. package/dist/queue/spawn.js.map +1 -1
  416. package/dist/tui/config/schema.d.ts.map +1 -1
  417. package/dist/tui/config/schema.js +8 -0
  418. package/dist/tui/config/schema.js.map +1 -1
  419. package/dist/tui/import/area.js +3 -3
  420. package/dist/tui/import/area.js.map +1 -1
  421. package/package.json +2 -1
  422. package/dist/analytics/classifier.d.ts.map +0 -1
  423. package/dist/analytics/classifier.js.map +0 -1
  424. package/dist/analytics/emit.d.ts.map +0 -1
  425. package/dist/analytics/emit.js.map +0 -1
  426. package/dist/analytics/errors.d.ts.map +0 -1
  427. package/dist/analytics/errors.js.map +0 -1
  428. package/dist/analytics/hook-trigger.d.ts.map +0 -1
  429. package/dist/analytics/hook-trigger.js.map +0 -1
  430. package/dist/analytics/log.d.ts.map +0 -1
  431. package/dist/analytics/log.js.map +0 -1
  432. package/dist/analytics/merge.d.ts.map +0 -1
  433. package/dist/analytics/merge.js.map +0 -1
  434. package/dist/analytics/pricing.d.ts.map +0 -1
  435. package/dist/analytics/pricing.js.map +0 -1
  436. package/dist/analytics/projection.d.ts.map +0 -1
  437. package/dist/analytics/projection.js.map +0 -1
  438. package/dist/analytics/spawn.d.ts.map +0 -1
  439. package/dist/analytics/spawn.js.map +0 -1
  440. package/dist/analytics/state.d.ts.map +0 -1
  441. package/dist/analytics/state.js.map +0 -1
  442. package/dist/analytics/transcript.d.ts.map +0 -1
  443. package/dist/analytics/transcript.js.map +0 -1
  444. package/dist/analytics/types.d.ts.map +0 -1
  445. package/dist/analytics/types.js.map +0 -1
  446. package/dist/commands/claude.d.ts.map +0 -1
  447. package/dist/commands/claude.js.map +0 -1
  448. package/dist/commands/otel.d.ts.map +0 -1
  449. package/dist/commands/otel.js.map +0 -1
  450. package/dist/commands/process-analytics.d.ts +0 -18
  451. package/dist/commands/process-analytics.d.ts.map +0 -1
  452. package/dist/commands/process-analytics.js.map +0 -1
  453. package/dist/commands/statusline-toggle.d.ts.map +0 -1
  454. package/dist/commands/statusline-toggle.js.map +0 -1
  455. package/dist/commands/statusline.d.ts.map +0 -1
  456. package/dist/commands/statusline.js.map +0 -1
  457. package/dist/otel/context/build.d.ts.map +0 -1
  458. package/dist/otel/context/build.js.map +0 -1
  459. package/dist/otel/context/classify.d.ts.map +0 -1
  460. package/dist/otel/context/classify.js.map +0 -1
  461. package/dist/otel/context/extract.d.ts.map +0 -1
  462. package/dist/otel/context/extract.js.map +0 -1
  463. package/dist/otel/context/markers.d.ts.map +0 -1
  464. package/dist/otel/context/markers.js.map +0 -1
  465. package/dist/otel/context/util.d.ts.map +0 -1
  466. package/dist/otel/context/util.js.map +0 -1
  467. package/dist/otel/daemon/ensure.d.ts.map +0 -1
  468. package/dist/otel/daemon/ensure.js.map +0 -1
  469. package/dist/otel/daemon/forward.d.ts.map +0 -1
  470. package/dist/otel/daemon/forward.js.map +0 -1
  471. package/dist/otel/daemon/paths.d.ts.map +0 -1
  472. package/dist/otel/daemon/paths.js.map +0 -1
  473. package/dist/otel/daemon/process.d.ts.map +0 -1
  474. package/dist/otel/daemon/process.js.map +0 -1
  475. package/dist/otel/daemon/reprocess.d.ts.map +0 -1
  476. package/dist/otel/daemon/reprocess.js.map +0 -1
  477. package/dist/otel/log-handler.d.ts.map +0 -1
  478. package/dist/otel/log-handler.js.map +0 -1
  479. /package/dist/analytics/{log.d.ts → claude/log.d.ts} +0 -0
  480. /package/dist/analytics/{transcript.d.ts → claude/transcript.d.ts} +0 -0
  481. /package/dist/analytics/{classifier.d.ts → shared/classifier.d.ts} +0 -0
  482. /package/dist/analytics/{errors.d.ts → shared/errors.d.ts} +0 -0
  483. /package/dist/analytics/{errors.js → shared/errors.js} +0 -0
  484. /package/dist/analytics/{types.js → shared/types.js} +0 -0
  485. /package/dist/otel/{context → claude/context}/classify.d.ts +0 -0
  486. /package/dist/otel/{context → claude/context}/classify.js +0 -0
  487. /package/dist/otel/{context → claude/context}/extract.js +0 -0
  488. /package/dist/otel/{context → claude/context}/markers.d.ts +0 -0
  489. /package/dist/otel/{context → claude/context}/util.d.ts +0 -0
  490. /package/dist/otel/{context → claude/context}/util.js +0 -0
  491. /package/dist/otel/{daemon → claude/daemon}/paths.d.ts +0 -0
  492. /package/dist/otel/{daemon → claude/daemon}/paths.js +0 -0
  493. /package/dist/otel/{daemon → claude/daemon}/reprocess.d.ts +0 -0
  494. /package/dist/otel/{log-handler.d.ts → claude/log-handler.d.ts} +0 -0
@@ -0,0 +1,303 @@
1
+ "use strict";
2
+ /**
3
+ * Codex — PostToolUse hook adapter (matcher: `apply_patch`)
4
+ *
5
+ * Records `file_change` events for each file touched by the patch (operation
6
+ * classified from the patch body's `*** Add/Update/Delete File:` markers).
7
+ * Then clears the verdict file so the next verification cycle has a fresh
8
+ * slate.
9
+ *
10
+ * NOTE on line counts: Codex's `apply_patch` tool_input contains the patch
11
+ * itself, so we can derive `lines_added` / `lines_removed` directly from
12
+ * patch body parsing (counting `+` / `-` lines per file section) — no need
13
+ * to stash file content from PreToolUse. This is a Codex-specific advantage
14
+ * over Claude's Write+Edit (which only carry final content, not the diff).
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.applyPatchStashKey = applyPatchStashKey;
18
+ exports.parseApplyPatchBody = parseApplyPatchBody;
19
+ exports.run = run;
20
+ const fs_1 = require("fs");
21
+ const path_1 = require("path");
22
+ const actions_1 = require("../../../hooks/core/actions");
23
+ const ids_1 = require("../../../import/ids");
24
+ const clear_verdict_1 = require("../../../hooks/core/clear-verdict");
25
+ const verification_lifecycle_1 = require("../../../hooks/core/verification-lifecycle");
26
+ const file_diff_1 = require("../../../hooks/core/file-diff");
27
+ const session_state_1 = require("../../../hooks/core/session-state");
28
+ const tool_use_stash_1 = require("../../../hooks/core/tool-use-stash");
29
+ const config_1 = require("../../../lib/config");
30
+ const logger_1 = require("../../../lib/logger");
31
+ const output_1 = require("../../../lib/output");
32
+ const stdin_1 = require("../../../lib/stdin");
33
+ const util_1 = require("../util");
34
+ const STASH_KEY_SUFFIX = ".apply-patch";
35
+ /**
36
+ * Returns the tool-use-stash key for the apply_patch prior-content stash.
37
+ * Suffixed so it doesn't collide with `track-action-pre`'s timing stash
38
+ * (which keys on the bare `tool_use_id`).
39
+ */
40
+ function applyPatchStashKey(toolUseId) {
41
+ return `${toolUseId}${STASH_KEY_SUFFIX}`;
42
+ }
43
+ function truncateChangeset(s, maxBytes) {
44
+ if (maxBytes <= 0) {
45
+ return s;
46
+ }
47
+ const buf = Buffer.from(s, "utf-8");
48
+ if (buf.length <= maxBytes) {
49
+ return s;
50
+ }
51
+ const omitted = buf.length - maxBytes;
52
+ const footer = `\n... (truncated, ${omitted} bytes omitted)\n`;
53
+ const footerLen = Buffer.byteLength(footer, "utf-8");
54
+ const headLen = Math.max(0, maxBytes - footerLen);
55
+ const head = buf.subarray(0, headLen).toString("utf-8");
56
+ return head + footer;
57
+ }
58
+ function resolveFilePath(projectDir, entryPath) {
59
+ return (0, path_1.isAbsolute)(entryPath) ? entryPath : (0, path_1.join)(projectDir, entryPath);
60
+ }
61
+ /**
62
+ * Build the standard unified-diff changeset for one file using the
63
+ * PreToolUse stash + the post-state file content on disk. Mirrors
64
+ * Claude's `buildChangeset` so the wire output is identical across
65
+ * clients.
66
+ *
67
+ * Returns `undefined` when the diff can't be produced (binary file,
68
+ * post-state read failure, identical content) — caller falls back to the
69
+ * V4A per-file body slice in that case.
70
+ */
71
+ function buildUnifiedDiffChangeset(projectDir, e, priorContent, maxBytes) {
72
+ const abs = resolveFilePath(projectDir, e.path);
73
+ let postContent;
74
+ try {
75
+ // Delete File: post-state is gone on disk — use empty string.
76
+ postContent = e.operation === "delete" || !(0, fs_1.existsSync)(abs) ? "" : (0, fs_1.readFileSync)(abs, "utf-8");
77
+ }
78
+ catch (err) {
79
+ logger_1.logger.debug(`failed to read post-state of ${abs} for changeset: ${err}`);
80
+ return undefined;
81
+ }
82
+ const prior = priorContent ?? "";
83
+ const diff = (0, file_diff_1.createUnifiedDiff)(prior, postContent, maxBytes);
84
+ return diff ?? undefined;
85
+ }
86
+ /**
87
+ * Parse a Codex `apply_patch` tool_input.input body into per-file entries.
88
+ *
89
+ * Body format (from Codex's apply_patch tool):
90
+ * *** Begin Patch
91
+ * *** Add File: path/to/new.ts
92
+ * +line1
93
+ * +line2
94
+ * *** Update File: path/to/existing.ts
95
+ * @@ ...
96
+ * -old
97
+ * +new
98
+ * *** Delete File: path/to/old.ts
99
+ * *** End Patch
100
+ *
101
+ * Returns one entry per file with operation + line-count tallies.
102
+ */
103
+ function parseApplyPatchBody(body) {
104
+ const entries = [];
105
+ let current = null;
106
+ let currentLines = [];
107
+ const flushCurrent = () => {
108
+ if (current) {
109
+ current.body = currentLines.join("\n");
110
+ entries.push(current);
111
+ current = null;
112
+ currentLines = [];
113
+ }
114
+ };
115
+ const lines = body.split("\n");
116
+ for (const raw of lines) {
117
+ const line = raw;
118
+ const addMatch = line.match(/^\*\*\* Add File: (.+)$/);
119
+ const updateMatch = line.match(/^\*\*\* Update File: (.+)$/);
120
+ const deleteMatch = line.match(/^\*\*\* Delete File: (.+)$/);
121
+ const endMatch = line.match(/^\*\*\* (End Patch|Move to: .+)$/);
122
+ // Headers (`*** Add/Update/Delete File: X`) are PARSED but NOT included
123
+ // in the per-file body slice. `file_path` rides on the event already;
124
+ // including the header would be redundant info on the wire and would
125
+ // diverge from Claude/Cursor changeset shape (which is hunks-only).
126
+ if (addMatch) {
127
+ flushCurrent();
128
+ current = { path: addMatch[1].trim(), operation: "create", linesAdded: 0, linesRemoved: 0, body: "" };
129
+ currentLines = [];
130
+ continue;
131
+ }
132
+ if (updateMatch) {
133
+ flushCurrent();
134
+ current = { path: updateMatch[1].trim(), operation: "update", linesAdded: 0, linesRemoved: 0, body: "" };
135
+ currentLines = [];
136
+ continue;
137
+ }
138
+ if (deleteMatch) {
139
+ flushCurrent();
140
+ current = { path: deleteMatch[1].trim(), operation: "delete", linesAdded: 0, linesRemoved: 0, body: "" };
141
+ currentLines = [];
142
+ continue;
143
+ }
144
+ if (endMatch) {
145
+ flushCurrent();
146
+ continue;
147
+ }
148
+ if (current) {
149
+ currentLines.push(line);
150
+ if (current.operation !== "delete") {
151
+ if (line.startsWith("+") && !line.startsWith("+++")) {
152
+ current.linesAdded += 1;
153
+ }
154
+ else if (line.startsWith("-") && !line.startsWith("---")) {
155
+ current.linesRemoved += 1;
156
+ }
157
+ }
158
+ }
159
+ }
160
+ flushCurrent();
161
+ return entries;
162
+ }
163
+ async function run(projectDir) {
164
+ const input = (0, util_1.parseCodexHookStdin)((0, stdin_1.readStdin)());
165
+ const sessionId = input.session_id ?? "default";
166
+ const sessionDir = `${projectDir}/.ironbee/sessions/${sessionId}`;
167
+ const actionsFile = `${sessionDir}/actions.jsonl`;
168
+ const verdictFile = `${sessionDir}/verdict.json`;
169
+ (0, logger_1.setLogFile)(`${sessionDir}/session.log`);
170
+ // Codex's apply_patch hook stdin shape (live-tested on 0.135.0):
171
+ // tool_input is an object: { "command": "<patch body string>" }
172
+ // For the custom_tool_call wire form Codex normalizes the patch into the
173
+ // `command` field of the hook stdin's tool_input. Fallback to `.input`
174
+ // (function_call shape) and raw-string (defensive) for forward-compat.
175
+ const ti = input.tool_input;
176
+ let patchBody;
177
+ if (typeof ti === "string") {
178
+ patchBody = ti;
179
+ }
180
+ else if (typeof ti === "object" && ti !== null) {
181
+ const rec = ti;
182
+ patchBody = rec.command ?? rec.input;
183
+ }
184
+ if (typeof patchBody === "string") {
185
+ const config = (0, config_1.loadConfig)(projectDir);
186
+ const captureChangeset = (0, config_1.getCaptureFileChangeset)(config);
187
+ const maxChangesetBytes = (0, config_1.getMaxChangesetBytes)(config);
188
+ const entries = parseApplyPatchBody(patchBody);
189
+ const activityId = (0, session_state_1.getActiveActivityId)(sessionDir);
190
+ // Consume the PreToolUse stash ONCE (it's a file-backed consume —
191
+ // second call returns null). May be absent (captureChangeset was
192
+ // off at PreToolUse time, hook dispatch race, missing tool_use_id);
193
+ // in that case we fall back to the V4A per-file body slice for
194
+ // every entry below.
195
+ const toolUseId = input.tool_use_id ?? "";
196
+ const stash = captureChangeset && toolUseId
197
+ ? (0, tool_use_stash_1.consumeToolUseData)(sessionId, applyPatchStashKey(toolUseId))
198
+ : null;
199
+ for (let i = 0; i < entries.length; i++) {
200
+ const e = entries[i];
201
+ if (!(0, config_1.requiresVerification)(e.path, config)) {
202
+ continue;
203
+ }
204
+ // Lazily open a fix cycle on the first qualifying (verifyPattern)
205
+ // edit while the last verdict was a fail. Idempotent across the
206
+ // patch's file entries — opens once, returns the same id after.
207
+ const fixId = await (0, verification_lifecycle_1.openFixCycleIfFixing)({ sessionDir, actionsFile });
208
+ // `fix_id` is FixAwareEvent-required (`string` typing), but the
209
+ // collector schema treats it as a non-empty string when present —
210
+ // emitting `fix_id: ""` literally is rejected. So we omit the
211
+ // field when no fix is active (mirrors Claude live's
212
+ // `getActiveFixId(sessionDir)!` + `JSON.stringify` drop, and the
213
+ // Codex import side which already omits via `as FileChangeAction`
214
+ // cast). The cast here matches that pattern.
215
+ //
216
+ // Same rule for `activity_id` (round 31): ActivityAwareEvent
217
+ // requires it, but empty value is FK-rejected by the collector.
218
+ // Claude/Cursor live use `activityId!` so JSON.stringify drops
219
+ // when undefined; Codex was the outlier shipping literal "".
220
+ const event = {
221
+ ...(0, actions_1.baseFields)(actionsFile),
222
+ type: "file_change",
223
+ timestamp: Date.now(),
224
+ file_path: e.path,
225
+ // Cross-event vocab parity (round 68). For the SAME logical
226
+ // operation, Codex emits a `tool_call` (via track-action.ts)
227
+ // and a `file_change` (here) at the same PostToolUse moment.
228
+ // `tool_call.tool_name` is Claude-aliased to "Edit" (round 67
229
+ // via `normalizeCodexToolName` in `classifyCodexTool`), and
230
+ // `session_analytics.tools["Edit"]` aggregates them (round
231
+ // 66 via `claudeAlias` in `analytics/codex/projection.ts`).
232
+ // Shipping `file_change.tool_name: "apply_patch"` here would
233
+ // leave the backend unable to JOIN `tool_call ↔ file_change`
234
+ // on `(session_id, timestamp, tool_name)` for every Codex
235
+ // apply_patch event. Align with the Claude-alias chain so
236
+ // Codex matches Claude/Cursor's cross-event consistency
237
+ // (both clients ship the SAME literal in both events).
238
+ tool_name: "Edit",
239
+ operation: e.operation,
240
+ // For DELETE: BOTH unknown (whole file removed; prior content
241
+ // never read so we can't count lines; patch body has no `+`/`-`
242
+ // lines so the parser's 0/0 isn't meaningful).
243
+ // For CREATE: `lines_removed: 0` — by definition a new file
244
+ // has zero prior content, so zero lines were removed. This is
245
+ // a concrete known value, not "unknown". Cross-client parity:
246
+ // Claude Write-create ships `lines_removed: 0`
247
+ // (clients/claude/hooks/clear-verdict.ts:77) and import
248
+ // matches (import/claude/events/file-change.ts:85). Backend
249
+ // dashboards filtering `WHERE operation='create' AND
250
+ // lines_removed=0` previously saw only Claude creates;
251
+ // Codex creates were invisible because they shipped null.
252
+ // For UPDATE: both real counts.
253
+ lines_added: e.operation === "delete" ? null : e.linesAdded,
254
+ lines_removed: e.operation === "delete" ? null : (e.operation === "create" ? 0 : e.linesRemoved),
255
+ };
256
+ if (activityId) {
257
+ event.activity_id = activityId;
258
+ }
259
+ if (fixId) {
260
+ event.fix_id = fixId;
261
+ }
262
+ // Live↔import event.id parity. Same pattern as round-19 tool_call
263
+ // fix: import `events/file-change.ts:61` derives id via
264
+ // `deriveFileChangeEventId(sessionId, "${callId}:${i}:${path}")`.
265
+ // Without matching here, every apply_patch's file_change events
266
+ // duplicate in the warehouse on re-import (random UUID live vs
267
+ // deterministic import → backend `(session_id, id)` dedup misses).
268
+ if (toolUseId.length > 0) {
269
+ event.id = (0, ids_1.deriveFileChangeEventId)(sessionId, `${toolUseId}:${i}:${e.path}`);
270
+ }
271
+ if (captureChangeset) {
272
+ // Primary path: standard unified diff via the stash. Matches
273
+ // Claude/Cursor wire shape exactly (hunks with `@@ -A,B +C,D @@`
274
+ // headers, no filename header, line numbers from the actual
275
+ // pre/post content on disk).
276
+ let changeset;
277
+ if (stash && Object.prototype.hasOwnProperty.call(stash.prior_contents, e.path)) {
278
+ changeset = buildUnifiedDiffChangeset(projectDir, e, stash.prior_contents[e.path], maxChangesetBytes);
279
+ }
280
+ // Fallback: Codex V4A per-file body slice (hunks-only, but
281
+ // `@@` separators have no line numbers — Codex's own format).
282
+ // Used when stash is missing (captureChangeset toggled mid-cycle,
283
+ // missing tool_use_id, etc.) or when the unified-diff build
284
+ // failed (binary, post-state read error).
285
+ if (changeset === undefined && e.body.length > 0) {
286
+ changeset = truncateChangeset(e.body, maxChangesetBytes);
287
+ }
288
+ if (changeset !== undefined) {
289
+ event.changeset = changeset;
290
+ }
291
+ }
292
+ await (0, actions_1.appendAction)(actionsFile, event);
293
+ }
294
+ }
295
+ const clearInput = {
296
+ verdictFile,
297
+ sessionDir,
298
+ };
299
+ (0, clear_verdict_1.runClearVerdict)(clearInput);
300
+ logger_1.logger.debug(`clear-verdict: cleared for ${sessionId}`);
301
+ (0, output_1.writeAndExit)(JSON.stringify({}), 0);
302
+ }
303
+ //# sourceMappingURL=clear-verdict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clear-verdict.js","sourceRoot":"","sources":["../../../../src/clients/codex/hooks/clear-verdict.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Codex — PreToolUse hook adapter (matcher: `^apply_patch$`)
3
+ *
4
+ * Two responsibilities:
5
+ * 1. Block `apply_patch` if devtools tools were used in this verification
6
+ * cycle without a verdict submitted (forces the agent to call
7
+ * `submit-verdict` before editing again).
8
+ * 2. When `fileChange.captureChangeset` is enabled, stash each touched
9
+ * file's PRIOR content keyed on `tool_use_id` so the matching
10
+ * PostToolUse adapter (`clear-verdict`) can produce a standard
11
+ * unified-diff `changeset` via `createUnifiedDiff` — same wire format
12
+ * Claude/Cursor emit. Without this stash, `clear-verdict` falls back
13
+ * to the V4A per-file body slice (`@@`-only, no line numbers).
14
+ *
15
+ * Returns `permissionDecision: "deny"` (with reason) to block; otherwise
16
+ * starts the activity as a fallback and allows the tool to proceed.
17
+ *
18
+ * **Soft mode** (`opts.soft`, assist mode — `verification.auto: false`):
19
+ * never denies. The "used devtools without verdict" block is skipped; the hook
20
+ * still stashes prior file contents (changeset capture) and opens the activity.
21
+ */
22
+ /**
23
+ * Stash payload consumed by clear-verdict to produce a unified-diff
24
+ * changeset. Keys are the per-file paths as they appear in the patch
25
+ * (relative to the project root or absolute); values are the file's
26
+ * content at PreToolUse time, or `null` when the file didn't exist
27
+ * (Add File case — we still write a key so clear-verdict knows the
28
+ * stash was attempted for this path).
29
+ */
30
+ export interface CodexApplyPatchStash {
31
+ prior_contents: Record<string, string | null>;
32
+ }
33
+ export declare function run(projectDir: string, opts?: {
34
+ soft?: boolean;
35
+ }): Promise<void>;
36
+ //# sourceMappingURL=require-verdict.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-verdict.d.ts","sourceRoot":"","sources":["../../../../src/clients/codex/hooks/require-verdict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAcH;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACjC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CACjD;AAgDD,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CtF"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ /**
3
+ * Codex — PreToolUse hook adapter (matcher: `^apply_patch$`)
4
+ *
5
+ * Two responsibilities:
6
+ * 1. Block `apply_patch` if devtools tools were used in this verification
7
+ * cycle without a verdict submitted (forces the agent to call
8
+ * `submit-verdict` before editing again).
9
+ * 2. When `fileChange.captureChangeset` is enabled, stash each touched
10
+ * file's PRIOR content keyed on `tool_use_id` so the matching
11
+ * PostToolUse adapter (`clear-verdict`) can produce a standard
12
+ * unified-diff `changeset` via `createUnifiedDiff` — same wire format
13
+ * Claude/Cursor emit. Without this stash, `clear-verdict` falls back
14
+ * to the V4A per-file body slice (`@@`-only, no line numbers).
15
+ *
16
+ * Returns `permissionDecision: "deny"` (with reason) to block; otherwise
17
+ * starts the activity as a fallback and allows the tool to proceed.
18
+ *
19
+ * **Soft mode** (`opts.soft`, assist mode — `verification.auto: false`):
20
+ * never denies. The "used devtools without verdict" block is skipped; the hook
21
+ * still stashes prior file contents (changeset capture) and opens the activity.
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.run = run;
25
+ const fs_1 = require("fs");
26
+ const path_1 = require("path");
27
+ const actions_1 = require("../../../hooks/core/actions");
28
+ const activity_1 = require("../../../hooks/core/activity");
29
+ const tool_use_stash_1 = require("../../../hooks/core/tool-use-stash");
30
+ const config_1 = require("../../../lib/config");
31
+ const logger_1 = require("../../../lib/logger");
32
+ const stdin_1 = require("../../../lib/stdin");
33
+ const util_1 = require("../util");
34
+ const clear_verdict_1 = require("./clear-verdict");
35
+ function readPatchBody(input) {
36
+ const ti = input.tool_input;
37
+ if (typeof ti === "string") {
38
+ return ti;
39
+ }
40
+ if (typeof ti === "object" && ti !== null) {
41
+ const rec = ti;
42
+ const cmd = rec.command ?? rec.input;
43
+ if (typeof cmd === "string") {
44
+ return cmd;
45
+ }
46
+ }
47
+ return null;
48
+ }
49
+ function resolveFilePath(projectDir, entryPath) {
50
+ return (0, path_1.isAbsolute)(entryPath) ? entryPath : (0, path_1.join)(projectDir, entryPath);
51
+ }
52
+ function stashPriorContents(projectDir, sessionId, toolUseId, patchBody) {
53
+ const entries = (0, clear_verdict_1.parseApplyPatchBody)(patchBody);
54
+ const priorContents = {};
55
+ for (const e of entries) {
56
+ // Add File: no pre-state; mark as null (absent) so clear-verdict
57
+ // knows the stash entry was deliberate (vs missing).
58
+ if (e.operation === "create") {
59
+ priorContents[e.path] = null;
60
+ continue;
61
+ }
62
+ const abs = resolveFilePath(projectDir, e.path);
63
+ try {
64
+ priorContents[e.path] = (0, fs_1.existsSync)(abs) ? (0, fs_1.readFileSync)(abs, "utf-8") : null;
65
+ }
66
+ catch (err) {
67
+ logger_1.logger.debug(`failed to read prior content of ${abs} for changeset stash: ${err}`);
68
+ priorContents[e.path] = null;
69
+ }
70
+ }
71
+ const data = { prior_contents: priorContents };
72
+ (0, tool_use_stash_1.stashToolUseData)(sessionId, (0, clear_verdict_1.applyPatchStashKey)(toolUseId), data);
73
+ }
74
+ async function run(projectDir, opts) {
75
+ const soft = opts?.soft === true;
76
+ const input = (0, util_1.parseCodexHookStdin)((0, stdin_1.readStdin)());
77
+ const sessionId = input.session_id ?? "default";
78
+ const sessionDir = `${projectDir}/.ironbee/sessions/${sessionId}`;
79
+ const actionsFile = `${sessionDir}/actions.jsonl`;
80
+ (0, logger_1.setLogFile)(`${sessionDir}/session.log`);
81
+ // Soft mode (assist) never denies — it only stashes for changeset capture.
82
+ if (!soft && (0, actions_1.hasToolCallsSinceLastVerdict)(actionsFile)) {
83
+ const reason = `BLOCKED: You used devtools tools but haven't submitted a verdict yet.
84
+
85
+ You MUST submit a verdict before editing more code. Use:
86
+ echo '{"session_id":"${sessionId}","status":"fail","checks":["..."],"issues":["..."]}' | ironbee hook submit-verdict
87
+
88
+ Then proceed with the edit.`;
89
+ process.stdout.write(JSON.stringify({
90
+ hookSpecificOutput: {
91
+ hookEventName: "PreToolUse",
92
+ permissionDecision: "deny",
93
+ permissionDecisionReason: reason,
94
+ },
95
+ }));
96
+ process.exit(0);
97
+ return;
98
+ }
99
+ // Stash prior file contents for clear-verdict to compute a unified-diff
100
+ // changeset. Skipped on deny (above) — the patch won't run, no consumer.
101
+ const toolUseId = input.tool_use_id ?? "";
102
+ if (toolUseId) {
103
+ const cfg = (0, config_1.loadConfig)(projectDir);
104
+ if ((0, config_1.getCaptureFileChangeset)(cfg)) {
105
+ const patchBody = readPatchBody(input);
106
+ if (patchBody !== null) {
107
+ stashPriorContents(projectDir, sessionId, toolUseId, patchBody);
108
+ }
109
+ }
110
+ }
111
+ await (0, activity_1.startActivity)({ sessionDir, actionsFile, source: "pre_tool_use" });
112
+ logger_1.logger.debug(`require-verdict: allowed apply_patch`);
113
+ process.exit(0);
114
+ }
115
+ //# sourceMappingURL=require-verdict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-verdict.js","sourceRoot":"","sources":["../../../../src/clients/codex/hooks/require-verdict.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Codex — PreToolUse hook adapter (matcher: `mcp__.*-devtools__.*`)
3
+ *
4
+ * Blocks devtools tool usage when no verification cycle is active.
5
+ * When allowed, injects `_metadata` into tool_input via Codex's
6
+ * `updatedInput` + **`permissionDecision: "allow"`** (the latter is
7
+ * REQUIRED — without it Codex silently drops the rewrite).
8
+ *
9
+ * Returns `permissionDecision: "deny"` (exit 2-equivalent) when blocked.
10
+ *
11
+ * **Soft mode** (`opts.soft`, assist mode — `verification.auto: false`):
12
+ * never denies. The no-cycle + recording-required blocks are skipped; the hook
13
+ * only injects `_metadata` (still with `permissionDecision: "allow"`, required
14
+ * for Codex to honor the rewrite). `verificationId` / `traceId` ride along only
15
+ * when a cycle is active (manual `$ironbee-verify`).
16
+ */
17
+ export declare function run(projectDir: string, opts?: {
18
+ soft?: boolean;
19
+ }): Promise<void>;
20
+ //# sourceMappingURL=require-verification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-verification.d.ts","sourceRoot":"","sources":["../../../../src/clients/codex/hooks/require-verification.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAmBH,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwItF"}