@qduc/term2 0.7.0 → 0.7.1

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 (641) hide show
  1. package/dist/agent.d.ts +0 -1
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +28 -8
  4. package/dist/agent.js.map +1 -1
  5. package/dist/agent.lite-mode.test.d.ts +2 -0
  6. package/dist/agent.lite-mode.test.d.ts.map +1 -0
  7. package/dist/agent.lite-mode.test.js +39 -0
  8. package/dist/agent.lite-mode.test.js.map +1 -0
  9. package/dist/app.d.ts.map +1 -1
  10. package/dist/app.js +35 -11
  11. package/dist/app.js.map +1 -1
  12. package/dist/cli.integration.test.d.ts +2 -0
  13. package/dist/cli.integration.test.d.ts.map +1 -0
  14. package/dist/cli.integration.test.js +102 -0
  15. package/dist/cli.integration.test.js.map +1 -0
  16. package/dist/cli.js +20 -3
  17. package/dist/cli.js.map +1 -1
  18. package/dist/commands/auto-approve-command.d.ts +10 -0
  19. package/dist/commands/auto-approve-command.d.ts.map +1 -0
  20. package/dist/commands/auto-approve-command.js +40 -0
  21. package/dist/commands/auto-approve-command.js.map +1 -0
  22. package/dist/commands/clear-command.d.ts +3 -0
  23. package/dist/commands/clear-command.d.ts.map +1 -0
  24. package/dist/commands/clear-command.js +12 -0
  25. package/dist/commands/clear-command.js.map +1 -0
  26. package/dist/commands/copy-command.d.ts +10 -0
  27. package/dist/commands/copy-command.d.ts.map +1 -0
  28. package/dist/commands/copy-command.js +25 -0
  29. package/dist/commands/copy-command.js.map +1 -0
  30. package/dist/commands/effort-command.d.ts +11 -0
  31. package/dist/commands/effort-command.d.ts.map +1 -0
  32. package/dist/commands/effort-command.js +34 -0
  33. package/dist/commands/effort-command.js.map +1 -0
  34. package/dist/commands/guarded-settings-command.d.ts +14 -0
  35. package/dist/commands/guarded-settings-command.d.ts.map +1 -0
  36. package/dist/commands/guarded-settings-command.js +23 -0
  37. package/dist/commands/guarded-settings-command.js.map +1 -0
  38. package/dist/commands/handoff-command.d.ts +10 -0
  39. package/dist/commands/handoff-command.d.ts.map +1 -0
  40. package/dist/commands/handoff-command.js +17 -0
  41. package/dist/commands/handoff-command.js.map +1 -0
  42. package/dist/commands/mode-commands.d.ts +32 -0
  43. package/dist/commands/mode-commands.d.ts.map +1 -0
  44. package/dist/commands/mode-commands.js +64 -0
  45. package/dist/commands/mode-commands.js.map +1 -0
  46. package/dist/commands/model-command.d.ts +11 -0
  47. package/dist/commands/model-command.d.ts.map +1 -0
  48. package/dist/commands/model-command.js +35 -0
  49. package/dist/commands/model-command.js.map +1 -0
  50. package/dist/commands/quit-command.d.ts +3 -0
  51. package/dist/commands/quit-command.d.ts.map +1 -0
  52. package/dist/commands/quit-command.js +10 -0
  53. package/dist/commands/quit-command.js.map +1 -0
  54. package/dist/commands/retry-command.d.ts +19 -0
  55. package/dist/commands/retry-command.d.ts.map +1 -0
  56. package/dist/commands/retry-command.js +30 -0
  57. package/dist/commands/retry-command.js.map +1 -0
  58. package/dist/commands/undo-command.d.ts +15 -0
  59. package/dist/commands/undo-command.d.ts.map +1 -0
  60. package/dist/commands/undo-command.js +28 -0
  61. package/dist/commands/undo-command.js.map +1 -0
  62. package/dist/commands/usage-command.d.ts +3 -0
  63. package/dist/commands/usage-command.d.ts.map +1 -0
  64. package/dist/commands/usage-command.js +11 -0
  65. package/dist/commands/usage-command.js.map +1 -0
  66. package/dist/components/ApprovalPrompt.test.d.ts +2 -0
  67. package/dist/components/ApprovalPrompt.test.d.ts.map +1 -0
  68. package/dist/components/ApprovalPrompt.test.js +23 -0
  69. package/dist/components/ApprovalPrompt.test.js.map +1 -0
  70. package/dist/components/BottomArea.d.ts +3 -0
  71. package/dist/components/BottomArea.d.ts.map +1 -1
  72. package/dist/components/BottomArea.js +3 -3
  73. package/dist/components/BottomArea.js.map +1 -1
  74. package/dist/components/InputBox.d.ts +1 -0
  75. package/dist/components/InputBox.d.ts.map +1 -1
  76. package/dist/components/InputBox.js +2 -1
  77. package/dist/components/InputBox.js.map +1 -1
  78. package/dist/components/LiveResponse.test.d.ts +2 -0
  79. package/dist/components/LiveResponse.test.d.ts.map +1 -0
  80. package/dist/components/LiveResponse.test.js +13 -0
  81. package/dist/components/LiveResponse.test.js.map +1 -0
  82. package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts +2 -0
  83. package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts.map +1 -0
  84. package/dist/components/ModelSelectionMenu.error-tabs.test.js +18 -0
  85. package/dist/components/ModelSelectionMenu.error-tabs.test.js.map +1 -0
  86. package/dist/components/StatusBar.d.ts +4 -0
  87. package/dist/components/StatusBar.d.ts.map +1 -1
  88. package/dist/components/StatusBar.js +17 -3
  89. package/dist/components/StatusBar.js.map +1 -1
  90. package/dist/components/StatusBar.test.js +15 -0
  91. package/dist/components/StatusBar.test.js.map +1 -1
  92. package/dist/components/TextInput.d.ts +42 -0
  93. package/dist/components/TextInput.d.ts.map +1 -0
  94. package/dist/components/TextInput.js +398 -0
  95. package/dist/components/TextInput.js.map +1 -0
  96. package/dist/components/TextInput.test.d.ts +2 -0
  97. package/dist/components/TextInput.test.d.ts.map +1 -0
  98. package/dist/components/TextInput.test.js +75 -0
  99. package/dist/components/TextInput.test.js.map +1 -0
  100. package/dist/contracts/conversation.d.ts +3 -0
  101. package/dist/contracts/conversation.d.ts.map +1 -1
  102. package/dist/debug_ask_mentor.d.ts +2 -0
  103. package/dist/debug_ask_mentor.d.ts.map +1 -0
  104. package/dist/debug_ask_mentor.js +73 -0
  105. package/dist/debug_ask_mentor.js.map +1 -0
  106. package/dist/hooks/use-app-commands.d.ts +11 -32
  107. package/dist/hooks/use-app-commands.d.ts.map +1 -1
  108. package/dist/hooks/use-app-commands.js +64 -369
  109. package/dist/hooks/use-app-commands.js.map +1 -1
  110. package/dist/hooks/use-app-commands.test.js +24 -15
  111. package/dist/hooks/use-app-commands.test.js.map +1 -1
  112. package/dist/hooks/use-conversation.clear.test.js +49 -1
  113. package/dist/hooks/use-conversation.clear.test.js.map +1 -1
  114. package/dist/hooks/use-conversation.d.ts +4 -1
  115. package/dist/hooks/use-conversation.d.ts.map +1 -1
  116. package/dist/hooks/use-conversation.js +11 -22
  117. package/dist/hooks/use-conversation.js.map +1 -1
  118. package/dist/hooks/use-conversation.max-turns-undo.test.d.ts +2 -0
  119. package/dist/hooks/use-conversation.max-turns-undo.test.d.ts.map +1 -0
  120. package/dist/hooks/use-conversation.max-turns-undo.test.js +118 -0
  121. package/dist/hooks/use-conversation.max-turns-undo.test.js.map +1 -0
  122. package/dist/hooks/use-mode-handlers.d.ts +4 -1
  123. package/dist/hooks/use-mode-handlers.d.ts.map +1 -1
  124. package/dist/hooks/use-mode-handlers.js +6 -1
  125. package/dist/hooks/use-mode-handlers.js.map +1 -1
  126. package/dist/hooks/use-runtime-settings.d.ts.map +1 -1
  127. package/dist/hooks/use-runtime-settings.js +2 -2
  128. package/dist/hooks/use-runtime-settings.js.map +1 -1
  129. package/dist/hooks/use-runtime-settings.test.js +0 -1
  130. package/dist/hooks/use-runtime-settings.test.js.map +1 -1
  131. package/dist/hooks/use-slash-commands.d.ts.map +1 -1
  132. package/dist/hooks/use-slash-commands.js +10 -0
  133. package/dist/hooks/use-slash-commands.js.map +1 -1
  134. package/dist/hooks/use-slash-commands.test.js +35 -5
  135. package/dist/hooks/use-slash-commands.test.js.map +1 -1
  136. package/dist/hooks/use-undo-selection.d.ts.map +1 -1
  137. package/dist/hooks/use-undo-selection.js +3 -1
  138. package/dist/hooks/use-undo-selection.js.map +1 -1
  139. package/dist/lib/openai-agent-client.d.ts.map +1 -1
  140. package/dist/lib/openai-agent-client.flex-tier.test.js +8 -3
  141. package/dist/lib/openai-agent-client.flex-tier.test.js.map +1 -1
  142. package/dist/lib/openai-agent-client.js +7 -1
  143. package/dist/lib/openai-agent-client.js.map +1 -1
  144. package/dist/lib/shell.d.ts +7 -0
  145. package/dist/lib/shell.d.ts.map +1 -0
  146. package/dist/lib/shell.js +56 -0
  147. package/dist/lib/shell.js.map +1 -0
  148. package/dist/lib/tool-selection-policy.d.ts.map +1 -1
  149. package/dist/lib/tool-selection-policy.js +43 -2
  150. package/dist/lib/tool-selection-policy.js.map +1 -1
  151. package/dist/lib/tool-selection-policy.test.js +39 -0
  152. package/dist/lib/tool-selection-policy.test.js.map +1 -1
  153. package/dist/modes/companion/command-index.d.ts +26 -0
  154. package/dist/modes/companion/command-index.d.ts.map +1 -0
  155. package/dist/modes/companion/command-index.js +50 -0
  156. package/dist/modes/companion/command-index.js.map +1 -0
  157. package/dist/modes/companion/command-index.test.d.ts +2 -0
  158. package/dist/modes/companion/command-index.test.d.ts.map +1 -0
  159. package/dist/modes/companion/command-index.test.js +86 -0
  160. package/dist/modes/companion/command-index.test.js.map +1 -0
  161. package/dist/modes/companion/companion-app.d.ts +12 -0
  162. package/dist/modes/companion/companion-app.d.ts.map +1 -0
  163. package/dist/modes/companion/companion-app.js +297 -0
  164. package/dist/modes/companion/companion-app.js.map +1 -0
  165. package/dist/modes/companion/companion-session.d.ts +63 -0
  166. package/dist/modes/companion/companion-session.d.ts.map +1 -0
  167. package/dist/modes/companion/companion-session.js +146 -0
  168. package/dist/modes/companion/companion-session.js.map +1 -0
  169. package/dist/modes/companion/companion-session.test.d.ts +2 -0
  170. package/dist/modes/companion/companion-session.test.d.ts.map +1 -0
  171. package/dist/modes/companion/companion-session.test.js +28 -0
  172. package/dist/modes/companion/companion-session.test.js.map +1 -0
  173. package/dist/modes/companion/components/status-bar.d.ts +13 -0
  174. package/dist/modes/companion/components/status-bar.d.ts.map +1 -0
  175. package/dist/modes/companion/components/status-bar.js +26 -0
  176. package/dist/modes/companion/components/status-bar.js.map +1 -0
  177. package/dist/modes/companion/context-buffer.d.ts +65 -0
  178. package/dist/modes/companion/context-buffer.d.ts.map +1 -0
  179. package/dist/modes/companion/context-buffer.js +156 -0
  180. package/dist/modes/companion/context-buffer.js.map +1 -0
  181. package/dist/modes/companion/context-buffer.test.d.ts +2 -0
  182. package/dist/modes/companion/context-buffer.test.d.ts.map +1 -0
  183. package/dist/modes/companion/context-buffer.test.js +154 -0
  184. package/dist/modes/companion/context-buffer.test.js.map +1 -0
  185. package/dist/modes/companion/event-detector.d.ts +46 -0
  186. package/dist/modes/companion/event-detector.d.ts.map +1 -0
  187. package/dist/modes/companion/event-detector.js +169 -0
  188. package/dist/modes/companion/event-detector.js.map +1 -0
  189. package/dist/modes/companion/event-detector.test.d.ts +2 -0
  190. package/dist/modes/companion/event-detector.test.d.ts.map +1 -0
  191. package/dist/modes/companion/event-detector.test.js +121 -0
  192. package/dist/modes/companion/event-detector.test.js.map +1 -0
  193. package/dist/modes/companion/index.d.ts +33 -0
  194. package/dist/modes/companion/index.d.ts.map +1 -0
  195. package/dist/modes/companion/index.js +21 -0
  196. package/dist/modes/companion/index.js.map +1 -0
  197. package/dist/modes/companion/input-key-mapper.d.ts +3 -0
  198. package/dist/modes/companion/input-key-mapper.d.ts.map +1 -0
  199. package/dist/modes/companion/input-key-mapper.js +31 -0
  200. package/dist/modes/companion/input-key-mapper.js.map +1 -0
  201. package/dist/modes/companion/input-key-mapper.test.d.ts +2 -0
  202. package/dist/modes/companion/input-key-mapper.test.d.ts.map +1 -0
  203. package/dist/modes/companion/input-key-mapper.test.js +26 -0
  204. package/dist/modes/companion/input-key-mapper.test.js.map +1 -0
  205. package/dist/modes/companion/input-parser.d.ts +53 -0
  206. package/dist/modes/companion/input-parser.d.ts.map +1 -0
  207. package/dist/modes/companion/input-parser.js +114 -0
  208. package/dist/modes/companion/input-parser.js.map +1 -0
  209. package/dist/modes/companion/input-parser.test.d.ts +2 -0
  210. package/dist/modes/companion/input-parser.test.d.ts.map +1 -0
  211. package/dist/modes/companion/input-parser.test.js +123 -0
  212. package/dist/modes/companion/input-parser.test.js.map +1 -0
  213. package/dist/modes/companion/mode-manager.d.ts +41 -0
  214. package/dist/modes/companion/mode-manager.d.ts.map +1 -0
  215. package/dist/modes/companion/mode-manager.js +56 -0
  216. package/dist/modes/companion/mode-manager.js.map +1 -0
  217. package/dist/modes/companion/mode-manager.test.d.ts +2 -0
  218. package/dist/modes/companion/mode-manager.test.d.ts.map +1 -0
  219. package/dist/modes/companion/mode-manager.test.js +65 -0
  220. package/dist/modes/companion/mode-manager.test.js.map +1 -0
  221. package/dist/modes/companion/output-classifier.d.ts +15 -0
  222. package/dist/modes/companion/output-classifier.d.ts.map +1 -0
  223. package/dist/modes/companion/output-classifier.js +77 -0
  224. package/dist/modes/companion/output-classifier.js.map +1 -0
  225. package/dist/modes/companion/output-classifier.test.d.ts +2 -0
  226. package/dist/modes/companion/output-classifier.test.d.ts.map +1 -0
  227. package/dist/modes/companion/output-classifier.test.js +133 -0
  228. package/dist/modes/companion/output-classifier.test.js.map +1 -0
  229. package/dist/modes/companion/pty-wrapper.d.ts +46 -0
  230. package/dist/modes/companion/pty-wrapper.d.ts.map +1 -0
  231. package/dist/modes/companion/pty-wrapper.js +143 -0
  232. package/dist/modes/companion/pty-wrapper.js.map +1 -0
  233. package/dist/modes/companion/safety-classifier.d.ts +31 -0
  234. package/dist/modes/companion/safety-classifier.d.ts.map +1 -0
  235. package/dist/modes/companion/safety-classifier.js +140 -0
  236. package/dist/modes/companion/safety-classifier.js.map +1 -0
  237. package/dist/modes/companion/safety-classifier.test.d.ts +2 -0
  238. package/dist/modes/companion/safety-classifier.test.d.ts.map +1 -0
  239. package/dist/modes/companion/safety-classifier.test.js +151 -0
  240. package/dist/modes/companion/safety-classifier.test.js.map +1 -0
  241. package/dist/modes/companion/summarizer.d.ts +24 -0
  242. package/dist/modes/companion/summarizer.d.ts.map +1 -0
  243. package/dist/modes/companion/summarizer.js +132 -0
  244. package/dist/modes/companion/summarizer.js.map +1 -0
  245. package/dist/modes/companion/terminal-history.d.ts +27 -0
  246. package/dist/modes/companion/terminal-history.d.ts.map +1 -0
  247. package/dist/modes/companion/terminal-history.js +142 -0
  248. package/dist/modes/companion/terminal-history.js.map +1 -0
  249. package/dist/prompts/gpt-5-modern.md +0 -6
  250. package/dist/prompts/gpt-5.md +4 -7
  251. package/dist/prompts/search-via-shell.d.ts.map +1 -1
  252. package/dist/prompts/search-via-shell.js +0 -1
  253. package/dist/prompts/search-via-shell.js.map +1 -1
  254. package/dist/prompts/search-via-shell.ts +0 -1
  255. package/dist/prompts/shell-auto-approval.d.ts +2 -2
  256. package/dist/prompts/shell-auto-approval.d.ts.map +1 -1
  257. package/dist/prompts/shell-auto-approval.js +6 -6
  258. package/dist/prompts/shell-auto-approval.js.map +1 -1
  259. package/dist/prompts/shell-auto-approval.ts +6 -6
  260. package/dist/prompts/simple-mentor.md +215 -0
  261. package/dist/prompts/simple-prev.md +55 -0
  262. package/dist/prompts/simple.md +31 -53
  263. package/dist/prompts/subagent-delegation.js +2 -2
  264. package/dist/prompts/subagent-delegation.js.map +1 -1
  265. package/dist/prompts/subagent-delegation.ts +2 -2
  266. package/dist/providers/ai-sdk-openai-compatible.provider.d.ts +2 -0
  267. package/dist/providers/ai-sdk-openai-compatible.provider.d.ts.map +1 -1
  268. package/dist/providers/ai-sdk-openai-compatible.provider.js +8 -4
  269. package/dist/providers/ai-sdk-openai-compatible.provider.js.map +1 -1
  270. package/dist/providers/ai-sdk-openai-compatible.provider.test.js +119 -1
  271. package/dist/providers/ai-sdk-openai-compatible.provider.test.js.map +1 -1
  272. package/dist/providers/ai-sdk-openai.provider.d.ts +14 -0
  273. package/dist/providers/ai-sdk-openai.provider.d.ts.map +1 -0
  274. package/dist/providers/ai-sdk-openai.provider.js +18 -0
  275. package/dist/providers/ai-sdk-openai.provider.js.map +1 -0
  276. package/dist/providers/codex-responses-model.d.ts +4 -3
  277. package/dist/providers/codex-responses-model.d.ts.map +1 -1
  278. package/dist/providers/codex-responses-model.js +26 -16
  279. package/dist/providers/codex-responses-model.js.map +1 -1
  280. package/dist/providers/codex-responses-model.test.js +115 -1
  281. package/dist/providers/codex-responses-model.test.js.map +1 -1
  282. package/dist/providers/codex.provider.d.ts +0 -2
  283. package/dist/providers/codex.provider.d.ts.map +1 -1
  284. package/dist/providers/codex.provider.js +2 -6
  285. package/dist/providers/codex.provider.js.map +1 -1
  286. package/dist/providers/codex.provider.test.js +4 -31
  287. package/dist/providers/codex.provider.test.js.map +1 -1
  288. package/dist/providers/custom-provider-adapter.test.js +3 -3
  289. package/dist/providers/custom-provider-adapter.test.js.map +1 -1
  290. package/dist/providers/fallback-responses-model.d.ts.map +1 -1
  291. package/dist/providers/fallback-responses-model.js +152 -83
  292. package/dist/providers/fallback-responses-model.js.map +1 -1
  293. package/dist/providers/fallback-responses-model.test.js +289 -0
  294. package/dist/providers/fallback-responses-model.test.js.map +1 -1
  295. package/dist/providers/github-copilot/converters.d.ts +45 -0
  296. package/dist/providers/github-copilot/converters.d.ts.map +1 -0
  297. package/dist/providers/github-copilot/converters.js +118 -0
  298. package/dist/providers/github-copilot/converters.js.map +1 -0
  299. package/dist/providers/github-copilot/converters.test.d.ts +2 -0
  300. package/dist/providers/github-copilot/converters.test.d.ts.map +1 -0
  301. package/dist/providers/github-copilot/converters.test.js +162 -0
  302. package/dist/providers/github-copilot/converters.test.js.map +1 -0
  303. package/dist/providers/github-copilot/github-copilot.provider.d.ts +2 -0
  304. package/dist/providers/github-copilot/github-copilot.provider.d.ts.map +1 -0
  305. package/dist/providers/github-copilot/github-copilot.provider.js +75 -0
  306. package/dist/providers/github-copilot/github-copilot.provider.js.map +1 -0
  307. package/dist/providers/github-copilot/github-copilot.provider.test.d.ts +2 -0
  308. package/dist/providers/github-copilot/github-copilot.provider.test.d.ts.map +1 -0
  309. package/dist/providers/github-copilot/github-copilot.provider.test.js +26 -0
  310. package/dist/providers/github-copilot/github-copilot.provider.test.js.map +1 -0
  311. package/dist/providers/github-copilot/index.d.ts +4 -0
  312. package/dist/providers/github-copilot/index.d.ts.map +1 -0
  313. package/dist/providers/github-copilot/index.js +4 -0
  314. package/dist/providers/github-copilot/index.js.map +1 -0
  315. package/dist/providers/github-copilot/model.d.ts +24 -0
  316. package/dist/providers/github-copilot/model.d.ts.map +1 -0
  317. package/dist/providers/github-copilot/model.delta.test.d.ts +2 -0
  318. package/dist/providers/github-copilot/model.delta.test.d.ts.map +1 -0
  319. package/dist/providers/github-copilot/model.delta.test.js +15 -0
  320. package/dist/providers/github-copilot/model.delta.test.js.map +1 -0
  321. package/dist/providers/github-copilot/model.js +498 -0
  322. package/dist/providers/github-copilot/model.js.map +1 -0
  323. package/dist/providers/github-copilot/model.test.d.ts +2 -0
  324. package/dist/providers/github-copilot/model.test.d.ts.map +1 -0
  325. package/dist/providers/github-copilot/model.test.js +63 -0
  326. package/dist/providers/github-copilot/model.test.js.map +1 -0
  327. package/dist/providers/github-copilot/provider.d.ts +15 -0
  328. package/dist/providers/github-copilot/provider.d.ts.map +1 -0
  329. package/dist/providers/github-copilot/provider.js +25 -0
  330. package/dist/providers/github-copilot/provider.js.map +1 -0
  331. package/dist/providers/github-copilot/provider.test.d.ts +2 -0
  332. package/dist/providers/github-copilot/provider.test.d.ts.map +1 -0
  333. package/dist/providers/github-copilot/provider.test.js +52 -0
  334. package/dist/providers/github-copilot/provider.test.js.map +1 -0
  335. package/dist/providers/github-copilot/utils.d.ts +20 -0
  336. package/dist/providers/github-copilot/utils.d.ts.map +1 -0
  337. package/dist/providers/github-copilot/utils.js +142 -0
  338. package/dist/providers/github-copilot/utils.js.map +1 -0
  339. package/dist/providers/github-copilot/utils.test.d.ts +2 -0
  340. package/dist/providers/github-copilot/utils.test.d.ts.map +1 -0
  341. package/dist/providers/github-copilot/utils.test.js +21 -0
  342. package/dist/providers/github-copilot/utils.test.js.map +1 -0
  343. package/dist/providers/openai-compatible/api.d.ts +17 -0
  344. package/dist/providers/openai-compatible/api.d.ts.map +1 -0
  345. package/dist/providers/openai-compatible/api.js +58 -0
  346. package/dist/providers/openai-compatible/api.js.map +1 -0
  347. package/dist/providers/openai-compatible/model.d.ts +17 -0
  348. package/dist/providers/openai-compatible/model.d.ts.map +1 -0
  349. package/dist/providers/openai-compatible/model.js +473 -0
  350. package/dist/providers/openai-compatible/model.js.map +1 -0
  351. package/dist/providers/openai-compatible/provider.d.ts +22 -0
  352. package/dist/providers/openai-compatible/provider.d.ts.map +1 -0
  353. package/dist/providers/openai-compatible/provider.js +43 -0
  354. package/dist/providers/openai-compatible/provider.js.map +1 -0
  355. package/dist/providers/openai-compatible/reasoning-content.test.d.ts +2 -0
  356. package/dist/providers/openai-compatible/reasoning-content.test.d.ts.map +1 -0
  357. package/dist/providers/openai-compatible/reasoning-content.test.js +258 -0
  358. package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -0
  359. package/dist/providers/openai-compatible/utils.d.ts +3 -0
  360. package/dist/providers/openai-compatible/utils.d.ts.map +1 -0
  361. package/dist/providers/openai-compatible/utils.js +11 -0
  362. package/dist/providers/openai-compatible/utils.js.map +1 -0
  363. package/dist/providers/openai-compatible-behavior-gate.test.js +42 -1
  364. package/dist/providers/openai-compatible-behavior-gate.test.js.map +1 -1
  365. package/dist/providers/openai-compatible.provider.d.ts +2 -2
  366. package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
  367. package/dist/providers/openai-compatible.provider.js +3 -3
  368. package/dist/providers/openai-compatible.provider.js.map +1 -1
  369. package/dist/providers/openai.provider.js +5 -3
  370. package/dist/providers/openai.provider.js.map +1 -1
  371. package/dist/providers/openrouter/api.d.ts +39 -0
  372. package/dist/providers/openrouter/api.d.ts.map +1 -0
  373. package/dist/providers/openrouter/api.js +164 -0
  374. package/dist/providers/openrouter/api.js.map +1 -0
  375. package/dist/providers/openrouter/converters.d.ts +8 -0
  376. package/dist/providers/openrouter/converters.d.ts.map +1 -0
  377. package/dist/providers/openrouter/converters.js +391 -0
  378. package/dist/providers/openrouter/converters.js.map +1 -0
  379. package/dist/providers/openrouter/converters.test.d.ts +2 -0
  380. package/dist/providers/openrouter/converters.test.d.ts.map +1 -0
  381. package/dist/providers/openrouter/converters.test.js +179 -0
  382. package/dist/providers/openrouter/converters.test.js.map +1 -0
  383. package/dist/providers/openrouter/index.d.ts +4 -0
  384. package/dist/providers/openrouter/index.d.ts.map +1 -0
  385. package/dist/providers/openrouter/index.js +4 -0
  386. package/dist/providers/openrouter/index.js.map +1 -0
  387. package/dist/providers/openrouter/model.d.ts +14 -0
  388. package/dist/providers/openrouter/model.d.ts.map +1 -0
  389. package/dist/providers/openrouter/model.js +457 -0
  390. package/dist/providers/openrouter/model.js.map +1 -0
  391. package/dist/providers/openrouter/provider.d.ts +15 -0
  392. package/dist/providers/openrouter/provider.d.ts.map +1 -0
  393. package/dist/providers/openrouter/provider.js +21 -0
  394. package/dist/providers/openrouter/provider.js.map +1 -0
  395. package/dist/providers/openrouter/reasoning-content.test.d.ts +2 -0
  396. package/dist/providers/openrouter/reasoning-content.test.d.ts.map +1 -0
  397. package/dist/providers/openrouter/reasoning-content.test.js +122 -0
  398. package/dist/providers/openrouter/reasoning-content.test.js.map +1 -0
  399. package/dist/providers/openrouter/utils.d.ts +11 -0
  400. package/dist/providers/openrouter/utils.d.ts.map +1 -0
  401. package/dist/providers/openrouter/utils.js +29 -0
  402. package/dist/providers/openrouter/utils.js.map +1 -0
  403. package/dist/providers/openrouter.api.retry.test.d.ts +2 -0
  404. package/dist/providers/openrouter.api.retry.test.d.ts.map +1 -0
  405. package/dist/providers/openrouter.api.retry.test.js +148 -0
  406. package/dist/providers/openrouter.api.retry.test.js.map +1 -0
  407. package/dist/providers/openrouter.test.d.ts +2 -0
  408. package/dist/providers/openrouter.test.d.ts.map +1 -0
  409. package/dist/providers/openrouter.test.js +1449 -0
  410. package/dist/providers/openrouter.test.js.map +1 -0
  411. package/dist/providers/protocol-client.d.ts +17 -0
  412. package/dist/providers/protocol-client.d.ts.map +1 -0
  413. package/dist/providers/protocol-client.js +57 -0
  414. package/dist/providers/protocol-client.js.map +1 -0
  415. package/dist/providers/protocol-client.test.d.ts +2 -0
  416. package/dist/providers/protocol-client.test.d.ts.map +1 -0
  417. package/dist/providers/protocol-client.test.js +55 -0
  418. package/dist/providers/protocol-client.test.js.map +1 -0
  419. package/dist/providers/timed-responses-ws-model.d.ts +20 -0
  420. package/dist/providers/timed-responses-ws-model.d.ts.map +1 -0
  421. package/dist/providers/timed-responses-ws-model.js +381 -0
  422. package/dist/providers/timed-responses-ws-model.js.map +1 -0
  423. package/dist/providers/timed-responses-ws-model.test.d.ts +2 -0
  424. package/dist/providers/timed-responses-ws-model.test.d.ts.map +1 -0
  425. package/dist/providers/timed-responses-ws-model.test.js +441 -0
  426. package/dist/providers/timed-responses-ws-model.test.js.map +1 -0
  427. package/dist/providers/timed-ws-connection.d.ts +26 -0
  428. package/dist/providers/timed-ws-connection.d.ts.map +1 -0
  429. package/dist/providers/timed-ws-connection.js +156 -0
  430. package/dist/providers/timed-ws-connection.js.map +1 -0
  431. package/dist/providers/timed-ws-connection.test.d.ts +2 -0
  432. package/dist/providers/timed-ws-connection.test.d.ts.map +1 -0
  433. package/dist/providers/timed-ws-connection.test.js +223 -0
  434. package/dist/providers/timed-ws-connection.test.js.map +1 -0
  435. package/dist/providers/timed-ws-timeouts.d.ts +6 -0
  436. package/dist/providers/timed-ws-timeouts.d.ts.map +1 -0
  437. package/dist/providers/timed-ws-timeouts.js +6 -0
  438. package/dist/providers/timed-ws-timeouts.js.map +1 -0
  439. package/dist/safety-checker.js +57 -0
  440. package/dist/services/check_mock.d.ts +2 -0
  441. package/dist/services/check_mock.d.ts.map +1 -0
  442. package/dist/services/check_mock.js +22 -0
  443. package/dist/services/check_mock.js.map +1 -0
  444. package/dist/services/command-message-streaming.d.ts.map +1 -1
  445. package/dist/services/command-message-streaming.js +8 -3
  446. package/dist/services/command-message-streaming.js.map +1 -1
  447. package/dist/services/conversation-clear-save.test.js +4 -5
  448. package/dist/services/conversation-clear-save.test.js.map +1 -1
  449. package/dist/services/conversation-events.d.ts +4 -0
  450. package/dist/services/conversation-events.d.ts.map +1 -1
  451. package/dist/services/conversation-history-repair.d.ts.map +1 -1
  452. package/dist/services/conversation-history-repair.js +81 -26
  453. package/dist/services/conversation-history-repair.js.map +1 -1
  454. package/dist/services/conversation-integration.test.js +109 -0
  455. package/dist/services/conversation-integration.test.js.map +1 -1
  456. package/dist/services/conversation-log-events.d.ts +16 -10
  457. package/dist/services/conversation-log-events.d.ts.map +1 -1
  458. package/dist/services/conversation-log-events.js +1 -1
  459. package/dist/services/conversation-log-events.js.map +1 -1
  460. package/dist/services/conversation-log-writer.js +1 -1
  461. package/dist/services/conversation-log-writer.js.map +1 -1
  462. package/dist/services/conversation-persistence-types.d.ts +32 -0
  463. package/dist/services/conversation-persistence-types.d.ts.map +1 -1
  464. package/dist/services/conversation-persistence.d.ts +6 -0
  465. package/dist/services/conversation-persistence.d.ts.map +1 -1
  466. package/dist/services/conversation-persistence.js +42 -40
  467. package/dist/services/conversation-persistence.js.map +1 -1
  468. package/dist/services/conversation-persistence.test.js +356 -107
  469. package/dist/services/conversation-persistence.test.js.map +1 -1
  470. package/dist/services/conversation-replay.d.ts.map +1 -1
  471. package/dist/services/conversation-replay.js +219 -11
  472. package/dist/services/conversation-replay.js.map +1 -1
  473. package/dist/services/conversation-replay.test.js +370 -31
  474. package/dist/services/conversation-replay.test.js.map +1 -1
  475. package/dist/services/conversation-result-builder.d.ts +2 -0
  476. package/dist/services/conversation-result-builder.d.ts.map +1 -1
  477. package/dist/services/conversation-result-builder.js +4 -0
  478. package/dist/services/conversation-result-builder.js.map +1 -1
  479. package/dist/services/conversation-result-builder.test.js +126 -0
  480. package/dist/services/conversation-result-builder.test.js.map +1 -1
  481. package/dist/services/conversation-retry-policy.d.ts.map +1 -1
  482. package/dist/services/conversation-retry-policy.js +3 -0
  483. package/dist/services/conversation-retry-policy.js.map +1 -1
  484. package/dist/services/conversation-retry-policy.test.js +4 -0
  485. package/dist/services/conversation-retry-policy.test.js.map +1 -1
  486. package/dist/services/conversation-service.d.ts +3 -3
  487. package/dist/services/conversation-service.d.ts.map +1 -1
  488. package/dist/services/conversation-service.js +0 -3
  489. package/dist/services/conversation-service.js.map +1 -1
  490. package/dist/services/conversation-service.test.d.ts +2 -0
  491. package/dist/services/conversation-service.test.d.ts.map +1 -0
  492. package/dist/services/conversation-service.test.js +156 -0
  493. package/dist/services/conversation-service.test.js.map +1 -0
  494. package/dist/services/conversation-session.d.ts +9 -7
  495. package/dist/services/conversation-session.d.ts.map +1 -1
  496. package/dist/services/conversation-session.js +264 -86
  497. package/dist/services/conversation-session.js.map +1 -1
  498. package/dist/services/conversation-store.d.ts +16 -13
  499. package/dist/services/conversation-store.d.ts.map +1 -1
  500. package/dist/services/conversation-store.js +62 -191
  501. package/dist/services/conversation-store.js.map +1 -1
  502. package/dist/services/conversation-store.merge-modes.removed.d.ts +2 -0
  503. package/dist/services/conversation-store.merge-modes.removed.d.ts.map +1 -0
  504. package/dist/services/conversation-store.merge-modes.removed.js +2 -0
  505. package/dist/services/conversation-store.merge-modes.removed.js.map +1 -0
  506. package/dist/services/conversation-store.merge-modes.test.d.ts +2 -0
  507. package/dist/services/conversation-store.merge-modes.test.d.ts.map +1 -0
  508. package/dist/services/conversation-store.merge-modes.test.js +2 -0
  509. package/dist/services/conversation-store.merge-modes.test.js.map +1 -0
  510. package/dist/services/conversation-store.test.js +157 -294
  511. package/dist/services/conversation-store.test.js.map +1 -1
  512. package/dist/services/conversation-turn-items.d.ts +5 -0
  513. package/dist/services/conversation-turn-items.d.ts.map +1 -0
  514. package/dist/services/conversation-turn-items.js +351 -0
  515. package/dist/services/conversation-turn-items.js.map +1 -0
  516. package/dist/services/conversation-turn-items.test.d.ts +2 -0
  517. package/dist/services/conversation-turn-items.test.d.ts.map +1 -0
  518. package/dist/services/conversation-turn-items.test.js +68 -0
  519. package/dist/services/conversation-turn-items.test.js.map +1 -0
  520. package/dist/services/repro-error.test.d.ts +2 -0
  521. package/dist/services/repro-error.test.d.ts.map +1 -0
  522. package/dist/services/repro-error.test.js +38 -0
  523. package/dist/services/repro-error.test.js.map +1 -0
  524. package/dist/services/subagents/reasoning-inheritance.test.d.ts +2 -0
  525. package/dist/services/subagents/reasoning-inheritance.test.d.ts.map +1 -0
  526. package/dist/services/subagents/reasoning-inheritance.test.js +73 -0
  527. package/dist/services/subagents/reasoning-inheritance.test.js.map +1 -0
  528. package/dist/services/subagents/subagent-manager.d.ts.map +1 -1
  529. package/dist/services/subagents/subagent-manager.js +32 -30
  530. package/dist/services/subagents/subagent-manager.js.map +1 -1
  531. package/dist/services/subagents/subagent-manager.test.js +8 -12
  532. package/dist/services/subagents/subagent-manager.test.js.map +1 -1
  533. package/dist/services/subagents/subagent-session.d.ts +1 -1
  534. package/dist/services/subagents/subagent-session.d.ts.map +1 -1
  535. package/dist/services/subagents/subagent-session.js +2 -2
  536. package/dist/services/subagents/subagent-session.js.map +1 -1
  537. package/dist/services/subagents/subagent-session.test.js +3 -3
  538. package/dist/services/subagents/subagent-session.test.js.map +1 -1
  539. package/dist/services/subagents/types.d.ts +2 -1
  540. package/dist/services/subagents/types.d.ts.map +1 -1
  541. package/dist/services/terminal-result-collector.d.ts.map +1 -1
  542. package/dist/services/terminal-result-collector.js +43 -0
  543. package/dist/services/terminal-result-collector.js.map +1 -1
  544. package/dist/services/terminal-result-collector.test.js +44 -0
  545. package/dist/services/terminal-result-collector.test.js.map +1 -1
  546. package/dist/services/tool-execution-ledger.d.ts +6 -0
  547. package/dist/services/tool-execution-ledger.d.ts.map +1 -1
  548. package/dist/services/tool-execution-ledger.js +90 -25
  549. package/dist/services/tool-execution-ledger.js.map +1 -1
  550. package/dist/services/tool-execution-ledger.test.js +177 -2
  551. package/dist/services/tool-execution-ledger.test.js.map +1 -1
  552. package/dist/tools/apply-patch.d.ts.map +1 -1
  553. package/dist/tools/apply-patch.js +41 -23
  554. package/dist/tools/apply-patch.js.map +1 -1
  555. package/dist/tools/apply-patch.test.js +6 -6
  556. package/dist/tools/apply-patch.test.js.map +1 -1
  557. package/dist/tools/bash.d.ts +10 -0
  558. package/dist/tools/bash.d.ts.map +1 -0
  559. package/dist/tools/bash.js +55 -0
  560. package/dist/tools/bash.js.map +1 -0
  561. package/dist/tools/edit-healing.d.ts.map +1 -1
  562. package/dist/tools/edit-healing.js +9 -3
  563. package/dist/tools/edit-healing.js.map +1 -1
  564. package/dist/tools/run-subagent.d.ts +0 -1
  565. package/dist/tools/run-subagent.d.ts.map +1 -1
  566. package/dist/tools/run-subagent.js +1 -8
  567. package/dist/tools/run-subagent.js.map +1 -1
  568. package/dist/tools/run-subagent.test.js +0 -18
  569. package/dist/tools/run-subagent.test.js.map +1 -1
  570. package/dist/utils/clipboard.d.ts +7 -0
  571. package/dist/utils/clipboard.d.ts.map +1 -1
  572. package/dist/utils/clipboard.js +83 -4
  573. package/dist/utils/clipboard.js.map +1 -1
  574. package/dist/utils/clipboard.test.js +152 -2
  575. package/dist/utils/clipboard.test.js.map +1 -1
  576. package/dist/utils/command-safety.d.ts +21 -0
  577. package/dist/utils/command-safety.d.ts.map +1 -0
  578. package/dist/utils/command-safety.devnull.test.d.ts +2 -0
  579. package/dist/utils/command-safety.devnull.test.d.ts.map +1 -0
  580. package/dist/utils/command-safety.devnull.test.js +13 -0
  581. package/dist/utils/command-safety.devnull.test.js.map +1 -0
  582. package/dist/utils/command-safety.js +348 -0
  583. package/dist/utils/command-safety.js.map +1 -0
  584. package/dist/utils/conversation-event-handler.d.ts.map +1 -1
  585. package/dist/utils/conversation-event-handler.js +3 -0
  586. package/dist/utils/conversation-event-handler.js.map +1 -1
  587. package/dist/utils/conversation-event-handler.test.js +13 -0
  588. package/dist/utils/conversation-event-handler.test.js.map +1 -1
  589. package/dist/utils/extract-command-messages.d.ts.map +1 -1
  590. package/dist/utils/extract-command-messages.js +8 -4
  591. package/dist/utils/extract-command-messages.js.map +1 -1
  592. package/dist/utils/extract-command-messages.test.d.ts +2 -0
  593. package/dist/utils/extract-command-messages.test.d.ts.map +1 -0
  594. package/dist/utils/message-utils.d.ts +7 -0
  595. package/dist/utils/message-utils.d.ts.map +1 -0
  596. package/dist/utils/message-utils.js +31 -0
  597. package/dist/utils/message-utils.js.map +1 -0
  598. package/dist/utils/provider-traffic-extractor.repro.test.d.ts +2 -0
  599. package/dist/utils/provider-traffic-extractor.repro.test.d.ts.map +1 -0
  600. package/dist/utils/provider-traffic-extractor.repro.test.js.map +1 -0
  601. package/dist/utils/resume-list.d.ts +15 -0
  602. package/dist/utils/resume-list.d.ts.map +1 -0
  603. package/dist/utils/resume-list.js +68 -0
  604. package/dist/utils/resume-list.js.map +1 -0
  605. package/dist/utils/resume-list.test.d.ts +2 -0
  606. package/dist/utils/resume-list.test.d.ts.map +1 -0
  607. package/dist/utils/resume-list.test.js +89 -0
  608. package/dist/utils/resume-list.test.js.map +1 -0
  609. package/package.json +2 -2
  610. package/readme.md +22 -7
  611. package/dist/components/ModelSelectionMenu.debug.test.d.ts +0 -2
  612. package/dist/components/ModelSelectionMenu.debug.test.d.ts.map +0 -1
  613. package/dist/components/ModelSelectionMenu.debug.test.js.map +0 -1
  614. package/dist/hooks/use-path-completion.test.d.ts +0 -2
  615. package/dist/hooks/use-path-completion.test.d.ts.map +0 -1
  616. package/dist/hooks/use-path-completion.test.js +0 -54
  617. package/dist/hooks/use-path-completion.test.js.map +0 -1
  618. package/dist/inspect_zod.d.ts +0 -2
  619. package/dist/inspect_zod.d.ts.map +0 -1
  620. package/dist/inspect_zod.js +0 -16
  621. package/dist/inspect_zod.js.map +0 -1
  622. package/dist/providers/openai.provider.test.d.ts +0 -2
  623. package/dist/providers/openai.provider.test.d.ts.map +0 -1
  624. package/dist/providers/openai.provider.test.js +0 -22
  625. package/dist/providers/openai.provider.test.js.map +0 -1
  626. package/dist/utils/project-tree.d.ts +0 -14
  627. package/dist/utils/project-tree.d.ts.map +0 -1
  628. package/dist/utils/project-tree.js +0 -111
  629. package/dist/utils/project-tree.js.map +0 -1
  630. package/dist/utils/project-tree.test.d.ts +0 -2
  631. package/dist/utils/project-tree.test.d.ts.map +0 -1
  632. package/dist/utils/project-tree.test.js +0 -149
  633. package/dist/utils/project-tree.test.js.map +0 -1
  634. package/dist/utils/terminal-clear.d.ts +0 -7
  635. package/dist/utils/terminal-clear.d.ts.map +0 -1
  636. package/dist/utils/terminal-clear.js +0 -5
  637. package/dist/utils/terminal-clear.js.map +0 -1
  638. package/dist/utils/terminal-clear.test.d.ts +0 -2
  639. package/dist/utils/terminal-clear.test.d.ts.map +0 -1
  640. package/dist/utils/terminal-clear.test.js +0 -13
  641. package/dist/utils/terminal-clear.test.js.map +0 -1
@@ -3,7 +3,7 @@ import { decideRetry, isTransientRetryableError, MAX_HALLUCINATION_RETRIES, MAX_
3
3
  import { getProvider } from '../providers/index.js';
4
4
  import { ApprovalState } from './approval-state.js';
5
5
  import { collectTerminalResult } from './terminal-result-collector.js';
6
- import { getMethod } from './interruption-info.js';
6
+ import { getMethod, getCallIdFromObject } from './interruption-info.js';
7
7
  import { createStreamAccumulator, processStreamEvents } from './stream-event-processor.js';
8
8
  import { ShellAutoApprovalResolver } from './shell-auto-approval-resolver.js';
9
9
  import { ApprovalFlowCoordinator } from './approval-flow-coordinator.js';
@@ -11,29 +11,8 @@ import { buildConversationResult, toTerminalEvent } from './conversation-result-
11
11
  import { normalizeUserTurn } from '../types/user-turn.js';
12
12
  import { collectDuplicateToolCallResultPairs, InputSurgeGuard } from './input-surge-guard.js';
13
13
  import { LargeUncachedInputGuard } from './large-uncached-input-guard.js';
14
- import { reconcileHistoryWithToolLedger, ToolExecutionLedger, } from './tool-execution-ledger.js';
14
+ import { reconcileHistoryWithToolLedger, ToolExecutionLedger, callIdOf, toolNameOf, outputOf, } from './tool-execution-ledger.js';
15
15
  import { describeError } from '../utils/error-helpers.js';
16
- const asRecordLocal = (value) => value && typeof value === 'object' && !Array.isArray(value) ? value : null;
17
- const rawItemLocal = (item) => {
18
- const rec = asRecordLocal(item);
19
- if (!rec)
20
- return null;
21
- return asRecordLocal(rec.rawItem) ?? rec;
22
- };
23
- const callIdOfLocal = (item) => {
24
- const raw = rawItemLocal(item);
25
- const cid = raw?.callId ?? raw?.call_id ?? raw?.tool_call_id ?? raw?.toolCallId ?? raw?.id;
26
- return typeof cid === 'string' && cid ? cid : null;
27
- };
28
- const toolNameOfLocal = (item) => {
29
- const raw = rawItemLocal(item);
30
- const name = raw?.name ?? asRecordLocal(item)?.name;
31
- return typeof name === 'string' && name ? name : 'unknown';
32
- };
33
- const outputOfLocal = (item) => {
34
- const raw = rawItemLocal(item);
35
- return raw?.output ?? asRecordLocal(item)?.output;
36
- };
37
16
  const supportsConversationChaining = (providerId) => {
38
17
  const providerDef = getProvider(providerId);
39
18
  return providerDef?.capabilities?.supportsConversationChaining ?? false;
@@ -85,8 +64,11 @@ export class ConversationSession {
85
64
  largeUncachedInputGuard = new LargeUncachedInputGuard();
86
65
  toolLedger = new ToolExecutionLedger();
87
66
  generation = 0;
67
+ #inputSurgeKind = 'delta';
68
+ currentPersistedTurnItems = [];
69
+ currentReasoningBuffer = '';
70
+ currentAssistantTextBuffer = '';
88
71
  settingsService;
89
- pendingModeNotice = null;
90
72
  logSink = null;
91
73
  constructor(id, { agentClient, deps, sessionStartedAt, }) {
92
74
  this.id = id;
@@ -154,28 +136,11 @@ export class ConversationSession {
154
136
  #buildOutgoingInput(turn, { includeTurn }) {
155
137
  const provider = this.#getProviderForGuard() ?? 'openai';
156
138
  const supportsChaining = supportsConversationChaining(provider);
157
- const history = this.conversationStore.getHistory();
139
+ const history = this.#getCanonicalHistory();
158
140
  const outgoingHistory = includeTurn ? [...history, this.#makeUserInputItem(turn)] : history;
159
141
  const useChaining = supportsChaining && (!!this.previousResponseId || outgoingHistory.length <= 1);
160
- const notice = this.pendingModeNotice;
161
142
  const latestInput = outgoingHistory[outgoingHistory.length - 1] ?? turn.text;
162
143
  const chainedInput = turn.images?.length ? latestInput : turn.text;
163
- if (notice) {
164
- if (useChaining) {
165
- const userItem = typeof chainedInput === 'string' ? { role: 'user', type: 'message', content: chainedInput } : chainedInput;
166
- const noticeItem = { role: 'system', type: 'message', content: notice };
167
- return {
168
- streamInput: [noticeItem, userItem],
169
- inputSurgeKind: 'delta',
170
- };
171
- }
172
- const noticeItem = { role: 'user', type: 'message', content: notice };
173
- return {
174
- streamInput: [...outgoingHistory, noticeItem],
175
- inputSurgeKind: 'full_history',
176
- modeNoticeToPersist: notice,
177
- };
178
- }
179
144
  return {
180
145
  streamInput: useChaining ? (typeof chainedInput === 'string' ? chainedInput : [chainedInput]) : outgoingHistory,
181
146
  inputSurgeKind: useChaining ? 'delta' : 'full_history',
@@ -224,6 +189,8 @@ export class ConversationSession {
224
189
  this.shellAutoApproval.clearCache();
225
190
  this.inputSurgeGuard.reset();
226
191
  this.largeUncachedInputGuard.reset();
192
+ this.#inputSurgeKind = 'delta';
193
+ this.#resetPersistedTurnState();
227
194
  const clearConversations = getMethod(this.agentClient, 'clearConversations');
228
195
  clearConversations?.call(this.agentClient);
229
196
  }
@@ -240,6 +207,8 @@ export class ConversationSession {
240
207
  this.shellAutoApproval.clearCache();
241
208
  this.inputSurgeGuard.reset();
242
209
  this.largeUncachedInputGuard.markUndoOrRewind();
210
+ this.#inputSurgeKind = 'delta';
211
+ this.#resetPersistedTurnState();
243
212
  this.#log({ type: 'undo', removedUserTurns: 1, snapshot: this.getCurrentSnapshot() });
244
213
  return removed;
245
214
  }
@@ -259,6 +228,8 @@ export class ConversationSession {
259
228
  this.shellAutoApproval.clearCache();
260
229
  this.inputSurgeGuard.reset();
261
230
  this.largeUncachedInputGuard.markUndoOrRewind();
231
+ this.#inputSurgeKind = 'delta';
232
+ this.#resetPersistedTurnState();
262
233
  this.#log({ type: 'undo', removedUserTurns: n, snapshot: this.getCurrentSnapshot() });
263
234
  return removed;
264
235
  }
@@ -305,13 +276,69 @@ export class ConversationSession {
305
276
  : this.settingsService?.get('agent.provider');
306
277
  const model = this.settingsService?.get('agent.model');
307
278
  return {
308
- history: this.conversationStore.getHistory(),
279
+ history: this.#getCanonicalHistory(),
309
280
  previousResponseId: this.previousResponseId,
310
281
  toolLedger: this.toolLedger.export(),
311
282
  ...(model ? { model } : {}),
312
283
  ...(provider ? { provider } : {}),
313
284
  };
314
285
  }
286
+ #getCurrentAssistantTurnState() {
287
+ const getProvider = getMethod(this.agentClient, 'getProvider');
288
+ const provider = getProvider
289
+ ? getProvider.call(this.agentClient)
290
+ : this.settingsService?.get('agent.provider');
291
+ const model = this.settingsService?.get('agent.model');
292
+ return {
293
+ previousResponseId: this.previousResponseId,
294
+ ...(model ? { model } : {}),
295
+ ...(provider ? { provider } : {}),
296
+ };
297
+ }
298
+ #flushReasoningItem() {
299
+ if (this.currentReasoningBuffer) {
300
+ this.currentPersistedTurnItems.push({
301
+ type: 'reasoning',
302
+ text: this.currentReasoningBuffer,
303
+ });
304
+ this.currentReasoningBuffer = '';
305
+ }
306
+ }
307
+ #flushAssistantTextItem() {
308
+ if (this.currentAssistantTextBuffer) {
309
+ this.currentPersistedTurnItems.push({
310
+ type: 'assistant_text',
311
+ text: this.currentAssistantTextBuffer,
312
+ });
313
+ this.currentAssistantTextBuffer = '';
314
+ }
315
+ }
316
+ #recordToolCallItem(callId, toolName, args) {
317
+ this.#flushReasoningItem();
318
+ this.#flushAssistantTextItem();
319
+ this.currentPersistedTurnItems.push({
320
+ type: 'tool_call',
321
+ callId,
322
+ toolName,
323
+ arguments: args,
324
+ });
325
+ }
326
+ #recordToolResultItem(callId, toolName, status, output) {
327
+ this.#flushReasoningItem();
328
+ this.#flushAssistantTextItem();
329
+ this.currentPersistedTurnItems.push({
330
+ type: 'tool_result',
331
+ callId,
332
+ toolName,
333
+ status,
334
+ output,
335
+ });
336
+ }
337
+ #resetPersistedTurnState() {
338
+ this.currentPersistedTurnItems = [];
339
+ this.currentReasoningBuffer = '';
340
+ this.currentAssistantTextBuffer = '';
341
+ }
315
342
  #log(event) {
316
343
  if (!this.logSink)
317
344
  return;
@@ -330,7 +357,20 @@ export class ConversationSession {
330
357
  if (!this.logSink)
331
358
  return;
332
359
  switch (event.type) {
360
+ case 'text_delta':
361
+ if (this.currentReasoningBuffer) {
362
+ this.#flushReasoningItem();
363
+ }
364
+ this.currentAssistantTextBuffer += event.delta;
365
+ return;
366
+ case 'reasoning_delta':
367
+ if (this.currentAssistantTextBuffer) {
368
+ this.#flushAssistantTextItem();
369
+ }
370
+ this.currentReasoningBuffer += event.delta;
371
+ return;
333
372
  case 'tool_started':
373
+ this.#recordToolCallItem(event.toolCallId, event.toolName, event.arguments);
334
374
  this.#log({
335
375
  type: 'tool_started',
336
376
  toolCallId: event.toolCallId,
@@ -340,6 +380,11 @@ export class ConversationSession {
340
380
  return;
341
381
  case 'command_message':
342
382
  this.#log({ type: 'command_message', message: event.message });
383
+ if (event.message.callId &&
384
+ event.message.toolName &&
385
+ (event.message.status === 'completed' || event.message.status === 'failed')) {
386
+ this.#recordToolResultItem(event.message.callId, event.message.toolName, event.message.status === 'failed' ? 'failed' : 'completed', event.message.output);
387
+ }
343
388
  return;
344
389
  case 'approval_required':
345
390
  this.#log({
@@ -364,24 +409,44 @@ export class ConversationSession {
364
409
  this.#log({ type: 'subagent_completed', result: event.result });
365
410
  return;
366
411
  case 'error':
367
- this.#log({ type: 'error', message: event.message, ...(event.kind ? { kind: event.kind } : {}) });
412
+ this.#log({
413
+ type: 'error',
414
+ message: event.message,
415
+ ...(event.kind ? { kind: event.kind } : {}),
416
+ ...(event.stack ? { stack: event.stack } : {}),
417
+ });
368
418
  return;
369
419
  case 'final': {
370
- const snapshot = this.getCurrentSnapshot();
371
- this.#log({
372
- type: 'assistant_final',
373
- message: {
374
- id: `bot-${snapshot.history.length}-${Date.now()}`,
375
- sender: 'bot',
376
- status: 'finalized',
420
+ const turnState = this.#getCurrentAssistantTurnState();
421
+ const toolLedger = this.toolLedger.export();
422
+ this.#flushReasoningItem();
423
+ this.#flushAssistantTextItem();
424
+ const turnItemsToLog = event.turnItems ? [...event.turnItems] : [...this.currentPersistedTurnItems];
425
+ if (event.finalText && !turnItemsToLog.some((item) => item.type === 'assistant_text')) {
426
+ turnItemsToLog.push({
427
+ type: 'assistant_text',
377
428
  text: event.finalText,
378
- ...(event.reasoningText ? { reasoningText: event.reasoningText } : {}),
379
- },
380
- finalText: event.finalText,
381
- ...(event.reasoningText ? { reasoningText: event.reasoningText } : {}),
429
+ });
430
+ }
431
+ // Invariant check: if transcript contains tool_result, matching call IDs exist in the live tool ledger.
432
+ for (const item of turnItemsToLog) {
433
+ if (item.type === 'tool_result') {
434
+ const exists = toolLedger.some((t) => t.callId === item.callId);
435
+ if (!exists) {
436
+ this.logger.warn(`Invariant violation: tool_result callId ${item.callId} not found in toolLedger`);
437
+ }
438
+ }
439
+ }
440
+ const turn = {
441
+ items: turnItemsToLog,
442
+ };
443
+ this.#log({
444
+ type: 'assistant_turn',
445
+ turn,
382
446
  ...(event.usage ? { usage: event.usage } : {}),
383
- snapshot,
447
+ state: turnState,
384
448
  });
449
+ this.#resetPersistedTurnState();
385
450
  return;
386
451
  }
387
452
  default:
@@ -398,9 +463,13 @@ export class ConversationSession {
398
463
  this.emittedToolStartedCallIds.add(event.toolCallId);
399
464
  return event;
400
465
  }
466
+ #getCanonicalHistory() {
467
+ return reconcileHistoryWithToolLedger(this.conversationStore.getHistory(), this.toolLedger.export())
468
+ .history;
469
+ }
401
470
  exportState() {
402
471
  return {
403
- history: this.conversationStore.getHistory(),
472
+ history: this.#getCanonicalHistory(),
404
473
  previousResponseId: this.previousResponseId,
405
474
  toolLedger: this.toolLedger.export(),
406
475
  };
@@ -433,21 +502,28 @@ export class ConversationSession {
433
502
  addShellContext(historyText) {
434
503
  this.conversationStore.addShellContext(historyText);
435
504
  }
436
- queueModeNotice(text) {
437
- this.pendingModeNotice = text;
438
- }
439
505
  /**
440
506
  * Abort the current running operation
441
507
  */
442
508
  abort() {
443
- this.approvalFlow.abort();
509
+ const pending = this.approvalFlow.getPending();
510
+ const callId = pending ? getCallIdFromObject(pending.interruption) : undefined;
511
+ if (this.approvalFlow.abort()) {
512
+ this.toolLedger.recordAbortedApproval('Tool execution was not approved.', 'Tool execution was not approved.', callId);
513
+ }
444
514
  }
445
515
  /**
446
516
  * Phase 4: stream conversation events as an async iterator.
447
517
  *
448
518
  * This is the transport-friendly primitive that can later be bridged to SSE/WebSockets.
449
519
  */
450
- async *run(input, { hallucinationRetryCount = 0, flexServiceTierFallbackCount = 0, skipUserMessage = false, } = {}) {
520
+ async *run(input, { skipUserMessage = false, flexServiceTierFallbackCount = 0, hallucinationRetryCount = 0, transientRetryCount = 0, } = {}) {
521
+ if (!skipUserMessage ||
522
+ hallucinationRetryCount > 0 ||
523
+ flexServiceTierFallbackCount > 0 ||
524
+ transientRetryCount > 0) {
525
+ this.#resetPersistedTurnState();
526
+ }
451
527
  const gen = this.generation;
452
528
  let stream = null;
453
529
  const turn = normalizeUserTurn(input);
@@ -504,15 +580,15 @@ export class ConversationSession {
504
580
  onFunctionCallItem: (item) => this.toolLedger.recordFunctionCall(item),
505
581
  onFunctionResultItem: (item) => {
506
582
  this.toolLedger.recordFunctionResult(item);
507
- const cid = callIdOfLocal(item);
583
+ const cid = callIdOf(item);
508
584
  if (cid && this.logSink) {
509
585
  const entry = this.toolLedger.export().find((e) => e.callId === cid);
510
586
  this.#log({
511
587
  type: 'tool_result',
512
588
  callId: cid,
513
- toolName: entry?.toolName ?? toolNameOfLocal(item),
589
+ toolName: entry?.toolName ?? toolNameOf(item),
514
590
  status: entry?.status === 'failed' || entry?.status === 'aborted' ? entry.status : 'completed',
515
- output: entry?.output ?? outputOfLocal(item),
591
+ output: entry?.output ?? outputOf(item),
516
592
  ...(entry?.historyItems ? { historyItems: entry.historyItems } : {}),
517
593
  });
518
594
  }
@@ -530,7 +606,16 @@ export class ConversationSession {
530
606
  source: 'abortResolution',
531
607
  stream: continuedStream,
532
608
  });
533
- this.conversationStore.updateFromResult(continuedStream);
609
+ const s = continuedStream;
610
+ const terminal = !continuedStream.interruptions || continuedStream.interruptions.length === 0;
611
+ if (terminal) {
612
+ if (this.#inputSurgeKind === 'delta') {
613
+ this.conversationStore.appendOutput(s.output);
614
+ }
615
+ else {
616
+ this.conversationStore.replaceHistory(s.history);
617
+ }
618
+ }
534
619
  }
535
620
  // Check if another interruption occurred
536
621
  if (continuedStream.interruptions && continuedStream.interruptions.length > 0) {
@@ -563,22 +648,10 @@ export class ConversationSession {
563
648
  // resync (fresh start with just the current message). After undo the chain
564
649
  // is severed (previousResponseId = null) while prior turns remain in the
565
650
  // local store, so we fall back to full-history mode to re-establish context.
566
- const { streamInput, inputSurgeKind, modeNoticeToPersist } = this.#buildOutgoingInput(turn, {
651
+ const { streamInput, inputSurgeKind } = this.#buildOutgoingInput(turn, {
567
652
  includeTurn: false,
568
653
  });
569
- if (this.pendingModeNotice) {
570
- this.pendingModeNotice = null;
571
- }
572
- if (modeNoticeToPersist) {
573
- // Persist the notice at the tail (append-only) rather than splicing
574
- // it before the last user turn or sending it as a one-shot item.
575
- // Mid-history insertion adds a stray ephemeral cache breakpoint (see
576
- // addCacheControlToLastTwoMessages) and a transient item makes
577
- // consecutive requests diverge at the tail — both break the
578
- // Claude/Qwen prompt cache. Appending keeps the cached prefix
579
- // byte-identical and only growing.
580
- this.conversationStore.addModeNotice(modeNoticeToPersist);
581
- }
654
+ this.#inputSurgeKind = inputSurgeKind;
582
655
  const surgeDecision = this.inputSurgeGuard.inspect(streamInput, { kind: inputSurgeKind });
583
656
  if (surgeDecision.action === 'block') {
584
657
  let droppedUserMessage;
@@ -628,7 +701,16 @@ export class ConversationSession {
628
701
  source: 'startStream',
629
702
  stream,
630
703
  });
631
- this.conversationStore.updateFromResult(stream);
704
+ const s = stream;
705
+ const terminal = !stream.interruptions || stream.interruptions.length === 0;
706
+ if (terminal) {
707
+ if (inputSurgeKind === 'delta') {
708
+ this.conversationStore.appendOutput(s.output);
709
+ }
710
+ else {
711
+ this.conversationStore.replaceHistory(s.history);
712
+ }
713
+ }
632
714
  }
633
715
  const resolvedResult = yield* this.#buildAndResolve(stream, acc.finalOutput || undefined, acc.reasoningOutput || undefined, acc.emittedCommandIds, acc.latestUsage);
634
716
  if (inputSurgeKind === 'delta') {
@@ -649,6 +731,14 @@ export class ConversationSession {
649
731
  mode: this.#getTrafficMode(),
650
732
  });
651
733
  if (resolvedResult.type === 'approval_required') {
734
+ if (resolvedResult.approval.callId) {
735
+ this.toolLedger.recordFunctionCall({
736
+ type: 'function_call',
737
+ callId: resolvedResult.approval.callId,
738
+ name: resolvedResult.approval.toolName,
739
+ arguments: resolvedResult.approval.argumentsText,
740
+ });
741
+ }
652
742
  this.logger.debug('Tool approval required', {
653
743
  eventType: 'approval.required',
654
744
  category: 'approval',
@@ -694,6 +784,45 @@ export class ConversationSession {
694
784
  });
695
785
  return;
696
786
  }
787
+ if (isTransientRetryableError(error) && transientRetryCount < MAX_TRANSIENT_RETRIES) {
788
+ const attempt = transientRetryCount + 1;
789
+ const delay = Math.min(500 * Math.pow(2, attempt - 1), 30000);
790
+ this.logger.warn('Transient upstream error detected, retrying turn', {
791
+ eventType: 'retry.transient',
792
+ category: 'retry',
793
+ phase: 'retry',
794
+ retryType: 'upstream',
795
+ retryAttempt: attempt,
796
+ attempt,
797
+ maxRetries: MAX_TRANSIENT_RETRIES,
798
+ sessionId: this.id,
799
+ traceId: this.logger.getCorrelationId(),
800
+ errorMessage: error instanceof Error ? error.message : String(error),
801
+ delayMs: delay,
802
+ });
803
+ yield {
804
+ type: 'retry',
805
+ toolName: 'turn',
806
+ attempt,
807
+ maxRetries: MAX_TRANSIENT_RETRIES,
808
+ errorMessage: error instanceof Error ? error.message : String(error),
809
+ retryType: 'upstream',
810
+ };
811
+ if (!this.#isCurrentGeneration(gen))
812
+ return;
813
+ if (stream) {
814
+ this.toolLedger.import(ledgerSnapshot);
815
+ }
816
+ else {
817
+ this.conversationStore.removeLastUserMessage();
818
+ }
819
+ await new Promise((resolve) => setTimeout(resolve, delay));
820
+ yield* this.run(turn, {
821
+ skipUserMessage: Boolean(stream),
822
+ transientRetryCount: attempt,
823
+ });
824
+ return;
825
+ }
697
826
  const decision = decideRetry(error, hallucinationRetryCount, Boolean(stream), streamHistoryLength);
698
827
  if (decision.kind === 'retry') {
699
828
  this.logger.warn('Recoverable model error detected, retrying', {
@@ -734,6 +863,13 @@ export class ConversationSession {
734
863
  }
735
864
  if (stream && this.#isCurrentGeneration(gen)) {
736
865
  this.toolLedger.markOpenCallsAborted(error instanceof Error ? error.message : String(error));
866
+ // Persist completed tool call/result pairs (and the recovery notice) into
867
+ // canonical history so the next user turn doesn't ship a request with two
868
+ // consecutive user messages and no record of the tool activity.
869
+ const reconciled = reconcileHistoryWithToolLedger(this.conversationStore.getHistory(), this.toolLedger.export());
870
+ if (reconciled.addedCompletedPairs > 0 || reconciled.droppedIncompleteCalls > 0) {
871
+ this.conversationStore.replaceHistory(reconciled.history);
872
+ }
737
873
  const recoverySummary = this.toolLedger.getRecoverySummary();
738
874
  if (recoverySummary) {
739
875
  yield {
@@ -747,6 +883,7 @@ export class ConversationSession {
747
883
  yield {
748
884
  type: 'error',
749
885
  message: describeError(error),
886
+ ...(error instanceof Error && error.stack ? { stack: error.stack } : {}),
750
887
  ...(droppedUserMessage ? { droppedUserMessage } : {}),
751
888
  };
752
889
  this.logger.error('Conversation stream error', {
@@ -756,6 +893,7 @@ export class ConversationSession {
756
893
  sessionId: this.id,
757
894
  traceId: this.logger.getCorrelationId(),
758
895
  errorMessage: describeError(error),
896
+ stack: error instanceof Error ? error.stack : undefined,
759
897
  });
760
898
  throw error;
761
899
  }
@@ -771,6 +909,14 @@ export class ConversationSession {
771
909
  if (!plan) {
772
910
  return;
773
911
  }
912
+ if (answer !== 'y') {
913
+ const interruption = plan.pendingApprovalContext.interruption;
914
+ const callId = getCallIdFromObject(interruption);
915
+ const output = rejectionReason
916
+ ? `Tool execution was not approved. User's reason: ${rejectionReason}`
917
+ : 'Tool execution was not approved.';
918
+ this.toolLedger.recordAbortedApproval(output, output, callId);
919
+ }
774
920
  const { pendingApprovalContext: { state, toolCallArgumentsById, emittedCommandIds: previouslyEmittedIds }, toolStartedEvent, removeInterceptor, } = plan;
775
921
  if (toolStartedEvent) {
776
922
  const filtered = this.#dedupeToolStarted(toolStartedEvent);
@@ -800,15 +946,15 @@ export class ConversationSession {
800
946
  onFunctionCallItem: (item) => this.toolLedger.recordFunctionCall(item),
801
947
  onFunctionResultItem: (item) => {
802
948
  this.toolLedger.recordFunctionResult(item);
803
- const cid = callIdOfLocal(item);
949
+ const cid = callIdOf(item);
804
950
  if (cid && this.logSink) {
805
951
  const entry = this.toolLedger.export().find((e) => e.callId === cid);
806
952
  this.#log({
807
953
  type: 'tool_result',
808
954
  callId: cid,
809
- toolName: entry?.toolName ?? toolNameOfLocal(item),
955
+ toolName: entry?.toolName ?? toolNameOf(item),
810
956
  status: entry?.status === 'failed' || entry?.status === 'aborted' ? entry.status : 'completed',
811
- output: entry?.output ?? outputOfLocal(item),
957
+ output: entry?.output ?? outputOf(item),
812
958
  ...(entry?.historyItems ? { historyItems: entry.historyItems } : {}),
813
959
  });
814
960
  }
@@ -826,13 +972,30 @@ export class ConversationSession {
826
972
  source: 'continueRunStream',
827
973
  stream,
828
974
  });
829
- this.conversationStore.updateFromResult(stream);
975
+ const s = stream;
976
+ const terminal = !stream.interruptions || stream.interruptions.length === 0;
977
+ if (terminal) {
978
+ if (this.#inputSurgeKind === 'delta') {
979
+ this.conversationStore.appendOutput(s.output);
980
+ }
981
+ else {
982
+ this.conversationStore.replaceHistory(s.history);
983
+ }
984
+ }
830
985
  }
831
986
  // Merge previously emitted command IDs with newly emitted ones
832
987
  // This prevents duplicates when result.history contains commands from the initial stream
833
988
  const allEmittedIds = new Set([...previouslyEmittedIds, ...acc.emittedCommandIds]);
834
989
  const resolvedResult = yield* this.#buildAndResolve(stream, acc.finalOutput || undefined, acc.reasoningOutput || undefined, allEmittedIds, acc.latestUsage);
835
990
  if (resolvedResult.type === 'approval_required') {
991
+ if (resolvedResult.approval.callId) {
992
+ this.toolLedger.recordFunctionCall({
993
+ type: 'function_call',
994
+ callId: resolvedResult.approval.callId,
995
+ name: resolvedResult.approval.toolName,
996
+ arguments: resolvedResult.approval.argumentsText,
997
+ });
998
+ }
836
999
  this.logger.debug('Tool approval required', {
837
1000
  eventType: 'approval.required',
838
1001
  category: 'approval',
@@ -879,9 +1042,19 @@ export class ConversationSession {
879
1042
  }
880
1043
  }
881
1044
  catch (error) {
1045
+ this.logger.error('Conversation stream error during continuation', {
1046
+ eventType: 'stream.failed',
1047
+ category: 'stream',
1048
+ phase: 'abort',
1049
+ sessionId: this.id,
1050
+ traceId: this.logger.getCorrelationId(),
1051
+ errorMessage: describeError(error),
1052
+ stack: error instanceof Error ? error.stack : undefined,
1053
+ });
882
1054
  yield {
883
1055
  type: 'error',
884
1056
  message: describeError(error),
1057
+ ...(error instanceof Error && error.stack ? { stack: error.stack } : {}),
885
1058
  };
886
1059
  throw error;
887
1060
  }
@@ -981,6 +1154,7 @@ export class ConversationSession {
981
1154
  emittedCommandIds,
982
1155
  usage,
983
1156
  toolCallArgumentsById: this.toolCallArgumentsById,
1157
+ turnItems: this.currentPersistedTurnItems,
984
1158
  }, {
985
1159
  approvalFlow: this.approvalFlow,
986
1160
  shellAutoApproval: this.shellAutoApproval,
@@ -996,6 +1170,7 @@ export class ConversationSession {
996
1170
  let continuationApprovalUsage;
997
1171
  const commandMessages = [];
998
1172
  let approvalRequiredResult;
1173
+ let continuationTurnItems;
999
1174
  for await (const event of this['continue']({ answer: 'y' })) {
1000
1175
  if (event.type === 'approval_required') {
1001
1176
  continuationApprovalUsage = event.usage;
@@ -1024,7 +1199,9 @@ export class ConversationSession {
1024
1199
  if (event.commandMessages) {
1025
1200
  commandMessages.push(...event.commandMessages);
1026
1201
  }
1027
- yield event;
1202
+ if (event.turnItems) {
1203
+ continuationTurnItems = event.turnItems;
1204
+ }
1028
1205
  }
1029
1206
  else {
1030
1207
  yield event;
@@ -1044,6 +1221,7 @@ export class ConversationSession {
1044
1221
  finalText: finalText || 'Done.',
1045
1222
  ...(reasoningText ? { reasoningText } : {}),
1046
1223
  ...(combinedUsage && Object.keys(combinedUsage).length > 0 ? { usage: combinedUsage } : {}),
1224
+ turnItems: continuationTurnItems ?? this.currentPersistedTurnItems,
1047
1225
  };
1048
1226
  }
1049
1227
  }