@qduc/term2 0.11.0 → 0.12.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 (1278) hide show
  1. package/README.md +6 -4
  2. package/dist/agent.d.ts +21 -13
  3. package/dist/agent.d.ts.map +1 -1
  4. package/dist/agent.js +123 -35
  5. package/dist/agent.js.map +1 -1
  6. package/dist/app.d.ts +3 -1
  7. package/dist/app.d.ts.map +1 -1
  8. package/dist/app.js +283 -128
  9. package/dist/app.js.map +1 -1
  10. package/dist/cli.js +91 -27
  11. package/dist/cli.js.map +1 -1
  12. package/dist/commands/auto-approve-command.js.map +1 -1
  13. package/dist/commands/mode-commands.js.map +1 -1
  14. package/dist/commands/retry-tool-command.d.ts +13 -0
  15. package/dist/commands/retry-tool-command.d.ts.map +1 -0
  16. package/dist/commands/retry-tool-command.js +20 -0
  17. package/dist/commands/retry-tool-command.js.map +1 -0
  18. package/dist/commands/rewind-command.d.ts +37 -0
  19. package/dist/commands/rewind-command.d.ts.map +1 -0
  20. package/dist/commands/rewind-command.js +97 -0
  21. package/dist/commands/rewind-command.js.map +1 -0
  22. package/dist/commands/sandbox-command.js.map +1 -1
  23. package/dist/components/InputBox.d.ts +18 -32
  24. package/dist/components/InputBox.d.ts.map +1 -1
  25. package/dist/components/InputBox.js +178 -579
  26. package/dist/components/InputBox.js.map +1 -1
  27. package/dist/components/input/ApplicationInputSurface.d.ts +37 -0
  28. package/dist/components/input/ApplicationInputSurface.d.ts.map +1 -0
  29. package/dist/components/input/ApplicationInputSurface.js +78 -0
  30. package/dist/components/input/ApplicationInputSurface.js.map +1 -0
  31. package/dist/components/input/MenuStackHost.d.ts +12 -0
  32. package/dist/components/input/MenuStackHost.d.ts.map +1 -0
  33. package/dist/components/input/MenuStackHost.js +13 -0
  34. package/dist/components/input/MenuStackHost.js.map +1 -0
  35. package/dist/components/input/MenuSurface.d.ts +13 -0
  36. package/dist/components/input/MenuSurface.d.ts.map +1 -0
  37. package/dist/components/input/MenuSurface.js +86 -0
  38. package/dist/components/input/MenuSurface.js.map +1 -0
  39. package/dist/components/input/ModelMenuSession.d.ts +19 -0
  40. package/dist/components/input/ModelMenuSession.d.ts.map +1 -0
  41. package/dist/components/input/ModelMenuSession.js +144 -0
  42. package/dist/components/input/ModelMenuSession.js.map +1 -0
  43. package/dist/components/input/PathMenuSession.d.ts +16 -0
  44. package/dist/components/input/PathMenuSession.d.ts.map +1 -0
  45. package/dist/components/input/PathMenuSession.js +68 -0
  46. package/dist/components/input/PathMenuSession.js.map +1 -0
  47. package/dist/components/input/PendingQueueList.d.ts +20 -0
  48. package/dist/components/input/PendingQueueList.d.ts.map +1 -0
  49. package/dist/components/input/PendingQueueList.js +26 -0
  50. package/dist/components/input/PendingQueueList.js.map +1 -0
  51. package/dist/components/input/ProviderMenuSession.d.ts +16 -0
  52. package/dist/components/input/ProviderMenuSession.d.ts.map +1 -0
  53. package/dist/components/input/ProviderMenuSession.js +93 -0
  54. package/dist/components/input/ProviderMenuSession.js.map +1 -0
  55. package/dist/components/input/RewindMenuSession.d.ts +14 -0
  56. package/dist/components/input/RewindMenuSession.d.ts.map +1 -0
  57. package/dist/components/input/RewindMenuSession.js +77 -0
  58. package/dist/components/input/RewindMenuSession.js.map +1 -0
  59. package/dist/components/input/SettingsMenuSession.d.ts +17 -0
  60. package/dist/components/input/SettingsMenuSession.d.ts.map +1 -0
  61. package/dist/components/input/SettingsMenuSession.js +136 -0
  62. package/dist/components/input/SettingsMenuSession.js.map +1 -0
  63. package/dist/components/input/SettingsValueMenuSession.d.ts +19 -0
  64. package/dist/components/input/SettingsValueMenuSession.d.ts.map +1 -0
  65. package/dist/components/input/SettingsValueMenuSession.js +113 -0
  66. package/dist/components/input/SettingsValueMenuSession.js.map +1 -0
  67. package/dist/components/input/SkillsMenuSession.d.ts +16 -0
  68. package/dist/components/input/SkillsMenuSession.d.ts.map +1 -0
  69. package/dist/components/input/SkillsMenuSession.js +64 -0
  70. package/dist/components/input/SkillsMenuSession.js.map +1 -0
  71. package/dist/components/input/SlashMenuSession.d.ts +17 -0
  72. package/dist/components/input/SlashMenuSession.d.ts.map +1 -0
  73. package/dist/components/input/SlashMenuSession.js +57 -0
  74. package/dist/components/input/SlashMenuSession.js.map +1 -0
  75. package/dist/components/input/determine-active-menu.d.ts +2 -0
  76. package/dist/components/input/determine-active-menu.d.ts.map +1 -1
  77. package/dist/components/input/determine-active-menu.js +12 -4
  78. package/dist/components/input/determine-active-menu.js.map +1 -1
  79. package/dist/components/input/insertions.d.ts +0 -13
  80. package/dist/components/input/insertions.d.ts.map +1 -1
  81. package/dist/components/input/insertions.js +0 -26
  82. package/dist/components/input/insertions.js.map +1 -1
  83. package/dist/components/input/menu-controller.d.ts +52 -0
  84. package/dist/components/input/menu-controller.d.ts.map +1 -0
  85. package/dist/components/input/menu-controller.js +690 -0
  86. package/dist/components/input/menu-controller.js.map +1 -0
  87. package/dist/components/input/menu-editor.d.ts +9 -0
  88. package/dist/components/input/menu-editor.d.ts.map +1 -0
  89. package/dist/components/input/menu-editor.js +45 -0
  90. package/dist/components/input/menu-editor.js.map +1 -0
  91. package/dist/components/input/menu-registry.d.ts +20 -0
  92. package/dist/components/input/menu-registry.d.ts.map +1 -0
  93. package/dist/components/input/menu-registry.js +25 -0
  94. package/dist/components/input/menu-registry.js.map +1 -0
  95. package/dist/components/input/menu-types.d.ts +320 -0
  96. package/dist/components/input/menu-types.d.ts.map +1 -0
  97. package/dist/components/input/menu-types.js +2 -0
  98. package/dist/components/input/menu-types.js.map +1 -0
  99. package/dist/components/input/settings-intent-host.d.ts +22 -0
  100. package/dist/components/input/settings-intent-host.d.ts.map +1 -0
  101. package/dist/components/input/settings-intent-host.js +69 -0
  102. package/dist/components/input/settings-intent-host.js.map +1 -0
  103. package/dist/components/input/triggers.d.ts +3 -0
  104. package/dist/components/input/triggers.d.ts.map +1 -1
  105. package/dist/components/input/triggers.js +258 -0
  106. package/dist/components/input/triggers.js.map +1 -1
  107. package/dist/components/layout/BackgroundTaskManager.d.ts +16 -0
  108. package/dist/components/layout/BackgroundTaskManager.d.ts.map +1 -0
  109. package/dist/components/layout/BackgroundTaskManager.js +236 -0
  110. package/dist/components/layout/BackgroundTaskManager.js.map +1 -0
  111. package/dist/components/layout/BackgroundTasksPanel.d.ts +2 -2
  112. package/dist/components/layout/BackgroundTasksPanel.d.ts.map +1 -1
  113. package/dist/components/layout/BackgroundTasksPanel.js +64 -24
  114. package/dist/components/layout/BackgroundTasksPanel.js.map +1 -1
  115. package/dist/components/layout/Banner.js.map +1 -1
  116. package/dist/components/layout/BottomArea.d.ts +23 -19
  117. package/dist/components/layout/BottomArea.d.ts.map +1 -1
  118. package/dist/components/layout/BottomArea.js +74 -48
  119. package/dist/components/layout/BottomArea.js.map +1 -1
  120. package/dist/components/layout/StatusBar.d.ts +3 -1
  121. package/dist/components/layout/StatusBar.d.ts.map +1 -1
  122. package/dist/components/layout/StatusBar.js +102 -83
  123. package/dist/components/layout/StatusBar.js.map +1 -1
  124. package/dist/components/menu/ModelSelectionMenu.js.map +1 -1
  125. package/dist/components/menu/RewindMenu.d.ts +18 -0
  126. package/dist/components/menu/RewindMenu.d.ts.map +1 -0
  127. package/dist/components/menu/RewindMenu.js +59 -0
  128. package/dist/components/menu/RewindMenu.js.map +1 -0
  129. package/dist/components/message/ChatMessage.d.ts +2 -1
  130. package/dist/components/message/ChatMessage.d.ts.map +1 -1
  131. package/dist/components/message/ChatMessage.js +1 -1
  132. package/dist/components/message/ChatMessage.js.map +1 -1
  133. package/dist/components/message/CommandMessage.d.ts.map +1 -1
  134. package/dist/components/message/CommandMessage.js +138 -15
  135. package/dist/components/message/CommandMessage.js.map +1 -1
  136. package/dist/components/message/MemoryRenderer.d.ts.map +1 -1
  137. package/dist/components/message/MemoryRenderer.js +16 -10
  138. package/dist/components/message/MemoryRenderer.js.map +1 -1
  139. package/dist/components/message/MessageList.d.ts +20 -3
  140. package/dist/components/message/MessageList.d.ts.map +1 -1
  141. package/dist/components/message/MessageList.js +1 -1
  142. package/dist/components/message/MessageList.js.map +1 -1
  143. package/dist/components/message/SubagentActivityMessage.d.ts +5 -1
  144. package/dist/components/message/SubagentActivityMessage.d.ts.map +1 -1
  145. package/dist/components/message/SubagentActivityMessage.js +12 -4
  146. package/dist/components/message/SubagentActivityMessage.js.map +1 -1
  147. package/dist/components/message/command-message-helpers.d.ts +40 -3
  148. package/dist/components/message/command-message-helpers.d.ts.map +1 -1
  149. package/dist/components/message/command-message-helpers.js +49 -8
  150. package/dist/components/message/command-message-helpers.js.map +1 -1
  151. package/dist/components/prompt/ApprovalPrompt.d.ts +1 -0
  152. package/dist/components/prompt/ApprovalPrompt.d.ts.map +1 -1
  153. package/dist/components/prompt/ApprovalPrompt.js +136 -59
  154. package/dist/components/prompt/ApprovalPrompt.js.map +1 -1
  155. package/dist/context/InputContext.d.ts +15 -8
  156. package/dist/context/InputContext.d.ts.map +1 -1
  157. package/dist/context/InputContext.js +92 -15
  158. package/dist/context/InputContext.js.map +1 -1
  159. package/dist/contracts/application-stream.d.ts +38 -0
  160. package/dist/contracts/application-stream.d.ts.map +1 -0
  161. package/dist/contracts/application-stream.js +2 -0
  162. package/dist/contracts/application-stream.js.map +1 -0
  163. package/dist/contracts/continuation-handle.d.ts +18 -0
  164. package/dist/contracts/continuation-handle.d.ts.map +1 -0
  165. package/dist/contracts/continuation-handle.js +22 -0
  166. package/dist/contracts/continuation-handle.js.map +1 -0
  167. package/dist/contracts/conversation-items.d.ts +47 -0
  168. package/dist/contracts/conversation-items.d.ts.map +1 -0
  169. package/dist/contracts/conversation-items.js +2 -0
  170. package/dist/contracts/conversation-items.js.map +1 -0
  171. package/dist/contracts/conversation.d.ts +44 -4
  172. package/dist/contracts/conversation.d.ts.map +1 -1
  173. package/dist/contracts/conversation.js +9 -0
  174. package/dist/contracts/conversation.js.map +1 -1
  175. package/dist/contracts/model-errors.d.ts +10 -0
  176. package/dist/contracts/model-errors.d.ts.map +1 -0
  177. package/dist/contracts/model-errors.js +15 -0
  178. package/dist/contracts/model-errors.js.map +1 -0
  179. package/dist/contracts/model-types.d.ts +16 -0
  180. package/dist/contracts/model-types.d.ts.map +1 -0
  181. package/dist/contracts/model-types.js +2 -0
  182. package/dist/contracts/model-types.js.map +1 -0
  183. package/dist/contracts/patch.d.ts +17 -0
  184. package/dist/contracts/patch.d.ts.map +1 -0
  185. package/dist/contracts/patch.js +2 -0
  186. package/dist/contracts/patch.js.map +1 -0
  187. package/dist/contracts/provider-input.d.ts +34 -0
  188. package/dist/contracts/provider-input.d.ts.map +1 -0
  189. package/dist/contracts/provider-input.js +2 -0
  190. package/dist/contracts/provider-input.js.map +1 -0
  191. package/dist/contracts/streamed-model-turn.d.ts +230 -0
  192. package/dist/contracts/streamed-model-turn.d.ts.map +1 -0
  193. package/dist/contracts/streamed-model-turn.js +2 -0
  194. package/dist/contracts/streamed-model-turn.js.map +1 -0
  195. package/dist/env-setup.js +1 -1
  196. package/dist/hooks/conversation-ui-reducer.d.ts +27 -4
  197. package/dist/hooks/conversation-ui-reducer.d.ts.map +1 -1
  198. package/dist/hooks/conversation-ui-reducer.js +51 -4
  199. package/dist/hooks/conversation-ui-reducer.js.map +1 -1
  200. package/dist/hooks/handoff-flow-reducer.d.ts +1 -36
  201. package/dist/hooks/handoff-flow-reducer.d.ts.map +1 -1
  202. package/dist/hooks/handoff-flow-reducer.js +3 -57
  203. package/dist/hooks/handoff-flow-reducer.js.map +1 -1
  204. package/dist/hooks/settings-completion-config.d.ts +1 -0
  205. package/dist/hooks/settings-completion-config.d.ts.map +1 -1
  206. package/dist/hooks/settings-completion-config.js +30 -6
  207. package/dist/hooks/settings-completion-config.js.map +1 -1
  208. package/dist/hooks/use-app-commands.d.ts +13 -11
  209. package/dist/hooks/use-app-commands.d.ts.map +1 -1
  210. package/dist/hooks/use-app-commands.js +90 -63
  211. package/dist/hooks/use-app-commands.js.map +1 -1
  212. package/dist/hooks/use-app-keyboard-shortcuts.d.ts +18 -1
  213. package/dist/hooks/use-app-keyboard-shortcuts.d.ts.map +1 -1
  214. package/dist/hooks/use-app-keyboard-shortcuts.js +77 -8
  215. package/dist/hooks/use-app-keyboard-shortcuts.js.map +1 -1
  216. package/dist/hooks/use-conversation.d.ts +30 -13
  217. package/dist/hooks/use-conversation.d.ts.map +1 -1
  218. package/dist/hooks/use-conversation.js +85 -18
  219. package/dist/hooks/use-conversation.js.map +1 -1
  220. package/dist/hooks/use-escape-key.d.ts +4 -32
  221. package/dist/hooks/use-escape-key.d.ts.map +1 -1
  222. package/dist/hooks/use-escape-key.js +27 -68
  223. package/dist/hooks/use-escape-key.js.map +1 -1
  224. package/dist/hooks/use-handoff-flow.d.ts +6 -6
  225. package/dist/hooks/use-handoff-flow.d.ts.map +1 -1
  226. package/dist/hooks/use-handoff-flow.js +110 -118
  227. package/dist/hooks/use-handoff-flow.js.map +1 -1
  228. package/dist/hooks/use-model-selection.d.ts.map +1 -1
  229. package/dist/hooks/use-model-selection.js +50 -59
  230. package/dist/hooks/use-model-selection.js.map +1 -1
  231. package/dist/hooks/use-path-completion.d.ts.map +1 -1
  232. package/dist/hooks/use-path-completion.js +20 -11
  233. package/dist/hooks/use-path-completion.js.map +1 -1
  234. package/dist/hooks/use-provider-selection.d.ts.map +1 -1
  235. package/dist/hooks/use-provider-selection.js +19 -16
  236. package/dist/hooks/use-provider-selection.js.map +1 -1
  237. package/dist/hooks/use-rewind-selection.d.ts +30 -0
  238. package/dist/hooks/use-rewind-selection.d.ts.map +1 -0
  239. package/dist/hooks/{use-undo-selection.js → use-rewind-selection.js} +37 -28
  240. package/dist/hooks/use-rewind-selection.js.map +1 -0
  241. package/dist/hooks/use-runtime-settings.d.ts.map +1 -1
  242. package/dist/hooks/use-runtime-settings.js +4 -3
  243. package/dist/hooks/use-runtime-settings.js.map +1 -1
  244. package/dist/hooks/use-selection.d.ts +1 -0
  245. package/dist/hooks/use-selection.d.ts.map +1 -1
  246. package/dist/hooks/use-selection.js +1 -1
  247. package/dist/hooks/use-selection.js.map +1 -1
  248. package/dist/hooks/use-setting.d.ts +3 -2
  249. package/dist/hooks/use-setting.d.ts.map +1 -1
  250. package/dist/hooks/use-setting.js +1 -1
  251. package/dist/hooks/use-setting.js.map +1 -1
  252. package/dist/hooks/use-settings-completion.d.ts +1 -0
  253. package/dist/hooks/use-settings-completion.d.ts.map +1 -1
  254. package/dist/hooks/use-settings-completion.js +22 -15
  255. package/dist/hooks/use-settings-completion.js.map +1 -1
  256. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  257. package/dist/hooks/use-settings-value-completion.js +40 -28
  258. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  259. package/dist/hooks/use-shell-mode.d.ts +3 -13
  260. package/dist/hooks/use-shell-mode.d.ts.map +1 -1
  261. package/dist/hooks/use-shell-mode.js +14 -53
  262. package/dist/hooks/use-shell-mode.js.map +1 -1
  263. package/dist/hooks/use-skill-selection.d.ts.map +1 -1
  264. package/dist/hooks/use-skill-selection.js +17 -11
  265. package/dist/hooks/use-skill-selection.js.map +1 -1
  266. package/dist/hooks/use-slash-commands.d.ts.map +1 -1
  267. package/dist/hooks/use-slash-commands.js +11 -10
  268. package/dist/hooks/use-slash-commands.js.map +1 -1
  269. package/dist/hooks/use-terminal-focus-notifier.js.map +1 -1
  270. package/dist/lib/agent-chat-service.d.ts +12 -8
  271. package/dist/lib/agent-chat-service.d.ts.map +1 -1
  272. package/dist/lib/agent-chat-service.js +79 -44
  273. package/dist/lib/agent-chat-service.js.map +1 -1
  274. package/dist/lib/agent-client.d.ts +93 -17
  275. package/dist/lib/agent-client.d.ts.map +1 -1
  276. package/dist/lib/agent-client.js +398 -37
  277. package/dist/lib/agent-client.js.map +1 -1
  278. package/dist/lib/agent-configuration.d.ts +33 -15
  279. package/dist/lib/agent-configuration.d.ts.map +1 -1
  280. package/dist/lib/agent-configuration.js +107 -9
  281. package/dist/lib/agent-configuration.js.map +1 -1
  282. package/dist/lib/agent-factory.d.ts +33 -4
  283. package/dist/lib/agent-factory.d.ts.map +1 -1
  284. package/dist/lib/agent-factory.js +140 -101
  285. package/dist/lib/agent-factory.js.map +1 -1
  286. package/dist/lib/chained-input-filter.d.ts +27 -1
  287. package/dist/lib/chained-input-filter.d.ts.map +1 -1
  288. package/dist/lib/chained-input-filter.js +92 -33
  289. package/dist/lib/chained-input-filter.js.map +1 -1
  290. package/dist/lib/continuation-projection-mode.d.ts +3 -0
  291. package/dist/lib/continuation-projection-mode.d.ts.map +1 -0
  292. package/dist/lib/continuation-projection-mode.js +2 -0
  293. package/dist/lib/continuation-projection-mode.js.map +1 -0
  294. package/dist/lib/editor-impl.d.ts +1 -1
  295. package/dist/lib/editor-impl.d.ts.map +1 -1
  296. package/dist/lib/editor-impl.js +1 -1
  297. package/dist/lib/editor-impl.js.map +1 -1
  298. package/dist/lib/harness-invariant-error.d.ts +22 -0
  299. package/dist/lib/harness-invariant-error.d.ts.map +1 -0
  300. package/dist/lib/harness-invariant-error.js +30 -0
  301. package/dist/lib/harness-invariant-error.js.map +1 -0
  302. package/dist/lib/input-owner.d.ts +64 -0
  303. package/dist/lib/input-owner.d.ts.map +1 -0
  304. package/dist/lib/input-owner.js +34 -0
  305. package/dist/lib/input-owner.js.map +1 -0
  306. package/dist/lib/openai-strict-tool-schema.d.ts +7 -4
  307. package/dist/lib/openai-strict-tool-schema.d.ts.map +1 -1
  308. package/dist/lib/openai-strict-tool-schema.js +8 -0
  309. package/dist/lib/openai-strict-tool-schema.js.map +1 -1
  310. package/dist/lib/subagent-bridge.d.ts +54 -3
  311. package/dist/lib/subagent-bridge.d.ts.map +1 -1
  312. package/dist/lib/subagent-bridge.js +118 -20
  313. package/dist/lib/subagent-bridge.js.map +1 -1
  314. package/dist/lib/tool-invoke.d.ts +18 -10
  315. package/dist/lib/tool-invoke.d.ts.map +1 -1
  316. package/dist/lib/tool-invoke.js +92 -44
  317. package/dist/lib/tool-invoke.js.map +1 -1
  318. package/dist/non-interactive.d.ts +14 -4
  319. package/dist/non-interactive.d.ts.map +1 -1
  320. package/dist/non-interactive.js +91 -84
  321. package/dist/non-interactive.js.map +1 -1
  322. package/dist/prompts/anthropic.md +6 -55
  323. package/dist/prompts/async-subagent-delegation.d.ts +3 -5
  324. package/dist/prompts/async-subagent-delegation.d.ts.map +1 -1
  325. package/dist/prompts/async-subagent-delegation.js +10 -34
  326. package/dist/prompts/async-subagent-delegation.js.map +1 -1
  327. package/dist/prompts/async-subagent-delegation.ts +11 -40
  328. package/dist/prompts/gpt-5.6.md +49 -0
  329. package/dist/prompts/kimi.md +25 -63
  330. package/dist/prompts/memory.md +1 -1
  331. package/dist/prompts/orchestrator-prompt.test.ts +92 -0
  332. package/dist/prompts/orchestrator.md +20 -4
  333. package/dist/prompts/plan-mode-info.md +1 -1
  334. package/dist/prompts/prompt-constructor.d.ts +2 -0
  335. package/dist/prompts/prompt-constructor.d.ts.map +1 -1
  336. package/dist/prompts/prompt-constructor.js +9 -7
  337. package/dist/prompts/prompt-constructor.js.map +1 -1
  338. package/dist/prompts/prompt-constructor.test.ts +30 -8
  339. package/dist/prompts/prompt-constructor.ts +14 -7
  340. package/dist/prompts/prompt-profiles.d.ts.map +1 -1
  341. package/dist/prompts/prompt-profiles.js +5 -0
  342. package/dist/prompts/prompt-profiles.js.map +1 -1
  343. package/dist/prompts/prompt-profiles.test.ts +20 -0
  344. package/dist/prompts/prompt-profiles.ts +5 -0
  345. package/dist/prompts/search-via-shell.d.ts.map +1 -1
  346. package/dist/prompts/search-via-shell.js +8 -25
  347. package/dist/prompts/search-via-shell.js.map +1 -1
  348. package/dist/prompts/search-via-shell.test.ts +18 -0
  349. package/dist/prompts/search-via-shell.ts +8 -25
  350. package/dist/prompts/shell-auto-approval.d.ts +2 -2
  351. package/dist/prompts/shell-auto-approval.d.ts.map +1 -1
  352. package/dist/prompts/shell-auto-approval.js +20 -5
  353. package/dist/prompts/shell-auto-approval.js.map +1 -1
  354. package/dist/prompts/shell-auto-approval.ts +20 -5
  355. package/dist/prompts/steering-notice.d.ts +16 -0
  356. package/dist/prompts/steering-notice.d.ts.map +1 -0
  357. package/dist/prompts/steering-notice.js +24 -0
  358. package/dist/prompts/steering-notice.js.map +1 -0
  359. package/dist/prompts/steering-notice.ts +24 -0
  360. package/dist/prompts/subagent-delegation.d.ts +6 -5
  361. package/dist/prompts/subagent-delegation.d.ts.map +1 -1
  362. package/dist/prompts/subagent-delegation.js +36 -13
  363. package/dist/prompts/subagent-delegation.js.map +1 -1
  364. package/dist/prompts/subagent-delegation.test.ts +24 -2
  365. package/dist/prompts/subagent-delegation.ts +54 -14
  366. package/dist/prompts/subagents/explorer.md +24 -14
  367. package/dist/prompts/subagents/worker-prompt.test.ts +35 -0
  368. package/dist/prompts/subagents/worker.md +8 -0
  369. package/dist/prompts/worktree-hygiene.md +1 -0
  370. package/dist/providers/ai-sdk-anthropic.provider.d.ts +3 -3
  371. package/dist/providers/ai-sdk-anthropic.provider.d.ts.map +1 -1
  372. package/dist/providers/ai-sdk-anthropic.provider.js +8 -4
  373. package/dist/providers/ai-sdk-anthropic.provider.js.map +1 -1
  374. package/dist/providers/ai-sdk-google.provider.d.ts +5 -4
  375. package/dist/providers/ai-sdk-google.provider.d.ts.map +1 -1
  376. package/dist/providers/ai-sdk-google.provider.js +23 -3
  377. package/dist/providers/ai-sdk-google.provider.js.map +1 -1
  378. package/dist/providers/ai-sdk-message-normalizer.d.ts +3 -7
  379. package/dist/providers/ai-sdk-message-normalizer.d.ts.map +1 -1
  380. package/dist/providers/ai-sdk-message-normalizer.js +27 -11
  381. package/dist/providers/ai-sdk-message-normalizer.js.map +1 -1
  382. package/dist/providers/ai-sdk-openrouter.provider.d.ts +5 -4
  383. package/dist/providers/ai-sdk-openrouter.provider.d.ts.map +1 -1
  384. package/dist/providers/ai-sdk-openrouter.provider.js +25 -3
  385. package/dist/providers/ai-sdk-openrouter.provider.js.map +1 -1
  386. package/dist/providers/ai-sdk-provider-settings.d.ts +10 -0
  387. package/dist/providers/ai-sdk-provider-settings.d.ts.map +1 -0
  388. package/dist/providers/ai-sdk-provider-settings.js +37 -0
  389. package/dist/providers/ai-sdk-provider-settings.js.map +1 -0
  390. package/dist/providers/ai-sdk-streamed-model.d.ts +5 -0
  391. package/dist/providers/ai-sdk-streamed-model.d.ts.map +1 -0
  392. package/dist/providers/ai-sdk-streamed-model.js +338 -0
  393. package/dist/providers/ai-sdk-streamed-model.js.map +1 -0
  394. package/dist/providers/codex-responses-model.d.ts +39 -12
  395. package/dist/providers/codex-responses-model.d.ts.map +1 -1
  396. package/dist/providers/codex-responses-model.js +656 -155
  397. package/dist/providers/codex-responses-model.js.map +1 -1
  398. package/dist/providers/codex-turn-converter.d.ts +12 -0
  399. package/dist/providers/codex-turn-converter.d.ts.map +1 -0
  400. package/dist/providers/codex-turn-converter.js +168 -0
  401. package/dist/providers/codex-turn-converter.js.map +1 -0
  402. package/dist/providers/codex.provider.d.ts +21 -0
  403. package/dist/providers/codex.provider.d.ts.map +1 -1
  404. package/dist/providers/codex.provider.js +57 -27
  405. package/dist/providers/codex.provider.js.map +1 -1
  406. package/dist/providers/common/openai-compatible-message-contract.d.ts +8 -0
  407. package/dist/providers/common/openai-compatible-message-contract.d.ts.map +1 -0
  408. package/dist/providers/common/openai-compatible-message-contract.js +23 -0
  409. package/dist/providers/common/openai-compatible-message-contract.js.map +1 -0
  410. package/dist/providers/common/openai-compatible-messages.d.ts +0 -4
  411. package/dist/providers/common/openai-compatible-messages.d.ts.map +1 -1
  412. package/dist/providers/common/openai-compatible-messages.js +0 -288
  413. package/dist/providers/common/openai-compatible-messages.js.map +1 -1
  414. package/dist/providers/fetch/composer.d.ts.map +1 -1
  415. package/dist/providers/fetch/composer.js +1 -0
  416. package/dist/providers/fetch/composer.js.map +1 -1
  417. package/dist/providers/model-catalog/catalog.d.ts +31 -0
  418. package/dist/providers/model-catalog/catalog.d.ts.map +1 -0
  419. package/dist/providers/model-catalog/catalog.generated.d.ts +3010 -0
  420. package/dist/providers/model-catalog/catalog.generated.d.ts.map +1 -0
  421. package/dist/providers/model-catalog/catalog.generated.js +3004 -0
  422. package/dist/providers/model-catalog/catalog.generated.js.map +1 -0
  423. package/dist/providers/model-catalog/catalog.js +62 -0
  424. package/dist/providers/model-catalog/catalog.js.map +1 -0
  425. package/dist/providers/model-catalog/generate-catalog.d.ts +42 -0
  426. package/dist/providers/model-catalog/generate-catalog.d.ts.map +1 -0
  427. package/dist/providers/model-catalog/generate-catalog.js +96 -0
  428. package/dist/providers/model-catalog/generate-catalog.js.map +1 -0
  429. package/dist/providers/openai-chained-input-compatibility.d.ts +36 -0
  430. package/dist/providers/openai-chained-input-compatibility.d.ts.map +1 -0
  431. package/dist/providers/openai-chained-input-compatibility.js +60 -0
  432. package/dist/providers/openai-chained-input-compatibility.js.map +1 -0
  433. package/dist/providers/openai-chat-completions-model.d.ts +12 -0
  434. package/dist/providers/openai-chat-completions-model.d.ts.map +1 -0
  435. package/dist/providers/openai-chat-completions-model.js +271 -0
  436. package/dist/providers/openai-chat-completions-model.js.map +1 -0
  437. package/dist/providers/openai-compatible-lazy.d.ts +1 -1
  438. package/dist/providers/openai-compatible-lazy.d.ts.map +1 -1
  439. package/dist/providers/openai-compatible-lazy.js +24 -36
  440. package/dist/providers/openai-compatible-lazy.js.map +1 -1
  441. package/dist/providers/openai-compatible-middleware.d.ts +4 -1
  442. package/dist/providers/openai-compatible-middleware.d.ts.map +1 -1
  443. package/dist/providers/openai-compatible-middleware.js +15 -14
  444. package/dist/providers/openai-compatible-middleware.js.map +1 -1
  445. package/dist/providers/openai-compatible-response-normalizer.d.ts +10 -1
  446. package/dist/providers/openai-compatible-response-normalizer.d.ts.map +1 -1
  447. package/dist/providers/openai-compatible-response-normalizer.js +15 -4
  448. package/dist/providers/openai-compatible-response-normalizer.js.map +1 -1
  449. package/dist/providers/openai-compatible.provider.d.ts +7 -10
  450. package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
  451. package/dist/providers/openai-compatible.provider.js +80 -78
  452. package/dist/providers/openai-compatible.provider.js.map +1 -1
  453. package/dist/providers/openai-request-prefix-binding.d.ts +28 -0
  454. package/dist/providers/openai-request-prefix-binding.d.ts.map +1 -0
  455. package/dist/providers/openai-request-prefix-binding.js +78 -0
  456. package/dist/providers/openai-request-prefix-binding.js.map +1 -0
  457. package/dist/providers/openai-responses-model.d.ts +43 -0
  458. package/dist/providers/openai-responses-model.d.ts.map +1 -0
  459. package/dist/providers/openai-responses-model.js +564 -0
  460. package/dist/providers/openai-responses-model.js.map +1 -0
  461. package/dist/providers/openai.provider.d.ts +11 -8
  462. package/dist/providers/openai.provider.d.ts.map +1 -1
  463. package/dist/providers/openai.provider.js +43 -91
  464. package/dist/providers/openai.provider.js.map +1 -1
  465. package/dist/providers/opencode-routing.d.ts +1 -1
  466. package/dist/providers/opencode-routing.d.ts.map +1 -1
  467. package/dist/providers/opencode-routing.js +4 -2
  468. package/dist/providers/opencode-routing.js.map +1 -1
  469. package/dist/providers/opencode-session.d.ts.map +1 -1
  470. package/dist/providers/opencode-session.js +28 -3
  471. package/dist/providers/opencode-session.js.map +1 -1
  472. package/dist/providers/openrouter.provider.d.ts.map +1 -1
  473. package/dist/providers/openrouter.provider.js +33 -33
  474. package/dist/providers/openrouter.provider.js.map +1 -1
  475. package/dist/providers/provider-request-capture.d.ts +35 -0
  476. package/dist/providers/provider-request-capture.d.ts.map +1 -0
  477. package/dist/providers/provider-request-capture.js +22 -0
  478. package/dist/providers/provider-request-capture.js.map +1 -0
  479. package/dist/providers/provider-service.d.ts +9 -7
  480. package/dist/providers/provider-service.d.ts.map +1 -1
  481. package/dist/providers/provider-service.js +29 -28
  482. package/dist/providers/provider-service.js.map +1 -1
  483. package/dist/providers/registry.d.ts +14 -9
  484. package/dist/providers/registry.d.ts.map +1 -1
  485. package/dist/providers/registry.js.map +1 -1
  486. package/dist/providers/retrying-model.d.ts +8 -6
  487. package/dist/providers/retrying-model.d.ts.map +1 -1
  488. package/dist/providers/retrying-model.js +7 -20
  489. package/dist/providers/retrying-model.js.map +1 -1
  490. package/dist/providers/web-search/exa.provider.js.map +1 -1
  491. package/dist/providers/web-search/registry.js.map +1 -1
  492. package/dist/providers/web-search/tavily.provider.js.map +1 -1
  493. package/dist/providers/websocket-receive-watchdog.d.ts.map +1 -1
  494. package/dist/providers/websocket-receive-watchdog.js +9 -1
  495. package/dist/providers/websocket-receive-watchdog.js.map +1 -1
  496. package/dist/scripts/eval-auto-approval/runner.js +2 -0
  497. package/dist/scripts/eval-auto-approval/runner.js.map +1 -1
  498. package/dist/services/agent-runtime/application-run-loop.d.ts +205 -0
  499. package/dist/services/agent-runtime/application-run-loop.d.ts.map +1 -0
  500. package/dist/services/agent-runtime/application-run-loop.js +1236 -0
  501. package/dist/services/agent-runtime/application-run-loop.js.map +1 -0
  502. package/dist/services/agent-runtime/compose-agent-runtime.d.ts +3 -0
  503. package/dist/services/agent-runtime/compose-agent-runtime.d.ts.map +1 -1
  504. package/dist/services/agent-runtime/compose-agent-runtime.js +4 -0
  505. package/dist/services/agent-runtime/compose-agent-runtime.js.map +1 -1
  506. package/dist/services/agent-runtime/generation-guard.d.ts +69 -0
  507. package/dist/services/agent-runtime/generation-guard.d.ts.map +1 -0
  508. package/dist/services/agent-runtime/generation-guard.js +270 -0
  509. package/dist/services/agent-runtime/generation-guard.js.map +1 -0
  510. package/dist/services/agent-runtime/model-resolver.d.ts.map +1 -1
  511. package/dist/services/agent-runtime/model-resolver.js +7 -6
  512. package/dist/services/agent-runtime/model-resolver.js.map +1 -1
  513. package/dist/services/agent-runtime/structured-output.d.ts.map +1 -1
  514. package/dist/services/agent-runtime/structured-output.js +1 -21
  515. package/dist/services/agent-runtime/structured-output.js.map +1 -1
  516. package/dist/services/agent-runtime/tool-invocation-context.d.ts +73 -0
  517. package/dist/services/agent-runtime/tool-invocation-context.d.ts.map +1 -0
  518. package/dist/services/agent-runtime/tool-invocation-context.js +66 -0
  519. package/dist/services/agent-runtime/tool-invocation-context.js.map +1 -0
  520. package/dist/services/agent-stream.d.ts +41 -2
  521. package/dist/services/agent-stream.d.ts.map +1 -1
  522. package/dist/services/agent-stream.js +46 -1
  523. package/dist/services/agent-stream.js.map +1 -1
  524. package/dist/services/approval/approval-decision-executor.d.ts +42 -0
  525. package/dist/services/approval/approval-decision-executor.d.ts.map +1 -0
  526. package/dist/services/approval/approval-decision-executor.js +207 -0
  527. package/dist/services/approval/approval-decision-executor.js.map +1 -0
  528. package/dist/services/approval/approval-flow-coordinator.d.ts +25 -8
  529. package/dist/services/approval/approval-flow-coordinator.d.ts.map +1 -1
  530. package/dist/services/approval/approval-flow-coordinator.js +34 -167
  531. package/dist/services/approval/approval-flow-coordinator.js.map +1 -1
  532. package/dist/services/approval/approval-replay.d.ts +52 -0
  533. package/dist/services/approval/approval-replay.d.ts.map +1 -0
  534. package/dist/services/approval/approval-replay.js +68 -0
  535. package/dist/services/approval/approval-replay.js.map +1 -0
  536. package/dist/services/approval/approval-state.d.ts +3 -6
  537. package/dist/services/approval/approval-state.d.ts.map +1 -1
  538. package/dist/services/approval/approval-state.js +0 -10
  539. package/dist/services/approval/approval-state.js.map +1 -1
  540. package/dist/services/approval/background-subagent-approval-controller.d.ts +25 -0
  541. package/dist/services/approval/background-subagent-approval-controller.d.ts.map +1 -0
  542. package/dist/services/approval/background-subagent-approval-controller.js +65 -0
  543. package/dist/services/approval/background-subagent-approval-controller.js.map +1 -0
  544. package/dist/services/approval/background-subagent-approval-queue.d.ts +137 -0
  545. package/dist/services/approval/background-subagent-approval-queue.d.ts.map +1 -0
  546. package/dist/services/approval/background-subagent-approval-queue.js +200 -0
  547. package/dist/services/approval/background-subagent-approval-queue.js.map +1 -0
  548. package/dist/services/approval/non-interactive-approval-policy.d.ts +33 -0
  549. package/dist/services/approval/non-interactive-approval-policy.d.ts.map +1 -0
  550. package/dist/services/approval/non-interactive-approval-policy.js +85 -0
  551. package/dist/services/approval/non-interactive-approval-policy.js.map +1 -0
  552. package/dist/services/approval/session-read-access.d.ts +10 -0
  553. package/dist/services/approval/session-read-access.d.ts.map +1 -1
  554. package/dist/services/approval/session-read-access.js +12 -0
  555. package/dist/services/approval/session-read-access.js.map +1 -1
  556. package/dist/services/approval/session-read-grant-target.d.ts +7 -0
  557. package/dist/services/approval/session-read-grant-target.d.ts.map +1 -0
  558. package/dist/services/approval/session-read-grant-target.js +36 -0
  559. package/dist/services/approval/session-read-grant-target.js.map +1 -0
  560. package/dist/services/approval/shell-auto-approval-evaluator.d.ts +11 -3
  561. package/dist/services/approval/shell-auto-approval-evaluator.d.ts.map +1 -1
  562. package/dist/services/approval/shell-auto-approval-evaluator.js +140 -46
  563. package/dist/services/approval/shell-auto-approval-evaluator.js.map +1 -1
  564. package/dist/services/approval/shell-auto-approval-resolver.d.ts +13 -0
  565. package/dist/services/approval/shell-auto-approval-resolver.d.ts.map +1 -1
  566. package/dist/services/approval/shell-auto-approval-resolver.js +74 -6
  567. package/dist/services/approval/shell-auto-approval-resolver.js.map +1 -1
  568. package/dist/services/approval/shell-sandbox-approval.d.ts +22 -1
  569. package/dist/services/approval/shell-sandbox-approval.d.ts.map +1 -1
  570. package/dist/services/approval/shell-sandbox-approval.js +31 -4
  571. package/dist/services/approval/shell-sandbox-approval.js.map +1 -1
  572. package/dist/services/approval/tool-approval-batch-coordinator.d.ts +9 -0
  573. package/dist/services/approval/tool-approval-batch-coordinator.d.ts.map +1 -1
  574. package/dist/services/approval/tool-approval-batch-coordinator.js +20 -4
  575. package/dist/services/approval/tool-approval-batch-coordinator.js.map +1 -1
  576. package/dist/services/approval/tool-owner.d.ts +5 -2
  577. package/dist/services/approval/tool-owner.d.ts.map +1 -1
  578. package/dist/services/approval/tool-owner.js +0 -56
  579. package/dist/services/approval/tool-owner.js.map +1 -1
  580. package/dist/services/approval/tool-ownership-registry.d.ts +25 -0
  581. package/dist/services/approval/tool-ownership-registry.d.ts.map +1 -0
  582. package/dist/services/approval/tool-ownership-registry.js +63 -0
  583. package/dist/services/approval/tool-ownership-registry.js.map +1 -0
  584. package/dist/services/command-message-streaming.d.ts +8 -4
  585. package/dist/services/command-message-streaming.d.ts.map +1 -1
  586. package/dist/services/command-message-streaming.js +13 -52
  587. package/dist/services/command-message-streaming.js.map +1 -1
  588. package/dist/services/conversation/conversation-adapter-factory.d.ts.map +1 -1
  589. package/dist/services/conversation/conversation-adapter-factory.js +1 -0
  590. package/dist/services/conversation/conversation-adapter-factory.js.map +1 -1
  591. package/dist/services/conversation/conversation-adapter.d.ts +120 -13
  592. package/dist/services/conversation/conversation-adapter.d.ts.map +1 -1
  593. package/dist/services/conversation/conversation-adapter.js +378 -63
  594. package/dist/services/conversation/conversation-adapter.js.map +1 -1
  595. package/dist/services/conversation/conversation-admission-workflow.d.ts +69 -0
  596. package/dist/services/conversation/conversation-admission-workflow.d.ts.map +1 -0
  597. package/dist/services/conversation/conversation-admission-workflow.js +110 -0
  598. package/dist/services/conversation/conversation-admission-workflow.js.map +1 -0
  599. package/dist/services/conversation/conversation-decoder.d.ts +14 -0
  600. package/dist/services/conversation/conversation-decoder.d.ts.map +1 -0
  601. package/dist/services/conversation/conversation-decoder.js +149 -0
  602. package/dist/services/conversation/conversation-decoder.js.map +1 -0
  603. package/dist/services/conversation/conversation-events.d.ts +72 -24
  604. package/dist/services/conversation/conversation-events.d.ts.map +1 -1
  605. package/dist/services/conversation/conversation-history-repair.d.ts.map +1 -1
  606. package/dist/services/conversation/conversation-history-repair.js +34 -37
  607. package/dist/services/conversation/conversation-history-repair.js.map +1 -1
  608. package/dist/services/conversation/conversation-message-projection.d.ts +27 -0
  609. package/dist/services/conversation/conversation-message-projection.d.ts.map +1 -0
  610. package/dist/services/conversation/conversation-message-projection.js +59 -0
  611. package/dist/services/conversation/conversation-message-projection.js.map +1 -0
  612. package/dist/services/conversation/conversation-orchestrator.d.ts +23 -14
  613. package/dist/services/conversation/conversation-orchestrator.d.ts.map +1 -1
  614. package/dist/services/conversation/conversation-orchestrator.js +472 -158
  615. package/dist/services/conversation/conversation-orchestrator.js.map +1 -1
  616. package/dist/services/conversation/conversation-orchestrator.types.d.ts +16 -11
  617. package/dist/services/conversation/conversation-orchestrator.types.d.ts.map +1 -1
  618. package/dist/services/conversation/conversation-persistence-types.d.ts +15 -38
  619. package/dist/services/conversation/conversation-persistence-types.d.ts.map +1 -1
  620. package/dist/services/conversation/conversation-persistence.d.ts +3 -10
  621. package/dist/services/conversation/conversation-persistence.d.ts.map +1 -1
  622. package/dist/services/conversation/conversation-persistence.js +66 -15
  623. package/dist/services/conversation/conversation-persistence.js.map +1 -1
  624. package/dist/services/conversation/conversation-replay.d.ts +7 -5
  625. package/dist/services/conversation/conversation-replay.d.ts.map +1 -1
  626. package/dist/services/conversation/conversation-replay.js +127 -66
  627. package/dist/services/conversation/conversation-replay.js.map +1 -1
  628. package/dist/services/conversation/conversation-result-builder.d.ts +16 -2
  629. package/dist/services/conversation/conversation-result-builder.d.ts.map +1 -1
  630. package/dist/services/conversation/conversation-result-builder.js +51 -15
  631. package/dist/services/conversation/conversation-result-builder.js.map +1 -1
  632. package/dist/services/conversation/conversation-runtime-factory.d.ts +18 -0
  633. package/dist/services/conversation/conversation-runtime-factory.d.ts.map +1 -1
  634. package/dist/services/conversation/conversation-runtime-factory.js.map +1 -1
  635. package/dist/services/conversation/conversation-service.d.ts +67 -11
  636. package/dist/services/conversation/conversation-service.d.ts.map +1 -1
  637. package/dist/services/conversation/conversation-service.js +133 -16
  638. package/dist/services/conversation/conversation-service.js.map +1 -1
  639. package/dist/services/conversation/conversation-state-projector.d.ts +3 -3
  640. package/dist/services/conversation/conversation-state-projector.d.ts.map +1 -1
  641. package/dist/services/conversation/conversation-state-projector.js +18 -0
  642. package/dist/services/conversation/conversation-state-projector.js.map +1 -1
  643. package/dist/services/conversation/conversation-store.d.ts +69 -12
  644. package/dist/services/conversation/conversation-store.d.ts.map +1 -1
  645. package/dist/services/conversation/conversation-store.js +216 -119
  646. package/dist/services/conversation/conversation-store.js.map +1 -1
  647. package/dist/services/conversation/conversation-turn-items.d.ts +8 -2
  648. package/dist/services/conversation/conversation-turn-items.d.ts.map +1 -1
  649. package/dist/services/conversation/conversation-turn-items.js +96 -275
  650. package/dist/services/conversation/conversation-turn-items.js.map +1 -1
  651. package/dist/services/conversation/journal-to-ledger.d.ts.map +1 -1
  652. package/dist/services/conversation/journal-to-ledger.js +4 -24
  653. package/dist/services/conversation/journal-to-ledger.js.map +1 -1
  654. package/dist/services/conversation/run-item-normalizer.d.ts +5 -0
  655. package/dist/services/conversation/run-item-normalizer.d.ts.map +1 -0
  656. package/dist/services/conversation/run-item-normalizer.js +245 -0
  657. package/dist/services/conversation/run-item-normalizer.js.map +1 -0
  658. package/dist/services/conversation/user-turn-item.d.ts +14 -0
  659. package/dist/services/conversation/user-turn-item.d.ts.map +1 -0
  660. package/dist/services/conversation/user-turn-item.js +27 -0
  661. package/dist/services/conversation/user-turn-item.js.map +1 -0
  662. package/dist/services/conversation-agent-client.d.ts +77 -6
  663. package/dist/services/conversation-agent-client.d.ts.map +1 -1
  664. package/dist/services/cost/model-cost.d.ts +147 -0
  665. package/dist/services/cost/model-cost.d.ts.map +1 -0
  666. package/dist/services/cost/model-cost.js +217 -0
  667. package/dist/services/cost/model-cost.js.map +1 -0
  668. package/dist/services/cost/pricing-overlay.d.ts +26 -0
  669. package/dist/services/cost/pricing-overlay.d.ts.map +1 -0
  670. package/dist/services/cost/pricing-overlay.js +39 -0
  671. package/dist/services/cost/pricing-overlay.js.map +1 -0
  672. package/dist/services/cost/pricing.d.ts +13 -0
  673. package/dist/services/cost/pricing.d.ts.map +1 -0
  674. package/dist/services/cost/pricing.js +76 -0
  675. package/dist/services/cost/pricing.js.map +1 -0
  676. package/dist/services/handoff/handoff-flow-reducer.d.ts +27 -0
  677. package/dist/services/handoff/handoff-flow-reducer.d.ts.map +1 -0
  678. package/dist/services/handoff/handoff-flow-reducer.js +26 -0
  679. package/dist/services/handoff/handoff-flow-reducer.js.map +1 -0
  680. package/dist/services/handoff/handoff-session.d.ts +35 -0
  681. package/dist/services/handoff/handoff-session.d.ts.map +1 -0
  682. package/dist/services/handoff/handoff-session.js +136 -0
  683. package/dist/services/handoff/handoff-session.js.map +1 -0
  684. package/dist/services/hooks/hook-contracts.d.ts +124 -0
  685. package/dist/services/hooks/hook-contracts.d.ts.map +1 -0
  686. package/dist/services/hooks/hook-contracts.js +92 -0
  687. package/dist/services/hooks/hook-contracts.js.map +1 -0
  688. package/dist/services/hooks/hook-discovery.d.ts +45 -0
  689. package/dist/services/hooks/hook-discovery.d.ts.map +1 -0
  690. package/dist/services/hooks/hook-discovery.js +255 -0
  691. package/dist/services/hooks/hook-discovery.js.map +1 -0
  692. package/dist/services/hooks/hook-editor-shim.d.ts +6 -0
  693. package/dist/services/hooks/hook-editor-shim.d.ts.map +1 -0
  694. package/dist/services/hooks/hook-editor-shim.js +190 -0
  695. package/dist/services/hooks/hook-editor-shim.js.map +1 -0
  696. package/dist/services/hooks/hook-event-factory.d.ts +19 -0
  697. package/dist/services/hooks/hook-event-factory.d.ts.map +1 -0
  698. package/dist/services/hooks/hook-event-factory.js +45 -0
  699. package/dist/services/hooks/hook-event-factory.js.map +1 -0
  700. package/dist/services/hooks/hook-module-loader.d.ts +38 -0
  701. package/dist/services/hooks/hook-module-loader.d.ts.map +1 -0
  702. package/dist/services/hooks/hook-module-loader.js +69 -0
  703. package/dist/services/hooks/hook-module-loader.js.map +1 -0
  704. package/dist/services/hooks/hook-registry.d.ts +47 -0
  705. package/dist/services/hooks/hook-registry.d.ts.map +1 -0
  706. package/dist/services/hooks/hook-registry.js +185 -0
  707. package/dist/services/hooks/hook-registry.js.map +1 -0
  708. package/dist/services/hooks/hook-service.d.ts +44 -0
  709. package/dist/services/hooks/hook-service.d.ts.map +1 -0
  710. package/dist/services/hooks/hook-service.js +138 -0
  711. package/dist/services/hooks/hook-service.js.map +1 -0
  712. package/dist/services/hooks/hook-tool-lifecycle.d.ts +6 -0
  713. package/dist/services/hooks/hook-tool-lifecycle.d.ts.map +1 -0
  714. package/dist/services/hooks/hook-tool-lifecycle.js +33 -0
  715. package/dist/services/hooks/hook-tool-lifecycle.js.map +1 -0
  716. package/dist/services/hooks/index.d.ts +2 -0
  717. package/dist/services/hooks/index.d.ts.map +1 -0
  718. package/dist/services/hooks/index.js +2 -0
  719. package/dist/services/hooks/index.js.map +1 -0
  720. package/dist/services/input-surge-guard.d.ts.map +1 -1
  721. package/dist/services/input-surge-guard.js +13 -34
  722. package/dist/services/input-surge-guard.js.map +1 -1
  723. package/dist/services/logging/assistant-turn-journal.d.ts +1 -1
  724. package/dist/services/logging/assistant-turn-journal.d.ts.map +1 -1
  725. package/dist/services/logging/assistant-turn-journal.js +21 -36
  726. package/dist/services/logging/assistant-turn-journal.js.map +1 -1
  727. package/dist/services/logging/conversation-log-events.d.ts +70 -7
  728. package/dist/services/logging/conversation-log-events.d.ts.map +1 -1
  729. package/dist/services/logging/conversation-log-events.js +9 -0
  730. package/dist/services/logging/conversation-log-events.js.map +1 -1
  731. package/dist/services/logging/conversation-log-writer.d.ts +10 -4
  732. package/dist/services/logging/conversation-log-writer.d.ts.map +1 -1
  733. package/dist/services/logging/conversation-log-writer.js +184 -57
  734. package/dist/services/logging/conversation-log-writer.js.map +1 -1
  735. package/dist/services/logging/conversation-logger.d.ts.map +1 -1
  736. package/dist/services/logging/conversation-logger.js +34 -1
  737. package/dist/services/logging/conversation-logger.js.map +1 -1
  738. package/dist/services/logging/logging-service.d.ts.map +1 -1
  739. package/dist/services/logging/logging-service.js +6 -2
  740. package/dist/services/logging/logging-service.js.map +1 -1
  741. package/dist/services/logging/provider-traffic.d.ts +2 -1
  742. package/dist/services/logging/provider-traffic.d.ts.map +1 -1
  743. package/dist/services/logging/provider-traffic.js +81 -5
  744. package/dist/services/logging/provider-traffic.js.map +1 -1
  745. package/dist/services/memory/memory-capabilities.d.ts.map +1 -1
  746. package/dist/services/memory/memory-capabilities.js +13 -8
  747. package/dist/services/memory/memory-capabilities.js.map +1 -1
  748. package/dist/services/model-service.d.ts +3 -0
  749. package/dist/services/model-service.d.ts.map +1 -1
  750. package/dist/services/model-service.js +3 -1
  751. package/dist/services/model-service.js.map +1 -1
  752. package/dist/services/models/model-catalog-session.d.ts +24 -0
  753. package/dist/services/models/model-catalog-session.d.ts.map +1 -0
  754. package/dist/services/models/model-catalog-session.js +70 -0
  755. package/dist/services/models/model-catalog-session.js.map +1 -0
  756. package/dist/services/openai-candidate-observer.d.ts +18 -0
  757. package/dist/services/openai-candidate-observer.d.ts.map +1 -0
  758. package/dist/services/openai-candidate-observer.js +56 -0
  759. package/dist/services/openai-candidate-observer.js.map +1 -0
  760. package/dist/services/openai-root-checkpoint-lifecycle-observer.d.ts +20 -0
  761. package/dist/services/openai-root-checkpoint-lifecycle-observer.d.ts.map +1 -0
  762. package/dist/services/openai-root-checkpoint-lifecycle-observer.js +21 -0
  763. package/dist/services/openai-root-checkpoint-lifecycle-observer.js.map +1 -0
  764. package/dist/services/openai-root-provider-identity.d.ts +11 -0
  765. package/dist/services/openai-root-provider-identity.d.ts.map +1 -0
  766. package/dist/services/openai-root-provider-identity.js +16 -0
  767. package/dist/services/openai-root-provider-identity.js.map +1 -0
  768. package/dist/services/openai-root-selector-parity-observer.d.ts +53 -0
  769. package/dist/services/openai-root-selector-parity-observer.d.ts.map +1 -0
  770. package/dist/services/openai-root-selector-parity-observer.js +62 -0
  771. package/dist/services/openai-root-selector-parity-observer.js.map +1 -0
  772. package/dist/services/plan-mode-interceptor.js +2 -2
  773. package/dist/services/plan-mode-interceptor.js.map +1 -1
  774. package/dist/services/provider-continuity.d.ts +79 -0
  775. package/dist/services/provider-continuity.d.ts.map +1 -1
  776. package/dist/services/provider-continuity.js +170 -0
  777. package/dist/services/provider-continuity.js.map +1 -1
  778. package/dist/services/providers/provider-management-session.d.ts +12 -0
  779. package/dist/services/providers/provider-management-session.d.ts.map +1 -0
  780. package/dist/services/providers/provider-management-session.js +21 -0
  781. package/dist/services/providers/provider-management-session.js.map +1 -0
  782. package/dist/services/queue/queue-controller.d.ts +10 -14
  783. package/dist/services/queue/queue-controller.d.ts.map +1 -1
  784. package/dist/services/queue/queue-controller.js +77 -59
  785. package/dist/services/queue/queue-controller.js.map +1 -1
  786. package/dist/services/retry/conversation-retry-policy.js +3 -3
  787. package/dist/services/retry/conversation-retry-policy.js.map +1 -1
  788. package/dist/services/retry/recovery-executor.d.ts.map +1 -1
  789. package/dist/services/retry/recovery-executor.js +7 -8
  790. package/dist/services/retry/recovery-executor.js.map +1 -1
  791. package/dist/services/retry/recovery-policy.d.ts.map +1 -1
  792. package/dist/services/retry/recovery-policy.js +4 -1
  793. package/dist/services/retry/recovery-policy.js.map +1 -1
  794. package/dist/services/retry/retry-classifier.d.ts.map +1 -1
  795. package/dist/services/retry/retry-classifier.js +6 -3
  796. package/dist/services/retry/retry-classifier.js.map +1 -1
  797. package/dist/services/retry/retry-contracts.d.ts +3 -5
  798. package/dist/services/retry/retry-contracts.d.ts.map +1 -1
  799. package/dist/services/retry/retry-error-classification.d.ts +1 -0
  800. package/dist/services/retry/retry-error-classification.d.ts.map +1 -1
  801. package/dist/services/retry/retry-error-classification.js +28 -0
  802. package/dist/services/retry/retry-error-classification.js.map +1 -1
  803. package/dist/services/retry/retry-event-presenter.d.ts.map +1 -1
  804. package/dist/services/retry/retry-event-presenter.js +4 -1
  805. package/dist/services/retry/retry-event-presenter.js.map +1 -1
  806. package/dist/services/retry/upstream-retry-policy.js +3 -3
  807. package/dist/services/rtk-service.d.ts.map +1 -1
  808. package/dist/services/rtk-service.js +3 -15
  809. package/dist/services/rtk-service.js.map +1 -1
  810. package/dist/services/runtime-setting-router.d.ts +19 -0
  811. package/dist/services/runtime-setting-router.d.ts.map +1 -1
  812. package/dist/services/runtime-setting-router.js +33 -0
  813. package/dist/services/runtime-setting-router.js.map +1 -1
  814. package/dist/services/service-interfaces.d.ts +19 -2
  815. package/dist/services/service-interfaces.d.ts.map +1 -1
  816. package/dist/services/session/background-task-control.d.ts +123 -0
  817. package/dist/services/session/background-task-control.d.ts.map +1 -0
  818. package/dist/services/session/background-task-control.js +183 -0
  819. package/dist/services/session/background-task-control.js.map +1 -0
  820. package/dist/services/session/continuation-call-id-resolver.d.ts +16 -9
  821. package/dist/services/session/continuation-call-id-resolver.d.ts.map +1 -1
  822. package/dist/services/session/continuation-call-id-resolver.js +34 -48
  823. package/dist/services/session/continuation-call-id-resolver.js.map +1 -1
  824. package/dist/services/session/continuation-plan-applier.d.ts.map +1 -1
  825. package/dist/services/session/continuation-plan-applier.js +1 -3
  826. package/dist/services/session/continuation-plan-applier.js.map +1 -1
  827. package/dist/services/session/continuation-recovery-handler.d.ts.map +1 -1
  828. package/dist/services/session/continuation-recovery-handler.js +0 -2
  829. package/dist/services/session/continuation-recovery-handler.js.map +1 -1
  830. package/dist/services/session/continuation-state.d.ts +9 -5
  831. package/dist/services/session/continuation-state.d.ts.map +1 -1
  832. package/dist/services/session/continuation-state.js +1 -1
  833. package/dist/services/session/continuation-state.js.map +1 -1
  834. package/dist/services/session/live-run.d.ts +29 -0
  835. package/dist/services/session/live-run.d.ts.map +1 -0
  836. package/dist/services/session/live-run.js +111 -0
  837. package/dist/services/session/live-run.js.map +1 -0
  838. package/dist/services/session/nested-tool-compatibility-state.d.ts +20 -0
  839. package/dist/services/session/nested-tool-compatibility-state.d.ts.map +1 -0
  840. package/dist/services/session/nested-tool-compatibility-state.js +29 -0
  841. package/dist/services/session/nested-tool-compatibility-state.js.map +1 -0
  842. package/dist/services/session/pending-interaction-state.d.ts +60 -0
  843. package/dist/services/session/pending-interaction-state.d.ts.map +1 -0
  844. package/dist/services/session/pending-interaction-state.js +132 -0
  845. package/dist/services/session/pending-interaction-state.js.map +1 -0
  846. package/dist/services/session/post-execute-pause-capability.d.ts +17 -0
  847. package/dist/services/session/post-execute-pause-capability.d.ts.map +1 -0
  848. package/dist/services/session/post-execute-pause-capability.js +27 -0
  849. package/dist/services/session/post-execute-pause-capability.js.map +1 -0
  850. package/dist/services/session/post-execute-pause-policy.d.ts +20 -0
  851. package/dist/services/session/post-execute-pause-policy.d.ts.map +1 -0
  852. package/dist/services/session/post-execute-pause-policy.js +34 -0
  853. package/dist/services/session/post-execute-pause-policy.js.map +1 -0
  854. package/dist/services/session/post-execute-pending-registry.d.ts +63 -0
  855. package/dist/services/session/post-execute-pending-registry.d.ts.map +1 -0
  856. package/dist/services/session/post-execute-pending-registry.js +123 -0
  857. package/dist/services/session/post-execute-pending-registry.js.map +1 -0
  858. package/dist/services/session/session-access-state.d.ts +24 -0
  859. package/dist/services/session/session-access-state.d.ts.map +1 -0
  860. package/dist/services/session/session-access-state.js +91 -0
  861. package/dist/services/session/session-access-state.js.map +1 -0
  862. package/dist/services/session/session-client-factory.d.ts +61 -0
  863. package/dist/services/session/session-client-factory.d.ts.map +1 -0
  864. package/dist/services/session/session-client-factory.js +103 -0
  865. package/dist/services/session/session-client-factory.js.map +1 -0
  866. package/dist/services/session/session-composition.d.ts +58 -0
  867. package/dist/services/session/session-composition.d.ts.map +1 -1
  868. package/dist/services/session/session-composition.js +178 -13
  869. package/dist/services/session/session-composition.js.map +1 -1
  870. package/dist/services/session/session-input-planner.d.ts +6 -2
  871. package/dist/services/session/session-input-planner.d.ts.map +1 -1
  872. package/dist/services/session/session-input-planner.js +4 -0
  873. package/dist/services/session/session-input-planner.js.map +1 -1
  874. package/dist/services/session/session-lifecycle.d.ts +5 -0
  875. package/dist/services/session/session-lifecycle.d.ts.map +1 -1
  876. package/dist/services/session/session-lifecycle.js +16 -6
  877. package/dist/services/session/session-lifecycle.js.map +1 -1
  878. package/dist/services/session/session-manager.d.ts +11 -1
  879. package/dist/services/session/session-manager.d.ts.map +1 -1
  880. package/dist/services/session/session-manager.js +16 -3
  881. package/dist/services/session/session-manager.js.map +1 -1
  882. package/dist/services/session/session-stream-processor.d.ts +5 -0
  883. package/dist/services/session/session-stream-processor.d.ts.map +1 -1
  884. package/dist/services/session/session-stream-processor.js +164 -35
  885. package/dist/services/session/session-stream-processor.js.map +1 -1
  886. package/dist/services/session/session-tool-tracker.d.ts +10 -21
  887. package/dist/services/session/session-tool-tracker.d.ts.map +1 -1
  888. package/dist/services/session/session-tool-tracker.js +12 -52
  889. package/dist/services/session/session-tool-tracker.js.map +1 -1
  890. package/dist/services/session/terminal-result-collector.d.ts +8 -0
  891. package/dist/services/session/terminal-result-collector.d.ts.map +1 -1
  892. package/dist/services/session/terminal-result-collector.js +18 -4
  893. package/dist/services/session/terminal-result-collector.js.map +1 -1
  894. package/dist/services/session/test-helpers/conversation-session-fixtures.d.ts.map +1 -1
  895. package/dist/services/session/test-helpers/conversation-session-fixtures.js +8 -1
  896. package/dist/services/session/test-helpers/conversation-session-fixtures.js.map +1 -1
  897. package/dist/services/session/turn-attempt-factory.d.ts +2 -2
  898. package/dist/services/session/turn-attempt-factory.d.ts.map +1 -1
  899. package/dist/services/session/turn-attempt.d.ts +4 -2
  900. package/dist/services/session/turn-attempt.d.ts.map +1 -1
  901. package/dist/services/session/turn-attempt.js +5 -0
  902. package/dist/services/session/turn-attempt.js.map +1 -1
  903. package/dist/services/session/turn-coordinator.d.ts +32 -2
  904. package/dist/services/session/turn-coordinator.d.ts.map +1 -1
  905. package/dist/services/session/turn-coordinator.js +180 -9
  906. package/dist/services/session/turn-coordinator.js.map +1 -1
  907. package/dist/services/session/turn-status-machine.d.ts +21 -6
  908. package/dist/services/session/turn-status-machine.d.ts.map +1 -1
  909. package/dist/services/session/turn-status-machine.js +50 -13
  910. package/dist/services/session/turn-status-machine.js.map +1 -1
  911. package/dist/services/session/turn-workflow.d.ts +35 -0
  912. package/dist/services/session/turn-workflow.d.ts.map +1 -1
  913. package/dist/services/session/turn-workflow.js +373 -27
  914. package/dist/services/session/turn-workflow.js.map +1 -1
  915. package/dist/services/settings/ancillary-settings-migration.js +3 -3
  916. package/dist/services/settings/ancillary-settings-migration.js.map +1 -1
  917. package/dist/services/settings/custom-provider-normalization.d.ts +10 -0
  918. package/dist/services/settings/custom-provider-normalization.d.ts.map +1 -1
  919. package/dist/services/settings/custom-provider-normalization.js +35 -2
  920. package/dist/services/settings/custom-provider-normalization.js.map +1 -1
  921. package/dist/services/settings/settings-env.d.ts +3 -0
  922. package/dist/services/settings/settings-env.d.ts.map +1 -1
  923. package/dist/services/settings/settings-env.js +3 -3
  924. package/dist/services/settings/settings-env.js.map +1 -1
  925. package/dist/services/settings/settings-merger.d.ts +6 -5
  926. package/dist/services/settings/settings-merger.d.ts.map +1 -1
  927. package/dist/services/settings/settings-merger.js +9 -4
  928. package/dist/services/settings/settings-merger.js.map +1 -1
  929. package/dist/services/settings/settings-persistence.d.ts +17 -6
  930. package/dist/services/settings/settings-persistence.d.ts.map +1 -1
  931. package/dist/services/settings/settings-persistence.js +155 -28
  932. package/dist/services/settings/settings-persistence.js.map +1 -1
  933. package/dist/services/settings/settings-schema.d.ts +100 -4
  934. package/dist/services/settings/settings-schema.d.ts.map +1 -1
  935. package/dist/services/settings/settings-schema.js +78 -8
  936. package/dist/services/settings/settings-schema.js.map +1 -1
  937. package/dist/services/settings/settings-service.d.ts +34 -5
  938. package/dist/services/settings/settings-service.d.ts.map +1 -1
  939. package/dist/services/settings/settings-service.js +200 -8
  940. package/dist/services/settings/settings-service.js.map +1 -1
  941. package/dist/services/settings/settings-sources.d.ts.map +1 -1
  942. package/dist/services/settings/settings-sources.js +6 -0
  943. package/dist/services/settings/settings-sources.js.map +1 -1
  944. package/dist/services/shell/background-shell-registry.d.ts +110 -0
  945. package/dist/services/shell/background-shell-registry.d.ts.map +1 -0
  946. package/dist/services/shell/background-shell-registry.js +326 -0
  947. package/dist/services/shell/background-shell-registry.js.map +1 -0
  948. package/dist/services/shell/shell-interaction-session.d.ts +43 -0
  949. package/dist/services/shell/shell-interaction-session.d.ts.map +1 -0
  950. package/dist/services/shell/shell-interaction-session.js +113 -0
  951. package/dist/services/shell/shell-interaction-session.js.map +1 -0
  952. package/dist/services/stream-event-processor.d.ts +11 -12
  953. package/dist/services/stream-event-processor.d.ts.map +1 -1
  954. package/dist/services/stream-event-processor.js +115 -352
  955. package/dist/services/stream-event-processor.js.map +1 -1
  956. package/dist/services/stream-snapshot.d.ts +0 -1
  957. package/dist/services/stream-snapshot.d.ts.map +1 -1
  958. package/dist/services/stream-snapshot.js +0 -1
  959. package/dist/services/stream-snapshot.js.map +1 -1
  960. package/dist/services/subagents/codename-run-id.d.ts +43 -0
  961. package/dist/services/subagents/codename-run-id.d.ts.map +1 -0
  962. package/dist/services/subagents/codename-run-id.js +683 -0
  963. package/dist/services/subagents/codename-run-id.js.map +1 -0
  964. package/dist/services/subagents/execution-runner.d.ts +5 -3
  965. package/dist/services/subagents/execution-runner.d.ts.map +1 -1
  966. package/dist/services/subagents/execution-runner.js +109 -10
  967. package/dist/services/subagents/execution-runner.js.map +1 -1
  968. package/dist/services/subagents/foreground-subagent-lease.d.ts +77 -0
  969. package/dist/services/subagents/foreground-subagent-lease.d.ts.map +1 -0
  970. package/dist/services/subagents/foreground-subagent-lease.js +156 -0
  971. package/dist/services/subagents/foreground-subagent-lease.js.map +1 -0
  972. package/dist/services/subagents/mentor-runner.d.ts.map +1 -1
  973. package/dist/services/subagents/mentor-runner.js +65 -34
  974. package/dist/services/subagents/mentor-runner.js.map +1 -1
  975. package/dist/services/subagents/nested-runner.d.ts +47 -23
  976. package/dist/services/subagents/nested-runner.d.ts.map +1 -1
  977. package/dist/services/subagents/nested-runner.js +263 -64
  978. package/dist/services/subagents/nested-runner.js.map +1 -1
  979. package/dist/services/subagents/role-loader.d.ts +3 -3
  980. package/dist/services/subagents/role-loader.d.ts.map +1 -1
  981. package/dist/services/subagents/role-loader.js +6 -7
  982. package/dist/services/subagents/role-loader.js.map +1 -1
  983. package/dist/services/subagents/runtime.d.ts +10 -0
  984. package/dist/services/subagents/runtime.d.ts.map +1 -1
  985. package/dist/services/subagents/runtime.js +31 -7
  986. package/dist/services/subagents/runtime.js.map +1 -1
  987. package/dist/services/subagents/subagent-async-registry.d.ts +50 -3
  988. package/dist/services/subagents/subagent-async-registry.d.ts.map +1 -1
  989. package/dist/services/subagents/subagent-async-registry.js +463 -44
  990. package/dist/services/subagents/subagent-async-registry.js.map +1 -1
  991. package/dist/services/subagents/subagent-client-types.d.ts +2 -0
  992. package/dist/services/subagents/subagent-client-types.d.ts.map +1 -1
  993. package/dist/services/subagents/subagent-manager.d.ts +40 -7
  994. package/dist/services/subagents/subagent-manager.d.ts.map +1 -1
  995. package/dist/services/subagents/subagent-manager.js +47 -1
  996. package/dist/services/subagents/subagent-manager.js.map +1 -1
  997. package/dist/services/subagents/subagent-notification-store.d.ts +112 -28
  998. package/dist/services/subagents/subagent-notification-store.d.ts.map +1 -1
  999. package/dist/services/subagents/subagent-notification-store.js +197 -47
  1000. package/dist/services/subagents/subagent-notification-store.js.map +1 -1
  1001. package/dist/services/subagents/subagent-run-control.d.ts +41 -0
  1002. package/dist/services/subagents/subagent-run-control.d.ts.map +1 -0
  1003. package/dist/services/subagents/subagent-run-control.js +166 -0
  1004. package/dist/services/subagents/subagent-run-control.js.map +1 -0
  1005. package/dist/services/subagents/subagent-session.d.ts +12 -7
  1006. package/dist/services/subagents/subagent-session.d.ts.map +1 -1
  1007. package/dist/services/subagents/subagent-session.js +13 -14
  1008. package/dist/services/subagents/subagent-session.js.map +1 -1
  1009. package/dist/services/subagents/test-helpers/subagent-manager-fixtures.d.ts +4 -5
  1010. package/dist/services/subagents/test-helpers/subagent-manager-fixtures.d.ts.map +1 -1
  1011. package/dist/services/subagents/test-helpers/subagent-manager-fixtures.js +66 -65
  1012. package/dist/services/subagents/test-helpers/subagent-manager-fixtures.js.map +1 -1
  1013. package/dist/services/subagents/tool-policy.d.ts +39 -17
  1014. package/dist/services/subagents/tool-policy.d.ts.map +1 -1
  1015. package/dist/services/subagents/tool-policy.js +209 -53
  1016. package/dist/services/subagents/tool-policy.js.map +1 -1
  1017. package/dist/services/subagents/types.d.ts +114 -2
  1018. package/dist/services/subagents/types.d.ts.map +1 -1
  1019. package/dist/services/subagents/types.js +2 -2
  1020. package/dist/services/subagents/types.js.map +1 -1
  1021. package/dist/services/subagents/utils.d.ts +8 -1
  1022. package/dist/services/subagents/utils.d.ts.map +1 -1
  1023. package/dist/services/subagents/utils.js +43 -16
  1024. package/dist/services/subagents/utils.js.map +1 -1
  1025. package/dist/services/test-helpers/mock-stream.d.ts +3 -0
  1026. package/dist/services/test-helpers/mock-stream.d.ts.map +1 -1
  1027. package/dist/services/test-helpers/mock-stream.js +8 -0
  1028. package/dist/services/test-helpers/mock-stream.js.map +1 -1
  1029. package/dist/services/tool-execution-ledger.d.ts +2 -0
  1030. package/dist/services/tool-execution-ledger.d.ts.map +1 -1
  1031. package/dist/services/tool-execution-ledger.js +59 -81
  1032. package/dist/services/tool-execution-ledger.js.map +1 -1
  1033. package/dist/test-helpers/conversation-session-with-adapter.d.ts +1 -1
  1034. package/dist/test-helpers/conversation-session-with-adapter.d.ts.map +1 -1
  1035. package/dist/test-helpers/conversation-session-with-adapter.js +5 -1
  1036. package/dist/test-helpers/conversation-session-with-adapter.js.map +1 -1
  1037. package/dist/test-helpers/ink-testing.d.ts.map +1 -1
  1038. package/dist/test-helpers/ink-testing.js +2 -1
  1039. package/dist/test-helpers/ink-testing.js.map +1 -1
  1040. package/dist/tools/agent/activate-skill.d.ts +6 -1
  1041. package/dist/tools/agent/activate-skill.d.ts.map +1 -1
  1042. package/dist/tools/agent/activate-skill.js.map +1 -1
  1043. package/dist/tools/agent/ask-mentor.d.ts +1 -1
  1044. package/dist/tools/agent/ask-mentor.d.ts.map +1 -1
  1045. package/dist/tools/agent/ask-mentor.js.map +1 -1
  1046. package/dist/tools/agent/ask-orchestrator.d.ts +11 -0
  1047. package/dist/tools/agent/ask-orchestrator.d.ts.map +1 -0
  1048. package/dist/tools/agent/ask-orchestrator.js +39 -0
  1049. package/dist/tools/agent/ask-orchestrator.js.map +1 -0
  1050. package/dist/tools/agent/ask-user-constants.d.ts +6 -0
  1051. package/dist/tools/agent/ask-user-constants.d.ts.map +1 -1
  1052. package/dist/tools/agent/ask-user-constants.js +6 -0
  1053. package/dist/tools/agent/ask-user-constants.js.map +1 -1
  1054. package/dist/tools/agent/run-subagent-async.d.ts +46 -4
  1055. package/dist/tools/agent/run-subagent-async.d.ts.map +1 -1
  1056. package/dist/tools/agent/run-subagent-async.js +220 -33
  1057. package/dist/tools/agent/run-subagent-async.js.map +1 -1
  1058. package/dist/tools/agent/run-subagent.d.ts +28 -14
  1059. package/dist/tools/agent/run-subagent.d.ts.map +1 -1
  1060. package/dist/tools/agent/run-subagent.js +173 -68
  1061. package/dist/tools/agent/run-subagent.js.map +1 -1
  1062. package/dist/tools/file/apply-patch.d.ts +3 -1
  1063. package/dist/tools/file/apply-patch.d.ts.map +1 -1
  1064. package/dist/tools/file/apply-patch.js +34 -10
  1065. package/dist/tools/file/apply-patch.js.map +1 -1
  1066. package/dist/tools/file/code-context.d.ts +3 -2
  1067. package/dist/tools/file/code-context.d.ts.map +1 -1
  1068. package/dist/tools/file/code-context.js +5 -5
  1069. package/dist/tools/file/code-context.js.map +1 -1
  1070. package/dist/tools/file/create-file.d.ts +4 -2
  1071. package/dist/tools/file/create-file.d.ts.map +1 -1
  1072. package/dist/tools/file/create-file.js +10 -7
  1073. package/dist/tools/file/create-file.js.map +1 -1
  1074. package/dist/tools/file/edit-healing.d.ts.map +1 -1
  1075. package/dist/tools/file/edit-healing.js +54 -35
  1076. package/dist/tools/file/edit-healing.js.map +1 -1
  1077. package/dist/tools/file/glob-target.d.ts +12 -0
  1078. package/dist/tools/file/glob-target.d.ts.map +1 -0
  1079. package/dist/tools/file/glob-target.js +22 -0
  1080. package/dist/tools/file/glob-target.js.map +1 -0
  1081. package/dist/tools/file/glob.d.ts +9 -2
  1082. package/dist/tools/file/glob.d.ts.map +1 -1
  1083. package/dist/tools/file/glob.js +12 -16
  1084. package/dist/tools/file/glob.js.map +1 -1
  1085. package/dist/tools/file/grep.d.ts +9 -1
  1086. package/dist/tools/file/grep.d.ts.map +1 -1
  1087. package/dist/tools/file/grep.js +75 -13
  1088. package/dist/tools/file/grep.js.map +1 -1
  1089. package/dist/tools/file/read-file.d.ts +7 -1
  1090. package/dist/tools/file/read-file.d.ts.map +1 -1
  1091. package/dist/tools/file/read-file.js +3 -4
  1092. package/dist/tools/file/read-file.js.map +1 -1
  1093. package/dist/tools/file/search-replace.d.ts +5 -3
  1094. package/dist/tools/file/search-replace.d.ts.map +1 -1
  1095. package/dist/tools/file/search-replace.js +29 -19
  1096. package/dist/tools/file/search-replace.js.map +1 -1
  1097. package/dist/tools/format-helpers.d.ts +4 -3
  1098. package/dist/tools/format-helpers.d.ts.map +1 -1
  1099. package/dist/tools/format-helpers.js +16 -17
  1100. package/dist/tools/format-helpers.js.map +1 -1
  1101. package/dist/tools/memory/memory-tools.d.ts.map +1 -1
  1102. package/dist/tools/memory/memory-tools.js +61 -49
  1103. package/dist/tools/memory/memory-tools.js.map +1 -1
  1104. package/dist/tools/run-agent-workflow.d.ts +1 -1
  1105. package/dist/tools/run-agent-workflow.d.ts.map +1 -1
  1106. package/dist/tools/system/shell.d.ts +39 -3
  1107. package/dist/tools/system/shell.d.ts.map +1 -1
  1108. package/dist/tools/system/shell.js +380 -149
  1109. package/dist/tools/system/shell.js.map +1 -1
  1110. package/dist/tools/types.d.ts +102 -5
  1111. package/dist/tools/types.d.ts.map +1 -1
  1112. package/dist/tools/types.js +4 -1
  1113. package/dist/tools/types.js.map +1 -1
  1114. package/dist/tools/utils.d.ts +18 -0
  1115. package/dist/tools/utils.d.ts.map +1 -1
  1116. package/dist/tools/utils.js +78 -0
  1117. package/dist/tools/utils.js.map +1 -1
  1118. package/dist/tools/web/web-fetch.d.ts +1 -1
  1119. package/dist/tools/web/web-fetch.d.ts.map +1 -1
  1120. package/dist/tools/web/web-fetch.js.map +1 -1
  1121. package/dist/tools/web/web-search.d.ts +1 -1
  1122. package/dist/tools/web/web-search.d.ts.map +1 -1
  1123. package/dist/tools/web/web-search.js.map +1 -1
  1124. package/dist/types/message.d.ts +2 -0
  1125. package/dist/types/message.d.ts.map +1 -1
  1126. package/dist/types/message.js.map +1 -1
  1127. package/dist/utils/ai/model-settings.d.ts.map +1 -1
  1128. package/dist/utils/ai/model-settings.js +0 -6
  1129. package/dist/utils/ai/model-settings.js.map +1 -1
  1130. package/dist/utils/ai/token-usage.d.ts +10 -5
  1131. package/dist/utils/ai/token-usage.d.ts.map +1 -1
  1132. package/dist/utils/ai/token-usage.js +48 -35
  1133. package/dist/utils/ai/token-usage.js.map +1 -1
  1134. package/dist/utils/apply-diff.d.ts +3 -0
  1135. package/dist/utils/apply-diff.d.ts.map +1 -0
  1136. package/dist/utils/apply-diff.js +192 -0
  1137. package/dist/utils/apply-diff.js.map +1 -0
  1138. package/dist/utils/conversation/conversation-event-handler.d.ts.map +1 -1
  1139. package/dist/utils/conversation/conversation-event-handler.js +72 -13
  1140. package/dist/utils/conversation/conversation-event-handler.js.map +1 -1
  1141. package/dist/utils/conversation/conversation-utils.d.ts +5 -0
  1142. package/dist/utils/conversation/conversation-utils.d.ts.map +1 -1
  1143. package/dist/utils/conversation/conversation-utils.js +1 -0
  1144. package/dist/utils/conversation/conversation-utils.js.map +1 -1
  1145. package/dist/utils/conversation/message-utils.d.ts +6 -0
  1146. package/dist/utils/conversation/message-utils.d.ts.map +1 -1
  1147. package/dist/utils/conversation/message-utils.js +17 -14
  1148. package/dist/utils/conversation/message-utils.js.map +1 -1
  1149. package/dist/utils/conversation/rewind-items.d.ts +32 -0
  1150. package/dist/utils/conversation/rewind-items.d.ts.map +1 -0
  1151. package/dist/utils/conversation/rewind-items.js +33 -0
  1152. package/dist/utils/conversation/rewind-items.js.map +1 -0
  1153. package/dist/utils/inject-warning-into-tool-output.d.ts +10 -0
  1154. package/dist/utils/inject-warning-into-tool-output.d.ts.map +1 -1
  1155. package/dist/utils/inject-warning-into-tool-output.js +17 -0
  1156. package/dist/utils/inject-warning-into-tool-output.js.map +1 -1
  1157. package/dist/utils/settings-command.d.ts.map +1 -1
  1158. package/dist/utils/settings-command.js +41 -4
  1159. package/dist/utils/settings-command.js.map +1 -1
  1160. package/dist/utils/shell/command-logger.js.map +1 -1
  1161. package/dist/utils/shell/command-safety/find-helpers.d.ts +3 -2
  1162. package/dist/utils/shell/command-safety/find-helpers.d.ts.map +1 -1
  1163. package/dist/utils/shell/command-safety/find-helpers.js +34 -17
  1164. package/dist/utils/shell/command-safety/find-helpers.js.map +1 -1
  1165. package/dist/utils/shell/command-safety/handlers/find-handler.d.ts.map +1 -1
  1166. package/dist/utils/shell/command-safety/handlers/find-handler.js +0 -2
  1167. package/dist/utils/shell/command-safety/handlers/find-handler.js.map +1 -1
  1168. package/dist/utils/shell/command-safety/handlers/git-handler.d.ts.map +1 -1
  1169. package/dist/utils/shell/command-safety/handlers/git-handler.js.map +1 -1
  1170. package/dist/utils/shell/command-safety/handlers/sed-handler.d.ts.map +1 -1
  1171. package/dist/utils/shell/command-safety/handlers/sed-handler.js +14 -9
  1172. package/dist/utils/shell/command-safety/handlers/sed-handler.js.map +1 -1
  1173. package/dist/utils/shell/command-safety/handlers/types.d.ts +5 -4
  1174. package/dist/utils/shell/command-safety/handlers/types.d.ts.map +1 -1
  1175. package/dist/utils/shell/command-safety/index.d.ts.map +1 -1
  1176. package/dist/utils/shell/command-safety/index.js +212 -88
  1177. package/dist/utils/shell/command-safety/index.js.map +1 -1
  1178. package/dist/utils/shell/command-safety/utils.d.ts +2 -1
  1179. package/dist/utils/shell/command-safety/utils.d.ts.map +1 -1
  1180. package/dist/utils/shell/command-safety/utils.js +5 -5
  1181. package/dist/utils/shell/command-safety/utils.js.map +1 -1
  1182. package/dist/utils/shell/execute-shell.d.ts +24 -3
  1183. package/dist/utils/shell/execute-shell.d.ts.map +1 -1
  1184. package/dist/utils/shell/execute-shell.js +228 -28
  1185. package/dist/utils/shell/execute-shell.js.map +1 -1
  1186. package/dist/utils/shell/sandbox/denied-read-stores.d.ts +1 -8
  1187. package/dist/utils/shell/sandbox/denied-read-stores.d.ts.map +1 -1
  1188. package/dist/utils/shell/sandbox/denied-read-stores.js +1 -8
  1189. package/dist/utils/shell/sandbox/denied-read-stores.js.map +1 -1
  1190. package/dist/utils/shell/sandbox/docker-host-control-grants.d.ts +36 -6
  1191. package/dist/utils/shell/sandbox/docker-host-control-grants.d.ts.map +1 -1
  1192. package/dist/utils/shell/sandbox/docker-host-control-grants.js +47 -17
  1193. package/dist/utils/shell/sandbox/docker-host-control-grants.js.map +1 -1
  1194. package/dist/utils/shell/sandbox/sandbox-network-approval-coordinator.d.ts +21 -0
  1195. package/dist/utils/shell/sandbox/sandbox-network-approval-coordinator.d.ts.map +1 -0
  1196. package/dist/utils/shell/sandbox/sandbox-network-approval-coordinator.js +66 -0
  1197. package/dist/utils/shell/sandbox/sandbox-network-approval-coordinator.js.map +1 -0
  1198. package/dist/utils/shell/shell-session.js.map +1 -1
  1199. package/dist/utils/slash-command-dispatch.d.ts +21 -0
  1200. package/dist/utils/slash-command-dispatch.d.ts.map +1 -0
  1201. package/dist/utils/slash-command-dispatch.js +34 -0
  1202. package/dist/utils/slash-command-dispatch.js.map +1 -0
  1203. package/dist/utils/streaming/extract-command-messages.d.ts.map +1 -1
  1204. package/dist/utils/streaming/extract-command-messages.js +29 -51
  1205. package/dist/utils/streaming/extract-command-messages.js.map +1 -1
  1206. package/dist/utils/value-suggestions.d.ts.map +1 -1
  1207. package/dist/utils/value-suggestions.js +0 -8
  1208. package/dist/utils/value-suggestions.js.map +1 -1
  1209. package/package.json +21 -19
  1210. package/dist/commands/retry-command.d.ts +0 -20
  1211. package/dist/commands/retry-command.d.ts.map +0 -1
  1212. package/dist/commands/retry-command.js +0 -39
  1213. package/dist/commands/retry-command.js.map +0 -1
  1214. package/dist/commands/undo-command.d.ts +0 -15
  1215. package/dist/commands/undo-command.d.ts.map +0 -1
  1216. package/dist/commands/undo-command.js +0 -28
  1217. package/dist/commands/undo-command.js.map +0 -1
  1218. package/dist/components/input/PopupManager.d.ts +0 -88
  1219. package/dist/components/input/PopupManager.d.ts.map +0 -1
  1220. package/dist/components/input/PopupManager.js +0 -21
  1221. package/dist/components/input/PopupManager.js.map +0 -1
  1222. package/dist/components/input/popup-key-navigation.d.ts +0 -18
  1223. package/dist/components/input/popup-key-navigation.d.ts.map +0 -1
  1224. package/dist/components/input/popup-key-navigation.js +0 -16
  1225. package/dist/components/input/popup-key-navigation.js.map +0 -1
  1226. package/dist/components/input/popup-props.d.ts +0 -24
  1227. package/dist/components/input/popup-props.d.ts.map +0 -1
  1228. package/dist/components/input/popup-props.js +0 -72
  1229. package/dist/components/input/popup-props.js.map +0 -1
  1230. package/dist/components/menu/UndoSelectionMenu.d.ts +0 -12
  1231. package/dist/components/menu/UndoSelectionMenu.d.ts.map +0 -1
  1232. package/dist/components/menu/UndoSelectionMenu.js +0 -19
  1233. package/dist/components/menu/UndoSelectionMenu.js.map +0 -1
  1234. package/dist/hooks/use-mode-handlers.d.ts +0 -79
  1235. package/dist/hooks/use-mode-handlers.d.ts.map +0 -1
  1236. package/dist/hooks/use-mode-handlers.js +0 -183
  1237. package/dist/hooks/use-mode-handlers.js.map +0 -1
  1238. package/dist/hooks/use-pending-turn-guards.d.ts +0 -43
  1239. package/dist/hooks/use-pending-turn-guards.d.ts.map +0 -1
  1240. package/dist/hooks/use-pending-turn-guards.js +0 -120
  1241. package/dist/hooks/use-pending-turn-guards.js.map +0 -1
  1242. package/dist/hooks/use-trigger-detection.d.ts +0 -49
  1243. package/dist/hooks/use-trigger-detection.d.ts.map +0 -1
  1244. package/dist/hooks/use-trigger-detection.js +0 -104
  1245. package/dist/hooks/use-trigger-detection.js.map +0 -1
  1246. package/dist/hooks/use-undo-selection.d.ts +0 -23
  1247. package/dist/hooks/use-undo-selection.d.ts.map +0 -1
  1248. package/dist/hooks/use-undo-selection.js.map +0 -1
  1249. package/dist/lib/agent-run-orchestrator.d.ts +0 -38
  1250. package/dist/lib/agent-run-orchestrator.d.ts.map +0 -1
  1251. package/dist/lib/agent-run-orchestrator.js +0 -266
  1252. package/dist/lib/agent-run-orchestrator.js.map +0 -1
  1253. package/dist/lib/retry-executor.d.ts +0 -16
  1254. package/dist/lib/retry-executor.d.ts.map +0 -1
  1255. package/dist/lib/retry-executor.js +0 -53
  1256. package/dist/lib/retry-executor.js.map +0 -1
  1257. package/dist/lib/runner-manager.d.ts +0 -22
  1258. package/dist/lib/runner-manager.d.ts.map +0 -1
  1259. package/dist/lib/runner-manager.js +0 -56
  1260. package/dist/lib/runner-manager.js.map +0 -1
  1261. package/dist/prompts/shell-sandbox.md +0 -18
  1262. package/dist/prompts/simple.md +0 -53
  1263. package/dist/prompts/simple_prev.md +0 -33
  1264. package/dist/prompts/simple_v2.md +0 -84
  1265. package/dist/prompts/simple_v3.md +0 -267
  1266. package/dist/prompts/subagents/researcher.md +0 -40
  1267. package/dist/providers/ai-sdk-agents-adapter.d.ts +0 -7
  1268. package/dist/providers/ai-sdk-agents-adapter.d.ts.map +0 -1
  1269. package/dist/providers/ai-sdk-agents-adapter.js +0 -80
  1270. package/dist/providers/ai-sdk-agents-adapter.js.map +0 -1
  1271. package/dist/providers/fallback-responses-model.d.ts +0 -46
  1272. package/dist/providers/fallback-responses-model.d.ts.map +0 -1
  1273. package/dist/providers/fallback-responses-model.js +0 -296
  1274. package/dist/providers/fallback-responses-model.js.map +0 -1
  1275. package/dist/services/stream-event-parsing.d.ts +0 -4
  1276. package/dist/services/stream-event-parsing.d.ts.map +0 -1
  1277. package/dist/services/stream-event-parsing.js +0 -79
  1278. package/dist/services/stream-event-parsing.js.map +0 -1
@@ -1,12 +1,12 @@
1
1
  import { describeError, isAbortLikeError } from '../../utils/error-helpers.js';
2
- import { ASK_USER_DECLINE_RESULT } from '../../tools/agent/ask-user-constants.js';
3
2
  import { createMessageIdFactory } from '../../utils/message-id-factory.js';
4
3
  import { isUserMessage } from '../../types/message.js';
5
4
  import { isDeniedReadApproveAnswer } from '../../contracts/conversation.js';
6
5
  import { createStreamingSession } from '../../utils/streaming/streaming-session-factory.js';
7
6
  import { enhanceApiKeyError, isMaxTurnsError } from '../../utils/conversation/conversation-utils.js';
8
7
  import { clearStreamingBotMessage, computeNextMessages } from '../../utils/conversation/apply-conversation-result.js';
9
- import { countUndoableUserTurnsFrom, findLastUndoableUserMessage, trimTrailingAssistantMessages, } from '../../utils/conversation/message-utils.js';
8
+ import { trimTrailingAssistantMessages } from '../../utils/conversation/message-utils.js';
9
+ import { ASK_USER_NO_ANSWER_RESULT } from '../../tools/agent/ask-user-constants.js';
10
10
  import { annotateApprovedCommandMessage, filterPendingCommandMessagesForApproval, } from '../approval/approval-presentation-policy.js';
11
11
  import { formatUserTurnForDisplay, hasUserTurnContent, injectSkillIntoTurn, normalizeUserTurn, } from '../../types/user-turn.js';
12
12
  const REASONING_RESPONSE_THROTTLE_MS = 200;
@@ -16,34 +16,161 @@ const REASONING_RESPONSE_THROTTLE_MS = 200;
16
16
  * by reference rather than inlined.
17
17
  */
18
18
  function formatBackgroundSubagentNotifications(notifications) {
19
- const noun = notifications.length === 1 ? 'run' : 'runs';
20
- const entries = notifications.map((notification) => {
19
+ const completions = notifications.filter((notification) => notification.kind === 'completion');
20
+ const questions = notifications.filter((notification) => notification.kind === 'question');
21
+ const shellCompletions = notifications.filter((notification) => notification.kind === 'shell_completion');
22
+ const userControls = notifications.filter((notification) => notification.kind === 'user_control');
23
+ const sections = [];
24
+ if (completions.length > 0) {
25
+ const noun = completions.length === 1 ? 'run' : 'runs';
26
+ const entries = completions.map((notification) => {
27
+ const lines = [
28
+ `- runId: ${notification.runId} | role: ${notification.role} | status: ${notification.status}`,
29
+ ...(notification.error ? [` error: ${notification.error}`] : []),
30
+ ' result:',
31
+ notification.formattedResult
32
+ .split('\n')
33
+ .map((line) => ` ${line}`)
34
+ .join('\n'),
35
+ ];
36
+ return lines.join('\n');
37
+ });
38
+ sections.push([
39
+ `Background subagent ${noun} finished (${completions.length}). This is an automatic system notification, not a user message.`,
40
+ '',
41
+ ...entries,
42
+ '',
43
+ 'The full result is inlined above; you do not need to call get_subagent_result. Assess it against the task before you accept it, then continue through the next necessary steps yourself rather than stopping at the fact that a run finished. Tell the user concisely, in your own words, what you concluded — the report is input to your judgement, not a message to relay.',
44
+ ].join('\n'));
45
+ }
46
+ if (questions.length > 0) {
47
+ const entries = questions.map((notification) => {
48
+ const target = notification.name ?? notification.runId;
49
+ return [
50
+ `- messageId: ${notification.messageId} | target: ${target} | runId: ${notification.runId} | role: ${notification.role}`,
51
+ ` question: ${notification.question}`,
52
+ ].join('\n');
53
+ });
54
+ sections.push([
55
+ `Background subagent question${questions.length === 1 ? '' : 's'} pending (${questions.length}). This is an automatic system notification, not a user message.`,
56
+ '',
57
+ ...entries,
58
+ '',
59
+ 'Decide the answer, investigate it yourself, or escalate to the user if needed. To answer a specific waiting subagent, call send_message({ target, reply_to: messageId, message }). The subagent has no direct user channel; an answer resumes only its waiting tool call.',
60
+ ].join('\n'));
61
+ }
62
+ if (shellCompletions.length > 0) {
63
+ const noun = shellCompletions.length === 1 ? 'job' : 'jobs';
64
+ const entries = shellCompletions.map((notification) => [
65
+ `- jobId: ${notification.jobId} | command: ${notification.command} | status: ${notification.status}`,
66
+ ...(notification.error ? [` error: ${notification.error}`] : []),
67
+ ' output:',
68
+ notification.output
69
+ .split('\n')
70
+ .map((line) => ` ${line}`)
71
+ .join('\n'),
72
+ ].join('\n'));
73
+ sections.push([
74
+ `Background shell ${noun} finished (${shellCompletions.length}). This is an automatic system notification, not a user message.`,
75
+ '',
76
+ ...entries,
77
+ '',
78
+ 'Assess the command result against the task and continue through the next necessary steps. Tell the user concisely, in your own words, what you concluded.',
79
+ ].join('\n'));
80
+ }
81
+ if (userControls.length > 0) {
82
+ const stopControls = userControls.filter((notification) => notification.action === 'stop');
83
+ const backgroundMoves = userControls.filter((notification) => notification.action === 'background');
84
+ const entriesFor = (notifications, verb) => notifications.map((notification) => {
85
+ const details = notification.details;
86
+ return details.kind === 'subagent'
87
+ ? `- ${verb} background subagent ${details.name ?? details.id} | runId: ${details.id} | role: ${details.role} | task: ${details.task}`
88
+ : `- ${verb} background shell | jobId: ${details.id} | command: ${details.command}`;
89
+ });
90
+ if (stopControls.length > 0) {
91
+ sections.push([
92
+ `The user requested that ${stopControls.length === 1 ? 'a background task be stopped' : 'background tasks be stopped'}. This is an automatic user control notification, not a user message.`,
93
+ '',
94
+ ...entriesFor(stopControls, 'stop requested for'),
95
+ '',
96
+ 'Plan the next step around the requested stop. The task may settle later with a cancelled completion notification; do not assume its result is available yet.',
97
+ ].join('\n'));
98
+ }
99
+ if (backgroundMoves.length > 0) {
100
+ sections.push([
101
+ `The user moved ${backgroundMoves.length === 1
102
+ ? 'a foreground shell into the background'
103
+ : 'foreground shells into the background'}. This is an automatic user control notification, not a user message.`,
104
+ '',
105
+ ...entriesFor(backgroundMoves, 'moved to'),
106
+ '',
107
+ 'The same execution continues running in the background. Plan the next step without waiting for it, and do not stop or relaunch it unless the task now requires that.',
108
+ ].join('\n'));
109
+ }
110
+ }
111
+ return sections.join('\n\n');
112
+ }
113
+ /** The user-facing companion to the model-only background notification instruction. */
114
+ function formatBackgroundSubagentNotificationDisplay(notifications) {
115
+ return notifications
116
+ .map((notification) => {
117
+ if (notification.kind === 'question') {
118
+ const target = notification.name ?? notification.runId;
119
+ return [
120
+ `messageId: ${notification.messageId} | target: ${target} | runId: ${notification.runId} | role: ${notification.role}`,
121
+ `question: ${notification.question}`,
122
+ ].join('\n');
123
+ }
124
+ if (notification.kind === 'shell_completion') {
125
+ return [
126
+ `- jobId: ${notification.jobId} | command: ${notification.command} | status: ${notification.status}`,
127
+ ...(notification.error ? [` error: ${notification.error}`] : []),
128
+ ...(notification.output ? [` output: ${notification.output}`] : []),
129
+ ].join('\n');
130
+ }
131
+ if (notification.kind === 'user_control') {
132
+ const details = notification.details;
133
+ if (notification.action === 'background') {
134
+ return details.kind === 'subagent'
135
+ ? `Moved to background: ${details.name ?? details.id} (${details.role})`
136
+ : `Moved to background: shell ${details.command}`;
137
+ }
138
+ return details.kind === 'subagent'
139
+ ? `Stop requested: background ${details.name ?? details.id} (${details.role})`
140
+ : `Stop requested: shell ${details.command}`;
141
+ }
21
142
  const lines = [
22
143
  `- runId: ${notification.runId} | role: ${notification.role} | status: ${notification.status}`,
23
144
  ...(notification.error ? [` error: ${notification.error}`] : []),
24
145
  ...(notification.preview ? [` preview: ${notification.preview}`] : []),
25
146
  ];
26
147
  return lines.join('\n');
27
- });
28
- return [
29
- `Background subagent ${noun} finished (${notifications.length}). This is an automatic system notification, not a user message.`,
30
- '',
31
- ...entries,
32
- '',
33
- 'Call get_subagent_result(runId) for the full report, then give the user one concise completion notification.',
34
- ].join('\n');
148
+ })
149
+ .join('\n\n');
35
150
  }
36
151
  export class ConversationOrchestrator {
37
152
  config;
38
- pendingApproval = null;
39
- askUserAnswers = [];
40
- currentAskUserQuestionIndex = 0;
41
153
  createMessageId;
42
154
  #directlyAppendedMessageIds = new Set();
155
+ #displayedBackgroundNotificationMessageIds = new Set();
43
156
  /**
44
- * Turns this orchestrator currently owns. `ui.onTurnStart` cannot be counted
45
- * instead: the queue observer emits it unbalanced when a queued submission is
46
- * popped after the preceding turn already ended.
157
+ * Deferred queue submissions register an activator here. The orchestrator does
158
+ * not count them as active turns until the queue actually starts executing
159
+ * them — remove/discard/reject must not require a matching `#endTurn`.
160
+ */
161
+ #deferredTurnActivators = new Map();
162
+ /**
163
+ * A pending steer retracted through the id-addressed mutation path. The
164
+ * adapter intentionally keeps the shared steer API boolean, so this marker
165
+ * distinguishes a deliberate retraction from an ordinary failed steer.
166
+ */
167
+ #retractedSteerIds = new Set();
168
+ /** Latest user turn for a pending steer edited before admission. */
169
+ #editedSteerTurns = new Map();
170
+ /**
171
+ * Turns this orchestrator currently owns. Count only executions that have
172
+ * actually started (direct submit or queue-start activation), never merely
173
+ * queued awaits.
47
174
  */
48
175
  #activeTurns = 0;
49
176
  /** True while {@link stopProcessing} is tearing the conversation down. */
@@ -63,11 +190,19 @@ export class ConversationOrchestrator {
63
190
  // indicator above the input box.
64
191
  if (typeof config.conversationService.setQueuedTurnStartObserver === 'function') {
65
192
  config.conversationService.setQueuedTurnStartObserver((execution) => {
193
+ if (execution.suppressUserMessageDisplay) {
194
+ return;
195
+ }
196
+ // Deferred submissions activate their orchestrator turn here — the only
197
+ // moment a queued await becomes an owned execution.
198
+ const activateDeferred = this.#deferredTurnActivators.get(execution.requestId);
199
+ if (activateDeferred) {
200
+ activateDeferred();
201
+ }
66
202
  const wasAlreadyStarted = this.moveQueuedMessageIntoList(execution.requestId, execution.input);
67
- if (!wasAlreadyStarted) {
68
- // A queued submission's original turn-start may have been balanced
69
- // by the preceding turn completing. Reassert processing when this
70
- // turn actually becomes the queue head.
203
+ if (!wasAlreadyStarted && !activateDeferred) {
204
+ // Recovered or test-only starts without a deferred activator still need
205
+ // the processing indicator when the message enters the transcript.
71
206
  config.ui.onTurnStart();
72
207
  }
73
208
  });
@@ -87,17 +222,14 @@ export class ConversationOrchestrator {
87
222
  getSubagentUsage() {
88
223
  return this.config.subagentUsageAccumulator?.get() ?? null;
89
224
  }
225
+ getCostSummary() {
226
+ return this.config.costAccumulator?.getSummary() ?? null;
227
+ }
90
228
  goToPreviousQuestion() {
91
- if (this.currentAskUserQuestionIndex <= 0) {
92
- return;
93
- }
94
- this.currentAskUserQuestionIndex -= 1;
95
- this.askUserAnswers.pop();
96
- this.config.ui.onAskUserGoBack(this.currentAskUserQuestionIndex, this.askUserAnswers.slice());
229
+ this.config.conversationService.goToPreviousPendingInteractionQuestion?.();
97
230
  }
98
231
  goToNextQuestion() {
99
- this.currentAskUserQuestionIndex += 1;
100
- this.config.ui.onAskUserAdvanceToNext(this.currentAskUserQuestionIndex);
232
+ this.config.conversationService.goToNextPendingInteractionQuestion?.();
101
233
  }
102
234
  async clearConversation() {
103
235
  if (this.config.onClear) {
@@ -108,12 +240,15 @@ export class ConversationOrchestrator {
108
240
  }
109
241
  this.config.messages.setMessages(() => []);
110
242
  this.config.approvedContext.current = null;
111
- this.pendingApproval = null;
112
- this.resetAskUserState();
243
+ this.config.conversationService.clearPendingInteraction?.();
113
244
  this.config.ui.onResetAll();
114
245
  this.config.usageAccumulator?.reset();
115
246
  this.config.subagentUsageAccumulator?.reset();
247
+ this.config.costAccumulator?.reset();
116
248
  this.#directlyAppendedMessageIds.clear();
249
+ this.#displayedBackgroundNotificationMessageIds.clear();
250
+ this.#retractedSteerIds.clear();
251
+ this.#editedSteerTurns.clear();
117
252
  }
118
253
  stopProcessing() {
119
254
  // The user asked everything to stop, so background subagent runs go too.
@@ -130,60 +265,68 @@ export class ConversationOrchestrator {
130
265
  ? { ...message, status: 'aborted' }
131
266
  : message));
132
267
  this.config.approvedContext.current = null;
133
- this.pendingApproval = null;
134
- this.resetAskUserState();
268
+ this.config.conversationService.clearPendingInteraction?.();
135
269
  this.config.ui.onResetTransient();
136
270
  this.#directlyAppendedMessageIds.clear();
271
+ this.#displayedBackgroundNotificationMessageIds.clear();
272
+ this.#retractedSteerIds.clear();
273
+ this.#editedSteerTurns.clear();
137
274
  this.config.conversationService.backgroundSubagentNotifications?.drain();
138
275
  }
139
276
  finally {
140
277
  this.#stoppingByUser = false;
141
278
  }
142
279
  }
143
- undoLastUserMessage() {
144
- const messages = this.config.messages.getMessages();
145
- const lastUserIndex = findLastUndoableUserMessage(messages);
146
- if (lastUserIndex === -1) {
280
+ /**
281
+ * Rewind through an opaque store target. `uiIndex` is used only to trim the
282
+ * rendered projection after the domain operation accepted the same target.
283
+ */
284
+ rewindToTarget(targetId, uiIndex) {
285
+ const restored = this.config.conversationService.rewindToTarget(targetId);
286
+ if (restored === null)
147
287
  return null;
148
- }
149
- const lastUserMessage = messages[lastUserIndex];
150
- const uiText = isUserMessage(lastUserMessage) ? lastUserMessage.text : '';
288
+ // Keep rewind's historical foreground-only cancellation behavior, but do
289
+ // not abort an active turn for a stale picker target that the store rejects.
151
290
  this.config.conversationService.abort();
152
- const removed = this.config.conversationService.undoLastUserTurn();
153
- const restored = removed ?? { text: uiText };
154
- this.config.messages.setMessages((prev) => prev.slice(0, lastUserIndex));
291
+ this.config.messages.setMessages((prev) => prev.slice(0, uiIndex));
155
292
  this.config.approvedContext.current = null;
156
- this.pendingApproval = null;
157
- this.resetAskUserState();
293
+ this.config.conversationService.clearPendingInteraction?.();
158
294
  this.config.ui.onResetTransient();
159
295
  this.#directlyAppendedMessageIds.clear();
296
+ this.#displayedBackgroundNotificationMessageIds.clear();
160
297
  return restored;
161
298
  }
162
- /**
163
- * Cancel the most recently queued message and return its text so the UI
164
- * can move it back into the input box. Returns null when there are no
165
- * pending queued messages, the service cannot cancel the tail item, or the
166
- * service does not implement cancellation.
167
- */
168
- async removeLastQueuedPendingMessage() {
299
+ async retractPendingSubmission(id) {
169
300
  const service = this.config.conversationService;
170
- if (typeof service.removeLastQueuedItem !== 'function') {
171
- return null;
301
+ if (typeof service.retractSubmission !== 'function')
302
+ return { kind: 'unknown_id' };
303
+ const result = await service.retractSubmission(id);
304
+ if (result.kind === 'applied') {
305
+ if (result.stage === 'pending_steer') {
306
+ this.#retractedSteerIds.add(id);
307
+ this.#editedSteerTurns.delete(id);
308
+ }
309
+ this.config.ui.onQueuedMessageRemoved?.(id);
172
310
  }
173
- const result = await service.removeLastQueuedItem();
174
- if (!result)
175
- return null;
176
- // The pending indicator above the input box is managed by the UI. The
177
- // adapter already removed the matching internal entry, but the UI state
178
- // is still showing it until we tell it to drop the last entry.
179
- this.config.ui.onRemoveLastPendingMessage?.();
180
- return result.text;
311
+ return result;
312
+ }
313
+ async editPendingSubmission(id, turn) {
314
+ const service = this.config.conversationService;
315
+ if (typeof service.editSubmission !== 'function')
316
+ return { kind: 'unknown_id' };
317
+ const result = await service.editSubmission(id, turn);
318
+ if (result.kind === 'applied') {
319
+ if (result.stage === 'pending_steer') {
320
+ this.#editedSteerTurns.set(id, structuredClone(normalizeUserTurn(turn)));
321
+ }
322
+ this.config.ui.onQueuedMessageEdited?.(id, formatUserTurnForDisplay(normalizeUserTurn(turn)));
323
+ }
324
+ return result;
181
325
  }
182
326
  async retryLastToolOutput() {
183
327
  this.config.conversationService.abort();
184
328
  this.config.approvedContext.current = null;
185
- this.pendingApproval = null;
186
- this.resetAskUserState();
329
+ this.config.conversationService.clearPendingInteraction?.();
187
330
  this.config.ui.onResetTransient();
188
331
  if (!this.config.conversationService.peekLastToolOutput()) {
189
332
  return false;
@@ -210,7 +353,6 @@ export class ConversationOrchestrator {
210
353
  }
211
354
  const errorMessage = enhanceApiKeyError(describeError(error));
212
355
  this.appendBotError(errorMessage);
213
- this.config.ui.onApprovalResolved();
214
356
  return true;
215
357
  }
216
358
  finally {
@@ -220,25 +362,6 @@ export class ConversationOrchestrator {
220
362
  this.#endTurn();
221
363
  }
222
364
  }
223
- undoToUserMessage(uiIndex) {
224
- const messages = this.config.messages.getMessages();
225
- const undoCount = countUndoableUserTurnsFrom(messages, uiIndex);
226
- if (undoCount === 0) {
227
- return null;
228
- }
229
- const selectedMessage = messages[uiIndex];
230
- const uiText = isUserMessage(selectedMessage) ? selectedMessage.text : '';
231
- this.config.conversationService.abort();
232
- const removed = this.config.conversationService.undoNUserTurns(undoCount);
233
- const restored = removed?.text ?? uiText;
234
- this.config.messages.setMessages((prev) => prev.slice(0, uiIndex));
235
- this.config.approvedContext.current = null;
236
- this.pendingApproval = null;
237
- this.resetAskUserState();
238
- this.config.ui.onResetTransient();
239
- this.#directlyAppendedMessageIds.clear();
240
- return restored;
241
- }
242
365
  async sendUserMessage(input, options) {
243
366
  const turn = normalizeUserTurn(input);
244
367
  if (!hasUserTurnContent(turn)) {
@@ -256,12 +379,83 @@ export class ConversationOrchestrator {
256
379
  // second append. When a turn is already in flight, show the message
257
380
  // above the input box until the queue actually starts processing it; the
258
381
  // message list will be updated when the queue pops this turn.
259
- const hasInflightTurn = this.config.conversationService.isQueueActive?.() ?? false;
260
- if (hasInflightTurn) {
261
- // A turn is already in flight. Show the message above the input box
262
- // until the queue actually starts processing it; the message list will
263
- // be updated when the queue pops this turn.
382
+ const queueOwnsSubmission = this.config.conversationService.isQueueOwningSubmissions?.() ??
383
+ this.config.conversationService.isQueueActive?.() ??
384
+ false;
385
+ // Logged before the branch below, not inside it. "Steer attempt resolved"
386
+ // only exists on the path that actually tries to steer, so a submission
387
+ // that never enters that path — because it arrived without busyMode
388
+ // 'steer', or because the queue did not claim it — is indistinguishable in
389
+ // the logs from one that was never submitted at all. That gap hid a real
390
+ // report of a steer silently queueing: the queue file held the message and
391
+ // the transcript held the user_message, and nothing recorded the decision
392
+ // in between. These four fields name that decision.
393
+ this.config.loggingService.info('Submission routing decided', {
394
+ busyMode: options?.busyMode ?? 'none',
395
+ queueOwnsSubmission,
396
+ queueStateKind: this.config.conversationService.queueStateKind?.() ?? 'unknown',
397
+ canSteer: Boolean(this.config.conversationService.steerActiveTurn),
398
+ messageId: userMessage.id,
399
+ });
400
+ if (queueOwnsSubmission) {
401
+ // A turn is already in flight or the queue is paused with retained work.
402
+ // Show the message above the input box until the queue actually starts
403
+ // processing it; the message list will be updated when the queue pops
404
+ // this turn.
264
405
  this.config.ui.onQueuedMessagePending?.(userMessage.id, userMessage.text);
406
+ // A steer belongs to the turn already running: hand it to that turn so
407
+ // the model reads it at its next request, rather than making the user
408
+ // wait for the whole turn to end. The message joins the transcript at the
409
+ // moment the turn takes it, which is when the model actually sees it.
410
+ if (options?.busyMode === 'steer' && this.config.conversationService.steerActiveTurn) {
411
+ // Diagnostics for "my steer just queued". The three fields below
412
+ // separate the ways delivery can fail, which otherwise look identical
413
+ // in the UI because the queued label is drawn before this even runs:
414
+ // queueActive=false → refused by the adapter's predicate;
415
+ // the queue owns the submission but is not in a state that offers
416
+ // steering (awaiting_preflight, paused, idle with retained work).
417
+ // queueActive=true, waited≈0ms → refused synchronously downstream:
418
+ // awaiting an approval, or no run in flight at the run loop.
419
+ // queueActive=true, waited>0ms → held as pending and released when
420
+ // the run ended: the turn never reached another request boundary.
421
+ // steered=true → admitted; waitedMs is how long the
422
+ // user waited for the turn to reach that boundary.
423
+ const queueActive = this.config.conversationService.isQueueActive?.() ?? false;
424
+ const queueStateKind = this.config.conversationService.queueStateKind?.() ?? 'unknown';
425
+ const steerStartedAt = Date.now();
426
+ const steered = await this.config.conversationService
427
+ .steerActiveTurn(turn, { id: userMessage.id })
428
+ .catch((error) => {
429
+ this.logError('Error steering the active turn', error);
430
+ return false;
431
+ });
432
+ this.config.loggingService.info('Steer attempt resolved', {
433
+ steered,
434
+ queueActive,
435
+ queueStateKind,
436
+ waitedMs: Date.now() - steerStartedAt,
437
+ messageId: userMessage.id,
438
+ });
439
+ if (steered) {
440
+ const admittedTurn = this.#editedSteerTurns.get(userMessage.id) ?? turn;
441
+ this.#editedSteerTurns.delete(userMessage.id);
442
+ const { skill: _originalSkill, ...messageWithoutSkill } = userMessage;
443
+ const admittedMessage = {
444
+ ...messageWithoutSkill,
445
+ text: formatUserTurnForDisplay(admittedTurn),
446
+ ...(admittedTurn.skill ? { skill: admittedTurn.skill } : {}),
447
+ };
448
+ this.config.ui.onQueuedMessageStarted?.(userMessage.id);
449
+ this.config.messages.appendMessages([admittedMessage]);
450
+ this.config.logWriter?.append({ type: 'user_message', message: { ...admittedMessage } });
451
+ return;
452
+ }
453
+ if (this.#retractedSteerIds.delete(userMessage.id)) {
454
+ this.#editedSteerTurns.delete(userMessage.id);
455
+ return;
456
+ }
457
+ this.#editedSteerTurns.delete(userMessage.id);
458
+ }
265
459
  }
266
460
  else {
267
461
  // No turn is in flight — append directly. The queue observer will also
@@ -270,13 +464,29 @@ export class ConversationOrchestrator {
270
464
  this.config.messages.appendMessages([userMessage]);
271
465
  this.#directlyAppendedMessageIds.add(userMessage.id);
272
466
  }
273
- this.config.logWriter?.append({ type: 'user_message', message: userMessage });
274
- const { botResponseUpdater, reasoningUpdater, applyConversationEvent, streamingState } = this.#beginTurn('sendUserMessage');
467
+ this.config.logWriter?.append({ type: 'user_message', message: { ...userMessage } });
468
+ // Streaming callbacks are bound at submit time, but deferred submissions
469
+ // must not count as active turns until the queue starts them. Otherwise
470
+ // remove/discard would need a matching endTurn for work that never ran.
471
+ let turnActivated = !queueOwnsSubmission;
472
+ const { botResponseUpdater, reasoningUpdater, applyConversationEvent, streamingState } = queueOwnsSubmission
473
+ ? this.createTurnSession('sendUserMessage')
474
+ : this.#beginTurn('sendUserMessage');
475
+ if (queueOwnsSubmission) {
476
+ this.#deferredTurnActivators.set(userMessage.id, () => {
477
+ if (turnActivated)
478
+ return;
479
+ turnActivated = true;
480
+ this.#activeTurns += 1;
481
+ this.config.ui.onTurnStart();
482
+ });
483
+ }
275
484
  try {
276
485
  const turnToSend = turn.skill ? injectSkillIntoTurn(turn) : turn;
277
486
  const result = await this.config.conversationService.sendMessage(turnToSend, {
278
487
  onEvent: this.createOnEventHandler(applyConversationEvent),
279
488
  bypassInputSurgeGuard: options?.bypassInputSurgeGuard,
489
+ busyMode: options?.busyMode,
280
490
  preferredMessageId: userMessage.id,
281
491
  });
282
492
  applyConversationEvent({ type: 'final', finalText: '' });
@@ -285,10 +495,21 @@ export class ConversationOrchestrator {
285
495
  }
286
496
  catch (error) {
287
497
  this.logError('Error in sendUserMessage', error);
498
+ if (queueOwnsSubmission) {
499
+ this.config.ui.onQueuedMessageRemoved?.(userMessage.id);
500
+ }
288
501
  if (isAbortLikeError(error)) {
289
502
  this.config.loggingService.debug('Suppressing abort error in sendUserMessage');
290
503
  return;
291
504
  }
505
+ // A submission that never left the pending queue produced no turn to
506
+ // report on, but it also produced no answer: the pending indicator has
507
+ // just been cleared, so saying nothing would make the user's text vanish
508
+ // without explanation. Report the rejection and hand the text back.
509
+ if (queueOwnsSubmission && !turnActivated) {
510
+ this.appendBotError(`${enhanceApiKeyError(describeError(error))}\n\nThis message was not sent: ${userMessage.text}`);
511
+ return;
512
+ }
292
513
  const rawErrorMessage = describeError(error);
293
514
  const errorMessage = enhanceApiKeyError(rawErrorMessage);
294
515
  const dropped = error?.rawEvent?.droppedUserMessage;
@@ -311,71 +532,44 @@ export class ConversationOrchestrator {
311
532
  rawInterruption: null,
312
533
  isMaxTurnsPrompt: true,
313
534
  };
314
- this.pendingApproval = pendingApproval;
535
+ this.config.conversationService.presentPendingInteraction?.(pendingApproval);
315
536
  this.config.ui.onApprovalRequested(pendingApproval);
316
537
  }
317
538
  else {
318
539
  this.appendBotError(errorMessage);
319
- this.config.ui.onApprovalResolved();
320
540
  }
321
541
  }
322
542
  finally {
323
543
  this.config.loggingService.debug('sendUserMessage finally block - resetting state');
544
+ this.#deferredTurnActivators.delete(userMessage.id);
324
545
  reasoningUpdater.flush();
325
546
  botResponseUpdater.cancel();
326
- this.#endTurn();
547
+ if (turnActivated) {
548
+ this.#endTurn();
549
+ }
327
550
  }
328
551
  }
329
- async handleApprovalDecision(answer, rejectionReason, approvalAnswer) {
330
- const pendingApproval = this.pendingApproval;
331
- if (!pendingApproval) {
552
+ async handleApprovalDecision(answer, rejectionReason, approvalAnswer, expectedInteractionId, options = {}) {
553
+ const resolution = this.config.conversationService.resolvePendingInteraction?.({
554
+ expectedInteractionId,
555
+ answer,
556
+ rejectionReason,
557
+ approvalAnswer,
558
+ });
559
+ if (!resolution || resolution.kind === 'none' || resolution.kind === 'stale_interaction') {
332
560
  return;
333
561
  }
562
+ if (resolution.kind === 'awaiting_next_question')
563
+ return;
564
+ const pendingApproval = resolution.approval;
334
565
  const isMaxTurnsPrompt = pendingApproval.isMaxTurnsPrompt;
335
- const isAskUser = pendingApproval.toolName === 'ask_user';
336
- if (isAskUser && answer === 'y' && approvalAnswer !== ASK_USER_DECLINE_RESULT) {
337
- let questions = [];
338
- try {
339
- const parsed = JSON.parse(pendingApproval.argumentsText);
340
- questions = parsed.questions || [];
341
- }
342
- catch {
343
- // noop
344
- }
345
- let parsedAns = approvalAnswer ?? '';
346
- const currentQuestion = questions[this.askUserAnswers.length];
347
- if (currentQuestion?.is_multi_select) {
348
- try {
349
- const maybeArray = JSON.parse(approvalAnswer ?? '');
350
- if (Array.isArray(maybeArray)) {
351
- parsedAns = maybeArray;
352
- }
353
- }
354
- catch {
355
- // keep plain string
356
- }
357
- }
358
- const nextAnswers = [...this.askUserAnswers, parsedAns];
359
- this.config.ui.onAskUserAnswerSubmitted(parsedAns);
360
- if (nextAnswers.length < questions.length) {
361
- this.askUserAnswers = nextAnswers;
362
- this.currentAskUserQuestionIndex = nextAnswers.length;
363
- this.config.ui.onAskUserAdvanceToNext(nextAnswers.length);
364
- return;
365
- }
366
- this.askUserAnswers = nextAnswers;
367
- this.currentAskUserQuestionIndex = nextAnswers.length;
368
- approvalAnswer = JSON.stringify(nextAnswers);
369
- }
566
+ this.config.ui.onApprovalResolved();
370
567
  if (answer === 'y' || isDeniedReadApproveAnswer(answer)) {
371
568
  this.config.approvedContext.current = {
372
569
  callId: pendingApproval.callId,
373
570
  toolName: pendingApproval.toolName,
374
571
  };
375
572
  }
376
- this.config.ui.onApprovalResolved();
377
- this.pendingApproval = null;
378
- this.resetAskUserState();
379
573
  if (isMaxTurnsPrompt && answer === 'n') {
380
574
  this.#endTurn();
381
575
  return;
@@ -397,7 +591,6 @@ export class ConversationOrchestrator {
397
591
  }
398
592
  const errorMessage = error instanceof Error ? error.message : String(error);
399
593
  this.appendBotError(errorMessage);
400
- this.config.ui.onApprovalResolved();
401
594
  }
402
595
  finally {
403
596
  reasoningUpdater.flush();
@@ -410,7 +603,8 @@ export class ConversationOrchestrator {
410
603
  try {
411
604
  const result = await this.config.conversationService.handleApprovalDecision(answer, rejectionReason, {
412
605
  onEvent: this.createOnEventHandler(applyConversationEvent),
413
- approvalAnswer,
606
+ approvalAnswer: resolution.approvalAnswer,
607
+ ...(options.stopAfterApprovalResolution ? { stopAfterApprovalResolution: true } : {}),
414
608
  });
415
609
  applyConversationEvent({ type: 'final', finalText: '' });
416
610
  botResponseUpdater.flush();
@@ -424,7 +618,6 @@ export class ConversationOrchestrator {
424
618
  }
425
619
  const errorMessage = error instanceof Error ? error.message : String(error);
426
620
  this.appendBotError(errorMessage);
427
- this.config.ui.onApprovalResolved();
428
621
  }
429
622
  finally {
430
623
  this.config.loggingService.debug('handleApprovalDecision finally block - resetting state');
@@ -433,6 +626,18 @@ export class ConversationOrchestrator {
433
626
  this.#endTurn();
434
627
  }
435
628
  }
629
+ /**
630
+ * Escape on an `ask_user` prompt. The tool still returns
631
+ * {@link ASK_USER_NO_ANSWER_RESULT}, so the question and the fact that it
632
+ * went unanswered are committed to history and travel with the user's next
633
+ * message. The turn then ends instead of handing the model another turn:
634
+ * cancelling means the user speaks next.
635
+ */
636
+ async cancelAskUser(expectedInteractionId) {
637
+ return this.handleApprovalDecision('y', undefined, ASK_USER_NO_ANSWER_RESULT, expectedInteractionId, {
638
+ stopAfterApprovalResolution: true,
639
+ });
640
+ }
436
641
  /** Open a turn this orchestrator owns, and its streaming session. */
437
642
  #beginTurn(label) {
438
643
  this.#activeTurns += 1;
@@ -452,10 +657,115 @@ export class ConversationOrchestrator {
452
657
  }
453
658
  }
454
659
  /**
455
- * Hand every settled background subagent run to the main agent as one
456
- * system-initiated turn. Does nothing unless the conversation is idle: a
457
- * running turn or a pending approval owns the agent, and the store keeps the
458
- * notifications until the next terminal state re-attempts delivery.
660
+ * Announce settled runs in the transcript, once each.
661
+ *
662
+ * Display is deliberately not tied to the agent receiving them: the user
663
+ * should see a run land the moment it does, whether the report reaches the
664
+ * agent at the next request boundary or waits for a turn of its own.
665
+ */
666
+ #announceBackgroundSubagentNotifications(notifications) {
667
+ const newlyDisplayed = notifications.filter((notification) => !this.#displayedBackgroundNotificationMessageIds.has(notification.messageId));
668
+ if (newlyDisplayed.length === 0)
669
+ return;
670
+ for (const notification of newlyDisplayed) {
671
+ this.#displayedBackgroundNotificationMessageIds.add(notification.messageId);
672
+ }
673
+ const subagentNotifications = newlyDisplayed.filter((notification) => notification.kind === 'completion' || notification.kind === 'question');
674
+ const runs = subagentNotifications
675
+ .filter((notification) => notification.kind === 'completion')
676
+ .map(({ name, role, status, error }) => ({
677
+ ...(name !== undefined ? { name } : {}),
678
+ role,
679
+ status,
680
+ ...(error ? { error } : {}),
681
+ }));
682
+ const shellJobs = newlyDisplayed.filter((notification) => notification.kind === 'shell_completion');
683
+ const userControls = newlyDisplayed.filter((notification) => notification.kind === 'user_control');
684
+ this.config.messages.appendMessages([
685
+ ...(subagentNotifications.length > 0
686
+ ? [
687
+ {
688
+ id: this.createMessageId(),
689
+ sender: 'command',
690
+ status: 'completed',
691
+ command: 'background_subagent_notification',
692
+ output: formatBackgroundSubagentNotificationDisplay(subagentNotifications),
693
+ success: true,
694
+ toolName: 'background_subagent_notification',
695
+ toolArgs: { runs },
696
+ },
697
+ ]
698
+ : []),
699
+ ...(shellJobs.length > 0
700
+ ? [
701
+ {
702
+ id: this.createMessageId(),
703
+ sender: 'command',
704
+ status: 'completed',
705
+ command: 'background_shell_notification',
706
+ output: formatBackgroundSubagentNotificationDisplay(shellJobs),
707
+ success: true,
708
+ toolName: 'background_shell_notification',
709
+ toolArgs: {
710
+ jobs: shellJobs.map(({ jobId, command, status, error }) => ({
711
+ jobId,
712
+ command,
713
+ status,
714
+ ...(error ? { error } : {}),
715
+ })),
716
+ },
717
+ },
718
+ ]
719
+ : []),
720
+ ...(userControls.length > 0
721
+ ? [
722
+ {
723
+ id: this.createMessageId(),
724
+ sender: 'command',
725
+ status: 'completed',
726
+ command: 'background_task_control_notification',
727
+ output: formatBackgroundSubagentNotificationDisplay(userControls),
728
+ success: true,
729
+ toolName: 'background_task_control_notification',
730
+ toolArgs: {
731
+ actions: userControls.map(({ action, target }) => ({ action, target })),
732
+ },
733
+ },
734
+ ]
735
+ : []),
736
+ ]);
737
+ }
738
+ /**
739
+ * Offer settled runs to the turn already in flight.
740
+ *
741
+ * Taken as one report at that turn's next request boundary. If the turn will
742
+ * not take them they go back to the store unchanged, so the idle path still
743
+ * delivers them and the agent never sees the same run twice.
744
+ */
745
+ async #injectBackgroundSubagentNotifications(pending) {
746
+ if (!this.config.conversationService.injectIntoActiveTurn)
747
+ return;
748
+ const notifications = pending.drain();
749
+ if (notifications.length === 0)
750
+ return;
751
+ this.#announceBackgroundSubagentNotifications(notifications);
752
+ const injected = await this.config.conversationService
753
+ .injectIntoActiveTurn([
754
+ { type: 'message', role: 'user', content: formatBackgroundSubagentNotifications(notifications) },
755
+ ])
756
+ .catch((error) => {
757
+ this.logError('Error delivering background subagent notifications', error);
758
+ return false;
759
+ });
760
+ if (!injected)
761
+ pending.retain(notifications);
762
+ }
763
+ /**
764
+ * Hand every settled background subagent run to the main agent.
765
+ *
766
+ * The agent that launched these runs is usually still working when they
767
+ * settle, so delivery goes into that turn at its next request boundary. Only
768
+ * when no turn will take them does this open one of its own.
459
769
  */
460
770
  async #deliverBackgroundSubagentNotifications() {
461
771
  const pending = this.config.conversationService.backgroundSubagentNotifications;
@@ -463,17 +773,24 @@ export class ConversationOrchestrator {
463
773
  return;
464
774
  if (this.#stoppingByUser)
465
775
  return;
466
- if (this.#activeTurns > 0 || this.pendingApproval)
776
+ const turnIsRunning = this.#activeTurns > 0 || this.config.conversationService.isQueueActive?.() === true;
777
+ if (turnIsRunning) {
778
+ await this.#injectBackgroundSubagentNotifications(pending);
467
779
  return;
468
- if (this.config.conversationService.isQueueActive?.())
780
+ }
781
+ if (this.config.conversationService.getPendingInteractionSnapshot?.())
469
782
  return;
470
783
  const notifications = pending.drain();
471
784
  if (notifications.length === 0)
472
785
  return;
786
+ this.#announceBackgroundSubagentNotifications(notifications);
473
787
  const { botResponseUpdater, reasoningUpdater, applyConversationEvent, streamingState } = this.#beginTurn('backgroundSubagentNotification');
474
788
  let delivered = false;
475
789
  try {
476
- const result = await this.config.conversationService.sendMessage(formatBackgroundSubagentNotifications(notifications), { onEvent: this.createOnEventHandler(applyConversationEvent) });
790
+ const result = await this.config.conversationService.sendMessage(formatBackgroundSubagentNotifications(notifications), {
791
+ onEvent: this.createOnEventHandler(applyConversationEvent),
792
+ suppressUserMessageDisplay: true,
793
+ });
477
794
  // A turn the queue refused to admit resolves without a terminal, so the
478
795
  // notifications were never seen and must go back on the queue.
479
796
  delivered = Boolean(result);
@@ -488,7 +805,6 @@ export class ConversationOrchestrator {
488
805
  return;
489
806
  }
490
807
  this.appendBotError(enhanceApiKeyError(describeError(error)));
491
- this.config.ui.onApprovalResolved();
492
808
  }
493
809
  finally {
494
810
  reasoningUpdater.flush();
@@ -516,11 +832,11 @@ export class ConversationOrchestrator {
516
832
  }
517
833
  createOnEventHandler(baseOnEvent) {
518
834
  return (event) => {
519
- const eventType = typeof event?.type === 'string' ? event.type : undefined;
835
+ const eventType = event.type;
520
836
  if (eventType === 'reasoning_delta') {
521
837
  this.config.ui.onStreamingThinkingStarted((this.config.now ?? Date.now)());
522
838
  }
523
- else if (eventType && this.clearsThinkingIndicator(eventType)) {
839
+ else if (this.clearsThinkingIndicator(eventType)) {
524
840
  this.config.ui.onStreamingThinkingCleared();
525
841
  }
526
842
  if (eventType === 'tool_call_streaming_delta') {
@@ -529,7 +845,7 @@ export class ConversationOrchestrator {
529
845
  else if (eventType === 'tool_started' || eventType === 'text_delta' || eventType === 'final') {
530
846
  this.config.ui.onStreamingToolInfo(null);
531
847
  }
532
- if (event?.type === 'user_message_consumed_for_abort') {
848
+ if (eventType === 'user_message_consumed_for_abort') {
533
849
  this.config.messages.setMessages((prev) => {
534
850
  for (let i = prev.length - 1; i >= 0; i--) {
535
851
  const msg = prev[i];
@@ -546,8 +862,11 @@ export class ConversationOrchestrator {
546
862
  return;
547
863
  }
548
864
  baseOnEvent(event);
549
- if (event?.type === 'subagent_completed' && event?.result?.usage) {
550
- this.config.subagentUsageAccumulator?.add(event.result.usage);
865
+ if (eventType === 'subagent_completed') {
866
+ if (event.result.usage) {
867
+ this.config.subagentUsageAccumulator?.add(event.result.usage);
868
+ }
869
+ this.config.costAccumulator?.addRecords(event.result.costRecords ?? []);
551
870
  }
552
871
  };
553
872
  }
@@ -559,13 +878,11 @@ export class ConversationOrchestrator {
559
878
  if (result.usage) {
560
879
  this.config.ui.onUsageUpdate(latestStreamedUsage ?? result.usage);
561
880
  }
562
- this.pendingApproval = result.approval;
563
881
  this.config.messages.setMessages((prev) => this.config.messages.trimMessages(filterPendingCommandMessagesForApproval(prev, result.approval)));
564
882
  this.config.ui.onApprovalRequested({ ...result.approval, llmAdvisory: result.approval.llmAdvisory });
565
883
  this.config.notifier?.approvalNeeded();
566
884
  return;
567
885
  }
568
- this.pendingApproval = null;
569
886
  this.config.messages.setMessages((prev) => computeNextMessages({
570
887
  prev,
571
888
  result,
@@ -583,6 +900,7 @@ export class ConversationOrchestrator {
583
900
  this.config.usageAccumulator?.add(result.usage);
584
901
  this.config.ui.onUsageUpdate(latestStreamedUsage ?? result.usage);
585
902
  }
903
+ this.config.costAccumulator?.addRecords(result.costRecords ?? []);
586
904
  }
587
905
  /**
588
906
  * Append a previously-queued user message into the message list. Called by
@@ -637,10 +955,6 @@ export class ConversationOrchestrator {
637
955
  eventType === 'tool_call_streaming_delta' ||
638
956
  eventType === 'final');
639
957
  }
640
- resetAskUserState() {
641
- this.askUserAnswers = [];
642
- this.currentAskUserQuestionIndex = 0;
643
- }
644
958
  appendBotError(errorMessage) {
645
959
  const botErrorMessage = {
646
960
  id: this.createMessageId(),