@code-yeongyu/senpi 2026.7.20 → 2026.7.22

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 (495) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +1 -0
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +1 -0
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/core/agent-session.d.ts +32 -0
  7. package/dist/core/agent-session.d.ts.map +1 -1
  8. package/dist/core/agent-session.js +409 -68
  9. package/dist/core/agent-session.js.map +1 -1
  10. package/dist/core/auth-storage.js +1 -1
  11. package/dist/core/auth-storage.js.map +1 -1
  12. package/dist/core/compaction/compaction.d.ts +2 -2
  13. package/dist/core/compaction/compaction.d.ts.map +1 -1
  14. package/dist/core/compaction/compaction.js +67 -16
  15. package/dist/core/compaction/compaction.js.map +1 -1
  16. package/dist/core/compaction/stream-watchdog.d.ts +31 -0
  17. package/dist/core/compaction/stream-watchdog.d.ts.map +1 -0
  18. package/dist/core/compaction/stream-watchdog.js +78 -0
  19. package/dist/core/compaction/stream-watchdog.js.map +1 -0
  20. package/dist/core/extensions/builtin/btw/index.d.ts +3 -0
  21. package/dist/core/extensions/builtin/btw/index.d.ts.map +1 -0
  22. package/dist/core/extensions/builtin/btw/index.js +120 -0
  23. package/dist/core/extensions/builtin/btw/index.js.map +1 -0
  24. package/dist/core/extensions/builtin/btw/panel.d.ts +21 -0
  25. package/dist/core/extensions/builtin/btw/panel.d.ts.map +1 -0
  26. package/dist/core/extensions/builtin/btw/panel.js +61 -0
  27. package/dist/core/extensions/builtin/btw/panel.js.map +1 -0
  28. package/dist/core/extensions/builtin/btw/side-query.d.ts +31 -0
  29. package/dist/core/extensions/builtin/btw/side-query.d.ts.map +1 -0
  30. package/dist/core/extensions/builtin/btw/side-query.js +68 -0
  31. package/dist/core/extensions/builtin/btw/side-query.js.map +1 -0
  32. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  33. package/dist/core/extensions/builtin/compaction/index.js +47 -11
  34. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  35. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
  36. package/dist/core/extensions/builtin/compaction/openai-remote.js +3 -1
  37. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
  38. package/dist/core/extensions/builtin/compaction/speculative.d.ts +17 -0
  39. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  40. package/dist/core/extensions/builtin/compaction/speculative.js +93 -26
  41. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  42. package/dist/core/extensions/builtin/config-reload/index.d.ts +39 -0
  43. package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -0
  44. package/dist/core/extensions/builtin/config-reload/index.js +659 -0
  45. package/dist/core/extensions/builtin/config-reload/index.js.map +1 -0
  46. package/dist/core/extensions/builtin/config-reload/log.d.ts +55 -0
  47. package/dist/core/extensions/builtin/config-reload/log.d.ts.map +1 -0
  48. package/dist/core/extensions/builtin/config-reload/log.js +128 -0
  49. package/dist/core/extensions/builtin/config-reload/log.js.map +1 -0
  50. package/dist/core/extensions/builtin/config-reload/protocol.d.ts +71 -0
  51. package/dist/core/extensions/builtin/config-reload/protocol.d.ts.map +1 -0
  52. package/dist/core/extensions/builtin/config-reload/protocol.js +83 -0
  53. package/dist/core/extensions/builtin/config-reload/protocol.js.map +1 -0
  54. package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts +43 -0
  55. package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts.map +1 -0
  56. package/dist/core/extensions/builtin/config-reload/watch-engine.js +298 -0
  57. package/dist/core/extensions/builtin/config-reload/watch-engine.js.map +1 -0
  58. package/dist/core/extensions/builtin/goal/command-registration.d.ts +2 -2
  59. package/dist/core/extensions/builtin/goal/command-registration.d.ts.map +1 -1
  60. package/dist/core/extensions/builtin/goal/command-registration.js +3 -4
  61. package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
  62. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  63. package/dist/core/extensions/builtin/goal/index.js +11 -27
  64. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  65. package/dist/core/extensions/builtin/goal/tool-registration.d.ts +2 -2
  66. package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -1
  67. package/dist/core/extensions/builtin/goal/tool-registration.js +2 -3
  68. package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
  69. package/dist/core/extensions/builtin/goal/turn-usage.d.ts +20 -0
  70. package/dist/core/extensions/builtin/goal/turn-usage.d.ts.map +1 -0
  71. package/dist/core/extensions/builtin/goal/turn-usage.js +61 -0
  72. package/dist/core/extensions/builtin/goal/turn-usage.js.map +1 -0
  73. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  74. package/dist/core/extensions/builtin/index.js +9 -0
  75. package/dist/core/extensions/builtin/index.js.map +1 -1
  76. package/dist/core/extensions/builtin/look-at/arguments.d.ts +27 -0
  77. package/dist/core/extensions/builtin/look-at/arguments.d.ts.map +1 -0
  78. package/dist/core/extensions/builtin/look-at/arguments.js +109 -0
  79. package/dist/core/extensions/builtin/look-at/arguments.js.map +1 -0
  80. package/dist/core/extensions/builtin/look-at/commands.d.ts +9 -0
  81. package/dist/core/extensions/builtin/look-at/commands.d.ts.map +1 -0
  82. package/dist/core/extensions/builtin/look-at/commands.js +102 -0
  83. package/dist/core/extensions/builtin/look-at/commands.js.map +1 -0
  84. package/dist/core/extensions/builtin/look-at/image-input.d.ts +21 -0
  85. package/dist/core/extensions/builtin/look-at/image-input.d.ts.map +1 -0
  86. package/dist/core/extensions/builtin/look-at/image-input.js +151 -0
  87. package/dist/core/extensions/builtin/look-at/image-input.js.map +1 -0
  88. package/dist/core/extensions/builtin/look-at/index.d.ts +3 -0
  89. package/dist/core/extensions/builtin/look-at/index.d.ts.map +1 -0
  90. package/dist/core/extensions/builtin/look-at/index.js +58 -0
  91. package/dist/core/extensions/builtin/look-at/index.js.map +1 -0
  92. package/dist/core/extensions/builtin/look-at/model-selector.d.ts +9 -0
  93. package/dist/core/extensions/builtin/look-at/model-selector.d.ts.map +1 -0
  94. package/dist/core/extensions/builtin/look-at/model-selector.js +77 -0
  95. package/dist/core/extensions/builtin/look-at/model-selector.js.map +1 -0
  96. package/dist/core/extensions/builtin/look-at/prompts.d.ts +5 -0
  97. package/dist/core/extensions/builtin/look-at/prompts.d.ts.map +1 -0
  98. package/dist/core/extensions/builtin/look-at/prompts.js +19 -0
  99. package/dist/core/extensions/builtin/look-at/prompts.js.map +1 -0
  100. package/dist/core/extensions/builtin/look-at/render.d.ts +26 -0
  101. package/dist/core/extensions/builtin/look-at/render.d.ts.map +1 -0
  102. package/dist/core/extensions/builtin/look-at/render.js +70 -0
  103. package/dist/core/extensions/builtin/look-at/render.js.map +1 -0
  104. package/dist/core/extensions/builtin/look-at/runner.d.ts +16 -0
  105. package/dist/core/extensions/builtin/look-at/runner.d.ts.map +1 -0
  106. package/dist/core/extensions/builtin/look-at/runner.js +108 -0
  107. package/dist/core/extensions/builtin/look-at/runner.js.map +1 -0
  108. package/dist/core/extensions/builtin/look-at/settings.d.ts +13 -0
  109. package/dist/core/extensions/builtin/look-at/settings.d.ts.map +1 -0
  110. package/dist/core/extensions/builtin/look-at/settings.js +20 -0
  111. package/dist/core/extensions/builtin/look-at/settings.js.map +1 -0
  112. package/dist/core/extensions/builtin/mcp/commands.d.ts.map +1 -1
  113. package/dist/core/extensions/builtin/mcp/commands.js +2 -0
  114. package/dist/core/extensions/builtin/mcp/commands.js.map +1 -1
  115. package/dist/core/extensions/builtin/mcp/config-schema.d.ts +6 -0
  116. package/dist/core/extensions/builtin/mcp/config-schema.d.ts.map +1 -1
  117. package/dist/core/extensions/builtin/mcp/config-schema.js +1 -0
  118. package/dist/core/extensions/builtin/mcp/config-schema.js.map +1 -1
  119. package/dist/core/extensions/builtin/mcp/config.d.ts.map +1 -1
  120. package/dist/core/extensions/builtin/mcp/config.js +9 -1
  121. package/dist/core/extensions/builtin/mcp/config.js.map +1 -1
  122. package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
  123. package/dist/core/extensions/builtin/mcp/service.js +22 -6
  124. package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
  125. package/dist/core/extensions/builtin/mcp/startup-race.d.ts +10 -0
  126. package/dist/core/extensions/builtin/mcp/startup-race.d.ts.map +1 -1
  127. package/dist/core/extensions/builtin/mcp/startup-race.js +18 -1
  128. package/dist/core/extensions/builtin/mcp/startup-race.js.map +1 -1
  129. package/dist/core/extensions/builtin/model-fallback/index.d.ts +4 -0
  130. package/dist/core/extensions/builtin/model-fallback/index.d.ts.map +1 -0
  131. package/dist/core/extensions/builtin/model-fallback/index.js +55 -0
  132. package/dist/core/extensions/builtin/model-fallback/index.js.map +1 -0
  133. package/dist/core/extensions/builtin/model-fallback/settings.d.ts +6 -0
  134. package/dist/core/extensions/builtin/model-fallback/settings.d.ts.map +1 -0
  135. package/dist/core/extensions/builtin/model-fallback/settings.js +11 -0
  136. package/dist/core/extensions/builtin/model-fallback/settings.js.map +1 -0
  137. package/dist/core/extensions/builtin/model-fallback/ui.d.ts +12 -0
  138. package/dist/core/extensions/builtin/model-fallback/ui.d.ts.map +1 -0
  139. package/dist/core/extensions/builtin/model-fallback/ui.js +72 -0
  140. package/dist/core/extensions/builtin/model-fallback/ui.js.map +1 -0
  141. package/dist/core/extensions/builtin/nested-agents-md/index.d.ts.map +1 -1
  142. package/dist/core/extensions/builtin/nested-agents-md/index.js +4 -1
  143. package/dist/core/extensions/builtin/nested-agents-md/index.js.map +1 -1
  144. package/dist/core/extensions/builtin/rules/index.d.ts.map +1 -1
  145. package/dist/core/extensions/builtin/rules/index.js +4 -1
  146. package/dist/core/extensions/builtin/rules/index.js.map +1 -1
  147. package/dist/core/extensions/builtin/terminal/output-format.d.ts +28 -0
  148. package/dist/core/extensions/builtin/terminal/output-format.d.ts.map +1 -0
  149. package/dist/core/extensions/builtin/terminal/output-format.js +74 -0
  150. package/dist/core/extensions/builtin/terminal/output-format.js.map +1 -0
  151. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +3 -0
  152. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
  153. package/dist/core/extensions/builtin/terminal/runtime-session.js +22 -2
  154. package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
  155. package/dist/core/extensions/builtin/terminal/shared.d.ts +7 -0
  156. package/dist/core/extensions/builtin/terminal/shared.d.ts.map +1 -1
  157. package/dist/core/extensions/builtin/terminal/shared.js +14 -0
  158. package/dist/core/extensions/builtin/terminal/shared.js.map +1 -1
  159. package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts +5 -1
  160. package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
  161. package/dist/core/extensions/builtin/terminal/tools/bash-output.js +88 -6
  162. package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
  163. package/dist/core/extensions/builtin/terminal/tools/bash.d.ts +12 -1
  164. package/dist/core/extensions/builtin/terminal/tools/bash.d.ts.map +1 -1
  165. package/dist/core/extensions/builtin/terminal/tools/bash.js +82 -8
  166. package/dist/core/extensions/builtin/terminal/tools/bash.js.map +1 -1
  167. package/dist/core/extensions/builtin/terminal/tools/render.d.ts +16 -0
  168. package/dist/core/extensions/builtin/terminal/tools/render.d.ts.map +1 -0
  169. package/dist/core/extensions/builtin/terminal/tools/render.js +30 -0
  170. package/dist/core/extensions/builtin/terminal/tools/render.js.map +1 -0
  171. package/dist/core/extensions/builtin/terminal/tools/spawn.d.ts +2 -0
  172. package/dist/core/extensions/builtin/terminal/tools/spawn.d.ts.map +1 -1
  173. package/dist/core/extensions/builtin/terminal/tools/spawn.js +1 -1
  174. package/dist/core/extensions/builtin/terminal/tools/spawn.js.map +1 -1
  175. package/dist/core/extensions/builtin/todotools/tools/todo.d.ts.map +1 -1
  176. package/dist/core/extensions/builtin/todotools/tools/todo.js +22 -6
  177. package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
  178. package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.d.ts +1 -0
  179. package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.d.ts.map +1 -1
  180. package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.js +13 -4
  181. package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.js.map +1 -1
  182. package/dist/core/extensions/builtin/webfetch/webfetch/renderers.d.ts.map +1 -1
  183. package/dist/core/extensions/builtin/webfetch/webfetch/renderers.js +17 -2
  184. package/dist/core/extensions/builtin/webfetch/webfetch/renderers.js.map +1 -1
  185. package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts +8 -1
  186. package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts.map +1 -1
  187. package/dist/core/extensions/builtin/webfetch/webfetch/tool.js +45 -3
  188. package/dist/core/extensions/builtin/webfetch/webfetch/tool.js.map +1 -1
  189. package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
  190. package/dist/core/extensions/builtin/websearch/websearch/renderers.js +13 -4
  191. package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
  192. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts +3 -2
  193. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
  194. package/dist/core/extensions/builtin/websearch/websearch/search.js +2 -1
  195. package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
  196. package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts.map +1 -1
  197. package/dist/core/extensions/builtin/websearch/websearch/tool.js +17 -1
  198. package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
  199. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +2 -0
  200. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
  201. package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
  202. package/dist/core/extensions/runner.d.ts +6 -0
  203. package/dist/core/extensions/runner.d.ts.map +1 -1
  204. package/dist/core/extensions/runner.js +71 -3
  205. package/dist/core/extensions/runner.js.map +1 -1
  206. package/dist/core/extensions/types.d.ts +96 -10
  207. package/dist/core/extensions/types.d.ts.map +1 -1
  208. package/dist/core/extensions/types.js.map +1 -1
  209. package/dist/core/model-config-schema.d.ts +1942 -0
  210. package/dist/core/model-config-schema.d.ts.map +1 -0
  211. package/dist/core/model-config-schema.js +197 -0
  212. package/dist/core/model-config-schema.js.map +1 -0
  213. package/dist/core/model-config.d.ts +2 -578
  214. package/dist/core/model-config.d.ts.map +1 -1
  215. package/dist/core/model-config.js +1 -194
  216. package/dist/core/model-config.js.map +1 -1
  217. package/dist/core/model-resolver.d.ts.map +1 -1
  218. package/dist/core/model-resolver.js +1 -0
  219. package/dist/core/model-resolver.js.map +1 -1
  220. package/dist/core/model-runtime.d.ts.map +1 -1
  221. package/dist/core/model-runtime.js +9 -3
  222. package/dist/core/model-runtime.js.map +1 -1
  223. package/dist/core/provider-composer.d.ts +1 -0
  224. package/dist/core/provider-composer.d.ts.map +1 -1
  225. package/dist/core/provider-composer.js +3 -2
  226. package/dist/core/provider-composer.js.map +1 -1
  227. package/dist/core/provider-display-names.d.ts.map +1 -1
  228. package/dist/core/provider-display-names.js +1 -0
  229. package/dist/core/provider-display-names.js.map +1 -1
  230. package/dist/core/retry-fallback/chains.d.ts +29 -0
  231. package/dist/core/retry-fallback/chains.d.ts.map +1 -0
  232. package/dist/core/retry-fallback/chains.js +109 -0
  233. package/dist/core/retry-fallback/chains.js.map +1 -0
  234. package/dist/core/retry-fallback/controller.d.ts +77 -0
  235. package/dist/core/retry-fallback/controller.d.ts.map +1 -0
  236. package/dist/core/retry-fallback/controller.js +157 -0
  237. package/dist/core/retry-fallback/controller.js.map +1 -0
  238. package/dist/core/retry-fallback/cooldown.d.ts +21 -0
  239. package/dist/core/retry-fallback/cooldown.d.ts.map +1 -0
  240. package/dist/core/retry-fallback/cooldown.js +49 -0
  241. package/dist/core/retry-fallback/cooldown.js.map +1 -0
  242. package/dist/core/retry-fallback/log.d.ts +10 -0
  243. package/dist/core/retry-fallback/log.d.ts.map +1 -0
  244. package/dist/core/retry-fallback/log.js +128 -0
  245. package/dist/core/retry-fallback/log.js.map +1 -0
  246. package/dist/core/retry-fallback/validate.d.ts +8 -0
  247. package/dist/core/retry-fallback/validate.d.ts.map +1 -0
  248. package/dist/core/retry-fallback/validate.js +63 -0
  249. package/dist/core/retry-fallback/validate.js.map +1 -0
  250. package/dist/core/sdk.d.ts.map +1 -1
  251. package/dist/core/sdk.js +1 -0
  252. package/dist/core/sdk.js.map +1 -1
  253. package/dist/core/session-manager.d.ts +39 -3
  254. package/dist/core/session-manager.d.ts.map +1 -1
  255. package/dist/core/session-manager.js +125 -16
  256. package/dist/core/session-manager.js.map +1 -1
  257. package/dist/core/settings-manager.d.ts +33 -0
  258. package/dist/core/settings-manager.d.ts.map +1 -1
  259. package/dist/core/settings-manager.js +153 -6
  260. package/dist/core/settings-manager.js.map +1 -1
  261. package/dist/modes/interactive/components/footer.d.ts +2 -1
  262. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  263. package/dist/modes/interactive/components/footer.js +30 -20
  264. package/dist/modes/interactive/components/footer.js.map +1 -1
  265. package/dist/modes/interactive/components/todo-strike.d.ts +8 -0
  266. package/dist/modes/interactive/components/todo-strike.d.ts.map +1 -0
  267. package/dist/modes/interactive/components/todo-strike.js +35 -0
  268. package/dist/modes/interactive/components/todo-strike.js.map +1 -0
  269. package/dist/modes/interactive/components/tool-execution-renderer.d.ts.map +1 -1
  270. package/dist/modes/interactive/components/tool-execution-renderer.js +8 -1
  271. package/dist/modes/interactive/components/tool-execution-renderer.js.map +1 -1
  272. package/dist/modes/interactive/components/tool-execution.d.ts +4 -0
  273. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  274. package/dist/modes/interactive/components/tool-execution.js +51 -2
  275. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  276. package/dist/modes/interactive/interactive-mode.d.ts +6 -0
  277. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  278. package/dist/modes/interactive/interactive-mode.js +124 -4
  279. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  280. package/dist/modes/interactive/tool-progress.d.ts +8 -0
  281. package/dist/modes/interactive/tool-progress.d.ts.map +1 -0
  282. package/dist/modes/interactive/tool-progress.js +26 -0
  283. package/dist/modes/interactive/tool-progress.js.map +1 -0
  284. package/dist/modes/interactive/tool-result-reveal.d.ts +18 -0
  285. package/dist/modes/interactive/tool-result-reveal.d.ts.map +1 -0
  286. package/dist/modes/interactive/tool-result-reveal.js +155 -0
  287. package/dist/modes/interactive/tool-result-reveal.js.map +1 -0
  288. package/dist/utils/fs-watch.d.ts +2 -2
  289. package/dist/utils/fs-watch.d.ts.map +1 -1
  290. package/dist/utils/fs-watch.js +2 -2
  291. package/dist/utils/fs-watch.js.map +1 -1
  292. package/docs/extensions.md +79 -1
  293. package/docs/mcp.md +10 -1
  294. package/docs/models.md +102 -1
  295. package/docs/providers.md +3 -1
  296. package/docs/settings.md +35 -0
  297. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +24 -0
  298. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  299. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +13 -1
  300. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  301. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +76 -8
  302. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  303. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  304. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +26 -1
  305. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  306. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
  307. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +24 -2
  308. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
  309. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +5 -0
  310. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  311. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  312. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  313. package/node_modules/@earendil-works/pi-ai/README.md +2 -0
  314. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  315. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +68 -25
  316. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  317. package/node_modules/@earendil-works/pi-ai/dist/api/lazy.d.ts.map +1 -1
  318. package/node_modules/@earendil-works/pi-ai/dist/api/lazy.js +33 -6
  319. package/node_modules/@earendil-works/pi-ai/dist/api/lazy.js.map +1 -1
  320. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
  321. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +6 -1
  322. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  323. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts.map +1 -1
  324. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js +62 -52
  325. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
  326. package/node_modules/@earendil-works/pi-ai/dist/api-registry.d.ts +19 -0
  327. package/node_modules/@earendil-works/pi-ai/dist/api-registry.d.ts.map +1 -0
  328. package/node_modules/@earendil-works/pi-ai/dist/api-registry.js +50 -0
  329. package/node_modules/@earendil-works/pi-ai/dist/api-registry.js.map +1 -0
  330. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts +2 -17
  331. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
  332. package/node_modules/@earendil-works/pi-ai/dist/compat.js +3 -52
  333. package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
  334. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  335. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +1 -0
  336. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
  337. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +45 -0
  338. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  339. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +45 -0
  340. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  341. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +5 -0
  342. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  343. package/node_modules/@earendil-works/pi-ai/dist/index.js +5 -0
  344. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  345. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts +27 -0
  346. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts.map +1 -0
  347. package/node_modules/@earendil-works/pi-ai/dist/model.js +2 -0
  348. package/node_modules/@earendil-works/pi-ai/dist/model.js.map +1 -0
  349. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +1178 -1072
  350. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  351. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +2 -0
  352. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  353. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.d.ts +3 -0
  354. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.d.ts.map +1 -0
  355. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.js +15 -0
  356. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.js.map +1 -0
  357. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.d.ts +64 -0
  358. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.d.ts.map +1 -0
  359. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.js +5 -0
  360. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.js.map +1 -0
  361. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
  362. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -0
  363. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
  364. package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -0
  365. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
  366. package/node_modules/@earendil-works/pi-ai/dist/providers/data/kimi-coding.json +1 -1
  367. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  368. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  369. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  370. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts +1 -0
  371. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts.map +1 -1
  372. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js +1 -0
  373. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js.map +1 -1
  374. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.d.ts +8 -0
  375. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.d.ts.map +1 -1
  376. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.js.map +1 -1
  377. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts +0 -4
  378. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts.map +1 -1
  379. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js.map +1 -1
  380. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts +12 -4
  381. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts.map +1 -1
  382. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js.map +1 -1
  383. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +20 -4
  384. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -1
  385. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
  386. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts +16 -0
  387. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  388. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  389. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts +1 -0
  390. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
  391. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js +8 -0
  392. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
  393. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.d.ts +20 -0
  394. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.d.ts.map +1 -0
  395. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.js +79 -0
  396. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.js.map +1 -0
  397. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts +2 -18
  398. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts.map +1 -1
  399. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js +4 -218
  400. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js.map +1 -1
  401. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.d.ts +38 -0
  402. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.d.ts.map +1 -0
  403. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.js +210 -0
  404. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.js.map +1 -0
  405. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.d.ts +9 -0
  406. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.d.ts.map +1 -0
  407. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.js +231 -0
  408. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.js.map +1 -0
  409. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.d.ts +38 -0
  410. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.d.ts.map +1 -0
  411. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.js +84 -0
  412. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.js.map +1 -0
  413. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.d.ts.map +1 -1
  414. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js +20 -57
  415. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js.map +1 -1
  416. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts.map +1 -1
  417. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js +16 -99
  418. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js.map +1 -1
  419. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.d.ts +1 -0
  420. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.d.ts.map +1 -1
  421. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.js +1 -0
  422. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.js.map +1 -1
  423. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/recovery-stream.d.ts +5 -0
  424. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/recovery-stream.d.ts.map +1 -0
  425. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/recovery-stream.js +6 -0
  426. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/recovery-stream.js.map +1 -0
  427. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-code-mask.d.ts +19 -0
  428. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-code-mask.d.ts.map +1 -0
  429. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-code-mask.js +185 -0
  430. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-code-mask.js.map +1 -0
  431. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.d.ts +11 -0
  432. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.d.ts.map +1 -0
  433. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.js +24 -0
  434. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.js.map +1 -0
  435. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-diagnostics.d.ts +4 -0
  436. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-diagnostics.d.ts.map +1 -0
  437. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-diagnostics.js +13 -0
  438. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-diagnostics.js.map +1 -0
  439. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.d.ts +15 -0
  440. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.d.ts.map +1 -0
  441. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.js +37 -0
  442. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.js.map +1 -0
  443. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-message-snapshot.d.ts +4 -0
  444. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-message-snapshot.d.ts.map +1 -0
  445. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-message-snapshot.js +61 -0
  446. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-message-snapshot.js.map +1 -0
  447. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.d.ts +29 -0
  448. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.d.ts.map +1 -0
  449. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.js +148 -0
  450. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.js.map +1 -0
  451. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.d.ts +5 -0
  452. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.d.ts.map +1 -0
  453. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.js +36 -0
  454. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.js.map +1 -0
  455. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.d.ts +15 -0
  456. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.d.ts.map +1 -0
  457. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.js +88 -0
  458. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.js.map +1 -0
  459. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.d.ts +3 -0
  460. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.d.ts.map +1 -0
  461. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.js +233 -0
  462. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.js.map +1 -0
  463. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.d.ts +23 -0
  464. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.d.ts.map +1 -0
  465. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.js +77 -0
  466. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.js.map +1 -0
  467. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-message-metadata.d.ts +5 -0
  468. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-message-metadata.d.ts.map +1 -0
  469. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-message-metadata.js +63 -0
  470. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-message-metadata.js.map +1 -0
  471. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.d.ts +13 -0
  472. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.d.ts.map +1 -0
  473. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.js +52 -0
  474. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.js.map +1 -0
  475. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.d.ts +41 -0
  476. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.d.ts.map +1 -0
  477. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.js +209 -0
  478. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.js.map +1 -0
  479. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.d.ts.map +1 -1
  480. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js +70 -346
  481. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js.map +1 -1
  482. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +18 -23
  483. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  484. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  485. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  486. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +5 -1
  487. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  488. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts +4 -0
  489. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts.map +1 -0
  490. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js +6 -0
  491. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js.map +1 -0
  492. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  493. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  494. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  495. package/package.json +6 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-stream-wrapper.js","sourceRoot":"","sources":["../../src/tool-call-middleware/recovery-stream-wrapper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, AssistantMessageEvent, AssistantMessageEventStream, Tool } from \"../types.ts\";\nimport { type RecoveryContentKind, RecoveryContentLifecycle } from \"./recovery-content-lifecycle.ts\";\nimport { RecoveryAssistantMessageEventStream } from \"./recovery-event-stream.ts\";\nimport { RecoveryNativeProjection } from \"./recovery-native-projection.ts\";\nimport { type RecoveryStreamFailure, terminateRecoveryStreamForFailure } from \"./recovery-stream-failure.ts\";\nimport { RecoveryStreamTerminal } from \"./recovery-stream-terminal.ts\";\nimport { RecoveryTextProjection } from \"./recovery-text-projection.ts\";\nimport { StreamMessageProjection } from \"./stream-wrapper-shared.ts\";\n\nexport function wrapStreamWithInvokeRecovery(\n\tinnerStream: AssistantMessageEventStream,\n\ttools: readonly Tool[],\n): AssistantMessageEventStream {\n\tconst outerStream = new RecoveryAssistantMessageEventStream();\n\n\tvoid (async (): Promise<void> => {\n\t\tconst innerIterator = innerStream[Symbol.asyncIterator]();\n\t\tconst innerEvents: AsyncIterable<AssistantMessageEvent> = { [Symbol.asyncIterator]: () => innerIterator };\n\t\tlet projection: StreamMessageProjection | null = null;\n\t\tlet nativeProjection: RecoveryNativeProjection | null = null;\n\t\tlet textProjection: RecoveryTextProjection | null = null;\n\t\tlet sawToolCall = false;\n\t\tlet cancellationRequested = false;\n\t\tconst contentLifecycle = new RecoveryContentLifecycle();\n\t\tconst terminal = new RecoveryStreamTerminal(outerStream);\n\n\t\tconst finishText = (): void => {\n\t\t\tif (!textProjection) return;\n\t\t\tsawToolCall = textProjection.finish() || sawToolCall;\n\t\t\ttextProjection = null;\n\t\t};\n\n\t\touterStream.setCancellationHandler(async () => {\n\t\t\tcancellationRequested = true;\n\t\t\ttry {\n\t\t\t\tawait innerIterator.return?.();\n\t\t\t\tfinishText();\n\t\t\t\tterminal.cancelled(projection);\n\t\t\t} catch (error) {\n\t\t\t\tfinishText();\n\t\t\t\tterminal.iteratorFailure(projection, error);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t});\n\n\t\tconst terminateForFailure = (source: AssistantMessage, failure: RecoveryStreamFailure): void => {\n\t\t\tif (!projection || !outerStream.markSourceClosed()) return;\n\t\t\tfinishText();\n\t\t\tterminateRecoveryStreamForFailure(outerStream, projection, source, failure);\n\t\t};\n\n\t\tconst prepareContentEvent = (source: AssistantMessage, contentIndex: number): boolean => {\n\t\t\tif (!projection || !nativeProjection) return false;\n\t\t\tif (!Number.isSafeInteger(contentIndex) || contentIndex < 0 || contentIndex >= source.content.length) {\n\t\t\t\tterminateForFailure(source, \"invalid_native_event_order\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tprojection.sync(source);\n\t\t\tnativeProjection.reserveVisibleIds(source);\n\t\t\tif (nativeProjection.synchronizeLower(source, contentIndex)) return true;\n\t\t\tterminateForFailure(source, \"collision\");\n\t\t\treturn false;\n\t\t};\n\n\t\tconst canStart = (\n\t\t\tsource: AssistantMessage,\n\t\t\tcontentIndex: number,\n\t\t\tkind: RecoveryContentKind,\n\t\t\tfailure: RecoveryStreamFailure = \"invalid_content_event_order\",\n\t\t): boolean => {\n\t\t\tif (!Number.isSafeInteger(contentIndex) || contentIndex < 0 || contentIndex >= source.content.length) {\n\t\t\t\tterminateForFailure(source, failure);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst block = source.content[contentIndex];\n\t\t\tconst blockMatches =\n\t\t\t\t(kind === \"text\" && block?.type === \"text\") ||\n\t\t\t\t(kind === \"thinking\" && block?.type === \"thinking\") ||\n\t\t\t\t(kind === \"toolCall\" && block?.type === \"toolCall\");\n\t\t\tif (blockMatches && contentLifecycle.canStart(contentIndex)) return true;\n\t\t\tterminateForFailure(source, failure);\n\t\t\treturn false;\n\t\t};\n\n\t\tconst isActive = (\n\t\t\tsource: AssistantMessage,\n\t\t\tcontentIndex: number,\n\t\t\tkind: RecoveryContentKind,\n\t\t\tfailure: RecoveryStreamFailure = \"invalid_content_event_order\",\n\t\t): boolean => {\n\t\t\tif (contentLifecycle.isActive(contentIndex, kind)) return true;\n\t\t\tterminateForFailure(source, failure);\n\t\t\treturn false;\n\t\t};\n\n\t\tconst synchronizeTerminal = (source: AssistantMessage): boolean => {\n\t\t\tprojection ??= new StreamMessageProjection(outerStream, source, { preserveSourceMetadata: true });\n\t\t\tnativeProjection ??= new RecoveryNativeProjection(outerStream, projection.message);\n\t\t\tprojection.sync(source);\n\t\t\tnativeProjection.reserveVisibleIds(source);\n\t\t\tfinishText();\n\t\t\tif (nativeProjection.synchronizeRemaining(source)) return true;\n\t\t\tterminateForFailure(source, \"collision\");\n\t\t\treturn false;\n\t\t};\n\n\t\ttry {\n\t\t\tfor await (const event of innerEvents) {\n\t\t\t\tif (cancellationRequested) continue;\n\t\t\t\tswitch (event.type) {\n\t\t\t\t\tcase \"start\":\n\t\t\t\t\t\tprojection = new StreamMessageProjection(outerStream, event.partial, {\n\t\t\t\t\t\t\tpreserveSourceMetadata: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tnativeProjection = new RecoveryNativeProjection(outerStream, projection.message);\n\t\t\t\t\t\tnativeProjection.reserveVisibleIds(event.partial);\n\t\t\t\t\t\touterStream.push({ type: \"start\", partial: projection.message });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"text_start\": {\n\t\t\t\t\t\tif (!canStart(event.partial, event.contentIndex, \"text\")) return;\n\t\t\t\t\t\tif (!prepareContentEvent(event.partial, event.contentIndex) || !projection || !nativeProjection)\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\tconst nextText = new RecoveryTextProjection(tools, projection, nativeProjection, event.contentIndex);\n\t\t\t\t\t\tif (!nextText.start(event.partial)) {\n\t\t\t\t\t\t\tterminateForFailure(event.partial, \"invalid_native_event_order\");\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttextProjection = nextText;\n\t\t\t\t\t\tcontentLifecycle.start(event.contentIndex, \"text\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"text_delta\":\n\t\t\t\t\t\tif (!isActive(event.partial, event.contentIndex, \"text\")) return;\n\t\t\t\t\t\tif (!prepareContentEvent(event.partial, event.contentIndex) || !textProjection) return;\n\t\t\t\t\t\tsawToolCall = textProjection.feed(event.delta) || sawToolCall;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"text_end\":\n\t\t\t\t\t\tif (!isActive(event.partial, event.contentIndex, \"text\")) return;\n\t\t\t\t\t\tif (!prepareContentEvent(event.partial, event.contentIndex)) return;\n\t\t\t\t\t\tfinishText();\n\t\t\t\t\t\tcontentLifecycle.end(event.contentIndex, \"text\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"done\":\n\t\t\t\t\t\tif (!synchronizeTerminal(event.message) || !projection) return;\n\t\t\t\t\t\tif (!outerStream.markSourceClosed()) return;\n\t\t\t\t\t\tterminal.done(projection, event.message, sawToolCall, event.reason);\n\t\t\t\t\t\treturn;\n\t\t\t\t\tcase \"error\":\n\t\t\t\t\t\tif (!projection) {\n\t\t\t\t\t\t\tif (!outerStream.markSourceClosed()) return;\n\t\t\t\t\t\t\touterStream.push(event);\n\t\t\t\t\t\t\touterStream.end();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!synchronizeTerminal(event.error)) return;\n\t\t\t\t\t\tif (!outerStream.markSourceClosed()) return;\n\t\t\t\t\t\tterminal.sourceError(projection, event.error, sawToolCall, event.reason);\n\t\t\t\t\t\treturn;\n\t\t\t\t\tcase \"toolcall_start\": {\n\t\t\t\t\t\tif (!canStart(event.partial, event.contentIndex, \"toolCall\", \"invalid_native_event_order\")) return;\n\t\t\t\t\t\tif (!prepareContentEvent(event.partial, event.contentIndex) || !nativeProjection) return;\n\t\t\t\t\t\tconst status = nativeProjection.projectNativeStart(event.partial, event.contentIndex);\n\t\t\t\t\t\tif (status !== \"projected\") {\n\t\t\t\t\t\t\tterminateForFailure(\n\t\t\t\t\t\t\t\tevent.partial,\n\t\t\t\t\t\t\t\tstatus === \"collision\" ? \"collision\" : \"invalid_native_event_order\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontentLifecycle.start(event.contentIndex, \"toolCall\");\n\t\t\t\t\t\tsawToolCall = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"toolcall_delta\":\n\t\t\t\t\t\tif (!isActive(event.partial, event.contentIndex, \"toolCall\", \"invalid_native_event_order\")) return;\n\t\t\t\t\t\tif (!prepareContentEvent(event.partial, event.contentIndex) || !nativeProjection) return;\n\t\t\t\t\t\tif (!nativeProjection.projectNativeDelta(event.partial, event.contentIndex, event.delta)) {\n\t\t\t\t\t\t\tterminateForFailure(event.partial, \"invalid_native_event_order\");\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"toolcall_end\":\n\t\t\t\t\t\tif (!isActive(event.partial, event.contentIndex, \"toolCall\", \"invalid_native_event_order\")) return;\n\t\t\t\t\t\tif (!prepareContentEvent(event.partial, event.contentIndex) || !nativeProjection) return;\n\t\t\t\t\t\tif (!nativeProjection.projectNativeEnd(event.contentIndex, event.toolCall)) {\n\t\t\t\t\t\t\tterminateForFailure(event.partial, \"invalid_native_event_order\");\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontentLifecycle.end(event.contentIndex, \"toolCall\");\n\t\t\t\t\t\tsawToolCall = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"thinking_start\": {\n\t\t\t\t\t\tif (!canStart(event.partial, event.contentIndex, \"thinking\")) return;\n\t\t\t\t\t\tif (!prepareContentEvent(event.partial, event.contentIndex) || !projection || !nativeProjection)\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\tconst outerIndex = projection.startThinking(event.contentIndex, event.partial);\n\t\t\t\t\t\tif (!nativeProjection.recordProjectedBlock(event.contentIndex, outerIndex)) {\n\t\t\t\t\t\t\tterminateForFailure(event.partial, \"invalid_native_event_order\");\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontentLifecycle.start(event.contentIndex, \"thinking\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"thinking_delta\":\n\t\t\t\t\t\tif (!isActive(event.partial, event.contentIndex, \"thinking\")) return;\n\t\t\t\t\t\tif (!prepareContentEvent(event.partial, event.contentIndex) || !projection) return;\n\t\t\t\t\t\tprojection.projectThinkingDelta(event.contentIndex, event.delta, event.partial);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"thinking_end\":\n\t\t\t\t\t\tif (!isActive(event.partial, event.contentIndex, \"thinking\")) return;\n\t\t\t\t\t\tif (!prepareContentEvent(event.partial, event.contentIndex) || !projection) return;\n\t\t\t\t\t\tprojection.finishThinking(event.contentIndex, event.content, event.partial);\n\t\t\t\t\t\tcontentLifecycle.end(event.contentIndex, \"thinking\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (cancellationRequested || !outerStream.markSourceClosed()) return;\n\t\t\tfinishText();\n\t\t\tterminal.exhausted(projection);\n\t\t} catch (error) {\n\t\t\tif (cancellationRequested || !outerStream.markSourceClosed()) return;\n\t\t\tfinishText();\n\t\t\tterminal.iteratorFailure(projection, error);\n\t\t}\n\t})();\n\n\treturn outerStream;\n}\n"]}
@@ -0,0 +1,23 @@
1
+ import type { AssistantMessage, Tool } from "../types.ts";
2
+ import type { RecoveryNativeProjection } from "./recovery-native-projection.ts";
3
+ import type { StreamMessageProjection } from "./stream-wrapper-shared.ts";
4
+ /** Owns one ordinary assistant text block's mask/parser/projection lifecycle. */
5
+ export declare class RecoveryTextProjection {
6
+ private readonly projection;
7
+ private readonly nativeProjection;
8
+ private readonly innerIndex;
9
+ private readonly parser;
10
+ private readonly mask;
11
+ private activeInvoke;
12
+ private textBuffer;
13
+ private sawToolCall;
14
+ private finished;
15
+ constructor(tools: readonly Tool[], projection: StreamMessageProjection, nativeProjection: RecoveryNativeProjection, innerIndex: number);
16
+ start(source: AssistantMessage): boolean;
17
+ feed(text: string): boolean;
18
+ finish(): boolean;
19
+ private processSegment;
20
+ private projectParserEvents;
21
+ private flushText;
22
+ }
23
+ //# sourceMappingURL=recovery-text-projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-text-projection.d.ts","sourceRoot":"","sources":["../../src/tool-call-middleware/recovery-text-projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAI1D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAG1E,iFAAiF;AACjF,qBAAa,sBAAsB;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IACrD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA2B;IAC5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2D;IAClF,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;IACjD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IAEzB,YACC,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,UAAU,EAAE,uBAAuB,EACnC,gBAAgB,EAAE,wBAAwB,EAC1C,UAAU,EAAE,MAAM,EAMlB;IAED,KAAK,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAGvC;IAED,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ1B;IAED,MAAM,IAAI,OAAO,CAShB;IAED,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,mBAAmB;IAkB3B,OAAO,CAAC,SAAS;CAKjB"}
@@ -0,0 +1,77 @@
1
+ import { createAntmlInvokeRecoveryStreamParser } from "./protocols/antml/recovery-stream.js";
2
+ import { createRecoveryCodeMask } from "./recovery-code-mask.js";
3
+ import { appendRecoveryDiagnostic } from "./recovery-diagnostics.js";
4
+ /** Owns one ordinary assistant text block's mask/parser/projection lifecycle. */
5
+ export class RecoveryTextProjection {
6
+ constructor(tools, projection, nativeProjection, innerIndex) {
7
+ this.mask = createRecoveryCodeMask();
8
+ this.activeInvoke = false;
9
+ this.textBuffer = "";
10
+ this.sawToolCall = false;
11
+ this.finished = false;
12
+ this.projection = projection;
13
+ this.nativeProjection = nativeProjection;
14
+ this.innerIndex = innerIndex;
15
+ this.parser = createAntmlInvokeRecoveryStreamParser(tools);
16
+ }
17
+ start(source) {
18
+ const outerIndex = this.projection.startText(this.innerIndex, source.content[this.innerIndex]);
19
+ return this.nativeProjection.startText(this.innerIndex, outerIndex);
20
+ }
21
+ feed(text) {
22
+ for (let index = 0; index < text.length; index += 1) {
23
+ const character = text.charAt(index);
24
+ const options = this.activeInvoke ? { activeInvoke: true } : undefined;
25
+ for (const segment of this.mask.feed(character, options))
26
+ this.processSegment(segment);
27
+ }
28
+ this.flushText();
29
+ return this.sawToolCall;
30
+ }
31
+ finish() {
32
+ if (this.finished)
33
+ return this.sawToolCall;
34
+ for (const segment of this.mask.finish())
35
+ this.processSegment(segment);
36
+ this.projectParserEvents(this.parser.finish());
37
+ this.flushText();
38
+ this.projection.finishText();
39
+ this.nativeProjection.extendText(this.innerIndex);
40
+ this.finished = true;
41
+ return this.sawToolCall;
42
+ }
43
+ processSegment(segment) {
44
+ if (segment.recoveryBoundary)
45
+ this.projectParserEvents(this.parser.interrupt());
46
+ if (segment.scan)
47
+ this.projectParserEvents(this.parser.feed(segment.text));
48
+ else
49
+ this.textBuffer += segment.text;
50
+ }
51
+ projectParserEvents(events) {
52
+ for (const event of this.nativeProjection.assignRecoveredIds(events)) {
53
+ if (event.type === "text") {
54
+ this.textBuffer += event.text;
55
+ continue;
56
+ }
57
+ this.flushText();
58
+ const result = this.projection.projectParserEvents([event]);
59
+ this.sawToolCall = this.sawToolCall || result.sawToolCall;
60
+ if (event.type === "toolcall_start")
61
+ this.activeInvoke = true;
62
+ if (event.type === "toolcall_end") {
63
+ this.activeInvoke = false;
64
+ for (const toolCall of result.completedToolCalls)
65
+ appendRecoveryDiagnostic(this.projection, toolCall);
66
+ }
67
+ }
68
+ this.nativeProjection.extendText(this.innerIndex);
69
+ }
70
+ flushText() {
71
+ if (this.textBuffer.length === 0)
72
+ return;
73
+ this.projection.projectParserEvents([{ type: "text", text: this.textBuffer }]);
74
+ this.textBuffer = "";
75
+ }
76
+ }
77
+ //# sourceMappingURL=recovery-text-projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-text-projection.js","sourceRoot":"","sources":["../../src/tool-call-middleware/recovery-text-projection.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, Tool } from \"../types.ts\";\nimport { createAntmlInvokeRecoveryStreamParser } from \"./protocols/antml/recovery-stream.ts\";\nimport { createRecoveryCodeMask, type RecoveryCodeMaskSegment } from \"./recovery-code-mask.ts\";\nimport { appendRecoveryDiagnostic } from \"./recovery-diagnostics.ts\";\nimport type { RecoveryNativeProjection } from \"./recovery-native-projection.ts\";\nimport type { StreamMessageProjection } from \"./stream-wrapper-shared.ts\";\nimport type { StreamParserEvent } from \"./types.ts\";\n\n/** Owns one ordinary assistant text block's mask/parser/projection lifecycle. */\nexport class RecoveryTextProjection {\n\tprivate readonly projection: StreamMessageProjection;\n\tprivate readonly nativeProjection: RecoveryNativeProjection;\n\tprivate readonly innerIndex: number;\n\tprivate readonly parser: ReturnType<typeof createAntmlInvokeRecoveryStreamParser>;\n\tprivate readonly mask = createRecoveryCodeMask();\n\tprivate activeInvoke = false;\n\tprivate textBuffer = \"\";\n\tprivate sawToolCall = false;\n\tprivate finished = false;\n\n\tconstructor(\n\t\ttools: readonly Tool[],\n\t\tprojection: StreamMessageProjection,\n\t\tnativeProjection: RecoveryNativeProjection,\n\t\tinnerIndex: number,\n\t) {\n\t\tthis.projection = projection;\n\t\tthis.nativeProjection = nativeProjection;\n\t\tthis.innerIndex = innerIndex;\n\t\tthis.parser = createAntmlInvokeRecoveryStreamParser(tools);\n\t}\n\n\tstart(source: AssistantMessage): boolean {\n\t\tconst outerIndex = this.projection.startText(this.innerIndex, source.content[this.innerIndex]);\n\t\treturn this.nativeProjection.startText(this.innerIndex, outerIndex);\n\t}\n\n\tfeed(text: string): boolean {\n\t\tfor (let index = 0; index < text.length; index += 1) {\n\t\t\tconst character = text.charAt(index);\n\t\t\tconst options = this.activeInvoke ? { activeInvoke: true } : undefined;\n\t\t\tfor (const segment of this.mask.feed(character, options)) this.processSegment(segment);\n\t\t}\n\t\tthis.flushText();\n\t\treturn this.sawToolCall;\n\t}\n\n\tfinish(): boolean {\n\t\tif (this.finished) return this.sawToolCall;\n\t\tfor (const segment of this.mask.finish()) this.processSegment(segment);\n\t\tthis.projectParserEvents(this.parser.finish());\n\t\tthis.flushText();\n\t\tthis.projection.finishText();\n\t\tthis.nativeProjection.extendText(this.innerIndex);\n\t\tthis.finished = true;\n\t\treturn this.sawToolCall;\n\t}\n\n\tprivate processSegment(segment: RecoveryCodeMaskSegment): void {\n\t\tif (segment.recoveryBoundary) this.projectParserEvents(this.parser.interrupt());\n\t\tif (segment.scan) this.projectParserEvents(this.parser.feed(segment.text));\n\t\telse this.textBuffer += segment.text;\n\t}\n\n\tprivate projectParserEvents(events: readonly StreamParserEvent[]): void {\n\t\tfor (const event of this.nativeProjection.assignRecoveredIds(events)) {\n\t\t\tif (event.type === \"text\") {\n\t\t\t\tthis.textBuffer += event.text;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.flushText();\n\t\t\tconst result = this.projection.projectParserEvents([event]);\n\t\t\tthis.sawToolCall = this.sawToolCall || result.sawToolCall;\n\t\t\tif (event.type === \"toolcall_start\") this.activeInvoke = true;\n\t\t\tif (event.type === \"toolcall_end\") {\n\t\t\t\tthis.activeInvoke = false;\n\t\t\t\tfor (const toolCall of result.completedToolCalls) appendRecoveryDiagnostic(this.projection, toolCall);\n\t\t\t}\n\t\t}\n\t\tthis.nativeProjection.extendText(this.innerIndex);\n\t}\n\n\tprivate flushText(): void {\n\t\tif (this.textBuffer.length === 0) return;\n\t\tthis.projection.projectParserEvents([{ type: \"text\", text: this.textBuffer }]);\n\t\tthis.textBuffer = \"\";\n\t}\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import type { AssistantMessage } from "../types.ts";
2
+ import type { AssistantMessageDiagnostic } from "../utils/diagnostics.ts";
3
+ export declare function cloneAssistantMessageMetadata(source: AssistantMessage, content: AssistantMessage["content"], projectedDiagnostics: readonly AssistantMessageDiagnostic[], preserveAll: boolean): AssistantMessage;
4
+ export declare function syncAssistantMessageMetadata(target: AssistantMessage, source: AssistantMessage, projectedDiagnostics: readonly AssistantMessageDiagnostic[], preserveAll: boolean): void;
5
+ //# sourceMappingURL=stream-message-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-message-metadata.d.ts","sourceRoot":"","sources":["../../src/tool-call-middleware/stream-message-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAS,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAsC1E,wBAAgB,6BAA6B,CAC5C,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,EACpC,oBAAoB,EAAE,SAAS,0BAA0B,EAAE,EAC3D,WAAW,EAAE,OAAO,GAClB,gBAAgB,CAOlB;AAED,wBAAgB,4BAA4B,CAC3C,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,gBAAgB,EACxB,oBAAoB,EAAE,SAAS,0BAA0B,EAAE,EAC3D,WAAW,EAAE,OAAO,GAClB,IAAI,CAgBN"}
@@ -0,0 +1,63 @@
1
+ function cloneUsage(usage) {
2
+ return { ...usage, cost: { ...usage.cost } };
3
+ }
4
+ function cloneLegacyUsage(usage) {
5
+ return {
6
+ input: usage.input,
7
+ output: usage.output,
8
+ cacheRead: usage.cacheRead,
9
+ cacheWrite: usage.cacheWrite,
10
+ totalTokens: usage.totalTokens,
11
+ cost: {
12
+ input: usage.cost.input,
13
+ output: usage.cost.output,
14
+ cacheRead: usage.cost.cacheRead,
15
+ cacheWrite: usage.cost.cacheWrite,
16
+ total: usage.cost.total,
17
+ },
18
+ };
19
+ }
20
+ function cloneLegacyMessage(source, content) {
21
+ return {
22
+ role: "assistant",
23
+ api: source.api,
24
+ provider: source.provider,
25
+ model: source.model,
26
+ responseId: source.responseId,
27
+ content,
28
+ usage: cloneLegacyUsage(source.usage),
29
+ stopReason: source.stopReason,
30
+ errorMessage: source.errorMessage,
31
+ timestamp: source.timestamp,
32
+ };
33
+ }
34
+ export function cloneAssistantMessageMetadata(source, content, projectedDiagnostics, preserveAll) {
35
+ if (!preserveAll)
36
+ return cloneLegacyMessage(source, content);
37
+ const message = { ...source, content, usage: cloneUsage(source.usage) };
38
+ const diagnostics = [...(source.diagnostics ?? []), ...projectedDiagnostics];
39
+ if (diagnostics.length > 0)
40
+ message.diagnostics = diagnostics;
41
+ else
42
+ delete message.diagnostics;
43
+ return message;
44
+ }
45
+ export function syncAssistantMessageMetadata(target, source, projectedDiagnostics, preserveAll) {
46
+ if (!preserveAll) {
47
+ target.api = source.api;
48
+ target.provider = source.provider;
49
+ target.model = source.model;
50
+ target.responseId = source.responseId;
51
+ target.usage = cloneLegacyUsage(source.usage);
52
+ target.stopReason = source.stopReason;
53
+ target.errorMessage = source.errorMessage;
54
+ target.timestamp = source.timestamp;
55
+ return;
56
+ }
57
+ const content = target.content;
58
+ const targetRecord = target;
59
+ for (const key of Object.keys(targetRecord))
60
+ delete targetRecord[key];
61
+ Object.assign(targetRecord, cloneAssistantMessageMetadata(source, content, projectedDiagnostics, true));
62
+ }
63
+ //# sourceMappingURL=stream-message-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-message-metadata.js","sourceRoot":"","sources":["../../src/tool-call-middleware/stream-message-metadata.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, Usage } from \"../types.ts\";\nimport type { AssistantMessageDiagnostic } from \"../utils/diagnostics.ts\";\n\nfunction cloneUsage(usage: Usage): Usage {\n\treturn { ...usage, cost: { ...usage.cost } };\n}\n\nfunction cloneLegacyUsage(usage: Usage): Usage {\n\treturn {\n\t\tinput: usage.input,\n\t\toutput: usage.output,\n\t\tcacheRead: usage.cacheRead,\n\t\tcacheWrite: usage.cacheWrite,\n\t\ttotalTokens: usage.totalTokens,\n\t\tcost: {\n\t\t\tinput: usage.cost.input,\n\t\t\toutput: usage.cost.output,\n\t\t\tcacheRead: usage.cost.cacheRead,\n\t\t\tcacheWrite: usage.cost.cacheWrite,\n\t\t\ttotal: usage.cost.total,\n\t\t},\n\t};\n}\n\nfunction cloneLegacyMessage(source: AssistantMessage, content: AssistantMessage[\"content\"]): AssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tapi: source.api,\n\t\tprovider: source.provider,\n\t\tmodel: source.model,\n\t\tresponseId: source.responseId,\n\t\tcontent,\n\t\tusage: cloneLegacyUsage(source.usage),\n\t\tstopReason: source.stopReason,\n\t\terrorMessage: source.errorMessage,\n\t\ttimestamp: source.timestamp,\n\t};\n}\n\nexport function cloneAssistantMessageMetadata(\n\tsource: AssistantMessage,\n\tcontent: AssistantMessage[\"content\"],\n\tprojectedDiagnostics: readonly AssistantMessageDiagnostic[],\n\tpreserveAll: boolean,\n): AssistantMessage {\n\tif (!preserveAll) return cloneLegacyMessage(source, content);\n\tconst message: AssistantMessage = { ...source, content, usage: cloneUsage(source.usage) };\n\tconst diagnostics = [...(source.diagnostics ?? []), ...projectedDiagnostics];\n\tif (diagnostics.length > 0) message.diagnostics = diagnostics;\n\telse delete message.diagnostics;\n\treturn message;\n}\n\nexport function syncAssistantMessageMetadata(\n\ttarget: AssistantMessage,\n\tsource: AssistantMessage,\n\tprojectedDiagnostics: readonly AssistantMessageDiagnostic[],\n\tpreserveAll: boolean,\n): void {\n\tif (!preserveAll) {\n\t\ttarget.api = source.api;\n\t\ttarget.provider = source.provider;\n\t\ttarget.model = source.model;\n\t\ttarget.responseId = source.responseId;\n\t\ttarget.usage = cloneLegacyUsage(source.usage);\n\t\ttarget.stopReason = source.stopReason;\n\t\ttarget.errorMessage = source.errorMessage;\n\t\ttarget.timestamp = source.timestamp;\n\t\treturn;\n\t}\n\tconst content = target.content;\n\tconst targetRecord = target as unknown as Record<string, unknown>;\n\tfor (const key of Object.keys(targetRecord)) delete targetRecord[key];\n\tObject.assign(targetRecord, cloneAssistantMessageMetadata(source, content, projectedDiagnostics, true));\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import type { AssistantMessage, AssistantMessageEventStream } from "../types.ts";
2
+ /** Replays canonical thinking events without exposing their content to text parsers. */
3
+ export declare class StreamThinkingProjection {
4
+ private readonly stream;
5
+ private readonly message;
6
+ private readonly outerIndexByInnerIndex;
7
+ private readonly preserveSourceMetadata;
8
+ constructor(stream: AssistantMessageEventStream, message: AssistantMessage, preserveSourceMetadata: boolean);
9
+ start(innerIndex: number, source: AssistantMessage): number;
10
+ delta(innerIndex: number, delta: string, source: AssistantMessage): void;
11
+ end(innerIndex: number, content: string, source: AssistantMessage): void;
12
+ }
13
+ //# sourceMappingURL=stream-thinking-projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-thinking-projection.d.ts","sourceRoot":"","sources":["../../src/tool-call-middleware/stream-thinking-projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,2BAA2B,EAAmB,MAAM,aAAa,CAAC;AAMlG,wFAAwF;AACxF,qBAAa,wBAAwB;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA6B;IACpE,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAU;IAEjD,YAAY,MAAM,EAAE,2BAA2B,EAAE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,OAAO,EAI1G;IAED,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAW1D;IAED,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAWvE;IAED,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAWvE;CACD"}
@@ -0,0 +1,52 @@
1
+ function cloneThinking(block, thinking = block.thinking) {
2
+ return { ...block, thinking };
3
+ }
4
+ /** Replays canonical thinking events without exposing their content to text parsers. */
5
+ export class StreamThinkingProjection {
6
+ constructor(stream, message, preserveSourceMetadata) {
7
+ this.outerIndexByInnerIndex = new Map();
8
+ this.stream = stream;
9
+ this.message = message;
10
+ this.preserveSourceMetadata = preserveSourceMetadata;
11
+ }
12
+ start(innerIndex, source) {
13
+ const sourceBlock = source.content[innerIndex];
14
+ const block = this.preserveSourceMetadata && sourceBlock?.type === "thinking"
15
+ ? cloneThinking(sourceBlock)
16
+ : { type: "thinking", thinking: "" };
17
+ const outerIndex = this.message.content.length;
18
+ this.message.content.push(block);
19
+ this.outerIndexByInnerIndex.set(innerIndex, outerIndex);
20
+ this.stream.push({ type: "thinking_start", contentIndex: outerIndex, partial: this.message });
21
+ return outerIndex;
22
+ }
23
+ delta(innerIndex, delta, source) {
24
+ const outerIndex = this.outerIndexByInnerIndex.get(innerIndex);
25
+ if (outerIndex == null)
26
+ return;
27
+ const current = this.message.content[outerIndex];
28
+ if (current?.type !== "thinking")
29
+ return;
30
+ const sourceBlock = source.content[innerIndex];
31
+ this.message.content[outerIndex] =
32
+ this.preserveSourceMetadata && sourceBlock?.type === "thinking"
33
+ ? cloneThinking(sourceBlock)
34
+ : cloneThinking(current, current.thinking + delta);
35
+ this.stream.push({ type: "thinking_delta", contentIndex: outerIndex, delta, partial: this.message });
36
+ }
37
+ end(innerIndex, content, source) {
38
+ const outerIndex = this.outerIndexByInnerIndex.get(innerIndex);
39
+ if (outerIndex == null)
40
+ return;
41
+ const current = this.message.content[outerIndex];
42
+ if (current?.type !== "thinking")
43
+ return;
44
+ const sourceBlock = source.content[innerIndex];
45
+ this.message.content[outerIndex] =
46
+ this.preserveSourceMetadata && sourceBlock?.type === "thinking"
47
+ ? cloneThinking(sourceBlock, content)
48
+ : cloneThinking(current, content);
49
+ this.stream.push({ type: "thinking_end", contentIndex: outerIndex, content, partial: this.message });
50
+ }
51
+ }
52
+ //# sourceMappingURL=stream-thinking-projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-thinking-projection.js","sourceRoot":"","sources":["../../src/tool-call-middleware/stream-thinking-projection.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, AssistantMessageEventStream, ThinkingContent } from \"../types.ts\";\n\nfunction cloneThinking(block: ThinkingContent, thinking = block.thinking): ThinkingContent {\n\treturn { ...block, thinking };\n}\n\n/** Replays canonical thinking events without exposing their content to text parsers. */\nexport class StreamThinkingProjection {\n\tprivate readonly stream: AssistantMessageEventStream;\n\tprivate readonly message: AssistantMessage;\n\tprivate readonly outerIndexByInnerIndex = new Map<number, number>();\n\tprivate readonly preserveSourceMetadata: boolean;\n\n\tconstructor(stream: AssistantMessageEventStream, message: AssistantMessage, preserveSourceMetadata: boolean) {\n\t\tthis.stream = stream;\n\t\tthis.message = message;\n\t\tthis.preserveSourceMetadata = preserveSourceMetadata;\n\t}\n\n\tstart(innerIndex: number, source: AssistantMessage): number {\n\t\tconst sourceBlock = source.content[innerIndex];\n\t\tconst block: ThinkingContent =\n\t\t\tthis.preserveSourceMetadata && sourceBlock?.type === \"thinking\"\n\t\t\t\t? cloneThinking(sourceBlock)\n\t\t\t\t: { type: \"thinking\", thinking: \"\" };\n\t\tconst outerIndex = this.message.content.length;\n\t\tthis.message.content.push(block);\n\t\tthis.outerIndexByInnerIndex.set(innerIndex, outerIndex);\n\t\tthis.stream.push({ type: \"thinking_start\", contentIndex: outerIndex, partial: this.message });\n\t\treturn outerIndex;\n\t}\n\n\tdelta(innerIndex: number, delta: string, source: AssistantMessage): void {\n\t\tconst outerIndex = this.outerIndexByInnerIndex.get(innerIndex);\n\t\tif (outerIndex == null) return;\n\t\tconst current = this.message.content[outerIndex];\n\t\tif (current?.type !== \"thinking\") return;\n\t\tconst sourceBlock = source.content[innerIndex];\n\t\tthis.message.content[outerIndex] =\n\t\t\tthis.preserveSourceMetadata && sourceBlock?.type === \"thinking\"\n\t\t\t\t? cloneThinking(sourceBlock)\n\t\t\t\t: cloneThinking(current, current.thinking + delta);\n\t\tthis.stream.push({ type: \"thinking_delta\", contentIndex: outerIndex, delta, partial: this.message });\n\t}\n\n\tend(innerIndex: number, content: string, source: AssistantMessage): void {\n\t\tconst outerIndex = this.outerIndexByInnerIndex.get(innerIndex);\n\t\tif (outerIndex == null) return;\n\t\tconst current = this.message.content[outerIndex];\n\t\tif (current?.type !== \"thinking\") return;\n\t\tconst sourceBlock = source.content[innerIndex];\n\t\tthis.message.content[outerIndex] =\n\t\t\tthis.preserveSourceMetadata && sourceBlock?.type === \"thinking\"\n\t\t\t\t? cloneThinking(sourceBlock, content)\n\t\t\t\t: cloneThinking(current, content);\n\t\tthis.stream.push({ type: \"thinking_end\", contentIndex: outerIndex, content, partial: this.message });\n\t}\n}\n"]}
@@ -0,0 +1,41 @@
1
+ import type { AssistantMessage, AssistantMessageEventStream, ToolCall } from "../types.ts";
2
+ import type { AssistantMessageDiagnostic } from "../utils/diagnostics.ts";
3
+ import type { StreamParserEvent } from "./types.ts";
4
+ export type ParserProjectionResult = {
5
+ readonly sawToolCall: boolean;
6
+ readonly completedToolCalls: readonly ToolCall[];
7
+ };
8
+ type StreamMessageProjectionOptions = {
9
+ readonly preserveSourceMetadata?: boolean;
10
+ };
11
+ /** Projects parser events into the canonical outer assistant stream. */
12
+ export declare class StreamMessageProjection {
13
+ readonly message: AssistantMessage;
14
+ private readonly stream;
15
+ private currentInnerTextIndex;
16
+ private readonly textBlockIndexByInnerIndex;
17
+ private readonly lastTextBlockIndexByInnerIndex;
18
+ private readonly toolCallIndexByParserIndex;
19
+ private readonly projectedDiagnostics;
20
+ private readonly thinking;
21
+ private readonly preserveSourceMetadata;
22
+ private source;
23
+ constructor(stream: AssistantMessageEventStream, source: AssistantMessage, options?: StreamMessageProjectionOptions);
24
+ sync(source: AssistantMessage): void;
25
+ appendDiagnostic(diagnostic: AssistantMessageDiagnostic): void;
26
+ startText(contentIndex: number, sourceBlock?: AssistantMessage["content"][number]): number;
27
+ startThinking(contentIndex: number, source: AssistantMessage): number;
28
+ projectThinkingDelta(contentIndex: number, delta: string, source: AssistantMessage): void;
29
+ finishThinking(contentIndex: number, content: string, source: AssistantMessage): void;
30
+ projectParserEvents(events: readonly StreamParserEvent[]): ParserProjectionResult;
31
+ finishText(): void;
32
+ finalizeDanglingToolCalls(): void;
33
+ finalize(doneMessage: AssistantMessage, sawToolCall: boolean): AssistantMessage;
34
+ hasFinalizedToolCallContent(): boolean;
35
+ private pushText;
36
+ private startToolCall;
37
+ private updateToolCall;
38
+ private endToolCall;
39
+ }
40
+ export {};
41
+ //# sourceMappingURL=stream-wrapper-shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-wrapper-shared.d.ts","sourceRoot":"","sources":["../../src/tool-call-middleware/stream-wrapper-shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,2BAA2B,EAAe,QAAQ,EAAE,MAAM,aAAa,CAAC;AACxG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAI1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIpD,MAAM,MAAM,sBAAsB,GAAG;IACpC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,SAAS,QAAQ,EAAE,CAAC;CACjD,CAAC;AAEF,KAAK,8BAA8B,GAAG;IAAE,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAUpF,wEAAwE;AACxE,qBAAa,uBAAuB;IACnC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAoC;IAC/E,OAAO,CAAC,QAAQ,CAAC,8BAA8B,CAA6B;IAC5E,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAA6B;IACxE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAoC;IACzE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAU;IACjD,OAAO,CAAC,MAAM,CAAmB;IAEjC,YACC,MAAM,EAAE,2BAA2B,EACnC,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE,8BAAmC,EAO5C;IAED,IAAI,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAGnC;IAED,gBAAgB,CAAC,UAAU,EAAE,0BAA0B,GAAG,IAAI,CAG7D;IAED,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,CAczF;IAED,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAEpE;IAED,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAExF;IAED,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAEpF;IAED,mBAAmB,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,GAAG,sBAAsB,CA2BhF;IAED,UAAU,IAAI,IAAI,CAqBjB;IAED,yBAAyB,IAAI,IAAI,CAiBhC;IAED,QAAQ,CAAC,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,OAAO,GAAG,gBAAgB,CAc9E;IAED,2BAA2B,IAAI,OAAO,CAErC;IAED,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,WAAW;CAgBnB"}
@@ -0,0 +1,209 @@
1
+ import { parseStreamingJson } from "../utils/json-parse.js";
2
+ import { cloneAssistantMessageMetadata, syncAssistantMessageMetadata } from "./stream-message-metadata.js";
3
+ import { StreamThinkingProjection } from "./stream-thinking-projection.js";
4
+ function isPartialToolCall(block) {
5
+ return block?.type === "toolCall" && "partialJson" in block && typeof block.partialJson === "string";
6
+ }
7
+ function assertNever(value) {
8
+ throw new Error(`Unexpected parser event: ${JSON.stringify(value)}`);
9
+ }
10
+ /** Projects parser events into the canonical outer assistant stream. */
11
+ export class StreamMessageProjection {
12
+ constructor(stream, source, options = {}) {
13
+ this.currentInnerTextIndex = null;
14
+ this.textBlockIndexByInnerIndex = new Map();
15
+ this.lastTextBlockIndexByInnerIndex = new Map();
16
+ this.toolCallIndexByParserIndex = new Map();
17
+ this.projectedDiagnostics = [];
18
+ this.stream = stream;
19
+ this.source = source;
20
+ this.preserveSourceMetadata = options.preserveSourceMetadata === true;
21
+ this.message = cloneAssistantMessageMetadata(source, [], this.projectedDiagnostics, this.preserveSourceMetadata);
22
+ this.thinking = new StreamThinkingProjection(stream, this.message, this.preserveSourceMetadata);
23
+ }
24
+ sync(source) {
25
+ this.source = source;
26
+ syncAssistantMessageMetadata(this.message, source, this.projectedDiagnostics, this.preserveSourceMetadata);
27
+ }
28
+ appendDiagnostic(diagnostic) {
29
+ this.projectedDiagnostics.push(diagnostic);
30
+ syncAssistantMessageMetadata(this.message, this.source, this.projectedDiagnostics, this.preserveSourceMetadata);
31
+ }
32
+ startText(contentIndex, sourceBlock) {
33
+ this.currentInnerTextIndex = contentIndex;
34
+ const outerIndex = this.message.content.length;
35
+ if (this.preserveSourceMetadata) {
36
+ const block = sourceBlock?.type === "text" ? { ...sourceBlock, text: "" } : { type: "text", text: "" };
37
+ this.message.content.push(block);
38
+ this.textBlockIndexByInnerIndex.set(contentIndex, outerIndex);
39
+ this.lastTextBlockIndexByInnerIndex.set(contentIndex, outerIndex);
40
+ }
41
+ else {
42
+ this.textBlockIndexByInnerIndex.set(contentIndex, null);
43
+ }
44
+ this.stream.push({ type: "text_start", contentIndex: outerIndex, partial: this.message });
45
+ return outerIndex;
46
+ }
47
+ startThinking(contentIndex, source) {
48
+ return this.thinking.start(contentIndex, source);
49
+ }
50
+ projectThinkingDelta(contentIndex, delta, source) {
51
+ this.thinking.delta(contentIndex, delta, source);
52
+ }
53
+ finishThinking(contentIndex, content, source) {
54
+ this.thinking.end(contentIndex, content, source);
55
+ }
56
+ projectParserEvents(events) {
57
+ let sawToolCall = false;
58
+ const completedToolCalls = [];
59
+ for (const event of events) {
60
+ switch (event.type) {
61
+ case "text":
62
+ this.pushText(event.text);
63
+ break;
64
+ case "toolcall_start":
65
+ sawToolCall = true;
66
+ this.startToolCall(event);
67
+ break;
68
+ case "toolcall_delta":
69
+ sawToolCall = true;
70
+ this.updateToolCall(event.index, event.argumentsDelta);
71
+ break;
72
+ case "toolcall_end": {
73
+ sawToolCall = true;
74
+ const completed = this.endToolCall(event);
75
+ if (completed)
76
+ completedToolCalls.push(completed);
77
+ break;
78
+ }
79
+ default:
80
+ assertNever(event);
81
+ }
82
+ }
83
+ return { sawToolCall, completedToolCalls };
84
+ }
85
+ finishText() {
86
+ const outerContentIndex = this.currentInnerTextIndex == null
87
+ ? null
88
+ : (this.textBlockIndexByInnerIndex.get(this.currentInnerTextIndex) ??
89
+ (this.preserveSourceMetadata
90
+ ? this.lastTextBlockIndexByInnerIndex.get(this.currentInnerTextIndex)
91
+ : null) ??
92
+ null);
93
+ if (outerContentIndex != null) {
94
+ const block = this.message.content[outerContentIndex];
95
+ if (block?.type === "text") {
96
+ this.stream.push({
97
+ type: "text_end",
98
+ contentIndex: outerContentIndex,
99
+ content: block.text,
100
+ partial: this.message,
101
+ });
102
+ }
103
+ }
104
+ this.currentInnerTextIndex = null;
105
+ }
106
+ finalizeDanglingToolCalls() {
107
+ for (const [contentIndex, block] of this.message.content.entries()) {
108
+ if (!isPartialToolCall(block))
109
+ continue;
110
+ const finalToolCall = {
111
+ type: "toolCall",
112
+ id: block.id,
113
+ name: block.name,
114
+ arguments: block.arguments,
115
+ incomplete: true,
116
+ errorMessage: "Tool call stream ended before completion",
117
+ };
118
+ this.message.content[contentIndex] = finalToolCall;
119
+ for (const [parserIndex, mappedContentIndex] of this.toolCallIndexByParserIndex) {
120
+ if (mappedContentIndex === contentIndex)
121
+ this.toolCallIndexByParserIndex.delete(parserIndex);
122
+ }
123
+ this.stream.push({ type: "toolcall_end", contentIndex, toolCall: finalToolCall, partial: this.message });
124
+ }
125
+ }
126
+ finalize(doneMessage, sawToolCall) {
127
+ const finalMessage = cloneAssistantMessageMetadata(doneMessage, this.message.content, this.projectedDiagnostics, this.preserveSourceMetadata);
128
+ if ((sawToolCall || this.hasFinalizedToolCallContent()) &&
129
+ (finalMessage.stopReason === "stop" || finalMessage.stopReason === "length")) {
130
+ finalMessage.stopReason = "toolUse";
131
+ }
132
+ return finalMessage;
133
+ }
134
+ hasFinalizedToolCallContent() {
135
+ return this.message.content.some((block) => block.type === "toolCall" && !isPartialToolCall(block));
136
+ }
137
+ pushText(text) {
138
+ if (this.currentInnerTextIndex == null)
139
+ return;
140
+ let contentIndex = this.textBlockIndexByInnerIndex.get(this.currentInnerTextIndex) ?? null;
141
+ if (contentIndex == null) {
142
+ contentIndex = this.message.content.length;
143
+ this.message.content.push({ type: "text", text });
144
+ this.textBlockIndexByInnerIndex.set(this.currentInnerTextIndex, contentIndex);
145
+ this.lastTextBlockIndexByInnerIndex.set(this.currentInnerTextIndex, contentIndex);
146
+ }
147
+ else {
148
+ const block = this.message.content[contentIndex];
149
+ if (block?.type !== "text")
150
+ return;
151
+ block.text += text;
152
+ }
153
+ this.stream.push({ type: "text_delta", contentIndex, delta: text, partial: this.message });
154
+ }
155
+ startToolCall(event) {
156
+ if (this.currentInnerTextIndex != null) {
157
+ const textIndex = this.textBlockIndexByInnerIndex.get(this.currentInnerTextIndex);
158
+ const block = textIndex == null ? undefined : this.message.content[textIndex];
159
+ if (textIndex === this.message.content.length - 1 &&
160
+ block?.type === "text" &&
161
+ block.text.length === 0 &&
162
+ block.textSignature === undefined) {
163
+ this.message.content.pop();
164
+ }
165
+ }
166
+ const contentIndex = this.message.content.length;
167
+ const toolCall = {
168
+ type: "toolCall",
169
+ id: event.id,
170
+ name: event.name,
171
+ arguments: {},
172
+ partialJson: "",
173
+ };
174
+ this.message.content.push(toolCall);
175
+ this.toolCallIndexByParserIndex.set(event.index, contentIndex);
176
+ if (this.currentInnerTextIndex != null)
177
+ this.textBlockIndexByInnerIndex.set(this.currentInnerTextIndex, null);
178
+ this.stream.push({ type: "toolcall_start", contentIndex, partial: this.message });
179
+ }
180
+ updateToolCall(parserIndex, delta) {
181
+ const contentIndex = this.toolCallIndexByParserIndex.get(parserIndex);
182
+ if (contentIndex == null)
183
+ return;
184
+ const block = this.message.content[contentIndex];
185
+ if (!isPartialToolCall(block))
186
+ return;
187
+ block.partialJson += delta;
188
+ block.arguments = parseStreamingJson(block.partialJson);
189
+ this.stream.push({ type: "toolcall_delta", contentIndex, delta, partial: this.message });
190
+ }
191
+ endToolCall(event) {
192
+ const contentIndex = this.toolCallIndexByParserIndex.get(event.index);
193
+ if (contentIndex == null)
194
+ return undefined;
195
+ const finalToolCall = {
196
+ type: "toolCall",
197
+ id: event.id,
198
+ name: event.name,
199
+ arguments: event.arguments,
200
+ ...(event.incomplete === true ? { incomplete: true } : {}),
201
+ ...(event.errorMessage === undefined ? {} : { errorMessage: event.errorMessage }),
202
+ };
203
+ this.message.content[contentIndex] = finalToolCall;
204
+ this.toolCallIndexByParserIndex.delete(event.index);
205
+ this.stream.push({ type: "toolcall_end", contentIndex, toolCall: finalToolCall, partial: this.message });
206
+ return finalToolCall;
207
+ }
208
+ }
209
+ //# sourceMappingURL=stream-wrapper-shared.js.map