@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,732 @@
1
+ import * as dntShim from "../../_dnt.shims.js";
2
+ import OpenAI from "openai";
3
+ import { GAMBIT_TOOL_CONTEXT, GAMBIT_TOOL_INIT, } from "@bolt-foundry/gambit-core";
4
+ const logger = console;
5
+ export const OLLAMA_PREFIX = "ollama/";
6
+ export const DEFAULT_OLLAMA_BASE_URL = "http://localhost:11434/v1";
7
+ function buildOllamaApiBase(baseURL) {
8
+ const url = new URL(baseURL ?? DEFAULT_OLLAMA_BASE_URL);
9
+ url.pathname = url.pathname.replace(/\/v1\/?$/, "/");
10
+ if (!url.pathname.endsWith("/")) {
11
+ url.pathname += "/";
12
+ }
13
+ return url;
14
+ }
15
+ export async function fetchOllamaTags(baseURL) {
16
+ const apiBase = buildOllamaApiBase(baseURL);
17
+ const tagsUrl = new URL("api/tags", apiBase);
18
+ const tagsResponse = await fetch(tagsUrl);
19
+ if (!tagsResponse.ok) {
20
+ throw new Error(`Failed to list Ollama models (${tagsResponse.status} ${tagsResponse.statusText}).`);
21
+ }
22
+ const tags = (await tagsResponse.json());
23
+ const models = tags.models ?? [];
24
+ return new Set(models
25
+ .map((entry) => entry.name?.trim())
26
+ .filter((name) => Boolean(name)));
27
+ }
28
+ export async function ensureOllamaModel(model, baseURL) {
29
+ const tags = await fetchOllamaTags(baseURL);
30
+ if (tags.has(model)) {
31
+ return;
32
+ }
33
+ logger.log(`Ollama model "${model}" not found; pulling from Ollama...`);
34
+ const apiBase = buildOllamaApiBase(baseURL);
35
+ const pullUrl = new URL("api/pull", apiBase);
36
+ const pullResponse = await fetch(pullUrl, {
37
+ method: "POST",
38
+ headers: { "Content-Type": "application/json" },
39
+ body: JSON.stringify({ name: model }),
40
+ });
41
+ if (!pullResponse.ok || !pullResponse.body) {
42
+ throw new Error(`Failed to pull Ollama model "${model}" (${pullResponse.status} ${pullResponse.statusText}).`);
43
+ }
44
+ const decoder = new TextDecoder();
45
+ const reader = pullResponse.body.getReader();
46
+ let buffer = "";
47
+ while (true) {
48
+ const { value, done } = await reader.read();
49
+ if (done)
50
+ break;
51
+ buffer += decoder.decode(value, { stream: true });
52
+ const lines = buffer.split("\n");
53
+ buffer = lines.pop() ?? "";
54
+ for (const line of lines) {
55
+ if (!line.trim())
56
+ continue;
57
+ try {
58
+ const event = JSON.parse(line);
59
+ if (event.error) {
60
+ throw new Error(event.error);
61
+ }
62
+ if (event.status) {
63
+ logger.log(`[ollama] ${event.status}`);
64
+ }
65
+ }
66
+ catch (err) {
67
+ throw new Error(`Failed to parse Ollama pull response: ${err.message}`);
68
+ }
69
+ }
70
+ }
71
+ }
72
+ function safeJson(input) {
73
+ try {
74
+ const parsed = JSON.parse(input);
75
+ if (parsed && typeof parsed === "object") {
76
+ return parsed;
77
+ }
78
+ }
79
+ catch {
80
+ // fall through
81
+ }
82
+ return {};
83
+ }
84
+ function isAsyncIterable(value) {
85
+ return Boolean(value &&
86
+ typeof value === "object" &&
87
+ Symbol.asyncIterator in value);
88
+ }
89
+ function mapUsage(usage) {
90
+ if (!usage)
91
+ return undefined;
92
+ return {
93
+ promptTokens: usage.input_tokens ?? 0,
94
+ completionTokens: usage.output_tokens ?? 0,
95
+ totalTokens: usage.total_tokens ?? 0,
96
+ };
97
+ }
98
+ function mapStatus(status) {
99
+ if (!status)
100
+ return undefined;
101
+ if (status === "completed")
102
+ return "completed";
103
+ if (status === "in_progress" || status === "queued")
104
+ return "in_progress";
105
+ return "failed";
106
+ }
107
+ function mapReasoning(reasoning) {
108
+ if (!reasoning)
109
+ return undefined;
110
+ const out = {};
111
+ if (reasoning.effort !== undefined)
112
+ out.effort = reasoning.effort;
113
+ if (reasoning.summary !== undefined)
114
+ out.summary = reasoning.summary;
115
+ return Object.keys(out).length > 0 ? out : undefined;
116
+ }
117
+ function stripUndefined(input) {
118
+ const out = { ...input };
119
+ for (const [key, value] of Object.entries(out)) {
120
+ if (value === undefined) {
121
+ delete out[key];
122
+ }
123
+ }
124
+ return out;
125
+ }
126
+ function mapError(error) {
127
+ if (!error)
128
+ return undefined;
129
+ return { code: error.code, message: error.message };
130
+ }
131
+ function mapTools(tools) {
132
+ if (!tools || tools.length === 0)
133
+ return undefined;
134
+ return tools.map((tool) => ({
135
+ type: "function",
136
+ name: tool.function.name,
137
+ description: tool.function.description ?? null,
138
+ parameters: normalizeToolParameters(tool.function.parameters),
139
+ strict: false,
140
+ }));
141
+ }
142
+ function normalizeToolParameters(parameters) {
143
+ const normalized = structuredClone(parameters ?? {});
144
+ if (normalized.type !== "object") {
145
+ return normalized;
146
+ }
147
+ if (normalized.properties === undefined) {
148
+ normalized.properties = {};
149
+ }
150
+ const props = normalized.properties;
151
+ if (props && typeof props === "object" && !Array.isArray(props)) {
152
+ const requiredKeys = Array.isArray(normalized.required)
153
+ ? normalized.required.filter((key) => typeof key === "string" && key in props)
154
+ : [];
155
+ for (const [key, value] of Object.entries(props)) {
156
+ if (!value || typeof value !== "object" || Array.isArray(value))
157
+ continue;
158
+ if (!("type" in value))
159
+ continue;
160
+ if (value.type === "object" && value.additionalProperties !== false) {
161
+ props[key] = {
162
+ ...value,
163
+ additionalProperties: false,
164
+ };
165
+ }
166
+ }
167
+ if (requiredKeys.length > 0) {
168
+ normalized.required = requiredKeys;
169
+ }
170
+ }
171
+ const additional = normalized.additionalProperties;
172
+ if (additional !== false) {
173
+ normalized.additionalProperties = false;
174
+ }
175
+ return normalized;
176
+ }
177
+ function appendSyntheticTools(tools, input) {
178
+ const needed = new Set();
179
+ for (const item of input) {
180
+ if (item.type !== "function_call")
181
+ continue;
182
+ if (item.name === GAMBIT_TOOL_CONTEXT || item.name === GAMBIT_TOOL_INIT) {
183
+ needed.add(item.name);
184
+ }
185
+ }
186
+ for (const name of needed) {
187
+ if (tools.some((tool) => tool.name === name))
188
+ continue;
189
+ tools.push({
190
+ type: "function",
191
+ name,
192
+ description: "Synthetic Gambit context payload.",
193
+ parameters: {
194
+ type: "object",
195
+ properties: {},
196
+ additionalProperties: false,
197
+ required: [],
198
+ },
199
+ strict: false,
200
+ });
201
+ }
202
+ }
203
+ function mapToolChoice(toolChoice) {
204
+ if (!toolChoice)
205
+ return undefined;
206
+ if (toolChoice === "none" || toolChoice === "auto" ||
207
+ toolChoice === "required") {
208
+ return toolChoice;
209
+ }
210
+ if (toolChoice.type === "allowed_tools") {
211
+ return {
212
+ type: "allowed_tools",
213
+ tools: toolChoice.tools,
214
+ mode: toolChoice.mode ?? "auto",
215
+ };
216
+ }
217
+ return { type: "function", name: toolChoice.function.name };
218
+ }
219
+ function mapResponseContentPart(part) {
220
+ if (!part || typeof part !== "object")
221
+ return null;
222
+ if (typeof part.text !== "string")
223
+ return null;
224
+ if (part.type === "output_text") {
225
+ return { type: "output_text", text: part.text };
226
+ }
227
+ if (part.type === "summary_text") {
228
+ return { type: "summary_text", text: part.text };
229
+ }
230
+ if (part.type === "reasoning_text") {
231
+ return { type: "reasoning_text", text: part.text };
232
+ }
233
+ if (part.type === "input_text") {
234
+ return { type: "input_text", text: part.text };
235
+ }
236
+ return null;
237
+ }
238
+ function mapOpenAIOutputItem(item) {
239
+ const itemType = item.type;
240
+ if (itemType === "message") {
241
+ const message = item;
242
+ const content = (message.content ?? [])
243
+ .map((part) => mapResponseContentPart(part))
244
+ .filter((part) => Boolean(part));
245
+ if (content.length === 0)
246
+ return null;
247
+ return {
248
+ type: "message",
249
+ role: "assistant",
250
+ content,
251
+ id: message.id,
252
+ };
253
+ }
254
+ if (itemType === "function_call") {
255
+ const call = item;
256
+ return {
257
+ type: "function_call",
258
+ call_id: call.call_id,
259
+ name: call.name,
260
+ arguments: call.arguments,
261
+ id: call.id,
262
+ };
263
+ }
264
+ if (itemType === "reasoning") {
265
+ const reasoning = item;
266
+ const content = (reasoning.content ?? [])
267
+ .map((part) => mapResponseContentPart(part))
268
+ .filter((part) => Boolean(part));
269
+ const summary = (reasoning.summary ?? [])
270
+ .map((part) => mapResponseContentPart(part))
271
+ .filter((part) => Boolean(part));
272
+ return {
273
+ type: "reasoning",
274
+ id: reasoning.id,
275
+ content: content.length > 0 ? content : undefined,
276
+ summary,
277
+ encrypted_content: reasoning.encrypted_content,
278
+ };
279
+ }
280
+ return null;
281
+ }
282
+ function normalizeOpenAIResponse(response) {
283
+ const outputItems = (response.output ?? [])
284
+ .map(mapOpenAIOutputItem)
285
+ .filter((item) => Boolean(item));
286
+ return {
287
+ id: response.id,
288
+ object: "response",
289
+ model: response.model,
290
+ created_at: response.created_at,
291
+ created: response.created_at,
292
+ completed_at: response.completed_at ??
293
+ null,
294
+ previous_response_id: response.previous_response_id ?? null,
295
+ instructions: response.instructions ?? null,
296
+ reasoning: response
297
+ .reasoning ?? null,
298
+ status: mapStatus(response.status ?? undefined),
299
+ output: outputItems,
300
+ usage: mapUsage(response.usage),
301
+ error: mapError(response.error) ?? null,
302
+ metadata: response.metadata,
303
+ max_output_tokens: response.max_output_tokens ?? null,
304
+ max_tool_calls: response.max_tool_calls ?? null,
305
+ parallel_tool_calls: response.parallel_tool_calls,
306
+ store: response.store,
307
+ };
308
+ }
309
+ function toOpenAIInputItems(items) {
310
+ const mapped = [];
311
+ for (const item of items) {
312
+ if (item.type === "message") {
313
+ const isAssistant = item.role === "assistant";
314
+ const content = item.content
315
+ .map((part) => {
316
+ if (part.type === "output_text") {
317
+ return {
318
+ type: "output_text",
319
+ text: part.text,
320
+ };
321
+ }
322
+ if (part.type === "input_text") {
323
+ return {
324
+ type: isAssistant ? "output_text" : "input_text",
325
+ text: part.text,
326
+ };
327
+ }
328
+ if (part.type === "summary_text") {
329
+ return {
330
+ type: "summary_text",
331
+ text: part.text,
332
+ };
333
+ }
334
+ if (part.type === "reasoning_text") {
335
+ return {
336
+ type: "reasoning_text",
337
+ text: part.text,
338
+ };
339
+ }
340
+ return null;
341
+ })
342
+ .filter((part) => Boolean(part));
343
+ if (content.length === 0)
344
+ continue;
345
+ mapped.push({
346
+ type: "message",
347
+ role: item.role,
348
+ content,
349
+ id: item.id,
350
+ });
351
+ continue;
352
+ }
353
+ if (item.type === "function_call") {
354
+ mapped.push({
355
+ type: "function_call",
356
+ call_id: item.call_id,
357
+ name: item.name,
358
+ arguments: item.arguments,
359
+ id: item.id,
360
+ });
361
+ continue;
362
+ }
363
+ if (item.type === "function_call_output") {
364
+ mapped.push({
365
+ type: "function_call_output",
366
+ call_id: item.call_id,
367
+ output: item.output,
368
+ id: item.id,
369
+ });
370
+ continue;
371
+ }
372
+ if (item.type === "reasoning") {
373
+ mapped.push({
374
+ type: "reasoning",
375
+ id: item.id,
376
+ content: (item.content ?? []).map((part) => ({
377
+ type: part.type,
378
+ text: part.text,
379
+ })),
380
+ summary: item.summary.map((part) => ({
381
+ type: part.type,
382
+ text: part.text,
383
+ })),
384
+ encrypted_content: item.encrypted_content ?? null,
385
+ });
386
+ }
387
+ }
388
+ return mapped;
389
+ }
390
+ function chatMessagesToResponseItems(messages) {
391
+ const items = [];
392
+ for (const message of messages) {
393
+ if (message.role === "tool") {
394
+ if (message.tool_call_id &&
395
+ typeof message.content === "string") {
396
+ items.push({
397
+ type: "function_call_output",
398
+ call_id: message.tool_call_id,
399
+ output: message.content,
400
+ });
401
+ }
402
+ continue;
403
+ }
404
+ if (message.role === "system" || message.role === "user" ||
405
+ message.role === "assistant") {
406
+ const content = [];
407
+ if (typeof message.content === "string" && message.content.length > 0) {
408
+ content.push({
409
+ type: message.role === "assistant" ? "output_text" : "input_text",
410
+ text: message.content,
411
+ });
412
+ }
413
+ if (content.length > 0) {
414
+ items.push({
415
+ type: "message",
416
+ role: message.role,
417
+ content,
418
+ });
419
+ }
420
+ }
421
+ if (message.role === "assistant" && message.tool_calls) {
422
+ for (const call of message.tool_calls) {
423
+ items.push({
424
+ type: "function_call",
425
+ call_id: call.id,
426
+ name: call.function.name,
427
+ arguments: call.function.arguments,
428
+ });
429
+ }
430
+ }
431
+ }
432
+ return items;
433
+ }
434
+ function responseItemsToChat(items) {
435
+ const textParts = [];
436
+ const toolCalls = [];
437
+ const messageToolCalls = [];
438
+ for (const item of items) {
439
+ if (item.type === "message" && item.role === "assistant") {
440
+ for (const part of item.content) {
441
+ if (part.type === "output_text") {
442
+ textParts.push(part.text);
443
+ }
444
+ }
445
+ }
446
+ if (item.type === "function_call") {
447
+ toolCalls.push({
448
+ id: item.call_id,
449
+ name: item.name,
450
+ args: safeJson(item.arguments),
451
+ });
452
+ messageToolCalls.push({
453
+ id: item.call_id,
454
+ type: "function",
455
+ function: { name: item.name, arguments: item.arguments },
456
+ });
457
+ }
458
+ }
459
+ const content = textParts.length > 0 ? textParts.join("") : null;
460
+ const message = {
461
+ role: "assistant",
462
+ content,
463
+ tool_calls: messageToolCalls.length > 0 ? messageToolCalls : undefined,
464
+ };
465
+ return {
466
+ message,
467
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
468
+ };
469
+ }
470
+ async function createResponse(client, request, signal, onStreamEvent) {
471
+ const baseParams = {
472
+ model: request.model,
473
+ input: toOpenAIInputItems(request.input),
474
+ instructions: request.instructions,
475
+ tools: undefined,
476
+ tool_choice: mapToolChoice(request.tool_choice),
477
+ previous_response_id: request.previous_response_id,
478
+ reasoning: mapReasoning(request.reasoning),
479
+ parallel_tool_calls: request.parallel_tool_calls,
480
+ max_tool_calls: request.max_tool_calls,
481
+ store: request.store,
482
+ include: request.include,
483
+ text: request.text,
484
+ stream_options: request.stream_options,
485
+ background: request.background,
486
+ truncation: request.truncation,
487
+ service_tier: request.service_tier,
488
+ top_logprobs: request.top_logprobs,
489
+ safety_identifier: request.safety_identifier,
490
+ prompt_cache_key: request.prompt_cache_key,
491
+ temperature: request.temperature,
492
+ top_p: request.top_p,
493
+ frequency_penalty: request.frequency_penalty,
494
+ presence_penalty: request.presence_penalty,
495
+ stream: request.stream,
496
+ max_output_tokens: request.max_output_tokens,
497
+ metadata: request.metadata,
498
+ };
499
+ const mappedTools = mapTools(request.tools) ?? [];
500
+ appendSyntheticTools(mappedTools, request.input);
501
+ if (mappedTools.length > 0) {
502
+ baseParams.tools = mappedTools;
503
+ }
504
+ const params = { ...(request.params ?? {}), ...stripUndefined(baseParams) };
505
+ const debugResponses = dntShim.Deno.env.get("GAMBIT_DEBUG_RESPONSES") === "1";
506
+ let responseOrStream;
507
+ try {
508
+ responseOrStream = await client.responses.create(params, signal ? { signal } : undefined);
509
+ }
510
+ catch (err) {
511
+ if (debugResponses) {
512
+ logger.error("[responses-debug] request", params);
513
+ if (err instanceof OpenAI.APIError) {
514
+ logger.error("[responses-debug] error", err.error);
515
+ }
516
+ else {
517
+ logger.error("[responses-debug] error", err);
518
+ }
519
+ }
520
+ throw err;
521
+ }
522
+ if (request.stream &&
523
+ isAsyncIterable(responseOrStream)) {
524
+ let completed = null;
525
+ for await (const event of responseOrStream) {
526
+ if (!event || typeof event !== "object" || !("type" in event)) {
527
+ continue;
528
+ }
529
+ switch (event.type) {
530
+ case "response.created": {
531
+ const mapped = normalizeOpenAIResponse(event.response);
532
+ onStreamEvent?.({
533
+ type: "response.created",
534
+ response: mapped,
535
+ sequence_number: event
536
+ .sequence_number,
537
+ });
538
+ break;
539
+ }
540
+ case "response.output_text.delta":
541
+ onStreamEvent?.({
542
+ type: "response.output_text.delta",
543
+ output_index: event.output_index,
544
+ delta: event.delta,
545
+ item_id: event.item_id,
546
+ content_index: event.content_index,
547
+ sequence_number: event
548
+ .sequence_number,
549
+ logprobs: event.logprobs,
550
+ });
551
+ break;
552
+ case "response.output_text.done":
553
+ onStreamEvent?.({
554
+ type: "response.output_text.done",
555
+ output_index: event.output_index,
556
+ text: event.text,
557
+ item_id: event.item_id,
558
+ content_index: event.content_index,
559
+ sequence_number: event
560
+ .sequence_number,
561
+ });
562
+ break;
563
+ case "response.output_item.added": {
564
+ const item = mapOpenAIOutputItem(event.item);
565
+ if (item) {
566
+ onStreamEvent?.({
567
+ type: "response.output_item.added",
568
+ output_index: event.output_index,
569
+ item,
570
+ sequence_number: event
571
+ .sequence_number,
572
+ });
573
+ }
574
+ break;
575
+ }
576
+ case "response.output_item.done": {
577
+ const item = mapOpenAIOutputItem(event.item);
578
+ if (item) {
579
+ onStreamEvent?.({
580
+ type: "response.output_item.done",
581
+ output_index: event.output_index,
582
+ item,
583
+ sequence_number: event
584
+ .sequence_number,
585
+ });
586
+ }
587
+ break;
588
+ }
589
+ case "response.reasoning.delta":
590
+ if (typeof event.delta === "string") {
591
+ onStreamEvent?.({
592
+ type: "response.reasoning.delta",
593
+ output_index: event.output_index,
594
+ item_id: event.item_id,
595
+ content_index: event.content_index,
596
+ delta: event.delta,
597
+ sequence_number: event
598
+ .sequence_number,
599
+ obfuscation: event.obfuscation,
600
+ });
601
+ }
602
+ break;
603
+ case "response.reasoning.done":
604
+ onStreamEvent?.({
605
+ type: "response.reasoning.done",
606
+ output_index: event.output_index,
607
+ item_id: event.item_id,
608
+ content_index: event.content_index,
609
+ text: event.text,
610
+ sequence_number: event
611
+ .sequence_number,
612
+ });
613
+ break;
614
+ case "response.reasoning_summary_text.delta":
615
+ if (typeof event.delta === "string") {
616
+ onStreamEvent?.({
617
+ type: "response.reasoning_summary_text.delta",
618
+ output_index: event.output_index,
619
+ item_id: event.item_id,
620
+ summary_index: event.summary_index,
621
+ delta: event.delta,
622
+ sequence_number: event
623
+ .sequence_number,
624
+ obfuscation: event.obfuscation,
625
+ });
626
+ }
627
+ break;
628
+ case "response.reasoning_summary_text.done":
629
+ onStreamEvent?.({
630
+ type: "response.reasoning_summary_text.done",
631
+ output_index: event.output_index,
632
+ item_id: event.item_id,
633
+ summary_index: event.summary_index,
634
+ text: event.text,
635
+ sequence_number: event
636
+ .sequence_number,
637
+ });
638
+ break;
639
+ case "response.reasoning_summary_part.added":
640
+ if (event.part && typeof event.part === "object" &&
641
+ "type" in event.part &&
642
+ "text" in event.part &&
643
+ typeof event.part.text === "string") {
644
+ onStreamEvent?.({
645
+ type: "response.reasoning_summary_part.added",
646
+ output_index: event.output_index,
647
+ item_id: event.item_id,
648
+ summary_index: event.summary_index,
649
+ part: event.part,
650
+ sequence_number: event
651
+ .sequence_number,
652
+ });
653
+ }
654
+ break;
655
+ case "response.reasoning_summary_part.done":
656
+ if (event.part && typeof event.part === "object" &&
657
+ "type" in event.part &&
658
+ "text" in event.part &&
659
+ typeof event.part.text === "string") {
660
+ onStreamEvent?.({
661
+ type: "response.reasoning_summary_part.done",
662
+ output_index: event.output_index,
663
+ item_id: event.item_id,
664
+ summary_index: event.summary_index,
665
+ part: event.part,
666
+ sequence_number: event
667
+ .sequence_number,
668
+ });
669
+ }
670
+ break;
671
+ case "response.completed": {
672
+ completed = normalizeOpenAIResponse(event.response);
673
+ onStreamEvent?.({
674
+ type: "response.completed",
675
+ response: completed,
676
+ sequence_number: event
677
+ .sequence_number,
678
+ });
679
+ break;
680
+ }
681
+ case "response.failed": {
682
+ const error = mapError(event.response?.error ?? undefined);
683
+ onStreamEvent?.({
684
+ type: "response.failed",
685
+ error: error ?? {},
686
+ sequence_number: event
687
+ .sequence_number,
688
+ });
689
+ break;
690
+ }
691
+ default:
692
+ break;
693
+ }
694
+ }
695
+ if (completed)
696
+ return completed;
697
+ throw new Error("Ollama responses stream ended without completion.");
698
+ }
699
+ return normalizeOpenAIResponse(responseOrStream);
700
+ }
701
+ export function createOllamaProvider(opts) {
702
+ const client = (opts.client ??
703
+ new OpenAI({
704
+ apiKey: opts.apiKey ?? "ollama",
705
+ baseURL: opts.baseURL ?? "http://localhost:11434/v1",
706
+ }));
707
+ return {
708
+ async responses(input) {
709
+ return await createResponse(client, input.request, input.signal, input.onStreamEvent);
710
+ },
711
+ async chat(input) {
712
+ const response = await createResponse(client, {
713
+ model: input.model,
714
+ input: chatMessagesToResponseItems(input.messages),
715
+ tools: input.tools,
716
+ stream: input.stream,
717
+ params: input.params ?? {},
718
+ }, input.signal, (event) => {
719
+ if (event.type === "response.output_text.delta") {
720
+ input.onStreamText?.(event.delta);
721
+ }
722
+ });
723
+ const mapped = responseItemsToChat(response.output);
724
+ return {
725
+ message: mapped.message,
726
+ finishReason: mapped.toolCalls ? "tool_calls" : "stop",
727
+ toolCalls: mapped.toolCalls,
728
+ usage: response.usage,
729
+ };
730
+ },
731
+ };
732
+ }