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