@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,555 @@
1
+ "use strict";
2
+ /**
3
+ * Codex analytics Stop-hook orchestrator.
4
+ *
5
+ * Called once per Stop hook fire (verify-gate.ts / activity-end.ts). Reads
6
+ * the rollout (cursor-incremental) and emits:
7
+ *
8
+ * - one or more `api_request` events (per new token_count)
9
+ * - one or more `session_status` events (per new token_count, gated by
10
+ * event-time min-interval throttle + skip-if-unchanged signature —
11
+ * mirror of Claude statusline cadence, see analytics.md)
12
+ *
13
+ * `session_context` is intentionally OUT OF SCOPE on Codex — the only
14
+ * available source (Codex's `~/.codex/logs_2.sqlite` feedback-logger DB)
15
+ * is selective + retention-limited (we'd see 1 of ~94 API request bodies)
16
+ * AND its `input`/`output` fields are redacted by the logger, so
17
+ * per-turn breakdown reconstruction is impossible. Rollout JSONL carries
18
+ * the dynamic side (user_message / function_call / function_call_output)
19
+ * but has NO instructions/tools, so a hybrid pipeline would still need
20
+ * SQLite for the static portion — net value didn't justify the complexity
21
+ * + native-module dependency.
22
+ *
23
+ * All events POST directly to the collector in a single batch (mirror of
24
+ * Claude analytics dispatch). Cursor advances are staged in-memory and
25
+ * only persisted on POST success — fail keeps cursor stale so the next
26
+ * Stop retries (deterministic event ids make retries idempotent via
27
+ * backend dedup). Fail-safe — analytics failures never break the Stop hook.
28
+ *
29
+ * State persistence: rollout cursor + statusline signature live under
30
+ * `.ironbee/sessions/<sid>/analytics-codex/state.json` (separate from the
31
+ * main analytics state to avoid Anthropic-specific reset semantics
32
+ * leaking into Codex).
33
+ */
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.emitCodexAnalytics = emitCodexAnalytics;
36
+ const fs_1 = require("fs");
37
+ const path_1 = require("path");
38
+ const logger_1 = require("../../lib/logger");
39
+ const actions_1 = require("../../hooks/core/actions");
40
+ const config_1 = require("../../lib/config");
41
+ const collector_1 = require("../../lib/collector");
42
+ const api_request_1 = require("./api-request");
43
+ const status_snapshot_1 = require("./status-snapshot");
44
+ const transcript_1 = require("./transcript");
45
+ function defaultState() {
46
+ return {
47
+ rollout_inode: 0,
48
+ rollout_size: 0,
49
+ rollout_read_offset: 0,
50
+ last_status_signature: "",
51
+ last_status_emit_ms: 0,
52
+ api_response_count: 0,
53
+ turn_token_seq: 0,
54
+ last_turn_id: null,
55
+ last_model: "gpt-5.5",
56
+ session_start_ms: 0,
57
+ session_meta_cached: false,
58
+ cumulative_cost_usd: 0,
59
+ };
60
+ }
61
+ function stateDir(projectDir, sessionId) {
62
+ return (0, path_1.join)(projectDir, ".ironbee", "sessions", sessionId, "analytics-codex");
63
+ }
64
+ function statePath(projectDir, sessionId) {
65
+ return (0, path_1.join)(stateDir(projectDir, sessionId), "state.json");
66
+ }
67
+ function readState(projectDir, sessionId) {
68
+ const path = statePath(projectDir, sessionId);
69
+ if (!(0, fs_1.existsSync)(path)) {
70
+ return defaultState();
71
+ }
72
+ try {
73
+ const raw = (0, fs_1.readFileSync)(path, "utf-8");
74
+ const parsed = JSON.parse(raw);
75
+ if (parsed !== null && typeof parsed === "object") {
76
+ // Type-safe merge: take a field from the parsed JSON only when
77
+ // it matches the default's typeof — protects against stale
78
+ // schemas, hand-edits, and JSON.stringify(NaN) → null silent
79
+ // type-mismatches that would otherwise survive a spread and
80
+ // poison downstream math (e.g. `now - null = now`).
81
+ return mergeValidatedState(defaultState(), parsed);
82
+ }
83
+ }
84
+ catch (e) {
85
+ logger_1.logger.debug(`codex emit: state read failed: ${e instanceof Error ? e.message : e}`);
86
+ }
87
+ return defaultState();
88
+ }
89
+ /**
90
+ * Field-by-field merge that drops any property whose typeof doesn't match
91
+ * the default's typeof. `null` always falls back to the default (`null`
92
+ * survives `JSON.stringify(NaN)` and would otherwise break arithmetic).
93
+ */
94
+ function mergeValidatedState(base, incoming) {
95
+ const out = { ...base };
96
+ for (const [key, val] of Object.entries(incoming)) {
97
+ if (!(key in base)) {
98
+ continue; // unknown field — drop silently (forward-compat)
99
+ }
100
+ const defaultVal = base[key];
101
+ const defType = defaultVal === null ? "object" : typeof defaultVal;
102
+ const incType = val === null ? "object" : typeof val;
103
+ // Allow `null` only where the default also permits it (last_turn_id).
104
+ if (val === null && defaultVal === null) {
105
+ out[key] = null;
106
+ continue;
107
+ }
108
+ if (defType !== incType) {
109
+ continue; // type mismatch — keep default
110
+ }
111
+ if (incType === "number" && !Number.isFinite(val)) {
112
+ continue; // NaN / Infinity — keep default
113
+ }
114
+ out[key] = val;
115
+ }
116
+ return out;
117
+ }
118
+ function writeState(projectDir, sessionId, state) {
119
+ const path = statePath(projectDir, sessionId);
120
+ try {
121
+ (0, fs_1.mkdirSync)((0, path_1.dirname)(path), { recursive: true });
122
+ const tmp = `${path}.tmp.${process.pid}`;
123
+ (0, fs_1.writeFileSync)(tmp, JSON.stringify(state, null, 2), "utf-8");
124
+ (0, fs_1.renameSync)(tmp, path);
125
+ }
126
+ catch (e) {
127
+ logger_1.logger.debug(`codex emit: state write failed: ${e instanceof Error ? e.message : e}`);
128
+ }
129
+ }
130
+ /**
131
+ * Stop-hook orchestrator. Wraps each phase in try/catch so an emission
132
+ * failure on one event class doesn't take down the others.
133
+ */
134
+ async function emitCodexAnalytics(opts) {
135
+ const config = (0, config_1.loadConfig)(opts.projectDir);
136
+ // Master gate — `analytics.enable: false` suspends all derived analytics
137
+ // events for this project (api_request / session_status). Symmetric
138
+ // with the Claude side and the session_analytics gate in
139
+ // emit.ts.
140
+ if (!(0, config_1.isAnalyticsEnabled)(opts.projectDir)) {
141
+ logger_1.logger.debug(`codex emit: analytics disabled — skipping`);
142
+ return;
143
+ }
144
+ // Stop-hook gate — `analytics.emitOnStop: false` defers to SessionEnd
145
+ // only (Codex has no SessionEnd hook, so effectively suspends analytics
146
+ // emission entirely; documented behavior).
147
+ if (!(0, config_1.isAnalyticsEmitOnStopEnabled)(opts.projectDir)) {
148
+ logger_1.logger.debug(`codex emit: emitOnStop disabled — skipping`);
149
+ return;
150
+ }
151
+ let rolloutPath = opts.rolloutPath ?? null;
152
+ if (rolloutPath === null || !(0, fs_1.existsSync)(rolloutPath)) {
153
+ rolloutPath = (0, transcript_1.findCodexRolloutPath)(opts.sessionId);
154
+ }
155
+ if (rolloutPath === null) {
156
+ logger_1.logger.debug(`codex emit: rollout not found for session ${opts.sessionId}`);
157
+ return;
158
+ }
159
+ const state = readState(opts.projectDir, opts.sessionId);
160
+ // Claude-parity git-aware resolution — MUST match emit.ts (session_analytics)
161
+ // pipeline. Same Stop fires BOTH events-emit AND emit; if these two used
162
+ // different project_name derivation, the wire would carry two distinct
163
+ // project labels for the same session (api_request says "foo", session_analytics
164
+ // says "proj"), breaking backend `session_analytics ⋈ api_request` joins
165
+ // for sessions launched from a subdir. Confirmed parity bug found in
166
+ // round-13 review; fix mirrors src/import/codex/discovery.ts:141.
167
+ const projectName = opts.projectName ?? (0, actions_1.resolveProjectName)(opts.projectDir);
168
+ // ─── Read new rollout bytes (or use worker-preloaded lines) ──────────────
169
+ let newLines = [];
170
+ let nextRolloutOffset = state.rollout_read_offset;
171
+ let sessionMetaFromSlice = null;
172
+ let resetDetected = false;
173
+ if (opts.preloadedLines !== undefined) {
174
+ // Worker pre-parsed the whole rollout once for both pipelines.
175
+ // We process every line — deterministic event ids dedup the
176
+ // already-seen ones at the backend. Advance the cursor to the
177
+ // current file size so a future Stop without preloadedLines
178
+ // resumes incrementally from end-of-file.
179
+ newLines = opts.preloadedLines;
180
+ for (const ln of opts.preloadedLines) {
181
+ if (ln.type === "session_meta" && sessionMetaFromSlice === null) {
182
+ sessionMetaFromSlice = ln.payload;
183
+ break;
184
+ }
185
+ }
186
+ try {
187
+ const stats = (0, fs_1.statSync)(rolloutPath);
188
+ nextRolloutOffset = Number(stats.size);
189
+ if (state.rollout_inode !== 0 && Number(stats.ino) !== state.rollout_inode) {
190
+ resetDetected = true;
191
+ }
192
+ }
193
+ catch {
194
+ // ignore — cursor update handled in finally section
195
+ }
196
+ }
197
+ else {
198
+ try {
199
+ const slice = readNewRolloutLines(rolloutPath, state.rollout_read_offset, state.rollout_inode, state.rollout_size);
200
+ newLines = slice.lines;
201
+ nextRolloutOffset = slice.nextOffset;
202
+ sessionMetaFromSlice = slice.sessionMeta;
203
+ resetDetected = slice.resetDetected;
204
+ }
205
+ catch (e) {
206
+ logger_1.logger.debug(`codex emit: rollout read failed: ${e instanceof Error ? e.message : e}`);
207
+ }
208
+ }
209
+ // Reset-cache wipe must run BEFORE the cache-on-first-read block so
210
+ // that the SAME emit re-caches from the new rollout's session_meta
211
+ // line. Earlier ordering (cache → reset) wiped session_meta_cached
212
+ // back to false but never re-cached in the same call, leaving the
213
+ // post-reset emit with cached=false and session_status emission
214
+ // gated off (the gate at the session_status block requires
215
+ // session_meta_cached=true). The next Stop would self-heal but at
216
+ // the cost of skipping one rollout-rotation tick.
217
+ if (resetDetected) {
218
+ state.rollout_read_offset = 0;
219
+ state.turn_token_seq = 0;
220
+ state.last_turn_id = null;
221
+ state.api_response_count = 0;
222
+ state.session_meta_cached = false;
223
+ state.session_start_ms = 0;
224
+ // Reset the cumulative-cost accumulator too — a rollout-rotation
225
+ // means the prior session is gone and we restart from zero on the
226
+ // new file. Without this, the next session_status would carry the
227
+ // prior session's cost plus the new session's accruals.
228
+ state.cumulative_cost_usd = 0;
229
+ // Wipe statusline throttle + skip-if-unchanged state too. The
230
+ // prior rollout's last emit timestamp and signature carry no
231
+ // meaning for the new rollout — leaving them set would:
232
+ // (a) throttle out the new rollout's first session_status if
233
+ // the prior rollout's last emit happened within
234
+ // statusLine.emitMinIntervalSeconds (default 10s) before
235
+ // rotation;
236
+ // (b) silently dedup-skip the first post-rotation event when
237
+ // the signatures incidentally collide (same model + cw +
238
+ // cost-after-reset=0 + rate_limits).
239
+ // Either case loses the first wire tick of the new rollout —
240
+ // backend's session_status timeline would have a gap.
241
+ state.last_status_signature = "";
242
+ state.last_status_emit_ms = 0;
243
+ // Wipe `last_model` too — the prior rollout's model has no
244
+ // bearing on the new file's content. Any `token_count` line in
245
+ // the new rollout slice that arrives BEFORE its first
246
+ // `turn_context` line would otherwise be priced + labeled at
247
+ // the prior rollout's model rate (api-request.ts:135
248
+ // `computeCodexCost(currentModel, …)` + line 153
249
+ // `model: currentModel`). The default mirrors `defaultState()`
250
+ // so the very-first-tick fallback is identical to a fresh
251
+ // session.
252
+ state.last_model = "gpt-5.5";
253
+ }
254
+ // Cache session_meta + session_start_ms on first successful read
255
+ // (also runs immediately after a reset wipe — that's the whole point
256
+ // of putting it AFTER the reset block).
257
+ if (sessionMetaFromSlice !== null && !state.session_meta_cached) {
258
+ // Guard against malformed session_meta timestamp — NaN would
259
+ // poison every subsequent `cost.total_duration` and the cached
260
+ // state.json (NaN→null on JSON.stringify, then defaults back to 0
261
+ // on next read, causing intermittent zero-duration bugs).
262
+ const startMs = Date.parse(sessionMetaFromSlice.timestamp);
263
+ state.session_start_ms = Number.isFinite(startMs) ? startMs : 0;
264
+ state.session_meta_cached = true;
265
+ state.last_model = (0, api_request_1.defaultModelFromSessionMeta)(sessionMetaFromSlice);
266
+ }
267
+ // Collect all events from each phase into a single batch. ALL cursor
268
+ // advances are staged in locals and committed atomically only AFTER
269
+ // POST success. On POST failure the cursor stays stale so the next
270
+ // Stop retries the exact same rollout rows + the deterministic event
271
+ // ids dedup at the backend. Half-staging (some fields direct, some
272
+ // staged) would produce duplicate api_request ids on retry.
273
+ const batch = [];
274
+ let statusSigStaged = null;
275
+ let statusEmitMsStaged = null;
276
+ // When the worker supplied `preloadedLines`, `newLines` holds the WHOLE
277
+ // rollout (process-analytics.ts:54-61 parses the full file once for
278
+ // both pipelines). In that case the walk is from-zero, so the staged
279
+ // accumulators MUST start at 0 / null — otherwise every Stop after the
280
+ // first double-counts the prior emit's cumulative totals (Stop 2 ships
281
+ // `cumulative_cost_usd = prior + Σ(all rollout)`; Stop 3 ships
282
+ // `2×prior + Σ(all rollout)`; etc.). Wire impact:
283
+ // `session_status.cost.total_cost_usd` grows ~Nx by the Nth Stop, and
284
+ // `session_status.id` derivation (uses `apiResponseCount`) walks a
285
+ // shifted namespace so deterministic dedup breaks. The incremental
286
+ // path (no preloadedLines, cursor-based slice) is unaffected.
287
+ const fullWalk = opts.preloadedLines !== undefined;
288
+ let apiResponseCountStaged = fullWalk ? 0 : state.api_response_count;
289
+ let lastTurnIdStaged = fullWalk ? null : state.last_turn_id;
290
+ let turnTokenSeqStaged = fullWalk ? 0 : state.turn_token_seq;
291
+ // Even on a full-walk, seed the model from `state.last_model` (which is
292
+ // already either the session_meta default cached at line ~357 or
293
+ // `"gpt-5.5"` after a reset). An earlier version cleared this to `""`
294
+ // on the assumption that `session_meta` lines in the walk would
295
+ // re-populate it — they do not (`deriveCodexApiRequestEvents` only
296
+ // advances `currentModel` on `turn_context` lines). Any `token_count`
297
+ // that precedes the first `turn_context` in the slice would otherwise
298
+ // ship `api_request.model = ""` (diverges from Claude's `<unknown>`
299
+ // fallback AND from the import path which passes
300
+ // `defaultModelFromSessionMeta`). `state.last_model` always carries a
301
+ // sensible value by this point.
302
+ let lastModelStaged = state.last_model;
303
+ let cumulativeCostUsdStaged = fullWalk ? 0 : state.cumulative_cost_usd;
304
+ // ─── api_request + session_status: single interleaved walk ──────────────
305
+ // One token_count walk drives BOTH event types so:
306
+ // - api_request gets one event per token_count (rate-limit / cost
307
+ // audit, default-on)
308
+ // - session_status emits per-token_count too, gated by event-time
309
+ // throttle + skip-if-unchanged. Mirrors Claude statusline cadence:
310
+ // a long single-prompt turn that fires many API calls now produces
311
+ // a context-growth time series, not just one final snapshot.
312
+ //
313
+ // Throttle uses EVENT-TIME (`tc.ts - runningLastEmitMs`), NOT wall-clock
314
+ // `Date.now()`. The detached worker processes many token_counts in one
315
+ // pass; wall-clock would skip every emit after the first within a
316
+ // single Stop (now-now ≈ 0ms < throttle window), collapsing back to
317
+ // legacy "one session_status per Stop" behavior. Event-time spaces
318
+ // emits across the real session timeline regardless of how many
319
+ // token_counts land in one batch.
320
+ //
321
+ // The walk advances turn cursors + api-response counter even when the
322
+ // api_request emit gate is off (`analytics.emitApiRequestEvents: false`),
323
+ // because session_status' cumulative `total_cost_usd` and event id
324
+ // derivation depend on those running totals.
325
+ const emitApiRequest = (0, config_1.isAnalyticsApiRequestEventsEnabled)(opts.projectDir);
326
+ const sessionStatusGate = (0, config_1.isSessionStatusEnabled)(config) && state.session_meta_cached;
327
+ const minIntervalMs = Math.max(0, (0, config_1.getStatusLineEmitMinIntervalSeconds)(config)) * 1000;
328
+ let runningLastEmitMs = state.last_status_emit_ms;
329
+ let runningLastSig = state.last_status_signature;
330
+ let didEmitStatus = false;
331
+ if (newLines.length > 0) {
332
+ try {
333
+ const ctx = {
334
+ sessionId: opts.sessionId,
335
+ projectName,
336
+ userEmail: opts.userEmail,
337
+ usageType: opts.usageType,
338
+ usagePlan: opts.usagePlan,
339
+ // `state.last_model` is the right default for both walks.
340
+ // It's set to the session_meta default at line ~357 right
341
+ // after caching, or to `"gpt-5.5"` after rollout-rotation
342
+ // reset, so pre-first-`turn_context` `token_count` events
343
+ // get a sensible model label instead of empty string.
344
+ defaultModel: state.last_model,
345
+ };
346
+ const { events, tokenCounts, finalState } = (0, api_request_1.deriveCodexApiRequestEvents)(newLines, ctx, {
347
+ turn_id: lastTurnIdStaged,
348
+ turn_token_seq: turnTokenSeqStaged,
349
+ model: lastModelStaged,
350
+ });
351
+ for (let i = 0; i < events.length; i++) {
352
+ const ev = events[i];
353
+ const { tc, ts } = tokenCounts[i];
354
+ if (emitApiRequest) {
355
+ batch.push(ev);
356
+ }
357
+ apiResponseCountStaged += 1;
358
+ // Accumulate per-call cost regardless of the api_request
359
+ // emit gate — session_status' cumulative `total_cost_usd`
360
+ // needs the full session total even when api_request events
361
+ // are suppressed by `analytics.emitApiRequestEvents: false`.
362
+ if (Number.isFinite(ev.cost_usd)) {
363
+ cumulativeCostUsdStaged += ev.cost_usd;
364
+ }
365
+ // Per-token_count session_status emit. Event-time throttle
366
+ // + skip-if-unchanged + per-call running model so a
367
+ // mid-slice turn_context switch is reflected in the next
368
+ // status emit's `model` label (not just the slice-end
369
+ // model).
370
+ if (!sessionStatusGate) {
371
+ continue;
372
+ }
373
+ if (minIntervalMs > 0 && ts - runningLastEmitMs < minIntervalMs) {
374
+ continue;
375
+ }
376
+ try {
377
+ const statusCtx = {
378
+ sessionId: opts.sessionId,
379
+ projectName,
380
+ userEmail: opts.userEmail,
381
+ usageType: opts.usageType,
382
+ usagePlan: opts.usagePlan,
383
+ // Use THIS event's model — captures intra-slice
384
+ // turn_context switches accurately (old "latest
385
+ // only" code happened to be correct because it
386
+ // only emitted from the slice's last token_count;
387
+ // per-iteration must use ev.model explicitly).
388
+ model: ev.model,
389
+ sessionStartMs: state.session_start_ms,
390
+ // Already incremented above — reflects this
391
+ // token_count, so event ids are unique per emit.
392
+ apiResponseCount: apiResponseCountStaged,
393
+ activityId: opts.activityId ?? "",
394
+ // Cumulative through THIS call (already added above).
395
+ totalCostUsd: cumulativeCostUsdStaged,
396
+ };
397
+ const sev = (0, status_snapshot_1.buildCodexSessionStatusEvent)(tc, ts, statusCtx);
398
+ if (sev === null) {
399
+ continue;
400
+ }
401
+ const sig = (0, status_snapshot_1.computeCodexStatusSignature)(sev);
402
+ if (sig === runningLastSig) {
403
+ continue;
404
+ }
405
+ batch.push(sev);
406
+ runningLastSig = sig;
407
+ runningLastEmitMs = ts;
408
+ didEmitStatus = true;
409
+ }
410
+ catch (e) {
411
+ logger_1.logger.debug(`codex emit: session_status failed: ${e instanceof Error ? e.message : e}`);
412
+ }
413
+ }
414
+ lastTurnIdStaged = finalState.turn_id;
415
+ turnTokenSeqStaged = finalState.turn_token_seq;
416
+ lastModelStaged = finalState.model;
417
+ }
418
+ catch (e) {
419
+ logger_1.logger.debug(`codex emit: api_request derivation failed: ${e instanceof Error ? e.message : e}`);
420
+ }
421
+ }
422
+ // Stage status gate state for POST-success commit. `runningLastEmitMs`
423
+ // now carries event-time (not wall-clock), so the gate next slice
424
+ // compares against real session-time progression.
425
+ if (didEmitStatus) {
426
+ statusSigStaged = runningLastSig;
427
+ statusEmitMsStaged = runningLastEmitMs;
428
+ }
429
+ // ─── Single batched POST (mirrors Claude analytics dispatch) ────────────
430
+ // Direct POST instead of the `send_event` queue because (a) api_request /
431
+ // session_status are already running in a detached worker so collector
432
+ // backpressure is acceptable, (b) symmetry with the session_analytics
433
+ // path which already POSTs directly.
434
+ if (batch.length > 0) {
435
+ if (!(0, config_1.isCollectorConfigured)(config)) {
436
+ logger_1.logger.debug(`codex emit: collector not configured — dropping batch=${batch.length}`);
437
+ return;
438
+ }
439
+ try {
440
+ await (0, collector_1.sendEventsBatchToCollector)(batch, opts.sessionId, opts.projectDir);
441
+ }
442
+ catch (e) {
443
+ logger_1.logger.debug(`codex emit: POST batch=${batch.length} failed: ${e instanceof Error ? e.message : e}`);
444
+ return; // do NOT advance cursor on failure → next Stop retries
445
+ }
446
+ // Commit POST-gated staging only on success. `last_status_signature`
447
+ // and `last_status_emit_ms` belong here because they gate FUTURE
448
+ // session_status emission — committing them on POST failure would
449
+ // suppress a session_status that never reached the collector.
450
+ if (statusSigStaged !== null && statusEmitMsStaged !== null) {
451
+ state.last_status_signature = statusSigStaged;
452
+ state.last_status_emit_ms = statusEmitMsStaged;
453
+ }
454
+ }
455
+ // Walk-state accumulators are POST-independent — they reflect what we
456
+ // OBSERVED in the rollout, not what we successfully POSTed. They MUST
457
+ // commit on every successful walk (including batch=0 cases like
458
+ // `emitApiRequestEvents: false` + session_status throttled/unchanged),
459
+ // otherwise the cursor advances past lines whose accumulation was lost.
460
+ // Trigger: gate off + status quiet → next emit re-derives from stale
461
+ // state → wrong `session_status.cost.total_cost_usd`, wrong
462
+ // `api_request.turn_id`, colliding `session_status.id`. The cursor
463
+ // advance below (skipped only on POST-failure early return) guarantees
464
+ // these accumulators can't be re-derived from rollout next time, so
465
+ // failing to commit them strands the accounting permanently.
466
+ state.api_response_count = apiResponseCountStaged;
467
+ state.last_turn_id = lastTurnIdStaged;
468
+ state.turn_token_seq = turnTokenSeqStaged;
469
+ state.last_model = lastModelStaged;
470
+ state.cumulative_cost_usd = cumulativeCostUsdStaged;
471
+ // ─── Persist cursor state ───────────────────────────────────────────────
472
+ // Skipped entirely when the POST failure path early-returned above —
473
+ // that's the correct "don't advance cursor on POST failure" invariant.
474
+ try {
475
+ state.rollout_read_offset = nextRolloutOffset;
476
+ const stats = (0, fs_1.statSync)(rolloutPath);
477
+ state.rollout_inode = Number(stats.ino);
478
+ state.rollout_size = Number(stats.size);
479
+ writeState(opts.projectDir, opts.sessionId, state);
480
+ }
481
+ catch (e) {
482
+ logger_1.logger.debug(`codex emit: state persist failed: ${e instanceof Error ? e.message : e}`);
483
+ }
484
+ }
485
+ /** Read new rollout lines from `state.rollout_read_offset` onwards. */
486
+ function readNewRolloutLines(path, fromOffset, prevInode, prevSize) {
487
+ const stats = (0, fs_1.statSync)(path);
488
+ const currentInode = Number(stats.ino);
489
+ const currentSize = Number(stats.size);
490
+ let resetDetected = false;
491
+ let startOffset = fromOffset;
492
+ if (prevInode !== 0 && currentInode !== prevInode) {
493
+ resetDetected = true;
494
+ startOffset = 0;
495
+ }
496
+ if (prevSize !== 0 && currentSize < prevSize) {
497
+ // Truncated/rewritten
498
+ resetDetected = true;
499
+ startOffset = 0;
500
+ }
501
+ if (startOffset >= currentSize) {
502
+ return { lines: [], nextOffset: startOffset, sessionMeta: null, resetDetected };
503
+ }
504
+ // Byte-range read — only load the new tail starting at `startOffset`.
505
+ // The earlier readFileSync + raw.slice(startOffset) allocated the whole
506
+ // file as a string just to discard the prefix. For a 5MB rollout where
507
+ // new data is 10KB, that's a 500× memory waste per Stop.
508
+ const sliceLen = currentSize - startOffset;
509
+ const buf = Buffer.alloc(sliceLen);
510
+ const fd = (0, fs_1.openSync)(path, "r");
511
+ try {
512
+ (0, fs_1.readSync)(fd, buf, 0, sliceLen, startOffset);
513
+ }
514
+ finally {
515
+ try {
516
+ (0, fs_1.closeSync)(fd);
517
+ }
518
+ catch { /* ignore */ }
519
+ }
520
+ const slice = buf.toString("utf-8");
521
+ const lines = [];
522
+ let sessionMeta = null;
523
+ let cursor = 0;
524
+ let lastCompleteByte = startOffset;
525
+ while (cursor < slice.length) {
526
+ const nlIdx = slice.indexOf("\n", cursor);
527
+ if (nlIdx < 0) {
528
+ break;
529
+ }
530
+ const lineStr = slice.slice(cursor, nlIdx);
531
+ const startInFile = startOffset + cursor;
532
+ const endInFile = startOffset + nlIdx + 1;
533
+ if (lineStr.length > 0) {
534
+ try {
535
+ const parsed = JSON.parse(lineStr);
536
+ lines.push(parsed);
537
+ if (parsed.type === "session_meta" && sessionMeta === null) {
538
+ sessionMeta = parsed.payload;
539
+ }
540
+ }
541
+ catch (e) {
542
+ logger_1.logger.debug(`codex emit: malformed rollout line at byte ${startInFile}: ${e instanceof Error ? e.message : e}`);
543
+ }
544
+ }
545
+ lastCompleteByte = endInFile;
546
+ cursor = nlIdx + 1;
547
+ }
548
+ // If we never read session_meta from this slice but startOffset is 0,
549
+ // we just don't have one — caller already handles that.
550
+ if (sessionMeta === null && startOffset === 0 && lines.length > 0 && lines[0].type === "session_meta") {
551
+ sessionMeta = lines[0].payload;
552
+ }
553
+ return { lines, nextOffset: lastCompleteByte, sessionMeta, resetDetected };
554
+ }
555
+ //# sourceMappingURL=events-emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-emit.js","sourceRoot":"","sources":["../../../src/analytics/codex/events-emit.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;;AAiMH,gDAqWC;AApiBD,2BAAoI;AACpI,+BAAqC;AACrC,6CAA0C;AAC1C,sDAA8D;AAC9D,6CAS0B;AAC1B,mDAAiE;AAEjE,+CAKuB;AACvB,uDAI2B;AAC3B,6CAAoD;AA+CpD,SAAS,YAAY;IACjB,OAAO;QACH,aAAa,EAAE,CAAC;QAChB,YAAY,EAAE,CAAC;QACf,mBAAmB,EAAE,CAAC;QACtB,qBAAqB,EAAE,EAAE;QACzB,mBAAmB,EAAE,CAAC;QACtB,kBAAkB,EAAE,CAAC;QACrB,cAAc,EAAE,CAAC;QACjB,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,SAAS;QACrB,gBAAgB,EAAE,CAAC;QACnB,mBAAmB,EAAE,KAAK;QAC1B,mBAAmB,EAAE,CAAC;KACzB,CAAC;AACN,CAAC;AAED,SAAS,QAAQ,CAAC,UAAkB,EAAE,SAAiB;IACnD,OAAO,IAAA,WAAI,EAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,SAAS,CAAC,UAAkB,EAAE,SAAiB;IACpD,OAAO,IAAA,WAAI,EAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,YAAY,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,SAAS,CAAC,UAAkB,EAAE,SAAiB;IACpD,MAAM,IAAI,GAAW,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACtD,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC,EAAE,CAAC;QACpB,OAAO,YAAY,EAAE,CAAC;IAC1B,CAAC;IACD,IAAI,CAAC;QACD,MAAM,GAAG,GAAW,IAAA,iBAAY,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAChD,+DAA+D;YAC/D,2DAA2D;YAC3D,6DAA6D;YAC7D,4DAA4D;YAC5D,oDAAoD;YACpD,OAAO,mBAAmB,CAAC,YAAY,EAAE,EAAE,MAAiC,CAAC,CAAC;QAClF,CAAC;IACL,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,YAAY,EAAE,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,IAAoB,EAAE,QAAiC;IAChF,MAAM,GAAG,GAAmB,EAAE,GAAG,IAAI,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;YACjB,SAAS,CAAC,iDAAiD;QAC/D,CAAC;QACD,MAAM,UAAU,GAAa,IAA2C,CAAC,GAAG,CAAC,CAAC;QAC9E,MAAM,OAAO,GAAW,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,UAAU,CAAC;QAC3E,MAAM,OAAO,GAAW,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC;QAC7D,sEAAsE;QACtE,IAAI,GAAG,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACrC,GAA0C,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACxD,SAAS;QACb,CAAC;QACD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACtB,SAAS,CAAC,+BAA+B;QAC7C,CAAC;QACD,IAAI,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAa,CAAC,EAAE,CAAC;YAC1D,SAAS,CAAC,gCAAgC;QAC9C,CAAC;QACA,GAA0C,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAC3D,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,UAAkB,EAAE,SAAiB,EAAE,KAAqB;IAC5E,MAAM,IAAI,GAAW,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACtD,IAAI,CAAC;QACD,IAAA,cAAS,EAAC,IAAA,cAAO,EAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAW,GAAG,IAAI,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;QACjD,IAAA,kBAAa,EAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC5D,IAAA,eAAU,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;AACL,CAAC;AA0BD;;;GAGG;AACI,KAAK,UAAU,kBAAkB,CAAC,IAA4B;IACjE,MAAM,MAAM,GAAkB,IAAA,mBAAU,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAE1D,yEAAyE;IACzE,oEAAoE;IACpE,yDAAyD;IACzD,WAAW;IACX,IAAI,CAAC,IAAA,2BAAkB,EAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACvC,eAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC1D,OAAO;IACX,CAAC;IACD,sEAAsE;IACtE,wEAAwE;IACxE,2CAA2C;IAC3C,IAAI,CAAC,IAAA,qCAA4B,EAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACjD,eAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC3D,OAAO;IACX,CAAC;IAED,IAAI,WAAW,GAAkB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;IAC1D,IAAI,WAAW,KAAK,IAAI,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;QACnD,WAAW,GAAG,IAAA,iCAAoB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACvB,eAAM,CAAC,KAAK,CAAC,6CAA6C,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC5E,OAAO;IACX,CAAC;IAED,MAAM,KAAK,GAAmB,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACzE,8EAA8E;IAC9E,yEAAyE;IACzE,uEAAuE;IACvE,iFAAiF;IACjF,yEAAyE;IACzE,qEAAqE;IACrE,kEAAkE;IAClE,MAAM,WAAW,GAAW,IAAI,CAAC,WAAW,IAAI,IAAA,4BAAkB,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEpF,4EAA4E;IAC5E,IAAI,QAAQ,GAAuB,EAAE,CAAC;IACtC,IAAI,iBAAiB,GAAW,KAAK,CAAC,mBAAmB,CAAC;IAC1D,IAAI,oBAAoB,GAAmC,IAAI,CAAC;IAChE,IAAI,aAAa,GAAY,KAAK,CAAC;IACnC,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACpC,+DAA+D;QAC/D,4DAA4D;QAC5D,8DAA8D;QAC9D,4DAA4D;QAC5D,0CAA0C;QAC1C,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC;QAC/B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACnC,IAAI,EAAE,CAAC,IAAI,KAAK,cAAc,IAAI,oBAAoB,KAAK,IAAI,EAAE,CAAC;gBAC9D,oBAAoB,GAAG,EAAE,CAAC,OAAkC,CAAC;gBAC7D,MAAM;YACV,CAAC;QACL,CAAC;QACD,IAAI,CAAC;YACD,MAAM,KAAK,GAAU,IAAA,aAAQ,EAAC,WAAW,CAAC,CAAC;YAC3C,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,aAAa,EAAE,CAAC;gBACzE,aAAa,GAAG,IAAI,CAAC;YACzB,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,oDAAoD;QACxD,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC;YACD,MAAM,KAAK,GACP,mBAAmB,CAAC,WAAW,EAAE,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;YACzG,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC;YACvB,iBAAiB,GAAG,KAAK,CAAC,UAAU,CAAC;YACrC,oBAAoB,GAAG,KAAK,CAAC,WAAW,CAAC;YACzC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QACxC,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YAClB,eAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3F,CAAC;IACL,CAAC;IACD,oEAAoE;IACpE,mEAAmE;IACnE,mEAAmE;IACnE,kEAAkE;IAClE,gEAAgE;IAChE,2DAA2D;IAC3D,kEAAkE;IAClE,kDAAkD;IAClD,IAAI,aAAa,EAAE,CAAC;QAChB,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC9B,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC;QACzB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;QAC1B,KAAK,CAAC,kBAAkB,GAAG,CAAC,CAAC;QAC7B,KAAK,CAAC,mBAAmB,GAAG,KAAK,CAAC;QAClC,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAC3B,iEAAiE;QACjE,kEAAkE;QAClE,kEAAkE;QAClE,wDAAwD;QACxD,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC9B,8DAA8D;QAC9D,6DAA6D;QAC7D,wDAAwD;QACxD,+DAA+D;QAC/D,sDAAsD;QACtD,+DAA+D;QAC/D,kBAAkB;QAClB,+DAA+D;QAC/D,+DAA+D;QAC/D,2CAA2C;QAC3C,6DAA6D;QAC7D,sDAAsD;QACtD,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC;QACjC,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC9B,2DAA2D;QAC3D,+DAA+D;QAC/D,sDAAsD;QACtD,6DAA6D;QAC7D,qDAAqD;QACrD,iDAAiD;QACjD,+DAA+D;QAC/D,0DAA0D;QAC1D,WAAW;QACX,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;IACjC,CAAC;IACD,iEAAiE;IACjE,qEAAqE;IACrE,wCAAwC;IACxC,IAAI,oBAAoB,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAC9D,6DAA6D;QAC7D,+DAA+D;QAC/D,kEAAkE;QAClE,0DAA0D;QAC1D,MAAM,OAAO,GAAW,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QACnE,KAAK,CAAC,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,KAAK,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACjC,KAAK,CAAC,UAAU,GAAG,IAAA,yCAA2B,EAAC,oBAAoB,CAAC,CAAC;IACzE,CAAC;IAED,qEAAqE;IACrE,oEAAoE;IACpE,mEAAmE;IACnE,qEAAqE;IACrE,mEAAmE;IACnE,4DAA4D;IAC5D,MAAM,KAAK,GAAY,EAAE,CAAC;IAC1B,IAAI,eAAe,GAAkB,IAAI,CAAC;IAC1C,IAAI,kBAAkB,GAAkB,IAAI,CAAC;IAC7C,wEAAwE;IACxE,oEAAoE;IACpE,qEAAqE;IACrE,uEAAuE;IACvE,uEAAuE;IACvE,+DAA+D;IAC/D,kDAAkD;IAClD,sEAAsE;IACtE,mEAAmE;IACnE,mEAAmE;IACnE,8DAA8D;IAC9D,MAAM,QAAQ,GAAY,IAAI,CAAC,cAAc,KAAK,SAAS,CAAC;IAC5D,IAAI,sBAAsB,GAAW,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC;IAC7E,IAAI,gBAAgB,GAAkB,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;IAC3E,IAAI,kBAAkB,GAAW,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;IACrE,wEAAwE;IACxE,iEAAiE;IACjE,sEAAsE;IACtE,gEAAgE;IAChE,mEAAmE;IACnE,sEAAsE;IACtE,sEAAsE;IACtE,oEAAoE;IACpE,iDAAiD;IACjD,sEAAsE;IACtE,gCAAgC;IAChC,IAAI,eAAe,GAAW,KAAK,CAAC,UAAU,CAAC;IAC/C,IAAI,uBAAuB,GAAW,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;IAE/E,2EAA2E;IAC3E,mDAAmD;IACnD,oEAAoE;IACpE,yBAAyB;IACzB,oEAAoE;IACpE,uEAAuE;IACvE,uEAAuE;IACvE,iEAAiE;IACjE,EAAE;IACF,yEAAyE;IACzE,uEAAuE;IACvE,kEAAkE;IAClE,oEAAoE;IACpE,mEAAmE;IACnE,gEAAgE;IAChE,kCAAkC;IAClC,EAAE;IACF,sEAAsE;IACtE,0EAA0E;IAC1E,mEAAmE;IACnE,6CAA6C;IAC7C,MAAM,cAAc,GAAY,IAAA,2CAAkC,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpF,MAAM,iBAAiB,GAAY,IAAA,+BAAsB,EAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC;IAC/F,MAAM,aAAa,GAAW,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAA,4CAAmC,EAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC;IAC9F,IAAI,iBAAiB,GAAW,KAAK,CAAC,mBAAmB,CAAC;IAC1D,IAAI,cAAc,GAAW,KAAK,CAAC,qBAAqB,CAAC;IACzD,IAAI,aAAa,GAAY,KAAK,CAAC;IAEnC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC;YACD,MAAM,GAAG,GAA2B;gBAChC,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,WAAW;gBACX,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,0DAA0D;gBAC1D,0DAA0D;gBAC1D,0DAA0D;gBAC1D,0DAA0D;gBAC1D,sDAAsD;gBACtD,YAAY,EAAE,KAAK,CAAC,UAAU;aACjC,CAAC;YACF,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,IAAA,yCAA2B,EAAC,QAAQ,EAAE,GAAG,EAAE;gBACnF,OAAO,EAAE,gBAAgB;gBACzB,cAAc,EAAE,kBAAkB;gBAClC,KAAK,EAAE,eAAe;aACzB,CAAC,CAAC;YACH,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,EAAE,GAA6B,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC/C,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,GAA+C,WAAW,CAAC,CAAC,CAAC,CAAC;gBAE9E,IAAI,cAAc,EAAE,CAAC;oBACjB,KAAK,CAAC,IAAI,CAAC,EAAsB,CAAC,CAAC;gBACvC,CAAC;gBACD,sBAAsB,IAAI,CAAC,CAAC;gBAC5B,yDAAyD;gBACzD,0DAA0D;gBAC1D,4DAA4D;gBAC5D,6DAA6D;gBAC7D,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC/B,uBAAuB,IAAI,EAAE,CAAC,QAAQ,CAAC;gBAC3C,CAAC;gBAED,2DAA2D;gBAC3D,oDAAoD;gBACpD,yDAAyD;gBACzD,sDAAsD;gBACtD,UAAU;gBACV,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACrB,SAAS;gBACb,CAAC;gBACD,IAAI,aAAa,GAAG,CAAC,IAAI,EAAE,GAAG,iBAAiB,GAAG,aAAa,EAAE,CAAC;oBAC9D,SAAS;gBACb,CAAC;gBACD,IAAI,CAAC;oBACD,MAAM,SAAS,GAA8B;wBACzC,SAAS,EAAE,IAAI,CAAC,SAAS;wBACzB,WAAW;wBACX,SAAS,EAAE,IAAI,CAAC,SAAS;wBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;wBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;wBACzB,gDAAgD;wBAChD,gDAAgD;wBAChD,+CAA+C;wBAC/C,kDAAkD;wBAClD,+CAA+C;wBAC/C,KAAK,EAAE,EAAE,CAAC,KAAK;wBACf,cAAc,EAAE,KAAK,CAAC,gBAAgB;wBACtC,4CAA4C;wBAC5C,iDAAiD;wBACjD,gBAAgB,EAAE,sBAAsB;wBACxC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;wBACjC,sDAAsD;wBACtD,YAAY,EAAE,uBAAuB;qBACxC,CAAC;oBACF,MAAM,GAAG,GACL,IAAA,8CAA4B,EAAC,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;oBACpD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;wBACf,SAAS;oBACb,CAAC;oBACD,MAAM,GAAG,GAAW,IAAA,6CAA2B,EAAC,GAAG,CAAC,CAAC;oBACrD,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;wBACzB,SAAS;oBACb,CAAC;oBACD,KAAK,CAAC,IAAI,CAAC,GAAuB,CAAC,CAAC;oBACpC,cAAc,GAAG,GAAG,CAAC;oBACrB,iBAAiB,GAAG,EAAE,CAAC;oBACvB,aAAa,GAAG,IAAI,CAAC;gBACzB,CAAC;gBAAC,OAAO,CAAU,EAAE,CAAC;oBAClB,eAAM,CAAC,KAAK,CAAC,sCAAsC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC7F,CAAC;YACL,CAAC;YACD,gBAAgB,GAAG,UAAU,CAAC,OAAO,CAAC;YACtC,kBAAkB,GAAG,UAAU,CAAC,cAAc,CAAC;YAC/C,eAAe,GAAG,UAAU,CAAC,KAAK,CAAC;QACvC,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YAClB,eAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrG,CAAC;IACL,CAAC;IAED,uEAAuE;IACvE,kEAAkE;IAClE,kDAAkD;IAClD,IAAI,aAAa,EAAE,CAAC;QAChB,eAAe,GAAG,cAAc,CAAC;QACjC,kBAAkB,GAAG,iBAAiB,CAAC;IAC3C,CAAC;IAED,2EAA2E;IAC3E,0EAA0E;IAC1E,uEAAuE;IACvE,sEAAsE;IACtE,qCAAqC;IACrC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,IAAA,8BAAqB,EAAC,MAAM,CAAC,EAAE,CAAC;YACjC,eAAM,CAAC,KAAK,CAAC,yDAAyD,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACtF,OAAO;QACX,CAAC;QACD,IAAI,CAAC;YACD,MAAM,IAAA,sCAA0B,EAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YAClB,eAAM,CAAC,KAAK,CAAC,0BAA0B,KAAK,CAAC,MAAM,YAAY,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrG,OAAO,CAAC,uDAAuD;QACnE,CAAC;QACD,qEAAqE;QACrE,iEAAiE;QACjE,kEAAkE;QAClE,8DAA8D;QAC9D,IAAI,eAAe,KAAK,IAAI,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;YAC1D,KAAK,CAAC,qBAAqB,GAAG,eAAe,CAAC;YAC9C,KAAK,CAAC,mBAAmB,GAAG,kBAAkB,CAAC;QACnD,CAAC;IACL,CAAC;IACD,sEAAsE;IACtE,sEAAsE;IACtE,gEAAgE;IAChE,uEAAuE;IACvE,wEAAwE;IACxE,qEAAqE;IACrE,4DAA4D;IAC5D,mEAAmE;IACnE,uEAAuE;IACvE,oEAAoE;IACpE,6DAA6D;IAC7D,KAAK,CAAC,kBAAkB,GAAG,sBAAsB,CAAC;IAClD,KAAK,CAAC,YAAY,GAAG,gBAAgB,CAAC;IACtC,KAAK,CAAC,cAAc,GAAG,kBAAkB,CAAC;IAC1C,KAAK,CAAC,UAAU,GAAG,eAAe,CAAC;IACnC,KAAK,CAAC,mBAAmB,GAAG,uBAAuB,CAAC;IAEpD,2EAA2E;IAC3E,qEAAqE;IACrE,uEAAuE;IACvE,IAAI,CAAC;QACD,KAAK,CAAC,mBAAmB,GAAG,iBAAiB,CAAC;QAC9C,MAAM,KAAK,GAAU,IAAA,aAAQ,EAAC,WAAW,CAAC,CAAC;QAC3C,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;AACL,CAAC;AAED,uEAAuE;AACvE,SAAS,mBAAmB,CACxB,IAAY,EACZ,UAAkB,EAClB,SAAiB,EACjB,QAAgB;IAEhB,MAAM,KAAK,GAAU,IAAA,aAAQ,EAAC,IAAI,CAAC,CAAC;IACpC,MAAM,YAAY,GAAW,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAW,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,aAAa,GAAY,KAAK,CAAC;IACnC,IAAI,WAAW,GAAW,UAAU,CAAC;IACrC,IAAI,SAAS,KAAK,CAAC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAChD,aAAa,GAAG,IAAI,CAAC;QACrB,WAAW,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,QAAQ,KAAK,CAAC,IAAI,WAAW,GAAG,QAAQ,EAAE,CAAC;QAC3C,sBAAsB;QACtB,aAAa,GAAG,IAAI,CAAC;QACrB,WAAW,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;QAC7B,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IACpF,CAAC;IACD,sEAAsE;IACtE,wEAAwE;IACxE,uEAAuE;IACvE,yDAAyD;IACzD,MAAM,QAAQ,GAAW,WAAW,GAAG,WAAW,CAAC;IACnD,MAAM,GAAG,GAAW,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAW,IAAA,aAAQ,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC;QACD,IAAA,aAAQ,EAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChD,CAAC;YAAS,CAAC;QACP,IAAI,CAAC;YAAC,IAAA,cAAS,EAAC,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,KAAK,GAAW,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,IAAI,WAAW,GAAmC,IAAI,CAAC;IACvD,IAAI,MAAM,GAAW,CAAC,CAAC;IACvB,IAAI,gBAAgB,GAAW,WAAW,CAAC;IAC3C,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAW,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACZ,MAAM;QACV,CAAC;QACD,MAAM,OAAO,GAAW,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACnD,MAAM,WAAW,GAAW,WAAW,GAAG,MAAM,CAAC;QACjD,MAAM,SAAS,GAAW,WAAW,GAAG,KAAK,GAAG,CAAC,CAAC;QAClD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC;gBACD,MAAM,MAAM,GAAqB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAqB,CAAC;gBACzE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnB,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;oBACzD,WAAW,GAAG,MAAM,CAAC,OAAkC,CAAC;gBAC5D,CAAC;YACL,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBAClB,eAAM,CAAC,KAAK,CAAC,8CAA8C,WAAW,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrH,CAAC;QACL,CAAC;QACD,gBAAgB,GAAG,SAAS,CAAC;QAC7B,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;IACvB,CAAC;IACD,sEAAsE;IACtE,wDAAwD;IACxD,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACpG,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAkC,CAAC;IAC9D,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * OpenAI Codex CLI model pricing — USD per 1M tokens.
3
+ *
4
+ * Source: https://developers.openai.com/api/docs/pricing (May 2026 snapshot).
5
+ *
6
+ * Codex single-tier `cached_input_tokens` — no 5m/1h split like Anthropic.
7
+ * `reasoning_output_tokens` is billed at the output rate (per OpenAI's
8
+ * documented pricing model).
9
+ *
10
+ * Long-context tier kicks in above `long_context_threshold` input tokens;
11
+ * we currently apply that tier when `input_tokens > threshold`. Refine if
12
+ * production telemetry shows OpenAI changes the per-request threshold rule.
13
+ *
14
+ * Backend may recompute from raw token counts with authoritative pricing.
15
+ * This is a best-effort client estimate so analytics carry a `cost_usd`
16
+ * field without a network call.
17
+ */
18
+ import { CodexTokenUsage } from "./types";
19
+ export interface CodexModelPricing {
20
+ /** USD per 1M fresh (non-cached) input tokens. */
21
+ input_per_1m_usd: number;
22
+ /** USD per 1M cached input tokens (prompt cache hit). */
23
+ cached_input_per_1m_usd: number;
24
+ /** USD per 1M output tokens (`output_tokens` field already includes `reasoning_output_tokens` as a subset; total_tokens = input + output empirically across real rollouts). */
25
+ output_per_1m_usd: number;
26
+ /** Long-context threshold (input tokens). Above this, long-context rates apply. */
27
+ long_context_threshold?: number;
28
+ /** USD per 1M input tokens in the long-context tier. */
29
+ long_input_per_1m_usd?: number;
30
+ /** USD per 1M output tokens in the long-context tier. */
31
+ long_output_per_1m_usd?: number;
32
+ }
33
+ /**
34
+ * Exact-id pricing keys. Falls back to GPT-5.5 default for unrecognized
35
+ * model strings (Codex model_provider tag is coarse — `"openai"` — and
36
+ * the precise model id comes through `TurnContextItem.model`).
37
+ */
38
+ export declare const CODEX_PRICING: Record<string, CodexModelPricing>;
39
+ /**
40
+ * Resolve pricing by exact id with family-prefix fallback. Returns `null` for
41
+ * a completely unknown model (mirrors Claude's `lookupPricing` semantic at
42
+ * `analytics/claude/pricing.ts`). Without null on miss, an unrecognized
43
+ * model id was silently priced at gpt-5.5 default rates — backend cost
44
+ * dashboards couldn't distinguish "real gpt-5.5 session" from "unknown-
45
+ * model session estimated at gpt-5.5 rates", and the Claude vs Codex
46
+ * unknown-model semantics diverged (Claude shipped `cost_usd: 0` as a
47
+ * data-quality flag; Codex shipped a positive estimate).
48
+ */
49
+ export declare function resolveCodexPricing(model: string | null | undefined): CodexModelPricing | null;
50
+ /**
51
+ * Compute USD cost for one API call's token usage. Long-context tier
52
+ * applies above the configured threshold; otherwise standard rates apply.
53
+ *
54
+ * Returns 0 when both input and output are 0 (defensive — never throws).
55
+ */
56
+ export declare function computeCodexCost(model: string | null | undefined, usage: CodexTokenUsage | null | undefined): number;
57
+ //# sourceMappingURL=pricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../../src/analytics/codex/pricing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C,MAAM,WAAW,iBAAiB;IAC9B,kDAAkD;IAClD,gBAAgB,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,uBAAuB,EAAE,MAAM,CAAC;IAChC,+KAA+K;IAC/K,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mFAAmF;IACnF,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,wDAAwD;IACxD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,yDAAyD;IACzD,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CA6B3D,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,iBAAiB,GAAG,IAAI,CAgB9F;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,GAC1C,MAAM,CAuCR"}