@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 @@
1
+ {"version":3,"file":"imageGenerationClient.js","sourceRoot":"","sources":["../../../src/packlets/ai-assist/imageGenerationClient.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Erik Fortune\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n/**\n * Image generation clients for AI assist. One dispatcher over the resolved\n * `IAiImageModelCapability.format`, the adapters it routes to (OpenAI images,\n * xAI generations and edits, Gemini image-out), their response validators, the\n * base64 attachment helpers only this modality uses, and the proxied variant.\n *\n * @packageDocumentation\n */\n\nimport { type JsonObject } from '@fgv/ts-json-base';\nimport { fail, type Logging, mapResults, Result, succeed, type Validator, Validators } from '@fgv/ts-utils';\n\nimport {\n type IAiGeneratedImage,\n type IAiImageAttachment,\n type IAiImageGenerationParams,\n type IAiImageGenerationResponse,\n type IAiImageModelCapability,\n type IAiProviderDescriptor,\n type ModelSpec,\n resolveProviderModel\n} from './model';\nimport { bearerAuthHeader, geminiAuthHeader, resolveEffectiveBaseUrl } from './endpoint';\nimport { type IAiApiConfig, fetchJson, fetchMultipart } from './http';\nimport { resolveImageCapability, supportsImageGeneration } from './registry';\nimport {\n resolveImageOptions,\n validateResolvedOptions,\n type IResolvedImageOptions\n} from './imageOptionsResolver';\n\n// ============================================================================\n// Image attachment helpers\n// ============================================================================\n\n/**\n * Decodes a base64-encoded image attachment into a `Blob` suitable for use as\n * a multipart file field. On Node hands the `Buffer` straight to `Blob`\n * (Buffer extends Uint8Array) to skip an intermediate copy; falls back to\n * `atob` in browsers. Inputs come from `FileReader` or prior provider\n * responses, which are trusted to be valid. Note that Node's\n * `Buffer.from(..., 'base64')` silently strips invalid characters rather\n * than throwing, so failures are only observable in the browser path.\n * @internal\n */\nfunction attachmentToBlob(attachment: IAiImageAttachment): Result<Blob> {\n if (typeof Buffer !== 'undefined') {\n return succeed(new Blob([Buffer.from(attachment.base64, 'base64')], { type: attachment.mimeType }));\n }\n /* c8 ignore start - Browser-only fallback cannot be tested in Node.js environment */\n try {\n const binary = atob(attachment.base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return succeed(new Blob([bytes], { type: attachment.mimeType }));\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return fail(`Invalid base64: ${message}`);\n }\n /* c8 ignore stop */\n}\n\n/**\n * Maps a MIME type to a sensible file extension for multipart filenames.\n * @internal\n */\nfunction extensionForMimeType(mimeType: string): string {\n switch (mimeType) {\n case 'image/png':\n return 'png';\n case 'image/jpeg':\n case 'image/jpg':\n return 'jpg';\n case 'image/webp':\n return 'webp';\n case 'image/gif':\n return 'gif';\n default:\n return 'bin';\n }\n}\n\n// ============================================================================\n// Image generation — request types\n// ============================================================================\n\n/**\n * Parameters for an image-generation request.\n * @public\n */\nexport interface IProviderImageGenerationParams {\n /** The provider descriptor */\n readonly descriptor: IAiProviderDescriptor;\n /** API key for authentication */\n readonly apiKey: string;\n /** The image-generation request */\n readonly params: IAiImageGenerationParams;\n /** Optional model override — string or context-aware map (uses descriptor.defaultModel.image otherwise) */\n readonly modelOverride?: ModelSpec;\n /** Optional logger for request/response observability. */\n readonly logger?: Logging.ILogger;\n /** Optional abort signal for cancelling the in-flight request. */\n readonly signal?: AbortSignal;\n /** Optional override of the descriptor's base URL; per-route suffix is appended unchanged. */\n readonly endpoint?: string;\n}\n\n// ============================================================================\n// Image generation — response validators\n// ============================================================================\n\n// ---- OpenAI / xAI images format ----\n\n/** @internal */\ninterface IOpenAiImageItem {\n b64_json: string;\n revised_prompt?: string;\n}\n/** @internal */\ninterface IOpenAiImageResponse {\n data: IOpenAiImageItem[];\n}\n\nconst openAiImageItem: Validator<IOpenAiImageItem> = Validators.object<IOpenAiImageItem>({\n b64_json: Validators.string,\n revised_prompt: Validators.string.optional()\n});\nconst openAiImageResponse: Validator<IOpenAiImageResponse> = Validators.object<IOpenAiImageResponse>({\n data: Validators.arrayOf(openAiImageItem).withConstraint((arr) => arr.length > 0)\n});\n\n// ---- Gemini image-out (`:generateContent` returning image parts) format ----\n\n/** @internal */\ninterface IGeminiImageInlineData {\n mimeType: string;\n data: string;\n}\n/** @internal */\ninterface IGeminiImageOutPart {\n text?: string;\n inlineData?: IGeminiImageInlineData;\n}\n/** @internal */\ninterface IGeminiImageOutContent {\n parts: IGeminiImageOutPart[];\n}\n/** @internal */\ninterface IGeminiImageOutCandidate {\n content?: IGeminiImageOutContent;\n finishReason?: string;\n finishMessage?: string;\n}\n/** @internal */\ninterface IGeminiImageOutResponse {\n candidates: IGeminiImageOutCandidate[];\n}\n\nconst geminiImageInlineData: Validator<IGeminiImageInlineData> = Validators.object<IGeminiImageInlineData>({\n mimeType: Validators.string,\n data: Validators.string\n});\nconst geminiImageOutPart: Validator<IGeminiImageOutPart> = Validators.object<IGeminiImageOutPart>({\n text: Validators.string.optional(),\n inlineData: geminiImageInlineData.optional()\n});\nconst geminiImageOutContent: Validator<IGeminiImageOutContent> = Validators.object<IGeminiImageOutContent>({\n parts: Validators.arrayOf(geminiImageOutPart)\n});\nconst geminiImageOutCandidate: Validator<IGeminiImageOutCandidate> =\n Validators.object<IGeminiImageOutCandidate>({\n content: geminiImageOutContent.optional(),\n finishReason: Validators.string.optional(),\n finishMessage: Validators.string.optional()\n });\nconst geminiImageOutResponse: Validator<IGeminiImageOutResponse> = Validators.object<IGeminiImageOutResponse>(\n {\n candidates: Validators.arrayOf(geminiImageOutCandidate).withConstraint((arr) => arr.length > 0)\n }\n);\n\n// ---- Proxied image generation response ----\n\nconst proxiedGeneratedImage: Validator<IAiGeneratedImage> = Validators.object<IAiGeneratedImage>({\n mimeType: Validators.string,\n base64: Validators.string,\n revisedPrompt: Validators.string.optional()\n});\nconst proxiedImageGenerationResponse: Validator<IAiImageGenerationResponse> =\n Validators.object<IAiImageGenerationResponse>({\n images: Validators.arrayOf(proxiedGeneratedImage).withConstraint((arr) => arr.length > 0)\n });\n\n// ============================================================================\n// Image generation — adapters\n// ============================================================================\n\n/** Routes to /images/generations or /images/edits; handles outputParamStyle. @internal */\nasync function callOpenAiImageGeneration(\n config: IAiApiConfig,\n request: IAiImageGenerationParams,\n capability: IAiImageModelCapability,\n resolved: IResolvedImageOptions,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<IAiImageGenerationResponse>> {\n const refs = request.referenceImages ?? [];\n const headers: Record<string, string> = bearerAuthHeader(config.apiKey);\n\n const effectiveMimeType =\n resolved.outputFormat !== undefined\n ? `image/${resolved.outputFormat}`\n : capability.defaultOutputMimeType ?? 'image/png';\n\n const fetched =\n refs.length > 0\n ? await callOpenAiImagesEdits(config, capability, request, headers, resolved, logger, signal)\n : await callOpenAiImagesGenerations(config, request, headers, resolved, capability, logger, signal);\n\n return fetched.onSuccess((json) =>\n openAiImageResponse\n .validate(json)\n .withErrorFormat((msg) => `OpenAI images API response: ${msg}`)\n .onSuccess((response) =>\n succeed({\n images: response.data.map((item) => ({\n mimeType: effectiveMimeType,\n base64: item.b64_json,\n ...(item.revised_prompt !== undefined ? { revisedPrompt: item.revised_prompt } : {})\n }))\n })\n )\n );\n}\n\n/** Builds the JSON /images/generations request; handles outputParamStyle. @internal */\nfunction callOpenAiImagesGenerations(\n config: IAiApiConfig,\n request: IAiImageGenerationParams,\n headers: Record<string, string>,\n resolved: IResolvedImageOptions,\n capability: IAiImageModelCapability,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<JsonObject>> {\n const body: Record<string, unknown> = {\n model: config.model,\n prompt: request.prompt,\n n: resolved.n\n };\n\n // Output format param — conditional on model capability\n if (capability.outputParamStyle === 'response-format') {\n body.response_format = 'b64_json';\n } else if (capability.outputParamStyle === 'output-format') {\n body.output_format = resolved.outputFormat ?? 'png';\n }\n\n if (resolved.size !== undefined) {\n body.size = resolved.size;\n }\n if (capability.supportsQualityParam && resolved.quality !== undefined) {\n body.quality = resolved.quality;\n }\n if (resolved.seed !== undefined) {\n body.seed = resolved.seed;\n }\n if (resolved.background !== undefined) {\n body.background = resolved.background;\n }\n if (resolved.moderation !== undefined) {\n body.moderation = resolved.moderation;\n }\n if (resolved.outputCompression !== undefined) {\n body.output_compression = resolved.outputCompression;\n }\n if (resolved.otherParams !== undefined) {\n Object.assign(body, resolved.otherParams);\n }\n /* c8 ignore next 1 - optional logger */\n logger?.info(`Image generation: model=${config.model}, n=${resolved.n}`);\n return fetchJson(`${config.baseUrl}/images/generations`, headers, body, logger, signal);\n}\n\n/** Builds the multipart /images/edits request with ref images. @internal */\nasync function callOpenAiImagesEdits(\n config: IAiApiConfig,\n capability: IAiImageModelCapability,\n request: IAiImageGenerationParams,\n headers: Record<string, string>,\n resolved: IResolvedImageOptions,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<JsonObject>> {\n const refs = request.referenceImages!; // callers verify refs.length > 0 before calling this function\n const blobsResult = mapResults(\n refs.map((ref, i) => attachmentToBlob(ref).withErrorFormat((msg) => `reference image ${i}: ${msg}`))\n );\n /* c8 ignore next 3 - decode failure unreachable via Node's Buffer.from (silently strips invalid input) */\n if (blobsResult.isFailure()) {\n return fail(blobsResult.message);\n }\n\n const form = new FormData();\n form.append('model', config.model);\n form.append('prompt', request.prompt);\n form.append('n', String(resolved.n));\n if (capability.outputParamStyle !== 'output-format') {\n form.append('response_format', 'b64_json');\n }\n if (resolved.size !== undefined) {\n form.append('size', resolved.size);\n }\n blobsResult.value.forEach((blob, i) => {\n form.append('image[]', blob, `ref-${i}.${extensionForMimeType(refs[i].mimeType)}`);\n });\n /* c8 ignore next 1 - optional logger */\n logger?.info(`Image edit: model=${config.model}, n=${resolved.n}, refs=${refs.length}`);\n return fetchMultipart(`${config.baseUrl}/images/edits`, headers, form, logger, signal);\n}\n\n/** Calls xAI /images/edits with JSON body (not multipart); up to 3 source images. @internal */\nasync function callXaiImagesEdits(\n config: IAiApiConfig,\n request: IAiImageGenerationParams,\n resolved: IResolvedImageOptions,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<JsonObject>> {\n /* c8 ignore next 1 - defensive: referenceImages always defined when this function is called */\n const refs = request.referenceImages ?? [];\n if (refs.length > 3) {\n return fail(`xAI image edits supports at most 3 reference images; got ${refs.length}`);\n }\n const images = refs.map((ref) => ({\n type: 'image_url',\n url: `data:${ref.mimeType};base64,${ref.base64}`\n }));\n\n const body: Record<string, unknown> = {\n model: config.model,\n prompt: request.prompt,\n n: resolved.n,\n response_format: 'b64_json',\n image: images\n };\n if (resolved.aspectRatio !== undefined) {\n body.aspect_ratio = resolved.aspectRatio;\n }\n if (resolved.resolution !== undefined) {\n body.resolution = resolved.resolution;\n }\n if (resolved.otherParams !== undefined) {\n Object.assign(body, resolved.otherParams);\n }\n /* c8 ignore next 1 - optional logger */\n logger?.info(`xAI image edit: model=${config.model}, n=${resolved.n}, refs=${refs.length}`);\n return fetchJson(`${config.baseUrl}/images/edits`, bearerAuthHeader(config.apiKey), body, logger, signal);\n}\n\n/**\n * Normalizes an xAI images API response (OpenAI-shaped) into the provider-neutral\n * generated-image result.\n *\n * @remarks\n * Shared by the generations path and the edits path. These were two independent\n * copies 160 lines apart — identical but for the receiver name — so the\n * `defaultOutputMimeType` fallback and the error prefix each existed twice, and a\n * fix to one would silently have missed the other.\n * @internal\n */\nfunction normalizeXaiImageResponse(\n json: JsonObject,\n capability: IAiImageModelCapability\n): Result<IAiImageGenerationResponse> {\n return openAiImageResponse\n .validate(json)\n .withErrorFormat((msg) => `xAI images API response: ${msg}`)\n .onSuccess((response) =>\n succeed({\n images: response.data.map((item) => ({\n mimeType: capability.defaultOutputMimeType ?? 'image/jpeg',\n base64: item.b64_json\n }))\n })\n );\n}\n\n/** Calls xAI /images/generations; uses aspect_ratio instead of size. @internal */\nasync function callXaiImageGeneration(\n config: IAiApiConfig,\n request: IAiImageGenerationParams,\n capability: IAiImageModelCapability,\n resolved: IResolvedImageOptions,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<IAiImageGenerationResponse>> {\n const headers: Record<string, string> = bearerAuthHeader(config.apiKey);\n const body: Record<string, unknown> = {\n model: config.model,\n prompt: request.prompt,\n n: resolved.n,\n response_format: 'b64_json'\n };\n if (resolved.aspectRatio !== undefined) {\n body.aspect_ratio = resolved.aspectRatio;\n }\n if (resolved.resolution !== undefined) {\n body.resolution = resolved.resolution;\n }\n if (resolved.otherParams !== undefined) {\n Object.assign(body, resolved.otherParams);\n }\n /* c8 ignore next 1 - optional logger */\n logger?.info(`xAI image generation: model=${config.model}, n=${resolved.n}`);\n const fetched = await fetchJson(`${config.baseUrl}/images/generations`, headers, body, logger, signal);\n return fetched.onSuccess((json) => normalizeXaiImageResponse(json, capability));\n}\n\n/**\n * Gemini `finishReason` values that indicate a normal terminal completion rather\n * than a refusal. `STOP` is set on every successful generation (and on completions\n * that return a text part instead of an image); `MAX_TOKENS` is a benign truncation.\n * A candidate carrying only one of these is NOT a decline — treating it as one would\n * mislabel an ordinary no-image outcome as a policy refusal. @internal\n */\nconst benignGeminiImageFinishReasons: ReadonlySet<string> = new Set(['STOP', 'MAX_TOKENS']);\n\n/** Calls Gemini :generateContent for image output; accepts ref images as inlineData. @internal */\nasync function callGeminiImageOutGeneration(\n config: IAiApiConfig,\n request: IAiImageGenerationParams,\n resolved: IResolvedImageOptions,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<IAiImageGenerationResponse>> {\n const url = `${config.baseUrl}/models/${config.model}:generateContent`;\n const refs = request.referenceImages ?? [];\n const parts: Array<Record<string, unknown>> = [{ text: request.prompt }];\n for (const ref of refs) {\n parts.push({ inlineData: { mimeType: ref.mimeType, data: ref.base64 } });\n }\n\n const generationConfig: Record<string, unknown> = {};\n if (resolved.geminiAspectRatio !== undefined) {\n generationConfig.imageConfig = { aspectRatio: resolved.geminiAspectRatio };\n }\n if (resolved.otherParams !== undefined) {\n Object.assign(generationConfig, resolved.otherParams);\n }\n\n const body: Record<string, unknown> = { contents: [{ role: 'user', parts }] };\n if (Object.keys(generationConfig).length > 0) {\n body.generationConfig = generationConfig;\n }\n const headers: Record<string, string> = geminiAuthHeader(config.apiKey);\n\n /* c8 ignore next 1 - optional logger */\n logger?.info(`Gemini image-out: model=${config.model}, refs=${refs.length}`);\n return (await fetchJson(url, headers, body, logger, signal)).onSuccess((json) =>\n geminiImageOutResponse\n .validate(json)\n .withErrorFormat((msg) => `Gemini image API response: ${msg}`)\n .onSuccess((response) => {\n const images: IAiGeneratedImage[] = [];\n for (const candidate of response.candidates) {\n for (const part of candidate.content?.parts ?? []) {\n if (part.inlineData) {\n images.push({\n mimeType: part.inlineData.mimeType,\n base64: part.inlineData.data\n });\n }\n }\n }\n if (images.length === 0) {\n // A candidate with no image parts is a *decline* only when it carries a\n // refusal-shaped finishReason — i.e. present and not a benign terminal reason\n // (`STOP`/`MAX_TOKENS`). A normal completion that emitted text-instead-of-image\n // carries `finishReason: 'STOP'` and must fall through to the no-image message.\n const declined = response.candidates.find(\n (candidate) =>\n candidate.finishReason !== undefined &&\n !benignGeminiImageFinishReasons.has(candidate.finishReason)\n );\n if (declined?.finishReason !== undefined) {\n // Truthiness (not `!== undefined`) so an empty-string finishMessage is treated\n // as \"no message\" and produces no dangling ` — ` separator.\n const suffix = declined.finishMessage ? ` — ${declined.finishMessage}` : '';\n return fail(`Gemini image generation declined: ${declined.finishReason}${suffix}`);\n }\n return fail('Gemini image API response: no image parts in response');\n }\n return succeed({ images });\n })\n );\n}\n\n// ============================================================================\n// Image generation — dispatcher\n// ============================================================================\n\n/**\n * Calls the appropriate image-generation API for a given provider. Routes by the\n * `format` field of the resolved {@link IAiImageModelCapability}:\n * `'openai-images'`, `'xai-images'`, `'xai-images-edits'`, or\n * `'gemini-image-out'`. Rejects up front if `referenceImages` is set but the\n * capability does not declare `acceptsImageReferenceInput`.\n * @param params - Request parameters including descriptor, API key, and prompt\n * @public\n */\nexport async function callProviderImageGeneration(\n params: IProviderImageGenerationParams\n): Promise<Result<IAiImageGenerationResponse>> {\n const { descriptor, apiKey, params: request, modelOverride, logger, signal, endpoint } = params;\n\n if (!supportsImageGeneration(descriptor)) {\n return fail(`provider \"${descriptor.id}\" does not support image generation`);\n }\n const baseUrlResult = resolveEffectiveBaseUrl(descriptor, endpoint);\n if (baseUrlResult.isFailure()) {\n return fail(baseUrlResult.message);\n }\n\n const modelResult = resolveProviderModel(descriptor, modelOverride, 'image');\n if (modelResult.isFailure()) {\n return fail(modelResult.message);\n }\n const model = modelResult.value;\n const capability = resolveImageCapability(descriptor, model);\n if (capability === undefined) {\n return fail(`provider \"${descriptor.id}\" does not support image generation for model \"${model}\"`);\n }\n if ((request.referenceImages?.length ?? 0) > 0 && !capability.acceptsImageReferenceInput) {\n return fail(`model \"${model}\" does not support reference images`);\n }\n\n const resolved = resolveImageOptions(model, capability, request.options);\n const validationResult = validateResolvedOptions(model, capability, resolved);\n if (validationResult.isFailure()) {\n return fail<IAiImageGenerationResponse>(validationResult.message);\n }\n const config: IAiApiConfig = {\n baseUrl: baseUrlResult.value,\n apiKey,\n model\n };\n /* c8 ignore next 6 - optional logger diagnostic output */\n if (logger) {\n logger.info(\n `AI image generation: provider=${descriptor.id}, format=${capability.format}, ` +\n `model=${config.model}`\n );\n }\n\n switch (capability.format) {\n case 'openai-images':\n return callOpenAiImageGeneration(config, request, capability, resolved, logger, signal);\n case 'xai-images':\n return callXaiImageGeneration(config, request, capability, resolved, logger, signal);\n case 'xai-images-edits': {\n const refs = request.referenceImages ?? [];\n if (refs.length > 0) {\n const editsResult = await callXaiImagesEdits(config, request, resolved, logger, signal);\n return editsResult.onSuccess((json) => normalizeXaiImageResponse(json, capability));\n }\n return callXaiImageGeneration(config, request, capability, resolved, logger, signal);\n }\n case 'gemini-image-out':\n return callGeminiImageOutGeneration(config, request, resolved, logger, signal);\n /* c8 ignore next 4 - defensive coding: exhaustive switch guaranteed by TypeScript */\n default: {\n const _exhaustive: never = capability.format;\n return fail(`unsupported image API format: ${String(_exhaustive)}`);\n }\n }\n}\n\n// ============================================================================\n// Proxied image generation\n// ============================================================================\n\n/**\n * Calls the image-generation endpoint on a proxy server instead of calling\n * the provider API directly from the browser.\n * Endpoint: `POST ${proxyUrl}/api/ai/image-generation`. Request body:\n * `{providerId, apiKey, params, modelOverride?}`. The proxy handles descriptor\n * lookup, model resolution, provider dispatch, and response normalization\n * (including repackaging `referenceImages` for the upstream wire format).\n * Error body `{error: string}` is surfaced as `proxy: ${error}`.\n * @param proxyUrl - Base URL of the proxy server\n * @param params - Same parameters as {@link callProviderImageGeneration}\n * @public\n */\nexport async function callProxiedImageGeneration(\n proxyUrl: string,\n params: IProviderImageGenerationParams\n): Promise<Result<IAiImageGenerationResponse>> {\n const { descriptor, apiKey, params: request, modelOverride, logger, signal } = params;\n\n const body: Record<string, unknown> = {\n providerId: descriptor.id,\n apiKey,\n params: request\n };\n if (modelOverride !== undefined) {\n body.modelOverride = modelOverride;\n }\n\n /* c8 ignore next 1 - optional logger */\n logger?.info(`AI image proxy request: provider=${descriptor.id}, proxy=${proxyUrl}`);\n\n const url = `${proxyUrl}/api/ai/image-generation`;\n const jsonResult = await fetchJson(url, {}, body, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n\n const response = jsonResult.value as Record<string, unknown>;\n if (typeof response.error === 'string') {\n return fail(`proxy: ${response.error}`);\n }\n\n return proxiedImageGenerationResponse\n .validate(response)\n .withErrorFormat((msg) => `proxy returned invalid response: ${msg}`);\n}\n"]}
@@ -0,0 +1,193 @@
1
+ // Copyright (c) 2026 Erik Fortune
2
+ //
3
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ // of this software and associated documentation files (the "Software"), to deal
5
+ // in the Software without restriction, including without limitation the rights
6
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ // copies of the Software, and to permit persons to whom the Software is
8
+ // furnished to do so, subject to the following conditions:
9
+ //
10
+ // The above copyright notice and this permission notice shall be included in all
11
+ // copies or substantial portions of the Software.
12
+ //
13
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ // SOFTWARE.
20
+ import { fail, succeed } from '@fgv/ts-utils';
21
+ // ============================================================================
22
+ // Provider lineage helpers
23
+ // ============================================================================
24
+ /** Maps AiImageApiFormat values to the corresponding IModelFamilyConfig provider discriminator. */
25
+ function providerLineageForFormat(format) {
26
+ switch (format) {
27
+ case 'openai-images':
28
+ return 'openai';
29
+ case 'xai-images':
30
+ case 'xai-images-edits':
31
+ return 'xai';
32
+ case 'gemini-image-out':
33
+ return 'google';
34
+ default:
35
+ return undefined;
36
+ }
37
+ }
38
+ // ============================================================================
39
+ // Type guards
40
+ // ============================================================================
41
+ function isGptImageModelOptions(block) {
42
+ return block.provider === 'openai' && block.family === 'gpt-image';
43
+ }
44
+ function isGrokImagineModelOptions(block) {
45
+ return block.provider === 'xai' && block.family === 'grok-imagine';
46
+ }
47
+ function isGeminiFlashImageModelOptions(block) {
48
+ return block.provider === 'google' && block.family === 'gemini-flash-image';
49
+ }
50
+ function isOtherModelOptions(block) {
51
+ return block.provider === 'other';
52
+ }
53
+ // ============================================================================
54
+ // Merge logic
55
+ // ============================================================================
56
+ /**
57
+ * Resolves the merged image options for a given model and capability.
58
+ *
59
+ * @remarks
60
+ * **Merge precedence (later wins):**
61
+ * 1. Generic top-level options (size, count, quality, seed)
62
+ * 2. Family-generic blocks (models field omitted, provider matches)
63
+ * 3. Model-specific blocks (models array includes the resolved model name)
64
+ * 4. Other blocks (provider: 'other', models array includes model name)
65
+ *
66
+ * Provider-mismatch blocks are silently skipped.
67
+ *
68
+ * Within each tier, declaration order — later declaration wins.
69
+ *
70
+ * @param modelId - The resolved model string
71
+ * @param capability - The resolved IAiImageModelCapability for this model
72
+ * @param options - Caller-supplied options
73
+ * @returns The merged wire parameters
74
+ * @public
75
+ */
76
+ export function resolveImageOptions(modelId, capability, options) {
77
+ var _a, _b;
78
+ const opts = options !== null && options !== void 0 ? options : {};
79
+ const lineage = providerLineageForFormat(capability.format);
80
+ // Start from generic top-level
81
+ let resolved = Object.assign(Object.assign(Object.assign({ n: (_a = opts.count) !== null && _a !== void 0 ? _a : 1 }, (opts.size !== undefined ? { size: opts.size } : {})), (opts.quality !== undefined ? { quality: opts.quality } : {})), (opts.seed !== undefined ? { seed: opts.seed } : {}));
82
+ const modelBlocks = (_b = opts.models) !== null && _b !== void 0 ? _b : [];
83
+ // Tier 2: family-generic blocks (models field omitted, provider matches lineage)
84
+ for (const block of modelBlocks) {
85
+ if (block.provider !== lineage && block.provider !== 'other')
86
+ continue;
87
+ if (block.provider === 'other')
88
+ continue; // other blocks handled in tier 4
89
+ if (!isApplicableBlock(block, modelId))
90
+ continue;
91
+ if (!isFamilyGenericBlock(block))
92
+ continue;
93
+ resolved = applyBlock(resolved, block);
94
+ }
95
+ // Tier 3: model-specific blocks (models array includes this model)
96
+ for (const block of modelBlocks) {
97
+ if (block.provider !== lineage && block.provider !== 'other')
98
+ continue;
99
+ if (block.provider === 'other')
100
+ continue;
101
+ if (!isApplicableBlock(block, modelId))
102
+ continue;
103
+ if (isFamilyGenericBlock(block))
104
+ continue;
105
+ resolved = applyBlock(resolved, block);
106
+ }
107
+ // Tier 4: Other blocks (same precedence as model-specific)
108
+ for (const block of modelBlocks) {
109
+ if (!isOtherModelOptions(block))
110
+ continue;
111
+ if (!block.models.includes(modelId))
112
+ continue;
113
+ resolved = applyOtherBlock(resolved, block);
114
+ }
115
+ return resolved;
116
+ }
117
+ function isApplicableBlock(block, modelId) {
118
+ /* c8 ignore next 3 - defensive coding: other blocks are filtered before isApplicableBlock is called */
119
+ if (isOtherModelOptions(block)) {
120
+ return block.models.includes(modelId);
121
+ }
122
+ // Has models array? Must include this modelId.
123
+ const named = block;
124
+ if (named.models !== undefined && named.models.length > 0) {
125
+ return named.models.includes(modelId);
126
+ }
127
+ // No models array = family-generic = applies to all in this family
128
+ return true;
129
+ }
130
+ function isFamilyGenericBlock(block) {
131
+ /* c8 ignore next 1 - defensive coding: other blocks are filtered before isFamilyGenericBlock is called */
132
+ if (isOtherModelOptions(block))
133
+ return false;
134
+ const named = block;
135
+ return named.models === undefined || named.models.length === 0;
136
+ }
137
+ function applyBlock(resolved, block) {
138
+ if (isGptImageModelOptions(block)) {
139
+ return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, resolved), (block.config.size !== undefined ? { size: block.config.size } : {})), (block.config.quality !== undefined ? { quality: block.config.quality } : {})), (block.config.outputFormat !== undefined ? { outputFormat: block.config.outputFormat } : {})), (block.config.outputCompression !== undefined
140
+ ? { outputCompression: block.config.outputCompression }
141
+ : {})), (block.config.background !== undefined ? { background: block.config.background } : {})), (block.config.moderation !== undefined ? { moderation: block.config.moderation } : {}));
142
+ }
143
+ if (isGrokImagineModelOptions(block)) {
144
+ return Object.assign(Object.assign(Object.assign({}, resolved), (block.config.aspectRatio !== undefined ? { aspectRatio: block.config.aspectRatio } : {})), (block.config.resolution !== undefined ? { resolution: block.config.resolution } : {}));
145
+ }
146
+ if (isGeminiFlashImageModelOptions(block)) {
147
+ return Object.assign(Object.assign({}, resolved), (block.config.aspectRatio !== undefined ? { geminiAspectRatio: block.config.aspectRatio } : {}));
148
+ }
149
+ /* c8 ignore next 2 - defensive coding: exhaustive union, all family types handled above */
150
+ return resolved;
151
+ }
152
+ function applyOtherBlock(resolved, block) {
153
+ var _a;
154
+ return Object.assign(Object.assign({}, resolved), { otherParams: Object.assign(Object.assign({}, ((_a = resolved.otherParams) !== null && _a !== void 0 ? _a : {})), block.config) });
155
+ }
156
+ // ============================================================================
157
+ // Runtime validation
158
+ // ============================================================================
159
+ /**
160
+ * Validates the resolved options against per-model registry constraints.
161
+ *
162
+ * @remarks
163
+ * Fails fast on the first violation. Error format:
164
+ * `model "${model}": ${field} "${value}" is not accepted; accepted values: ${JSON.stringify(accepted)}`
165
+ *
166
+ * @param modelId - The resolved model string
167
+ * @param capability - The resolved capability entry from the registry
168
+ * @param resolved - The merged options from resolveImageOptions
169
+ * @returns The same resolved options on success, or a failure with a contextual message
170
+ * @public
171
+ */
172
+ export function validateResolvedOptions(modelId, capability, resolved) {
173
+ // Validate count
174
+ if (capability.maxCount !== undefined && resolved.n > capability.maxCount) {
175
+ return fail(`model "${modelId}": count ${resolved.n} exceeds maximum of ${capability.maxCount}`);
176
+ }
177
+ // Validate size
178
+ if (capability.acceptedSizes !== undefined && resolved.size !== undefined) {
179
+ if (!capability.acceptedSizes.includes(resolved.size)) {
180
+ return fail(`model "${modelId}": size "${resolved.size}" is not accepted; accepted values: ${JSON.stringify(capability.acceptedSizes)}`);
181
+ }
182
+ }
183
+ // Validate quality
184
+ if (capability.supportsQualityParam &&
185
+ capability.acceptedQualities !== undefined &&
186
+ resolved.quality !== undefined) {
187
+ if (!capability.acceptedQualities.includes(resolved.quality)) {
188
+ return fail(`model "${modelId}": quality "${resolved.quality}" is not accepted; accepted values: ${JSON.stringify(capability.acceptedQualities)}`);
189
+ }
190
+ }
191
+ return succeed(resolved);
192
+ }
193
+ //# sourceMappingURL=imageOptionsResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageOptionsResolver.js","sourceRoot":"","sources":["../../../src/packlets/ai-assist/imageOptionsResolver.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Erik Fortune\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n/**\n * Merge logic and runtime validation for image generation options.\n * @packageDocumentation\n */\n\nimport { type JsonObject } from '@fgv/ts-json-base';\nimport { fail, Result, succeed } from '@fgv/ts-utils';\n\nimport type {\n IAiImageModelCapability,\n IAiImageGenerationOptions,\n IModelFamilyConfig,\n INamedModelFamilyConfig,\n IGptImageModelOptions,\n IGrokImagineModelOptions,\n IGeminiFlashImageModelOptions,\n IOtherModelOptions\n} from './model';\n\n// ============================================================================\n// Provider lineage helpers\n// ============================================================================\n\n/** Maps AiImageApiFormat values to the corresponding IModelFamilyConfig provider discriminator. */\nfunction providerLineageForFormat(format: string): 'openai' | 'xai' | 'google' | 'other' | undefined {\n switch (format) {\n case 'openai-images':\n return 'openai';\n case 'xai-images':\n case 'xai-images-edits':\n return 'xai';\n case 'gemini-image-out':\n return 'google';\n default:\n return undefined;\n }\n}\n\n// ============================================================================\n// Type guards\n// ============================================================================\n\nfunction isGptImageModelOptions(block: IModelFamilyConfig): block is IGptImageModelOptions {\n return block.provider === 'openai' && block.family === 'gpt-image';\n}\n\nfunction isGrokImagineModelOptions(block: IModelFamilyConfig): block is IGrokImagineModelOptions {\n return block.provider === 'xai' && block.family === 'grok-imagine';\n}\n\nfunction isGeminiFlashImageModelOptions(block: IModelFamilyConfig): block is IGeminiFlashImageModelOptions {\n return block.provider === 'google' && block.family === 'gemini-flash-image';\n}\n\nfunction isOtherModelOptions(block: IModelFamilyConfig): block is IOtherModelOptions {\n return block.provider === 'other';\n}\n\n// ============================================================================\n// Resolved wire shape\n// ============================================================================\n\n/**\n * The resolved, merged wire parameters for an image generation request.\n * Built from the layered options and ready for provider-specific encoding.\n * @public\n */\nexport interface IResolvedImageOptions {\n /** Number of images to generate. */\n readonly n: number;\n /** Image size (OpenAI-style pixel strings). */\n readonly size?: string;\n /** Quality tier. */\n readonly quality?: string;\n /** Seed for reproducibility. */\n readonly seed?: number;\n // GptImage-specific\n readonly outputFormat?: string;\n readonly outputCompression?: number;\n readonly background?: string;\n readonly moderation?: string;\n // xAI-specific\n readonly aspectRatio?: string;\n readonly resolution?: string;\n // Gemini Flash-specific\n readonly geminiAspectRatio?: string;\n // Other-block passthroughs (merged at model-specific tier)\n readonly otherParams?: JsonObject;\n}\n\n// ============================================================================\n// Merge logic\n// ============================================================================\n\n/**\n * Resolves the merged image options for a given model and capability.\n *\n * @remarks\n * **Merge precedence (later wins):**\n * 1. Generic top-level options (size, count, quality, seed)\n * 2. Family-generic blocks (models field omitted, provider matches)\n * 3. Model-specific blocks (models array includes the resolved model name)\n * 4. Other blocks (provider: 'other', models array includes model name)\n *\n * Provider-mismatch blocks are silently skipped.\n *\n * Within each tier, declaration order — later declaration wins.\n *\n * @param modelId - The resolved model string\n * @param capability - The resolved IAiImageModelCapability for this model\n * @param options - Caller-supplied options\n * @returns The merged wire parameters\n * @public\n */\nexport function resolveImageOptions(\n modelId: string,\n capability: IAiImageModelCapability,\n options: IAiImageGenerationOptions | undefined\n): IResolvedImageOptions {\n const opts = options ?? {};\n const lineage = providerLineageForFormat(capability.format);\n\n // Start from generic top-level\n let resolved: IResolvedImageOptions = {\n n: opts.count ?? 1,\n ...(opts.size !== undefined ? { size: opts.size } : {}),\n ...(opts.quality !== undefined ? { quality: opts.quality } : {}),\n ...(opts.seed !== undefined ? { seed: opts.seed } : {})\n };\n\n const modelBlocks = opts.models ?? [];\n\n // Tier 2: family-generic blocks (models field omitted, provider matches lineage)\n for (const block of modelBlocks) {\n if (block.provider !== lineage && block.provider !== 'other') continue;\n if (block.provider === 'other') continue; // other blocks handled in tier 4\n if (!isApplicableBlock(block, modelId)) continue;\n if (!isFamilyGenericBlock(block)) continue;\n resolved = applyBlock(resolved, block);\n }\n\n // Tier 3: model-specific blocks (models array includes this model)\n for (const block of modelBlocks) {\n if (block.provider !== lineage && block.provider !== 'other') continue;\n if (block.provider === 'other') continue;\n if (!isApplicableBlock(block, modelId)) continue;\n if (isFamilyGenericBlock(block)) continue;\n resolved = applyBlock(resolved, block);\n }\n\n // Tier 4: Other blocks (same precedence as model-specific)\n for (const block of modelBlocks) {\n if (!isOtherModelOptions(block)) continue;\n if (!block.models.includes(modelId)) continue;\n resolved = applyOtherBlock(resolved, block);\n }\n\n return resolved;\n}\n\nfunction isApplicableBlock(block: IModelFamilyConfig, modelId: string): boolean {\n /* c8 ignore next 3 - defensive coding: other blocks are filtered before isApplicableBlock is called */\n if (isOtherModelOptions(block)) {\n return block.models.includes(modelId);\n }\n // Has models array? Must include this modelId.\n const named = block as INamedModelFamilyConfig;\n if (named.models !== undefined && named.models.length > 0) {\n return named.models.includes(modelId);\n }\n // No models array = family-generic = applies to all in this family\n return true;\n}\n\nfunction isFamilyGenericBlock(block: IModelFamilyConfig): boolean {\n /* c8 ignore next 1 - defensive coding: other blocks are filtered before isFamilyGenericBlock is called */\n if (isOtherModelOptions(block)) return false;\n const named = block as INamedModelFamilyConfig;\n return named.models === undefined || named.models.length === 0;\n}\n\nfunction applyBlock(resolved: IResolvedImageOptions, block: IModelFamilyConfig): IResolvedImageOptions {\n if (isGptImageModelOptions(block)) {\n return {\n ...resolved,\n ...(block.config.size !== undefined ? { size: block.config.size } : {}),\n ...(block.config.quality !== undefined ? { quality: block.config.quality } : {}),\n ...(block.config.outputFormat !== undefined ? { outputFormat: block.config.outputFormat } : {}),\n ...(block.config.outputCompression !== undefined\n ? { outputCompression: block.config.outputCompression }\n : {}),\n ...(block.config.background !== undefined ? { background: block.config.background } : {}),\n ...(block.config.moderation !== undefined ? { moderation: block.config.moderation } : {})\n };\n }\n if (isGrokImagineModelOptions(block)) {\n return {\n ...resolved,\n ...(block.config.aspectRatio !== undefined ? { aspectRatio: block.config.aspectRatio } : {}),\n ...(block.config.resolution !== undefined ? { resolution: block.config.resolution } : {})\n };\n }\n if (isGeminiFlashImageModelOptions(block)) {\n return {\n ...resolved,\n ...(block.config.aspectRatio !== undefined ? { geminiAspectRatio: block.config.aspectRatio } : {})\n };\n }\n /* c8 ignore next 2 - defensive coding: exhaustive union, all family types handled above */\n return resolved;\n}\n\nfunction applyOtherBlock(resolved: IResolvedImageOptions, block: IOtherModelOptions): IResolvedImageOptions {\n return {\n ...resolved,\n otherParams: { ...(resolved.otherParams ?? {}), ...block.config }\n };\n}\n\n// ============================================================================\n// Runtime validation\n// ============================================================================\n\n/**\n * Validates the resolved options against per-model registry constraints.\n *\n * @remarks\n * Fails fast on the first violation. Error format:\n * `model \"${model}\": ${field} \"${value}\" is not accepted; accepted values: ${JSON.stringify(accepted)}`\n *\n * @param modelId - The resolved model string\n * @param capability - The resolved capability entry from the registry\n * @param resolved - The merged options from resolveImageOptions\n * @returns The same resolved options on success, or a failure with a contextual message\n * @public\n */\nexport function validateResolvedOptions(\n modelId: string,\n capability: IAiImageModelCapability,\n resolved: IResolvedImageOptions\n): Result<IResolvedImageOptions> {\n // Validate count\n if (capability.maxCount !== undefined && resolved.n > capability.maxCount) {\n return fail(`model \"${modelId}\": count ${resolved.n} exceeds maximum of ${capability.maxCount}`);\n }\n\n // Validate size\n if (capability.acceptedSizes !== undefined && resolved.size !== undefined) {\n if (!capability.acceptedSizes.includes(resolved.size)) {\n return fail(\n `model \"${modelId}\": size \"${resolved.size}\" is not accepted; accepted values: ${JSON.stringify(\n capability.acceptedSizes\n )}`\n );\n }\n }\n\n // Validate quality\n if (\n capability.supportsQualityParam &&\n capability.acceptedQualities !== undefined &&\n resolved.quality !== undefined\n ) {\n if (!capability.acceptedQualities.includes(resolved.quality)) {\n return fail(\n `model \"${modelId}\": quality \"${resolved.quality}\" is not accepted; accepted values: ${JSON.stringify(\n capability.acceptedQualities\n )}`\n );\n }\n }\n\n return succeed(resolved);\n}\n"]}
@@ -2,9 +2,17 @@
2
2
  * AI assist packlet - provider registry, prompt class, settings, and API client.
3
3
  * @packageDocumentation
4
4
  */
5
- export { AiPrompt, DEFAULT_AI_ASSIST, allModelSpecKeys, MODEL_SPEC_BASE_KEY, resolveModel } from './model';
6
- export { allProviderIds, getProviderDescriptors, getProviderDescriptor } from './registry';
7
- export { callProviderCompletion, callProxiedCompletion } from './apiClient';
8
- export { aiProviderId, aiServerToolType, aiWebSearchToolConfig, aiServerToolConfig, aiToolEnablement, aiAssistProviderConfig, aiAssistSettings, modelSpecKey, modelSpec } from './converters';
5
+ export { AiPrompt, allModelCapabilities, DEFAULT_ANTHROPIC_MAX_TOKENS, DEFAULT_AI_ASSIST, providerApiKeySecretName, allModelSpecKeys, MODEL_SPEC_BASE_KEY, resolveModel, MODEL_ALIAS_SIGIL, resolveModelAlias, resolveProviderModel, isResponsesOnlyModel, isAdaptiveThinkingModel, usesMaxCompletionTokensField, toDataUrl } from './model';
6
+ export { resolveImageOptions, validateResolvedOptions } from './imageOptionsResolver';
7
+ export { allProviderIds, getProviderDescriptors, getProviderDescriptor, resolveImageCapability, supportsImageGeneration, resolveEmbeddingCapability, supportsEmbedding, DEFAULT_MODEL_CAPABILITY_CONFIG } from './registry';
8
+ export { callProviderCompletion, callProxiedCompletion } from './completionClient';
9
+ export { callProviderImageGeneration, callProxiedImageGeneration } from './imageGenerationClient';
10
+ export { callProviderListModels, callProxiedListModels } from './listModelsClient';
11
+ export { callProviderEmbedding, callProxiedEmbedding } from './embeddingClient';
12
+ export { callProviderCompletionStream, callProxiedCompletionStream, executeClientToolTurn } from './streamingClient';
13
+ export { aiProviderId, aiServerToolType, aiWebSearchToolConfig, aiServerToolConfig, aiToolAnnotations, aiClientToolConfig, aiToolEnablement, aiAssistProviderConfig, aiAssistSettings, modelSpecKey, modelSpec } from './converters';
9
14
  export { resolveEffectiveTools } from './toolFormats';
15
+ export { classifyJsonParseFailure, extractJsonText, fencedStringifiedJson } from './jsonResponse';
16
+ export { generateJsonCompletion, SMART_JSON_PROMPT_HINT } from './jsonCompletion';
17
+ export { anthropicEffortToBudgetTokens } from './thinkingOptionsResolver';
10
18
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/packlets/ai-assist/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,QAAQ,EAER,oBAAoB,EAcpB,4BAA4B,EAe5B,iBAAiB,EAEjB,wBAAwB,EAoCxB,gBAAgB,EAChB,mBAAmB,EACnB,YAAY,EAEZ,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,4BAA4B,EAC5B,SAAS,EAiBV,MAAM,SAAS,CAAC;AAEjB,OAAO,EAEL,mBAAmB,EACnB,uBAAuB,EACxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,iBAAiB,EACjB,+BAA+B,EAChC,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EAEtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAE3B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EAEtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EAErB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,4BAA4B,EAC5B,2BAA2B,EAE3B,qBAAqB,EAItB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACV,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,qBAAqB,EAKtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EAIvB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,6BAA6B,EAAgC,MAAM,2BAA2B,CAAC","sourcesContent":["/**\n * AI assist packlet - provider registry, prompt class, settings, and API client.\n * @packageDocumentation\n */\n\nexport {\n AiPrompt,\n type AiModelCapability,\n allModelCapabilities,\n type AiProviderId,\n type AiServerToolType,\n type AiServerToolConfig,\n type AiToolConfig,\n type IAiWebSearchToolConfig,\n type IAiClientToolConfig,\n type IAiToolAnnotations,\n type IAiClientTool,\n type IAiClientToolCallSummary,\n type IAiClientToolContinuation,\n type IAiClientToolTurnResult,\n type IAiToolEnablement,\n type IAiCompletionResponse,\n DEFAULT_ANTHROPIC_MAX_TOKENS,\n type IChatMessage,\n type IChatRequest,\n type AiApiFormat,\n type AiImageApiFormat,\n type AiEmbeddingApiFormat,\n type AiEmbeddingTaskType,\n type IAiEmbeddingModelCapability,\n type IAiEmbeddingParams,\n type IAiEmbeddingUsage,\n type IAiEmbeddingResult,\n type IAiImageModelCapability,\n type IAiProviderDescriptor,\n type IAiAssistProviderConfig,\n type IAiAssistSettings,\n DEFAULT_AI_ASSIST,\n type IAiAssistKeyStore,\n providerApiKeySecretName,\n type IAiImageAttachment,\n type IAiImageData,\n type AiImageSize,\n type AiImageQuality,\n type GptImageSize,\n type GptImageQuality,\n type GptImageModelNames,\n type GrokImagineModelNames,\n type GeminiFlashImageModelNames,\n type IGptImageGenerationConfig,\n type IGrokImagineImageGenerationConfig,\n type IGeminiFlashImageGenerationConfig,\n type IGptImageModelOptions,\n type IGrokImagineModelOptions,\n type IGeminiFlashImageModelOptions,\n type IOtherModelOptions,\n type IModelFamilyConfig,\n type IAiImageGenerationOptions,\n type IAiImageGenerationParams,\n type IAiGeneratedImage,\n type IAiImageGenerationResponse,\n type IAiModelCapabilityRule,\n type IAiModelCapabilityConfig,\n type IAiModelInfo,\n type IAiStreamEvent,\n type IAiStreamTextDelta,\n type IAiStreamToolEvent,\n type IAiStreamToolUseStart,\n type IAiStreamToolUseDelta,\n type IAiStreamToolUseComplete,\n type IAiStreamDone,\n type IAiStreamError,\n type ModelSpec,\n type ModelSpecKey,\n type IModelSpecMap,\n allModelSpecKeys,\n MODEL_SPEC_BASE_KEY,\n resolveModel,\n type IModelAliasMap,\n MODEL_ALIAS_SIGIL,\n resolveModelAlias,\n resolveProviderModel,\n isResponsesOnlyModel,\n isAdaptiveThinkingModel,\n usesMaxCompletionTokensField,\n toDataUrl,\n type AiThinkingMode,\n type IThinkingConfig,\n type IThinkingProviderConfig,\n type IAnthropicThinkingOptions,\n type IOpenAiThinkingOptions,\n type IGeminiThinkingOptions,\n type IXAiThinkingOptions,\n type IOtherThinkingOptions,\n type IAnthropicThinkingConfig,\n type IOpenAiThinkingConfig,\n type IGeminiThinkingConfig,\n type IXAiThinkingConfig,\n type AnthropicThinkingModelNames,\n type OpenAiThinkingModelNames,\n type GeminiThinkingModelNames,\n type XAiThinkingModelNames\n} from './model';\n\nexport {\n type IResolvedImageOptions,\n resolveImageOptions,\n validateResolvedOptions\n} from './imageOptionsResolver';\n\nexport {\n allProviderIds,\n getProviderDescriptors,\n getProviderDescriptor,\n resolveImageCapability,\n supportsImageGeneration,\n resolveEmbeddingCapability,\n supportsEmbedding,\n DEFAULT_MODEL_CAPABILITY_CONFIG\n} from './registry';\n\nexport {\n callProviderCompletion,\n callProxiedCompletion,\n type IProviderCompletionParams\n} from './completionClient';\n\nexport {\n callProviderImageGeneration,\n callProxiedImageGeneration,\n type IProviderImageGenerationParams\n} from './imageGenerationClient';\n\nexport {\n callProviderListModels,\n callProxiedListModels,\n type IProviderListModelsParams\n} from './listModelsClient';\n\nexport {\n callProviderEmbedding,\n callProxiedEmbedding,\n type IProviderEmbeddingParams\n} from './embeddingClient';\n\nexport {\n callProviderCompletionStream,\n callProxiedCompletionStream,\n type IProviderCompletionStreamParams,\n executeClientToolTurn,\n type IExecuteClientToolTurnParams,\n type IExecuteClientToolTurnResult,\n type IToolExecutionDecision\n} from './streamingClient';\n\nexport {\n aiProviderId,\n aiServerToolType,\n aiWebSearchToolConfig,\n aiServerToolConfig,\n aiToolAnnotations,\n aiClientToolConfig,\n aiToolEnablement,\n aiAssistProviderConfig,\n aiAssistSettings,\n modelSpecKey,\n modelSpec\n} from './converters';\n\nexport { resolveEffectiveTools } from './toolFormats';\n\nexport {\n classifyJsonParseFailure,\n extractJsonText,\n fencedStringifiedJson,\n type IFencedStringifiedJsonExtractorOptions,\n type IFencedStringifiedJsonOptions,\n type JsonParseFailureReason,\n type JsonTextExtractor\n} from './jsonResponse';\n\nexport {\n generateJsonCompletion,\n SMART_JSON_PROMPT_HINT,\n type IGenerateJsonCompletionParams,\n type IGenerateJsonCompletionResult,\n type JsonPromptHint\n} from './jsonCompletion';\n\nexport { anthropicEffortToBudgetTokens, type IResolvedThinkingConfig } from './thinkingOptionsResolver';\n"]}
@@ -0,0 +1,93 @@
1
+ // Copyright (c) 2026 Erik Fortune
2
+ //
3
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ // of this software and associated documentation files (the "Software"), to deal
5
+ // in the Software without restriction, including without limitation the rights
6
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ // copies of the Software, and to permit persons to whom the Software is
8
+ // furnished to do so, subject to the following conditions:
9
+ //
10
+ // The above copyright notice and this permission notice shall be included in all
11
+ // copies or substantial portions of the Software.
12
+ //
13
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ // SOFTWARE.
20
+ var __rest = (this && this.__rest) || function (s, e) {
21
+ var t = {};
22
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
23
+ t[p] = s[p];
24
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
25
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
26
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
27
+ t[p[i]] = s[p[i]];
28
+ }
29
+ return t;
30
+ };
31
+ /**
32
+ * `generateJsonCompletion<T>` — request a JSON-shaped completion from any
33
+ * provider supported by AiAssist and validate it against a caller-supplied
34
+ * `Converter<T>` or `Validator<T>`. Wraps fence/preamble tolerance + parsing +
35
+ * validation into a single call so consumers don't reinvent the pipeline.
36
+ *
37
+ * @packageDocumentation
38
+ */
39
+ import { fail, succeed } from '@fgv/ts-utils';
40
+ import { callProviderCompletion } from './completionClient';
41
+ import { fencedStringifiedJson } from './jsonResponse';
42
+ /**
43
+ * Default system-prompt suffix appended when {@link AiAssist.IGenerateJsonCompletionParams.promptHint}
44
+ * is `'smart'` (the default). Designed to discourage code fences and prose in
45
+ * the model's response while still tolerating them via the read-side extractor.
46
+ * @public
47
+ */
48
+ export const SMART_JSON_PROMPT_HINT = 'Respond with raw JSON only — no Markdown code fences, no explanatory prose, ' +
49
+ 'no preamble or trailing commentary. The response must parse with JSON.parse.';
50
+ function applyPromptHint(system, hint) {
51
+ if (hint === 'none') {
52
+ return system;
53
+ }
54
+ const suffix = hint === 'smart' ? SMART_JSON_PROMPT_HINT : hint;
55
+ return system !== undefined && system.length > 0 ? `${system}\n\n${suffix}` : suffix;
56
+ }
57
+ /**
58
+ * Calls {@link AiAssist.callProviderCompletion}, then runs the response text
59
+ * through a tolerant JSON converter (default:
60
+ * {@link AiAssist.fencedStringifiedJson}) and the caller's
61
+ * `converter`/`validator`. Returns the validated value plus the raw text and
62
+ * underlying completion response for diagnostics.
63
+ *
64
+ * @remarks
65
+ * The default smart prompt hint asks the model to emit raw JSON. The read-side
66
+ * extractor still tolerates fences and prose, so models that ignore the hint
67
+ * are still handled.
68
+ *
69
+ * Either `converter` or `jsonConverter` must be provided; passing both lets
70
+ * `jsonConverter` win.
71
+ *
72
+ * @param params - Provider parameters plus JSON validation options.
73
+ * @returns The validated value, the raw text, and the underlying response.
74
+ * @public
75
+ */
76
+ export async function generateJsonCompletion(params) {
77
+ const { converter, jsonConverter, promptHint = 'smart', system } = params, rest = __rest(params, ["converter", "jsonConverter", "promptHint", "system"]);
78
+ if (jsonConverter === undefined && converter === undefined) {
79
+ return fail('generateJsonCompletion: either converter or jsonConverter must be provided.');
80
+ }
81
+ const pipeline = jsonConverter !== null && jsonConverter !== void 0 ? jsonConverter : fencedStringifiedJson({ inner: converter });
82
+ const augmentedSystem = applyPromptHint(system, promptHint);
83
+ const response = await callProviderCompletion(Object.assign(Object.assign({}, rest), { system: augmentedSystem }));
84
+ if (response.isFailure()) {
85
+ return fail(response.message);
86
+ }
87
+ const completion = response.value;
88
+ return pipeline
89
+ .convert(completion.content)
90
+ .withErrorFormat((msg) => `generateJsonCompletion: ${msg}`)
91
+ .onSuccess((value) => succeed({ value, raw: completion.content, response: completion }));
92
+ }
93
+ //# sourceMappingURL=jsonCompletion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonCompletion.js","sourceRoot":"","sources":["../../../src/packlets/ai-assist/jsonCompletion.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,EAAE;AACF,+EAA+E;AAC/E,gFAAgF;AAChF,+EAA+E;AAC/E,4EAA4E;AAC5E,wEAAwE;AACxE,2DAA2D;AAC3D,EAAE;AACF,iFAAiF;AACjF,kDAAkD;AAClD,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAC3E,8EAA8E;AAC9E,yEAAyE;AACzE,gFAAgF;AAChF,gFAAgF;AAChF,YAAY;;;;;;;;;;;;AAEZ;;;;;;;GAOG;AAEH,OAAO,EAAkB,IAAI,EAAU,OAAO,EAAkB,MAAM,eAAe,CAAC;AAEtF,OAAO,EAAE,sBAAsB,EAAkC,MAAM,oBAAoB,CAAC;AAC5F,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAGvD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GACjC,8EAA8E;IAC9E,8EAA8E,CAAC;AA6DjF,SAAS,eAAe,CAAC,MAA0B,EAAE,IAAoB;IACvE,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,OAAO,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AACvF,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAwC;IAExC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,GAAG,OAAO,EAAE,MAAM,KAAc,MAAM,EAAf,IAAI,UAAK,MAAM,EAA5E,sDAAmE,CAAS,CAAC;IAEnF,IAAI,aAAa,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC3D,OAAO,IAAI,CAAC,6EAA6E,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,QAAQ,GAAiB,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,qBAAqB,CAAI,EAAE,KAAK,EAAE,SAAU,EAAE,CAAC,CAAC;IAChG,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAE5D,MAAM,QAAQ,GAAG,MAAM,sBAAsB,iCAAM,IAAI,KAAE,MAAM,EAAE,eAAe,IAAG,CAAC;IACpF,IAAI,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC;IAElC,OAAO,QAAQ;SACZ,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;SAC3B,eAAe,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,2BAA2B,GAAG,EAAE,CAAC;SAC1D,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;AAC7F,CAAC","sourcesContent":["// Copyright (c) 2026 Erik Fortune\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n/**\n * `generateJsonCompletion<T>` — request a JSON-shaped completion from any\n * provider supported by AiAssist and validate it against a caller-supplied\n * `Converter<T>` or `Validator<T>`. Wraps fence/preamble tolerance + parsing +\n * validation into a single call so consumers don't reinvent the pipeline.\n *\n * @packageDocumentation\n */\n\nimport { type Converter, fail, Result, succeed, type Validator } from '@fgv/ts-utils';\n\nimport { callProviderCompletion, type IProviderCompletionParams } from './completionClient';\nimport { fencedStringifiedJson } from './jsonResponse';\nimport { type IAiCompletionResponse } from './model';\n\n/**\n * Default system-prompt suffix appended when {@link AiAssist.IGenerateJsonCompletionParams.promptHint}\n * is `'smart'` (the default). Designed to discourage code fences and prose in\n * the model's response while still tolerating them via the read-side extractor.\n * @public\n */\nexport const SMART_JSON_PROMPT_HINT: string =\n 'Respond with raw JSON only — no Markdown code fences, no explanatory prose, ' +\n 'no preamble or trailing commentary. The response must parse with JSON.parse.';\n\n/**\n * Controls the optional system-prompt augmentation applied by\n * {@link AiAssist.generateJsonCompletion}.\n *\n * - `'smart'` (default): append {@link AiAssist.SMART_JSON_PROMPT_HINT}.\n * - `'none'`: do not modify the prompt.\n * - A string: append the supplied text verbatim.\n *\n * @remarks\n * The `string & {}` branch is the standard TypeScript trick that prevents\n * the literal members from being widened away — callers still get\n * autocomplete for `'smart'` and `'none'` while accepting any string.\n *\n * @public\n */\nexport type JsonPromptHint = 'smart' | 'none' | (string & {});\n\n/**\n * Parameters for {@link AiAssist.generateJsonCompletion}. Extends\n * {@link AiAssist.IProviderCompletionParams} with JSON-validation knobs.\n * @public\n */\nexport interface IGenerateJsonCompletionParams<T> extends IProviderCompletionParams {\n /**\n * Caller-supplied `Converter<T>` or `Validator<T>` applied to the parsed\n * JSON value. Wrapped internally in {@link AiAssist.fencedStringifiedJson}\n * unless {@link AiAssist.IGenerateJsonCompletionParams.jsonConverter} is\n * provided.\n */\n readonly converter?: Converter<T> | Validator<T>;\n\n /**\n * Full string-to-`T` pipeline override. When supplied, takes precedence over\n * {@link AiAssist.IGenerateJsonCompletionParams.converter} and lets the\n * caller plug in a custom extractor or skip the default fence tolerance\n * entirely.\n */\n readonly jsonConverter?: Converter<T>;\n\n /**\n * Controls the optional system-prompt augmentation. Defaults to `'smart'`.\n * Pass `'none'` to disable, or a string to append custom guidance.\n */\n readonly promptHint?: JsonPromptHint;\n}\n\n/**\n * Successful result of {@link AiAssist.generateJsonCompletion}.\n * @public\n */\nexport interface IGenerateJsonCompletionResult<T> {\n /** The validated JSON value. */\n readonly value: T;\n /** The raw response text returned by the provider. */\n readonly raw: string;\n /** The full underlying completion response. */\n readonly response: IAiCompletionResponse;\n}\n\nfunction applyPromptHint(system: string | undefined, hint: JsonPromptHint): string | undefined {\n if (hint === 'none') {\n return system;\n }\n const suffix = hint === 'smart' ? SMART_JSON_PROMPT_HINT : hint;\n return system !== undefined && system.length > 0 ? `${system}\\n\\n${suffix}` : suffix;\n}\n\n/**\n * Calls {@link AiAssist.callProviderCompletion}, then runs the response text\n * through a tolerant JSON converter (default:\n * {@link AiAssist.fencedStringifiedJson}) and the caller's\n * `converter`/`validator`. Returns the validated value plus the raw text and\n * underlying completion response for diagnostics.\n *\n * @remarks\n * The default smart prompt hint asks the model to emit raw JSON. The read-side\n * extractor still tolerates fences and prose, so models that ignore the hint\n * are still handled.\n *\n * Either `converter` or `jsonConverter` must be provided; passing both lets\n * `jsonConverter` win.\n *\n * @param params - Provider parameters plus JSON validation options.\n * @returns The validated value, the raw text, and the underlying response.\n * @public\n */\nexport async function generateJsonCompletion<T>(\n params: IGenerateJsonCompletionParams<T>\n): Promise<Result<IGenerateJsonCompletionResult<T>>> {\n const { converter, jsonConverter, promptHint = 'smart', system, ...rest } = params;\n\n if (jsonConverter === undefined && converter === undefined) {\n return fail('generateJsonCompletion: either converter or jsonConverter must be provided.');\n }\n\n const pipeline: Converter<T> = jsonConverter ?? fencedStringifiedJson<T>({ inner: converter! });\n const augmentedSystem = applyPromptHint(system, promptHint);\n\n const response = await callProviderCompletion({ ...rest, system: augmentedSystem });\n if (response.isFailure()) {\n return fail(response.message);\n }\n const completion = response.value;\n\n return pipeline\n .convert(completion.content)\n .withErrorFormat((msg) => `generateJsonCompletion: ${msg}`)\n .onSuccess((value) => succeed({ value, raw: completion.content, response: completion }));\n}\n"]}