@qduc/term2 0.32.2 → 0.34.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 (435) hide show
  1. package/dist/agent.d.ts.map +1 -1
  2. package/dist/agent.js +30 -14
  3. package/dist/agent.js.map +1 -1
  4. package/dist/build-info.json +2 -2
  5. package/dist/completion-verification-admin.d.ts +2 -0
  6. package/dist/completion-verification-admin.d.ts.map +1 -0
  7. package/dist/completion-verification-admin.js +37 -0
  8. package/dist/completion-verification-admin.js.map +1 -0
  9. package/dist/components/input/MenuSurface.d.ts.map +1 -1
  10. package/dist/components/input/MenuSurface.js +12 -3
  11. package/dist/components/input/MenuSurface.js.map +1 -1
  12. package/dist/components/input/ModelMenuSession.d.ts.map +1 -1
  13. package/dist/components/input/ModelMenuSession.js +15 -1
  14. package/dist/components/input/ModelMenuSession.js.map +1 -1
  15. package/dist/components/input/ProviderMenuSession.d.ts.map +1 -1
  16. package/dist/components/input/ProviderMenuSession.js +2 -2
  17. package/dist/components/input/ProviderMenuSession.js.map +1 -1
  18. package/dist/components/input/SettingsMenuSession.d.ts.map +1 -1
  19. package/dist/components/input/SettingsMenuSession.js +119 -82
  20. package/dist/components/input/SettingsMenuSession.js.map +1 -1
  21. package/dist/components/input/SettingsValueMenuSession.d.ts.map +1 -1
  22. package/dist/components/input/SettingsValueMenuSession.js +18 -3
  23. package/dist/components/input/SettingsValueMenuSession.js.map +1 -1
  24. package/dist/components/input/determine-active-menu.d.ts.map +1 -1
  25. package/dist/components/input/determine-active-menu.js +5 -1
  26. package/dist/components/input/determine-active-menu.js.map +1 -1
  27. package/dist/components/input/settings-intent-host.d.ts.map +1 -1
  28. package/dist/components/input/settings-intent-host.js +60 -4
  29. package/dist/components/input/settings-intent-host.js.map +1 -1
  30. package/dist/components/menu/ModelSelectionMenu.d.ts +4 -0
  31. package/dist/components/menu/ModelSelectionMenu.d.ts.map +1 -1
  32. package/dist/components/menu/ModelSelectionMenu.js +15 -16
  33. package/dist/components/menu/ModelSelectionMenu.js.map +1 -1
  34. package/dist/components/menu/ProviderSelectionMenu.d.ts +1 -0
  35. package/dist/components/menu/ProviderSelectionMenu.d.ts.map +1 -1
  36. package/dist/components/menu/ProviderSelectionMenu.js +21 -6
  37. package/dist/components/menu/ProviderSelectionMenu.js.map +1 -1
  38. package/dist/components/menu/SettingsSelectionMenu.d.ts +3 -0
  39. package/dist/components/menu/SettingsSelectionMenu.d.ts.map +1 -1
  40. package/dist/components/menu/SettingsSelectionMenu.js +78 -47
  41. package/dist/components/menu/SettingsSelectionMenu.js.map +1 -1
  42. package/dist/components/menu/SettingsValueSelectionMenu.d.ts +2 -0
  43. package/dist/components/menu/SettingsValueSelectionMenu.d.ts.map +1 -1
  44. package/dist/components/menu/SettingsValueSelectionMenu.js +17 -12
  45. package/dist/components/menu/SettingsValueSelectionMenu.js.map +1 -1
  46. package/dist/components/menu/settings-value-formatter.d.ts +8 -3
  47. package/dist/components/menu/settings-value-formatter.d.ts.map +1 -1
  48. package/dist/components/menu/settings-value-formatter.js +55 -32
  49. package/dist/components/menu/settings-value-formatter.js.map +1 -1
  50. package/dist/components/message/command-message-helpers.d.ts +5 -5
  51. package/dist/contracts/run-termination.d.ts +3 -1
  52. package/dist/contracts/run-termination.d.ts.map +1 -1
  53. package/dist/hooks/settings-completion-config.d.ts +28 -12
  54. package/dist/hooks/settings-completion-config.d.ts.map +1 -1
  55. package/dist/hooks/settings-completion-config.js +73 -76
  56. package/dist/hooks/settings-completion-config.js.map +1 -1
  57. package/dist/hooks/settings-completion-logic.d.ts +10 -1
  58. package/dist/hooks/settings-completion-logic.d.ts.map +1 -1
  59. package/dist/hooks/settings-completion-logic.js +80 -49
  60. package/dist/hooks/settings-completion-logic.js.map +1 -1
  61. package/dist/hooks/use-provider-selection.d.ts +6 -0
  62. package/dist/hooks/use-provider-selection.d.ts.map +1 -1
  63. package/dist/hooks/use-provider-selection.js +69 -10
  64. package/dist/hooks/use-provider-selection.js.map +1 -1
  65. package/dist/hooks/use-settings-completion.d.ts +14 -0
  66. package/dist/hooks/use-settings-completion.d.ts.map +1 -1
  67. package/dist/hooks/use-settings-completion.js +54 -6
  68. package/dist/hooks/use-settings-completion.js.map +1 -1
  69. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  70. package/dist/hooks/use-settings-value-completion.js +15 -4
  71. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  72. package/dist/lib/agent-chat-service.d.ts.map +1 -1
  73. package/dist/lib/agent-chat-service.js +2 -6
  74. package/dist/lib/agent-chat-service.js.map +1 -1
  75. package/dist/lib/agent-client.d.ts +2 -1
  76. package/dist/lib/agent-client.d.ts.map +1 -1
  77. package/dist/lib/agent-client.js +99 -85
  78. package/dist/lib/agent-client.js.map +1 -1
  79. package/dist/lib/agent-factory.d.ts.map +1 -1
  80. package/dist/lib/agent-factory.js +17 -19
  81. package/dist/lib/agent-factory.js.map +1 -1
  82. package/dist/non-interactive.d.ts.map +1 -1
  83. package/dist/non-interactive.js +4 -0
  84. package/dist/non-interactive.js.map +1 -1
  85. package/dist/prompts/tool-surface-guidance.js +1 -1
  86. package/dist/prompts/tool-surface-guidance.js.map +1 -1
  87. package/dist/prompts/tool-surface-guidance.ts +1 -1
  88. package/dist/providers/ai-sdk-anthropic.provider.d.ts.map +1 -1
  89. package/dist/providers/ai-sdk-anthropic.provider.js +16 -2
  90. package/dist/providers/ai-sdk-anthropic.provider.js.map +1 -1
  91. package/dist/providers/ai-sdk-google.provider.d.ts.map +1 -1
  92. package/dist/providers/ai-sdk-google.provider.js +16 -2
  93. package/dist/providers/ai-sdk-google.provider.js.map +1 -1
  94. package/dist/providers/ai-sdk-openrouter.provider.d.ts.map +1 -1
  95. package/dist/providers/ai-sdk-openrouter.provider.js +16 -1
  96. package/dist/providers/ai-sdk-openrouter.provider.js.map +1 -1
  97. package/dist/providers/ai-sdk-provider-settings.d.ts +2 -0
  98. package/dist/providers/ai-sdk-provider-settings.d.ts.map +1 -1
  99. package/dist/providers/ai-sdk-provider-settings.js +5 -0
  100. package/dist/providers/ai-sdk-provider-settings.js.map +1 -1
  101. package/dist/providers/ai-sdk-streamed-model.d.ts +3 -3
  102. package/dist/providers/ai-sdk-streamed-model.d.ts.map +1 -1
  103. package/dist/providers/ai-sdk-streamed-model.js +5 -69
  104. package/dist/providers/ai-sdk-streamed-model.js.map +1 -1
  105. package/dist/providers/anthropic-chat-caching.d.ts +5 -0
  106. package/dist/providers/anthropic-chat-caching.d.ts.map +1 -0
  107. package/dist/providers/{common/openai-compatible-messages.js → anthropic-chat-caching.js} +19 -1
  108. package/dist/providers/anthropic-chat-caching.js.map +1 -0
  109. package/dist/providers/codex.provider.js +2 -0
  110. package/dist/providers/codex.provider.js.map +1 -1
  111. package/dist/providers/custom-provider-runtime.d.ts +18 -0
  112. package/dist/providers/custom-provider-runtime.d.ts.map +1 -0
  113. package/dist/providers/custom-provider-runtime.js +26 -0
  114. package/dist/providers/custom-provider-runtime.js.map +1 -0
  115. package/dist/providers/grok.provider.d.ts +13 -3
  116. package/dist/providers/grok.provider.d.ts.map +1 -1
  117. package/dist/providers/grok.provider.js +82 -6
  118. package/dist/providers/grok.provider.js.map +1 -1
  119. package/dist/providers/llama-cpp.provider.d.ts +3 -0
  120. package/dist/providers/llama-cpp.provider.d.ts.map +1 -1
  121. package/dist/providers/llama-cpp.provider.js +17 -0
  122. package/dist/providers/llama-cpp.provider.js.map +1 -1
  123. package/dist/providers/model-catalog/catalog.generated.d.ts +347 -351
  124. package/dist/providers/model-catalog/catalog.generated.d.ts.map +1 -1
  125. package/dist/providers/model-catalog/catalog.generated.js +362 -357
  126. package/dist/providers/model-catalog/catalog.generated.js.map +1 -1
  127. package/dist/providers/neuralwatt.provider.d.ts +6 -0
  128. package/dist/providers/neuralwatt.provider.d.ts.map +1 -0
  129. package/dist/providers/neuralwatt.provider.js +8 -0
  130. package/dist/providers/neuralwatt.provider.js.map +1 -0
  131. package/dist/providers/openai-compatible-lazy.d.ts.map +1 -1
  132. package/dist/providers/openai-compatible-lazy.js +2 -0
  133. package/dist/providers/openai-compatible-lazy.js.map +1 -1
  134. package/dist/providers/openai-compatible-middleware.d.ts +4 -9
  135. package/dist/providers/openai-compatible-middleware.d.ts.map +1 -1
  136. package/dist/providers/openai-compatible-middleware.js +25 -48
  137. package/dist/providers/openai-compatible-middleware.js.map +1 -1
  138. package/dist/providers/openai-compatible-models.d.ts +9 -1
  139. package/dist/providers/openai-compatible-models.d.ts.map +1 -1
  140. package/dist/providers/openai-compatible-models.js +10 -2
  141. package/dist/providers/openai-compatible-models.js.map +1 -1
  142. package/dist/providers/openai-compatible-response-normalizer.d.ts +1 -1
  143. package/dist/providers/openai-compatible-response-normalizer.d.ts.map +1 -1
  144. package/dist/providers/openai-compatible-response-normalizer.js +6 -6
  145. package/dist/providers/openai-compatible-response-normalizer.js.map +1 -1
  146. package/dist/providers/openai-compatible.provider.d.ts +2 -32
  147. package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
  148. package/dist/providers/openai-compatible.provider.js +27 -144
  149. package/dist/providers/openai-compatible.provider.js.map +1 -1
  150. package/dist/providers/openai.provider.d.ts.map +1 -1
  151. package/dist/providers/openai.provider.js +1 -0
  152. package/dist/providers/openai.provider.js.map +1 -1
  153. package/dist/providers/opencode-middleware.d.ts +9 -0
  154. package/dist/providers/opencode-middleware.d.ts.map +1 -0
  155. package/dist/providers/opencode-middleware.js +15 -0
  156. package/dist/providers/opencode-middleware.js.map +1 -0
  157. package/dist/providers/opencode-model-provider.d.ts +19 -0
  158. package/dist/providers/opencode-model-provider.d.ts.map +1 -0
  159. package/dist/providers/opencode-model-provider.js +128 -0
  160. package/dist/providers/opencode-model-provider.js.map +1 -0
  161. package/dist/providers/opencode.provider.d.ts +2 -0
  162. package/dist/providers/opencode.provider.d.ts.map +1 -1
  163. package/dist/providers/opencode.provider.js +4 -0
  164. package/dist/providers/opencode.provider.js.map +1 -1
  165. package/dist/providers/openrouter-decision-models.d.ts +7 -0
  166. package/dist/providers/openrouter-decision-models.d.ts.map +1 -0
  167. package/dist/providers/openrouter-decision-models.js +31 -0
  168. package/dist/providers/openrouter-decision-models.js.map +1 -0
  169. package/dist/providers/openrouter.provider.js +2 -1
  170. package/dist/providers/openrouter.provider.js.map +1 -1
  171. package/dist/providers/orcarouter-models.d.ts +12 -0
  172. package/dist/providers/orcarouter-models.d.ts.map +1 -0
  173. package/dist/providers/orcarouter-models.js +38 -0
  174. package/dist/providers/orcarouter-models.js.map +1 -0
  175. package/dist/providers/provider-presets.d.ts +37 -0
  176. package/dist/providers/provider-presets.d.ts.map +1 -0
  177. package/dist/providers/provider-presets.js +33 -0
  178. package/dist/providers/provider-presets.js.map +1 -0
  179. package/dist/providers/provider-presets.json +201 -0
  180. package/dist/providers/provider-service.d.ts +3 -2
  181. package/dist/providers/provider-service.d.ts.map +1 -1
  182. package/dist/providers/provider-service.js +4 -20
  183. package/dist/providers/provider-service.js.map +1 -1
  184. package/dist/providers/registry.d.ts +7 -0
  185. package/dist/providers/registry.d.ts.map +1 -1
  186. package/dist/providers/registry.js.map +1 -1
  187. package/dist/services/agent-runtime/application-run-loop.d.ts +25 -2
  188. package/dist/services/agent-runtime/application-run-loop.d.ts.map +1 -1
  189. package/dist/services/agent-runtime/application-run-loop.js +927 -758
  190. package/dist/services/agent-runtime/application-run-loop.js.map +1 -1
  191. package/dist/services/agent-runtime/tool-call-execution.d.ts +1 -1
  192. package/dist/services/agent-runtime/tool-call-execution.d.ts.map +1 -1
  193. package/dist/services/agent-runtime/tool-call-execution.js +6 -3
  194. package/dist/services/agent-runtime/tool-call-execution.js.map +1 -1
  195. package/dist/services/approval/approval-flow-coordinator.d.ts +4 -2
  196. package/dist/services/approval/approval-flow-coordinator.d.ts.map +1 -1
  197. package/dist/services/approval/approval-flow-coordinator.js +2 -1
  198. package/dist/services/approval/approval-flow-coordinator.js.map +1 -1
  199. package/dist/services/approval/approval-state.d.ts +0 -13
  200. package/dist/services/approval/approval-state.d.ts.map +1 -1
  201. package/dist/services/approval/approval-state.js +0 -5
  202. package/dist/services/approval/approval-state.js.map +1 -1
  203. package/dist/services/approval/background-subagent-approval-controller.d.ts.map +1 -1
  204. package/dist/services/approval/background-subagent-approval-controller.js +0 -2
  205. package/dist/services/approval/background-subagent-approval-controller.js.map +1 -1
  206. package/dist/services/approval/nested-approval-owner.d.ts.map +1 -1
  207. package/dist/services/approval/nested-approval-owner.js +5 -1
  208. package/dist/services/approval/nested-approval-owner.js.map +1 -1
  209. package/dist/services/approval/shell-auto-approval-resolver.d.ts +2 -2
  210. package/dist/services/approval/shell-auto-approval-resolver.d.ts.map +1 -1
  211. package/dist/services/approval/shell-auto-approval-resolver.js +2 -2
  212. package/dist/services/approval/shell-auto-approval-resolver.js.map +1 -1
  213. package/dist/services/approval/tool-approval-batch-coordinator.d.ts +2 -2
  214. package/dist/services/approval/tool-approval-batch-coordinator.d.ts.map +1 -1
  215. package/dist/services/approval/tool-approval-batch-coordinator.js +4 -4
  216. package/dist/services/approval/tool-approval-batch-coordinator.js.map +1 -1
  217. package/dist/services/assembly/feature-selection.d.ts +48 -0
  218. package/dist/services/assembly/feature-selection.d.ts.map +1 -0
  219. package/dist/services/assembly/feature-selection.js +12 -0
  220. package/dist/services/assembly/feature-selection.js.map +1 -0
  221. package/dist/services/completion-verification/contracts.d.ts +151 -0
  222. package/dist/services/completion-verification/contracts.d.ts.map +1 -0
  223. package/dist/services/completion-verification/contracts.js +84 -0
  224. package/dist/services/completion-verification/contracts.js.map +1 -0
  225. package/dist/services/completion-verification/gate.d.ts +9 -0
  226. package/dist/services/completion-verification/gate.d.ts.map +1 -0
  227. package/dist/services/completion-verification/gate.js +60 -0
  228. package/dist/services/completion-verification/gate.js.map +1 -0
  229. package/dist/services/completion-verification/goal-stop-policy.d.ts +10 -0
  230. package/dist/services/completion-verification/goal-stop-policy.d.ts.map +1 -0
  231. package/dist/services/completion-verification/goal-stop-policy.js +53 -0
  232. package/dist/services/completion-verification/goal-stop-policy.js.map +1 -0
  233. package/dist/services/completion-verification/orchestrator.d.ts +26 -0
  234. package/dist/services/completion-verification/orchestrator.d.ts.map +1 -0
  235. package/dist/services/completion-verification/orchestrator.js +275 -0
  236. package/dist/services/completion-verification/orchestrator.js.map +1 -0
  237. package/dist/services/completion-verification/root-boundary.d.ts +21 -0
  238. package/dist/services/completion-verification/root-boundary.d.ts.map +1 -0
  239. package/dist/services/completion-verification/root-boundary.js +127 -0
  240. package/dist/services/completion-verification/root-boundary.js.map +1 -0
  241. package/dist/services/completion-verification/store.d.ts +13 -0
  242. package/dist/services/completion-verification/store.d.ts.map +1 -0
  243. package/dist/services/completion-verification/store.js +69 -0
  244. package/dist/services/completion-verification/store.js.map +1 -0
  245. package/dist/services/completion-verification/verifier.d.ts +11 -0
  246. package/dist/services/completion-verification/verifier.d.ts.map +1 -0
  247. package/dist/services/completion-verification/verifier.js +173 -0
  248. package/dist/services/completion-verification/verifier.js.map +1 -0
  249. package/dist/services/completion-verification/workspace.d.ts +17 -0
  250. package/dist/services/completion-verification/workspace.d.ts.map +1 -0
  251. package/dist/services/completion-verification/workspace.js +183 -0
  252. package/dist/services/completion-verification/workspace.js.map +1 -0
  253. package/dist/services/conversation/conversation-adapter.d.ts +17 -47
  254. package/dist/services/conversation/conversation-adapter.d.ts.map +1 -1
  255. package/dist/services/conversation/conversation-adapter.js +114 -88
  256. package/dist/services/conversation/conversation-adapter.js.map +1 -1
  257. package/dist/services/conversation/conversation-orchestrator.d.ts.map +1 -1
  258. package/dist/services/conversation/conversation-orchestrator.js +48 -121
  259. package/dist/services/conversation/conversation-orchestrator.js.map +1 -1
  260. package/dist/services/conversation/conversation-record-stream.d.ts +21 -0
  261. package/dist/services/conversation/conversation-record-stream.d.ts.map +1 -0
  262. package/dist/services/conversation/conversation-record-stream.js +186 -0
  263. package/dist/services/conversation/conversation-record-stream.js.map +1 -0
  264. package/dist/services/conversation/conversation-record.d.ts +160 -0
  265. package/dist/services/conversation/conversation-record.d.ts.map +1 -0
  266. package/dist/services/conversation/conversation-record.js +371 -0
  267. package/dist/services/conversation/conversation-record.js.map +1 -0
  268. package/dist/services/conversation/conversation-result-builder.d.ts +0 -4
  269. package/dist/services/conversation/conversation-result-builder.d.ts.map +1 -1
  270. package/dist/services/conversation/conversation-result-builder.js +0 -10
  271. package/dist/services/conversation/conversation-result-builder.js.map +1 -1
  272. package/dist/services/conversation/conversation-service.d.ts +2 -1
  273. package/dist/services/conversation/conversation-service.d.ts.map +1 -1
  274. package/dist/services/conversation/conversation-service.js +3 -0
  275. package/dist/services/conversation/conversation-service.js.map +1 -1
  276. package/dist/services/conversation/durable-goal-stop-check.js +1 -1
  277. package/dist/services/conversation/durable-goal-stop-check.js.map +1 -1
  278. package/dist/services/conversation/durable-goal.d.ts.map +1 -1
  279. package/dist/services/conversation/durable-goal.js +1 -1
  280. package/dist/services/conversation/durable-goal.js.map +1 -1
  281. package/dist/services/conversation-agent-client.d.ts +17 -7
  282. package/dist/services/conversation-agent-client.d.ts.map +1 -1
  283. package/dist/services/logging/conversation-logger.d.ts +1 -7
  284. package/dist/services/logging/conversation-logger.d.ts.map +1 -1
  285. package/dist/services/logging/conversation-logger.js +0 -18
  286. package/dist/services/logging/conversation-logger.js.map +1 -1
  287. package/dist/services/model-service.d.ts +2 -6
  288. package/dist/services/model-service.d.ts.map +1 -1
  289. package/dist/services/model-service.js +8 -21
  290. package/dist/services/model-service.js.map +1 -1
  291. package/dist/services/models/decision-model-listing.d.ts +2 -12
  292. package/dist/services/models/decision-model-listing.d.ts.map +1 -1
  293. package/dist/services/models/decision-model-listing.js +2 -29
  294. package/dist/services/models/decision-model-listing.js.map +1 -1
  295. package/dist/services/provider-continuity.d.ts +26 -0
  296. package/dist/services/provider-continuity.d.ts.map +1 -1
  297. package/dist/services/provider-continuity.js +47 -0
  298. package/dist/services/provider-continuity.js.map +1 -1
  299. package/dist/services/retry/recovery-executor.d.ts +3 -4
  300. package/dist/services/retry/recovery-executor.d.ts.map +1 -1
  301. package/dist/services/retry/recovery-executor.js +13 -75
  302. package/dist/services/retry/recovery-executor.js.map +1 -1
  303. package/dist/services/retry/retry-contracts.d.ts +2 -10
  304. package/dist/services/retry/retry-contracts.d.ts.map +1 -1
  305. package/dist/services/session/continuation-plan-applier.d.ts +5 -9
  306. package/dist/services/session/continuation-plan-applier.d.ts.map +1 -1
  307. package/dist/services/session/continuation-plan-applier.js +9 -43
  308. package/dist/services/session/continuation-plan-applier.js.map +1 -1
  309. package/dist/services/session/continuation-recovery-handler.d.ts +4 -6
  310. package/dist/services/session/continuation-recovery-handler.d.ts.map +1 -1
  311. package/dist/services/session/continuation-recovery-handler.js +3 -15
  312. package/dist/services/session/continuation-recovery-handler.js.map +1 -1
  313. package/dist/services/session/initial-input-preparer.d.ts +2 -2
  314. package/dist/services/session/initial-input-preparer.d.ts.map +1 -1
  315. package/dist/services/session/initial-input-preparer.js +3 -3
  316. package/dist/services/session/initial-input-preparer.js.map +1 -1
  317. package/dist/services/session/initial-turn-recovery-handler.d.ts +2 -4
  318. package/dist/services/session/initial-turn-recovery-handler.d.ts.map +1 -1
  319. package/dist/services/session/initial-turn-recovery-handler.js +4 -5
  320. package/dist/services/session/initial-turn-recovery-handler.js.map +1 -1
  321. package/dist/services/session/live-run.d.ts +9 -3
  322. package/dist/services/session/live-run.d.ts.map +1 -1
  323. package/dist/services/session/live-run.js +19 -4
  324. package/dist/services/session/live-run.js.map +1 -1
  325. package/dist/services/session/session-composition.d.ts +8 -12
  326. package/dist/services/session/session-composition.d.ts.map +1 -1
  327. package/dist/services/session/session-composition.js +41 -87
  328. package/dist/services/session/session-composition.js.map +1 -1
  329. package/dist/services/session/session-input-planner.d.ts +2 -2
  330. package/dist/services/session/session-input-planner.d.ts.map +1 -1
  331. package/dist/services/session/session-input-planner.js +6 -13
  332. package/dist/services/session/session-input-planner.js.map +1 -1
  333. package/dist/services/session/session-lifecycle.d.ts +73 -23
  334. package/dist/services/session/session-lifecycle.d.ts.map +1 -1
  335. package/dist/services/session/session-lifecycle.js +127 -45
  336. package/dist/services/session/session-lifecycle.js.map +1 -1
  337. package/dist/services/session/session-stream-processor.d.ts +4 -30
  338. package/dist/services/session/session-stream-processor.d.ts.map +1 -1
  339. package/dist/services/session/session-stream-processor.js +11 -300
  340. package/dist/services/session/session-stream-processor.js.map +1 -1
  341. package/dist/services/session/session-tool-tracker.d.ts +9 -144
  342. package/dist/services/session/session-tool-tracker.d.ts.map +1 -1
  343. package/dist/services/session/session-tool-tracker.js +17 -251
  344. package/dist/services/session/session-tool-tracker.js.map +1 -1
  345. package/dist/services/session/{turn-workflow.d.ts → session-turn-adapter.d.ts} +10 -43
  346. package/dist/services/session/session-turn-adapter.d.ts.map +1 -0
  347. package/dist/services/session/session-turn-adapter.js +734 -0
  348. package/dist/services/session/session-turn-adapter.js.map +1 -0
  349. package/dist/services/session/turn-attempt-factory.d.ts +2 -11
  350. package/dist/services/session/turn-attempt-factory.d.ts.map +1 -1
  351. package/dist/services/session/turn-attempt-factory.js +4 -12
  352. package/dist/services/session/turn-attempt-factory.js.map +1 -1
  353. package/dist/services/session/turn-attempt.d.ts +0 -3
  354. package/dist/services/session/turn-attempt.d.ts.map +1 -1
  355. package/dist/services/session/turn-attempt.js +0 -5
  356. package/dist/services/session/turn-attempt.js.map +1 -1
  357. package/dist/services/session/turn-coordinator.d.ts +3 -3
  358. package/dist/services/session/turn-coordinator.d.ts.map +1 -1
  359. package/dist/services/session/turn-coordinator.js +31 -26
  360. package/dist/services/session/turn-coordinator.js.map +1 -1
  361. package/dist/services/session/turn-projection-state.d.ts +45 -0
  362. package/dist/services/session/turn-projection-state.d.ts.map +1 -0
  363. package/dist/services/session/turn-projection-state.js +61 -0
  364. package/dist/services/session/turn-projection-state.js.map +1 -0
  365. package/dist/services/settings/settings-env.d.ts +5 -0
  366. package/dist/services/settings/settings-env.d.ts.map +1 -1
  367. package/dist/services/settings/settings-env.js +22 -0
  368. package/dist/services/settings/settings-env.js.map +1 -1
  369. package/dist/services/settings/settings-schema.d.ts +8 -0
  370. package/dist/services/settings/settings-schema.d.ts.map +1 -1
  371. package/dist/services/settings/settings-schema.js +17 -0
  372. package/dist/services/settings/settings-schema.js.map +1 -1
  373. package/dist/services/settings/settings-service.d.ts +6 -0
  374. package/dist/services/settings/settings-service.d.ts.map +1 -1
  375. package/dist/services/settings/settings-service.js +21 -9
  376. package/dist/services/settings/settings-service.js.map +1 -1
  377. package/dist/services/settings/settings-sources.d.ts +2 -0
  378. package/dist/services/settings/settings-sources.d.ts.map +1 -1
  379. package/dist/services/settings/settings-sources.js +2 -0
  380. package/dist/services/settings/settings-sources.js.map +1 -1
  381. package/dist/services/settings/settings-ui-metadata.d.ts +21 -0
  382. package/dist/services/settings/settings-ui-metadata.d.ts.map +1 -1
  383. package/dist/services/settings/settings-ui-metadata.js +201 -23
  384. package/dist/services/settings/settings-ui-metadata.js.map +1 -1
  385. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts +1 -0
  386. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts.map +1 -1
  387. package/dist/services/settings/test-helpers/settings-consumer-inventory.js +4 -0
  388. package/dist/services/settings/test-helpers/settings-consumer-inventory.js.map +1 -1
  389. package/dist/services/subagents/tool-policy.d.ts +5 -5
  390. package/dist/services/subagents/tool-policy.d.ts.map +1 -1
  391. package/dist/services/subagents/tool-policy.js +15 -9
  392. package/dist/services/subagents/tool-policy.js.map +1 -1
  393. package/dist/tools/agent/goal-check.js +2 -2
  394. package/dist/tools/agent/goal-check.js.map +1 -1
  395. package/dist/tools/agent/list-models.d.ts +71 -0
  396. package/dist/tools/agent/list-models.d.ts.map +1 -0
  397. package/dist/tools/agent/list-models.js +175 -0
  398. package/dist/tools/agent/list-models.js.map +1 -0
  399. package/dist/tools/system/run-code/run-code-runtime.d.ts.map +1 -1
  400. package/dist/tools/system/run-code/run-code-runtime.js +90 -19
  401. package/dist/tools/system/run-code/run-code-runtime.js.map +1 -1
  402. package/dist/tools/system/shell.d.ts +2 -2
  403. package/dist/tools/system/shell.d.ts.map +1 -1
  404. package/dist/tools/system/shell.js +1 -0
  405. package/dist/tools/system/shell.js.map +1 -1
  406. package/dist/tools/tool-names.d.ts +1 -1
  407. package/dist/tools/tool-names.d.ts.map +1 -1
  408. package/dist/utils/ai/token-usage.js +9 -8
  409. package/dist/utils/ai/token-usage.js.map +1 -1
  410. package/dist/utils/value-suggestions.d.ts.map +1 -1
  411. package/dist/utils/value-suggestions.js +14 -11
  412. package/dist/utils/value-suggestions.js.map +1 -1
  413. package/package.json +2 -2
  414. package/dist/providers/anthropic-middleware.d.ts +0 -25
  415. package/dist/providers/anthropic-middleware.d.ts.map +0 -1
  416. package/dist/providers/anthropic-middleware.js +0 -32
  417. package/dist/providers/anthropic-middleware.js.map +0 -1
  418. package/dist/providers/common/openai-compatible-messages.d.ts +0 -2
  419. package/dist/providers/common/openai-compatible-messages.d.ts.map +0 -1
  420. package/dist/providers/common/openai-compatible-messages.js.map +0 -1
  421. package/dist/services/session/continuation-call-id-resolver.d.ts +0 -29
  422. package/dist/services/session/continuation-call-id-resolver.d.ts.map +0 -1
  423. package/dist/services/session/continuation-call-id-resolver.js +0 -69
  424. package/dist/services/session/continuation-call-id-resolver.js.map +0 -1
  425. package/dist/services/session/continuation-state.d.ts +0 -69
  426. package/dist/services/session/continuation-state.d.ts.map +0 -1
  427. package/dist/services/session/continuation-state.js +0 -78
  428. package/dist/services/session/continuation-state.js.map +0 -1
  429. package/dist/services/session/session-manager.d.ts +0 -87
  430. package/dist/services/session/session-manager.d.ts.map +0 -1
  431. package/dist/services/session/session-manager.js +0 -146
  432. package/dist/services/session/session-manager.js.map +0 -1
  433. package/dist/services/session/turn-workflow.d.ts.map +0 -1
  434. package/dist/services/session/turn-workflow.js +0 -1055
  435. package/dist/services/session/turn-workflow.js.map +0 -1
@@ -6,7 +6,7 @@ import { type UserTurn } from '../../types/user-turn.js';
6
6
  import type { InputSurgeApproval } from '../input-surge-approval.js';
7
7
  import type { ProviderInputItem } from '../../contracts/provider-input.js';
8
8
  import type { SessionRuntime, SessionLogs, SessionApprovalQuery } from '../../core/session-runtime.js';
9
- import type { SessionManager } from '../session/session-manager.js';
9
+ import type { SessionLifecycle } from '../session/session-lifecycle.js';
10
10
  import type { PendingInteractionState } from '../session/pending-interaction-state.js';
11
11
  import type { AskUserAnswerSink, SubagentEventSinkHost } from '../conversation-agent-client.js';
12
12
  import type { SessionIdentity } from '../session/session-identity.js';
@@ -24,7 +24,7 @@ export type SendMessageOptions = {
24
24
  preferredMessageId?: string;
25
25
  /** The turn is model input only and must not be projected as a user message in the UI. */
26
26
  suppressUserMessageDisplay?: boolean;
27
- /** A busy-input steer supersedes the active foreground turn. */
27
+ /** Busy input joins the next model boundary, or queues if that turn releases it. */
28
28
  busyMode?: 'steer' | 'follow_up';
29
29
  };
30
30
  export type HandleApprovalDecisionOptions = {
@@ -121,7 +121,7 @@ export declare class ConversationAdapter {
121
121
  logger: ILoggingService;
122
122
  settingsService?: ISettingsService;
123
123
  sessionContextService: ISessionContextService;
124
- userTurns: Pick<SessionManager, 'listUserTurns'>;
124
+ userTurns: Pick<SessionLifecycle, 'listUserTurns'>;
125
125
  logs: SessionLogs;
126
126
  approval: SessionApprovalQuery;
127
127
  /** Session-owned interaction projection; omitted by low-level legacy tests. */
@@ -162,20 +162,7 @@ export declare class ConversationAdapter {
162
162
  */
163
163
  queueStateKind(): QueueStateKind | 'none';
164
164
  queuedSubmissionCount(): number;
165
- /**
166
- * Deliver a user message into the turn already running, as a user message the
167
- * model reads after the tool results of the round in flight.
168
- *
169
- * Resolves true once the running turn has taken it. Resolves false when that
170
- * turn offers no further request boundary — it is finishing, or parked on an
171
- * approval — leaving the caller to send the message as its own turn.
172
- *
173
- * `options.id` is the submission's address (see `## The three stages`):
174
- * while this call is outstanding, `id` is tracked in `#pendingSteerIds` so
175
- * `retractSubmission`/`editSubmission` can route to it. Omitted by the one
176
- * caller that has no such id — background subagent notifications, via
177
- * `injectIntoActiveTurn` directly — which can never be retracted or edited.
178
- */
165
+ /** Compatibility view of mailbox admission; submitMessage also owns fallback. */
179
166
  steerActiveTurn(input: string | UserTurn, options?: {
180
167
  id?: string;
181
168
  }): Promise<boolean>;
@@ -196,38 +183,21 @@ export declare class ConversationAdapter {
196
183
  injectIntoActiveTurn(items: readonly ProviderInputItem[], options?: {
197
184
  id?: string;
198
185
  }): Promise<boolean>;
199
- /**
200
- * Retract a submission before it reaches the model, addressed by the id
201
- * `sendMessage`/`steerActiveTurn` were given (`preferredMessageId`), which
202
- * is the same id the UI already keys `pendingQueuedMessages` on.
203
- *
204
- * Routes by stage (`## The three stages`): a still-waiting steer goes to
205
- * `retractSteer` on the run loop; a queued item goes to the controller's
206
- * `remove_queued`.
207
- *
208
- * A pending steer has no matching `#messagesById` entry to settle — its
209
- * caller (`steerActiveTurn`) awaits the `turnFlow.steer` promise directly,
210
- * not a queued `sendMessage`. `retractSteer` resolves that promise itself
211
- * (with `'retracted'`), which `injectIntoActiveTurn` reports as `false` to
212
- * that caller. A queued item, by contrast, *does* have a `sendMessage`
213
- * promise parked in `#messagesById`, which this settles with an
214
- * `AbortError` — the same shape `removeLastQueuedItem` already used.
215
- */
186
+ /** Mutate only the owner's still-pending record and its queue/mailbox projection. */
216
187
  retractSubmission(id: string): Promise<SubmissionMutation>;
217
- /**
218
- * Replace a submission's content in place, without changing its stage or
219
- * position — a pending steer stays a steer at its slot, a queued item keeps
220
- * its queue index and steer-ahead-of-follow-ups priority.
221
- *
222
- * **The trap**: the controller queue stores display `text` only.
223
- * `#runQueuedTurn` executes `message.input` from `#messagesById`, so
224
- * issuing `edit_queued` alone redraws the new text but sends the old turn.
225
- * This replaces the `#messagesById` entry's `input` first, keeping the
226
- * `QUEUED_NON_TEXT_PLACEHOLDER` substitution `sendMessage` applies to the
227
- * controller's display copy.
228
- */
188
+ /** Keep the executable payload and display projection in the same mutation. */
229
189
  editSubmission(id: string, turn: UserTurn): Promise<SubmissionMutation>;
230
- sendMessage(input: string | UserTurn, { onAdmission, onTextChunk, onReasoningChunk, onCommandMessage, onEvent, hallucinationRetryCount, inputSurgeApproval, replayFromHistory, preferredMessageId, busyMode, suppressUserMessageDisplay, }?: SendMessageOptions): Promise<ConversationTerminal>;
190
+ /** Own steer admission and fallback with the same id and latest payload. */
191
+ submitMessage(input: string | UserTurn, options?: SendMessageOptions, delivery?: {
192
+ onSteerSettled(admitted: boolean, input: string | UserTurn): void;
193
+ prepareFollowUp?(input: string | UserTurn): string | UserTurn;
194
+ }): Promise<{
195
+ kind: 'steered';
196
+ } | {
197
+ kind: 'turn';
198
+ terminal: ConversationTerminal;
199
+ }>;
200
+ sendMessage(input: string | UserTurn, options?: SendMessageOptions): Promise<ConversationTerminal>;
231
201
  prepareMessage(input: string | UserTurn, ids: PreparedMessageIds): Promise<PreparedMessageResult>;
232
202
  commitMessage(leaseId: string): Promise<void>;
233
203
  cancelPreparedMessage(leaseId: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-adapter.d.ts","sourceRoot":"","sources":["../../../source/services/conversation/conversation-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversation-adapter.d.ts","sourceRoot":"","sources":["../../../source/services/conversation/conversation-adapter.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { injectSkillIntoTurn } from '../../types/user-turn.js';
1
2
  import { collectTerminalResult, TerminalResultCollectorExhaustionError } from '../session/terminal-result-collector.js';
2
3
  import { getCallIdFromObject } from '../interruption-info.js';
3
4
  import { normalizeUserTurn } from '../../types/user-turn.js';
@@ -42,15 +43,8 @@ export class ConversationAdapter {
42
43
  #approval;
43
44
  #pendingInteraction;
44
45
  #turnFlow;
45
- #messagesById = new Map();
46
- /**
47
- * Ids currently handed to `turnFlow.steer` and not yet settled. Populated
48
- * right before the call and cleared when that steer's promise resolves
49
- * (admitted, released, or retracted) — this is what lets
50
- * `retractSubmission`/`editSubmission` tell a pending steer apart from a
51
- * queued item sharing the same id space, per `## The three stages`.
52
- */
53
- #pendingSteerIds = new Set();
46
+ /** Executable payload and lifecycle; queue/mailbox entries are projections. */
47
+ #submissions = new Map();
54
48
  #queue;
55
49
  #nextQueuedMessageId = 1;
56
50
  #nextActionId = 1;
@@ -117,7 +111,7 @@ export class ConversationAdapter {
117
111
  this.#queue = new QueueController({
118
112
  driver,
119
113
  snapshotFactory: (item) => {
120
- const message = this.#messagesById.get(item.id);
114
+ const message = this.#submissions.get(item.id);
121
115
  return message ? { requestId: item.id } : { requestId: item.id, recovered: true };
122
116
  },
123
117
  capacity: deps.queueCapacity,
@@ -226,25 +220,26 @@ export class ConversationAdapter {
226
220
  firstUserMessagePreview,
227
221
  }, fn);
228
222
  }
229
- /**
230
- * Deliver a user message into the turn already running, as a user message the
231
- * model reads after the tool results of the round in flight.
232
- *
233
- * Resolves true once the running turn has taken it. Resolves false when that
234
- * turn offers no further request boundary — it is finishing, or parked on an
235
- * approval — leaving the caller to send the message as its own turn.
236
- *
237
- * `options.id` is the submission's address (see `## The three stages`):
238
- * while this call is outstanding, `id` is tracked in `#pendingSteerIds` so
239
- * `retractSubmission`/`editSubmission` can route to it. Omitted by the one
240
- * caller that has no such id — background subagent notifications, via
241
- * `injectIntoActiveTurn` directly — which can never be retracted or edited.
242
- */
223
+ /** Compatibility view of mailbox admission; submitMessage also owns fallback. */
243
224
  async steerActiveTurn(input, options) {
244
225
  const turn = normalizeUserTurn(input);
245
226
  if (!turn.text.trim() && !turn.images?.length)
246
227
  return false;
247
- return this.injectIntoActiveTurn([userTurnToProviderItem(turn, { steering: true })], options);
228
+ const id = options?.id;
229
+ // Addressed legacy callers share the registry; normal submissions already
230
+ // own their record before asking the mailbox to admit its projection.
231
+ const record = id && !this.#submissions.has(id)
232
+ ? { stage: 'pending_steer', input: turn, options: {}, resolve: () => undefined, reject: () => undefined }
233
+ : undefined;
234
+ if (id && record)
235
+ this.#submissions.set(id, record);
236
+ try {
237
+ return await this.injectIntoActiveTurn([userTurnToProviderItem(turn, { steering: true })], options);
238
+ }
239
+ finally {
240
+ if (id && record && this.#submissions.get(id) === record)
241
+ this.#submissions.delete(id);
242
+ }
248
243
  }
249
244
  /**
250
245
  * Hand pre-built items to the turn already running, admitted at its next
@@ -266,43 +261,19 @@ export class ConversationAdapter {
266
261
  if (!this.isQueueActive())
267
262
  return false;
268
263
  const id = options?.id;
269
- if (id)
270
- this.#pendingSteerIds.add(id);
271
- try {
272
- const outcome = await this.#turnFlow.steer(items, id ? { id } : undefined);
273
- return outcome === 'admitted';
274
- }
275
- finally {
276
- if (id)
277
- this.#pendingSteerIds.delete(id);
278
- }
264
+ const outcome = await this.#turnFlow.steer(items, id ? { id } : undefined);
265
+ return outcome === 'admitted';
279
266
  }
280
- /**
281
- * Retract a submission before it reaches the model, addressed by the id
282
- * `sendMessage`/`steerActiveTurn` were given (`preferredMessageId`), which
283
- * is the same id the UI already keys `pendingQueuedMessages` on.
284
- *
285
- * Routes by stage (`## The three stages`): a still-waiting steer goes to
286
- * `retractSteer` on the run loop; a queued item goes to the controller's
287
- * `remove_queued`.
288
- *
289
- * A pending steer has no matching `#messagesById` entry to settle — its
290
- * caller (`steerActiveTurn`) awaits the `turnFlow.steer` promise directly,
291
- * not a queued `sendMessage`. `retractSteer` resolves that promise itself
292
- * (with `'retracted'`), which `injectIntoActiveTurn` reports as `false` to
293
- * that caller. A queued item, by contrast, *does* have a `sendMessage`
294
- * promise parked in `#messagesById`, which this settles with an
295
- * `AbortError` — the same shape `removeLastQueuedItem` already used.
296
- */
267
+ /** Mutate only the owner's still-pending record and its queue/mailbox projection. */
297
268
  async retractSubmission(id) {
298
- if (this.#pendingSteerIds.has(id)) {
269
+ if (this.#submissions.get(id)?.stage === 'pending_steer') {
299
270
  if (!this.#turnFlow.retractSteer) {
300
271
  throw new Error(`ConversationAdapter.retractSubmission: pending steer '${id}' has no turnFlow.retractSteer to route to`);
301
272
  }
302
273
  const retracted = this.#turnFlow.retractSteer(id);
303
274
  if (!retracted)
304
275
  return { kind: 'too_late', stage: 'started' };
305
- this.#pendingSteerIds.delete(id);
276
+ this.#submissions.delete(id);
306
277
  return { kind: 'applied', stage: 'pending_steer' };
307
278
  }
308
279
  if (this.#queue) {
@@ -316,45 +287,42 @@ export class ConversationAdapter {
316
287
  return { kind: 'applied', stage: 'queued' };
317
288
  }
318
289
  }
319
- if (this.#messagesById.has(id))
290
+ if (this.#submissions.has(id))
320
291
  return { kind: 'too_late', stage: 'started' };
321
292
  return { kind: 'unknown_id' };
322
293
  }
323
- /**
324
- * Replace a submission's content in place, without changing its stage or
325
- * position — a pending steer stays a steer at its slot, a queued item keeps
326
- * its queue index and steer-ahead-of-follow-ups priority.
327
- *
328
- * **The trap**: the controller queue stores display `text` only.
329
- * `#runQueuedTurn` executes `message.input` from `#messagesById`, so
330
- * issuing `edit_queued` alone redraws the new text but sends the old turn.
331
- * This replaces the `#messagesById` entry's `input` first, keeping the
332
- * `QUEUED_NON_TEXT_PLACEHOLDER` substitution `sendMessage` applies to the
333
- * controller's display copy.
334
- */
294
+ /** Keep the executable payload and display projection in the same mutation. */
335
295
  async editSubmission(id, turn) {
336
- if (this.#pendingSteerIds.has(id)) {
296
+ if (this.#submissions.get(id)?.stage === 'pending_steer') {
337
297
  if (!this.#turnFlow.editSteer) {
338
298
  throw new Error(`ConversationAdapter.editSubmission: pending steer '${id}' has no turnFlow.editSteer to route to`);
339
299
  }
340
- const item = userTurnToProviderItem(normalizeUserTurn(turn), { steering: true });
300
+ const submission = this.#submissions.get(id);
301
+ const item = userTurnToProviderItem(normalizeUserTurn(submission.prepareInput?.(turn) ?? turn), {
302
+ steering: true,
303
+ });
341
304
  const edited = this.#turnFlow.editSteer(id, [item]);
342
- return edited ? { kind: 'applied', stage: 'pending_steer' } : { kind: 'too_late', stage: 'started' };
305
+ if (!edited)
306
+ return { kind: 'too_late', stage: 'started' };
307
+ submission.input = structuredClone(turn);
308
+ const { inputSurgeApproval: _approval, ...options } = submission.options;
309
+ submission.options = options;
310
+ return { kind: 'applied', stage: 'pending_steer' };
343
311
  }
344
312
  if (this.#queue) {
345
313
  const inQueue = this.#queue.state().queue.some((item) => item.id === id);
346
314
  if (inQueue) {
347
- const message = this.#messagesById.get(id);
315
+ const message = this.#submissions.get(id);
348
316
  if (!message)
349
317
  return { kind: 'unknown_id' };
350
318
  const { inputSurgeApproval: _invalidatedApproval, ...options } = message.options;
351
- this.#messagesById.set(id, { ...message, input: structuredClone(turn), options });
319
+ this.#submissions.set(id, { ...message, input: structuredClone(turn), options });
352
320
  const displayText = normalizeUserTurn(turn).text;
353
321
  const controllerText = displayText.trim() ? displayText : QUEUED_NON_TEXT_PLACEHOLDER;
354
322
  const result = await this.#queue.command({ kind: 'edit_queued', itemId: id, text: controllerText });
355
323
  if (result.kind !== 'accepted') {
356
- if (this.#messagesById.has(id)) {
357
- this.#messagesById.set(id, message);
324
+ if (this.#submissions.has(id)) {
325
+ this.#submissions.set(id, message);
358
326
  }
359
327
  return { kind: 'too_late', stage: 'started' };
360
328
  }
@@ -362,14 +330,66 @@ export class ConversationAdapter {
362
330
  return { kind: 'applied', stage: 'queued' };
363
331
  }
364
332
  }
365
- if (this.#messagesById.has(id))
333
+ if (this.#submissions.has(id))
366
334
  return { kind: 'too_late', stage: 'started' };
367
335
  return { kind: 'unknown_id' };
368
336
  }
369
- async sendMessage(input, { onAdmission, onTextChunk, onReasoningChunk, onCommandMessage, onEvent, hallucinationRetryCount = 0, inputSurgeApproval, replayFromHistory, preferredMessageId, busyMode, suppressUserMessageDisplay, } = {}) {
337
+ /** Own steer admission and fallback with the same id and latest payload. */
338
+ async submitMessage(input, options = {}, delivery) {
339
+ const id = options.preferredMessageId ?? String(this.#nextQueuedMessageId++);
340
+ if (this.#submissions.has(id))
341
+ throw new Error(`A submission already uses request id ${id}`);
342
+ const submission = {
343
+ stage: 'pending_steer',
344
+ prepareInput: (value) => (typeof value === 'string' ? value : injectSkillIntoTurn(value)),
345
+ input: structuredClone(input),
346
+ options,
347
+ resolve: () => undefined,
348
+ reject: () => undefined,
349
+ };
350
+ if (options.busyMode !== 'steer' || !this.isQueueOwningSubmissions()) {
351
+ return {
352
+ kind: 'turn',
353
+ terminal: await this.#sendMessage(submission.input, {
354
+ ...options,
355
+ preferredMessageId: id,
356
+ }, submission),
357
+ };
358
+ }
359
+ this.#submissions.set(id, submission);
360
+ const epoch = this.#cancellationEpoch;
361
+ try {
362
+ const admitted = await this.steerActiveTurn(submission.prepareInput(submission.input), { id });
363
+ if ((!admitted && epoch !== this.#cancellationEpoch) || this.#submissions.get(id) !== submission) {
364
+ throw queueCancellationError('Pending submission was cancelled');
365
+ }
366
+ delivery?.onSteerSettled(admitted, submission.input);
367
+ if (admitted) {
368
+ this.#submissions.delete(id);
369
+ return { kind: 'steered' };
370
+ }
371
+ submission.input = delivery?.prepareFollowUp?.(submission.input) ?? submission.input;
372
+ return {
373
+ kind: 'turn',
374
+ terminal: await this.#sendMessage(submission.input, {
375
+ ...submission.options,
376
+ preferredMessageId: id,
377
+ }, submission),
378
+ };
379
+ }
380
+ finally {
381
+ if (this.#submissions.get(id) === submission && submission.stage === 'pending_steer') {
382
+ this.#submissions.delete(id);
383
+ }
384
+ }
385
+ }
386
+ sendMessage(input, options = {}) {
387
+ return this.#sendMessage(input, options);
388
+ }
389
+ async #sendMessage(input, { onAdmission, onTextChunk, onReasoningChunk, onCommandMessage, onEvent, hallucinationRetryCount = 0, inputSurgeApproval, replayFromHistory, preferredMessageId, busyMode, suppressUserMessageDisplay, } = {}, existing) {
370
390
  const queue = this.#queue;
371
391
  if (!queue) {
372
- return this.#executeMessage(input, {
392
+ return this.#executeMessage(existing?.prepareInput?.(input) ?? input, {
373
393
  onTextChunk,
374
394
  onReasoningChunk,
375
395
  onCommandMessage,
@@ -385,11 +405,13 @@ export class ConversationAdapter {
385
405
  }
386
406
  return new Promise((resolve, reject) => {
387
407
  const requestId = preferredMessageId ?? String(this.#nextQueuedMessageId++);
388
- if (this.#messagesById.has(requestId)) {
408
+ if (this.#submissions.has(requestId) && this.#submissions.get(requestId) !== existing) {
389
409
  reject(new Error(`A queued message already uses request id ${requestId}`));
390
410
  return;
391
411
  }
392
412
  const message = {
413
+ stage: 'queued',
414
+ prepareInput: existing?.prepareInput,
393
415
  input: typeof input === 'string' ? input : structuredClone(input),
394
416
  options: {
395
417
  onTextChunk,
@@ -405,7 +427,9 @@ export class ConversationAdapter {
405
427
  resolve,
406
428
  reject,
407
429
  };
408
- this.#messagesById.set(requestId, message);
430
+ if (existing)
431
+ Object.assign(existing, message);
432
+ this.#submissions.set(requestId, existing ?? message);
409
433
  const displayText = normalizeUserTurn(input).text;
410
434
  const controllerText = displayText.trim() ? displayText : QUEUED_NON_TEXT_PLACEHOLDER;
411
435
  void queue
@@ -582,7 +606,7 @@ export class ConversationAdapter {
582
606
  };
583
607
  void proof.completion.then(settle, settle);
584
608
  }
585
- if (this.#cancellationProven && activeRequestId && this.#messagesById.has(activeRequestId)) {
609
+ if (this.#cancellationProven && activeRequestId && this.#submissions.has(activeRequestId)) {
586
610
  this.#settleFailure(activeRequestId, queueCancellationError('Active turn was cancelled'));
587
611
  }
588
612
  if (this.#cancellationProven && this.#activeRequestId === activeRequestId) {
@@ -599,9 +623,11 @@ export class ConversationAdapter {
599
623
  #startQueuedTurn(execution) {
600
624
  // Notify the orchestrator/UI before kicking off the run so that the user
601
625
  // message can be appended to the message list with the correct timeline.
602
- // Recovered items have no #messagesById entry; still fire so a delivered
626
+ // Recovered items have no #submissions entry; still fire so a delivered
603
627
  // row cannot stay in the pending list after the queue has started it.
604
- const message = this.#messagesById.get(execution.snapshot.requestId);
628
+ const message = this.#submissions.get(execution.snapshot.requestId);
629
+ if (message)
630
+ message.stage = 'started';
605
631
  if (this.#queuedTurnStartObserver) {
606
632
  try {
607
633
  this.#queuedTurnStartObserver({
@@ -632,7 +658,7 @@ export class ConversationAdapter {
632
658
  * of the active turn is the same shape with `reason: 'manual'`.
633
659
  */
634
660
  async #runQueuedTurn(execution) {
635
- const message = this.#messagesById.get(execution.snapshot.requestId);
661
+ const message = this.#submissions.get(execution.snapshot.requestId);
636
662
  try {
637
663
  const recoveredInput = execution.item.text === QUEUED_NON_TEXT_PLACEHOLDER || execution.item.text === LEGACY_QUEUED_MESSAGE_PLACEHOLDER
638
664
  ? null
@@ -640,7 +666,7 @@ export class ConversationAdapter {
640
666
  if (!message && !recoveredInput) {
641
667
  throw new Error('Recovered queued message has no executable text input');
642
668
  }
643
- const result = await this.#executeMessage(message?.input ?? recoveredInput, message?.options ?? {}, execution.snapshot.requestId);
669
+ const result = await this.#executeMessage(message ? message.prepareInput?.(message.input) ?? message.input : recoveredInput, message?.options ?? {}, execution.snapshot.requestId);
644
670
  if (result.type === 'approval_required') {
645
671
  this.#approvalExecutionId = execution.executionId;
646
672
  this.#approvalActionId = `adapter-action-${this.#nextActionId++}`;
@@ -700,17 +726,17 @@ export class ConversationAdapter {
700
726
  }
701
727
  }
702
728
  #settleSuccess(requestId, terminal) {
703
- const message = this.#messagesById.get(requestId);
729
+ const message = this.#submissions.get(requestId);
704
730
  if (!message)
705
731
  return;
706
- this.#messagesById.delete(requestId);
732
+ this.#submissions.delete(requestId);
707
733
  message.resolve(terminal);
708
734
  }
709
735
  #settleFailure(requestId, error) {
710
- const message = this.#messagesById.get(requestId);
736
+ const message = this.#submissions.get(requestId);
711
737
  if (!message)
712
738
  return;
713
- this.#messagesById.delete(requestId);
739
+ this.#submissions.delete(requestId);
714
740
  message.reject(error);
715
741
  }
716
742
  async #collectTerminalResult(events, options, cancellationEpoch, requestId) {