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

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