@qduc/term2 0.14.0 → 0.15.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 (903) hide show
  1. package/dist/agent.d.ts +2 -0
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +17 -7
  4. package/dist/agent.js.map +1 -1
  5. package/dist/app-helpers.d.ts +4 -0
  6. package/dist/app-helpers.d.ts.map +1 -1
  7. package/dist/app-helpers.js +6 -0
  8. package/dist/app-helpers.js.map +1 -1
  9. package/dist/app.d.ts +1 -1
  10. package/dist/app.d.ts.map +1 -1
  11. package/dist/app.js +141 -13
  12. package/dist/app.js.map +1 -1
  13. package/dist/cli.js +112 -28
  14. package/dist/cli.js.map +1 -1
  15. package/dist/commands/auto-approve-command.js +3 -3
  16. package/dist/commands/auto-approve-command.js.map +1 -1
  17. package/dist/commands/guarded-settings-command.d.ts +3 -1
  18. package/dist/commands/guarded-settings-command.d.ts.map +1 -1
  19. package/dist/commands/guarded-settings-command.js +21 -5
  20. package/dist/commands/guarded-settings-command.js.map +1 -1
  21. package/dist/commands/mode-commands.d.ts +9 -2
  22. package/dist/commands/mode-commands.d.ts.map +1 -1
  23. package/dist/commands/mode-commands.js +12 -3
  24. package/dist/commands/mode-commands.js.map +1 -1
  25. package/dist/commands/usage-command.d.ts +10 -1
  26. package/dist/commands/usage-command.d.ts.map +1 -1
  27. package/dist/commands/usage-command.js +11 -1
  28. package/dist/commands/usage-command.js.map +1 -1
  29. package/dist/components/InputBox.js +14 -1
  30. package/dist/components/InputBox.js.map +1 -1
  31. package/dist/components/input/FirstRunSetupPrompt.js +1 -1
  32. package/dist/components/input/FirstRunSetupPrompt.js.map +1 -1
  33. package/dist/components/input/PendingQueueList.d.ts.map +1 -1
  34. package/dist/components/input/PendingQueueList.js +22 -5
  35. package/dist/components/input/PendingQueueList.js.map +1 -1
  36. package/dist/components/input/ProviderMenuSession.d.ts.map +1 -1
  37. package/dist/components/input/ProviderMenuSession.js +1 -0
  38. package/dist/components/input/ProviderMenuSession.js.map +1 -1
  39. package/dist/components/input/SettingsValueMenuSession.d.ts.map +1 -1
  40. package/dist/components/input/SettingsValueMenuSession.js +6 -0
  41. package/dist/components/input/SettingsValueMenuSession.js.map +1 -1
  42. package/dist/components/layout/BackgroundTaskManager.d.ts +2 -0
  43. package/dist/components/layout/BackgroundTaskManager.d.ts.map +1 -1
  44. package/dist/components/layout/BackgroundTaskManager.js +156 -64
  45. package/dist/components/layout/BackgroundTaskManager.js.map +1 -1
  46. package/dist/components/layout/BackgroundTasksPanel.d.ts +10 -1
  47. package/dist/components/layout/BackgroundTasksPanel.d.ts.map +1 -1
  48. package/dist/components/layout/BackgroundTasksPanel.js +193 -59
  49. package/dist/components/layout/BackgroundTasksPanel.js.map +1 -1
  50. package/dist/components/layout/BottomArea.d.ts +11 -1
  51. package/dist/components/layout/BottomArea.d.ts.map +1 -1
  52. package/dist/components/layout/BottomArea.js +30 -13
  53. package/dist/components/layout/BottomArea.js.map +1 -1
  54. package/dist/components/layout/StatusBar.d.ts +5 -0
  55. package/dist/components/layout/StatusBar.d.ts.map +1 -1
  56. package/dist/components/layout/StatusBar.js +45 -3
  57. package/dist/components/layout/StatusBar.js.map +1 -1
  58. package/dist/components/layout/live-task-rows.d.ts +16 -0
  59. package/dist/components/layout/live-task-rows.d.ts.map +1 -0
  60. package/dist/components/layout/live-task-rows.js +28 -0
  61. package/dist/components/layout/live-task-rows.js.map +1 -0
  62. package/dist/components/layout/terminal-text-budget.d.ts +4 -0
  63. package/dist/components/layout/terminal-text-budget.d.ts.map +1 -0
  64. package/dist/components/layout/terminal-text-budget.js +18 -0
  65. package/dist/components/layout/terminal-text-budget.js.map +1 -0
  66. package/dist/components/menu/ModelSelectionMenu.d.ts.map +1 -1
  67. package/dist/components/menu/ModelSelectionMenu.js +18 -5
  68. package/dist/components/menu/ModelSelectionMenu.js.map +1 -1
  69. package/dist/components/menu/ProviderSelectionMenu.d.ts.map +1 -1
  70. package/dist/components/menu/ProviderSelectionMenu.js +27 -2
  71. package/dist/components/menu/ProviderSelectionMenu.js.map +1 -1
  72. package/dist/components/menu/SettingsSelectionMenu.d.ts.map +1 -1
  73. package/dist/components/menu/SettingsSelectionMenu.js +5 -0
  74. package/dist/components/menu/SettingsSelectionMenu.js.map +1 -1
  75. package/dist/components/message/CommandGroupSummary.d.ts +9 -0
  76. package/dist/components/message/CommandGroupSummary.d.ts.map +1 -0
  77. package/dist/components/message/CommandGroupSummary.js +31 -0
  78. package/dist/components/message/CommandGroupSummary.js.map +1 -0
  79. package/dist/components/message/CommandMessage.d.ts +8 -0
  80. package/dist/components/message/CommandMessage.d.ts.map +1 -1
  81. package/dist/components/message/CommandMessage.js +54 -25
  82. package/dist/components/message/CommandMessage.js.map +1 -1
  83. package/dist/components/message/MessageList.d.ts +6 -2
  84. package/dist/components/message/MessageList.d.ts.map +1 -1
  85. package/dist/components/message/MessageList.js +64 -10
  86. package/dist/components/message/MessageList.js.map +1 -1
  87. package/dist/components/message/SubagentActivityMessage.js +4 -2
  88. package/dist/components/message/SubagentActivityMessage.js.map +1 -1
  89. package/dist/components/message/command-grouping.d.ts +43 -0
  90. package/dist/components/message/command-grouping.d.ts.map +1 -0
  91. package/dist/components/message/command-grouping.js +142 -0
  92. package/dist/components/message/command-grouping.js.map +1 -0
  93. package/dist/components/message/command-message-helpers.d.ts +6 -5
  94. package/dist/components/message/command-message-helpers.d.ts.map +1 -1
  95. package/dist/components/message/command-message-helpers.js +36 -0
  96. package/dist/components/message/command-message-helpers.js.map +1 -1
  97. package/dist/components/prompt/ApprovalPrompt.d.ts +1 -1
  98. package/dist/components/prompt/ApprovalPrompt.d.ts.map +1 -1
  99. package/dist/components/prompt/ApprovalPrompt.js +136 -90
  100. package/dist/components/prompt/ApprovalPrompt.js.map +1 -1
  101. package/dist/components/prompt/ModeSwitchConfirmationPrompt.d.ts +11 -0
  102. package/dist/components/prompt/ModeSwitchConfirmationPrompt.d.ts.map +1 -0
  103. package/dist/components/prompt/ModeSwitchConfirmationPrompt.js +50 -0
  104. package/dist/components/prompt/ModeSwitchConfirmationPrompt.js.map +1 -0
  105. package/dist/components/prompt/QueuePausedPrompt.d.ts.map +1 -1
  106. package/dist/components/prompt/QueuePausedPrompt.js +14 -8
  107. package/dist/components/prompt/QueuePausedPrompt.js.map +1 -1
  108. package/dist/contracts/application-stream.d.ts +7 -0
  109. package/dist/contracts/application-stream.d.ts.map +1 -1
  110. package/dist/contracts/conversation.d.ts +24 -1
  111. package/dist/contracts/conversation.d.ts.map +1 -1
  112. package/dist/contracts/conversation.js +8 -0
  113. package/dist/contracts/conversation.js.map +1 -1
  114. package/dist/contracts/streamed-model-turn.d.ts +22 -1
  115. package/dist/contracts/streamed-model-turn.d.ts.map +1 -1
  116. package/dist/core/index.d.ts +9 -0
  117. package/dist/core/index.d.ts.map +1 -0
  118. package/dist/core/index.js +8 -0
  119. package/dist/core/index.js.map +1 -0
  120. package/dist/core/session-runtime.d.ts +10 -0
  121. package/dist/core/session-runtime.d.ts.map +1 -0
  122. package/dist/core/session-runtime.js +9 -0
  123. package/dist/core/session-runtime.js.map +1 -0
  124. package/dist/gateway/assertion.d.ts +38 -0
  125. package/dist/gateway/assertion.d.ts.map +1 -0
  126. package/dist/gateway/assertion.js +146 -0
  127. package/dist/gateway/assertion.js.map +1 -0
  128. package/dist/gateway/contracts.d.ts +124 -0
  129. package/dist/gateway/contracts.d.ts.map +1 -0
  130. package/dist/gateway/contracts.js +13 -0
  131. package/dist/gateway/contracts.js.map +1 -0
  132. package/dist/gateway/gateway.d.ts +72 -0
  133. package/dist/gateway/gateway.d.ts.map +1 -0
  134. package/dist/gateway/gateway.js +1277 -0
  135. package/dist/gateway/gateway.js.map +1 -0
  136. package/dist/gateway/index.d.ts +22 -0
  137. package/dist/gateway/index.d.ts.map +1 -0
  138. package/dist/gateway/index.js +22 -0
  139. package/dist/gateway/index.js.map +1 -0
  140. package/dist/gateway/interaction-protocol.d.ts +76 -0
  141. package/dist/gateway/interaction-protocol.d.ts.map +1 -0
  142. package/dist/gateway/interaction-protocol.js +548 -0
  143. package/dist/gateway/interaction-protocol.js.map +1 -0
  144. package/dist/gateway/launcher.d.ts +8 -0
  145. package/dist/gateway/launcher.d.ts.map +1 -0
  146. package/dist/gateway/launcher.js +20 -0
  147. package/dist/gateway/launcher.js.map +1 -0
  148. package/dist/gateway/lifecycle.d.ts +12 -0
  149. package/dist/gateway/lifecycle.d.ts.map +1 -0
  150. package/dist/gateway/lifecycle.js +38 -0
  151. package/dist/gateway/lifecycle.js.map +1 -0
  152. package/dist/gateway/persistence/admission-persistence.d.ts +82 -0
  153. package/dist/gateway/persistence/admission-persistence.d.ts.map +1 -0
  154. package/dist/gateway/persistence/admission-persistence.js +215 -0
  155. package/dist/gateway/persistence/admission-persistence.js.map +1 -0
  156. package/dist/gateway/persistence/contracts.d.ts +94 -0
  157. package/dist/gateway/persistence/contracts.d.ts.map +1 -0
  158. package/dist/gateway/persistence/contracts.js +32 -0
  159. package/dist/gateway/persistence/contracts.js.map +1 -0
  160. package/dist/gateway/persistence/coordinator.d.ts +25 -0
  161. package/dist/gateway/persistence/coordinator.d.ts.map +1 -0
  162. package/dist/gateway/persistence/coordinator.js +181 -0
  163. package/dist/gateway/persistence/coordinator.js.map +1 -0
  164. package/dist/gateway/persistence/event-journal.d.ts +31 -0
  165. package/dist/gateway/persistence/event-journal.d.ts.map +1 -0
  166. package/dist/gateway/persistence/event-journal.js +378 -0
  167. package/dist/gateway/persistence/event-journal.js.map +1 -0
  168. package/dist/gateway/persistence/interaction-checkpoint.d.ts +17 -0
  169. package/dist/gateway/persistence/interaction-checkpoint.d.ts.map +1 -0
  170. package/dist/gateway/persistence/interaction-checkpoint.js +75 -0
  171. package/dist/gateway/persistence/interaction-checkpoint.js.map +1 -0
  172. package/dist/gateway/persistence/projection.d.ts +53 -0
  173. package/dist/gateway/persistence/projection.d.ts.map +1 -0
  174. package/dist/gateway/persistence/projection.js +226 -0
  175. package/dist/gateway/persistence/projection.js.map +1 -0
  176. package/dist/gateway/persistence/retention.d.ts +16 -0
  177. package/dist/gateway/persistence/retention.d.ts.map +1 -0
  178. package/dist/gateway/persistence/retention.js +93 -0
  179. package/dist/gateway/persistence/retention.js.map +1 -0
  180. package/dist/gateway/persistence/session-index.d.ts +34 -0
  181. package/dist/gateway/persistence/session-index.d.ts.map +1 -0
  182. package/dist/gateway/persistence/session-index.js +348 -0
  183. package/dist/gateway/persistence/session-index.js.map +1 -0
  184. package/dist/gateway/persistence/session-persistence.d.ts +68 -0
  185. package/dist/gateway/persistence/session-persistence.d.ts.map +1 -0
  186. package/dist/gateway/persistence/session-persistence.js +165 -0
  187. package/dist/gateway/persistence/session-persistence.js.map +1 -0
  188. package/dist/gateway/persistence/storage.d.ts +13 -0
  189. package/dist/gateway/persistence/storage.d.ts.map +1 -0
  190. package/dist/gateway/persistence/storage.js +87 -0
  191. package/dist/gateway/persistence/storage.js.map +1 -0
  192. package/dist/gateway/replay-ledger.d.ts +30 -0
  193. package/dist/gateway/replay-ledger.d.ts.map +1 -0
  194. package/dist/gateway/replay-ledger.js +83 -0
  195. package/dist/gateway/replay-ledger.js.map +1 -0
  196. package/dist/gateway/runtime-factory.d.ts +84 -0
  197. package/dist/gateway/runtime-factory.d.ts.map +1 -0
  198. package/dist/gateway/runtime-factory.js +213 -0
  199. package/dist/gateway/runtime-factory.js.map +1 -0
  200. package/dist/gateway/safe-log.d.ts +15 -0
  201. package/dist/gateway/safe-log.d.ts.map +1 -0
  202. package/dist/gateway/safe-log.js +89 -0
  203. package/dist/gateway/safe-log.js.map +1 -0
  204. package/dist/gateway/server-session.d.ts +65 -0
  205. package/dist/gateway/server-session.d.ts.map +1 -0
  206. package/dist/gateway/server-session.js +252 -0
  207. package/dist/gateway/server-session.js.map +1 -0
  208. package/dist/gateway/server.d.ts +42 -0
  209. package/dist/gateway/server.d.ts.map +1 -0
  210. package/dist/gateway/server.js +126 -0
  211. package/dist/gateway/server.js.map +1 -0
  212. package/dist/gateway/worker-boundary.d.ts +40 -0
  213. package/dist/gateway/worker-boundary.d.ts.map +1 -0
  214. package/dist/gateway/worker-boundary.js +149 -0
  215. package/dist/gateway/worker-boundary.js.map +1 -0
  216. package/dist/gateway/workspace-admission.d.ts +37 -0
  217. package/dist/gateway/workspace-admission.d.ts.map +1 -0
  218. package/dist/gateway/workspace-admission.js +285 -0
  219. package/dist/gateway/workspace-admission.js.map +1 -0
  220. package/dist/hooks/conversation-ui-reducer.d.ts +6 -0
  221. package/dist/hooks/conversation-ui-reducer.d.ts.map +1 -1
  222. package/dist/hooks/conversation-ui-reducer.js +3 -0
  223. package/dist/hooks/conversation-ui-reducer.js.map +1 -1
  224. package/dist/hooks/settings-completion-config.d.ts.map +1 -1
  225. package/dist/hooks/settings-completion-config.js +30 -2
  226. package/dist/hooks/settings-completion-config.js.map +1 -1
  227. package/dist/hooks/use-app-commands.d.ts +4 -1
  228. package/dist/hooks/use-app-commands.d.ts.map +1 -1
  229. package/dist/hooks/use-app-commands.js +14 -3
  230. package/dist/hooks/use-app-commands.js.map +1 -1
  231. package/dist/hooks/use-app-keyboard-shortcuts.d.ts +5 -0
  232. package/dist/hooks/use-app-keyboard-shortcuts.d.ts.map +1 -1
  233. package/dist/hooks/use-app-keyboard-shortcuts.js +11 -0
  234. package/dist/hooks/use-app-keyboard-shortcuts.js.map +1 -1
  235. package/dist/hooks/use-conversation.d.ts +1 -0
  236. package/dist/hooks/use-conversation.d.ts.map +1 -1
  237. package/dist/hooks/use-conversation.js +14 -3
  238. package/dist/hooks/use-conversation.js.map +1 -1
  239. package/dist/hooks/use-grok-credit-usage.d.ts +20 -0
  240. package/dist/hooks/use-grok-credit-usage.d.ts.map +1 -0
  241. package/dist/hooks/use-grok-credit-usage.js +48 -0
  242. package/dist/hooks/use-grok-credit-usage.js.map +1 -0
  243. package/dist/hooks/use-provider-selection.d.ts +10 -0
  244. package/dist/hooks/use-provider-selection.d.ts.map +1 -1
  245. package/dist/hooks/use-provider-selection.js +105 -6
  246. package/dist/hooks/use-provider-selection.js.map +1 -1
  247. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  248. package/dist/hooks/use-settings-value-completion.js +10 -2
  249. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  250. package/dist/lib/agent-client.d.ts +10 -3
  251. package/dist/lib/agent-client.d.ts.map +1 -1
  252. package/dist/lib/agent-client.js +115 -23
  253. package/dist/lib/agent-client.js.map +1 -1
  254. package/dist/lib/agent-configuration.d.ts +2 -0
  255. package/dist/lib/agent-configuration.d.ts.map +1 -1
  256. package/dist/lib/agent-configuration.js +6 -2
  257. package/dist/lib/agent-configuration.js.map +1 -1
  258. package/dist/lib/agent-factory.d.ts +2 -0
  259. package/dist/lib/agent-factory.d.ts.map +1 -1
  260. package/dist/lib/agent-factory.js +28 -10
  261. package/dist/lib/agent-factory.js.map +1 -1
  262. package/dist/lib/editor-impl.d.ts.map +1 -1
  263. package/dist/lib/editor-impl.js +14 -17
  264. package/dist/lib/editor-impl.js.map +1 -1
  265. package/dist/lib/harness-input-idle.d.ts +16 -0
  266. package/dist/lib/harness-input-idle.d.ts.map +1 -0
  267. package/dist/lib/harness-input-idle.js +51 -0
  268. package/dist/lib/harness-input-idle.js.map +1 -0
  269. package/dist/lib/input-owner.d.ts +3 -0
  270. package/dist/lib/input-owner.d.ts.map +1 -1
  271. package/dist/lib/input-owner.js +2 -0
  272. package/dist/lib/input-owner.js.map +1 -1
  273. package/dist/lib/subagent-bridge.d.ts +3 -3
  274. package/dist/lib/subagent-bridge.d.ts.map +1 -1
  275. package/dist/lib/subagent-bridge.js +16 -9
  276. package/dist/lib/subagent-bridge.js.map +1 -1
  277. package/dist/lib/tool-invoke.d.ts +2 -0
  278. package/dist/lib/tool-invoke.d.ts.map +1 -1
  279. package/dist/lib/tool-invoke.js +3 -0
  280. package/dist/lib/tool-invoke.js.map +1 -1
  281. package/dist/non-interactive.d.ts.map +1 -1
  282. package/dist/non-interactive.js +5 -0
  283. package/dist/non-interactive.js.map +1 -1
  284. package/dist/prompts/explorer-delegation-contract.test.ts +22 -0
  285. package/dist/prompts/gpt-5.6.md +1 -1
  286. package/dist/prompts/kimi.md +1 -1
  287. package/dist/prompts/orchestrator.md +10 -1
  288. package/dist/prompts/plan-mode-info.md +3 -3
  289. package/dist/prompts/plan-mode-stub.md +7 -0
  290. package/dist/prompts/prefix-quality.test.ts +102 -0
  291. package/dist/prompts/prompt-constructor.d.ts.map +1 -1
  292. package/dist/prompts/prompt-constructor.js +4 -1
  293. package/dist/prompts/prompt-constructor.js.map +1 -1
  294. package/dist/prompts/prompt-constructor.test.ts +12 -4
  295. package/dist/prompts/prompt-constructor.ts +4 -1
  296. package/dist/prompts/subagents/explorer.md +7 -1
  297. package/dist/prompts/subagents/librarian.md +2 -0
  298. package/dist/prompts/subagents/mentor.md +2 -0
  299. package/dist/prompts/subagents/worker.md +2 -0
  300. package/dist/providers/ai-sdk-streamed-model.d.ts +5 -0
  301. package/dist/providers/ai-sdk-streamed-model.d.ts.map +1 -1
  302. package/dist/providers/ai-sdk-streamed-model.js +64 -1
  303. package/dist/providers/ai-sdk-streamed-model.js.map +1 -1
  304. package/dist/providers/chained-wire-state.d.ts +6 -0
  305. package/dist/providers/chained-wire-state.d.ts.map +1 -1
  306. package/dist/providers/chained-wire-state.js +1 -3
  307. package/dist/providers/chained-wire-state.js.map +1 -1
  308. package/dist/providers/codex-auth.d.ts +73 -2
  309. package/dist/providers/codex-auth.d.ts.map +1 -1
  310. package/dist/providers/codex-auth.js +166 -2
  311. package/dist/providers/codex-auth.js.map +1 -1
  312. package/dist/providers/codex-responses-model.d.ts +3 -0
  313. package/dist/providers/codex-responses-model.d.ts.map +1 -1
  314. package/dist/providers/codex-responses-model.js +295 -162
  315. package/dist/providers/codex-responses-model.js.map +1 -1
  316. package/dist/providers/codex-turn-converter.d.ts.map +1 -1
  317. package/dist/providers/codex-turn-converter.js +7 -1
  318. package/dist/providers/codex-turn-converter.js.map +1 -1
  319. package/dist/providers/codex.provider.d.ts +25 -2
  320. package/dist/providers/codex.provider.d.ts.map +1 -1
  321. package/dist/providers/codex.provider.js +83 -71
  322. package/dist/providers/codex.provider.js.map +1 -1
  323. package/dist/providers/common/provider-errors.d.ts +20 -0
  324. package/dist/providers/common/provider-errors.d.ts.map +1 -1
  325. package/dist/providers/common/provider-errors.js +35 -0
  326. package/dist/providers/common/provider-errors.js.map +1 -1
  327. package/dist/providers/grok-auth.d.ts +105 -0
  328. package/dist/providers/grok-auth.d.ts.map +1 -0
  329. package/dist/providers/grok-auth.js +316 -0
  330. package/dist/providers/grok-auth.js.map +1 -0
  331. package/dist/providers/grok-credit-usage.d.ts +53 -0
  332. package/dist/providers/grok-credit-usage.d.ts.map +1 -0
  333. package/dist/providers/grok-credit-usage.js +108 -0
  334. package/dist/providers/grok-credit-usage.js.map +1 -0
  335. package/dist/providers/grok.provider.d.ts +24 -0
  336. package/dist/providers/grok.provider.d.ts.map +1 -0
  337. package/dist/providers/grok.provider.js +153 -0
  338. package/dist/providers/grok.provider.js.map +1 -0
  339. package/dist/providers/index.d.ts +1 -0
  340. package/dist/providers/index.d.ts.map +1 -1
  341. package/dist/providers/index.js +1 -0
  342. package/dist/providers/index.js.map +1 -1
  343. package/dist/providers/jwt-claims.d.ts +12 -0
  344. package/dist/providers/jwt-claims.d.ts.map +1 -0
  345. package/dist/providers/jwt-claims.js +25 -0
  346. package/dist/providers/jwt-claims.js.map +1 -0
  347. package/dist/providers/luna-responses-lite-wire-protocol.d.ts +1 -0
  348. package/dist/providers/luna-responses-lite-wire-protocol.d.ts.map +1 -1
  349. package/dist/providers/luna-responses-lite-wire-protocol.js +19 -0
  350. package/dist/providers/luna-responses-lite-wire-protocol.js.map +1 -1
  351. package/dist/providers/model-catalog/catalog.generated.d.ts +360 -232
  352. package/dist/providers/model-catalog/catalog.generated.d.ts.map +1 -1
  353. package/dist/providers/model-catalog/catalog.generated.js +360 -232
  354. package/dist/providers/model-catalog/catalog.generated.js.map +1 -1
  355. package/dist/providers/model-catalog/generate-catalog.d.ts.map +1 -1
  356. package/dist/providers/model-catalog/generate-catalog.js +21 -1
  357. package/dist/providers/model-catalog/generate-catalog.js.map +1 -1
  358. package/dist/providers/oauth-account-store.d.ts +84 -0
  359. package/dist/providers/oauth-account-store.d.ts.map +1 -0
  360. package/dist/providers/oauth-account-store.js +142 -0
  361. package/dist/providers/oauth-account-store.js.map +1 -0
  362. package/dist/providers/oauth-accounts.d.ts +24 -0
  363. package/dist/providers/oauth-accounts.d.ts.map +1 -0
  364. package/dist/providers/oauth-accounts.js +37 -0
  365. package/dist/providers/oauth-accounts.js.map +1 -0
  366. package/dist/providers/oauth-pkce.d.ts +53 -0
  367. package/dist/providers/oauth-pkce.d.ts.map +1 -0
  368. package/dist/providers/oauth-pkce.js +200 -0
  369. package/dist/providers/oauth-pkce.js.map +1 -0
  370. package/dist/providers/oauth-session-account.d.ts +5 -0
  371. package/dist/providers/oauth-session-account.d.ts.map +1 -0
  372. package/dist/providers/oauth-session-account.js +24 -0
  373. package/dist/providers/oauth-session-account.js.map +1 -0
  374. package/dist/providers/openai-chat-completions-model.d.ts.map +1 -1
  375. package/dist/providers/openai-chat-completions-model.js +37 -16
  376. package/dist/providers/openai-chat-completions-model.js.map +1 -1
  377. package/dist/providers/openai-compatible-lazy.js.map +1 -1
  378. package/dist/providers/openai-compatible.provider.d.ts +5 -0
  379. package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
  380. package/dist/providers/openai-compatible.provider.js +32 -2
  381. package/dist/providers/openai-compatible.provider.js.map +1 -1
  382. package/dist/providers/openai-responses-model.d.ts +13 -3
  383. package/dist/providers/openai-responses-model.d.ts.map +1 -1
  384. package/dist/providers/openai-responses-model.js +92 -39
  385. package/dist/providers/openai-responses-model.js.map +1 -1
  386. package/dist/providers/openai.provider.d.ts.map +1 -1
  387. package/dist/providers/openai.provider.js +23 -2
  388. package/dist/providers/openai.provider.js.map +1 -1
  389. package/dist/providers/opencode-routing.d.ts +2 -0
  390. package/dist/providers/opencode-routing.d.ts.map +1 -1
  391. package/dist/providers/opencode-routing.js +12 -6
  392. package/dist/providers/opencode-routing.js.map +1 -1
  393. package/dist/providers/opencode-transport-discovery.d.ts +18 -0
  394. package/dist/providers/opencode-transport-discovery.d.ts.map +1 -0
  395. package/dist/providers/opencode-transport-discovery.js +115 -0
  396. package/dist/providers/opencode-transport-discovery.js.map +1 -0
  397. package/dist/providers/openrouter.provider.js.map +1 -1
  398. package/dist/providers/provider-opaque-compatibility.d.ts +58 -0
  399. package/dist/providers/provider-opaque-compatibility.d.ts.map +1 -0
  400. package/dist/providers/provider-opaque-compatibility.js +80 -0
  401. package/dist/providers/provider-opaque-compatibility.js.map +1 -0
  402. package/dist/providers/provider-service.d.ts +1 -1
  403. package/dist/providers/provider-service.d.ts.map +1 -1
  404. package/dist/providers/provider-service.js.map +1 -1
  405. package/dist/providers/registry.d.ts +10 -1
  406. package/dist/providers/registry.d.ts.map +1 -1
  407. package/dist/providers/registry.js.map +1 -1
  408. package/dist/providers/responses-websocket-sessions.d.ts +25 -0
  409. package/dist/providers/responses-websocket-sessions.d.ts.map +1 -0
  410. package/dist/providers/responses-websocket-sessions.js +102 -0
  411. package/dist/providers/responses-websocket-sessions.js.map +1 -0
  412. package/dist/providers/websocket-close-evidence.d.ts +45 -0
  413. package/dist/providers/websocket-close-evidence.d.ts.map +1 -0
  414. package/dist/providers/websocket-close-evidence.js +78 -0
  415. package/dist/providers/websocket-close-evidence.js.map +1 -0
  416. package/dist/providers/websocket-receive-watchdog.d.ts +9 -1
  417. package/dist/providers/websocket-receive-watchdog.d.ts.map +1 -1
  418. package/dist/providers/websocket-receive-watchdog.js +27 -1
  419. package/dist/providers/websocket-receive-watchdog.js.map +1 -1
  420. package/dist/providers/websocket-request-dispatch.d.ts +35 -0
  421. package/dist/providers/websocket-request-dispatch.d.ts.map +1 -0
  422. package/dist/providers/websocket-request-dispatch.js +23 -0
  423. package/dist/providers/websocket-request-dispatch.js.map +1 -0
  424. package/dist/scripts/eval-context-compaction/runner.js +1 -1
  425. package/dist/scripts/eval-context-compaction/runner.js.map +1 -1
  426. package/dist/services/agent-runtime/agent-handle.d.ts.map +1 -1
  427. package/dist/services/agent-runtime/agent-handle.js +8 -5
  428. package/dist/services/agent-runtime/agent-handle.js.map +1 -1
  429. package/dist/services/agent-runtime/agent-runtime.d.ts +1 -1
  430. package/dist/services/agent-runtime/agent-runtime.js +1 -1
  431. package/dist/services/agent-runtime/application-run-loop.d.ts +33 -9
  432. package/dist/services/agent-runtime/application-run-loop.d.ts.map +1 -1
  433. package/dist/services/agent-runtime/application-run-loop.js +300 -87
  434. package/dist/services/agent-runtime/application-run-loop.js.map +1 -1
  435. package/dist/services/agent-runtime/context-compaction/local-context-compactor.d.ts +6 -1
  436. package/dist/services/agent-runtime/context-compaction/local-context-compactor.d.ts.map +1 -1
  437. package/dist/services/agent-runtime/context-compaction/local-context-compactor.js +72 -4
  438. package/dist/services/agent-runtime/context-compaction/local-context-compactor.js.map +1 -1
  439. package/dist/services/agent-runtime/executor.d.ts +1 -1
  440. package/dist/services/agent-runtime/executor.d.ts.map +1 -1
  441. package/dist/services/agent-runtime/executor.js +5 -5
  442. package/dist/services/agent-runtime/executor.js.map +1 -1
  443. package/dist/services/agent-runtime/generation-guard.d.ts +2 -1
  444. package/dist/services/agent-runtime/generation-guard.d.ts.map +1 -1
  445. package/dist/services/agent-runtime/generation-guard.js +7 -2
  446. package/dist/services/agent-runtime/generation-guard.js.map +1 -1
  447. package/dist/services/agent-runtime/run-budget.d.ts +131 -0
  448. package/dist/services/agent-runtime/run-budget.d.ts.map +1 -0
  449. package/dist/services/agent-runtime/run-budget.js +268 -0
  450. package/dist/services/agent-runtime/run-budget.js.map +1 -0
  451. package/dist/services/agent-runtime/tool-invocation-context.d.ts +12 -0
  452. package/dist/services/agent-runtime/tool-invocation-context.d.ts.map +1 -1
  453. package/dist/services/agent-runtime/tool-invocation-context.js.map +1 -1
  454. package/dist/services/agent-runtime/types.d.ts +5 -4
  455. package/dist/services/agent-runtime/types.d.ts.map +1 -1
  456. package/dist/services/agent-stream.d.ts.map +1 -1
  457. package/dist/services/agent-stream.js +2 -1
  458. package/dist/services/agent-stream.js.map +1 -1
  459. package/dist/services/approval/approval-decision-executor.d.ts +6 -1
  460. package/dist/services/approval/approval-decision-executor.d.ts.map +1 -1
  461. package/dist/services/approval/approval-decision-executor.js +15 -3
  462. package/dist/services/approval/approval-decision-executor.js.map +1 -1
  463. package/dist/services/approval/approval-decision-policy.d.ts.map +1 -1
  464. package/dist/services/approval/approval-decision-policy.js +3 -0
  465. package/dist/services/approval/approval-decision-policy.js.map +1 -1
  466. package/dist/services/approval/approval-flow-coordinator.d.ts +2 -0
  467. package/dist/services/approval/approval-flow-coordinator.d.ts.map +1 -1
  468. package/dist/services/approval/approval-flow-coordinator.js +14 -2
  469. package/dist/services/approval/approval-flow-coordinator.js.map +1 -1
  470. package/dist/services/approval/background-subagent-approval-controller.d.ts +3 -1
  471. package/dist/services/approval/background-subagent-approval-controller.d.ts.map +1 -1
  472. package/dist/services/approval/background-subagent-approval-controller.js +7 -4
  473. package/dist/services/approval/background-subagent-approval-controller.js.map +1 -1
  474. package/dist/services/approval/shell-auto-approval-resolver.d.ts +5 -0
  475. package/dist/services/approval/shell-auto-approval-resolver.d.ts.map +1 -1
  476. package/dist/services/approval/shell-auto-approval-resolver.js +8 -0
  477. package/dist/services/approval/shell-auto-approval-resolver.js.map +1 -1
  478. package/dist/services/approval/tool-approval-batch-coordinator.d.ts.map +1 -1
  479. package/dist/services/approval/tool-approval-batch-coordinator.js +20 -11
  480. package/dist/services/approval/tool-approval-batch-coordinator.js.map +1 -1
  481. package/dist/services/approval/tool-ownership-registry.d.ts +5 -1
  482. package/dist/services/approval/tool-ownership-registry.d.ts.map +1 -1
  483. package/dist/services/approval/tool-ownership-registry.js +5 -22
  484. package/dist/services/approval/tool-ownership-registry.js.map +1 -1
  485. package/dist/services/background-task-activity.d.ts +79 -0
  486. package/dist/services/background-task-activity.d.ts.map +1 -0
  487. package/dist/services/background-task-activity.js +34 -0
  488. package/dist/services/background-task-activity.js.map +1 -0
  489. package/dist/services/command-message-streaming.d.ts +4 -2
  490. package/dist/services/command-message-streaming.d.ts.map +1 -1
  491. package/dist/services/command-message-streaming.js +2 -2
  492. package/dist/services/command-message-streaming.js.map +1 -1
  493. package/dist/services/conversation/conversation-adapter-factory.d.ts +6 -2
  494. package/dist/services/conversation/conversation-adapter-factory.d.ts.map +1 -1
  495. package/dist/services/conversation/conversation-adapter-factory.js +5 -1
  496. package/dist/services/conversation/conversation-adapter-factory.js.map +1 -1
  497. package/dist/services/conversation/conversation-adapter.d.ts +41 -9
  498. package/dist/services/conversation/conversation-adapter.d.ts.map +1 -1
  499. package/dist/services/conversation/conversation-adapter.js +218 -37
  500. package/dist/services/conversation/conversation-adapter.js.map +1 -1
  501. package/dist/services/conversation/conversation-decoder.d.ts.map +1 -1
  502. package/dist/services/conversation/conversation-decoder.js +4 -0
  503. package/dist/services/conversation/conversation-decoder.js.map +1 -1
  504. package/dist/services/conversation/conversation-events.d.ts +55 -2
  505. package/dist/services/conversation/conversation-events.d.ts.map +1 -1
  506. package/dist/services/conversation/conversation-orchestrator.d.ts.map +1 -1
  507. package/dist/services/conversation/conversation-orchestrator.js +103 -11
  508. package/dist/services/conversation/conversation-orchestrator.js.map +1 -1
  509. package/dist/services/conversation/conversation-orchestrator.types.d.ts +3 -0
  510. package/dist/services/conversation/conversation-orchestrator.types.d.ts.map +1 -1
  511. package/dist/services/conversation/conversation-persistence.d.ts +38 -2
  512. package/dist/services/conversation/conversation-persistence.d.ts.map +1 -1
  513. package/dist/services/conversation/conversation-persistence.js +160 -16
  514. package/dist/services/conversation/conversation-persistence.js.map +1 -1
  515. package/dist/services/conversation/conversation-replay.d.ts.map +1 -1
  516. package/dist/services/conversation/conversation-replay.js +27 -0
  517. package/dist/services/conversation/conversation-replay.js.map +1 -1
  518. package/dist/services/conversation/conversation-result-builder.d.ts +6 -2
  519. package/dist/services/conversation/conversation-result-builder.d.ts.map +1 -1
  520. package/dist/services/conversation/conversation-result-builder.js +60 -1
  521. package/dist/services/conversation/conversation-result-builder.js.map +1 -1
  522. package/dist/services/conversation/conversation-runtime-factory.d.ts +9 -1
  523. package/dist/services/conversation/conversation-runtime-factory.d.ts.map +1 -1
  524. package/dist/services/conversation/conversation-runtime-factory.js +5 -1
  525. package/dist/services/conversation/conversation-runtime-factory.js.map +1 -1
  526. package/dist/services/conversation/conversation-service.d.ts +32 -3
  527. package/dist/services/conversation/conversation-service.d.ts.map +1 -1
  528. package/dist/services/conversation/conversation-service.js +82 -8
  529. package/dist/services/conversation/conversation-service.js.map +1 -1
  530. package/dist/services/conversation/conversation-state-projector.d.ts +2 -1
  531. package/dist/services/conversation/conversation-state-projector.d.ts.map +1 -1
  532. package/dist/services/conversation/conversation-state-projector.js +31 -3
  533. package/dist/services/conversation/conversation-state-projector.js.map +1 -1
  534. package/dist/services/conversation/run-item-normalizer.d.ts.map +1 -1
  535. package/dist/services/conversation/run-item-normalizer.js +24 -1
  536. package/dist/services/conversation/run-item-normalizer.js.map +1 -1
  537. package/dist/services/conversation-agent-client.d.ts +21 -2
  538. package/dist/services/conversation-agent-client.d.ts.map +1 -1
  539. package/dist/services/cost/model-cost.d.ts +13 -1
  540. package/dist/services/cost/model-cost.d.ts.map +1 -1
  541. package/dist/services/cost/model-cost.js +59 -0
  542. package/dist/services/cost/model-cost.js.map +1 -1
  543. package/dist/services/cost/subscription-providers.d.ts +2 -0
  544. package/dist/services/cost/subscription-providers.d.ts.map +1 -0
  545. package/dist/services/cost/subscription-providers.js +14 -0
  546. package/dist/services/cost/subscription-providers.js.map +1 -0
  547. package/dist/services/grok/grok-credit-usage-service.d.ts +62 -0
  548. package/dist/services/grok/grok-credit-usage-service.d.ts.map +1 -0
  549. package/dist/services/grok/grok-credit-usage-service.js +137 -0
  550. package/dist/services/grok/grok-credit-usage-service.js.map +1 -0
  551. package/dist/services/history-service.d.ts +9 -0
  552. package/dist/services/history-service.d.ts.map +1 -1
  553. package/dist/services/history-service.js +49 -2
  554. package/dist/services/history-service.js.map +1 -1
  555. package/dist/services/hooks/hook-composition.d.ts +17 -0
  556. package/dist/services/hooks/hook-composition.d.ts.map +1 -0
  557. package/dist/services/hooks/hook-composition.js +19 -0
  558. package/dist/services/hooks/hook-composition.js.map +1 -0
  559. package/dist/services/logging/conversation-log-events.d.ts +35 -1
  560. package/dist/services/logging/conversation-log-events.d.ts.map +1 -1
  561. package/dist/services/logging/conversation-log-events.js +17 -0
  562. package/dist/services/logging/conversation-log-events.js.map +1 -1
  563. package/dist/services/logging/conversation-log-writer.d.ts +8 -1
  564. package/dist/services/logging/conversation-log-writer.d.ts.map +1 -1
  565. package/dist/services/logging/conversation-log-writer.js +145 -10
  566. package/dist/services/logging/conversation-log-writer.js.map +1 -1
  567. package/dist/services/logging/conversation-logger.d.ts.map +1 -1
  568. package/dist/services/logging/conversation-logger.js +18 -0
  569. package/dist/services/logging/conversation-logger.js.map +1 -1
  570. package/dist/services/logging/logging-service.d.ts +6 -6
  571. package/dist/services/logging/logging-service.d.ts.map +1 -1
  572. package/dist/services/logging/logging-service.js.map +1 -1
  573. package/dist/services/logging/provider-traffic.d.ts +17 -1
  574. package/dist/services/logging/provider-traffic.d.ts.map +1 -1
  575. package/dist/services/logging/provider-traffic.js +283 -139
  576. package/dist/services/logging/provider-traffic.js.map +1 -1
  577. package/dist/services/memory/memory-capabilities.d.ts.map +1 -1
  578. package/dist/services/memory/memory-capabilities.js +20 -1
  579. package/dist/services/memory/memory-capabilities.js.map +1 -1
  580. package/dist/services/mode-notices.d.ts +1 -6
  581. package/dist/services/mode-notices.d.ts.map +1 -1
  582. package/dist/services/mode-notices.js +16 -3
  583. package/dist/services/mode-notices.js.map +1 -1
  584. package/dist/services/model-service.d.ts +2 -2
  585. package/dist/services/model-service.d.ts.map +1 -1
  586. package/dist/services/model-service.js.map +1 -1
  587. package/dist/services/queue/queue-controller.d.ts +1 -1
  588. package/dist/services/queue/queue-controller.d.ts.map +1 -1
  589. package/dist/services/queue/queue-controller.js +19 -5
  590. package/dist/services/queue/queue-controller.js.map +1 -1
  591. package/dist/services/retry/chain-recovery-fingerprint.d.ts +10 -0
  592. package/dist/services/retry/chain-recovery-fingerprint.d.ts.map +1 -0
  593. package/dist/services/retry/chain-recovery-fingerprint.js +23 -0
  594. package/dist/services/retry/chain-recovery-fingerprint.js.map +1 -0
  595. package/dist/services/retry/recovery-executor.d.ts.map +1 -1
  596. package/dist/services/retry/recovery-executor.js +2 -0
  597. package/dist/services/retry/recovery-executor.js.map +1 -1
  598. package/dist/services/retry/recovery-policy.d.ts.map +1 -1
  599. package/dist/services/retry/recovery-policy.js +4 -0
  600. package/dist/services/retry/recovery-policy.js.map +1 -1
  601. package/dist/services/retry/retry-classifier.d.ts.map +1 -1
  602. package/dist/services/retry/retry-classifier.js +34 -2
  603. package/dist/services/retry/retry-classifier.js.map +1 -1
  604. package/dist/services/retry/retry-contracts.d.ts +14 -0
  605. package/dist/services/retry/retry-contracts.d.ts.map +1 -1
  606. package/dist/services/retry/retry-error-classification.d.ts +17 -3
  607. package/dist/services/retry/retry-error-classification.d.ts.map +1 -1
  608. package/dist/services/retry/retry-error-classification.js +48 -7
  609. package/dist/services/retry/retry-error-classification.js.map +1 -1
  610. package/dist/services/retry/retry-errors.d.ts +4 -0
  611. package/dist/services/retry/retry-errors.d.ts.map +1 -1
  612. package/dist/services/retry/retry-errors.js +7 -0
  613. package/dist/services/retry/retry-errors.js.map +1 -1
  614. package/dist/services/retry/retry-event-presenter.d.ts.map +1 -1
  615. package/dist/services/retry/retry-event-presenter.js +20 -0
  616. package/dist/services/retry/retry-event-presenter.js.map +1 -1
  617. package/dist/services/runtime-setting-router.d.ts.map +1 -1
  618. package/dist/services/runtime-setting-router.js +6 -0
  619. package/dist/services/runtime-setting-router.js.map +1 -1
  620. package/dist/services/service-interfaces.d.ts +96 -13
  621. package/dist/services/service-interfaces.d.ts.map +1 -1
  622. package/dist/services/session/background-task-control.d.ts +6 -0
  623. package/dist/services/session/background-task-control.d.ts.map +1 -1
  624. package/dist/services/session/background-task-control.js +31 -6
  625. package/dist/services/session/background-task-control.js.map +1 -1
  626. package/dist/services/session/background-task-liveness.d.ts +2 -18
  627. package/dist/services/session/background-task-liveness.d.ts.map +1 -1
  628. package/dist/services/session/background-task-liveness.js +7 -22
  629. package/dist/services/session/background-task-liveness.js.map +1 -1
  630. package/dist/services/session/continuation-plan-applier.d.ts.map +1 -1
  631. package/dist/services/session/continuation-plan-applier.js +23 -0
  632. package/dist/services/session/continuation-plan-applier.js.map +1 -1
  633. package/dist/services/session/continuation-recovery-handler.d.ts +2 -0
  634. package/dist/services/session/continuation-recovery-handler.d.ts.map +1 -1
  635. package/dist/services/session/continuation-recovery-handler.js +7 -1
  636. package/dist/services/session/continuation-recovery-handler.js.map +1 -1
  637. package/dist/services/session/initial-turn-recovery-handler.d.ts +1 -0
  638. package/dist/services/session/initial-turn-recovery-handler.d.ts.map +1 -1
  639. package/dist/services/session/initial-turn-recovery-handler.js +12 -2
  640. package/dist/services/session/initial-turn-recovery-handler.js.map +1 -1
  641. package/dist/services/session/session-client-factory.d.ts +3 -1
  642. package/dist/services/session/session-client-factory.d.ts.map +1 -1
  643. package/dist/services/session/session-client-factory.js +2 -2
  644. package/dist/services/session/session-client-factory.js.map +1 -1
  645. package/dist/services/session/session-composition.d.ts +3 -0
  646. package/dist/services/session/session-composition.d.ts.map +1 -1
  647. package/dist/services/session/session-composition.js +52 -8
  648. package/dist/services/session/session-composition.js.map +1 -1
  649. package/dist/services/session/session-stream-processor.d.ts +2 -0
  650. package/dist/services/session/session-stream-processor.d.ts.map +1 -1
  651. package/dist/services/session/session-stream-processor.js +4 -0
  652. package/dist/services/session/session-stream-processor.js.map +1 -1
  653. package/dist/services/session/terminal-result-collector.d.ts +2 -2
  654. package/dist/services/session/terminal-result-collector.d.ts.map +1 -1
  655. package/dist/services/session/terminal-result-collector.js +2 -1
  656. package/dist/services/session/terminal-result-collector.js.map +1 -1
  657. package/dist/services/session/turn-attempt-factory.d.ts +1 -0
  658. package/dist/services/session/turn-attempt-factory.d.ts.map +1 -1
  659. package/dist/services/session/turn-attempt-factory.js.map +1 -1
  660. package/dist/services/session/turn-coordinator.d.ts +1 -1
  661. package/dist/services/session/turn-coordinator.d.ts.map +1 -1
  662. package/dist/services/session/turn-coordinator.js +31 -6
  663. package/dist/services/session/turn-coordinator.js.map +1 -1
  664. package/dist/services/session/turn-workflow.d.ts +4 -1
  665. package/dist/services/session/turn-workflow.d.ts.map +1 -1
  666. package/dist/services/session/turn-workflow.js +48 -7
  667. package/dist/services/session/turn-workflow.js.map +1 -1
  668. package/dist/services/settings/settings-persistence.d.ts +33 -0
  669. package/dist/services/settings/settings-persistence.d.ts.map +1 -1
  670. package/dist/services/settings/settings-persistence.js +102 -4
  671. package/dist/services/settings/settings-persistence.js.map +1 -1
  672. package/dist/services/settings/settings-schema.d.ts +70 -2
  673. package/dist/services/settings/settings-schema.d.ts.map +1 -1
  674. package/dist/services/settings/settings-schema.js +92 -6
  675. package/dist/services/settings/settings-schema.js.map +1 -1
  676. package/dist/services/settings/settings-service.d.ts +57 -3
  677. package/dist/services/settings/settings-service.d.ts.map +1 -1
  678. package/dist/services/settings/settings-service.js +171 -28
  679. package/dist/services/settings/settings-service.js.map +1 -1
  680. package/dist/services/settings/settings-service.mock.d.ts +1 -1
  681. package/dist/services/settings/settings-service.mock.d.ts.map +1 -1
  682. package/dist/services/settings/settings-service.mock.js +3 -6
  683. package/dist/services/settings/settings-service.mock.js.map +1 -1
  684. package/dist/services/settings/settings-sources.d.ts.map +1 -1
  685. package/dist/services/settings/settings-sources.js +16 -0
  686. package/dist/services/settings/settings-sources.js.map +1 -1
  687. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts +27 -0
  688. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts.map +1 -0
  689. package/dist/services/settings/test-helpers/settings-consumer-inventory.js +165 -0
  690. package/dist/services/settings/test-helpers/settings-consumer-inventory.js.map +1 -0
  691. package/dist/services/shell/background-shell-registry.d.ts +10 -0
  692. package/dist/services/shell/background-shell-registry.d.ts.map +1 -1
  693. package/dist/services/shell/background-shell-registry.js +9 -1
  694. package/dist/services/shell/background-shell-registry.js.map +1 -1
  695. package/dist/services/shell/background-shell-watches.d.ts +28 -3
  696. package/dist/services/shell/background-shell-watches.d.ts.map +1 -1
  697. package/dist/services/shell/background-shell-watches.js +41 -9
  698. package/dist/services/shell/background-shell-watches.js.map +1 -1
  699. package/dist/services/ssh-service.d.ts +81 -9
  700. package/dist/services/ssh-service.d.ts.map +1 -1
  701. package/dist/services/ssh-service.js +211 -37
  702. package/dist/services/ssh-service.js.map +1 -1
  703. package/dist/services/stream-event-processor.d.ts +2 -0
  704. package/dist/services/stream-event-processor.d.ts.map +1 -1
  705. package/dist/services/stream-event-processor.js +17 -7
  706. package/dist/services/stream-event-processor.js.map +1 -1
  707. package/dist/services/subagents/execution-runner.d.ts +1 -1
  708. package/dist/services/subagents/execution-runner.d.ts.map +1 -1
  709. package/dist/services/subagents/execution-runner.js +34 -22
  710. package/dist/services/subagents/execution-runner.js.map +1 -1
  711. package/dist/services/subagents/foreground-subagent-lease.d.ts +11 -1
  712. package/dist/services/subagents/foreground-subagent-lease.d.ts.map +1 -1
  713. package/dist/services/subagents/foreground-subagent-lease.js +10 -1
  714. package/dist/services/subagents/foreground-subagent-lease.js.map +1 -1
  715. package/dist/services/subagents/mentor-runner.d.ts +1 -1
  716. package/dist/services/subagents/mentor-runner.d.ts.map +1 -1
  717. package/dist/services/subagents/mentor-runner.js +10 -3
  718. package/dist/services/subagents/mentor-runner.js.map +1 -1
  719. package/dist/services/subagents/nested-runner.d.ts +11 -1
  720. package/dist/services/subagents/nested-runner.d.ts.map +1 -1
  721. package/dist/services/subagents/nested-runner.js +45 -10
  722. package/dist/services/subagents/nested-runner.js.map +1 -1
  723. package/dist/services/subagents/runtime.d.ts.map +1 -1
  724. package/dist/services/subagents/runtime.js +7 -0
  725. package/dist/services/subagents/runtime.js.map +1 -1
  726. package/dist/services/subagents/subagent-async-registry.d.ts +4 -0
  727. package/dist/services/subagents/subagent-async-registry.d.ts.map +1 -1
  728. package/dist/services/subagents/subagent-async-registry.js +80 -16
  729. package/dist/services/subagents/subagent-async-registry.js.map +1 -1
  730. package/dist/services/subagents/subagent-manager.d.ts +1 -1
  731. package/dist/services/subagents/subagent-manager.d.ts.map +1 -1
  732. package/dist/services/subagents/subagent-manager.js +4 -4
  733. package/dist/services/subagents/subagent-manager.js.map +1 -1
  734. package/dist/services/subagents/subagent-notification-store.d.ts +19 -1
  735. package/dist/services/subagents/subagent-notification-store.d.ts.map +1 -1
  736. package/dist/services/subagents/subagent-notification-store.js +22 -0
  737. package/dist/services/subagents/subagent-notification-store.js.map +1 -1
  738. package/dist/services/subagents/subagent-run-control.d.ts +9 -1
  739. package/dist/services/subagents/subagent-run-control.d.ts.map +1 -1
  740. package/dist/services/subagents/subagent-run-control.js +12 -13
  741. package/dist/services/subagents/subagent-run-control.js.map +1 -1
  742. package/dist/services/subagents/tool-policy.d.ts.map +1 -1
  743. package/dist/services/subagents/tool-policy.js +11 -3
  744. package/dist/services/subagents/tool-policy.js.map +1 -1
  745. package/dist/services/subagents/types.d.ts +25 -2
  746. package/dist/services/subagents/types.d.ts.map +1 -1
  747. package/dist/services/subagents/types.js.map +1 -1
  748. package/dist/services/subagents/utils.d.ts +3 -1
  749. package/dist/services/subagents/utils.d.ts.map +1 -1
  750. package/dist/services/subagents/utils.js +4 -2
  751. package/dist/services/subagents/utils.js.map +1 -1
  752. package/dist/services/workspace/active-workspace-root.d.ts +6 -0
  753. package/dist/services/workspace/active-workspace-root.d.ts.map +1 -1
  754. package/dist/services/workspace/active-workspace-root.js +22 -0
  755. package/dist/services/workspace/active-workspace-root.js.map +1 -1
  756. package/dist/test-helpers/ink-testing.d.ts.map +1 -1
  757. package/dist/test-helpers/ink-testing.js +4 -1
  758. package/dist/test-helpers/ink-testing.js.map +1 -1
  759. package/dist/test-helpers/terminal-e2e.d.ts.map +1 -1
  760. package/dist/test-helpers/terminal-e2e.js +12 -2
  761. package/dist/test-helpers/terminal-e2e.js.map +1 -1
  762. package/dist/tools/agent/activate-skill.d.ts.map +1 -1
  763. package/dist/tools/agent/activate-skill.js +2 -2
  764. package/dist/tools/agent/activate-skill.js.map +1 -1
  765. package/dist/tools/agent/ask-mentor.d.ts.map +1 -1
  766. package/dist/tools/agent/ask-mentor.js +2 -2
  767. package/dist/tools/agent/ask-mentor.js.map +1 -1
  768. package/dist/tools/agent/ask-user-constants.d.ts +2 -2
  769. package/dist/tools/agent/ask-user-constants.d.ts.map +1 -1
  770. package/dist/tools/agent/ask-user-constants.js +1 -1
  771. package/dist/tools/agent/ask-user-constants.js.map +1 -1
  772. package/dist/tools/agent/run-subagent-async.d.ts +2 -11
  773. package/dist/tools/agent/run-subagent-async.d.ts.map +1 -1
  774. package/dist/tools/agent/run-subagent-async.js +8 -2
  775. package/dist/tools/agent/run-subagent-async.js.map +1 -1
  776. package/dist/tools/agent/run-subagent.d.ts.map +1 -1
  777. package/dist/tools/agent/run-subagent.js +8 -9
  778. package/dist/tools/agent/run-subagent.js.map +1 -1
  779. package/dist/tools/file/apply-patch.d.ts +2 -0
  780. package/dist/tools/file/apply-patch.d.ts.map +1 -1
  781. package/dist/tools/file/apply-patch.js +58 -14
  782. package/dist/tools/file/apply-patch.js.map +1 -1
  783. package/dist/tools/file/code-context.d.ts +5 -0
  784. package/dist/tools/file/code-context.d.ts.map +1 -1
  785. package/dist/tools/file/code-context.js +18 -6
  786. package/dist/tools/file/code-context.js.map +1 -1
  787. package/dist/tools/file/create-file.d.ts.map +1 -1
  788. package/dist/tools/file/create-file.js +11 -5
  789. package/dist/tools/file/create-file.js.map +1 -1
  790. package/dist/tools/file/edit-healing.d.ts +7 -0
  791. package/dist/tools/file/edit-healing.d.ts.map +1 -1
  792. package/dist/tools/file/edit-healing.js +7 -7
  793. package/dist/tools/file/edit-healing.js.map +1 -1
  794. package/dist/tools/file/glob.d.ts +3 -0
  795. package/dist/tools/file/glob.d.ts.map +1 -1
  796. package/dist/tools/file/glob.js +9 -3
  797. package/dist/tools/file/glob.js.map +1 -1
  798. package/dist/tools/file/grep.d.ts +5 -0
  799. package/dist/tools/file/grep.d.ts.map +1 -1
  800. package/dist/tools/file/grep.js +10 -6
  801. package/dist/tools/file/grep.js.map +1 -1
  802. package/dist/tools/file/patch-healing.d.ts +31 -0
  803. package/dist/tools/file/patch-healing.d.ts.map +1 -0
  804. package/dist/tools/file/patch-healing.js +231 -0
  805. package/dist/tools/file/patch-healing.js.map +1 -0
  806. package/dist/tools/file/read-file.d.ts +3 -0
  807. package/dist/tools/file/read-file.d.ts.map +1 -1
  808. package/dist/tools/file/read-file.js +9 -3
  809. package/dist/tools/file/read-file.js.map +1 -1
  810. package/dist/tools/file/search-replace.d.ts.map +1 -1
  811. package/dist/tools/file/search-replace.js +24 -6
  812. package/dist/tools/file/search-replace.js.map +1 -1
  813. package/dist/tools/format-helpers.d.ts +6 -0
  814. package/dist/tools/format-helpers.d.ts.map +1 -1
  815. package/dist/tools/format-helpers.js +23 -0
  816. package/dist/tools/format-helpers.js.map +1 -1
  817. package/dist/tools/memory/memory-tools.d.ts.map +1 -1
  818. package/dist/tools/memory/memory-tools.js +2 -2
  819. package/dist/tools/memory/memory-tools.js.map +1 -1
  820. package/dist/tools/system/shell.d.ts +16 -1
  821. package/dist/tools/system/shell.d.ts.map +1 -1
  822. package/dist/tools/system/shell.js +90 -25
  823. package/dist/tools/system/shell.js.map +1 -1
  824. package/dist/tools/types.d.ts +4 -0
  825. package/dist/tools/types.d.ts.map +1 -1
  826. package/dist/tools/types.js.map +1 -1
  827. package/dist/tools/web/web-fetch.d.ts.map +1 -1
  828. package/dist/tools/web/web-fetch.js +2 -2
  829. package/dist/tools/web/web-fetch.js.map +1 -1
  830. package/dist/tools/web/web-search.d.ts.map +1 -1
  831. package/dist/tools/web/web-search.js +2 -2
  832. package/dist/tools/web/web-search.js.map +1 -1
  833. package/dist/types/message.d.ts +1 -1
  834. package/dist/types/message.d.ts.map +1 -1
  835. package/dist/utils/ai/provider-credentials.d.ts +1 -1
  836. package/dist/utils/ai/provider-credentials.d.ts.map +1 -1
  837. package/dist/utils/ai/provider-credentials.js +18 -2
  838. package/dist/utils/ai/provider-credentials.js.map +1 -1
  839. package/dist/utils/ai/token-usage.d.ts +3 -1
  840. package/dist/utils/ai/token-usage.d.ts.map +1 -1
  841. package/dist/utils/ai/token-usage.js +7 -2
  842. package/dist/utils/ai/token-usage.js.map +1 -1
  843. package/dist/utils/apply-diff.d.ts.map +1 -1
  844. package/dist/utils/apply-diff.js +8 -0
  845. package/dist/utils/apply-diff.js.map +1 -1
  846. package/dist/utils/conversation/conversation-event-handler.d.ts.map +1 -1
  847. package/dist/utils/conversation/conversation-event-handler.js +60 -2
  848. package/dist/utils/conversation/conversation-event-handler.js.map +1 -1
  849. package/dist/utils/error-helpers.d.ts.map +1 -1
  850. package/dist/utils/error-helpers.js +8 -0
  851. package/dist/utils/error-helpers.js.map +1 -1
  852. package/dist/utils/inject-warning-into-tool-output.d.ts +30 -0
  853. package/dist/utils/inject-warning-into-tool-output.d.ts.map +1 -1
  854. package/dist/utils/inject-warning-into-tool-output.js +39 -0
  855. package/dist/utils/inject-warning-into-tool-output.js.map +1 -1
  856. package/dist/utils/output/tty-osc.d.ts +1 -1
  857. package/dist/utils/output/tty-osc.js +1 -1
  858. package/dist/utils/settings-command.d.ts.map +1 -1
  859. package/dist/utils/settings-command.js +105 -6
  860. package/dist/utils/settings-command.js.map +1 -1
  861. package/dist/utils/shell/execute-shell.d.ts +8 -0
  862. package/dist/utils/shell/execute-shell.d.ts.map +1 -1
  863. package/dist/utils/shell/execute-shell.js +36 -30
  864. package/dist/utils/shell/execute-shell.js.map +1 -1
  865. package/dist/utils/shell/sandbox/sandbox-env.d.ts +1 -0
  866. package/dist/utils/shell/sandbox/sandbox-env.d.ts.map +1 -1
  867. package/dist/utils/shell/sandbox/sandbox-env.js +2 -0
  868. package/dist/utils/shell/sandbox/sandbox-env.js.map +1 -1
  869. package/dist/utils/shell/sandbox/sandbox-policy.d.ts +2 -0
  870. package/dist/utils/shell/sandbox/sandbox-policy.d.ts.map +1 -1
  871. package/dist/utils/shell/sandbox/sandbox-policy.js +1 -1
  872. package/dist/utils/shell/sandbox/sandbox-policy.js.map +1 -1
  873. package/dist/utils/shell/sandbox/shell-sandbox-runner.d.ts.map +1 -1
  874. package/dist/utils/shell/sandbox/shell-sandbox-runner.js +1 -2
  875. package/dist/utils/shell/sandbox/shell-sandbox-runner.js.map +1 -1
  876. package/dist/utils/shell/shell-child-registry.d.ts +11 -0
  877. package/dist/utils/shell/shell-child-registry.d.ts.map +1 -0
  878. package/dist/utils/shell/shell-child-registry.js +40 -0
  879. package/dist/utils/shell/shell-child-registry.js.map +1 -0
  880. package/dist/utils/shell/shell-output.d.ts.map +1 -1
  881. package/dist/utils/shell/shell-output.js +10 -6
  882. package/dist/utils/shell/shell-output.js.map +1 -1
  883. package/dist/utils/shell/temp-sweep.d.ts +28 -0
  884. package/dist/utils/shell/temp-sweep.d.ts.map +1 -0
  885. package/dist/utils/shell/temp-sweep.js +140 -0
  886. package/dist/utils/shell/temp-sweep.js.map +1 -0
  887. package/dist/utils/streaming/extract-command-messages.d.ts +12 -5
  888. package/dist/utils/streaming/extract-command-messages.d.ts.map +1 -1
  889. package/dist/utils/streaming/extract-command-messages.js +29 -33
  890. package/dist/utils/streaming/extract-command-messages.js.map +1 -1
  891. package/dist/utils/streaming/streaming-session-factory.d.ts +8 -0
  892. package/dist/utils/streaming/streaming-session-factory.d.ts.map +1 -1
  893. package/dist/utils/streaming/streaming-session-factory.js +3 -0
  894. package/dist/utils/streaming/streaming-session-factory.js.map +1 -1
  895. package/dist/utils/value-suggestions.d.ts +8 -0
  896. package/dist/utils/value-suggestions.d.ts.map +1 -1
  897. package/dist/utils/value-suggestions.js +71 -0
  898. package/dist/utils/value-suggestions.js.map +1 -1
  899. package/package.json +14 -10
  900. package/dist/utils/output/synchronized-output.d.ts +0 -35
  901. package/dist/utils/output/synchronized-output.d.ts.map +0 -1
  902. package/dist/utils/output/synchronized-output.js +0 -66
  903. package/dist/utils/output/synchronized-output.js.map +0 -1
@@ -1,16 +1,20 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { ResponsesWS } from 'openai/resources/responses/ws';
3
- import OpenAI from 'openai';
3
+ import OpenAI, { InternalServerError } from 'openai';
4
4
  import { toCodexResponsesInput } from './codex-turn-converter.js';
5
5
  import { sanitizeHeaders } from '../utils/header-sanitizer.js';
6
6
  import { AbortedStreamRecorder } from './aborted-stream-recorder.js';
7
- import { OrphanedChainedToolOutputError } from '../lib/chained-input-filter.js';
8
- import { AmbiguousModelOutcomeError } from '../services/retry/retry-errors.js';
7
+ import { isOrphanedChainedToolOutputError, OrphanedChainedToolOutputError } from '../lib/chained-input-filter.js';
8
+ import { AmbiguousModelOutcomeError, ConversationStateNoProgressError } from '../services/retry/retry-errors.js';
9
+ import { fingerprintChainRequest } from '../services/retry/chain-recovery-fingerprint.js';
9
10
  import { ChainedWireState } from './chained-wire-state.js';
10
11
  import { LunaResponsesLiteWireProtocol } from './luna-responses-lite-wire-protocol.js';
11
12
  import { captureProviderRequest } from './provider-request-capture.js';
12
13
  import { createWebSocketReceiveWatchdog, DEFAULT_WEBSOCKET_RECEIVE_TIMEOUTS, } from './websocket-receive-watchdog.js';
14
+ import { readWebSocketDispatch, recordWebSocketDispatch, UnsentWebSocketRequestError, } from './websocket-request-dispatch.js';
15
+ import { WebSocketClosedEarlyError, webSocketCloseError, findWebSocketClosedEarly, readWebSocketCloseFrame, } from './websocket-close-evidence.js';
13
16
  import { markContextCompactionFailure, resolveContextManagement } from './openai-responses-model.js';
17
+ import { ResponsesWebSocketSessions } from './responses-websocket-sessions.js';
14
18
  const DUMMY_PROVIDER_TRAFFIC = {
15
19
  recordRequestStart() { },
16
20
  async recordResponseReceived() { },
@@ -25,18 +29,31 @@ function toCodexToolChoice(choice) {
25
29
  }
26
30
  throw new Error('Unsupported Codex tool choice.');
27
31
  }
32
+ const TERMINAL_RESPONSE_EVENT_TYPES = new Set([
33
+ 'response.completed',
34
+ 'response.failed',
35
+ 'response.incomplete',
36
+ 'response.error',
37
+ ]);
38
+ // RFC 6455 readyState values, named so the send path's evidence is readable.
39
+ const WEBSOCKET_CONNECTING = 0;
40
+ const WEBSOCKET_OPEN = 1;
28
41
  /** Provider-owned transport seam used by Codex's HTTP and WebSocket models. */
29
42
  export class CodexResponsesTransport {
30
43
  client;
31
44
  model;
32
45
  websocket;
33
46
  options;
47
+ #sessions = new ResponsesWebSocketSessions((headers) => new ResponsesWS(this.client, headers ? { headers } : undefined));
34
48
  constructor(client = {}, model = '', websocket = false, options = {}) {
35
49
  this.client = client;
36
50
  this.model = model;
37
51
  this.websocket = websocket;
38
52
  this.options = options;
39
53
  }
54
+ close() {
55
+ this.#sessions.close();
56
+ }
40
57
  buildResponsesCreateRequest(request, stream) {
41
58
  const providerOptions = request.providerOptions ?? {};
42
59
  // contextCompaction is an app-level option; context_management is capability-gated
@@ -74,40 +91,69 @@ export class CodexResponsesTransport {
74
91
  return this.client.responses.create(requestData);
75
92
  }
76
93
  const headers = request.providerOptions?.extraHeaders;
77
- const socket = new ResponsesWS(this.client, headers ? { headers: headers } : undefined);
94
+ const socket = this.#sessions.acquire(headers);
78
95
  const messages = socket.stream();
79
96
  const requestEvent = { type: 'response.create', ...requestData };
80
- if (socket.socket?.readyState === 0) {
81
- socket.socket.once('open', () => socket.send(requestEvent));
97
+ // Until the frame is written to an OPEN socket it is still ours, so a
98
+ // receive timeout before that point is provably unsent. `send` on a
99
+ // connecting or closing socket only queues, which proves nothing —
100
+ // record what the socket actually was, and `unknown` when it cannot be
101
+ // observed at all.
102
+ recordWebSocketDispatch(request, 'unsent');
103
+ const dispatchRequestEvent = () => {
104
+ const readyState = socket.socket?.readyState;
105
+ socket.send(requestEvent);
106
+ recordWebSocketDispatch(request, readyState === WEBSOCKET_OPEN ? 'flushed' : 'unknown');
107
+ };
108
+ if (socket.socket?.readyState === WEBSOCKET_CONNECTING) {
109
+ socket.socket.once('open', dispatchRequestEvent);
82
110
  }
83
111
  else {
84
- socket.send(requestEvent);
112
+ dispatchRequestEvent();
85
113
  }
86
114
  const sessionState = this.options.contextCompactionSessionState;
115
+ const sessions = this.#sessions;
87
116
  return (async function* () {
117
+ let terminalReceived = false;
118
+ let released = false;
119
+ const release = (keepAlive) => {
120
+ if (released)
121
+ return;
122
+ released = true;
123
+ sessions.release(socket, { keepAlive });
124
+ };
88
125
  try {
89
126
  for await (const message of messages) {
90
- if (message.type === 'message')
91
- yield message.message;
92
- else if (message.event)
93
- yield message.event;
94
- else if (message.type === 'error')
127
+ if (message.type === 'message') {
128
+ const event = message.message;
129
+ if (TERMINAL_RESPONSE_EVENT_TYPES.has(event?.type) || event?.type === 'response.completed') {
130
+ terminalReceived = true;
131
+ }
132
+ yield event;
133
+ }
134
+ else if (message.event) {
135
+ const event = message.event;
136
+ if (TERMINAL_RESPONSE_EVENT_TYPES.has(event?.type) || event?.type === 'response.completed') {
137
+ terminalReceived = true;
138
+ }
139
+ yield event;
140
+ }
141
+ else if (message.type === 'error') {
95
142
  throw message.error;
96
- else if (message.type === 'close')
97
- throw new Error('Codex WebSocket connection closed before a terminal response event.');
143
+ }
144
+ else if (message.type === 'close') {
145
+ throw webSocketCloseError(message, readWebSocketDispatch(request));
146
+ }
98
147
  }
99
148
  }
100
149
  catch (error) {
101
- markContextCompactionFailure(error, request, sessionState);
102
- throw error;
150
+ release(false);
151
+ const normalizedError = normalizeExplicitCodexServerError(error);
152
+ markContextCompactionFailure(normalizedError, request, sessionState);
153
+ throw normalizedError;
103
154
  }
104
155
  finally {
105
- try {
106
- socket.close();
107
- }
108
- catch {
109
- /* best effort */
110
- }
156
+ release(terminalReceived);
111
157
  }
112
158
  })();
113
159
  }
@@ -131,6 +177,9 @@ export class OpenAIResponsesModel {
131
177
  this.model = model;
132
178
  this.transport = transport ?? new CodexResponsesTransport(client, model, websocket);
133
179
  }
180
+ async close() {
181
+ this.transport.close?.();
182
+ }
134
183
  buildResponsesCreateRequest(request, stream) {
135
184
  const built = this.transport.buildResponsesCreateRequest(request, stream);
136
185
  if (this.transport instanceof CodexResponsesTransport && built?.requestData) {
@@ -147,16 +196,47 @@ export class OpenAIResponsesModel {
147
196
  }
148
197
  async *rawStream(request) {
149
198
  const source = await this.fetchResponse(request, true);
150
- for await (const event of source) {
151
- if (event?.type === 'error')
152
- throw new Error(event.error?.message ?? 'Codex WebSocket provider error');
153
- if (event?.type === 'close')
154
- throw new Error('Codex WebSocket connection closed before a terminal response event.');
155
- yield event;
156
- if (event?.type === 'response.completed' ||
157
- event?.type === 'response.incomplete' ||
158
- event?.type === 'response.failed')
159
- return;
199
+ const iterator = source[Symbol.asyncIterator]();
200
+ let terminal = false;
201
+ let iteratorFinished = false;
202
+ try {
203
+ while (true) {
204
+ const next = await iterator.next();
205
+ if (next.done) {
206
+ iteratorFinished = true;
207
+ return;
208
+ }
209
+ const event = next.value;
210
+ if (event?.type === 'error')
211
+ throw new Error(event.error?.message ?? 'Codex WebSocket provider error');
212
+ if (event?.type === 'close')
213
+ throw new WebSocketClosedEarlyError(readWebSocketCloseFrame(event));
214
+ terminal =
215
+ event?.type === 'response.completed' ||
216
+ event?.type === 'response.incomplete' ||
217
+ event?.type === 'response.failed';
218
+ yield event;
219
+ if (terminal)
220
+ return;
221
+ }
222
+ }
223
+ finally {
224
+ if (!iteratorFinished) {
225
+ if (terminal) {
226
+ // The Responses WebSocket stream is session-scoped. Detach this
227
+ // completed request without awaiting an SDK iterator return that
228
+ // waits for the retained socket to close.
229
+ try {
230
+ void iterator.return?.().catch(() => undefined);
231
+ }
232
+ catch {
233
+ // Completion is authoritative; socket disposal remains best effort.
234
+ }
235
+ }
236
+ else {
237
+ await iterator.return?.();
238
+ }
239
+ }
160
240
  }
161
241
  }
162
242
  async *stream(request) {
@@ -338,19 +418,29 @@ function toCodexUsage(rawUsage) {
338
418
  function codexString(value) {
339
419
  return typeof value === 'string' && value.length > 0 ? value : undefined;
340
420
  }
341
- import { isIncompleteStreamTerminalError, isPreviousResponseNotFoundError, isRetryableTransportError, isWebSocketConnectionLimitReachedError, } from '../services/retry/retry-error-classification.js';
421
+ import { isIncompleteStreamTerminalError, isMissingServerToolOutputError, isPreviousResponseNotFoundError, isRetryableTransportError, isWebSocketConnectionLimitReachedError, } from '../services/retry/retry-error-classification.js';
342
422
  const SUSPICIOUS_RECONSTRUCTED_OUTPUT_ITEM_COUNT = 20;
343
- const TERMINAL_RESPONSE_EVENT_TYPES = new Set([
344
- 'response.completed',
345
- 'response.failed',
346
- 'response.incomplete',
347
- 'response.error',
348
- ]);
349
423
  const WS_RESPONSE_MODEL_CLASS = 'OpenAIResponsesWSModel';
350
424
  const WS_RESPONSE_WRAPPER_CLASS = 'CodexResponsesWSModel';
351
425
  const RESPONSES_LITE_MODELS = new Set(['gpt-5.6-luna']);
352
426
  const asRecord = (value) => value && typeof value === 'object' && !Array.isArray(value) ? value : null;
353
427
  const stringValue = (value) => (typeof value === 'string' && value ? value : undefined);
428
+ /**
429
+ * A Codex WebSocket `error` frame is an explicit provider rejection, unlike a
430
+ * socket close after sending a request. Normalize only its documented
431
+ * `server_error` shape to the SDK's 5xx error so the pre-event retry wrapper
432
+ * can retry it without treating an ambiguous outcome as safe to replay.
433
+ */
434
+ function normalizeExplicitCodexServerError(error) {
435
+ const outer = asRecord(asRecord(error)?.error) ?? asRecord(error);
436
+ const details = asRecord(outer?.error) ?? outer;
437
+ if (!details || (details.type !== 'server_error' && details.code !== 'server_error')) {
438
+ return error;
439
+ }
440
+ const normalized = new InternalServerError(500, details, stringValue(details.message), new Headers());
441
+ Object.defineProperty(normalized, 'cause', { value: error, configurable: true });
442
+ return normalized;
443
+ }
354
444
  const CODEX_REPLAY_ITEM_TYPES_WITHOUT_IDS = new Set([
355
445
  'message',
356
446
  'reasoning',
@@ -597,6 +687,15 @@ const collectFunctionCallIds = (input) => {
597
687
  }
598
688
  return ids;
599
689
  };
690
+ const isExactInputPrefix = (input, prefix) => {
691
+ if (prefix.length > input.length)
692
+ return false;
693
+ return prefix.every((item, index) => JSON.stringify(item) === JSON.stringify(input[index]));
694
+ };
695
+ const collectUnpairedToolResultCallIds = (original, filtered) => {
696
+ const remaining = new Set(collectToolResultCallIds(filtered));
697
+ return collectToolResultCallIds(original).filter((callId) => !remaining.has(callId));
698
+ };
600
699
  const dropUnpairedCodexToolItems = (history) => {
601
700
  const callIds = new Set();
602
701
  const resultIds = new Set();
@@ -722,10 +821,26 @@ const isDefinitelyUnsentWebSocketError = (error, seen = new Set()) => {
722
821
  }
723
822
  return isDefinitelyUnsentWebSocketError(record.message, seen) || isDefinitelyUnsentWebSocketError(record.cause, seen);
724
823
  };
824
+ /**
825
+ * A receive-watchdog timeout that the send path proved never reached the wire.
826
+ *
827
+ * Three conditions must all hold, and each rules out a way of being wrong: the
828
+ * failure is the watchdog's own (not a provider error wearing a timeout
829
+ * message), no frame ever arrived (a single frame means the server had the
830
+ * request), and the send path positively recorded `unsent` (an unrecorded
831
+ * request is not evidence). Anything less stays ambiguous and terminates.
832
+ */
833
+ const asProvablyUnsentTimeout = (timeoutError, timing, request) => {
834
+ if (!timeoutError || timing.frameCount > 0)
835
+ return undefined;
836
+ if (readWebSocketDispatch(request) !== 'unsent')
837
+ return undefined;
838
+ return new UnsentWebSocketRequestError(timeoutError.message, { cause: timeoutError });
839
+ };
725
840
  const asAmbiguousModelOutcome = (error) => {
726
841
  // Connection never carried the request: safe to let outer retry / transport
727
842
  // fallback policies decide. Do not pretend the model may have run.
728
- if (isDefinitelyUnsentWebSocketError(error)) {
843
+ if (error instanceof UnsentWebSocketRequestError || isDefinitelyUnsentWebSocketError(error)) {
729
844
  return undefined;
730
845
  }
731
846
  // Incomplete stream terminals keep transportFallback=false so Codex does not
@@ -740,13 +855,6 @@ const asAmbiguousModelOutcome = (error) => {
740
855
  return undefined;
741
856
  };
742
857
  const hasGenerateFalse = (request) => request.providerOptions?.generate === false;
743
- const withProviderOptions = (request, providerOptions) => ({
744
- ...request,
745
- providerOptions: {
746
- ...request.providerOptions,
747
- ...providerOptions,
748
- },
749
- });
750
858
  export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
751
859
  modelId;
752
860
  tokenManager;
@@ -755,6 +863,9 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
755
863
  codexFunctionCallIdsByResponseId = new Map();
756
864
  codexTurnIdsBySession = new Map();
757
865
  #serverHistoryReuseDisabled = false;
866
+ #lastSentChainFingerprint;
867
+ #lastRejectedChainFingerprint;
868
+ #lastLogicalRequestByKey = new Map();
758
869
  providerTraffic;
759
870
  diagnosticLogger;
760
871
  sessionContextService;
@@ -805,7 +916,7 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
805
916
  modelWrapperClass: WS_RESPONSE_WRAPPER_CLASS,
806
917
  });
807
918
  }
808
- #logTrafficReceived(requestId, requestData, response) {
919
+ #logTrafficReceived(requestId, requestData, response, receiveTiming) {
809
920
  const providerTraffic = this.providerTraffic ?? DUMMY_PROVIDER_TRAFFIC;
810
921
  const model = typeof requestData.model === 'string' ? requestData.model : this.#modelNameFallback();
811
922
  providerTraffic.recordResponseReceived({
@@ -815,11 +926,12 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
815
926
  status: 200,
816
927
  response: response,
817
928
  transport: 'websocket',
929
+ ...(receiveTiming ? { receiveTiming } : {}),
818
930
  modelClass: WS_RESPONSE_MODEL_CLASS,
819
931
  modelWrapperClass: WS_RESPONSE_WRAPPER_CLASS,
820
932
  });
821
933
  }
822
- #logTrafficFailed(requestId, requestData, error) {
934
+ #logTrafficFailed(requestId, requestData, error, receiveTiming) {
823
935
  const providerTraffic = this.providerTraffic ?? DUMMY_PROVIDER_TRAFFIC;
824
936
  const model = typeof requestData.model === 'string' ? requestData.model : this.#modelNameFallback();
825
937
  providerTraffic.recordRequestFailed({
@@ -827,6 +939,7 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
827
939
  provider: 'codex',
828
940
  model,
829
941
  error,
942
+ ...(receiveTiming ? { receiveTiming } : {}),
830
943
  modelClass: WS_RESPONSE_MODEL_CLASS,
831
944
  modelWrapperClass: WS_RESPONSE_WRAPPER_CLASS,
832
945
  });
@@ -845,7 +958,7 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
845
958
  modelWrapperClass: WS_RESPONSE_WRAPPER_CLASS,
846
959
  });
847
960
  }
848
- async #withTrafficLogging(responseStream, requestId, requestData, wireStateKey, wireStateToken, signal) {
961
+ async #withTrafficLogging(responseStream, requestId, requestData, wireStateKey, wireStateToken, signal, receiveTiming, asProvablyUnsent) {
849
962
  const logReceived = this.#logTrafficReceived.bind(this);
850
963
  const logFailed = this.#logTrafficFailed.bind(this);
851
964
  const logClosed = this.#logTrafficClosed.bind(this);
@@ -878,7 +991,7 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
878
991
  if (wireStateKey && wireStateToken && typeof response.id === 'string' && response.id.length > 0) {
879
992
  wireState.recordResponse(wireStateKey, wireStateToken, response.id, response.output);
880
993
  }
881
- logReceived(requestId, requestData, response);
994
+ logReceived(requestId, requestData, response, receiveTiming?.());
882
995
  }
883
996
  yield event;
884
997
  }
@@ -889,8 +1002,12 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
889
1002
  if (wireStateKey && !isWebSocketConnectionLimitReachedError(error)) {
890
1003
  wireState.invalidate(wireStateKey);
891
1004
  }
892
- logFailed(requestId, requestData, error);
893
- throw error;
1005
+ // The watchdog's own timeout may carry proof that the request never
1006
+ // reached the wire; the wire-state decision above still keys off the
1007
+ // error as thrown.
1008
+ const failure = asProvablyUnsent?.() ?? error;
1009
+ logFailed(requestId, requestData, failure, receiveTiming?.());
1010
+ throw failure;
894
1011
  }
895
1012
  finally {
896
1013
  if (!sawTerminalEvent && !sourceExhausted && !streamFailed) {
@@ -908,29 +1025,6 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
908
1025
  }
909
1026
  return wrapped();
910
1027
  }
911
- async #warmupCodexUnary(request) {
912
- if (!request) {
913
- return undefined;
914
- }
915
- const response = await super.fetchUnaryResponse(request);
916
- const responseId = getResponseIdFromResponse(response);
917
- this.#rememberCodexResponseId(responseId, asRecord(response)?.output, request.input, true);
918
- return responseId;
919
- }
920
- async #warmupCodexStream(request) {
921
- if (!request) {
922
- return undefined;
923
- }
924
- let responseId;
925
- for await (const event of super.rawStream(request)) {
926
- const eventResponseId = getResponseIdFromStreamEvent(event);
927
- if (eventResponseId) {
928
- responseId = eventResponseId;
929
- this.#rememberCodexResponseId(responseId, getResponseOutputFromStreamEvent(event), request.input, true);
930
- }
931
- }
932
- return responseId;
933
- }
934
1028
  #prepareCodexServerHistoryRequest(request) {
935
1029
  const explicitPreviousResponseId = typeof request.previousResponseId === 'string' && request.previousResponseId.length > 0
936
1030
  ? request.previousResponseId
@@ -960,28 +1054,33 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
960
1054
  };
961
1055
  }
962
1056
  #getRememberedCodexResponseIdForRequest(request) {
963
- if (this.#serverHistoryReuseDisabled) {
1057
+ if (this.#serverHistoryReuseDisabled || hasGenerateFalse(request)) {
964
1058
  return undefined;
965
1059
  }
966
1060
  const key = this.#getCodexServerHistoryKey();
967
- if (!key || hasGenerateFalse(request)) {
1061
+ const stored = key ? this.#lastLogicalRequestByKey.get(key) : undefined;
1062
+ if (!stored || !Array.isArray(request.input)) {
968
1063
  return undefined;
969
1064
  }
970
- const hasToolResultBeforeTrailingUserMessages = (items) => {
971
- let endUserIndex = items.length;
972
- while (endUserIndex > 0 && isUserInputMessage(items[endUserIndex - 1])) {
973
- endUserIndex--;
974
- }
975
- return endUserIndex > 0 && isToolResultItem(items[endUserIndex - 1]);
976
- };
977
- const input = request.input;
978
- const isInternalToolContinuation = Array.isArray(input) &&
979
- input.length > 1 &&
980
- input.some(isUserInputMessage) &&
981
- hasToolResultBeforeTrailingUserMessages(input);
982
- return isInternalToolContinuation ? this.codexPreviousResponseIds.get(key) : undefined;
1065
+ return isExactInputPrefix(request.input, stored.input) ? stored.responseId : undefined;
983
1066
  }
984
1067
  #prepareCodexServerHistoryRequests(request) {
1068
+ if (request?.disableChaining === true) {
1069
+ this.#forgetCodexResponseId();
1070
+ const { previousResponseId: _previousResponseId, ...rest } = request;
1071
+ const input = Array.isArray(rest.input) ? dropUnpairedCodexToolItems(rest.input) : rest.input;
1072
+ this.diagnosticLogger?.debug?.('Codex chain recovery bypassed warmup and previous_response_id', {
1073
+ eventType: 'codex.chain_recovery.warmup_bypassed',
1074
+ category: 'provider',
1075
+ phase: 'request_prepare',
1076
+ droppedOrphanCallIds: collectUnpairedToolResultCallIds(rest.input, input),
1077
+ });
1078
+ return { request: input === rest.input ? rest : { ...rest, input } };
1079
+ }
1080
+ if (RESPONSES_LITE_MODELS.has(this.modelId)) {
1081
+ const input = Array.isArray(request.input) ? dropUnpairedCodexToolItems(request.input) : request.input;
1082
+ return { request: input === request.input ? request : { ...request, input } };
1083
+ }
985
1084
  const key = this.#getCodexServerHistoryKey();
986
1085
  if (!key || hasGenerateFalse(request)) {
987
1086
  return { request };
@@ -990,52 +1089,31 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
990
1089
  if (preparedRequest.previousResponseId) {
991
1090
  return { request: preparedRequest };
992
1091
  }
1092
+ // No usable server-held anchor, so this request carries its full history.
1093
+ //
1094
+ // Codex's `generate:false` warmup is deliberately not used here. It is only
1095
+ // a win when it can be issued ahead of an upcoming turn, and this call site
1096
+ // sits immediately before the request it would prepare -- so it bought a
1097
+ // serial round trip while the paired generate call still reported the full
1098
+ // uncached prompt (`cached_tokens: 0`), counting the prompt twice. The
1099
+ // response ID that anchors the next turn comes from the generate response
1100
+ // either way, so dropping warmup costs no chaining.
993
1101
  const input = Array.isArray(request.input) ? dropUnpairedCodexToolItems(request.input) : request.input;
994
- const replayRequest = input === request.input ? request : { ...request, input };
995
- if (!Array.isArray(input) || input.length === 0) {
996
- return { request: replayRequest };
997
- }
998
- const deltaStart = findServerManagedDeltaStart(input);
999
- const warmupItems = deltaStart > 0 ? [...input.slice(0, deltaStart)] : [];
1000
- const rawDelta = deltaStart > 0 ? input.slice(deltaStart) : [...input];
1001
- // The trailing walk collects interleaved function-call items alongside
1002
- // their tool results to keep parallel outputs together. Move those
1003
- // function-call items back to the warmup so the server receives them
1004
- // as history (generate: false) and can pair them with the tool results
1005
- // that arrive in the delta request.
1006
- const deltaInput = [];
1007
- for (const item of rawDelta) {
1008
- if (isToolResultItem(item)) {
1009
- deltaInput.push(item);
1010
- }
1011
- else if (isToolContinuationItem(item)) {
1012
- warmupItems.push(item);
1013
- }
1014
- else {
1015
- deltaInput.push(item);
1016
- }
1017
- }
1018
- return {
1019
- warmupRequest: withProviderOptions({
1020
- ...replayRequest,
1021
- input: warmupItems,
1022
- }, { generate: false }),
1023
- request: {
1024
- ...replayRequest,
1025
- input: deltaInput,
1026
- },
1027
- };
1028
- }
1029
- #withCodexPreviousResponseId(request, previousResponseId) {
1030
- if (!previousResponseId) {
1031
- return request;
1032
- }
1033
- return this.#prepareCodexServerHistoryRequest({
1034
- ...request,
1035
- previousResponseId,
1036
- });
1037
- }
1038
- #rememberCodexResponseId(responseId, output, input, recordChainAnchor = false) {
1102
+ return { request: input === request.input ? request : { ...request, input } };
1103
+ }
1104
+ /**
1105
+ * Records a response ID as the anchor for the next turn's `previous_response_id`.
1106
+ *
1107
+ * The chain anchor -- the set of function call IDs a response is known to hold
1108
+ * -- is recorded only for a full-history request, meaning one sent without
1109
+ * `previous_response_id`. That condition used to be implicit: only the
1110
+ * `generate:false` warmup leg recorded an anchor, and warmup always carried
1111
+ * complete history. Recording it from a chained request instead would be a
1112
+ * false-positive machine, because a chained request's `input` is only the
1113
+ * delta -- the orphan guard below would then reject every genuinely new tool
1114
+ * output as unknown to the chain.
1115
+ */
1116
+ #rememberCodexResponseId(responseId, output, input, sentAsFullHistory = false) {
1039
1117
  if (!responseId) {
1040
1118
  return;
1041
1119
  }
@@ -1043,8 +1121,13 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
1043
1121
  const key = this.#getCodexServerHistoryKey();
1044
1122
  if (key) {
1045
1123
  this.codexPreviousResponseIds.set(key, responseId);
1124
+ this.#lastLogicalRequestByKey.set(key, {
1125
+ input: Array.isArray(input) ? [...input] : this.#lastLogicalRequestByKey.get(key)?.input ?? [],
1126
+ output: Array.isArray(output) ? [...output] : [],
1127
+ responseId,
1128
+ });
1046
1129
  }
1047
- if (recordChainAnchor && (Array.isArray(output) || Array.isArray(input))) {
1130
+ if (sentAsFullHistory && (Array.isArray(output) || Array.isArray(input))) {
1048
1131
  this.codexFunctionCallIdsByResponseId.set(responseId, new Set([...collectFunctionCallIds(output), ...collectFunctionCallIds(input)]));
1049
1132
  }
1050
1133
  }
@@ -1092,6 +1175,36 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
1092
1175
  this.codexFunctionCallIdsByResponseId.clear();
1093
1176
  this.codexTurnIdsBySession.clear();
1094
1177
  this.chainedWireState.clear();
1178
+ this.#lastLogicalRequestByKey.clear();
1179
+ this.#lastSentChainFingerprint = undefined;
1180
+ }
1181
+ #fingerprintPreparedRequest(request, recoveryClass = 'chain_recovery') {
1182
+ return fingerprintChainRequest({
1183
+ provider: 'codex',
1184
+ model: this.modelId,
1185
+ previousResponseId: typeof request?.previousResponseId === 'string' ? request.previousResponseId : null,
1186
+ input: Array.isArray(request?.input) ? request.input : [],
1187
+ recoveryClass,
1188
+ });
1189
+ }
1190
+ #assertChainRequestMakesProgress(request) {
1191
+ const fingerprint = this.#fingerprintPreparedRequest(request);
1192
+ if (this.#lastRejectedChainFingerprint && this.#lastRejectedChainFingerprint === fingerprint) {
1193
+ this.diagnosticLogger?.warn?.('Codex chain recovery would repeat a rejected request', {
1194
+ eventType: 'retry.conversation_state_no_progress',
1195
+ category: 'retry',
1196
+ phase: 'request_prepare',
1197
+ });
1198
+ throw new ConversationStateNoProgressError();
1199
+ }
1200
+ this.#lastSentChainFingerprint = fingerprint;
1201
+ }
1202
+ #recordRejectedChainRequest(error) {
1203
+ if (isMissingServerToolOutputError(error) ||
1204
+ isOrphanedChainedToolOutputError(error) ||
1205
+ isPreviousResponseNotFoundError(error)) {
1206
+ this.#lastRejectedChainFingerprint = this.#lastSentChainFingerprint;
1207
+ }
1095
1208
  }
1096
1209
  #shouldForgetCodexServerHistory(error) {
1097
1210
  // This rejects the new request before generation; it expires the socket,
@@ -1103,6 +1216,8 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
1103
1216
  const message = getErrorMessage(error);
1104
1217
  return (isPreviousResponseNotFoundError(error) ||
1105
1218
  message.includes('previous_response_not_found') ||
1219
+ isMissingServerToolOutputError(error) ||
1220
+ isOrphanedChainedToolOutputError(error) ||
1106
1221
  isRetryableTransportError(error).transportFallback);
1107
1222
  }
1108
1223
  #getCodexServerHistoryKey() {
@@ -1115,7 +1230,7 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
1115
1230
  return undefined;
1116
1231
  }
1117
1232
  const sessionContext = this.sessionContextService?.getContext();
1118
- const sessionId = sessionContext?.sessionId ?? requestId;
1233
+ const sessionId = sessionContext?.providerHistoryKey ?? sessionContext?.sessionId ?? requestId;
1119
1234
  const threadId = sessionId;
1120
1235
  const hasPreviousResponseId = typeof request?.previousResponseId === 'string' && request.previousResponseId.length > 0;
1121
1236
  const turnId = hasPreviousResponseId ? this.codexTurnIdsBySession.get(sessionId) ?? randomUUID() : randomUUID();
@@ -1152,14 +1267,6 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
1152
1267
  },
1153
1268
  };
1154
1269
  }
1155
- #getEffectiveCodexRequestAfterWarmup(originalRequest, preparedRequest, warmupResponseId) {
1156
- if (!preparedRequest.warmupRequest) {
1157
- return preparedRequest.request;
1158
- }
1159
- return warmupResponseId
1160
- ? this.#withCodexPreviousResponseId(preparedRequest.request, warmupResponseId)
1161
- : originalRequest;
1162
- }
1163
1270
  #withoutCodexServerHistory(request) {
1164
1271
  if (!request || typeof request !== 'object') {
1165
1272
  return request;
@@ -1172,16 +1279,17 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
1172
1279
  let attemptedWithServerHistory = false;
1173
1280
  try {
1174
1281
  const preparedRequest = this.#prepareCodexServerHistoryRequests(request);
1175
- attemptedWithServerHistory = Boolean(preparedRequest.warmupRequest || preparedRequest.request?.previousResponseId);
1176
- const warmupResponseId = await this.#warmupCodexUnary(preparedRequest.warmupRequest);
1177
- const effectiveRequest = this.#getEffectiveCodexRequestAfterWarmup(request, preparedRequest, warmupResponseId);
1282
+ attemptedWithServerHistory = Boolean(preparedRequest.request?.previousResponseId);
1283
+ const effectiveRequest = preparedRequest.request;
1284
+ this.#assertChainRequestMakesProgress(effectiveRequest);
1178
1285
  const response = await super.fetchUnaryResponse(effectiveRequest);
1179
1286
  const responseId = getResponseIdFromResponse(response);
1180
- this.#rememberCodexResponseId(responseId, asRecord(response)?.output, effectiveRequest.input);
1287
+ this.#rememberCodexResponseId(responseId, asRecord(response)?.output, request.input, !effectiveRequest.previousResponseId);
1181
1288
  this.#rememberConsumedToolResultCallIds(responseId, effectiveRequest.previousResponseId, effectiveRequest.input);
1182
1289
  return response;
1183
1290
  }
1184
1291
  catch (error) {
1292
+ this.#recordRejectedChainRequest(error);
1185
1293
  if (isPreviousResponseUnavailableError(error) && attemptedWithServerHistory) {
1186
1294
  this.#forgetCodexResponseId();
1187
1295
  if (isPreviousResponseUnavailableError(error) && hasToolResultInput(request)) {
@@ -1190,7 +1298,7 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
1190
1298
  const fallbackRequest = this.#withoutCodexServerHistory(request);
1191
1299
  const response = await super.fetchUnaryResponse(fallbackRequest);
1192
1300
  const responseId = getResponseIdFromResponse(response);
1193
- this.#rememberCodexResponseId(responseId, asRecord(response)?.output, fallbackRequest.input);
1301
+ this.#rememberCodexResponseId(responseId, asRecord(response)?.output, fallbackRequest.input, true);
1194
1302
  this.#rememberConsumedToolResultCallIds(responseId, undefined, fallbackRequest.input);
1195
1303
  return response;
1196
1304
  }
@@ -1207,15 +1315,15 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
1207
1315
  let attemptedWithServerHistory = false;
1208
1316
  try {
1209
1317
  const preparedRequest = this.#prepareCodexServerHistoryRequests(request);
1210
- attemptedWithServerHistory = Boolean(preparedRequest.warmupRequest || preparedRequest.request?.previousResponseId);
1211
- const warmupResponseId = await this.#warmupCodexStream(preparedRequest.warmupRequest);
1212
- const effectiveRequest = this.#getEffectiveCodexRequestAfterWarmup(request, preparedRequest, warmupResponseId);
1318
+ attemptedWithServerHistory = Boolean(preparedRequest.request?.previousResponseId);
1319
+ const effectiveRequest = preparedRequest.request;
1320
+ this.#assertChainRequestMakesProgress(effectiveRequest);
1213
1321
  let responseId;
1214
1322
  for await (const event of super.rawStream(effectiveRequest)) {
1215
1323
  const eventResponseId = getResponseIdFromStreamEvent(event);
1216
1324
  if (eventResponseId) {
1217
1325
  responseId = eventResponseId;
1218
- this.#rememberCodexResponseId(responseId, getResponseOutputFromStreamEvent(event), effectiveRequest.input);
1326
+ this.#rememberCodexResponseId(responseId, getResponseOutputFromStreamEvent(event), request.input, !effectiveRequest.previousResponseId);
1219
1327
  }
1220
1328
  if (TERMINAL_RESPONSE_EVENT_TYPES.has(event?.type)) {
1221
1329
  this.#rememberConsumedToolResultCallIds(responseId, effectiveRequest.previousResponseId, effectiveRequest.input);
@@ -1226,6 +1334,8 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
1226
1334
  this.#rememberConsumedToolResultCallIds(responseId, effectiveRequest.previousResponseId, effectiveRequest.input);
1227
1335
  }
1228
1336
  catch (error) {
1337
+ this.#logWebSocketClosedEarly(error, receivedRawFrame);
1338
+ this.#recordRejectedChainRequest(error);
1229
1339
  if (isPreviousResponseUnavailableError(error) && attemptedWithServerHistory && !receivedRawFrame) {
1230
1340
  this.#forgetCodexResponseId();
1231
1341
  if (isPreviousResponseUnavailableError(error) && hasToolResultInput(request)) {
@@ -1239,7 +1349,7 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
1239
1349
  const eventResponseId = getResponseIdFromStreamEvent(event);
1240
1350
  if (eventResponseId) {
1241
1351
  responseId = eventResponseId;
1242
- this.#rememberCodexResponseId(responseId, getResponseOutputFromStreamEvent(event), fallbackRequest.input);
1352
+ this.#rememberCodexResponseId(responseId, getResponseOutputFromStreamEvent(event), fallbackRequest.input, true);
1243
1353
  }
1244
1354
  if (TERMINAL_RESPONSE_EVENT_TYPES.has(event?.type)) {
1245
1355
  this.#rememberConsumedToolResultCallIds(responseId, undefined, fallbackRequest.input);
@@ -1259,6 +1369,27 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
1259
1369
  throw asAmbiguousModelOutcome(error) ?? error;
1260
1370
  }
1261
1371
  }
1372
+ /**
1373
+ * The close code is the only field that distinguishes a network drop from a
1374
+ * deliberate server close, and it is discarded once the error is wrapped for
1375
+ * recovery. Record it here, where the retry decision that follows can be read
1376
+ * against it.
1377
+ */
1378
+ #logWebSocketClosedEarly(error, receivedRawFrame) {
1379
+ const closed = findWebSocketClosedEarly(error);
1380
+ if (!closed)
1381
+ return;
1382
+ this.diagnosticLogger?.warn?.('Codex WebSocket closed before a terminal response event', {
1383
+ eventType: 'codex.websocket.closed_early',
1384
+ category: 'provider',
1385
+ model: this.modelId,
1386
+ closeCode: closed.closeCode ?? null,
1387
+ closeReason: closed.closeReason ?? null,
1388
+ unsentCount: closed.unsentCount,
1389
+ receivedRawFrame,
1390
+ provablyUnsent: error instanceof UnsentWebSocketRequestError,
1391
+ });
1392
+ }
1262
1393
  buildResponsesCreateRequest(request, stream) {
1263
1394
  const built = super.buildResponsesCreateRequest(request, stream);
1264
1395
  const requestData = normalizeCodexRequestData(built.requestData, request, this.modelId, {
@@ -1342,13 +1473,14 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
1342
1473
  if (wireStateKey && wireStateToken && typeof response?.id === 'string' && response.id.length > 0) {
1343
1474
  this.chainedWireState.recordResponse(wireStateKey, wireStateToken, response.id, response.output);
1344
1475
  }
1345
- this.#logTrafficReceived(requestId, requestData, response);
1476
+ this.#logTrafficReceived(requestId, requestData, response, watchdog.receiveTiming());
1346
1477
  return response;
1347
1478
  }
1348
1479
  catch (error) {
1349
1480
  const timeoutError = watchdog.timeoutError();
1481
+ const receiveTiming = watchdog.receiveTiming();
1350
1482
  watchdog.close();
1351
- const failure = timeoutError ?? error;
1483
+ const failure = asProvablyUnsentTimeout(timeoutError, receiveTiming, updatedRequest) ?? timeoutError ?? error;
1352
1484
  if (wireStateKey) {
1353
1485
  if (isWebSocketConnectionLimitReachedError(failure)) {
1354
1486
  if (wireStateToken)
@@ -1358,19 +1490,20 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
1358
1490
  this.chainedWireState.invalidate(wireStateKey);
1359
1491
  }
1360
1492
  }
1361
- this.#logTrafficFailed(requestId, requestData, failure);
1493
+ this.#logTrafficFailed(requestId, requestData, failure, receiveTiming);
1362
1494
  throw failure;
1363
1495
  }
1364
1496
  }
1365
1497
  try {
1366
1498
  const response = (await super.fetchResponse(updatedRequest, stream));
1367
1499
  const patched = wrapCodexStream(watchdog.wrap(response), this.diagnosticLogger);
1368
- return this.#withTrafficLogging(patched, requestId, requestData, wireStateKey, wireStateToken, updatedRequest.signal);
1500
+ return this.#withTrafficLogging(patched, requestId, requestData, wireStateKey, wireStateToken, updatedRequest.signal, () => watchdog.receiveTiming(), () => asProvablyUnsentTimeout(watchdog.timeoutError(), watchdog.receiveTiming(), updatedRequest));
1369
1501
  }
1370
1502
  catch (error) {
1371
1503
  const timeoutError = watchdog.timeoutError();
1504
+ const receiveTiming = watchdog.receiveTiming();
1372
1505
  watchdog.close();
1373
- const failure = timeoutError ?? error;
1506
+ const failure = asProvablyUnsentTimeout(timeoutError, receiveTiming, updatedRequest) ?? timeoutError ?? error;
1374
1507
  if (wireStateKey) {
1375
1508
  if (isWebSocketConnectionLimitReachedError(failure)) {
1376
1509
  if (wireStateToken)
@@ -1380,7 +1513,7 @@ export class CodexResponsesWSModel extends OpenAIResponsesWSModel {
1380
1513
  this.chainedWireState.invalidate(wireStateKey);
1381
1514
  }
1382
1515
  }
1383
- this.#logTrafficFailed(requestId, requestData, failure);
1516
+ this.#logTrafficFailed(requestId, requestData, failure, receiveTiming);
1384
1517
  throw failure;
1385
1518
  }
1386
1519
  }