@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
@@ -0,0 +1,299 @@
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 file_diff_1 = require("../../../hooks/core/file-diff");
26
+ const session_state_1 = require("../../../hooks/core/session-state");
27
+ const tool_use_stash_1 = require("../../../hooks/core/tool-use-stash");
28
+ const config_1 = require("../../../lib/config");
29
+ const logger_1 = require("../../../lib/logger");
30
+ const output_1 = require("../../../lib/output");
31
+ const stdin_1 = require("../../../lib/stdin");
32
+ const util_1 = require("../util");
33
+ const STASH_KEY_SUFFIX = ".apply-patch";
34
+ /**
35
+ * Returns the tool-use-stash key for the apply_patch prior-content stash.
36
+ * Suffixed so it doesn't collide with `track-action-pre`'s timing stash
37
+ * (which keys on the bare `tool_use_id`).
38
+ */
39
+ function applyPatchStashKey(toolUseId) {
40
+ return `${toolUseId}${STASH_KEY_SUFFIX}`;
41
+ }
42
+ function truncateChangeset(s, maxBytes) {
43
+ if (maxBytes <= 0) {
44
+ return s;
45
+ }
46
+ const buf = Buffer.from(s, "utf-8");
47
+ if (buf.length <= maxBytes) {
48
+ return s;
49
+ }
50
+ const omitted = buf.length - maxBytes;
51
+ const footer = `\n... (truncated, ${omitted} bytes omitted)\n`;
52
+ const footerLen = Buffer.byteLength(footer, "utf-8");
53
+ const headLen = Math.max(0, maxBytes - footerLen);
54
+ const head = buf.subarray(0, headLen).toString("utf-8");
55
+ return head + footer;
56
+ }
57
+ function resolveFilePath(projectDir, entryPath) {
58
+ return (0, path_1.isAbsolute)(entryPath) ? entryPath : (0, path_1.join)(projectDir, entryPath);
59
+ }
60
+ /**
61
+ * Build the standard unified-diff changeset for one file using the
62
+ * PreToolUse stash + the post-state file content on disk. Mirrors
63
+ * Claude's `buildChangeset` so the wire output is identical across
64
+ * clients.
65
+ *
66
+ * Returns `undefined` when the diff can't be produced (binary file,
67
+ * post-state read failure, identical content) — caller falls back to the
68
+ * V4A per-file body slice in that case.
69
+ */
70
+ function buildUnifiedDiffChangeset(projectDir, e, priorContent, maxBytes) {
71
+ const abs = resolveFilePath(projectDir, e.path);
72
+ let postContent;
73
+ try {
74
+ // Delete File: post-state is gone on disk — use empty string.
75
+ postContent = e.operation === "delete" || !(0, fs_1.existsSync)(abs) ? "" : (0, fs_1.readFileSync)(abs, "utf-8");
76
+ }
77
+ catch (err) {
78
+ logger_1.logger.debug(`failed to read post-state of ${abs} for changeset: ${err}`);
79
+ return undefined;
80
+ }
81
+ const prior = priorContent ?? "";
82
+ const diff = (0, file_diff_1.createUnifiedDiff)(prior, postContent, maxBytes);
83
+ return diff ?? undefined;
84
+ }
85
+ /**
86
+ * Parse a Codex `apply_patch` tool_input.input body into per-file entries.
87
+ *
88
+ * Body format (from Codex's apply_patch tool):
89
+ * *** Begin Patch
90
+ * *** Add File: path/to/new.ts
91
+ * +line1
92
+ * +line2
93
+ * *** Update File: path/to/existing.ts
94
+ * @@ ...
95
+ * -old
96
+ * +new
97
+ * *** Delete File: path/to/old.ts
98
+ * *** End Patch
99
+ *
100
+ * Returns one entry per file with operation + line-count tallies.
101
+ */
102
+ function parseApplyPatchBody(body) {
103
+ const entries = [];
104
+ let current = null;
105
+ let currentLines = [];
106
+ const flushCurrent = () => {
107
+ if (current) {
108
+ current.body = currentLines.join("\n");
109
+ entries.push(current);
110
+ current = null;
111
+ currentLines = [];
112
+ }
113
+ };
114
+ const lines = body.split("\n");
115
+ for (const raw of lines) {
116
+ const line = raw;
117
+ const addMatch = line.match(/^\*\*\* Add File: (.+)$/);
118
+ const updateMatch = line.match(/^\*\*\* Update File: (.+)$/);
119
+ const deleteMatch = line.match(/^\*\*\* Delete File: (.+)$/);
120
+ const endMatch = line.match(/^\*\*\* (End Patch|Move to: .+)$/);
121
+ // Headers (`*** Add/Update/Delete File: X`) are PARSED but NOT included
122
+ // in the per-file body slice. `file_path` rides on the event already;
123
+ // including the header would be redundant info on the wire and would
124
+ // diverge from Claude/Cursor changeset shape (which is hunks-only).
125
+ if (addMatch) {
126
+ flushCurrent();
127
+ current = { path: addMatch[1].trim(), operation: "create", linesAdded: 0, linesRemoved: 0, body: "" };
128
+ currentLines = [];
129
+ continue;
130
+ }
131
+ if (updateMatch) {
132
+ flushCurrent();
133
+ current = { path: updateMatch[1].trim(), operation: "update", linesAdded: 0, linesRemoved: 0, body: "" };
134
+ currentLines = [];
135
+ continue;
136
+ }
137
+ if (deleteMatch) {
138
+ flushCurrent();
139
+ current = { path: deleteMatch[1].trim(), operation: "delete", linesAdded: 0, linesRemoved: 0, body: "" };
140
+ currentLines = [];
141
+ continue;
142
+ }
143
+ if (endMatch) {
144
+ flushCurrent();
145
+ continue;
146
+ }
147
+ if (current) {
148
+ currentLines.push(line);
149
+ if (current.operation !== "delete") {
150
+ if (line.startsWith("+") && !line.startsWith("+++")) {
151
+ current.linesAdded += 1;
152
+ }
153
+ else if (line.startsWith("-") && !line.startsWith("---")) {
154
+ current.linesRemoved += 1;
155
+ }
156
+ }
157
+ }
158
+ }
159
+ flushCurrent();
160
+ return entries;
161
+ }
162
+ async function run(projectDir) {
163
+ const input = (0, util_1.parseCodexHookStdin)((0, stdin_1.readStdin)());
164
+ const sessionId = input.session_id ?? "default";
165
+ const sessionDir = `${projectDir}/.ironbee/sessions/${sessionId}`;
166
+ const actionsFile = `${sessionDir}/actions.jsonl`;
167
+ const verdictFile = `${sessionDir}/verdict.json`;
168
+ (0, logger_1.setLogFile)(`${sessionDir}/session.log`);
169
+ // Codex's apply_patch hook stdin shape (live-tested on 0.135.0):
170
+ // tool_input is an object: { "command": "<patch body string>" }
171
+ // For the custom_tool_call wire form Codex normalizes the patch into the
172
+ // `command` field of the hook stdin's tool_input. Fallback to `.input`
173
+ // (function_call shape) and raw-string (defensive) for forward-compat.
174
+ const ti = input.tool_input;
175
+ let patchBody;
176
+ if (typeof ti === "string") {
177
+ patchBody = ti;
178
+ }
179
+ else if (typeof ti === "object" && ti !== null) {
180
+ const rec = ti;
181
+ patchBody = rec.command ?? rec.input;
182
+ }
183
+ if (typeof patchBody === "string") {
184
+ const config = (0, config_1.loadConfig)(projectDir);
185
+ const captureChangeset = (0, config_1.getCaptureFileChangeset)(config);
186
+ const maxChangesetBytes = (0, config_1.getMaxChangesetBytes)(config);
187
+ const entries = parseApplyPatchBody(patchBody);
188
+ const activityId = (0, session_state_1.getActiveActivityId)(sessionDir);
189
+ const fixId = (0, session_state_1.getActiveFixId)(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
+ // `fix_id` is FixAwareEvent-required (`string` typing), but the
205
+ // collector schema treats it as a non-empty string when present —
206
+ // emitting `fix_id: ""` literally is rejected. So we omit the
207
+ // field when no fix is active (mirrors Claude live's
208
+ // `getActiveFixId(sessionDir)!` + `JSON.stringify` drop, and the
209
+ // Codex import side which already omits via `as FileChangeAction`
210
+ // cast). The cast here matches that pattern.
211
+ //
212
+ // Same rule for `activity_id` (round 31): ActivityAwareEvent
213
+ // requires it, but empty value is FK-rejected by the collector.
214
+ // Claude/Cursor live use `activityId!` so JSON.stringify drops
215
+ // when undefined; Codex was the outlier shipping literal "".
216
+ const event = {
217
+ ...(0, actions_1.baseFields)(actionsFile),
218
+ type: "file_change",
219
+ timestamp: Date.now(),
220
+ file_path: e.path,
221
+ // Cross-event vocab parity (round 68). For the SAME logical
222
+ // operation, Codex emits a `tool_call` (via track-action.ts)
223
+ // and a `file_change` (here) at the same PostToolUse moment.
224
+ // `tool_call.tool_name` is Claude-aliased to "Edit" (round 67
225
+ // via `normalizeCodexToolName` in `classifyCodexTool`), and
226
+ // `session_analytics.tools["Edit"]` aggregates them (round
227
+ // 66 via `claudeAlias` in `analytics/codex/projection.ts`).
228
+ // Shipping `file_change.tool_name: "apply_patch"` here would
229
+ // leave the backend unable to JOIN `tool_call ↔ file_change`
230
+ // on `(session_id, timestamp, tool_name)` for every Codex
231
+ // apply_patch event. Align with the Claude-alias chain so
232
+ // Codex matches Claude/Cursor's cross-event consistency
233
+ // (both clients ship the SAME literal in both events).
234
+ tool_name: "Edit",
235
+ operation: e.operation,
236
+ // For DELETE: BOTH unknown (whole file removed; prior content
237
+ // never read so we can't count lines; patch body has no `+`/`-`
238
+ // lines so the parser's 0/0 isn't meaningful).
239
+ // For CREATE: `lines_removed: 0` — by definition a new file
240
+ // has zero prior content, so zero lines were removed. This is
241
+ // a concrete known value, not "unknown". Cross-client parity:
242
+ // Claude Write-create ships `lines_removed: 0`
243
+ // (clients/claude/hooks/clear-verdict.ts:77) and import
244
+ // matches (import/claude/events/file-change.ts:85). Backend
245
+ // dashboards filtering `WHERE operation='create' AND
246
+ // lines_removed=0` previously saw only Claude creates;
247
+ // Codex creates were invisible because they shipped null.
248
+ // For UPDATE: both real counts.
249
+ lines_added: e.operation === "delete" ? null : e.linesAdded,
250
+ lines_removed: e.operation === "delete" ? null : (e.operation === "create" ? 0 : e.linesRemoved),
251
+ };
252
+ if (activityId) {
253
+ event.activity_id = activityId;
254
+ }
255
+ if (fixId) {
256
+ event.fix_id = fixId;
257
+ }
258
+ // Live↔import event.id parity. Same pattern as round-19 tool_call
259
+ // fix: import `events/file-change.ts:61` derives id via
260
+ // `deriveFileChangeEventId(sessionId, "${callId}:${i}:${path}")`.
261
+ // Without matching here, every apply_patch's file_change events
262
+ // duplicate in the warehouse on re-import (random UUID live vs
263
+ // deterministic import → backend `(session_id, id)` dedup misses).
264
+ if (toolUseId.length > 0) {
265
+ event.id = (0, ids_1.deriveFileChangeEventId)(sessionId, `${toolUseId}:${i}:${e.path}`);
266
+ }
267
+ if (captureChangeset) {
268
+ // Primary path: standard unified diff via the stash. Matches
269
+ // Claude/Cursor wire shape exactly (hunks with `@@ -A,B +C,D @@`
270
+ // headers, no filename header, line numbers from the actual
271
+ // pre/post content on disk).
272
+ let changeset;
273
+ if (stash && Object.prototype.hasOwnProperty.call(stash.prior_contents, e.path)) {
274
+ changeset = buildUnifiedDiffChangeset(projectDir, e, stash.prior_contents[e.path], maxChangesetBytes);
275
+ }
276
+ // Fallback: Codex V4A per-file body slice (hunks-only, but
277
+ // `@@` separators have no line numbers — Codex's own format).
278
+ // Used when stash is missing (captureChangeset toggled mid-cycle,
279
+ // missing tool_use_id, etc.) or when the unified-diff build
280
+ // failed (binary, post-state read error).
281
+ if (changeset === undefined && e.body.length > 0) {
282
+ changeset = truncateChangeset(e.body, maxChangesetBytes);
283
+ }
284
+ if (changeset !== undefined) {
285
+ event.changeset = changeset;
286
+ }
287
+ }
288
+ await (0, actions_1.appendAction)(actionsFile, event);
289
+ }
290
+ }
291
+ const clearInput = {
292
+ verdictFile,
293
+ sessionDir,
294
+ };
295
+ (0, clear_verdict_1.runClearVerdict)(clearInput);
296
+ logger_1.logger.debug(`clear-verdict: cleared for ${sessionId}`);
297
+ (0, output_1.writeAndExit)(JSON.stringify({}), 0);
298
+ }
299
+ //# 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,30 @@
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
+ /**
19
+ * Stash payload consumed by clear-verdict to produce a unified-diff
20
+ * changeset. Keys are the per-file paths as they appear in the patch
21
+ * (relative to the project root or absolute); values are the file's
22
+ * content at PreToolUse time, or `null` when the file didn't exist
23
+ * (Add File case — we still write a key so clear-verdict knows the
24
+ * stash was attempted for this path).
25
+ */
26
+ export interface CodexApplyPatchStash {
27
+ prior_contents: Record<string, string | null>;
28
+ }
29
+ export declare function run(projectDir: string): Promise<void>;
30
+ //# 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;;;;;;;;;;;;;;;;GAgBG;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,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC3D"}
@@ -0,0 +1,109 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.run = run;
21
+ const fs_1 = require("fs");
22
+ const path_1 = require("path");
23
+ const actions_1 = require("../../../hooks/core/actions");
24
+ const activity_1 = require("../../../hooks/core/activity");
25
+ const tool_use_stash_1 = require("../../../hooks/core/tool-use-stash");
26
+ const config_1 = require("../../../lib/config");
27
+ const logger_1 = require("../../../lib/logger");
28
+ const stdin_1 = require("../../../lib/stdin");
29
+ const util_1 = require("../util");
30
+ const clear_verdict_1 = require("./clear-verdict");
31
+ function readPatchBody(input) {
32
+ const ti = input.tool_input;
33
+ if (typeof ti === "string") {
34
+ return ti;
35
+ }
36
+ if (typeof ti === "object" && ti !== null) {
37
+ const rec = ti;
38
+ const cmd = rec.command ?? rec.input;
39
+ if (typeof cmd === "string") {
40
+ return cmd;
41
+ }
42
+ }
43
+ return null;
44
+ }
45
+ function resolveFilePath(projectDir, entryPath) {
46
+ return (0, path_1.isAbsolute)(entryPath) ? entryPath : (0, path_1.join)(projectDir, entryPath);
47
+ }
48
+ function stashPriorContents(projectDir, sessionId, toolUseId, patchBody) {
49
+ const entries = (0, clear_verdict_1.parseApplyPatchBody)(patchBody);
50
+ const priorContents = {};
51
+ for (const e of entries) {
52
+ // Add File: no pre-state; mark as null (absent) so clear-verdict
53
+ // knows the stash entry was deliberate (vs missing).
54
+ if (e.operation === "create") {
55
+ priorContents[e.path] = null;
56
+ continue;
57
+ }
58
+ const abs = resolveFilePath(projectDir, e.path);
59
+ try {
60
+ priorContents[e.path] = (0, fs_1.existsSync)(abs) ? (0, fs_1.readFileSync)(abs, "utf-8") : null;
61
+ }
62
+ catch (err) {
63
+ logger_1.logger.debug(`failed to read prior content of ${abs} for changeset stash: ${err}`);
64
+ priorContents[e.path] = null;
65
+ }
66
+ }
67
+ const data = { prior_contents: priorContents };
68
+ (0, tool_use_stash_1.stashToolUseData)(sessionId, (0, clear_verdict_1.applyPatchStashKey)(toolUseId), data);
69
+ }
70
+ async function run(projectDir) {
71
+ const input = (0, util_1.parseCodexHookStdin)((0, stdin_1.readStdin)());
72
+ const sessionId = input.session_id ?? "default";
73
+ const sessionDir = `${projectDir}/.ironbee/sessions/${sessionId}`;
74
+ const actionsFile = `${sessionDir}/actions.jsonl`;
75
+ (0, logger_1.setLogFile)(`${sessionDir}/session.log`);
76
+ if ((0, actions_1.hasToolCallsSinceLastVerdict)(actionsFile)) {
77
+ const reason = `BLOCKED: You used devtools tools but haven't submitted a verdict yet.
78
+
79
+ You MUST submit a verdict before editing more code. Use:
80
+ echo '{"session_id":"${sessionId}","status":"fail","checks":["..."],"issues":["..."]}' | ironbee hook submit-verdict
81
+
82
+ Then proceed with the edit.`;
83
+ process.stdout.write(JSON.stringify({
84
+ hookSpecificOutput: {
85
+ hookEventName: "PreToolUse",
86
+ permissionDecision: "deny",
87
+ permissionDecisionReason: reason,
88
+ },
89
+ }));
90
+ process.exit(0);
91
+ return;
92
+ }
93
+ // Stash prior file contents for clear-verdict to compute a unified-diff
94
+ // changeset. Skipped on deny (above) — the patch won't run, no consumer.
95
+ const toolUseId = input.tool_use_id ?? "";
96
+ if (toolUseId) {
97
+ const cfg = (0, config_1.loadConfig)(projectDir);
98
+ if ((0, config_1.getCaptureFileChangeset)(cfg)) {
99
+ const patchBody = readPatchBody(input);
100
+ if (patchBody !== null) {
101
+ stashPriorContents(projectDir, sessionId, toolUseId, patchBody);
102
+ }
103
+ }
104
+ }
105
+ await (0, activity_1.startActivity)({ sessionDir, actionsFile, source: "pre_tool_use" });
106
+ logger_1.logger.debug(`require-verdict: allowed apply_patch`);
107
+ process.exit(0);
108
+ }
109
+ //# 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,12 @@
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
+ export declare function run(projectDir: string): Promise<void>;
12
+ //# 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;;;;;;;;;GASG;AAkBH,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0H3D"}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ /**
3
+ * Codex — PreToolUse hook adapter (matcher: `mcp__.*-devtools__.*`)
4
+ *
5
+ * Blocks devtools tool usage when no verification cycle is active.
6
+ * When allowed, injects `_metadata` into tool_input via Codex's
7
+ * `updatedInput` + **`permissionDecision: "allow"`** (the latter is
8
+ * REQUIRED — without it Codex silently drops the rewrite).
9
+ *
10
+ * Returns `permissionDecision: "deny"` (exit 2-equivalent) when blocked.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.run = run;
14
+ const crypto_1 = require("crypto");
15
+ const activity_1 = require("../../../hooks/core/activity");
16
+ const session_state_1 = require("../../../hooks/core/session-state");
17
+ const actions_1 = require("../../../hooks/core/actions");
18
+ const config_1 = require("../../../lib/config");
19
+ const logger_1 = require("../../../lib/logger");
20
+ const stdin_1 = require("../../../lib/stdin");
21
+ const util_1 = require("../util");
22
+ async function run(projectDir) {
23
+ const input = (0, util_1.parseCodexHookStdin)((0, stdin_1.readStdin)());
24
+ const sessionId = input.session_id ?? "default";
25
+ const sessionDir = `${projectDir}/.ironbee/sessions/${sessionId}`;
26
+ const actionsFile = `${sessionDir}/actions.jsonl`;
27
+ (0, logger_1.setLogFile)(`${sessionDir}/session.log`);
28
+ const verificationId = (0, session_state_1.getActiveVerificationId)(sessionDir);
29
+ if (!verificationId) {
30
+ const reason = `BLOCKED: You must start a verification cycle before using devtools tools.
31
+
32
+ Start verification first:
33
+ echo '{"session_id":"${sessionId}"}' | ironbee hook verification-start
34
+
35
+ Then use the verification tools for the active cycle(s) — mcp__browser-devtools__bdt_* for browser, mcp__node-devtools__ndt_* for node, mcp__backend-devtools__bedt_* for backend.`;
36
+ process.stdout.write(JSON.stringify({
37
+ hookSpecificOutput: {
38
+ hookEventName: "PreToolUse",
39
+ permissionDecision: "deny",
40
+ permissionDecisionReason: reason,
41
+ },
42
+ }));
43
+ process.exit(0);
44
+ return;
45
+ }
46
+ // Recording enforcement is browser-only.
47
+ const toolName = input.tool_name ?? "";
48
+ const mcpServer = (0, util_1.extractCodexMcpServer)(toolName);
49
+ const isBrowserDevToolsCall = mcpServer === "browser-devtools";
50
+ // Codex flattens `-` → `_` on hook dispatch — the raw tool_name is
51
+ // `mcp__browser_devtools__bdt_content_start_recording`. Canonicalize
52
+ // the bare tool segment before comparing against the documented
53
+ // hyphenated form. Without this, the recording-start tool blocks
54
+ // itself and the agent can never start recording (infinite loop:
55
+ // gate denies → agent retries → gate denies → …).
56
+ const bareToolName = isBrowserDevToolsCall
57
+ ? (0, util_1.canonicalizeCodexToolName)(toolName.split("__").pop() ?? "")
58
+ : "";
59
+ const isRecordingStartTool = bareToolName === "bdt_content_start-recording";
60
+ if (isBrowserDevToolsCall &&
61
+ (0, session_state_1.isRecordingRequired)(sessionDir) &&
62
+ !(0, session_state_1.isRecordingActive)(sessionDir) &&
63
+ !isRecordingStartTool) {
64
+ const reason = `BLOCKED: Recording is required but not started.
65
+
66
+ 1. Start recording NOW:
67
+ Use mcp__browser-devtools__bdt_content_start-recording
68
+
69
+ 2. Run the verification (navigate, screenshot, aria, console, etc.)
70
+
71
+ 3. **Stop recording BEFORE submitting verdict:**
72
+ Use mcp__browser-devtools__bdt_content_stop-recording
73
+ submit-verdict will reject with "recording is still active" if you skip this.`;
74
+ process.stdout.write(JSON.stringify({
75
+ hookSpecificOutput: {
76
+ hookEventName: "PreToolUse",
77
+ permissionDecision: "deny",
78
+ permissionDecisionReason: reason,
79
+ },
80
+ }));
81
+ process.exit(0);
82
+ return;
83
+ }
84
+ // ensure activity is open before reading its ID for metadata propagation
85
+ await (0, activity_1.startActivity)({ sessionDir, actionsFile, source: "pre_tool_use" });
86
+ const traceId = (0, session_state_1.getActiveTraceId)(sessionDir);
87
+ const activityId = (0, session_state_1.getActiveActivityId)(sessionDir);
88
+ const projectName = (0, actions_1.resolveProjectName)(projectDir);
89
+ const traceStateParts = [`prj:${projectName}`, `sid:${sessionId}`];
90
+ if (activityId) {
91
+ traceStateParts.push(`aid:${activityId}`);
92
+ }
93
+ traceStateParts.push(`vid:${verificationId}`);
94
+ const traceState = `ironbee=${traceStateParts.join(";")}`;
95
+ const config = (0, config_1.loadConfig)(projectDir);
96
+ // tool_input is Record<string,unknown> | string | undefined; for MCP devtools
97
+ // matcher-routed tools it's always a Record (no custom_tool_call MCPs).
98
+ const baseInput = (input.tool_input && typeof input.tool_input === "object")
99
+ ? input.tool_input
100
+ : {};
101
+ const updatedInput = { ...baseInput };
102
+ const metadata = {
103
+ projectName,
104
+ sessionId,
105
+ activityId,
106
+ verificationId,
107
+ traceId,
108
+ traceState,
109
+ toolCallId: (0, crypto_1.randomUUID)(),
110
+ };
111
+ if (input.tool_use_id) {
112
+ metadata.toolUseId = input.tool_use_id;
113
+ }
114
+ metadata.mcpServer = mcpServer ?? "browser-devtools";
115
+ const userEmail = (0, session_state_1.getUserEmail)(sessionDir);
116
+ if (userEmail) {
117
+ metadata.userEmail = userEmail;
118
+ }
119
+ if (config.collector?.url) {
120
+ metadata.collectorUrl = config.collector.url;
121
+ }
122
+ if (config.collector?.apiKey) {
123
+ metadata.collectorApiKey = config.collector.apiKey;
124
+ }
125
+ updatedInput._metadata = metadata;
126
+ process.stdout.write(JSON.stringify({
127
+ hookSpecificOutput: {
128
+ hookEventName: "PreToolUse",
129
+ permissionDecision: "allow",
130
+ updatedInput,
131
+ },
132
+ }));
133
+ logger_1.logger.debug(`require-verification: allowed ${toolName} with _metadata`);
134
+ process.exit(0);
135
+ }
136
+ //# sourceMappingURL=require-verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-verification.js","sourceRoot":"","sources":["../../../../src/clients/codex/hooks/require-verification.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Codex — SessionStart hook adapter
3
+ *
4
+ * Appends a `session_start` entry to actions.jsonl, populates session-state
5
+ * with auth info from `~/.codex/auth.json` (cleaner than Claude — explicit
6
+ * `auth_mode` enum vs JWT decode), then runs the standard reconcile pass to
7
+ * close any abandoned cycles from a prior session.
8
+ */
9
+ export declare function run(projectDir: string): Promise<void>;
10
+ //# sourceMappingURL=session-start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../../../src/clients/codex/hooks/session-start.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+E3D"}