@bolt-foundry/gambit 0.8.1 → 0.8.5-rc.4

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 (291) hide show
  1. package/CHANGELOG.md +110 -2
  2. package/README.md +108 -23
  3. package/esm/_dnt.polyfills.d.ts +17 -0
  4. package/esm/_dnt.polyfills.d.ts.map +1 -1
  5. package/esm/_dnt.polyfills.js +122 -0
  6. package/esm/deps/jsr.io/@std/collections/1.1.5/deep_merge.d.ts +322 -0
  7. package/esm/deps/jsr.io/@std/collections/1.1.5/deep_merge.d.ts.map +1 -0
  8. package/esm/deps/jsr.io/@std/collections/1.1.5/deep_merge.js +105 -0
  9. package/esm/deps/jsr.io/@std/fs/1.0.22/_create_walk_entry.d.ts +14 -0
  10. package/esm/deps/jsr.io/@std/fs/1.0.22/_create_walk_entry.d.ts.map +1 -0
  11. package/esm/deps/jsr.io/@std/fs/1.0.22/_create_walk_entry.js +34 -0
  12. package/esm/deps/jsr.io/@std/fs/1.0.22/_get_file_info_type.d.ts +13 -0
  13. package/esm/deps/jsr.io/@std/fs/1.0.22/_get_file_info_type.d.ts.map +1 -0
  14. package/esm/deps/jsr.io/@std/fs/1.0.22/_get_file_info_type.js +18 -0
  15. package/esm/deps/jsr.io/@std/fs/1.0.22/_is_same_path.d.ts +10 -0
  16. package/esm/deps/jsr.io/@std/fs/1.0.22/_is_same_path.d.ts.map +1 -0
  17. package/esm/deps/jsr.io/@std/fs/1.0.22/_is_same_path.js +17 -0
  18. package/esm/deps/jsr.io/@std/fs/1.0.22/_is_subdir.d.ts +12 -0
  19. package/esm/deps/jsr.io/@std/fs/1.0.22/_is_subdir.d.ts.map +1 -0
  20. package/esm/deps/jsr.io/@std/fs/1.0.22/_is_subdir.js +25 -0
  21. package/esm/deps/jsr.io/@std/fs/1.0.22/_to_path_string.d.ts +9 -0
  22. package/esm/deps/jsr.io/@std/fs/1.0.22/_to_path_string.d.ts.map +1 -0
  23. package/esm/deps/jsr.io/@std/fs/1.0.22/_to_path_string.js +13 -0
  24. package/esm/deps/jsr.io/@std/fs/1.0.22/copy.d.ts +117 -0
  25. package/esm/deps/jsr.io/@std/fs/1.0.22/copy.d.ts.map +1 -0
  26. package/esm/deps/jsr.io/@std/fs/1.0.22/copy.js +313 -0
  27. package/esm/deps/jsr.io/@std/fs/1.0.22/empty_dir.d.ts +48 -0
  28. package/esm/deps/jsr.io/@std/fs/1.0.22/empty_dir.d.ts.map +1 -0
  29. package/esm/deps/jsr.io/@std/fs/1.0.22/empty_dir.js +87 -0
  30. package/esm/deps/jsr.io/@std/fs/1.0.22/ensure_dir.d.ts +49 -0
  31. package/esm/deps/jsr.io/@std/fs/1.0.22/ensure_dir.d.ts.map +1 -0
  32. package/esm/deps/jsr.io/@std/fs/1.0.22/ensure_dir.js +102 -0
  33. package/esm/deps/jsr.io/@std/fs/1.0.22/ensure_file.d.ts +47 -0
  34. package/esm/deps/jsr.io/@std/fs/1.0.22/ensure_file.d.ts.map +1 -0
  35. package/esm/deps/jsr.io/@std/fs/1.0.22/ensure_file.js +90 -0
  36. package/esm/deps/jsr.io/@std/fs/1.0.22/ensure_link.d.ts +49 -0
  37. package/esm/deps/jsr.io/@std/fs/1.0.22/ensure_link.d.ts.map +1 -0
  38. package/esm/deps/jsr.io/@std/fs/1.0.22/ensure_link.js +61 -0
  39. package/esm/deps/jsr.io/@std/fs/1.0.22/ensure_symlink.d.ts +70 -0
  40. package/esm/deps/jsr.io/@std/fs/1.0.22/ensure_symlink.d.ts.map +1 -0
  41. package/esm/deps/jsr.io/@std/fs/1.0.22/ensure_symlink.js +156 -0
  42. package/esm/deps/jsr.io/@std/fs/1.0.22/eol.d.ts +52 -0
  43. package/esm/deps/jsr.io/@std/fs/1.0.22/eol.d.ts.map +1 -0
  44. package/esm/deps/jsr.io/@std/fs/1.0.22/eol.js +67 -0
  45. package/esm/deps/jsr.io/@std/fs/1.0.22/exists.d.ts +218 -0
  46. package/esm/deps/jsr.io/@std/fs/1.0.22/exists.d.ts.map +1 -0
  47. package/esm/deps/jsr.io/@std/fs/1.0.22/exists.js +271 -0
  48. package/esm/deps/jsr.io/@std/fs/1.0.22/expand_glob.d.ts +267 -0
  49. package/esm/deps/jsr.io/@std/fs/1.0.22/expand_glob.d.ts.map +1 -0
  50. package/esm/deps/jsr.io/@std/fs/1.0.22/expand_glob.js +442 -0
  51. package/esm/deps/jsr.io/@std/fs/1.0.22/mod.d.ts +29 -0
  52. package/esm/deps/jsr.io/@std/fs/1.0.22/mod.d.ts.map +1 -0
  53. package/esm/deps/jsr.io/@std/fs/1.0.22/mod.js +29 -0
  54. package/esm/deps/jsr.io/@std/fs/1.0.22/move.d.ts +86 -0
  55. package/esm/deps/jsr.io/@std/fs/1.0.22/move.d.ts.map +1 -0
  56. package/esm/deps/jsr.io/@std/fs/1.0.22/move.js +142 -0
  57. package/esm/deps/jsr.io/@std/fs/1.0.22/walk.d.ts +777 -0
  58. package/esm/deps/jsr.io/@std/fs/1.0.22/walk.d.ts.map +1 -0
  59. package/esm/deps/jsr.io/@std/fs/1.0.22/walk.js +846 -0
  60. package/esm/deps/jsr.io/@std/json/1.0.2/types.d.ts +5 -0
  61. package/esm/deps/jsr.io/@std/json/1.0.2/types.d.ts.map +1 -0
  62. package/esm/deps/jsr.io/@std/json/1.0.2/types.js +3 -0
  63. package/esm/deps/jsr.io/@std/jsonc/1.0.2/mod.d.ts +20 -0
  64. package/esm/deps/jsr.io/@std/jsonc/1.0.2/mod.d.ts.map +1 -0
  65. package/esm/deps/jsr.io/@std/jsonc/1.0.2/mod.js +21 -0
  66. package/esm/deps/jsr.io/@std/jsonc/1.0.2/parse.d.ts +21 -0
  67. package/esm/deps/jsr.io/@std/jsonc/1.0.2/parse.d.ts.map +1 -0
  68. package/esm/deps/jsr.io/@std/jsonc/1.0.2/parse.js +320 -0
  69. package/esm/deps/jsr.io/@std/toml/1.0.11/_parser.d.ts +93 -0
  70. package/esm/deps/jsr.io/@std/toml/1.0.11/_parser.d.ts.map +1 -0
  71. package/esm/deps/jsr.io/@std/toml/1.0.11/_parser.js +753 -0
  72. package/esm/deps/jsr.io/@std/toml/1.0.11/mod.d.ts +109 -0
  73. package/esm/deps/jsr.io/@std/toml/1.0.11/mod.d.ts.map +1 -0
  74. package/esm/deps/jsr.io/@std/toml/1.0.11/mod.js +110 -0
  75. package/esm/deps/jsr.io/@std/toml/1.0.11/parse.d.ts +21 -0
  76. package/esm/deps/jsr.io/@std/toml/1.0.11/parse.d.ts.map +1 -0
  77. package/esm/deps/jsr.io/@std/toml/1.0.11/parse.js +25 -0
  78. package/esm/deps/jsr.io/@std/toml/1.0.11/stringify.d.ts +35 -0
  79. package/esm/deps/jsr.io/@std/toml/1.0.11/stringify.d.ts.map +1 -0
  80. package/esm/deps/jsr.io/@std/toml/1.0.11/stringify.js +283 -0
  81. package/esm/gambit/simulator-ui/dist/bundle.js +12085 -5691
  82. package/esm/gambit/simulator-ui/dist/bundle.js.map +4 -4
  83. package/esm/gambit/simulator-ui/dist/favicon.ico +0 -0
  84. package/esm/mod.d.ts +21 -7
  85. package/esm/mod.d.ts.map +1 -1
  86. package/esm/mod.js +14 -4
  87. package/esm/src/cli_utils.d.ts +1 -0
  88. package/esm/src/cli_utils.d.ts.map +1 -1
  89. package/esm/src/cli_utils.js +52 -4
  90. package/esm/src/default_runtime.d.ts +46 -0
  91. package/esm/src/default_runtime.d.ts.map +1 -0
  92. package/esm/src/default_runtime.js +415 -0
  93. package/esm/src/durable_streams.js +26 -1
  94. package/esm/src/model_matchers.d.ts +10 -0
  95. package/esm/src/model_matchers.d.ts.map +1 -0
  96. package/esm/src/model_matchers.js +26 -0
  97. package/esm/src/openai_compat.d.ts +74 -0
  98. package/esm/src/openai_compat.d.ts.map +1 -0
  99. package/esm/src/openai_compat.js +329 -0
  100. package/esm/src/project_config.d.ts +47 -0
  101. package/esm/src/project_config.d.ts.map +1 -0
  102. package/esm/src/project_config.js +134 -0
  103. package/esm/src/providers/codex.d.ts +37 -0
  104. package/esm/src/providers/codex.d.ts.map +1 -0
  105. package/esm/src/providers/codex.js +810 -0
  106. package/esm/src/providers/google.d.ts +18 -0
  107. package/esm/src/providers/google.d.ts.map +1 -0
  108. package/esm/src/providers/google.js +428 -0
  109. package/esm/src/providers/ollama.d.ts +19 -0
  110. package/esm/src/providers/ollama.d.ts.map +1 -0
  111. package/esm/src/providers/ollama.js +732 -0
  112. package/esm/src/providers/openrouter.d.ts +26 -0
  113. package/esm/src/providers/openrouter.d.ts.map +1 -0
  114. package/esm/src/providers/openrouter.js +829 -0
  115. package/esm/src/providers/router.d.ts +19 -0
  116. package/esm/src/providers/router.d.ts.map +1 -0
  117. package/esm/src/providers/router.js +93 -0
  118. package/esm/src/server.d.ts +11 -0
  119. package/esm/src/server.d.ts.map +1 -1
  120. package/esm/src/server.js +3764 -647
  121. package/esm/src/server_feedback_grading_routes.d.ts +32 -0
  122. package/esm/src/server_feedback_grading_routes.d.ts.map +1 -0
  123. package/esm/src/server_feedback_grading_routes.js +305 -0
  124. package/esm/src/server_helpers.d.ts +4 -0
  125. package/esm/src/server_helpers.d.ts.map +1 -0
  126. package/esm/src/server_helpers.js +46 -0
  127. package/esm/src/server_session_store.d.ts +87 -0
  128. package/esm/src/server_session_store.d.ts.map +1 -0
  129. package/esm/src/server_session_store.js +873 -0
  130. package/esm/src/server_types.d.ts +110 -0
  131. package/esm/src/server_types.d.ts.map +1 -0
  132. package/esm/src/server_types.js +1 -0
  133. package/esm/src/server_ui_routes.d.ts +33 -0
  134. package/esm/src/server_ui_routes.d.ts.map +1 -0
  135. package/esm/src/server_ui_routes.js +135 -0
  136. package/esm/src/session_artifacts.d.ts +22 -0
  137. package/esm/src/session_artifacts.d.ts.map +1 -0
  138. package/esm/src/session_artifacts.js +243 -0
  139. package/esm/src/trace.d.ts.map +1 -1
  140. package/esm/src/trace.js +8 -5
  141. package/esm/src/workspace.d.ts +19 -0
  142. package/esm/src/workspace.d.ts.map +1 -0
  143. package/esm/src/workspace.js +164 -0
  144. package/esm/src/workspace_contract.d.ts +76 -0
  145. package/esm/src/workspace_contract.d.ts.map +1 -0
  146. package/esm/src/workspace_contract.js +74 -0
  147. package/package.json +3 -2
  148. package/script/_dnt.polyfills.d.ts +17 -0
  149. package/script/_dnt.polyfills.d.ts.map +1 -1
  150. package/script/_dnt.polyfills.js +122 -0
  151. package/script/deps/jsr.io/@std/collections/1.1.5/deep_merge.d.ts +322 -0
  152. package/script/deps/jsr.io/@std/collections/1.1.5/deep_merge.d.ts.map +1 -0
  153. package/script/deps/jsr.io/@std/collections/1.1.5/deep_merge.js +108 -0
  154. package/script/deps/jsr.io/@std/fs/1.0.22/_create_walk_entry.d.ts +14 -0
  155. package/script/deps/jsr.io/@std/fs/1.0.22/_create_walk_entry.d.ts.map +1 -0
  156. package/script/deps/jsr.io/@std/fs/1.0.22/_create_walk_entry.js +71 -0
  157. package/script/deps/jsr.io/@std/fs/1.0.22/_get_file_info_type.d.ts +13 -0
  158. package/script/deps/jsr.io/@std/fs/1.0.22/_get_file_info_type.d.ts.map +1 -0
  159. package/script/deps/jsr.io/@std/fs/1.0.22/_get_file_info_type.js +21 -0
  160. package/script/deps/jsr.io/@std/fs/1.0.22/_is_same_path.d.ts +10 -0
  161. package/script/deps/jsr.io/@std/fs/1.0.22/_is_same_path.d.ts.map +1 -0
  162. package/script/deps/jsr.io/@std/fs/1.0.22/_is_same_path.js +20 -0
  163. package/script/deps/jsr.io/@std/fs/1.0.22/_is_subdir.d.ts +12 -0
  164. package/script/deps/jsr.io/@std/fs/1.0.22/_is_subdir.d.ts.map +1 -0
  165. package/script/deps/jsr.io/@std/fs/1.0.22/_is_subdir.js +28 -0
  166. package/script/deps/jsr.io/@std/fs/1.0.22/_to_path_string.d.ts +9 -0
  167. package/script/deps/jsr.io/@std/fs/1.0.22/_to_path_string.d.ts.map +1 -0
  168. package/script/deps/jsr.io/@std/fs/1.0.22/_to_path_string.js +16 -0
  169. package/script/deps/jsr.io/@std/fs/1.0.22/copy.d.ts +117 -0
  170. package/script/deps/jsr.io/@std/fs/1.0.22/copy.d.ts.map +1 -0
  171. package/script/deps/jsr.io/@std/fs/1.0.22/copy.js +350 -0
  172. package/script/deps/jsr.io/@std/fs/1.0.22/empty_dir.d.ts +48 -0
  173. package/script/deps/jsr.io/@std/fs/1.0.22/empty_dir.d.ts.map +1 -0
  174. package/script/deps/jsr.io/@std/fs/1.0.22/empty_dir.js +124 -0
  175. package/script/deps/jsr.io/@std/fs/1.0.22/ensure_dir.d.ts +49 -0
  176. package/script/deps/jsr.io/@std/fs/1.0.22/ensure_dir.d.ts.map +1 -0
  177. package/script/deps/jsr.io/@std/fs/1.0.22/ensure_dir.js +139 -0
  178. package/script/deps/jsr.io/@std/fs/1.0.22/ensure_file.d.ts +47 -0
  179. package/script/deps/jsr.io/@std/fs/1.0.22/ensure_file.d.ts.map +1 -0
  180. package/script/deps/jsr.io/@std/fs/1.0.22/ensure_file.js +127 -0
  181. package/script/deps/jsr.io/@std/fs/1.0.22/ensure_link.d.ts +49 -0
  182. package/script/deps/jsr.io/@std/fs/1.0.22/ensure_link.d.ts.map +1 -0
  183. package/script/deps/jsr.io/@std/fs/1.0.22/ensure_link.js +98 -0
  184. package/script/deps/jsr.io/@std/fs/1.0.22/ensure_symlink.d.ts +70 -0
  185. package/script/deps/jsr.io/@std/fs/1.0.22/ensure_symlink.d.ts.map +1 -0
  186. package/script/deps/jsr.io/@std/fs/1.0.22/ensure_symlink.js +193 -0
  187. package/script/deps/jsr.io/@std/fs/1.0.22/eol.d.ts +52 -0
  188. package/script/deps/jsr.io/@std/fs/1.0.22/eol.d.ts.map +1 -0
  189. package/script/deps/jsr.io/@std/fs/1.0.22/eol.js +105 -0
  190. package/script/deps/jsr.io/@std/fs/1.0.22/exists.d.ts +218 -0
  191. package/script/deps/jsr.io/@std/fs/1.0.22/exists.d.ts.map +1 -0
  192. package/script/deps/jsr.io/@std/fs/1.0.22/exists.js +308 -0
  193. package/script/deps/jsr.io/@std/fs/1.0.22/expand_glob.d.ts +267 -0
  194. package/script/deps/jsr.io/@std/fs/1.0.22/expand_glob.d.ts.map +1 -0
  195. package/script/deps/jsr.io/@std/fs/1.0.22/expand_glob.js +479 -0
  196. package/script/deps/jsr.io/@std/fs/1.0.22/mod.d.ts +29 -0
  197. package/script/deps/jsr.io/@std/fs/1.0.22/mod.d.ts.map +1 -0
  198. package/script/deps/jsr.io/@std/fs/1.0.22/mod.js +45 -0
  199. package/script/deps/jsr.io/@std/fs/1.0.22/move.d.ts +86 -0
  200. package/script/deps/jsr.io/@std/fs/1.0.22/move.d.ts.map +1 -0
  201. package/script/deps/jsr.io/@std/fs/1.0.22/move.js +179 -0
  202. package/script/deps/jsr.io/@std/fs/1.0.22/walk.d.ts +777 -0
  203. package/script/deps/jsr.io/@std/fs/1.0.22/walk.d.ts.map +1 -0
  204. package/script/deps/jsr.io/@std/fs/1.0.22/walk.js +883 -0
  205. package/script/deps/jsr.io/@std/json/1.0.2/types.d.ts +5 -0
  206. package/script/deps/jsr.io/@std/json/1.0.2/types.d.ts.map +1 -0
  207. package/script/deps/jsr.io/@std/json/1.0.2/types.js +4 -0
  208. package/script/deps/jsr.io/@std/jsonc/1.0.2/mod.d.ts +20 -0
  209. package/script/deps/jsr.io/@std/jsonc/1.0.2/mod.d.ts.map +1 -0
  210. package/script/deps/jsr.io/@std/jsonc/1.0.2/mod.js +37 -0
  211. package/script/deps/jsr.io/@std/jsonc/1.0.2/parse.d.ts +21 -0
  212. package/script/deps/jsr.io/@std/jsonc/1.0.2/parse.d.ts.map +1 -0
  213. package/script/deps/jsr.io/@std/jsonc/1.0.2/parse.js +323 -0
  214. package/script/deps/jsr.io/@std/toml/1.0.11/_parser.d.ts +93 -0
  215. package/script/deps/jsr.io/@std/toml/1.0.11/_parser.d.ts.map +1 -0
  216. package/script/deps/jsr.io/@std/toml/1.0.11/_parser.js +781 -0
  217. package/script/deps/jsr.io/@std/toml/1.0.11/mod.d.ts +109 -0
  218. package/script/deps/jsr.io/@std/toml/1.0.11/mod.d.ts.map +1 -0
  219. package/script/deps/jsr.io/@std/toml/1.0.11/mod.js +126 -0
  220. package/script/deps/jsr.io/@std/toml/1.0.11/parse.d.ts +21 -0
  221. package/script/deps/jsr.io/@std/toml/1.0.11/parse.d.ts.map +1 -0
  222. package/script/deps/jsr.io/@std/toml/1.0.11/parse.js +28 -0
  223. package/script/deps/jsr.io/@std/toml/1.0.11/stringify.d.ts +35 -0
  224. package/script/deps/jsr.io/@std/toml/1.0.11/stringify.d.ts.map +1 -0
  225. package/script/deps/jsr.io/@std/toml/1.0.11/stringify.js +286 -0
  226. package/script/gambit/simulator-ui/dist/bundle.js +12085 -5691
  227. package/script/gambit/simulator-ui/dist/bundle.js.map +4 -4
  228. package/script/gambit/simulator-ui/dist/favicon.ico +0 -0
  229. package/script/mod.d.ts +21 -7
  230. package/script/mod.d.ts.map +1 -1
  231. package/script/mod.js +22 -7
  232. package/script/src/cli_utils.d.ts +1 -0
  233. package/script/src/cli_utils.d.ts.map +1 -1
  234. package/script/src/cli_utils.js +52 -3
  235. package/script/src/default_runtime.d.ts +46 -0
  236. package/script/src/default_runtime.d.ts.map +1 -0
  237. package/script/src/default_runtime.js +452 -0
  238. package/script/src/durable_streams.js +26 -1
  239. package/script/src/model_matchers.d.ts +10 -0
  240. package/script/src/model_matchers.d.ts.map +1 -0
  241. package/script/src/model_matchers.js +29 -0
  242. package/script/src/openai_compat.d.ts +74 -0
  243. package/script/src/openai_compat.d.ts.map +1 -0
  244. package/script/src/openai_compat.js +366 -0
  245. package/script/src/project_config.d.ts +47 -0
  246. package/script/src/project_config.d.ts.map +1 -0
  247. package/script/src/project_config.js +173 -0
  248. package/script/src/providers/codex.d.ts +37 -0
  249. package/script/src/providers/codex.d.ts.map +1 -0
  250. package/script/src/providers/codex.js +850 -0
  251. package/script/src/providers/google.d.ts +18 -0
  252. package/script/src/providers/google.d.ts.map +1 -0
  253. package/script/src/providers/google.js +435 -0
  254. package/script/src/providers/ollama.d.ts +19 -0
  255. package/script/src/providers/ollama.d.ts.map +1 -0
  256. package/script/src/providers/ollama.js +774 -0
  257. package/script/src/providers/openrouter.d.ts +26 -0
  258. package/script/src/providers/openrouter.d.ts.map +1 -0
  259. package/script/src/providers/openrouter.js +869 -0
  260. package/script/src/providers/router.d.ts +19 -0
  261. package/script/src/providers/router.d.ts.map +1 -0
  262. package/script/src/providers/router.js +96 -0
  263. package/script/src/server.d.ts +11 -0
  264. package/script/src/server.d.ts.map +1 -1
  265. package/script/src/server.js +3768 -651
  266. package/script/src/server_feedback_grading_routes.d.ts +32 -0
  267. package/script/src/server_feedback_grading_routes.d.ts.map +1 -0
  268. package/script/src/server_feedback_grading_routes.js +343 -0
  269. package/script/src/server_helpers.d.ts +4 -0
  270. package/script/src/server_helpers.d.ts.map +1 -0
  271. package/script/src/server_helpers.js +84 -0
  272. package/script/src/server_session_store.d.ts +87 -0
  273. package/script/src/server_session_store.d.ts.map +1 -0
  274. package/script/src/server_session_store.js +910 -0
  275. package/script/src/server_types.d.ts +110 -0
  276. package/script/src/server_types.d.ts.map +1 -0
  277. package/script/src/server_types.js +2 -0
  278. package/script/src/server_ui_routes.d.ts +33 -0
  279. package/script/src/server_ui_routes.d.ts.map +1 -0
  280. package/script/src/server_ui_routes.js +172 -0
  281. package/script/src/session_artifacts.d.ts +22 -0
  282. package/script/src/session_artifacts.d.ts.map +1 -0
  283. package/script/src/session_artifacts.js +279 -0
  284. package/script/src/trace.d.ts.map +1 -1
  285. package/script/src/trace.js +8 -5
  286. package/script/src/workspace.d.ts +19 -0
  287. package/script/src/workspace.d.ts.map +1 -0
  288. package/script/src/workspace.js +201 -0
  289. package/script/src/workspace_contract.d.ts +76 -0
  290. package/script/src/workspace_contract.d.ts.map +1 -0
  291. package/script/src/workspace_contract.js +82 -0
@@ -0,0 +1,869 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.OPENROUTER_PREFIX = void 0;
40
+ exports.createOpenRouterProvider = createOpenRouterProvider;
41
+ const dntShim = __importStar(require("../../_dnt.shims.js"));
42
+ const openai_1 = __importDefault(require("openai"));
43
+ const gambit_core_1 = require("@bolt-foundry/gambit-core");
44
+ const logger = console;
45
+ exports.OPENROUTER_PREFIX = "openrouter/";
46
+ function normalizeOpenRouterModel(model) {
47
+ return model.startsWith(exports.OPENROUTER_PREFIX)
48
+ ? model.slice(exports.OPENROUTER_PREFIX.length)
49
+ : model;
50
+ }
51
+ function normalizeMessage(content) {
52
+ const toolCalls = content.tool_calls ??
53
+ undefined;
54
+ return {
55
+ role: content.role,
56
+ content: typeof content.content === "string"
57
+ ? content.content
58
+ : Array.isArray(content.content)
59
+ ? content.content
60
+ .map((c) => (typeof c === "string" ? c : ""))
61
+ .join("")
62
+ : "",
63
+ name: content.name,
64
+ tool_call_id: content.tool_call_id,
65
+ tool_calls: toolCalls && toolCalls.length > 0 ? toolCalls : undefined,
66
+ };
67
+ }
68
+ function safeJson(input) {
69
+ try {
70
+ const parsed = JSON.parse(input);
71
+ if (parsed && typeof parsed === "object") {
72
+ return parsed;
73
+ }
74
+ }
75
+ catch {
76
+ // fall through
77
+ }
78
+ return {};
79
+ }
80
+ function isAsyncIterable(value) {
81
+ return Boolean(value &&
82
+ typeof value === "object" &&
83
+ Symbol.asyncIterator in value);
84
+ }
85
+ function mapUsage(usage) {
86
+ if (!usage)
87
+ return undefined;
88
+ const reasoningTokens = usage.output_tokens_details?.reasoning_tokens ?? undefined;
89
+ const out = {
90
+ promptTokens: usage.input_tokens ?? 0,
91
+ completionTokens: usage.output_tokens ?? 0,
92
+ totalTokens: usage.total_tokens ?? 0,
93
+ };
94
+ if (typeof reasoningTokens === "number") {
95
+ out.reasoningTokens = reasoningTokens;
96
+ }
97
+ return out;
98
+ }
99
+ function mapStatus(status) {
100
+ if (!status)
101
+ return undefined;
102
+ if (status === "completed")
103
+ return "completed";
104
+ if (status === "in_progress" || status === "queued")
105
+ return "in_progress";
106
+ return "failed";
107
+ }
108
+ function mapReasoning(reasoning) {
109
+ if (!reasoning)
110
+ return undefined;
111
+ const out = {};
112
+ if (reasoning.effort !== undefined)
113
+ out.effort = reasoning.effort;
114
+ if (reasoning.summary !== undefined)
115
+ out.summary = reasoning.summary;
116
+ return Object.keys(out).length > 0 ? out : undefined;
117
+ }
118
+ function stripUndefined(input) {
119
+ const out = { ...input };
120
+ for (const [key, value] of Object.entries(out)) {
121
+ if (value === undefined) {
122
+ delete out[key];
123
+ }
124
+ }
125
+ return out;
126
+ }
127
+ function mapError(error) {
128
+ if (!error)
129
+ return undefined;
130
+ return { code: error.code, message: error.message };
131
+ }
132
+ function mapTools(tools) {
133
+ if (!tools || tools.length === 0)
134
+ return undefined;
135
+ return tools.map((tool) => ({
136
+ type: "function",
137
+ name: tool.function.name,
138
+ description: tool.function.description ?? null,
139
+ parameters: normalizeToolParameters(tool.function.parameters),
140
+ strict: false,
141
+ }));
142
+ }
143
+ function normalizeToolParameters(parameters) {
144
+ const normalized = structuredClone(parameters ?? {});
145
+ if (normalized.type !== "object") {
146
+ return normalized;
147
+ }
148
+ if (normalized.properties === undefined) {
149
+ normalized.properties = {};
150
+ }
151
+ const props = normalized.properties;
152
+ if (props && typeof props === "object" && !Array.isArray(props)) {
153
+ const requiredKeys = Array.isArray(normalized.required)
154
+ ? normalized.required.filter((key) => typeof key === "string" && key in props)
155
+ : [];
156
+ for (const [key, value] of Object.entries(props)) {
157
+ if (!value || typeof value !== "object" || Array.isArray(value))
158
+ continue;
159
+ if (!("type" in value))
160
+ continue;
161
+ if (value.type === "object" && value.additionalProperties !== false) {
162
+ props[key] = {
163
+ ...value,
164
+ additionalProperties: false,
165
+ };
166
+ }
167
+ }
168
+ if (requiredKeys.length > 0) {
169
+ normalized.required = requiredKeys;
170
+ }
171
+ }
172
+ const additional = normalized.additionalProperties;
173
+ if (additional !== false) {
174
+ normalized.additionalProperties = false;
175
+ }
176
+ return normalized;
177
+ }
178
+ function appendSyntheticTools(tools, input) {
179
+ const needed = new Set();
180
+ for (const item of input) {
181
+ if (item.type !== "function_call")
182
+ continue;
183
+ if (item.name === gambit_core_1.GAMBIT_TOOL_CONTEXT || item.name === gambit_core_1.GAMBIT_TOOL_INIT) {
184
+ needed.add(item.name);
185
+ }
186
+ }
187
+ for (const name of needed) {
188
+ if (tools.some((tool) => tool.name === name))
189
+ continue;
190
+ tools.push({
191
+ type: "function",
192
+ name,
193
+ description: "Synthetic Gambit context payload.",
194
+ parameters: {
195
+ type: "object",
196
+ properties: {},
197
+ additionalProperties: false,
198
+ required: [],
199
+ },
200
+ strict: false,
201
+ });
202
+ }
203
+ }
204
+ function mapToolChoice(toolChoice) {
205
+ if (!toolChoice)
206
+ return undefined;
207
+ if (toolChoice === "none" || toolChoice === "auto" ||
208
+ toolChoice === "required") {
209
+ return toolChoice;
210
+ }
211
+ if (toolChoice.type === "allowed_tools") {
212
+ return {
213
+ type: "allowed_tools",
214
+ tools: toolChoice.tools,
215
+ mode: toolChoice.mode ?? "auto",
216
+ };
217
+ }
218
+ return { type: "function", name: toolChoice.function.name };
219
+ }
220
+ function mapResponseContentPart(part) {
221
+ if (!part || typeof part !== "object")
222
+ return null;
223
+ if (typeof part.text !== "string")
224
+ return null;
225
+ if (part.type === "output_text") {
226
+ return { type: "output_text", text: part.text };
227
+ }
228
+ if (part.type === "summary_text") {
229
+ return { type: "summary_text", text: part.text };
230
+ }
231
+ if (part.type === "reasoning_text") {
232
+ return { type: "reasoning_text", text: part.text };
233
+ }
234
+ if (part.type === "input_text") {
235
+ return { type: "input_text", text: part.text };
236
+ }
237
+ return null;
238
+ }
239
+ function mapOpenAIOutputItem(item) {
240
+ const itemType = item.type;
241
+ if (itemType === "message") {
242
+ const message = item;
243
+ const content = (message.content ?? [])
244
+ .map((part) => mapResponseContentPart(part))
245
+ .filter((part) => Boolean(part));
246
+ if (content.length === 0)
247
+ return null;
248
+ return {
249
+ type: "message",
250
+ role: "assistant",
251
+ content,
252
+ id: message.id,
253
+ };
254
+ }
255
+ if (itemType === "function_call") {
256
+ const call = item;
257
+ return {
258
+ type: "function_call",
259
+ call_id: call.call_id,
260
+ name: call.name,
261
+ arguments: call.arguments,
262
+ id: call.id,
263
+ };
264
+ }
265
+ if (itemType === "reasoning") {
266
+ const reasoning = item;
267
+ const content = (reasoning.content ?? [])
268
+ .map((part) => mapResponseContentPart(part))
269
+ .filter((part) => Boolean(part));
270
+ const summary = (reasoning.summary ?? [])
271
+ .map((part) => mapResponseContentPart(part))
272
+ .filter((part) => Boolean(part));
273
+ return {
274
+ type: "reasoning",
275
+ id: reasoning.id,
276
+ content: content.length > 0 ? content : undefined,
277
+ summary,
278
+ encrypted_content: reasoning.encrypted_content,
279
+ };
280
+ }
281
+ return null;
282
+ }
283
+ function normalizeOpenAIResponse(response) {
284
+ const outputItems = (response.output ?? [])
285
+ .map(mapOpenAIOutputItem)
286
+ .filter((item) => Boolean(item));
287
+ return {
288
+ id: response.id,
289
+ object: "response",
290
+ model: response.model,
291
+ created_at: response.created_at,
292
+ created: response.created_at,
293
+ completed_at: response.completed_at ??
294
+ null,
295
+ previous_response_id: response.previous_response_id ?? null,
296
+ instructions: response.instructions ?? null,
297
+ reasoning: response
298
+ .reasoning ?? null,
299
+ status: mapStatus(response.status ?? undefined),
300
+ output: outputItems,
301
+ usage: mapUsage(response.usage),
302
+ error: mapError(response.error) ?? null,
303
+ metadata: response.metadata,
304
+ max_output_tokens: response.max_output_tokens ?? null,
305
+ max_tool_calls: response.max_tool_calls ?? null,
306
+ parallel_tool_calls: response.parallel_tool_calls,
307
+ store: response.store,
308
+ };
309
+ }
310
+ function toOpenAIInputItems(items) {
311
+ const mapped = [];
312
+ for (const item of items) {
313
+ if (item.type === "message") {
314
+ const isAssistant = item.role === "assistant";
315
+ const content = item.content
316
+ .map((part) => {
317
+ if (part.type === "output_text") {
318
+ return {
319
+ type: "output_text",
320
+ text: part.text,
321
+ };
322
+ }
323
+ if (part.type === "input_text") {
324
+ return {
325
+ type: isAssistant ? "output_text" : "input_text",
326
+ text: part.text,
327
+ };
328
+ }
329
+ if (part.type === "summary_text") {
330
+ return {
331
+ type: "summary_text",
332
+ text: part.text,
333
+ };
334
+ }
335
+ if (part.type === "reasoning_text") {
336
+ return {
337
+ type: "reasoning_text",
338
+ text: part.text,
339
+ };
340
+ }
341
+ return null;
342
+ })
343
+ .filter((part) => Boolean(part));
344
+ if (content.length === 0)
345
+ continue;
346
+ mapped.push({
347
+ type: "message",
348
+ role: item.role,
349
+ content,
350
+ id: item.id,
351
+ });
352
+ continue;
353
+ }
354
+ if (item.type === "function_call") {
355
+ mapped.push({
356
+ type: "function_call",
357
+ call_id: item.call_id,
358
+ name: item.name,
359
+ arguments: item.arguments,
360
+ id: item.id,
361
+ });
362
+ continue;
363
+ }
364
+ if (item.type === "function_call_output") {
365
+ mapped.push({
366
+ type: "function_call_output",
367
+ call_id: item.call_id,
368
+ output: item.output,
369
+ id: item.id,
370
+ });
371
+ continue;
372
+ }
373
+ if (item.type === "reasoning") {
374
+ mapped.push({
375
+ type: "reasoning",
376
+ id: item.id,
377
+ content: (item.content ?? []).map((part) => ({
378
+ type: part.type,
379
+ text: part.text,
380
+ })),
381
+ summary: item.summary.map((part) => ({
382
+ type: part.type,
383
+ text: part.text,
384
+ })),
385
+ encrypted_content: item.encrypted_content ?? null,
386
+ });
387
+ }
388
+ }
389
+ return mapped;
390
+ }
391
+ function chatMessagesToResponseItems(messages) {
392
+ const items = [];
393
+ for (const message of messages) {
394
+ if (message.role === "tool") {
395
+ if (message.tool_call_id &&
396
+ typeof message.content === "string") {
397
+ items.push({
398
+ type: "function_call_output",
399
+ call_id: message.tool_call_id,
400
+ output: message.content,
401
+ });
402
+ }
403
+ continue;
404
+ }
405
+ if (message.role === "system" || message.role === "user" ||
406
+ message.role === "assistant") {
407
+ const content = [];
408
+ if (typeof message.content === "string" && message.content.length > 0) {
409
+ content.push({
410
+ type: message.role === "assistant" ? "output_text" : "input_text",
411
+ text: message.content,
412
+ });
413
+ }
414
+ if (content.length > 0) {
415
+ items.push({
416
+ type: "message",
417
+ role: message.role,
418
+ content,
419
+ });
420
+ }
421
+ }
422
+ if (message.role === "assistant" && message.tool_calls) {
423
+ for (const call of message.tool_calls) {
424
+ items.push({
425
+ type: "function_call",
426
+ call_id: call.id,
427
+ name: call.function.name,
428
+ arguments: call.function.arguments,
429
+ });
430
+ }
431
+ }
432
+ }
433
+ return items;
434
+ }
435
+ function responseItemsToChat(items) {
436
+ const textParts = [];
437
+ const toolCalls = [];
438
+ const messageToolCalls = [];
439
+ for (const item of items) {
440
+ if (item.type === "message" && item.role === "assistant") {
441
+ for (const part of item.content) {
442
+ if (part.type === "output_text") {
443
+ textParts.push(part.text);
444
+ }
445
+ }
446
+ }
447
+ if (item.type === "function_call") {
448
+ toolCalls.push({
449
+ id: item.call_id,
450
+ name: item.name,
451
+ args: safeJson(item.arguments),
452
+ });
453
+ messageToolCalls.push({
454
+ id: item.call_id,
455
+ type: "function",
456
+ function: { name: item.name, arguments: item.arguments },
457
+ });
458
+ }
459
+ }
460
+ const content = textParts.length > 0 ? textParts.join("") : null;
461
+ const message = {
462
+ role: "assistant",
463
+ content,
464
+ tool_calls: messageToolCalls.length > 0 ? messageToolCalls : undefined,
465
+ };
466
+ return {
467
+ message,
468
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
469
+ };
470
+ }
471
+ async function createResponse(client, request, signal, onStreamEvent) {
472
+ const baseParams = {
473
+ model: normalizeOpenRouterModel(request.model),
474
+ input: toOpenAIInputItems(request.input),
475
+ instructions: request.instructions,
476
+ tools: undefined,
477
+ tool_choice: mapToolChoice(request.tool_choice),
478
+ previous_response_id: request.previous_response_id,
479
+ reasoning: mapReasoning(request.reasoning),
480
+ parallel_tool_calls: request.parallel_tool_calls,
481
+ max_tool_calls: request.max_tool_calls,
482
+ store: request.store,
483
+ include: request.include,
484
+ text: request.text,
485
+ stream_options: request.stream_options,
486
+ background: request.background,
487
+ truncation: request.truncation,
488
+ service_tier: request.service_tier,
489
+ top_logprobs: request.top_logprobs,
490
+ safety_identifier: request.safety_identifier,
491
+ prompt_cache_key: request.prompt_cache_key,
492
+ temperature: request.temperature,
493
+ top_p: request.top_p,
494
+ frequency_penalty: request.frequency_penalty,
495
+ presence_penalty: request.presence_penalty,
496
+ stream: request.stream,
497
+ max_output_tokens: request.max_output_tokens,
498
+ metadata: request.metadata,
499
+ };
500
+ const mappedTools = mapTools(request.tools) ?? [];
501
+ appendSyntheticTools(mappedTools, request.input);
502
+ if (mappedTools.length > 0) {
503
+ baseParams.tools = mappedTools;
504
+ }
505
+ const params = { ...(request.params ?? {}), ...stripUndefined(baseParams) };
506
+ const debugResponses = dntShim.Deno.env.get("GAMBIT_DEBUG_RESPONSES") === "1";
507
+ let responseOrStream;
508
+ try {
509
+ responseOrStream = await client.responses.create(params, signal ? { signal } : undefined);
510
+ }
511
+ catch (err) {
512
+ if (debugResponses) {
513
+ logger.error("[responses-debug] request", params);
514
+ if (err instanceof openai_1.default.APIError) {
515
+ logger.error("[responses-debug] error", err.error);
516
+ }
517
+ else {
518
+ logger.error("[responses-debug] error", err);
519
+ }
520
+ }
521
+ throw err;
522
+ }
523
+ if (request.stream &&
524
+ isAsyncIterable(responseOrStream)) {
525
+ let completed = null;
526
+ for await (const event of responseOrStream) {
527
+ if (!event || typeof event !== "object" || !("type" in event)) {
528
+ continue;
529
+ }
530
+ switch (event.type) {
531
+ case "response.created": {
532
+ const mapped = normalizeOpenAIResponse(event.response);
533
+ onStreamEvent?.({
534
+ type: "response.created",
535
+ response: mapped,
536
+ sequence_number: event
537
+ .sequence_number,
538
+ });
539
+ break;
540
+ }
541
+ case "response.output_text.delta":
542
+ onStreamEvent?.({
543
+ type: "response.output_text.delta",
544
+ output_index: event.output_index,
545
+ delta: event.delta,
546
+ item_id: event.item_id,
547
+ content_index: event.content_index,
548
+ sequence_number: event
549
+ .sequence_number,
550
+ logprobs: event.logprobs,
551
+ });
552
+ break;
553
+ case "response.output_text.done":
554
+ onStreamEvent?.({
555
+ type: "response.output_text.done",
556
+ output_index: event.output_index,
557
+ text: event.text,
558
+ item_id: event.item_id,
559
+ content_index: event.content_index,
560
+ sequence_number: event
561
+ .sequence_number,
562
+ });
563
+ break;
564
+ case "response.output_item.added": {
565
+ const item = mapOpenAIOutputItem(event.item);
566
+ if (item) {
567
+ onStreamEvent?.({
568
+ type: "response.output_item.added",
569
+ output_index: event.output_index,
570
+ item,
571
+ sequence_number: event
572
+ .sequence_number,
573
+ });
574
+ }
575
+ break;
576
+ }
577
+ case "response.output_item.done": {
578
+ const item = mapOpenAIOutputItem(event.item);
579
+ if (item) {
580
+ onStreamEvent?.({
581
+ type: "response.output_item.done",
582
+ output_index: event.output_index,
583
+ item,
584
+ sequence_number: event
585
+ .sequence_number,
586
+ });
587
+ }
588
+ break;
589
+ }
590
+ case "response.reasoning.delta":
591
+ if (typeof event.delta === "string") {
592
+ onStreamEvent?.({
593
+ type: "response.reasoning.delta",
594
+ output_index: event.output_index,
595
+ item_id: event.item_id,
596
+ content_index: event.content_index,
597
+ delta: event.delta,
598
+ sequence_number: event
599
+ .sequence_number,
600
+ obfuscation: event.obfuscation,
601
+ });
602
+ }
603
+ break;
604
+ case "response.reasoning.done":
605
+ onStreamEvent?.({
606
+ type: "response.reasoning.done",
607
+ output_index: event.output_index,
608
+ item_id: event.item_id,
609
+ content_index: event.content_index,
610
+ text: event.text,
611
+ sequence_number: event
612
+ .sequence_number,
613
+ });
614
+ break;
615
+ case "response.reasoning_summary_text.delta":
616
+ if (typeof event.delta === "string") {
617
+ onStreamEvent?.({
618
+ type: "response.reasoning_summary_text.delta",
619
+ output_index: event.output_index,
620
+ item_id: event.item_id,
621
+ summary_index: event.summary_index,
622
+ delta: event.delta,
623
+ sequence_number: event
624
+ .sequence_number,
625
+ obfuscation: event.obfuscation,
626
+ });
627
+ }
628
+ break;
629
+ case "response.reasoning_summary_text.done":
630
+ onStreamEvent?.({
631
+ type: "response.reasoning_summary_text.done",
632
+ output_index: event.output_index,
633
+ item_id: event.item_id,
634
+ summary_index: event.summary_index,
635
+ text: event.text,
636
+ sequence_number: event
637
+ .sequence_number,
638
+ });
639
+ break;
640
+ case "response.reasoning_summary_part.added":
641
+ if (event.part && typeof event.part === "object" &&
642
+ "type" in event.part &&
643
+ "text" in event.part &&
644
+ typeof event.part.text === "string") {
645
+ onStreamEvent?.({
646
+ type: "response.reasoning_summary_part.added",
647
+ output_index: event.output_index,
648
+ item_id: event.item_id,
649
+ summary_index: event.summary_index,
650
+ part: event.part,
651
+ sequence_number: event
652
+ .sequence_number,
653
+ });
654
+ }
655
+ break;
656
+ case "response.reasoning_summary_part.done":
657
+ if (event.part && typeof event.part === "object" &&
658
+ "type" in event.part &&
659
+ "text" in event.part &&
660
+ typeof event.part.text === "string") {
661
+ onStreamEvent?.({
662
+ type: "response.reasoning_summary_part.done",
663
+ output_index: event.output_index,
664
+ item_id: event.item_id,
665
+ summary_index: event.summary_index,
666
+ part: event.part,
667
+ sequence_number: event
668
+ .sequence_number,
669
+ });
670
+ }
671
+ break;
672
+ case "response.completed": {
673
+ completed = normalizeOpenAIResponse(event.response);
674
+ onStreamEvent?.({
675
+ type: "response.completed",
676
+ response: completed,
677
+ sequence_number: event
678
+ .sequence_number,
679
+ });
680
+ break;
681
+ }
682
+ case "response.failed": {
683
+ const error = mapError(event.response?.error ?? undefined);
684
+ onStreamEvent?.({
685
+ type: "response.failed",
686
+ error: error ?? {},
687
+ sequence_number: event
688
+ .sequence_number,
689
+ });
690
+ break;
691
+ }
692
+ default:
693
+ break;
694
+ }
695
+ }
696
+ if (completed)
697
+ return completed;
698
+ throw new Error("OpenRouter responses stream ended without completion.");
699
+ }
700
+ return normalizeOpenAIResponse(responseOrStream);
701
+ }
702
+ function createOpenRouterProvider(opts) {
703
+ const debugStream = dntShim.Deno.env.get("GAMBIT_DEBUG_STREAM") === "1";
704
+ const client = (opts.client ??
705
+ new openai_1.default({
706
+ apiKey: opts.apiKey,
707
+ baseURL: opts.baseURL ?? "https://openrouter.ai/api/v1",
708
+ defaultHeaders: {
709
+ "HTTP-Referer": opts.referer ?? "https://gambit.local",
710
+ "X-Title": opts.title ?? "Gambit CLI",
711
+ },
712
+ }));
713
+ return {
714
+ async responses(input) {
715
+ return await createResponse(client, input.request, input.signal, input.onStreamEvent);
716
+ },
717
+ async chat(input) {
718
+ const params = input.params ?? {};
719
+ if (opts.enableResponses) {
720
+ const response = await createResponse(client, {
721
+ model: normalizeOpenRouterModel(input.model),
722
+ input: chatMessagesToResponseItems(input.messages),
723
+ tools: input.tools,
724
+ stream: input.stream,
725
+ params,
726
+ }, input.signal, (event) => {
727
+ if (event.type === "response.output_text.delta") {
728
+ input.onStreamText?.(event.delta);
729
+ }
730
+ });
731
+ const mapped = responseItemsToChat(response.output);
732
+ return {
733
+ message: mapped.message,
734
+ finishReason: mapped.toolCalls ? "tool_calls" : "stop",
735
+ toolCalls: mapped.toolCalls,
736
+ usage: response.usage,
737
+ };
738
+ }
739
+ if (input.stream) {
740
+ if (debugStream) {
741
+ logger.log(`[stream-debug] requesting stream model=${input.model} messages=${input.messages.length} tools=${input.tools?.length ?? 0}`);
742
+ }
743
+ const stream = await client.chat.completions.create({
744
+ model: normalizeOpenRouterModel(input.model),
745
+ messages: input
746
+ .messages,
747
+ tools: input
748
+ .tools,
749
+ tool_choice: "auto",
750
+ stream: true,
751
+ ...params,
752
+ }, input.signal ? { signal: input.signal } : undefined);
753
+ let finishReason = null;
754
+ const contentParts = [];
755
+ const toolCallMap = new Map();
756
+ let chunkCount = 0;
757
+ let streamedChars = 0;
758
+ for await (const chunk of stream) {
759
+ chunkCount++;
760
+ const choice = chunk.choices[0];
761
+ const fr = choice.finish_reason;
762
+ if (fr === "stop" || fr === "tool_calls" || fr === "length" ||
763
+ fr === null) {
764
+ finishReason = fr ?? finishReason;
765
+ }
766
+ const delta = choice.delta;
767
+ if (typeof delta.content === "string") {
768
+ contentParts.push(delta.content);
769
+ input.onStreamText?.(delta.content);
770
+ streamedChars += delta.content.length;
771
+ }
772
+ else if (Array.isArray(delta.content)) {
773
+ const chunkStr = delta.content
774
+ .map((c) => (typeof c === "string" ? c : ""))
775
+ .join("");
776
+ if (chunkStr) {
777
+ contentParts.push(chunkStr);
778
+ input.onStreamText?.(chunkStr);
779
+ streamedChars += chunkStr.length;
780
+ }
781
+ }
782
+ for (const tc of delta.tool_calls ?? []) {
783
+ const idx = tc.index ?? 0;
784
+ const existing = toolCallMap.get(idx) ??
785
+ {
786
+ id: tc.id,
787
+ function: { name: tc.function?.name, arguments: "" },
788
+ };
789
+ if (tc.id)
790
+ existing.id = tc.id;
791
+ if (tc.function?.name)
792
+ existing.function.name = tc.function.name;
793
+ if (tc.function?.arguments) {
794
+ existing.function.arguments += tc.function.arguments;
795
+ }
796
+ toolCallMap.set(idx, existing);
797
+ }
798
+ }
799
+ if (debugStream) {
800
+ logger.log(`[stream-debug] completed stream chunks=${chunkCount} streamedChars=${streamedChars} finishReason=${finishReason}`);
801
+ }
802
+ const tool_calls = Array.from(toolCallMap.values()).map((tc) => ({
803
+ id: tc.id ?? crypto.randomUUID().replace(/-/g, "").slice(0, 24),
804
+ type: "function",
805
+ function: {
806
+ name: tc.function.name ?? "",
807
+ arguments: tc.function.arguments,
808
+ },
809
+ }));
810
+ const message = normalizeMessage({
811
+ role: "assistant",
812
+ content: contentParts.length ? contentParts.join("") : null,
813
+ tool_calls,
814
+ });
815
+ const toolCalls = tool_calls.length > 0
816
+ ? tool_calls.map((tc) => ({
817
+ id: tc.id,
818
+ name: tc.function.name,
819
+ args: safeJson(tc.function.arguments),
820
+ }))
821
+ : undefined;
822
+ return {
823
+ message,
824
+ finishReason: finishReason ?? "stop",
825
+ toolCalls,
826
+ };
827
+ }
828
+ const response = await client.chat.completions.create({
829
+ model: normalizeOpenRouterModel(input.model),
830
+ messages: input
831
+ .messages,
832
+ tools: input
833
+ .tools,
834
+ tool_choice: "auto",
835
+ stream: false,
836
+ ...params,
837
+ }, input.signal ? { signal: input.signal } : undefined);
838
+ const choice = response.choices[0];
839
+ const message = choice.message;
840
+ const normalizedMessage = normalizeMessage(message);
841
+ const toolCalls = message.tool_calls?.map((tc) => ({
842
+ id: tc.id,
843
+ name: tc.function.name,
844
+ args: safeJson(tc.function.arguments),
845
+ }));
846
+ return {
847
+ message: normalizedMessage,
848
+ finishReason: (choice.finish_reason ?? "stop"),
849
+ toolCalls,
850
+ usage: response.usage
851
+ ? (() => {
852
+ const usage = {
853
+ promptTokens: response.usage.prompt_tokens ?? 0,
854
+ completionTokens: response.usage.completion_tokens ?? 0,
855
+ totalTokens: response.usage.total_tokens ?? 0,
856
+ };
857
+ const details = response.usage;
858
+ const value = details.completion_tokens_details
859
+ ?.reasoning_tokens ??
860
+ details.output_tokens_details?.reasoning_tokens;
861
+ return typeof value === "number"
862
+ ? { ...usage, reasoningTokens: value }
863
+ : usage;
864
+ })()
865
+ : undefined,
866
+ };
867
+ },
868
+ };
869
+ }