@fgv/ts-extras 5.1.0-5 → 5.1.0-50

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 (488) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +90 -0
  3. package/dist/index.browser.js +6 -2
  4. package/dist/index.browser.js.map +1 -0
  5. package/dist/index.js +2 -1
  6. package/dist/index.js.map +1 -0
  7. package/dist/packlets/ai-assist/chatRequestBuilders.js +282 -0
  8. package/dist/packlets/ai-assist/chatRequestBuilders.js.map +1 -0
  9. package/dist/packlets/ai-assist/{apiClient.js → completionClient.js} +165 -214
  10. package/dist/packlets/ai-assist/completionClient.js.map +1 -0
  11. package/dist/packlets/ai-assist/converters.js +47 -3
  12. package/dist/packlets/ai-assist/converters.js.map +1 -0
  13. package/dist/packlets/ai-assist/embeddingClient.js +345 -0
  14. package/dist/packlets/ai-assist/embeddingClient.js.map +1 -0
  15. package/dist/packlets/ai-assist/endpoint.js +107 -0
  16. package/dist/packlets/ai-assist/endpoint.js.map +1 -0
  17. package/dist/packlets/ai-assist/http.js +104 -0
  18. package/dist/packlets/ai-assist/http.js.map +1 -0
  19. package/dist/packlets/ai-assist/imageGenerationClient.js +454 -0
  20. package/dist/packlets/ai-assist/imageGenerationClient.js.map +1 -0
  21. package/dist/packlets/ai-assist/imageOptionsResolver.js +193 -0
  22. package/dist/packlets/ai-assist/imageOptionsResolver.js.map +1 -0
  23. package/dist/packlets/ai-assist/index.js +12 -4
  24. package/dist/packlets/ai-assist/index.js.map +1 -0
  25. package/dist/packlets/ai-assist/jsonCompletion.js +93 -0
  26. package/dist/packlets/ai-assist/jsonCompletion.js.map +1 -0
  27. package/dist/packlets/ai-assist/jsonResponse.js +423 -0
  28. package/dist/packlets/ai-assist/jsonResponse.js.map +1 -0
  29. package/dist/packlets/ai-assist/listModelsClient.js +294 -0
  30. package/dist/packlets/ai-assist/listModelsClient.js.map +1 -0
  31. package/dist/packlets/ai-assist/model.js +301 -9
  32. package/dist/packlets/ai-assist/model.js.map +1 -0
  33. package/dist/packlets/ai-assist/registry.js +376 -12
  34. package/dist/packlets/ai-assist/registry.js.map +1 -0
  35. package/dist/packlets/ai-assist/sseParser.js +123 -0
  36. package/dist/packlets/ai-assist/sseParser.js.map +1 -0
  37. package/dist/packlets/ai-assist/streamingAdapters/anthropic.js +376 -0
  38. package/dist/packlets/ai-assist/streamingAdapters/anthropic.js.map +1 -0
  39. package/dist/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.js +687 -0
  40. package/dist/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.js.map +1 -0
  41. package/dist/packlets/ai-assist/streamingAdapters/common.js +187 -0
  42. package/dist/packlets/ai-assist/streamingAdapters/common.js.map +1 -0
  43. package/dist/packlets/ai-assist/streamingAdapters/gemini.js +208 -0
  44. package/dist/packlets/ai-assist/streamingAdapters/gemini.js.map +1 -0
  45. package/dist/packlets/ai-assist/streamingAdapters/openaiChat.js +175 -0
  46. package/dist/packlets/ai-assist/streamingAdapters/openaiChat.js.map +1 -0
  47. package/dist/packlets/ai-assist/streamingAdapters/openaiResponses.js +390 -0
  48. package/dist/packlets/ai-assist/streamingAdapters/openaiResponses.js.map +1 -0
  49. package/dist/packlets/ai-assist/streamingAdapters/proxy.js +178 -0
  50. package/dist/packlets/ai-assist/streamingAdapters/proxy.js.map +1 -0
  51. package/dist/packlets/ai-assist/streamingClient.js +140 -0
  52. package/dist/packlets/ai-assist/streamingClient.js.map +1 -0
  53. package/dist/packlets/ai-assist/thinkingOptionsResolver.js +288 -0
  54. package/dist/packlets/ai-assist/thinkingOptionsResolver.js.map +1 -0
  55. package/dist/packlets/ai-assist/toolFormats.js +106 -10
  56. package/dist/packlets/ai-assist/toolFormats.js.map +1 -0
  57. package/dist/packlets/conversion/converters.js +35 -1
  58. package/dist/packlets/conversion/converters.js.map +1 -0
  59. package/dist/packlets/conversion/index.js.map +1 -0
  60. package/dist/packlets/crypto-utils/constants.js.map +1 -0
  61. package/dist/packlets/crypto-utils/converters.js +42 -4
  62. package/dist/packlets/crypto-utils/converters.js.map +1 -0
  63. package/dist/packlets/crypto-utils/directEncryptionProvider.js.map +1 -0
  64. package/dist/packlets/crypto-utils/encryptedFile.js +37 -0
  65. package/dist/packlets/crypto-utils/encryptedFile.js.map +1 -0
  66. package/dist/packlets/crypto-utils/hpkeProvider.js +355 -0
  67. package/dist/packlets/crypto-utils/hpkeProvider.js.map +1 -0
  68. package/dist/packlets/crypto-utils/index.browser.js +13 -2
  69. package/dist/packlets/crypto-utils/index.browser.js.map +1 -0
  70. package/dist/packlets/crypto-utils/index.js +9 -1
  71. package/dist/packlets/crypto-utils/index.js.map +1 -0
  72. package/dist/packlets/crypto-utils/keyPairAlgorithmParams.js +71 -0
  73. package/dist/packlets/crypto-utils/keyPairAlgorithmParams.js.map +1 -0
  74. package/dist/packlets/crypto-utils/keystore/converters.js +111 -16
  75. package/dist/packlets/crypto-utils/keystore/converters.js.map +1 -0
  76. package/dist/packlets/crypto-utils/keystore/encryptedFilePrivateKeyStorage.js +287 -0
  77. package/dist/packlets/crypto-utils/keystore/encryptedFilePrivateKeyStorage.js.map +1 -0
  78. package/dist/packlets/crypto-utils/keystore/index.browser.js +36 -0
  79. package/dist/packlets/crypto-utils/keystore/index.browser.js.map +1 -0
  80. package/dist/packlets/crypto-utils/keystore/index.js +3 -0
  81. package/dist/packlets/crypto-utils/keystore/index.js.map +1 -0
  82. package/dist/packlets/crypto-utils/keystore/keyStore.js +872 -119
  83. package/dist/packlets/crypto-utils/keystore/keyStore.js.map +1 -0
  84. package/dist/packlets/crypto-utils/keystore/model.js +35 -4
  85. package/dist/packlets/crypto-utils/keystore/model.js.map +1 -0
  86. package/dist/packlets/crypto-utils/keystore/privateKeyStorage.js +21 -0
  87. package/dist/packlets/crypto-utils/keystore/privateKeyStorage.js.map +1 -0
  88. package/dist/packlets/crypto-utils/model.js +32 -0
  89. package/dist/packlets/crypto-utils/model.js.map +1 -0
  90. package/dist/packlets/crypto-utils/nodeCryptoProvider.js +347 -1
  91. package/dist/packlets/crypto-utils/nodeCryptoProvider.js.map +1 -0
  92. package/dist/packlets/crypto-utils/seedDerivedKeyPair.js +120 -0
  93. package/dist/packlets/crypto-utils/seedDerivedKeyPair.js.map +1 -0
  94. package/dist/packlets/crypto-utils/spkiHelpers.js +284 -0
  95. package/dist/packlets/crypto-utils/spkiHelpers.js.map +1 -0
  96. package/dist/packlets/csv/csvFileHelpers.js +0 -14
  97. package/dist/packlets/csv/csvFileHelpers.js.map +1 -0
  98. package/dist/packlets/csv/csvHelpers.js +14 -0
  99. package/dist/packlets/csv/csvHelpers.js.map +1 -0
  100. package/dist/packlets/csv/index.browser.js +1 -3
  101. package/dist/packlets/csv/index.browser.js.map +1 -0
  102. package/dist/packlets/csv/index.js.map +1 -0
  103. package/dist/packlets/experimental/extendedArray.js.map +1 -0
  104. package/dist/packlets/experimental/formatter.js.map +1 -0
  105. package/dist/packlets/experimental/index.js.map +1 -0
  106. package/dist/packlets/experimental/rangeOf.js.map +1 -0
  107. package/dist/packlets/hash/index.browser.js.map +1 -0
  108. package/dist/packlets/hash/index.js.map +1 -0
  109. package/dist/packlets/hash/index.node.js.map +1 -0
  110. package/dist/packlets/hash/md5Normalizer.browser.js.map +1 -0
  111. package/dist/packlets/hash/md5Normalizer.js.map +1 -0
  112. package/dist/packlets/mustache/index.js.map +1 -0
  113. package/dist/packlets/mustache/interfaces.js.map +1 -0
  114. package/dist/packlets/mustache/mustacheTemplate.js +42 -4
  115. package/dist/packlets/mustache/mustacheTemplate.js.map +1 -0
  116. package/dist/packlets/record-jar/index.browser.js +1 -3
  117. package/dist/packlets/record-jar/index.browser.js.map +1 -0
  118. package/dist/packlets/record-jar/index.js.map +1 -0
  119. package/dist/packlets/record-jar/recordJarFileHelpers.js +0 -18
  120. package/dist/packlets/record-jar/recordJarFileHelpers.js.map +1 -0
  121. package/dist/packlets/record-jar/recordJarHelpers.js +18 -0
  122. package/dist/packlets/record-jar/recordJarHelpers.js.map +1 -0
  123. package/dist/packlets/safer-fetch/addressClassification.js +438 -0
  124. package/dist/packlets/safer-fetch/addressClassification.js.map +1 -0
  125. package/dist/packlets/safer-fetch/addressPolicy.js +119 -0
  126. package/dist/packlets/safer-fetch/addressPolicy.js.map +1 -0
  127. package/dist/packlets/safer-fetch/contentType.js +120 -0
  128. package/dist/packlets/safer-fetch/contentType.js.map +1 -0
  129. package/dist/packlets/safer-fetch/deadline.js +254 -0
  130. package/dist/packlets/safer-fetch/deadline.js.map +1 -0
  131. package/dist/packlets/safer-fetch/defaults.js +131 -0
  132. package/dist/packlets/safer-fetch/defaults.js.map +1 -0
  133. package/dist/packlets/safer-fetch/failureReason.js +21 -0
  134. package/dist/packlets/safer-fetch/failureReason.js.map +1 -0
  135. package/dist/packlets/safer-fetch/guards.js +148 -0
  136. package/dist/packlets/safer-fetch/guards.js.map +1 -0
  137. package/dist/packlets/safer-fetch/index.browser.js +58 -0
  138. package/dist/packlets/safer-fetch/index.browser.js.map +1 -0
  139. package/dist/packlets/safer-fetch/index.js +52 -0
  140. package/dist/packlets/safer-fetch/index.js.map +1 -0
  141. package/dist/packlets/safer-fetch/model.js +21 -0
  142. package/dist/packlets/safer-fetch/model.js.map +1 -0
  143. package/dist/packlets/safer-fetch/nodeAddressGuard.js +191 -0
  144. package/dist/packlets/safer-fetch/nodeAddressGuard.js.map +1 -0
  145. package/dist/packlets/safer-fetch/redirect.js +93 -0
  146. package/dist/packlets/safer-fetch/redirect.js.map +1 -0
  147. package/dist/packlets/safer-fetch/retry.js +188 -0
  148. package/dist/packlets/safer-fetch/retry.js.map +1 -0
  149. package/dist/packlets/safer-fetch/saferFetch.js +755 -0
  150. package/dist/packlets/safer-fetch/saferFetch.js.map +1 -0
  151. package/dist/packlets/safer-fetch/transport.js +50 -0
  152. package/dist/packlets/safer-fetch/transport.js.map +1 -0
  153. package/dist/packlets/yaml/converters.js.map +1 -0
  154. package/dist/packlets/yaml/index.js +1 -0
  155. package/dist/packlets/yaml/index.js.map +1 -0
  156. package/dist/packlets/yaml/serializers.js +48 -0
  157. package/dist/packlets/yaml/serializers.js.map +1 -0
  158. package/dist/packlets/zip-file-tree/index.js.map +1 -0
  159. package/dist/packlets/zip-file-tree/zipFileTreeAccessors.js +99 -9
  160. package/dist/packlets/zip-file-tree/zipFileTreeAccessors.js.map +1 -0
  161. package/dist/packlets/zip-file-tree/zipFileTreeWriter.js +16 -1
  162. package/dist/packlets/zip-file-tree/zipFileTreeWriter.js.map +1 -0
  163. package/dist/ts-extras.d.ts +6648 -553
  164. package/dist/tsdoc-metadata.json +1 -1
  165. package/lib/index.browser.d.ts +5 -2
  166. package/lib/index.browser.d.ts.map +1 -0
  167. package/lib/index.browser.js +11 -3
  168. package/lib/index.browser.js.map +1 -0
  169. package/lib/index.d.ts +2 -1
  170. package/lib/index.d.ts.map +1 -0
  171. package/lib/index.js +3 -1
  172. package/lib/index.js.map +1 -0
  173. package/lib/packlets/ai-assist/chatRequestBuilders.d.ts +149 -0
  174. package/lib/packlets/ai-assist/chatRequestBuilders.d.ts.map +1 -0
  175. package/lib/packlets/ai-assist/chatRequestBuilders.js +293 -0
  176. package/lib/packlets/ai-assist/chatRequestBuilders.js.map +1 -0
  177. package/lib/packlets/ai-assist/completionClient.d.ts +74 -0
  178. package/lib/packlets/ai-assist/completionClient.d.ts.map +1 -0
  179. package/lib/packlets/ai-assist/{apiClient.js → completionClient.js} +164 -213
  180. package/lib/packlets/ai-assist/completionClient.js.map +1 -0
  181. package/lib/packlets/ai-assist/converters.d.ts +15 -1
  182. package/lib/packlets/ai-assist/converters.d.ts.map +1 -0
  183. package/lib/packlets/ai-assist/converters.js +47 -3
  184. package/lib/packlets/ai-assist/converters.js.map +1 -0
  185. package/lib/packlets/ai-assist/embeddingClient.d.ts +69 -0
  186. package/lib/packlets/ai-assist/embeddingClient.d.ts.map +1 -0
  187. package/lib/packlets/ai-assist/embeddingClient.js +349 -0
  188. package/lib/packlets/ai-assist/embeddingClient.js.map +1 -0
  189. package/lib/packlets/ai-assist/endpoint.d.ts +49 -0
  190. package/lib/packlets/ai-assist/endpoint.d.ts.map +1 -0
  191. package/lib/packlets/ai-assist/endpoint.js +113 -0
  192. package/lib/packlets/ai-assist/endpoint.js.map +1 -0
  193. package/lib/packlets/ai-assist/http.d.ts +34 -0
  194. package/lib/packlets/ai-assist/http.d.ts.map +1 -0
  195. package/lib/packlets/ai-assist/http.js +109 -0
  196. package/lib/packlets/ai-assist/http.js.map +1 -0
  197. package/lib/packlets/ai-assist/imageGenerationClient.d.ts +46 -0
  198. package/lib/packlets/ai-assist/imageGenerationClient.d.ts.map +1 -0
  199. package/lib/packlets/ai-assist/imageGenerationClient.js +458 -0
  200. package/lib/packlets/ai-assist/imageGenerationClient.js.map +1 -0
  201. package/lib/packlets/ai-assist/imageOptionsResolver.d.ts +66 -0
  202. package/lib/packlets/ai-assist/imageOptionsResolver.d.ts.map +1 -0
  203. package/lib/packlets/ai-assist/imageOptionsResolver.js +197 -0
  204. package/lib/packlets/ai-assist/imageOptionsResolver.js.map +1 -0
  205. package/lib/packlets/ai-assist/index.d.ts +12 -4
  206. package/lib/packlets/ai-assist/index.d.ts.map +1 -0
  207. package/lib/packlets/ai-assist/index.js +47 -4
  208. package/lib/packlets/ai-assist/index.js.map +1 -0
  209. package/lib/packlets/ai-assist/jsonCompletion.d.ts +93 -0
  210. package/lib/packlets/ai-assist/jsonCompletion.d.ts.map +1 -0
  211. package/lib/packlets/ai-assist/jsonCompletion.js +97 -0
  212. package/lib/packlets/ai-assist/jsonCompletion.js.map +1 -0
  213. package/lib/packlets/ai-assist/jsonResponse.d.ts +194 -0
  214. package/lib/packlets/ai-assist/jsonResponse.d.ts.map +1 -0
  215. package/lib/packlets/ai-assist/jsonResponse.js +429 -0
  216. package/lib/packlets/ai-assist/jsonResponse.js.map +1 -0
  217. package/lib/packlets/ai-assist/listModelsClient.d.ts +46 -0
  218. package/lib/packlets/ai-assist/listModelsClient.d.ts.map +1 -0
  219. package/lib/packlets/ai-assist/listModelsClient.js +298 -0
  220. package/lib/packlets/ai-assist/listModelsClient.js.map +1 -0
  221. package/lib/packlets/ai-assist/model.d.ts +1346 -12
  222. package/lib/packlets/ai-assist/model.d.ts.map +1 -0
  223. package/lib/packlets/ai-assist/model.js +309 -10
  224. package/lib/packlets/ai-assist/model.js.map +1 -0
  225. package/lib/packlets/ai-assist/registry.d.ts +76 -1
  226. package/lib/packlets/ai-assist/registry.d.ts.map +1 -0
  227. package/lib/packlets/ai-assist/registry.js +381 -13
  228. package/lib/packlets/ai-assist/registry.js.map +1 -0
  229. package/lib/packlets/ai-assist/sseParser.d.ts +45 -0
  230. package/lib/packlets/ai-assist/sseParser.d.ts.map +1 -0
  231. package/lib/packlets/ai-assist/sseParser.js +128 -0
  232. package/lib/packlets/ai-assist/sseParser.js.map +1 -0
  233. package/lib/packlets/ai-assist/streamingAdapters/anthropic.d.ts +72 -0
  234. package/lib/packlets/ai-assist/streamingAdapters/anthropic.d.ts.map +1 -0
  235. package/lib/packlets/ai-assist/streamingAdapters/anthropic.js +379 -0
  236. package/lib/packlets/ai-assist/streamingAdapters/anthropic.js.map +1 -0
  237. package/lib/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.d.ts +269 -0
  238. package/lib/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.d.ts.map +1 -0
  239. package/lib/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.js +694 -0
  240. package/lib/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.js.map +1 -0
  241. package/lib/packlets/ai-assist/streamingAdapters/common.d.ts +163 -0
  242. package/lib/packlets/ai-assist/streamingAdapters/common.d.ts.map +1 -0
  243. package/lib/packlets/ai-assist/streamingAdapters/common.js +193 -0
  244. package/lib/packlets/ai-assist/streamingAdapters/common.js.map +1 -0
  245. package/lib/packlets/ai-assist/streamingAdapters/gemini.d.ts +43 -0
  246. package/lib/packlets/ai-assist/streamingAdapters/gemini.d.ts.map +1 -0
  247. package/lib/packlets/ai-assist/streamingAdapters/gemini.js +211 -0
  248. package/lib/packlets/ai-assist/streamingAdapters/gemini.js.map +1 -0
  249. package/lib/packlets/ai-assist/streamingAdapters/openaiChat.d.ts +19 -0
  250. package/lib/packlets/ai-assist/streamingAdapters/openaiChat.d.ts.map +1 -0
  251. package/lib/packlets/ai-assist/streamingAdapters/openaiChat.js +178 -0
  252. package/lib/packlets/ai-assist/streamingAdapters/openaiChat.js.map +1 -0
  253. package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.d.ts +33 -0
  254. package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.d.ts.map +1 -0
  255. package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.js +393 -0
  256. package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.js.map +1 -0
  257. package/lib/packlets/ai-assist/streamingAdapters/proxy.d.ts +34 -0
  258. package/lib/packlets/ai-assist/streamingAdapters/proxy.d.ts.map +1 -0
  259. package/lib/packlets/ai-assist/streamingAdapters/proxy.js +181 -0
  260. package/lib/packlets/ai-assist/streamingAdapters/proxy.js.map +1 -0
  261. package/lib/packlets/ai-assist/streamingClient.d.ts +50 -0
  262. package/lib/packlets/ai-assist/streamingClient.d.ts.map +1 -0
  263. package/lib/packlets/ai-assist/streamingClient.js +146 -0
  264. package/lib/packlets/ai-assist/streamingClient.js.map +1 -0
  265. package/lib/packlets/ai-assist/thinkingOptionsResolver.d.ts +87 -0
  266. package/lib/packlets/ai-assist/thinkingOptionsResolver.d.ts.map +1 -0
  267. package/lib/packlets/ai-assist/thinkingOptionsResolver.js +294 -0
  268. package/lib/packlets/ai-assist/thinkingOptionsResolver.js.map +1 -0
  269. package/lib/packlets/ai-assist/toolFormats.d.ts +40 -9
  270. package/lib/packlets/ai-assist/toolFormats.d.ts.map +1 -0
  271. package/lib/packlets/ai-assist/toolFormats.js +107 -10
  272. package/lib/packlets/ai-assist/toolFormats.js.map +1 -0
  273. package/lib/packlets/conversion/converters.d.ts +8 -1
  274. package/lib/packlets/conversion/converters.d.ts.map +1 -0
  275. package/lib/packlets/conversion/converters.js +36 -2
  276. package/lib/packlets/conversion/converters.js.map +1 -0
  277. package/lib/packlets/conversion/index.d.ts.map +1 -0
  278. package/lib/packlets/conversion/index.js.map +1 -0
  279. package/lib/packlets/crypto-utils/constants.d.ts.map +1 -0
  280. package/lib/packlets/crypto-utils/constants.js.map +1 -0
  281. package/lib/packlets/crypto-utils/converters.d.ts +20 -1
  282. package/lib/packlets/crypto-utils/converters.d.ts.map +1 -0
  283. package/lib/packlets/crypto-utils/converters.js +43 -5
  284. package/lib/packlets/crypto-utils/converters.js.map +1 -0
  285. package/lib/packlets/crypto-utils/directEncryptionProvider.d.ts.map +1 -0
  286. package/lib/packlets/crypto-utils/directEncryptionProvider.js.map +1 -0
  287. package/lib/packlets/crypto-utils/encryptedFile.d.ts +25 -0
  288. package/lib/packlets/crypto-utils/encryptedFile.d.ts.map +1 -0
  289. package/lib/packlets/crypto-utils/encryptedFile.js +38 -0
  290. package/lib/packlets/crypto-utils/encryptedFile.js.map +1 -0
  291. package/lib/packlets/crypto-utils/hpkeProvider.d.ts +150 -0
  292. package/lib/packlets/crypto-utils/hpkeProvider.d.ts.map +1 -0
  293. package/lib/packlets/crypto-utils/hpkeProvider.js +359 -0
  294. package/lib/packlets/crypto-utils/hpkeProvider.js.map +1 -0
  295. package/lib/packlets/crypto-utils/index.browser.d.ts +5 -1
  296. package/lib/packlets/crypto-utils/index.browser.d.ts.map +1 -0
  297. package/lib/packlets/crypto-utils/index.browser.js +28 -3
  298. package/lib/packlets/crypto-utils/index.browser.js.map +1 -0
  299. package/lib/packlets/crypto-utils/index.d.ts +5 -1
  300. package/lib/packlets/crypto-utils/index.d.ts.map +1 -0
  301. package/lib/packlets/crypto-utils/index.js +24 -1
  302. package/lib/packlets/crypto-utils/index.js.map +1 -0
  303. package/lib/packlets/crypto-utils/keyPairAlgorithmParams.d.ts +54 -0
  304. package/lib/packlets/crypto-utils/keyPairAlgorithmParams.d.ts.map +1 -0
  305. package/lib/packlets/crypto-utils/keyPairAlgorithmParams.js +74 -0
  306. package/lib/packlets/crypto-utils/keyPairAlgorithmParams.js.map +1 -0
  307. package/lib/packlets/crypto-utils/keystore/converters.d.ts +68 -6
  308. package/lib/packlets/crypto-utils/keystore/converters.d.ts.map +1 -0
  309. package/lib/packlets/crypto-utils/keystore/converters.js +109 -14
  310. package/lib/packlets/crypto-utils/keystore/converters.js.map +1 -0
  311. package/lib/packlets/crypto-utils/keystore/encryptedFilePrivateKeyStorage.d.ts +148 -0
  312. package/lib/packlets/crypto-utils/keystore/encryptedFilePrivateKeyStorage.d.ts.map +1 -0
  313. package/lib/packlets/crypto-utils/keystore/encryptedFilePrivateKeyStorage.js +324 -0
  314. package/lib/packlets/crypto-utils/keystore/encryptedFilePrivateKeyStorage.js.map +1 -0
  315. package/lib/packlets/crypto-utils/keystore/index.browser.d.ts +10 -0
  316. package/lib/packlets/crypto-utils/keystore/index.browser.d.ts.map +1 -0
  317. package/lib/packlets/crypto-utils/keystore/index.browser.js +76 -0
  318. package/lib/packlets/crypto-utils/keystore/index.browser.js.map +1 -0
  319. package/lib/packlets/crypto-utils/keystore/index.d.ts +2 -0
  320. package/lib/packlets/crypto-utils/keystore/index.d.ts.map +1 -0
  321. package/lib/packlets/crypto-utils/keystore/index.js +5 -1
  322. package/lib/packlets/crypto-utils/keystore/index.js.map +1 -0
  323. package/lib/packlets/crypto-utils/keystore/keyStore.d.ts +314 -13
  324. package/lib/packlets/crypto-utils/keystore/keyStore.d.ts.map +1 -0
  325. package/lib/packlets/crypto-utils/keystore/keyStore.js +877 -124
  326. package/lib/packlets/crypto-utils/keystore/keyStore.js.map +1 -0
  327. package/lib/packlets/crypto-utils/keystore/model.d.ts +404 -21
  328. package/lib/packlets/crypto-utils/keystore/model.d.ts.map +1 -0
  329. package/lib/packlets/crypto-utils/keystore/model.js +37 -5
  330. package/lib/packlets/crypto-utils/keystore/model.js.map +1 -0
  331. package/lib/packlets/crypto-utils/keystore/privateKeyStorage.d.ts +53 -0
  332. package/lib/packlets/crypto-utils/keystore/privateKeyStorage.d.ts.map +1 -0
  333. package/lib/packlets/crypto-utils/keystore/privateKeyStorage.js +22 -0
  334. package/lib/packlets/crypto-utils/keystore/privateKeyStorage.js.map +1 -0
  335. package/lib/packlets/crypto-utils/model.d.ts +518 -10
  336. package/lib/packlets/crypto-utils/model.d.ts.map +1 -0
  337. package/lib/packlets/crypto-utils/model.js +33 -1
  338. package/lib/packlets/crypto-utils/model.js.map +1 -0
  339. package/lib/packlets/crypto-utils/nodeCryptoProvider.d.ts +142 -2
  340. package/lib/packlets/crypto-utils/nodeCryptoProvider.d.ts.map +1 -0
  341. package/lib/packlets/crypto-utils/nodeCryptoProvider.js +346 -0
  342. package/lib/packlets/crypto-utils/nodeCryptoProvider.js.map +1 -0
  343. package/lib/packlets/crypto-utils/seedDerivedKeyPair.d.ts +42 -0
  344. package/lib/packlets/crypto-utils/seedDerivedKeyPair.d.ts.map +1 -0
  345. package/lib/packlets/crypto-utils/seedDerivedKeyPair.js +123 -0
  346. package/lib/packlets/crypto-utils/seedDerivedKeyPair.js.map +1 -0
  347. package/lib/packlets/crypto-utils/spkiHelpers.d.ts +151 -0
  348. package/lib/packlets/crypto-utils/spkiHelpers.d.ts.map +1 -0
  349. package/lib/packlets/crypto-utils/spkiHelpers.js +297 -0
  350. package/lib/packlets/crypto-utils/spkiHelpers.js.map +1 -0
  351. package/lib/packlets/csv/csvFileHelpers.d.ts +0 -10
  352. package/lib/packlets/csv/csvFileHelpers.d.ts.map +1 -0
  353. package/lib/packlets/csv/csvFileHelpers.js +0 -15
  354. package/lib/packlets/csv/csvFileHelpers.js.map +1 -0
  355. package/lib/packlets/csv/csvHelpers.d.ts +10 -0
  356. package/lib/packlets/csv/csvHelpers.d.ts.map +1 -0
  357. package/lib/packlets/csv/csvHelpers.js +15 -0
  358. package/lib/packlets/csv/csvHelpers.js.map +1 -0
  359. package/lib/packlets/csv/index.browser.d.ts +0 -1
  360. package/lib/packlets/csv/index.browser.d.ts.map +1 -0
  361. package/lib/packlets/csv/index.browser.js +1 -5
  362. package/lib/packlets/csv/index.browser.js.map +1 -0
  363. package/lib/packlets/csv/index.d.ts.map +1 -0
  364. package/lib/packlets/csv/index.js.map +1 -0
  365. package/lib/packlets/experimental/extendedArray.d.ts.map +1 -0
  366. package/lib/packlets/experimental/extendedArray.js.map +1 -0
  367. package/lib/packlets/experimental/formatter.d.ts.map +1 -0
  368. package/lib/packlets/experimental/formatter.js.map +1 -0
  369. package/lib/packlets/experimental/index.d.ts.map +1 -0
  370. package/lib/packlets/experimental/index.js.map +1 -0
  371. package/lib/packlets/experimental/rangeOf.d.ts.map +1 -0
  372. package/lib/packlets/experimental/rangeOf.js.map +1 -0
  373. package/lib/packlets/hash/index.browser.d.ts.map +1 -0
  374. package/lib/packlets/hash/index.browser.js.map +1 -0
  375. package/lib/packlets/hash/index.d.ts.map +1 -0
  376. package/lib/packlets/hash/index.js.map +1 -0
  377. package/lib/packlets/hash/index.node.d.ts.map +1 -0
  378. package/lib/packlets/hash/index.node.js.map +1 -0
  379. package/lib/packlets/hash/md5Normalizer.browser.d.ts.map +1 -0
  380. package/lib/packlets/hash/md5Normalizer.browser.js.map +1 -0
  381. package/lib/packlets/hash/md5Normalizer.d.ts.map +1 -0
  382. package/lib/packlets/hash/md5Normalizer.js.map +1 -0
  383. package/lib/packlets/mustache/index.d.ts +1 -1
  384. package/lib/packlets/mustache/index.d.ts.map +1 -0
  385. package/lib/packlets/mustache/index.js.map +1 -0
  386. package/lib/packlets/mustache/interfaces.d.ts +34 -0
  387. package/lib/packlets/mustache/interfaces.d.ts.map +1 -0
  388. package/lib/packlets/mustache/interfaces.js.map +1 -0
  389. package/lib/packlets/mustache/mustacheTemplate.d.ts +2 -0
  390. package/lib/packlets/mustache/mustacheTemplate.d.ts.map +1 -0
  391. package/lib/packlets/mustache/mustacheTemplate.js +42 -4
  392. package/lib/packlets/mustache/mustacheTemplate.js.map +1 -0
  393. package/lib/packlets/record-jar/index.browser.d.ts +0 -1
  394. package/lib/packlets/record-jar/index.browser.d.ts.map +1 -0
  395. package/lib/packlets/record-jar/index.browser.js +1 -5
  396. package/lib/packlets/record-jar/index.browser.js.map +1 -0
  397. package/lib/packlets/record-jar/index.d.ts.map +1 -0
  398. package/lib/packlets/record-jar/index.js.map +1 -0
  399. package/lib/packlets/record-jar/recordJarFileHelpers.d.ts +0 -11
  400. package/lib/packlets/record-jar/recordJarFileHelpers.d.ts.map +1 -0
  401. package/lib/packlets/record-jar/recordJarFileHelpers.js +0 -19
  402. package/lib/packlets/record-jar/recordJarFileHelpers.js.map +1 -0
  403. package/lib/packlets/record-jar/recordJarHelpers.d.ts +11 -0
  404. package/lib/packlets/record-jar/recordJarHelpers.d.ts.map +1 -0
  405. package/lib/packlets/record-jar/recordJarHelpers.js +19 -0
  406. package/lib/packlets/record-jar/recordJarHelpers.js.map +1 -0
  407. package/lib/packlets/safer-fetch/addressClassification.d.ts +144 -0
  408. package/lib/packlets/safer-fetch/addressClassification.d.ts.map +1 -0
  409. package/lib/packlets/safer-fetch/addressClassification.js +441 -0
  410. package/lib/packlets/safer-fetch/addressClassification.js.map +1 -0
  411. package/lib/packlets/safer-fetch/addressPolicy.d.ts +113 -0
  412. package/lib/packlets/safer-fetch/addressPolicy.d.ts.map +1 -0
  413. package/lib/packlets/safer-fetch/addressPolicy.js +123 -0
  414. package/lib/packlets/safer-fetch/addressPolicy.js.map +1 -0
  415. package/lib/packlets/safer-fetch/contentType.d.ts +51 -0
  416. package/lib/packlets/safer-fetch/contentType.d.ts.map +1 -0
  417. package/lib/packlets/safer-fetch/contentType.js +127 -0
  418. package/lib/packlets/safer-fetch/contentType.js.map +1 -0
  419. package/lib/packlets/safer-fetch/deadline.d.ts +138 -0
  420. package/lib/packlets/safer-fetch/deadline.d.ts.map +1 -0
  421. package/lib/packlets/safer-fetch/deadline.js +258 -0
  422. package/lib/packlets/safer-fetch/deadline.js.map +1 -0
  423. package/lib/packlets/safer-fetch/defaults.d.ts +108 -0
  424. package/lib/packlets/safer-fetch/defaults.d.ts.map +1 -0
  425. package/lib/packlets/safer-fetch/defaults.js +134 -0
  426. package/lib/packlets/safer-fetch/defaults.js.map +1 -0
  427. package/lib/packlets/safer-fetch/failureReason.d.ts +148 -0
  428. package/lib/packlets/safer-fetch/failureReason.d.ts.map +1 -0
  429. package/lib/packlets/safer-fetch/failureReason.js +22 -0
  430. package/lib/packlets/safer-fetch/failureReason.js.map +1 -0
  431. package/lib/packlets/safer-fetch/guards.d.ts +62 -0
  432. package/lib/packlets/safer-fetch/guards.d.ts.map +1 -0
  433. package/lib/packlets/safer-fetch/guards.js +153 -0
  434. package/lib/packlets/safer-fetch/guards.js.map +1 -0
  435. package/lib/packlets/safer-fetch/index.browser.d.ts +33 -0
  436. package/lib/packlets/safer-fetch/index.browser.d.ts.map +1 -0
  437. package/lib/packlets/safer-fetch/index.browser.js +82 -0
  438. package/lib/packlets/safer-fetch/index.browser.js.map +1 -0
  439. package/lib/packlets/safer-fetch/index.d.ts +27 -0
  440. package/lib/packlets/safer-fetch/index.d.ts.map +1 -0
  441. package/lib/packlets/safer-fetch/index.js +78 -0
  442. package/lib/packlets/safer-fetch/index.js.map +1 -0
  443. package/lib/packlets/safer-fetch/model.d.ts +373 -0
  444. package/lib/packlets/safer-fetch/model.d.ts.map +1 -0
  445. package/lib/packlets/safer-fetch/model.js +22 -0
  446. package/lib/packlets/safer-fetch/model.js.map +1 -0
  447. package/lib/packlets/safer-fetch/nodeAddressGuard.d.ts +129 -0
  448. package/lib/packlets/safer-fetch/nodeAddressGuard.d.ts.map +1 -0
  449. package/lib/packlets/safer-fetch/nodeAddressGuard.js +196 -0
  450. package/lib/packlets/safer-fetch/nodeAddressGuard.js.map +1 -0
  451. package/lib/packlets/safer-fetch/redirect.d.ts +62 -0
  452. package/lib/packlets/safer-fetch/redirect.d.ts.map +1 -0
  453. package/lib/packlets/safer-fetch/redirect.js +98 -0
  454. package/lib/packlets/safer-fetch/redirect.js.map +1 -0
  455. package/lib/packlets/safer-fetch/retry.d.ts +162 -0
  456. package/lib/packlets/safer-fetch/retry.d.ts.map +1 -0
  457. package/lib/packlets/safer-fetch/retry.js +197 -0
  458. package/lib/packlets/safer-fetch/retry.js.map +1 -0
  459. package/lib/packlets/safer-fetch/saferFetch.d.ts +108 -0
  460. package/lib/packlets/safer-fetch/saferFetch.d.ts.map +1 -0
  461. package/lib/packlets/safer-fetch/saferFetch.js +760 -0
  462. package/lib/packlets/safer-fetch/saferFetch.js.map +1 -0
  463. package/lib/packlets/safer-fetch/transport.d.ts +18 -0
  464. package/lib/packlets/safer-fetch/transport.d.ts.map +1 -0
  465. package/lib/packlets/safer-fetch/transport.js +53 -0
  466. package/lib/packlets/safer-fetch/transport.js.map +1 -0
  467. package/lib/packlets/yaml/converters.d.ts.map +1 -0
  468. package/lib/packlets/yaml/converters.js.map +1 -0
  469. package/lib/packlets/yaml/index.d.ts +1 -0
  470. package/lib/packlets/yaml/index.d.ts.map +1 -0
  471. package/lib/packlets/yaml/index.js +1 -0
  472. package/lib/packlets/yaml/index.js.map +1 -0
  473. package/lib/packlets/yaml/serializers.d.ts +45 -0
  474. package/lib/packlets/yaml/serializers.d.ts.map +1 -0
  475. package/lib/packlets/yaml/serializers.js +84 -0
  476. package/lib/packlets/yaml/serializers.js.map +1 -0
  477. package/lib/packlets/zip-file-tree/index.d.ts.map +1 -0
  478. package/lib/packlets/zip-file-tree/index.js.map +1 -0
  479. package/lib/packlets/zip-file-tree/zipFileTreeAccessors.d.ts +84 -8
  480. package/lib/packlets/zip-file-tree/zipFileTreeAccessors.d.ts.map +1 -0
  481. package/lib/packlets/zip-file-tree/zipFileTreeAccessors.js +99 -9
  482. package/lib/packlets/zip-file-tree/zipFileTreeAccessors.js.map +1 -0
  483. package/lib/packlets/zip-file-tree/zipFileTreeWriter.d.ts +26 -1
  484. package/lib/packlets/zip-file-tree/zipFileTreeWriter.d.ts.map +1 -0
  485. package/lib/packlets/zip-file-tree/zipFileTreeWriter.js +17 -1
  486. package/lib/packlets/zip-file-tree/zipFileTreeWriter.js.map +1 -0
  487. package/package.json +30 -15
  488. package/lib/packlets/ai-assist/apiClient.d.ts +0 -60
@@ -0,0 +1,74 @@
1
+ import { type Logging, Result } from '@fgv/ts-utils';
2
+ import { type AiServerToolConfig, type IAiCompletionResponse, type IAiProviderDescriptor, type IChatRequest, type IThinkingConfig, type ModelSpec } from './model';
3
+ /**
4
+ * Parameters for a provider completion request. Carries the unified
5
+ * {@link AiAssist.IChatRequest} shape (`system?` + ordered `messages`, last =
6
+ * current user turn); history is linearized before the current turn.
7
+ * @public
8
+ */
9
+ export interface IProviderCompletionParams extends IChatRequest {
10
+ /** The provider descriptor */
11
+ readonly descriptor: IAiProviderDescriptor;
12
+ /** API key for authentication */
13
+ readonly apiKey: string;
14
+ /**
15
+ * Sampling temperature. Sent to the provider only when explicitly provided; omitted otherwise
16
+ * so the provider's own default applies (current-gen models reject a caller-supplied default).
17
+ */
18
+ readonly temperature?: number;
19
+ /** Optional model override — string or context-aware map (uses descriptor.defaultModel otherwise) */
20
+ readonly modelOverride?: ModelSpec;
21
+ /**
22
+ * Optional quality tier selecting which completion model to use. `undefined`
23
+ * selects the `base` tier; `'frontier'` cascades to `advanced` then `base`
24
+ * when a tier is unset for a provider. Orthogonal to `thinking` and `tools`,
25
+ * which never select a model.
26
+ */
27
+ readonly tier?: 'advanced' | 'frontier';
28
+ /** Optional logger for request/response observability. */
29
+ readonly logger?: Logging.ILogger;
30
+ /** Server-side tools to include in the request. Overrides settings-level tool config when provided. */
31
+ readonly tools?: ReadonlyArray<AiServerToolConfig>;
32
+ /** Optional abort signal for cancelling the in-flight request. */
33
+ readonly signal?: AbortSignal;
34
+ /**
35
+ * Optional override of the descriptor's default base URL (scheme + host +
36
+ * optional port + path prefix). The per-route suffix (e.g. `/chat/completions`)
37
+ * is appended unchanged. Must be a well-formed `http`/`https` URL. Auth shape
38
+ * is unchanged: `needsSecret` providers still require an API key.
39
+ */
40
+ readonly endpoint?: string;
41
+ /**
42
+ * Optional thinking/reasoning config. Anthropic, OpenAI, and xAI reject `temperature` when
43
+ * the effective merged effort is non-`'none'`; Gemini always accepts both.
44
+ */
45
+ readonly thinking?: IThinkingConfig;
46
+ /**
47
+ * Optional cap on generated output tokens, mapped to each provider's native field:
48
+ * Anthropic `max_tokens`, OpenAI Chat Completions `max_completion_tokens`, OpenAI/xAI
49
+ * Responses `max_output_tokens`, Gemini `generationConfig.maxOutputTokens`, and the
50
+ * xAI/Groq/Mistral/Ollama/`openai-compat` chat-completions path `max_tokens`. When unset,
51
+ * every provider except Anthropic omits the field and applies its own default; Anthropic's
52
+ * Messages API requires the field, so it falls back to `DEFAULT_ANTHROPIC_MAX_TOKENS`.
53
+ */
54
+ readonly maxTokens?: number;
55
+ }
56
+ /**
57
+ * Calls the appropriate chat completion API for a given provider. Routes by
58
+ * `apiFormat`: `'openai'` (xAI/OpenAI/Groq/Mistral — switches to Responses API
59
+ * when tools are set), `'anthropic'`, or `'gemini'`.
60
+ * @public
61
+ */
62
+ export declare function callProviderCompletion(params: IProviderCompletionParams): Promise<Result<IAiCompletionResponse>>;
63
+ /**
64
+ * Calls the AI completion endpoint on a proxy server instead of calling the
65
+ * provider API directly from the browser. The proxy handles provider dispatch,
66
+ * CORS, and API key forwarding. The request body serializes the unified
67
+ * {@link AiAssist.IChatRequest} shape (`system?` + `messages`). Enforces the same
68
+ * non-empty / trailing-user-turn and image-input invariants as the direct path.
69
+ * @param proxyUrl - Base URL of the proxy server
70
+ * @param params - Same parameters as {@link callProviderCompletion}
71
+ * @public
72
+ */
73
+ export declare function callProxiedCompletion(proxyUrl: string, params: IProviderCompletionParams): Promise<Result<IAiCompletionResponse>>;
74
+ //# sourceMappingURL=completionClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completionClient.d.ts","sourceRoot":"","sources":["../../../src/packlets/ai-assist/completionClient.ts"],"names":[],"mappings":"AA8BA,OAAO,EAAQ,KAAK,OAAO,EAAE,MAAM,EAAuC,MAAM,eAAe,CAAC;AAEhG,OAAO,EAEL,KAAK,kBAAkB,EAEvB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAE1B,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,SAAS,EAMf,MAAM,SAAS,CAAC;AA8BjB;;;;;GAKG;AACH,MAAM,WAAW,yBAA0B,SAAQ,YAAY;IAC7D,8BAA8B;IAC9B,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAC;IAC3C,iCAAiC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,qGAAqG;IACrG,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACxC,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC;IAClC,uGAAuG;IACvG,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;IACnD,kEAAkE;IAClE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;IACpC;;;;;;;OAOG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AA0aD;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAqIxC;AAMD;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAwExC"}
@@ -21,86 +21,13 @@
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
22
  exports.callProviderCompletion = callProviderCompletion;
23
23
  exports.callProxiedCompletion = callProxiedCompletion;
24
- /**
25
- * Chat completion client for AI assist with support for multiple provider APIs.
26
- *
27
- * Supports OpenAI-compatible providers (xAI, OpenAI, Groq, Mistral) directly,
28
- * plus adapters for Anthropic and Google Gemini.
29
- *
30
- * When server-side tools (e.g. web_search) are configured, providers that support
31
- * them will include tool configuration in the request and handle tool-augmented
32
- * responses.
33
- *
34
- * @packageDocumentation
35
- */
36
- const ts_json_base_1 = require("@fgv/ts-json-base");
37
24
  const ts_utils_1 = require("@fgv/ts-utils");
38
25
  const model_1 = require("./model");
26
+ const thinkingOptionsResolver_1 = require("./thinkingOptionsResolver");
27
+ const chatRequestBuilders_1 = require("./chatRequestBuilders");
28
+ const endpoint_1 = require("./endpoint");
29
+ const http_1 = require("./http");
39
30
  const toolFormats_1 = require("./toolFormats");
40
- // ============================================================================
41
- // Shared helpers
42
- // ============================================================================
43
- /**
44
- * Builds the messages array from prompt + optional correction messages.
45
- * @internal
46
- */
47
- function buildMessages(prompt, additionalMessages) {
48
- const messages = [
49
- { role: 'system', content: prompt.system },
50
- { role: 'user', content: prompt.user }
51
- ];
52
- if (additionalMessages) {
53
- for (const msg of additionalMessages) {
54
- messages.push({ role: msg.role, content: msg.content });
55
- }
56
- }
57
- return messages;
58
- }
59
- /**
60
- * Makes an HTTP request and returns the parsed JSON, or a failure.
61
- * @internal
62
- */
63
- async function fetchJson(url, headers, body, logger) {
64
- /* c8 ignore next 1 - optional logger */
65
- logger === null || logger === void 0 ? void 0 : logger.detail(`AI API request: POST ${url}`);
66
- let response;
67
- try {
68
- response = await fetch(url, {
69
- method: 'POST',
70
- headers: Object.assign({ 'Content-Type': 'application/json' }, headers),
71
- body: JSON.stringify(body)
72
- });
73
- }
74
- catch (err) {
75
- const detail = err instanceof Error ? err.message : String(err);
76
- /* c8 ignore next 1 - optional logger */
77
- logger === null || logger === void 0 ? void 0 : logger.error(`AI API request failed: ${detail}`);
78
- return (0, ts_utils_1.fail)(`AI API request failed: ${detail}`);
79
- }
80
- if (!response.ok) {
81
- const errorText = await response.text().catch(() => 'unknown error');
82
- /* c8 ignore next 1 - optional logger */
83
- logger === null || logger === void 0 ? void 0 : logger.error(`AI API returned ${response.status}: ${errorText}`);
84
- return (0, ts_utils_1.fail)(`AI API returned ${response.status}: ${errorText}`);
85
- }
86
- /* c8 ignore next 1 - optional logger */
87
- logger === null || logger === void 0 ? void 0 : logger.detail(`AI API response: ${response.status}`);
88
- let json;
89
- try {
90
- json = await response.json();
91
- }
92
- catch (_a) {
93
- /* c8 ignore next 1 - optional logger */
94
- logger === null || logger === void 0 ? void 0 : logger.error('AI API returned invalid JSON response');
95
- return (0, ts_utils_1.fail)('AI API returned invalid JSON response');
96
- }
97
- if (!(0, ts_json_base_1.isJsonObject)(json)) {
98
- /* c8 ignore next 1 - optional logger */
99
- logger === null || logger === void 0 ? void 0 : logger.error('AI API returned non-object JSON response');
100
- return (0, ts_utils_1.fail)('AI API returned non-object JSON response');
101
- }
102
- return (0, ts_utils_1.succeed)(json);
103
- }
104
31
  const openAiMessage = ts_utils_1.Validators.object({
105
32
  content: ts_utils_1.Validators.string
106
33
  });
@@ -125,13 +52,6 @@ const responsesApiResponse = ts_utils_1.Validators.object({
125
52
  output: ts_utils_1.Validators.arrayOf(responsesApiOutputItem).withConstraint((arr) => arr.length > 0),
126
53
  status: ts_utils_1.Validators.string
127
54
  });
128
- const anthropicContentBlock = ts_utils_1.Validators.object({
129
- text: ts_utils_1.Validators.string
130
- });
131
- const anthropicResponse = ts_utils_1.Validators.object({
132
- content: ts_utils_1.Validators.arrayOf(anthropicContentBlock).withConstraint((arr) => arr.length > 0),
133
- stop_reason: ts_utils_1.Validators.string
134
- });
135
55
  const geminiPart = ts_utils_1.Validators.object({
136
56
  text: ts_utils_1.Validators.string
137
57
  });
@@ -153,16 +73,22 @@ const geminiResponse = ts_utils_1.Validators.object({
153
73
  * Works for xAI Grok, OpenAI, Groq, and Mistral.
154
74
  * @internal
155
75
  */
156
- async function callOpenAiCompletion(config, prompt, additionalMessages, temperature = 0.7, logger) {
76
+ async function callOpenAiCompletion(config, prompt, head, temperature, logger, signal, resolvedThinking, maxTokens, useMaxCompletionTokensField = false) {
77
+ var _a;
157
78
  const url = `${config.baseUrl}/chat/completions`;
158
- const messages = buildMessages(prompt, additionalMessages);
159
- const body = { model: config.model, messages, temperature };
160
- const headers = {
161
- Authorization: `Bearer ${config.apiKey}`
162
- };
79
+ const messages = (0, chatRequestBuilders_1.buildMessages)(prompt.system, (0, chatRequestBuilders_1.buildOpenAiChatUserContent)(prompt), {
80
+ head
81
+ });
82
+ const effort = (_a = resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.openAiEffort) !== null && _a !== void 0 ? _a : resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.xaiEffort;
83
+ const maxTokensField = useMaxCompletionTokensField ? 'max_completion_tokens' : 'max_tokens';
84
+ const body = Object.assign(Object.assign(Object.assign({ model: config.model, messages }, (temperature !== undefined ? { temperature } : {})), (effort !== undefined && config.model !== 'grok-4' ? { reasoning_effort: effort } : {})), (maxTokens !== undefined ? { [maxTokensField]: maxTokens } : {}));
85
+ if ((resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.otherParams) !== undefined) {
86
+ Object.assign(body, resolvedThinking.otherParams);
87
+ }
88
+ const headers = (0, endpoint_1.bearerAuthHeader)(config.apiKey);
163
89
  /* c8 ignore next 1 - optional logger */
164
90
  logger === null || logger === void 0 ? void 0 : logger.info(`OpenAI completion: model=${config.model}`);
165
- const jsonResult = await fetchJson(url, headers, body, logger);
91
+ const jsonResult = await (0, http_1.fetchJson)(url, headers, body, logger, signal);
166
92
  if (jsonResult.isFailure()) {
167
93
  return (0, ts_utils_1.fail)(jsonResult.message);
168
94
  }
@@ -201,21 +127,25 @@ function extractResponsesApiText(output) {
201
127
  * Used when tools are configured for an openai-format provider.
202
128
  * @internal
203
129
  */
204
- async function callOpenAiResponsesCompletion(config, prompt, tools, additionalMessages, temperature = 0.7, logger) {
130
+ async function callOpenAiResponsesCompletion(config, prompt, tools = [], head, temperature, logger, signal, resolvedThinking, maxTokens) {
131
+ var _a;
205
132
  const url = `${config.baseUrl}/responses`;
206
- const input = buildMessages(prompt, additionalMessages);
207
- const body = {
208
- model: config.model,
209
- input,
210
- tools: (0, toolFormats_1.toResponsesApiTools)(tools),
211
- temperature
212
- };
213
- const headers = {
214
- Authorization: `Bearer ${config.apiKey}`
215
- };
133
+ const input = (0, chatRequestBuilders_1.buildMessages)(prompt.system, (0, chatRequestBuilders_1.buildOpenAiResponsesUserContent)(prompt), {
134
+ head
135
+ });
136
+ const effort = (_a = resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.openAiEffort) !== null && _a !== void 0 ? _a : resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.xaiEffort;
137
+ const body = Object.assign(Object.assign(Object.assign({ model: config.model, input }, (tools.length > 0 ? { tools: (0, toolFormats_1.toResponsesApiTools)(tools) } : {})), (temperature !== undefined ? { temperature } : {})), (effort !== undefined && config.model !== 'grok-4' ? { reasoning: { effort } } : {}));
138
+ // Shared by OpenAI and xAI — both route through the Responses API with the same field name.
139
+ if (maxTokens !== undefined) {
140
+ body.max_output_tokens = maxTokens;
141
+ }
142
+ if ((resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.otherParams) !== undefined) {
143
+ Object.assign(body, resolvedThinking.otherParams);
144
+ }
145
+ const headers = (0, endpoint_1.bearerAuthHeader)(config.apiKey);
216
146
  /* c8 ignore next 1 - optional logger */
217
147
  logger === null || logger === void 0 ? void 0 : logger.info(`OpenAI Responses API: model=${config.model}, tools=${tools.map((t) => t.type).join(',')}`);
218
- const jsonResult = await fetchJson(url, headers, body, logger);
148
+ const jsonResult = await (0, http_1.fetchJson)(url, headers, body, logger, signal);
219
149
  if (jsonResult.isFailure()) {
220
150
  return (0, ts_utils_1.fail)(jsonResult.message);
221
151
  }
@@ -254,31 +184,29 @@ function extractAnthropicText(content) {
254
184
  }
255
185
  return (0, ts_utils_1.succeed)(textParts.join(''));
256
186
  }
257
- /**
258
- * Calls the Anthropic Messages API.
259
- * When tools are configured, includes them in the request and handles
260
- * mixed content block responses.
261
- * @internal
262
- */
263
- async function callAnthropicCompletion(config, prompt, additionalMessages, temperature = 0.7, logger, tools) {
187
+ /** Calls the Anthropic Messages API with optional tool support. @internal */
188
+ async function callAnthropicCompletion(config, prompt, head, temperature, logger, tools, signal, resolvedThinking, useAdaptiveThinking = false, maxTokens) {
264
189
  const url = `${config.baseUrl}/messages`;
265
- // Anthropic uses system as a top-level field, not in messages
266
- const messages = [{ role: 'user', content: prompt.user }];
267
- if (additionalMessages) {
268
- for (const msg of additionalMessages) {
269
- // Anthropic doesn't have a system role in messages
270
- if (msg.role !== 'system') {
271
- messages.push({ role: msg.role, content: msg.content });
272
- }
190
+ const messages = (0, chatRequestBuilders_1.buildAnthropicMessages)(prompt, { head });
191
+ const body = Object.assign({ model: config.model, system: prompt.system, messages,
192
+ // Anthropic's Messages API requires max_tokens on every request — see
193
+ // AiAssist.DEFAULT_ANTHROPIC_MAX_TOKENS for why only this provider defaults it.
194
+ max_tokens: maxTokens !== null && maxTokens !== void 0 ? maxTokens : model_1.DEFAULT_ANTHROPIC_MAX_TOKENS }, (temperature !== undefined ? { temperature } : {}));
195
+ const effort = resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.anthropicEffort;
196
+ if (effort !== undefined) {
197
+ if (useAdaptiveThinking) {
198
+ // Claude 5 family: adaptive thinking — no budget_tokens; effort moves to the
199
+ // top-level output_config block. See AiAssist.isAdaptiveThinkingModel.
200
+ body.thinking = { type: 'adaptive' };
201
+ body.output_config = { effort };
202
+ }
203
+ else {
204
+ body.thinking = { type: 'enabled', budget_tokens: (0, thinkingOptionsResolver_1.anthropicEffortToBudgetTokens)(effort) };
273
205
  }
274
206
  }
275
- const body = {
276
- model: config.model,
277
- system: prompt.system,
278
- messages,
279
- max_tokens: 4096,
280
- temperature
281
- };
207
+ if ((resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.otherParams) !== undefined) {
208
+ Object.assign(body, resolvedThinking.otherParams);
209
+ }
282
210
  if (tools && tools.length > 0) {
283
211
  body.tools = (0, toolFormats_1.toAnthropicTools)(tools);
284
212
  /* c8 ignore next 3 - optional logger diagnostic output */
@@ -288,37 +216,23 @@ async function callAnthropicCompletion(config, prompt, additionalMessages, tempe
288
216
  /* c8 ignore next 1 - optional logger */
289
217
  logger === null || logger === void 0 ? void 0 : logger.info(`Anthropic completion: model=${config.model}`);
290
218
  }
291
- const headers = {
292
- 'x-api-key': config.apiKey,
293
- 'anthropic-version': '2023-06-01',
294
- 'anthropic-dangerous-direct-browser-access': 'true'
295
- };
296
- const jsonResult = await fetchJson(url, headers, body, logger);
219
+ const headers = (0, endpoint_1.anthropicAuthHeaders)(config.apiKey);
220
+ const jsonResult = await (0, http_1.fetchJson)(url, headers, body, logger, signal);
297
221
  if (jsonResult.isFailure()) {
298
222
  return (0, ts_utils_1.fail)(jsonResult.message);
299
223
  }
300
- // When tools are used, the response content is a mixed array of block types.
301
- // We need to extract text from all text blocks.
302
- if (tools && tools.length > 0) {
303
- const rawContent = jsonResult.value.content;
304
- const stopReason = jsonResult.value.stop_reason;
305
- if (!Array.isArray(rawContent)) {
306
- return (0, ts_utils_1.fail)('Anthropic API response: content is not an array');
307
- }
308
- return extractAnthropicText(rawContent).onSuccess((text) => (0, ts_utils_1.succeed)({
309
- content: text,
310
- truncated: stopReason === 'max_tokens'
311
- }));
224
+ const rawContent = jsonResult.value.content;
225
+ const stopReason = jsonResult.value.stop_reason;
226
+ if (!Array.isArray(rawContent)) {
227
+ return (0, ts_utils_1.fail)('Anthropic API response: content is not an array');
312
228
  }
313
- return anthropicResponse
314
- .validate(jsonResult.value)
315
- .withErrorFormat((msg) => `Anthropic API response: ${msg}`)
316
- .onSuccess((response) => {
317
- return (0, ts_utils_1.succeed)({
318
- content: response.content[0].text,
319
- truncated: response.stop_reason === 'max_tokens'
320
- });
321
- });
229
+ if (typeof stopReason !== 'string') {
230
+ return (0, ts_utils_1.fail)('Anthropic API response: stop_reason is missing or not a string');
231
+ }
232
+ return extractAnthropicText(rawContent).onSuccess((text) => (0, ts_utils_1.succeed)({
233
+ content: text,
234
+ truncated: stopReason === 'max_tokens'
235
+ }));
322
236
  }
323
237
  // ============================================================================
324
238
  // Google Gemini adapter
@@ -328,26 +242,27 @@ async function callAnthropicCompletion(config, prompt, additionalMessages, tempe
328
242
  * When tools are configured, includes Google Search grounding.
329
243
  * @internal
330
244
  */
331
- async function callGeminiCompletion(config, prompt, additionalMessages, temperature = 0.7, logger, tools) {
245
+ async function callGeminiCompletion(config, prompt, head, temperature, logger, tools, signal, resolvedThinking, maxTokens) {
332
246
  const url = `${config.baseUrl}/models/${config.model}:generateContent`;
333
- // Gemini uses 'contents' with 'parts', and 'model' role instead of 'assistant'
334
- const contents = [
335
- { role: 'user', parts: [{ text: prompt.user }] }
336
- ];
337
- if (additionalMessages) {
338
- for (const msg of additionalMessages) {
339
- if (msg.role !== 'system') {
340
- contents.push({
341
- role: msg.role === 'assistant' ? 'model' : msg.role,
342
- parts: [{ text: msg.content }]
343
- });
344
- }
345
- }
247
+ const contents = (0, chatRequestBuilders_1.buildGeminiContents)(prompt, { head });
248
+ // Temperature is sent only when explicitly provided; otherwise Gemini's default applies.
249
+ const generationConfig = {};
250
+ if (temperature !== undefined) {
251
+ generationConfig.temperature = temperature;
252
+ }
253
+ if (maxTokens !== undefined) {
254
+ generationConfig.maxOutputTokens = maxTokens;
255
+ }
256
+ if ((resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.geminiThinkingBudget) !== undefined) {
257
+ generationConfig.thinkingConfig = { thinkingBudget: resolvedThinking.geminiThinkingBudget };
258
+ }
259
+ if ((resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.otherParams) !== undefined) {
260
+ Object.assign(generationConfig, resolvedThinking.otherParams);
346
261
  }
347
262
  const body = {
348
263
  systemInstruction: { parts: [{ text: prompt.system }] },
349
264
  contents,
350
- generationConfig: { temperature }
265
+ generationConfig
351
266
  };
352
267
  if (tools && tools.length > 0) {
353
268
  body.tools = (0, toolFormats_1.toGeminiTools)(tools);
@@ -358,10 +273,8 @@ async function callGeminiCompletion(config, prompt, additionalMessages, temperat
358
273
  /* c8 ignore next 1 - optional logger */
359
274
  logger === null || logger === void 0 ? void 0 : logger.info(`Gemini completion: model=${config.model}`);
360
275
  }
361
- const headers = {
362
- 'x-goog-api-key': config.apiKey
363
- };
364
- const jsonResult = await fetchJson(url, headers, body, logger);
276
+ const headers = (0, endpoint_1.geminiAuthHeader)(config.apiKey);
277
+ const jsonResult = await (0, http_1.fetchJson)(url, headers, body, logger, signal);
365
278
  if (jsonResult.isFailure()) {
366
279
  return (0, ts_utils_1.fail)(jsonResult.message);
367
280
  }
@@ -380,33 +293,54 @@ async function callGeminiCompletion(config, prompt, additionalMessages, temperat
380
293
  // Provider dispatcher
381
294
  // ============================================================================
382
295
  /**
383
- * Calls the appropriate chat completion API for a given provider.
384
- *
385
- * Routes based on the provider descriptor's `apiFormat` field:
386
- * - `'openai'` for xAI, OpenAI, Groq, Mistral
387
- * - `'anthropic'` for Anthropic Claude
388
- * - `'gemini'` for Google Gemini
389
- *
390
- * When tools are provided and the provider supports them:
391
- * - OpenAI-format providers switch to the Responses API
392
- * - Anthropic includes tools in the Messages API request
393
- * - Gemini includes Google Search grounding
394
- *
395
- * @param params - Request parameters including descriptor, API key, prompt, and optional tools
396
- * @returns The completion response with content and truncation status, or a failure
296
+ * Calls the appropriate chat completion API for a given provider. Routes by
297
+ * `apiFormat`: `'openai'` (xAI/OpenAI/Groq/Mistral — switches to Responses API
298
+ * when tools are set), `'anthropic'`, or `'gemini'`.
397
299
  * @public
398
300
  */
399
301
  async function callProviderCompletion(params) {
400
- const { descriptor, apiKey, prompt, additionalMessages, temperature = 0.7, modelOverride, logger, tools } = params;
401
- if (!descriptor.baseUrl) {
402
- return (0, ts_utils_1.fail)(`provider "${descriptor.id}" has no API endpoint configured`);
302
+ const { descriptor, apiKey, system, messages, temperature, modelOverride, tier, logger, tools, signal, endpoint, thinking, maxTokens } = params;
303
+ const splitResult = (0, chatRequestBuilders_1.splitChatRequest)(system, messages);
304
+ if (splitResult.isFailure()) {
305
+ return (0, ts_utils_1.fail)(splitResult.message);
306
+ }
307
+ const { prompt, head } = splitResult.value;
308
+ const baseUrlResult = (0, endpoint_1.resolveEffectiveBaseUrl)(descriptor, endpoint);
309
+ if (baseUrlResult.isFailure()) {
310
+ return (0, ts_utils_1.fail)(baseUrlResult.message);
311
+ }
312
+ if (prompt.attachments.length > 0 && !descriptor.acceptsImageInput) {
313
+ return (0, ts_utils_1.fail)(`provider "${descriptor.id}" does not accept image input`);
403
314
  }
404
315
  const hasTools = tools !== undefined && tools.length > 0;
405
- const modelContext = hasTools ? 'tools' : undefined;
316
+ const discriminator = (0, thinkingOptionsResolver_1.providerDiscriminatorForId)(descriptor.id);
317
+ // The quality tier is the only completion-model selector; thinking and tools
318
+ // are orthogonal request params/capabilities and never pick a model.
319
+ const modelContext = tier;
320
+ const modelResult = (0, model_1.resolveProviderModel)(descriptor, modelOverride, modelContext);
321
+ if (modelResult.isFailure()) {
322
+ return (0, ts_utils_1.fail)(modelResult.message);
323
+ }
324
+ const model = modelResult.value;
325
+ let resolvedThinking;
326
+ if (thinking !== undefined) {
327
+ if (discriminator !== undefined) {
328
+ const mergeResult = (0, thinkingOptionsResolver_1.mergeThinkingConfig)(thinking, model, discriminator);
329
+ /* c8 ignore next 3 - mergeThinkingConfig always succeeds; defensive guard */
330
+ if (mergeResult.isFailure()) {
331
+ return (0, ts_utils_1.fail)(mergeResult.message);
332
+ }
333
+ resolvedThinking = mergeResult.value;
334
+ const conflictResult = (0, thinkingOptionsResolver_1.checkTemperatureConflict)(resolvedThinking, discriminator, temperature);
335
+ if (conflictResult.isFailure()) {
336
+ return (0, ts_utils_1.fail)(conflictResult.message);
337
+ }
338
+ }
339
+ }
406
340
  const config = {
407
- baseUrl: descriptor.baseUrl,
341
+ baseUrl: baseUrlResult.value,
408
342
  apiKey,
409
- model: (0, model_1.resolveModel)(modelOverride !== null && modelOverride !== void 0 ? modelOverride : descriptor.defaultModel, modelContext)
343
+ model
410
344
  };
411
345
  /* c8 ignore next 8 - optional logger diagnostic output */
412
346
  if (logger) {
@@ -417,14 +351,16 @@ async function callProviderCompletion(params) {
417
351
  }
418
352
  switch (descriptor.apiFormat) {
419
353
  case 'openai':
420
- if (hasTools) {
421
- return callOpenAiResponsesCompletion(config, prompt, tools, additionalMessages, temperature, logger);
354
+ // Responses-API-only models (e.g. gpt-5.5-pro) 400 on /chat/completions, so they route
355
+ // to the Responses path even with no tools requested same path the tools case uses.
356
+ if (hasTools || (0, model_1.isResponsesOnlyModel)(descriptor, config.model)) {
357
+ return callOpenAiResponsesCompletion(config, prompt, tools, head, temperature, logger, signal, resolvedThinking, maxTokens);
422
358
  }
423
- return callOpenAiCompletion(config, prompt, additionalMessages, temperature, logger);
359
+ return callOpenAiCompletion(config, prompt, head, temperature, logger, signal, resolvedThinking, maxTokens, (0, model_1.usesMaxCompletionTokensField)(descriptor));
424
360
  case 'anthropic':
425
- return callAnthropicCompletion(config, prompt, additionalMessages, temperature, logger, tools);
361
+ return callAnthropicCompletion(config, prompt, head, temperature, logger, tools, signal, resolvedThinking, (0, model_1.isAdaptiveThinkingModel)(descriptor, config.model), maxTokens);
426
362
  case 'gemini':
427
- return callGeminiCompletion(config, prompt, additionalMessages, temperature, logger, tools);
363
+ return callGeminiCompletion(config, prompt, head, temperature, logger, tools, signal, resolvedThinking, maxTokens);
428
364
  /* c8 ignore next 4 - defensive coding: exhaustive switch guaranteed by TypeScript */
429
365
  default: {
430
366
  const _exhaustive = descriptor.apiFormat;
@@ -436,28 +372,36 @@ async function callProviderCompletion(params) {
436
372
  // Proxied completion (routes through a backend server)
437
373
  // ============================================================================
438
374
  /**
439
- * Calls the AI completion endpoint on a proxy server instead of calling
440
- * the provider API directly from the browser.
441
- *
442
- * The proxy server handles provider dispatch, CORS, and API key forwarding.
443
- * The request shape mirrors {@link IProviderCompletionParams} but is serialized
444
- * as JSON for the proxy endpoint.
445
- *
446
- * @param proxyUrl - Base URL of the proxy server (e.g. `http://localhost:3001`)
375
+ * Calls the AI completion endpoint on a proxy server instead of calling the
376
+ * provider API directly from the browser. The proxy handles provider dispatch,
377
+ * CORS, and API key forwarding. The request body serializes the unified
378
+ * {@link AiAssist.IChatRequest} shape (`system?` + `messages`). Enforces the same
379
+ * non-empty / trailing-user-turn and image-input invariants as the direct path.
380
+ * @param proxyUrl - Base URL of the proxy server
447
381
  * @param params - Same parameters as {@link callProviderCompletion}
448
- * @returns The completion response, or a failure
449
382
  * @public
450
383
  */
451
384
  async function callProxiedCompletion(proxyUrl, params) {
452
- const { descriptor, apiKey, prompt, additionalMessages, temperature, modelOverride, logger, tools } = params;
385
+ const { descriptor, apiKey, system, messages, temperature, modelOverride, logger, tools, signal, thinking, maxTokens } = params;
386
+ const splitResult = (0, chatRequestBuilders_1.splitChatRequest)(system, messages);
387
+ if (splitResult.isFailure()) {
388
+ return (0, ts_utils_1.fail)(splitResult.message);
389
+ }
390
+ if (splitResult.value.prompt.attachments.length > 0 && !descriptor.acceptsImageInput) {
391
+ return (0, ts_utils_1.fail)(`provider "${descriptor.id}" does not accept image input`);
392
+ }
453
393
  const body = {
454
394
  providerId: descriptor.id,
455
395
  apiKey,
456
- prompt: { system: prompt.system, user: prompt.user },
457
- temperature: temperature !== null && temperature !== void 0 ? temperature : 0.7
396
+ messages: (0, chatRequestBuilders_1.normalizeOutboundMessages)(splitResult.value)
458
397
  };
459
- if (additionalMessages && additionalMessages.length > 0) {
460
- body.additionalMessages = additionalMessages;
398
+ // Temperature is forwarded only when explicitly provided, matching the direct path — the proxy
399
+ // omits it from the upstream request so the provider default applies.
400
+ if (temperature !== undefined) {
401
+ body.temperature = temperature;
402
+ }
403
+ if (system !== undefined) {
404
+ body.system = system;
461
405
  }
462
406
  if (modelOverride !== undefined) {
463
407
  body.modelOverride = modelOverride;
@@ -465,14 +409,21 @@ async function callProxiedCompletion(proxyUrl, params) {
465
409
  if (tools && tools.length > 0) {
466
410
  body.tools = tools;
467
411
  }
412
+ if (thinking !== undefined) {
413
+ body.thinking = thinking;
414
+ }
415
+ // Forwarded only when explicitly provided; the proxy is responsible for mapping it to the
416
+ // correct upstream provider field (see AiAssist.usesMaxCompletionTokensField).
417
+ if (maxTokens !== undefined) {
418
+ body.maxTokens = maxTokens;
419
+ }
468
420
  /* c8 ignore next 1 - optional logger */
469
421
  logger === null || logger === void 0 ? void 0 : logger.info(`AI proxy request: provider=${descriptor.id}, proxy=${proxyUrl}`);
470
422
  const url = `${proxyUrl}/api/ai/completion`;
471
- const jsonResult = await fetchJson(url, {}, body, logger);
423
+ const jsonResult = await (0, http_1.fetchJson)(url, {}, body, logger, signal);
472
424
  if (jsonResult.isFailure()) {
473
425
  return (0, ts_utils_1.fail)(jsonResult.message);
474
426
  }
475
- // Check for error response from proxy
476
427
  const response = jsonResult.value;
477
428
  if (typeof response.error === 'string') {
478
429
  return (0, ts_utils_1.fail)(`proxy: ${response.error}`);
@@ -485,4 +436,4 @@ async function callProxiedCompletion(proxyUrl, params) {
485
436
  truncated: response.truncated === true
486
437
  });
487
438
  }
488
- //# sourceMappingURL=apiClient.js.map
439
+ //# sourceMappingURL=completionClient.js.map