@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
@@ -5,13 +5,15 @@ import { isZodToolParameterSchema } from '../../tools/types.js';
5
5
  import { normalizeToolParameters } from '../../lib/tool-invoke.js';
6
6
  import { isCancellationError, isHarnessInvariantError } from '../../lib/harness-invariant-error.js';
7
7
  import { ApprovalLedger } from './tool-invocation-context.js';
8
+ import { RunBudget, isRunBudgetInteraction, } from './run-budget.js';
8
9
  import { addTokenUsage, normalizeUsage } from '../../utils/ai/token-usage.js';
9
10
  import { computeModelCost } from '../../services/cost/model-cost.js';
10
11
  import { getCatalogPricingVersion, getModelPricing } from '../../services/cost/pricing.js';
11
12
  import { GenerationDeadline, GenerationGuard, GenerationGuardError, } from './generation-guard.js';
12
13
  /**
13
- * Raised when a run exceeds its `maxTurns` budget. The loop owns turn counting
14
- * — the SDK-era `callModelInputFilter` hook is deliberately not reintroduced.
14
+ * Compatibility error for legacy callers without a staged run budget. The loop
15
+ * owns turn counting — the SDK-era `callModelInputFilter` hook is deliberately
16
+ * not reintroduced.
15
17
  */
16
18
  export class MaxTurnsExceededError extends Error {
17
19
  maxTurns;
@@ -65,6 +67,8 @@ class EventQueue {
65
67
  * turns and silently drop later turns' records.
66
68
  */
67
69
  let nextCostRequestSeq = 0;
70
+ let nextToolBatchSeq = 0;
71
+ const DEFAULT_MAX_PARALLEL_TOOL_CALLS = 3;
68
72
  /**
69
73
  * Small provider-neutral agent loop. It owns model-turn sequencing and tool
70
74
  * execution; providers only implement `StreamedModelTurn`.
@@ -74,6 +78,7 @@ export class ApplicationRunLoop {
74
78
  #contextCompactionSessionState;
75
79
  #activeAbortController = null;
76
80
  #runInFlight = false;
81
+ #segmentGeneration = 0;
77
82
  /**
78
83
  * Set when a segment ends holding approvals, meaning the turn is pausing
79
84
  * rather than finishing. Injections offered during the pause wait here for
@@ -93,6 +98,8 @@ export class ApplicationRunLoop {
93
98
  */
94
99
  #turnOpen = false;
95
100
  #pendingSteers = [];
101
+ /** The run whose budget an out-of-band grant applies to, held across a pause. */
102
+ #activeRunBudgetState;
96
103
  constructor(deps) {
97
104
  this.#deps = deps;
98
105
  this.#contextCompactionSessionState = deps.contextCompactionSessionState ?? { disabled: false };
@@ -134,6 +141,38 @@ export class ApplicationRunLoop {
134
141
  this.#activeAbortController?.abort();
135
142
  this.#activeAbortController = null;
136
143
  }
144
+ /**
145
+ * Grant one finite continuation extension to the current logical run.
146
+ *
147
+ * The interactive prompt calls this before resuming because it has to show
148
+ * the human a refusal rather than a silent stop. The grant is recorded so the
149
+ * matching `approve` does not charge a second one.
150
+ */
151
+ grantRunBudgetExtension(grantedBy = 'human') {
152
+ const state = this.#activeRunBudgetState;
153
+ if (!state?.runBudget)
154
+ return { granted: false, extensionsGranted: 0 };
155
+ const grant = state.runBudget.grantExtension(grantedBy);
156
+ if (grant.granted)
157
+ state.runBudgetGrantConsumed = true;
158
+ return grant;
159
+ }
160
+ /**
161
+ * Charge this interaction's extension unless a caller already took it.
162
+ *
163
+ * An ungranted arrival here means nobody was prompted — the continuation
164
+ * applier, non-interactive mode, `--auto-approve`. That is a parent-class
165
+ * grant, so it is capped and eventually refuses.
166
+ */
167
+ #takeRunBudgetGrant(state) {
168
+ if (state.runBudgetGrantConsumed) {
169
+ state.runBudgetGrantConsumed = false;
170
+ return true;
171
+ }
172
+ if (!state.runBudget)
173
+ return true;
174
+ return state.runBudget.grantExtension('parent').granted;
175
+ }
137
176
  /**
138
177
  * Hand the running turn a user message to send with its next model request.
139
178
  *
@@ -250,7 +289,9 @@ export class ApplicationRunLoop {
250
289
  history: normalizeHistory(input),
251
290
  // A response ID is usable only after its provider origin is recorded.
252
291
  // This also makes old callers that omit providerId fail closed.
253
- responseId: options.providerId && options.supportsConversationChaining === true
292
+ responseId: options.disableChainingForAttempt !== true &&
293
+ options.providerId &&
294
+ options.supportsConversationChaining === true
254
295
  ? options.previousResponseId ?? undefined
255
296
  : undefined,
256
297
  pendingApprovals: [],
@@ -260,6 +301,7 @@ export class ApplicationRunLoop {
260
301
  ? options.providerId
261
302
  : undefined,
262
303
  requestPreparation: options.requestPreparation,
304
+ disableChainingForAttempt: options.disableChainingForAttempt === true,
263
305
  sessionId: options.sessionId,
264
306
  turnId: options.turnId,
265
307
  hookScope: options.hookScope,
@@ -267,12 +309,36 @@ export class ApplicationRunLoop {
267
309
  approvals: options.approvals ?? new ApprovalLedger(),
268
310
  turnCount: 0,
269
311
  maxTurns: options.maxTurns,
312
+ ...(options.runBudget
313
+ ? {
314
+ runBudget: new RunBudget(options.runBudget),
315
+ onRunBudgetEvent: options.onRunBudgetEvent,
316
+ wrapUpOnCriticalRunBudget: options.wrapUpOnCriticalRunBudget,
317
+ runBudgetEscalation: options.runBudget.escalation,
318
+ }
319
+ : {}),
320
+ automaticCompactionsThisRun: 0,
270
321
  };
271
322
  state.approve = (interruption) => {
323
+ if (isRunBudgetInteraction(interruption)) {
324
+ // Continuing past an exhausted envelope must cost a finite extension no
325
+ // matter which surface answered. A caller that already took the grant
326
+ // (the interactive prompt, which needs the outcome before resuming)
327
+ // marks it consumed; every other path — the continuation applier,
328
+ // non-interactive, --auto-approve — lands here ungranted and takes it
329
+ // now. Without this, an auto-approved 'y' would resume with every stage
330
+ // still latched and never check in again.
331
+ state.runBudgetInteractionDecision = this.#takeRunBudgetGrant(state) ? 'continue' : 'stop';
332
+ return;
333
+ }
272
334
  state.approvalDecision = 'approved';
273
335
  state.approvalDecisionCallId = getInterruptionCallId(interruption);
274
336
  };
275
337
  state.reject = (interruption, approvalOptions) => {
338
+ if (isRunBudgetInteraction(interruption)) {
339
+ state.runBudgetInteractionDecision = 'stop';
340
+ return;
341
+ }
276
342
  state.approvalDecision = 'rejected';
277
343
  state.approvalDecisionCallId = getInterruptionCallId(interruption);
278
344
  state.approvalMessage = approvalOptions?.message;
@@ -298,6 +364,15 @@ export class ApplicationRunLoop {
298
364
  // Handles created before cost accounting existed have no record list.
299
365
  if (!state.costRecords)
300
366
  state.costRecords = [];
367
+ if (!state.runBudget && options.runBudget) {
368
+ state.runBudget = new RunBudget(options.runBudget);
369
+ }
370
+ if (options.runBudget)
371
+ state.runBudgetEscalation = options.runBudget.escalation;
372
+ if (options.onRunBudgetEvent)
373
+ state.onRunBudgetEvent = options.onRunBudgetEvent;
374
+ if (options.wrapUpOnCriticalRunBudget)
375
+ state.wrapUpOnCriticalRunBudget = true;
301
376
  // Response IDs are provider-owned. A handle from before provenance was
302
377
  // recorded, a missing providerId, or a provider switch must never forward
303
378
  // its opaque ID. In particular, do not use previousResponseId as a
@@ -336,6 +411,11 @@ export class ApplicationRunLoop {
336
411
  // root closure for callers that do not provide one again.
337
412
  if (options.requestPreparation)
338
413
  state.requestPreparation = options.requestPreparation;
414
+ if (options.disableChainingForAttempt === true) {
415
+ state.disableChainingForAttempt = true;
416
+ state.responseId = undefined;
417
+ state.responseProviderId = undefined;
418
+ }
339
419
  if (options.sessionId !== undefined)
340
420
  state.sessionId = options.sessionId;
341
421
  if (options.turnId !== undefined)
@@ -346,10 +426,12 @@ export class ApplicationRunLoop {
346
426
  }
347
427
  #run(state, options) {
348
428
  const queue = new EventQueue();
429
+ const segmentGeneration = ++this.#segmentGeneration;
349
430
  this.abortSegment();
350
431
  const controller = new AbortController();
351
432
  this.#activeAbortController = controller;
352
433
  this.#runInFlight = true;
434
+ state.runBudget?.resume();
353
435
  // This segment is running, so the turn is no longer paused between them.
354
436
  this.#turnPaused = false;
355
437
  if (options.signal) {
@@ -368,6 +450,15 @@ export class ApplicationRunLoop {
368
450
  get turn() {
369
451
  return { count: state.turnCount, max: state.maxTurns };
370
452
  },
453
+ get budget() {
454
+ return state.runBudget
455
+ ? {
456
+ takeSoftEvidence: () => state.runBudget?.takeSoftEvidence(),
457
+ takeStallEvidence: () => state.runBudget?.takeStallEvidence(),
458
+ remainingPolicy: () => state.runBudget?.remainingPolicy(),
459
+ }
460
+ : undefined;
461
+ },
371
462
  };
372
463
  const output = [];
373
464
  const stream = createAgentStream({
@@ -397,6 +488,9 @@ export class ApplicationRunLoop {
397
488
  throw error;
398
489
  })
399
490
  .finally(() => {
491
+ state.runBudget?.pause();
492
+ if (segmentGeneration !== this.#segmentGeneration)
493
+ return;
400
494
  if (this.#activeAbortController === controller)
401
495
  this.#activeAbortController = null;
402
496
  this.#runInFlight = false;
@@ -406,10 +500,13 @@ export class ApplicationRunLoop {
406
500
  // that ends with nothing outstanding has truly finished the turn, and
407
501
  // then anything still waiting has to be sent as its own turn instead.
408
502
  const pendingApprovals = state.pendingApprovals?.length ?? 0;
503
+ const pendingBudgetInteraction = state.pendingRunBudgetInteraction !== undefined;
409
504
  const cancelled = stream.cancelled === true;
410
- this.#turnPaused = pendingApprovals > 0 && !cancelled && exitError === undefined;
505
+ this.#turnPaused = (pendingApprovals > 0 || pendingBudgetInteraction) && !cancelled && exitError === undefined;
411
506
  if (this.#turnPaused)
412
507
  return;
508
+ if (this.#activeRunBudgetState === state)
509
+ this.#activeRunBudgetState = undefined;
413
510
  // A declared turn outlives its segments — this one may be about to be
414
511
  // retried, or resumed past a post-execute gate. Its owner says when it
415
512
  // is over.
@@ -417,17 +514,33 @@ export class ApplicationRunLoop {
417
514
  return;
418
515
  this.#releasePendingSteers({
419
516
  pendingApprovals,
517
+ pendingBudgetInteraction,
420
518
  cancelled,
421
519
  error: exitError instanceof Error ? exitError.name : exitError ? String(exitError) : undefined,
422
520
  turnCount: state.turnCount,
423
521
  });
424
522
  });
523
+ this.#activeRunBudgetState = state.runBudget ? state : undefined;
425
524
  return stream;
426
525
  }
427
526
  async #execute(state, stream, queue, options, toolContext, requestAbortController) {
428
527
  while (true) {
429
528
  if (options.signal?.aborted)
430
529
  throw Object.assign(new Error('Operation aborted'), { name: 'AbortError' });
530
+ if (state.pendingRunBudgetInteraction) {
531
+ if (state.runBudgetInteractionDecision === 'stop') {
532
+ state.pendingRunBudgetInteraction = undefined;
533
+ state.runBudgetInteractionDecision = undefined;
534
+ return finish(stream, state, queue);
535
+ }
536
+ if (state.runBudgetInteractionDecision === 'continue') {
537
+ state.pendingRunBudgetInteraction = undefined;
538
+ state.runBudgetInteractionDecision = undefined;
539
+ }
540
+ else {
541
+ return this.#pauseForRunBudgetInteraction(state, stream, queue);
542
+ }
543
+ }
431
544
  state.pendingApprovals ??= state.pendingApproval ? [state.pendingApproval] : [];
432
545
  if (state.pendingApprovals.length > 0 && state.approvalDecision) {
433
546
  const selectedIndex = state.approvalDecisionCallId
@@ -445,27 +558,20 @@ export class ApplicationRunLoop {
445
558
  else {
446
559
  state.approvals.rejectTool({ toolName: pending.toolName, callId: pending.callId }, { message: state.approvalMessage });
447
560
  }
448
- const rawResult = approved
449
- ? await this.#invokeTool(pending.definition, pending.params, toolContext, pending.callId, state)
450
- : state.approvalMessage ?? 'rejected';
451
- const result = typeof rawResult === 'string' ? rawResult : JSON.stringify(rawResult);
452
- const resultItem = {
453
- type: 'function_call_result',
454
- callId: pending.callId,
455
- name: pending.toolName,
456
- output: result,
457
- };
458
- state.history.push(resultItem);
459
- state.input.push({ type: 'tool_result', id: pending.callId, output: result });
460
- outputPush(stream, queue, { type: 'item', item: resultItem });
561
+ pending.plan.status = 'ready';
562
+ if (!approved)
563
+ pending.plan.output = state.approvalMessage ?? 'rejected';
461
564
  state.pendingApprovals.splice(pendingIndex, 1);
462
565
  state.pendingApproval = state.pendingApprovals[0];
463
566
  state.approvalDecision = undefined;
464
567
  state.approvalDecisionCallId = undefined;
465
568
  state.approvalMessage = undefined;
569
+ await this.#settleToolPlan(state, stream, queue, toolContext);
466
570
  stream.interruptions = state.pendingApprovals.map((item) => item.interruption);
467
- if (state.pendingApprovals.length > 0)
571
+ if (state.pendingApprovals.length > 0) {
572
+ this.#turnPaused = true;
468
573
  return finish(stream, state, queue);
574
+ }
469
575
  // Nothing is outstanding, so this segment is terminal — see
470
576
  // `stopAfterApprovalResolution`. Stopping here rather than at the
471
577
  // request boundary below is what keeps the just-recorded tool result
@@ -473,32 +579,115 @@ export class ApplicationRunLoop {
473
579
  if (options.stopAfterApprovalResolution)
474
580
  return finish(stream, state, queue);
475
581
  }
582
+ // A budget interaction can park a response after its tool calls are
583
+ // recorded but before any body runs. Resume those retained calls only
584
+ // after processing an ordinary approval decision for that same plan.
585
+ if (state.toolPlan) {
586
+ await this.#settleToolPlan(state, stream, queue, toolContext);
587
+ if (state.pendingApprovals?.length) {
588
+ stream.interruptions = state.pendingApprovals.map((item) => item.interruption);
589
+ this.#turnPaused = true;
590
+ return finish(stream, state, queue);
591
+ }
592
+ }
476
593
  // The request boundary: every tool result of the previous round is in
477
594
  // history, and the next request has not been built. A user message
478
595
  // admitted here reaches the model in sequence, mid-turn.
479
- this.#admitPendingSteers(state, stream, queue);
480
- state.turnCount += 1;
481
- if (state.maxTurns !== undefined && state.turnCount > state.maxTurns) {
482
- throw new MaxTurnsExceededError(state.maxTurns);
596
+ if (!state.requestBoundaryReady) {
597
+ this.#admitPendingSteers(state, stream, queue);
598
+ this.#evaluateRunBudget(state, stream, queue);
599
+ if (state.pendingRunBudgetInteraction)
600
+ return this.#pauseForRunBudgetInteraction(state, stream, queue);
601
+ if (options.boundaryCompaction) {
602
+ const compactionStartedAt = Date.now();
603
+ const compaction = await options.boundaryCompaction.compact({
604
+ history: state.history,
605
+ automaticCompactionsThisRun: state.automaticCompactionsThisRun ?? 0,
606
+ signal: options.signal,
607
+ onStarted: (provider) => outputPush(stream, queue, { type: 'context_compaction_started', provider, strategy: 'local' }),
608
+ });
609
+ if (compaction.kind === 'compacted') {
610
+ state.history.splice(0, state.history.length, ...compaction.history);
611
+ state.input.splice(0, state.input.length, ...normalizeApplicationInput(compaction.modelInput));
612
+ state.responseId = undefined;
613
+ state.responseProviderId = undefined;
614
+ if (compaction.costRecords?.length) {
615
+ state.costRecords ??= [];
616
+ state.costRecords.push(...compaction.costRecords);
617
+ }
618
+ state.automaticCompactionsThisRun = (state.automaticCompactionsThisRun ?? 0) + 1;
619
+ outputPush(stream, queue, {
620
+ type: 'context_compaction_completed',
621
+ provider: state.currentProviderId ?? 'unknown',
622
+ strategy: 'local',
623
+ durationMs: Math.max(0, Date.now() - compactionStartedAt),
624
+ });
625
+ }
626
+ else if (compaction.kind === 'failed') {
627
+ outputPush(stream, queue, {
628
+ type: 'context_compaction_failed',
629
+ provider: compaction.provider,
630
+ strategy: 'local',
631
+ durationMs: Math.max(0, Date.now() - compactionStartedAt),
632
+ });
633
+ }
634
+ // Summarization is an asynchronous part of this same request
635
+ // boundary. Admit anything that arrived while it was in flight after
636
+ // applying a replacement, so the steer cannot be overwritten by the
637
+ // checkpoint or miss a terminal model request.
638
+ this.#admitPendingSteers(state, stream, queue);
639
+ this.#evaluateRunBudget(state, stream, queue);
640
+ if (state.pendingRunBudgetInteraction)
641
+ return this.#pauseForRunBudgetInteraction(state, stream, queue);
642
+ }
643
+ state.turnCount += 1;
644
+ this.#evaluateRunBudget(state, stream, queue);
645
+ if (state.pendingRunBudgetInteraction) {
646
+ state.requestBoundaryReady = true;
647
+ return this.#pauseForRunBudgetInteraction(state, stream, queue);
648
+ }
649
+ // Retain the legacy error only for callers that have not adopted staged
650
+ // budgets. A configured run budget turns the same count into critical
651
+ // evidence and lets the decision surface choose what happens next.
652
+ if (!state.runBudget && state.maxTurns !== undefined && state.turnCount > state.maxTurns) {
653
+ throw new MaxTurnsExceededError(state.maxTurns);
654
+ }
655
+ }
656
+ else {
657
+ state.requestBoundaryReady = undefined;
483
658
  }
484
659
  const model = await this.#deps.resolveModel(state.agent.model);
485
660
  let sawToolCall = false;
661
+ const streamedToolCalls = [];
486
662
  let completion;
487
663
  let pendingNativeReasoning;
488
664
  // Stable process-unique request id, allocated immediately before dispatch
489
665
  // so a cost record can be settled exactly once (success or failure).
490
666
  const requestId = this.#nextRequestId();
667
+ const criticalWrapUp = state.criticalWrapUpPending === true && state.criticalWrapUpDispatched !== true;
668
+ if (criticalWrapUp)
669
+ state.criticalWrapUpDispatched = true;
670
+ const disableChaining = state.disableChainingForAttempt === true;
671
+ if (disableChaining) {
672
+ state.disableChainingForAttempt = false;
673
+ state.responseId = undefined;
674
+ state.responseProviderId = undefined;
675
+ }
491
676
  const request = {
492
- instructions: state.agent.instructions,
677
+ instructions: criticalWrapUp
678
+ ? `${state.agent.instructions}\n\nBudget containment is terminal. Do not call tools. In this one final response, summarize what you completed, the evidence you have, and what remains.`
679
+ : state.agent.instructions,
493
680
  ...(state.supportsConversationChaining &&
681
+ !disableChaining &&
494
682
  state.responseId &&
495
683
  state.responseProviderId !== undefined &&
496
684
  state.responseProviderId === state.currentProviderId
497
685
  ? { previousResponseId: state.responseId }
498
686
  : {}),
687
+ ...(disableChaining ? { disableChaining: true } : {}),
499
688
  input: state.input,
500
- tools: toModelTools(state.agent.tools),
501
- applicationTools: state.agent.tools,
689
+ tools: toModelTools(criticalWrapUp ? [] : state.agent.tools),
690
+ applicationTools: criticalWrapUp ? [] : state.agent.tools,
502
691
  ...(state.agent.modelSettings?.temperature !== undefined
503
692
  ? { temperature: state.agent.modelSettings.temperature }
504
693
  : {}),
@@ -527,7 +716,7 @@ export class ApplicationRunLoop {
527
716
  ...options.generationGuard,
528
717
  });
529
718
  const consume = async () => {
530
- const deadline = new GenerationDeadline(generationGuard.requestDeadlineMs, () => requestAbortController.abort());
719
+ const deadline = new GenerationDeadline(generationGuard.requestDeadlineMs, () => requestAbortController.abort(), () => generationGuard.progress);
531
720
  let iterator;
532
721
  let iteratorFinished = false;
533
722
  try {
@@ -572,7 +761,7 @@ export class ApplicationRunLoop {
572
761
  generationGuard.observeToolCall(event.arguments);
573
762
  pendingNativeReasoning = commitPendingNativeReasoning(state, stream, queue, pendingNativeReasoning);
574
763
  sawToolCall = true;
575
- await this.#handleToolCall(state, stream, queue, event, toolContext);
764
+ streamedToolCalls.push(event);
576
765
  }
577
766
  }
578
767
  }
@@ -610,10 +799,27 @@ export class ApplicationRunLoop {
610
799
  // persistence and replay, and a cost event must never become a
611
800
  // restored history item.
612
801
  queue.push({ type: 'cost_update', record });
802
+ this.#evaluateRunBudget(state, stream, queue);
613
803
  throw error;
614
804
  }
615
- if (!completion)
616
- throw new Error('Application model turn ended without completion');
805
+ if (!completion) {
806
+ // A few application-owned model fixtures (and legacy adapters) end a
807
+ // tool-call stream immediately after the call and use the next request
808
+ // as the continuation boundary. Preserve that contract while routing
809
+ // the calls through the same ordered dispatcher. An empty stream still
810
+ // fails closed as an incomplete model turn.
811
+ if (streamedToolCalls.length === 0)
812
+ throw new Error('Application model turn ended without completion');
813
+ if (criticalWrapUp)
814
+ return finish(stream, state, queue);
815
+ await this.#dispatchToolCalls(state, stream, queue, streamedToolCalls, toolContext);
816
+ if (state.pendingApprovals && state.pendingApprovals.length > 0) {
817
+ stream.interruptions = state.pendingApprovals.map((item) => item.interruption);
818
+ this.#turnPaused = true;
819
+ return finish(stream, state, queue);
820
+ }
821
+ continue;
822
+ }
617
823
  // Commit the authoritative terminal state before handling terminal-only
618
824
  // tool calls. Approval may pause immediately after this point, and the
619
825
  // continuation must still carry the response that produced the calls.
@@ -675,11 +881,18 @@ export class ApplicationRunLoop {
675
881
  providerUsd: completion.costUsd,
676
882
  });
677
883
  queue.push({ type: 'cost_update', record });
884
+ // Cost and usage arrive in the same completion metadata, so surface both
885
+ // live. The footer is a per-request indicator: emit this request's own
886
+ // usage, never the run accumulator in `state.usage`.
887
+ if (normalizedCompletionUsage)
888
+ queue.push({ type: 'usage_update', usage: normalizedCompletionUsage });
889
+ this.#evaluateRunBudget(state, stream, queue);
678
890
  stream.lastResponseId = completion.responseId;
679
891
  stream.rawResponses?.push(completion);
680
892
  // Some provider adapters report function calls only in the terminal
681
893
  // completion rather than as separate stream events. Their reasoning may
682
894
  // likewise be terminal-only, so associate it before replaying calls.
895
+ const toolCalls = [...streamedToolCalls];
683
896
  if (!sawToolCall) {
684
897
  for (const item of completion.output) {
685
898
  if (item.type === 'reasoning')
@@ -690,7 +903,7 @@ export class ApplicationRunLoop {
690
903
  continue;
691
904
  pendingNativeReasoning = commitPendingNativeReasoning(state, stream, queue, pendingNativeReasoning);
692
905
  sawToolCall = true;
693
- await this.#handleToolCall(state, stream, queue, item, toolContext);
906
+ toolCalls.push(item);
694
907
  }
695
908
  }
696
909
  // A native reasoning item belongs to the completed assistant turn even
@@ -730,108 +943,192 @@ export class ApplicationRunLoop {
730
943
  outputPush(stream, queue, { type: 'item', item });
731
944
  state.input.push({ type: 'message', role: 'assistant', content: [{ type: 'text', text: assistantText }] });
732
945
  }
946
+ // Tool calls are dispatched only after the reasoning, provider-opaque,
947
+ // and assistant-text items from the same completion are committed. A
948
+ // response that carries both prose and a tool call must serialize as
949
+ // text -> function_call -> function_call_result; dispatching first left
950
+ // the text stranded after its own tool result, where the assistant
951
+ // message merger glued it onto the *next* turn's tool call and every
952
+ // request ended with a bare assistant message. Models read that as a
953
+ // turn truncated mid-sentence and restart instead of progressing.
954
+ if (!state.criticalWrapUpPending && toolCalls.length > 0) {
955
+ await this.#dispatchToolCalls(state, stream, queue, toolCalls, toolContext);
956
+ }
957
+ // A critical subagent gets exactly this final tool-free model call.
958
+ if (criticalWrapUp)
959
+ return finish(stream, state, queue);
960
+ if (state.pendingRunBudgetInteraction && toolCalls.length > 0) {
961
+ return this.#pauseForRunBudgetInteraction(state, stream, queue);
962
+ }
733
963
  if (state.pendingApprovals.length > 0) {
734
964
  stream.interruptions = state.pendingApprovals.map((item) => item.interruption);
965
+ this.#turnPaused = true;
735
966
  return finish(stream, state, queue);
736
967
  }
737
- if (!sawToolCall)
968
+ if (!sawToolCall) {
969
+ // Evidence discovered when a response has already completed needs no
970
+ // human boundary: there is no later request or tool to block.
971
+ state.pendingRunBudgetInteraction = undefined;
738
972
  return finish(stream, state, queue);
973
+ }
739
974
  }
740
975
  }
741
- async #handleToolCall(state, stream, queue, event, toolContext) {
742
- const definition = state.agent.tools.find((tool) => tool.name === event.name);
743
- const args = parseArguments(event.arguments);
744
- const callItem = {
745
- type: 'function_call',
746
- callId: event.id,
747
- name: event.name,
748
- arguments: event.arguments,
749
- };
750
- state.history.push(callItem);
751
- state.input.push({ type: 'tool_call', id: event.id, name: event.name, arguments: event.arguments });
752
- outputPush(stream, queue, { type: 'item', item: callItem });
753
- if (!definition) {
754
- const output = `Unknown tool: ${event.name}`;
755
- const resultItem = {
756
- type: 'function_call_result',
976
+ async #dispatchToolCalls(state, stream, queue, events, toolContext) {
977
+ const plan = events.map((event) => {
978
+ const definition = state.agent.tools.find((tool) => tool.name === event.name);
979
+ const callItem = {
980
+ type: 'function_call',
757
981
  callId: event.id,
758
982
  name: event.name,
759
- output,
983
+ arguments: event.arguments,
760
984
  };
761
- state.history.push(resultItem);
762
- state.input.push({ type: 'tool_result', id: event.id, output });
763
- outputPush(stream, queue, { type: 'item', item: resultItem });
764
- return;
765
- }
766
- // Keep the raw-model invocation contract: normalization repairs the
767
- // accepted object shape but intentionally does not Zod-parse it, which
768
- // would apply schema defaults before execute. web_fetch relies on its
769
- // executor fallbacks on the strict JSON-schema path.
770
- const params = normalizeToolParameters(args, definition.parameters);
771
- // Consult this run's ledger before prompting: a decision already taken
772
- // (in the parent run and replayed in, or earlier in this run) must not
773
- // prompt again. This is what makes approval replay observable.
774
- const alreadyDecided = state.approvals.isToolApproved({ toolName: event.name, callId: event.id });
775
- if (alreadyDecided === false) {
776
- const message = state.approvals.getRejectionMessage(event.name, event.id) ?? 'Tool execution was not approved.';
777
- const resultItem = {
778
- type: 'function_call_result',
779
- callId: event.id,
780
- name: event.name,
781
- output: message,
985
+ state.history.push(callItem);
986
+ state.input.push({ type: 'tool_call', id: event.id, name: event.name, arguments: event.arguments });
987
+ outputPush(stream, queue, { type: 'item', item: callItem });
988
+ return {
989
+ event,
990
+ definition,
991
+ parallelSafe: false,
992
+ status: 'ready',
782
993
  };
783
- state.history.push(resultItem);
784
- state.input.push({ type: 'tool_result', id: event.id, output: message });
785
- outputPush(stream, queue, { type: 'item', item: resultItem });
786
- return;
787
- }
788
- if (alreadyDecided === true) {
789
- const result = await this.#invokeTool(definition, params, toolContext, event.id, state);
790
- const output = typeof result === 'string' ? result : JSON.stringify(result);
791
- const resultItem = {
792
- type: 'function_call_result',
793
- callId: event.id,
994
+ });
995
+ state.toolPlan = plan;
996
+ for (const entry of plan) {
997
+ const { event, definition } = entry;
998
+ if (!definition) {
999
+ entry.output = `Unknown tool: ${event.name}`;
1000
+ continue;
1001
+ }
1002
+ // Keep the raw-model invocation contract: normalization repairs the
1003
+ // accepted object shape but intentionally does not Zod-parse it, which
1004
+ // would apply schema defaults before execute. web_fetch relies on its
1005
+ // executor fallbacks on the strict JSON-schema path.
1006
+ entry.params = normalizeToolParameters(parseArguments(event.arguments), definition.parameters);
1007
+ const stallEvent = state.runBudget?.observeToolCall({
794
1008
  name: event.name,
795
- output,
796
- };
797
- state.history.push(resultItem);
798
- state.input.push({ type: 'tool_result', id: event.id, output });
799
- outputPush(stream, queue, { type: 'item', item: resultItem });
800
- return;
801
- }
802
- if (await definition.needsApproval(params, toolContext)) {
803
- const pending = {
804
- callId: event.id,
805
- toolName: event.name,
806
1009
  argumentsText: event.arguments,
807
- interruption: {
808
- type: 'tool_approval_item',
809
- rawItem: { type: 'function_call', callId: event.id, name: event.name, arguments: event.arguments },
1010
+ effect: definition.effect,
1011
+ });
1012
+ if (stallEvent) {
1013
+ this.#emitRunBudgetEvent(state, stallEvent, 'Tool stall evidence', stream, queue);
1014
+ }
1015
+ // Consult this run's ledger before prompting: a decision already taken
1016
+ // (in the parent run and replayed in, or earlier in this run) must not
1017
+ // prompt again. This is what makes approval replay observable.
1018
+ const alreadyDecided = state.approvals.isToolApproved({ toolName: event.name, callId: event.id });
1019
+ if (alreadyDecided === false) {
1020
+ entry.output = state.approvals.getRejectionMessage(event.name, event.id) ?? 'Tool execution was not approved.';
1021
+ continue;
1022
+ }
1023
+ if (alreadyDecided !== true && (await definition.needsApproval(entry.params, toolContext))) {
1024
+ entry.status = 'approval_pending';
1025
+ const pending = {
810
1026
  callId: event.id,
811
- name: event.name,
812
- arguments: event.arguments,
813
- },
814
- definition,
815
- params,
816
- };
817
- state.pendingApprovals ??= [];
818
- if (!state.pendingApproval)
819
- state.pendingApproval = pending;
820
- state.pendingApprovals.push(pending);
821
- stream.interruptions = state.pendingApprovals.map((item) => item.interruption);
1027
+ toolName: event.name,
1028
+ argumentsText: event.arguments,
1029
+ interruption: {
1030
+ type: 'tool_approval_item',
1031
+ rawItem: { type: 'function_call', callId: event.id, name: event.name, arguments: event.arguments },
1032
+ callId: event.id,
1033
+ name: event.name,
1034
+ arguments: event.arguments,
1035
+ },
1036
+ definition,
1037
+ params: entry.params,
1038
+ plan: entry,
1039
+ };
1040
+ state.pendingApprovals ??= [];
1041
+ state.pendingApprovals.push(pending);
1042
+ continue;
1043
+ }
1044
+ entry.parallelSafe = await isParallelSafe(definition, entry.params, toolContext);
1045
+ }
1046
+ state.pendingApproval = state.pendingApprovals?.[0];
1047
+ stream.interruptions = (state.pendingApprovals ?? []).map((item) => item.interruption);
1048
+ this.#deps.logDiagnostic?.('tool parallel eligibility', {
1049
+ decisions: plan.map((entry) => ({
1050
+ callId: entry.event.id,
1051
+ toolName: entry.event.name,
1052
+ parallelSafe: entry.parallelSafe,
1053
+ approvalPending: entry.status === 'approval_pending',
1054
+ })),
1055
+ });
1056
+ // A main-agent budget escalation is a real boundary: retain the planned
1057
+ // calls, but do not execute one more tool while human judgement is pending.
1058
+ if (!state.pendingRunBudgetInteraction) {
1059
+ await this.#settleToolPlan(state, stream, queue, toolContext);
1060
+ }
1061
+ }
1062
+ async #settleToolPlan(state, stream, queue, toolContext) {
1063
+ const plan = state.toolPlan;
1064
+ if (!plan)
822
1065
  return;
1066
+ const maxParallelToolCalls = Math.max(1, Math.floor(this.#deps.resolveMaxParallelToolCalls?.() ?? DEFAULT_MAX_PARALLEL_TOOL_CALLS));
1067
+ while (true) {
1068
+ const firstPending = plan.find((entry) => entry.status !== 'completed');
1069
+ if (!firstPending) {
1070
+ state.toolPlan = undefined;
1071
+ return;
1072
+ }
1073
+ if (firstPending.status === 'approval_pending')
1074
+ return;
1075
+ const group = [];
1076
+ for (const entry of plan) {
1077
+ if (entry.status === 'completed')
1078
+ continue;
1079
+ if (entry.status === 'approval_pending')
1080
+ break;
1081
+ if (group.length > 0 && (!entry.parallelSafe || !group[0].parallelSafe || group.length >= maxParallelToolCalls))
1082
+ break;
1083
+ group.push(entry);
1084
+ if (!entry.parallelSafe)
1085
+ break;
1086
+ }
1087
+ const batchId = `tool-batch-${++nextToolBatchSeq}`;
1088
+ this.#deps.logDiagnostic?.('tool batch dispatched', {
1089
+ batchId,
1090
+ callIds: group.map((entry) => entry.event.id),
1091
+ parallel: group.length > 1,
1092
+ maxParallelToolCalls,
1093
+ dispatchOrder: group.map((entry) => entry.event.id),
1094
+ });
1095
+ if (group.length > 1) {
1096
+ const results = await Promise.allSettled(group.map((entry) => this.#invokePlannedTool(entry, toolContext, state)));
1097
+ const rejected = results.find((result) => result.status === 'rejected');
1098
+ if (rejected)
1099
+ throw rejected.reason;
1100
+ for (const [index, result] of results.entries()) {
1101
+ this.#appendToolResult(state, stream, queue, group[index], result.value);
1102
+ }
1103
+ }
1104
+ else {
1105
+ const result = await this.#invokePlannedTool(group[0], toolContext, state);
1106
+ this.#appendToolResult(state, stream, queue, group[0], result);
1107
+ }
1108
+ this.#deps.logDiagnostic?.('tool batch settled', {
1109
+ batchId,
1110
+ settlementOrder: group.map((entry) => entry.event.id),
1111
+ });
823
1112
  }
824
- const result = await this.#invokeTool(definition, params, toolContext, event.id, state);
1113
+ }
1114
+ async #invokePlannedTool(entry, toolContext, state) {
1115
+ entry.status = 'completed';
1116
+ if (entry.output !== undefined)
1117
+ return entry.output;
1118
+ return this.#invokeTool(entry.definition, entry.params, toolContext, entry.event.id, state);
1119
+ }
1120
+ #appendToolResult(state, stream, queue, entry, result) {
825
1121
  const output = typeof result === 'string' ? result : JSON.stringify(result);
826
1122
  const resultItem = {
827
1123
  type: 'function_call_result',
828
- callId: event.id,
829
- name: event.name,
1124
+ callId: entry.event.id,
1125
+ name: entry.event.name,
830
1126
  output,
831
1127
  };
832
1128
  state.history.push(resultItem);
833
- state.input.push({ type: 'tool_result', id: event.id, output });
1129
+ state.input.push({ type: 'tool_result', id: entry.event.id, output });
834
1130
  outputPush(stream, queue, { type: 'item', item: resultItem });
1131
+ this.#evaluateRunBudget(state, stream, queue);
835
1132
  }
836
1133
  /**
837
1134
  * A tool that throws must not take the run down with it.
@@ -864,6 +1161,9 @@ export class ApplicationRunLoop {
864
1161
  attempt,
865
1162
  scope: state?.hookScope ?? 'root',
866
1163
  };
1164
+ // Dispatch mark must run before execute so a mid-tool stream failure can
1165
+ // settle the ledger as unknown rather than aborted.
1166
+ this.#deps.getOnToolDispatch?.()?.(callId);
867
1167
  await this.#notifyToolLifecycle(() => this.#deps.toolLifecycle?.before(lifecycleContext));
868
1168
  try {
869
1169
  const result = await definition.execute(params, toolContext, { toolCall: { callId } });
@@ -876,15 +1176,6 @@ export class ApplicationRunLoop {
876
1176
  throw error;
877
1177
  }
878
1178
  const message = error instanceof Error ? error.message : String(error);
879
- // Feeding the same failure back forever is its own failure mode: some
880
- // errors no argument can fix. Repeat the identical result once, then say
881
- // so plainly rather than inviting a third identical attempt.
882
- const repeated = state ? countRepeatedFailure(state, definition.name, params, message) : 1;
883
- if (repeated > MAX_IDENTICAL_TOOL_FAILURES) {
884
- const result = `Error: ${message}\n\nThis exact call has now failed ${repeated} times with the same error. Do not call ${definition.name} with these arguments again — either change your approach or report the problem to the user.`;
885
- await this.#notifyToolLifecycle(() => this.#deps.toolLifecycle?.error(lifecycleContext, error, Date.now() - startedAt, true));
886
- return result;
887
- }
888
1179
  const result = `Error: ${message}`;
889
1180
  await this.#notifyToolLifecycle(() => this.#deps.toolLifecycle?.error(lifecycleContext, error, Date.now() - startedAt, true));
890
1181
  return result;
@@ -909,6 +1200,49 @@ export class ApplicationRunLoop {
909
1200
  state.costRecords = [...(state.costRecords ?? []), record];
910
1201
  return record;
911
1202
  }
1203
+ #evaluateRunBudget(state, stream, queue) {
1204
+ if (!state.runBudget)
1205
+ return;
1206
+ for (const event of state.runBudget.evaluate({
1207
+ turns: state.turnCount,
1208
+ costRecords: state.costRecords ?? [],
1209
+ })) {
1210
+ this.#emitRunBudgetEvent(state, event, 'Run budget evidence', stream, queue);
1211
+ }
1212
+ }
1213
+ #emitRunBudgetEvent(state, event, message, stream, queue) {
1214
+ if (event.type === 'budget_stage' && event.stage === 'critical' && state.wrapUpOnCriticalRunBudget) {
1215
+ state.criticalWrapUpPending = true;
1216
+ }
1217
+ if (!state.wrapUpOnCriticalRunBudget &&
1218
+ !state.pendingRunBudgetInteraction &&
1219
+ state.runBudgetEscalation !== 'warn' &&
1220
+ this.#requiresHumanBudgetDecision(event)) {
1221
+ state.pendingRunBudgetInteraction = { type: 'run_budget_interaction', event };
1222
+ state.runBudgetGrantConsumed = false;
1223
+ }
1224
+ if (stream && queue)
1225
+ outputPush(stream, queue, { type: 'run_budget', evidence: event });
1226
+ try {
1227
+ state.onRunBudgetEvent?.(event);
1228
+ }
1229
+ catch {
1230
+ // Evidence observers are delivery adapters, not budget owners.
1231
+ this.#deps.logDiagnostic?.('Run budget event observer failed', { type: event.type });
1232
+ }
1233
+ this.#deps.logDiagnostic?.(message, event);
1234
+ }
1235
+ #requiresHumanBudgetDecision(event) {
1236
+ return event.type === 'tool_stall' || (event.type === 'budget_stage' && event.stage !== 'soft');
1237
+ }
1238
+ #pauseForRunBudgetInteraction(state, stream, queue) {
1239
+ const interaction = state.pendingRunBudgetInteraction;
1240
+ if (!interaction)
1241
+ return finish(stream, state, queue);
1242
+ stream.interruptions = [interaction];
1243
+ this.#turnPaused = true;
1244
+ return finish(stream, state, queue);
1245
+ }
912
1246
  async #notifyToolLifecycle(operation) {
913
1247
  if (!operation)
914
1248
  return;
@@ -921,27 +1255,6 @@ export class ApplicationRunLoop {
921
1255
  }
922
1256
  }
923
1257
  }
924
- /**
925
- * How many times an identical failing call is fed back before the loop stops
926
- * inviting retries. One repeat is worth allowing: a transient failure resolves,
927
- * and a model given the error often corrects on its second attempt.
928
- */
929
- const MAX_IDENTICAL_TOOL_FAILURES = 2;
930
- function countRepeatedFailure(state, toolName, params, message) {
931
- let key;
932
- try {
933
- key = JSON.stringify([toolName, params, message]);
934
- }
935
- catch {
936
- // Unserializable params cannot be compared for identity; treat every such
937
- // failure as distinct rather than collapsing unrelated calls together.
938
- return 1;
939
- }
940
- state.toolFailureCounts ??= new Map();
941
- const count = (state.toolFailureCounts.get(key) ?? 0) + 1;
942
- state.toolFailureCounts.set(key, count);
943
- return count;
944
- }
945
1258
  function outputPush(stream, queue, item) {
946
1259
  stream.output.push(item);
947
1260
  if (stream.newItems !== stream.output)
@@ -967,6 +1280,15 @@ function finish(stream, state, queue) {
967
1280
  * Chat-Completions continuation field. Generic reasoning remains display-only
968
1281
  * so providers with different native formats are not given a foreign field.
969
1282
  */
1283
+ /**
1284
+ * True when any lane namespace in the metadata carries an `encrypted_content`
1285
+ * blob — the shape every Responses adapter produces, whichever vendor it is.
1286
+ */
1287
+ function hasNamespacedEncryptedReasoning(metadata) {
1288
+ if (!metadata)
1289
+ return false;
1290
+ return Object.values(metadata).some((value) => asRecord(value)?.encrypted_content !== undefined);
1291
+ }
970
1292
  function appendNativeReasoning(current, event) {
971
1293
  const nativeReasoning = event.providerMetadata?.reasoning_content;
972
1294
  if (typeof nativeReasoning === 'string') {
@@ -983,8 +1305,10 @@ function appendNativeReasoning(current, event) {
983
1305
  }
984
1306
  // Responses providers return encrypted reasoning only on their terminal
985
1307
  // output. Their metadata is namespaced, so retain it without turning it into
986
- // the Chat-Completions-only reasoning_content convention.
987
- if (asRecord(event.providerMetadata?.codex) || asRecord(event.providerMetadata?.openai)) {
1308
+ // the Chat-Completions-only reasoning_content convention. Match on the
1309
+ // namespaced shape rather than an allowlist of lane names: an allowlist
1310
+ // silently drops the reasoning of every Responses lane added later.
1311
+ if (hasNamespacedEncryptedReasoning(event.providerMetadata)) {
988
1312
  return {
989
1313
  ...(event.id ? { id: event.id } : current?.id ? { id: current.id } : {}),
990
1314
  text: event.text,
@@ -1043,6 +1367,17 @@ function parseArguments(value) {
1043
1367
  return {};
1044
1368
  }
1045
1369
  }
1370
+ async function isParallelSafe(definition, params, context) {
1371
+ if (typeof definition.parallelSafe === 'function') {
1372
+ try {
1373
+ return await definition.parallelSafe(params, context);
1374
+ }
1375
+ catch {
1376
+ return false;
1377
+ }
1378
+ }
1379
+ return definition.parallelSafe === true;
1380
+ }
1046
1381
  function getInterruptionCallId(value) {
1047
1382
  if (typeof value !== 'object' || value === null)
1048
1383
  return undefined;