gemi 0.64.0 → 0.66.0

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 (250) hide show
  1. package/dist/ai/Agent.d.ts +128 -1
  2. package/dist/ai/Agent.d.ts.map +1 -1
  3. package/dist/ai/AgentController.d.ts +75 -6
  4. package/dist/ai/AgentController.d.ts.map +1 -1
  5. package/dist/ai/AgentProvider.d.ts +13 -45
  6. package/dist/ai/AgentProvider.d.ts.map +1 -1
  7. package/dist/ai/ImageModel.d.ts +127 -0
  8. package/dist/ai/ImageModel.d.ts.map +1 -0
  9. package/dist/ai/ImageProvider.d.ts +94 -0
  10. package/dist/ai/ImageProvider.d.ts.map +1 -0
  11. package/dist/ai/Schema.d.ts +62 -0
  12. package/dist/ai/Schema.d.ts.map +1 -1
  13. package/dist/ai/client/index.js +10 -4
  14. package/dist/ai/client/index.js.map +1 -1
  15. package/dist/ai/client/reducer.d.ts.map +1 -1
  16. package/dist/ai/index.d.ts +7 -1
  17. package/dist/ai/index.d.ts.map +1 -1
  18. package/dist/ai/index.js +11 -11
  19. package/dist/ai/index.js.map +14 -10
  20. package/dist/ai/live/harness.d.ts +5 -3
  21. package/dist/ai/live/harness.d.ts.map +1 -1
  22. package/dist/ai/providers/call.d.ts +12 -0
  23. package/dist/ai/providers/call.d.ts.map +1 -1
  24. package/dist/ai/providers/endpoints.d.ts +153 -0
  25. package/dist/ai/providers/endpoints.d.ts.map +1 -0
  26. package/dist/ai/providers/fakeProvider.d.ts +54 -0
  27. package/dist/ai/providers/fakeProvider.d.ts.map +1 -1
  28. package/dist/ai/providers/http.d.ts +28 -0
  29. package/dist/ai/providers/http.d.ts.map +1 -1
  30. package/dist/ai/providers/images.d.ts +126 -0
  31. package/dist/ai/providers/images.d.ts.map +1 -0
  32. package/dist/ai/store/Attachments.d.ts +52 -0
  33. package/dist/ai/store/Attachments.d.ts.map +1 -1
  34. package/dist/ai/types.d.ts +55 -1
  35. package/dist/ai/types.d.ts.map +1 -1
  36. package/dist/ai/useChat.d.ts +60 -4
  37. package/dist/ai/useChat.d.ts.map +1 -1
  38. package/dist/app/index.js +1 -1
  39. package/dist/bin/gemi.js +9 -1
  40. package/dist/bin/gemi.js.map +3 -3
  41. package/dist/broadcasting/index.js +1 -1
  42. package/dist/bun/plugin.js +1 -1
  43. package/dist/bun/preload.js +1 -1
  44. package/dist/{chunk-jv9k1qfr.js → chunk-2bb3rdqq.js} +3 -3
  45. package/dist/{chunk-jv9k1qfr.js.map → chunk-2bb3rdqq.js.map} +1 -1
  46. package/dist/{chunk-e785380d.js → chunk-2dvjj3ad.js} +2 -2
  47. package/dist/{chunk-e785380d.js.map → chunk-2dvjj3ad.js.map} +1 -1
  48. package/dist/{chunk-rj3fnc4h.js → chunk-2ghpxrw1.js} +1 -1
  49. package/dist/{chunk-dqbm9vd0.js → chunk-3mp9p38x.js} +2 -2
  50. package/dist/{chunk-dqbm9vd0.js.map → chunk-3mp9p38x.js.map} +1 -1
  51. package/dist/{chunk-cdpeh7tt.js → chunk-3pwn2r6s.js} +2 -2
  52. package/dist/{chunk-cdpeh7tt.js.map → chunk-3pwn2r6s.js.map} +1 -1
  53. package/dist/{chunk-7qfzrkab.js → chunk-45g3hd0e.js} +2 -2
  54. package/dist/{chunk-7qfzrkab.js.map → chunk-45g3hd0e.js.map} +1 -1
  55. package/dist/{chunk-wqmzad46.js → chunk-5g1j29p2.js} +2 -2
  56. package/dist/{chunk-wqmzad46.js.map → chunk-5g1j29p2.js.map} +1 -1
  57. package/dist/{chunk-bxtx4y4w.js → chunk-5pm9zvtp.js} +2 -2
  58. package/dist/{chunk-bxtx4y4w.js.map → chunk-5pm9zvtp.js.map} +1 -1
  59. package/dist/{chunk-pbx9p6g0.js → chunk-6waph5k8.js} +1 -1
  60. package/dist/{chunk-nnc40mf3.js → chunk-70y8wajy.js} +2 -2
  61. package/dist/{chunk-nnc40mf3.js.map → chunk-70y8wajy.js.map} +1 -1
  62. package/dist/{chunk-71yhw8aw.js → chunk-731etrh2.js} +2 -2
  63. package/dist/{chunk-71yhw8aw.js.map → chunk-731etrh2.js.map} +1 -1
  64. package/dist/{chunk-1s1cd1e8.js → chunk-7438nrkm.js} +3 -3
  65. package/dist/{chunk-1s1cd1e8.js.map → chunk-7438nrkm.js.map} +1 -1
  66. package/dist/{chunk-ssg20z9s.js → chunk-7wgk7q33.js} +3 -3
  67. package/dist/{chunk-ssg20z9s.js.map → chunk-7wgk7q33.js.map} +1 -1
  68. package/dist/chunk-7xc64j6p.js +5 -0
  69. package/dist/chunk-7xc64j6p.js.map +14 -0
  70. package/dist/{chunk-jmse5hec.js → chunk-7zg1mt1g.js} +2 -2
  71. package/dist/{chunk-jmse5hec.js.map → chunk-7zg1mt1g.js.map} +1 -1
  72. package/dist/{chunk-0qchadp1.js → chunk-87c0cy5v.js} +2 -2
  73. package/dist/{chunk-0qchadp1.js.map → chunk-87c0cy5v.js.map} +1 -1
  74. package/dist/{chunk-773qa4av.js → chunk-8bjxk57p.js} +2 -2
  75. package/dist/{chunk-773qa4av.js.map → chunk-8bjxk57p.js.map} +1 -1
  76. package/dist/{chunk-81yzec62.js → chunk-8jpvj3cj.js} +2 -2
  77. package/dist/{chunk-81yzec62.js.map → chunk-8jpvj3cj.js.map} +1 -1
  78. package/dist/{chunk-9e5c5e15.js → chunk-9ch1q7nd.js} +2 -2
  79. package/dist/{chunk-9e5c5e15.js.map → chunk-9ch1q7nd.js.map} +1 -1
  80. package/dist/{chunk-9e5v1t73.js → chunk-9x5eefh0.js} +2 -2
  81. package/dist/{chunk-9e5v1t73.js.map → chunk-9x5eefh0.js.map} +1 -1
  82. package/dist/{chunk-62xjrz5e.js → chunk-9zmcz7yq.js} +2 -2
  83. package/dist/{chunk-62xjrz5e.js.map → chunk-9zmcz7yq.js.map} +1 -1
  84. package/dist/{chunk-0amv13g6.js → chunk-a85fn4zf.js} +3 -3
  85. package/dist/{chunk-0amv13g6.js.map → chunk-a85fn4zf.js.map} +1 -1
  86. package/dist/chunk-adj6dnvj.js +5 -0
  87. package/dist/{chunk-dq2hgzje.js.map → chunk-adj6dnvj.js.map} +1 -1
  88. package/dist/{chunk-exwbtfe9.js → chunk-aq09ta7k.js} +2 -2
  89. package/dist/{chunk-exwbtfe9.js.map → chunk-aq09ta7k.js.map} +1 -1
  90. package/dist/{chunk-43xw9n4f.js → chunk-dmr7yzyr.js} +2 -2
  91. package/dist/{chunk-43xw9n4f.js.map → chunk-dmr7yzyr.js.map} +1 -1
  92. package/dist/{chunk-q4wdg0y3.js → chunk-e0v4byjp.js} +2 -2
  93. package/dist/{chunk-ptjexzn1.js.map → chunk-e0v4byjp.js.map} +1 -1
  94. package/dist/{chunk-8wpccvbt.js → chunk-e1fkxt82.js} +2 -2
  95. package/dist/{chunk-8wpccvbt.js.map → chunk-e1fkxt82.js.map} +1 -1
  96. package/dist/{chunk-xadk41cs.js → chunk-ex9ns7pf.js} +4 -4
  97. package/dist/{chunk-xadk41cs.js.map → chunk-ex9ns7pf.js.map} +1 -1
  98. package/dist/{chunk-95d8jj11.js → chunk-fd7wfcft.js} +2 -2
  99. package/dist/{chunk-95d8jj11.js.map → chunk-fd7wfcft.js.map} +1 -1
  100. package/dist/{chunk-kx7vgcjp.js → chunk-fmcq21hg.js} +3 -3
  101. package/dist/{chunk-kx7vgcjp.js.map → chunk-fmcq21hg.js.map} +1 -1
  102. package/dist/{chunk-k1wkvrj0.js → chunk-ftaxfq7p.js} +3 -3
  103. package/dist/{chunk-k1wkvrj0.js.map → chunk-ftaxfq7p.js.map} +1 -1
  104. package/dist/{chunk-zdj2wmbj.js → chunk-fxkh2rfd.js} +2 -2
  105. package/dist/{chunk-zdj2wmbj.js.map → chunk-fxkh2rfd.js.map} +1 -1
  106. package/dist/{chunk-9k5daets.js → chunk-g2ywq30n.js} +2 -2
  107. package/dist/{chunk-9k5daets.js.map → chunk-g2ywq30n.js.map} +1 -1
  108. package/dist/{chunk-fwnf3jc6.js → chunk-gyc91g26.js} +2 -2
  109. package/dist/{chunk-fwnf3jc6.js.map → chunk-gyc91g26.js.map} +1 -1
  110. package/dist/chunk-hq496pa4.js +5 -0
  111. package/dist/chunk-hq496pa4.js.map +10 -0
  112. package/dist/{chunk-4sv5zpb4.js → chunk-hrtkjv41.js} +2 -2
  113. package/dist/{chunk-4sv5zpb4.js.map → chunk-hrtkjv41.js.map} +1 -1
  114. package/dist/{chunk-dhe1hsyz.js → chunk-jkjt3e06.js} +2 -2
  115. package/dist/{chunk-dhe1hsyz.js.map → chunk-jkjt3e06.js.map} +1 -1
  116. package/dist/{chunk-5wzyx4ts.js → chunk-ks94h71z.js} +2 -2
  117. package/dist/{chunk-5wzyx4ts.js.map → chunk-ks94h71z.js.map} +1 -1
  118. package/dist/{chunk-rhr8qavq.js → chunk-m44ar4he.js} +2 -2
  119. package/dist/{chunk-rhr8qavq.js.map → chunk-m44ar4he.js.map} +1 -1
  120. package/dist/{chunk-mzpczes2.js → chunk-nxg51m0q.js} +2 -2
  121. package/dist/{chunk-mzpczes2.js.map → chunk-nxg51m0q.js.map} +1 -1
  122. package/dist/{chunk-qrfp7pg2.js → chunk-nxh5a3eb.js} +3 -3
  123. package/dist/{chunk-qrfp7pg2.js.map → chunk-nxh5a3eb.js.map} +1 -1
  124. package/dist/{chunk-qcbtr7hm.js → chunk-p0m3qgs5.js} +2 -2
  125. package/dist/{chunk-qcbtr7hm.js.map → chunk-p0m3qgs5.js.map} +1 -1
  126. package/dist/{chunk-jk8mn861.js → chunk-p5m0da00.js} +2 -2
  127. package/dist/{chunk-jk8mn861.js.map → chunk-p5m0da00.js.map} +1 -1
  128. package/dist/{chunk-fv223805.js → chunk-pb0m0ryf.js} +3 -3
  129. package/dist/{chunk-fv223805.js.map → chunk-pb0m0ryf.js.map} +1 -1
  130. package/dist/{chunk-7hbhbht2.js → chunk-pcxxnnad.js} +3 -3
  131. package/dist/{chunk-7hbhbht2.js.map → chunk-pcxxnnad.js.map} +1 -1
  132. package/dist/{chunk-2d92pev2.js → chunk-pxc51549.js} +2 -2
  133. package/dist/{chunk-2d92pev2.js.map → chunk-pxc51549.js.map} +1 -1
  134. package/dist/{chunk-454c7vn3.js → chunk-q1nq7n6y.js} +2 -2
  135. package/dist/{chunk-454c7vn3.js.map → chunk-q1nq7n6y.js.map} +1 -1
  136. package/dist/{chunk-48qybp63.js → chunk-qqchc40s.js} +2 -2
  137. package/dist/{chunk-48qybp63.js.map → chunk-qqchc40s.js.map} +1 -1
  138. package/dist/{chunk-3tmw1gy2.js → chunk-qttk7k60.js} +2 -2
  139. package/dist/{chunk-3tmw1gy2.js.map → chunk-qttk7k60.js.map} +1 -1
  140. package/dist/{chunk-feyr4851.js → chunk-r069158p.js} +2 -2
  141. package/dist/{chunk-feyr4851.js.map → chunk-r069158p.js.map} +1 -1
  142. package/dist/{chunk-ptjexzn1.js → chunk-r6v21jn6.js} +2 -2
  143. package/dist/{chunk-q4wdg0y3.js.map → chunk-r6v21jn6.js.map} +1 -1
  144. package/dist/{chunk-6j129573.js → chunk-r77f1482.js} +2 -2
  145. package/dist/{chunk-6j129573.js.map → chunk-r77f1482.js.map} +1 -1
  146. package/dist/{chunk-jmbdr550.js → chunk-rnjbja88.js} +2 -2
  147. package/dist/{chunk-jmbdr550.js.map → chunk-rnjbja88.js.map} +1 -1
  148. package/dist/{chunk-q8msf1gf.js → chunk-rq2k9frr.js} +2 -2
  149. package/dist/{chunk-q8msf1gf.js.map → chunk-rq2k9frr.js.map} +1 -1
  150. package/dist/{chunk-2nqxhy1f.js → chunk-se5ekvgb.js} +4 -4
  151. package/dist/{chunk-2nqxhy1f.js.map → chunk-se5ekvgb.js.map} +3 -3
  152. package/dist/{chunk-v6v03hy7.js → chunk-sqc6fkqt.js} +2 -2
  153. package/dist/{chunk-v6v03hy7.js.map → chunk-sqc6fkqt.js.map} +1 -1
  154. package/dist/{chunk-78cvy4je.js → chunk-tn71d46d.js} +2 -2
  155. package/dist/{chunk-78cvy4je.js.map → chunk-tn71d46d.js.map} +1 -1
  156. package/dist/{chunk-hkhxkeeb.js → chunk-v6q4990x.js} +3 -3
  157. package/dist/{chunk-hkhxkeeb.js.map → chunk-v6q4990x.js.map} +1 -1
  158. package/dist/{chunk-e41vdprh.js → chunk-w34j3cd3.js} +3 -3
  159. package/dist/{chunk-e41vdprh.js.map → chunk-w34j3cd3.js.map} +1 -1
  160. package/dist/{chunk-w8ncmp2z.js → chunk-w6fnt1xv.js} +2 -2
  161. package/dist/{chunk-w8ncmp2z.js.map → chunk-w6fnt1xv.js.map} +2 -2
  162. package/dist/{chunk-35fbxgjh.js → chunk-wzqxtrpt.js} +2 -2
  163. package/dist/{chunk-35fbxgjh.js.map → chunk-wzqxtrpt.js.map} +1 -1
  164. package/dist/{chunk-z2fnf49p.js → chunk-xzexftx1.js} +1 -1
  165. package/dist/{chunk-dfv5eqma.js → chunk-z4k18gnp.js} +2 -2
  166. package/dist/{chunk-dfv5eqma.js.map → chunk-z4k18gnp.js.map} +1 -1
  167. package/dist/{chunk-b6948dnh.js → chunk-z6gzasra.js} +2 -2
  168. package/dist/{chunk-b6948dnh.js.map → chunk-z6gzasra.js.map} +1 -1
  169. package/dist/{chunk-p57x55qd.js → chunk-zqpskwk9.js} +2 -2
  170. package/dist/{chunk-p57x55qd.js.map → chunk-zqpskwk9.js.map} +1 -1
  171. package/dist/chunks/ThemeProvider-Bz-y1g2i.js.map +1 -1
  172. package/dist/client/ClientRouter.d.ts.map +1 -1
  173. package/dist/client/ProgressManager.d.ts +1 -1
  174. package/dist/client/index.d.ts +1 -1
  175. package/dist/client/index.d.ts.map +1 -1
  176. package/dist/client/index.js +1 -1
  177. package/dist/client/index.js.map +1 -1
  178. package/dist/client/types.d.ts +72 -2
  179. package/dist/client/types.d.ts.map +1 -1
  180. package/dist/client/useNavigate.d.ts +29 -6
  181. package/dist/client/useNavigate.d.ts.map +1 -1
  182. package/dist/client/usePrefetch.d.ts +13 -3
  183. package/dist/client/usePrefetch.d.ts.map +1 -1
  184. package/dist/config/index.js +1 -1
  185. package/dist/console/run.js +2 -2
  186. package/dist/console/run.js.map +1 -1
  187. package/dist/container/index.js +2 -2
  188. package/dist/container/index.js.map +1 -1
  189. package/dist/database/Connection.d.ts.map +1 -1
  190. package/dist/database/index.d.ts +1 -0
  191. package/dist/database/index.d.ts.map +1 -1
  192. package/dist/database/index.js +2 -2
  193. package/dist/database/index.js.map +1 -1
  194. package/dist/database/sqlitePath.d.ts +46 -0
  195. package/dist/database/sqlitePath.d.ts.map +1 -0
  196. package/dist/email/index.js +2 -2
  197. package/dist/email/index.js.map +1 -1
  198. package/dist/facades/index.js +2 -2
  199. package/dist/facades/index.js.map +1 -1
  200. package/dist/foundation/index.js +2 -2
  201. package/dist/foundation/index.js.map +1 -1
  202. package/dist/http/ApiRouter.d.ts +1 -1
  203. package/dist/http/ApiRouter.d.ts.map +1 -1
  204. package/dist/http/index.js +2 -2
  205. package/dist/http/index.js.map +1 -1
  206. package/dist/i18n/dictionaryRuntime.js +2 -2
  207. package/dist/i18n/dictionaryRuntime.js.map +1 -1
  208. package/dist/i18n/index.js +2 -2
  209. package/dist/i18n/index.js.map +1 -1
  210. package/dist/kernel/index.js +2 -2
  211. package/dist/kernel/index.js.map +1 -1
  212. package/dist/orm/index.js +2 -2
  213. package/dist/orm/index.js.map +1 -1
  214. package/dist/server/index.js +2 -2
  215. package/dist/server/index.js.map +1 -1
  216. package/dist/services/index.js +2 -2
  217. package/dist/services/index.js.map +1 -1
  218. package/dist/services/queue/work.js +2 -2
  219. package/dist/services/queue/work.js.map +1 -1
  220. package/dist/support/index.js +2 -2
  221. package/dist/support/index.js.map +1 -1
  222. package/package.json +1 -1
  223. package/dist/ai/Agent.test-d.d.ts +0 -2
  224. package/dist/ai/Agent.test-d.d.ts.map +0 -1
  225. package/dist/ai/Schema.test-d.d.ts +0 -2
  226. package/dist/ai/Schema.test-d.d.ts.map +0 -1
  227. package/dist/ai/client/reducer.test-d.d.ts +0 -2
  228. package/dist/ai/client/reducer.test-d.d.ts.map +0 -1
  229. package/dist/ai/example.d.ts +0 -129
  230. package/dist/ai/example.d.ts.map +0 -1
  231. package/dist/chunk-4728yrmt.js +0 -5
  232. package/dist/chunk-4728yrmt.js.map +0 -10
  233. package/dist/chunk-dq2hgzje.js +0 -5
  234. package/dist/chunk-f9ccncar.js +0 -5
  235. package/dist/chunk-f9ccncar.js.map +0 -13
  236. package/dist/client/useDictionary.test-d.d.ts +0 -2
  237. package/dist/client/useDictionary.test-d.d.ts.map +0 -1
  238. package/dist/console/builder.test-d.d.ts +0 -2
  239. package/dist/console/builder.test-d.d.ts.map +0 -1
  240. package/dist/http/ApiRouter.test-d.d.ts +0 -2
  241. package/dist/http/ApiRouter.test-d.d.ts.map +0 -1
  242. package/dist/http/McpRouter.test-d.d.ts +0 -2
  243. package/dist/http/McpRouter.test-d.d.ts.map +0 -1
  244. package/dist/services/events/FakeEventManager.test-d.d.ts +0 -2
  245. package/dist/services/events/FakeEventManager.test-d.d.ts.map +0 -1
  246. package/dist/services/events/Listener.test-d.d.ts +0 -2
  247. package/dist/services/events/Listener.test-d.d.ts.map +0 -1
  248. /package/dist/{chunk-rj3fnc4h.js.map → chunk-2ghpxrw1.js.map} +0 -0
  249. /package/dist/{chunk-pbx9p6g0.js.map → chunk-6waph5k8.js.map} +0 -0
  250. /package/dist/{chunk-z2fnf49p.js.map → chunk-xzexftx1.js.map} +0 -0
@@ -0,0 +1,94 @@
1
+ import { type AzureConfig, type ProviderConfig } from "./providers/endpoints";
2
+ import { type ImageGenerationRequest, type ImageResponse, type ImagesEndpoint } from "./providers/images";
3
+ import type { AgentError } from "./types";
4
+ /**
5
+ * A provider that makes images, separate from the one that makes text.
6
+ *
7
+ * WHY NOT A METHOD ON `AgentProvider`. `provider.generateImage(...)` was the
8
+ * requested shape and it does not survive two facts about this codebase.
9
+ *
10
+ * First, `AgentProvider` is abstract with `stream` and `upload`, and a third
11
+ * abstract member breaks every implementor — including gemi's own `FakeProvider`
12
+ * (duck-typed) and `RecordingProvider` (hand-implements all five members). A
13
+ * capability that only one vendor surface has should not be a hole punched in the
14
+ * interface every other surface has to fill.
15
+ *
16
+ * Second, and this is the real one: an image deployment would have to lie about
17
+ * itself. `capabilities` is computed in the constructor from the model id, and
18
+ * `capabilitiesForModel` deliberately grants an unrecognised id *every*
19
+ * capability — so `AzureOpenAIProvider.model("gpt-image-2")` claims structured
20
+ * output, reasoning and tool search, and exposes a `stream()` that is callable
21
+ * and broken. Splitting the hierarchy makes the wrong call unspellable instead
22
+ * of merely wrong, which is the same reasoning `ScopedAttachments` is built on.
23
+ *
24
+ * What the two hierarchies *do* share is the part worth sharing: which host,
25
+ * which credential, and Azure's api-version fork. That is `providers/endpoints.ts`
26
+ * and neither class reimplements it.
27
+ */
28
+ export declare abstract class ImageProvider {
29
+ /** The model, or on Azure the model the deployment serves. */
30
+ abstract readonly model: string;
31
+ /** For autocomplete only; any string is accepted, because a model released
32
+ * next Tuesday must not need a gemi release to use. */
33
+ static models(): readonly string[];
34
+ protected abstract endpoint(): ImagesEndpoint;
35
+ /** What goes in the body's `model`. The deployment, on Azure. */
36
+ protected modelName(): string;
37
+ generate(params: ImageProviderParams): Promise<ImageResponse>;
38
+ /**
39
+ * An edit. `images` is required and non-empty — see `ImageModel.edit` for why
40
+ * that is a separate method rather than an optional field on `generate`.
41
+ */
42
+ edit(params: ImageProviderEditParams): Promise<ImageResponse>;
43
+ /**
44
+ * Maps gemi's params onto the vendor's field names.
45
+ *
46
+ * On the base class rather than in each subclass: OpenAI and Azure take the
47
+ * same body, and the only difference is that Azure's `model` names a
48
+ * deployment — which `modelName()` answers.
49
+ */
50
+ protected body(params: ImageProviderParams): ImageGenerationRequest;
51
+ /** As `AgentProvider.normalizeError`, so an app branches on `rate_limited`
52
+ * without caring which surface produced it. */
53
+ normalizeError(error: unknown): AgentError;
54
+ }
55
+ export type ImageProviderParams = {
56
+ prompt: string;
57
+ size?: string;
58
+ quality?: string;
59
+ background?: string;
60
+ format?: string;
61
+ compression?: number;
62
+ signal?: AbortSignal;
63
+ };
64
+ export type ImageProviderEditParams = ImageProviderParams & {
65
+ images: File[];
66
+ mask?: File;
67
+ };
68
+ export declare class OpenAIImageProvider extends ImageProvider {
69
+ readonly model: string;
70
+ protected readonly config: ProviderConfig;
71
+ constructor(model: string, config?: ProviderConfig);
72
+ static model(model: string, config?: ProviderConfig): OpenAIImageProvider;
73
+ static models(): readonly string[];
74
+ protected endpoint(): ImagesEndpoint;
75
+ }
76
+ /**
77
+ * Azure's image surface, which is the same resource and credential as its chat
78
+ * surface — an app that already configured `AZURE_OPENAI_*` for an agent writes
79
+ * only the deployment name here.
80
+ *
81
+ * `.model()`, not `.deployment()`, for the symmetry `AzureOpenAIProvider` keeps:
82
+ * apps name a model and `AzureConfig.deployment` is the override for a resource
83
+ * whose deployment is called something else.
84
+ */
85
+ export declare class AzureOpenAIImageProvider extends ImageProvider {
86
+ readonly model: string;
87
+ protected readonly config: AzureConfig;
88
+ constructor(model: string, config?: AzureConfig);
89
+ static model(model: string, config?: AzureConfig): AzureOpenAIImageProvider;
90
+ static models(): readonly string[];
91
+ protected modelName(): string;
92
+ protected endpoint(): ImagesEndpoint;
93
+ }
94
+ //# sourceMappingURL=ImageProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageProvider.d.ts","sourceRoot":"","sources":["../../ai/ImageProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAKL,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,8BAAsB,aAAa;IACjC,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEhC;4DACwD;IACxD,MAAM,CAAC,MAAM,IAAI,SAAS,MAAM,EAAE;IAIlC,SAAS,CAAC,QAAQ,CAAC,QAAQ,IAAI,cAAc;IAE7C,iEAAiE;IACjE,SAAS,CAAC,SAAS,IAAI,MAAM;IAIvB,QAAQ,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;IAInE;;;OAGG;IACG,IAAI,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,aAAa,CAAC;IAanE;;;;;;OAMG;IACH,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,GAAG,sBAAsB;IAYnE;oDACgD;IAChD,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU;CAG3C;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,mBAAmB,GAAG;IAC1D,MAAM,EAAE,IAAI,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,IAAI,CAAC;CACb,CAAC;AAQF,qBAAa,mBAAoB,SAAQ,aAAa;IACpD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;gBAE9B,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,cAAmB;IAMtD,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,mBAAmB;IAIzE,MAAM,CAAC,MAAM,IAAI,SAAS,MAAM,EAAE;IAIlC,SAAS,CAAC,QAAQ,IAAI,cAAc;CAGrC;AAED;;;;;;;;GAQG;AACH,qBAAa,wBAAyB,SAAQ,aAAa;IACzD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;gBAE3B,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,WAAgB;IAMnD,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,wBAAwB;IAI3E,MAAM,CAAC,MAAM,IAAI,SAAS,MAAM,EAAE;IAIlC,SAAS,CAAC,SAAS,IAAI,MAAM;IAI7B,SAAS,CAAC,QAAQ,IAAI,cAAc;CAGrC"}
@@ -14,6 +14,12 @@
14
14
  * `required`, `additionalProperties: false` on every object, no patterns, no
15
15
  * `oneOf` at the root — and a builder that cannot express the rejected parts is
16
16
  * better than one that lets you write a schema the API refuses at runtime.
17
+ *
18
+ * `json()` is the one deliberate hole in that, for the formats strict mode
19
+ * cannot describe at all: a record with arbitrary keys, a mixed-type tuple, a
20
+ * recursive document. It does not widen the subset — it turns strict mode off
21
+ * for the schema containing it, which `supportsStrict` reads back off the tree
22
+ * so that no caller has to remember to.
17
23
  */
18
24
  export type JSONSchema = {
19
25
  type?: string | string[];
@@ -26,6 +32,13 @@ export type JSONSchema = {
26
32
  items?: JSONSchema;
27
33
  anyOf?: readonly JSONSchema[];
28
34
  };
35
+ /**
36
+ * Any value JSON can carry. The default output type of `json()`, and the
37
+ * annotation an app reaches for when it hands one of those values on.
38
+ */
39
+ export type JsonValue = string | number | boolean | null | JsonValue[] | {
40
+ [key: string]: JsonValue;
41
+ };
29
42
  declare const OUTPUT: unique symbol;
30
43
  declare const OPTIONAL: unique symbol;
31
44
  /**
@@ -120,6 +133,55 @@ export declare const s: {
120
133
  * that as one object with everything optional is worse for the model.
121
134
  */
122
135
  union<const S extends readonly [AnySchema, AnySchema, ...AnySchema[]]>(members: S): SchemaBuilder<Infer<S[number]>>;
136
+ /**
137
+ * Any JSON value, constrained by nothing — for a format the rest of this
138
+ * builder cannot describe: a record with arbitrary keys, a mixed-type tuple,
139
+ * a document that nests into itself.
140
+ *
141
+ * A schema containing one cannot be sent under strict mode, so a tool whose
142
+ * input uses it is sent with `strict: false` automatically. That is not an
143
+ * option to pass anywhere; it is read back off the schema by
144
+ * `supportsStrict`. The rest of the tool is unaffected, and so is streaming:
145
+ * partial arguments are parsed from the raw text, never through a schema.
146
+ *
147
+ * `T` is an assertion, not a guarantee. The emitted schema constrains
148
+ * nothing, so nothing checks the model's output against `T` — only that it is
149
+ * JSON. Validate it in `execute` and hand the model back an error it can fix,
150
+ * the way it would any other bad argument. `describe()` is where you tell it
151
+ * the format; with no constraints to read, that prose is all it gets.
152
+ *
153
+ * TWO CALL SIGNATURES, NOT A DEFAULT TYPE PARAMETER, and that is load-bearing.
154
+ * Written `json<T = JsonValue>()`, the default lost to the surrounding
155
+ * contextual type in the position this is actually used: `s.object`'s shape is
156
+ * constrained to `Record<string, AnySchema>` — `Schema<any>` — which supplies
157
+ * `any` as an inference candidate, and a candidate beats a default. So
158
+ * `s.object({ definition: s.json() })` inferred `{ definition: any }`, which is
159
+ * type checking switched off around exactly the field this exists for, and the
160
+ * opposite of what the default was written to prevent. An overload with no type
161
+ * parameter has nothing to infer, so `s.json()` is `JsonValue` wherever it is
162
+ * written.
163
+ *
164
+ * `ai:generate-client` maps it to the native `JSONValue` and says nothing about
165
+ * it. `JsonValue` is a union of every JSON shape, so it used to reach the
166
+ * generator's "a union that is not told apart by one string member" warning —
167
+ * true, and a misdescription of a field that is free-form on purpose. The
168
+ * extractor recognises it now.
169
+ */
170
+ json(): SchemaBuilder<JsonValue>;
171
+ json<T>(): SchemaBuilder<T>;
123
172
  };
173
+ /**
174
+ * Whether a schema can be sent under a provider's strict mode.
175
+ *
176
+ * False exactly when a `json()` node is somewhere inside it. Strict mode's
177
+ * bargain is that every node constrains its value; an unconstrained one has no
178
+ * spelling there, and sending it anyway is a 400 naming a path.
179
+ *
180
+ * Derived from the tree rather than declared alongside it, because the two
181
+ * would drift: a field added to a tool's input a year from now would need
182
+ * whoever adds it to know that a flag somewhere else describes it. Adding the
183
+ * field is the whole of turning strict off.
184
+ */
185
+ export declare function supportsStrict(schema: AnySchema): boolean;
124
186
  export {};
125
187
  //# sourceMappingURL=Schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../../ai/Schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../../ai/Schema.ts"],"names":[],"mappings":"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"}
@@ -142,7 +142,8 @@ function reduce(state, event, now) {
142
142
  case "message-end": return withMessage(state, event.messageId, now, (message) => ({
143
143
  ...message,
144
144
  finishReason: event.finishReason,
145
- content: message.content.map((part) => part.type === "output" && part.partial ? {
145
+ ...event.outputTruncated ? { outputTruncated: true } : {},
146
+ content: event.outputTruncated || event.finishReason === "length" ? message.content.filter((part) => !(part.type === "output" && part.partial)) : message.content.map((part) => part.type === "output" && part.partial ? {
146
147
  ...part,
147
148
  partial: false
148
149
  } : part)
@@ -658,7 +659,7 @@ function forWire(messages) {
658
659
  * first boundary.
659
660
  */
660
661
  function useChat(path, params = {}) {
661
- const { threadId: initialThreadId, initialMessages, cursor: initialCursor, attach: attachOnMount = true, body: extraBody, headers, onFinish, onError, onAwaitingInput, onAttachMiss } = params;
662
+ const { threadId: initialThreadId, initialMessages, cursor: initialCursor, attach: attachOnMount = true, body: extraBody, headers, onFinish, onToolResult, onError, onAwaitingInput, onAttachMiss } = params;
662
663
  const routeParams = useParams();
663
664
  const base = useMemo(() => `/api${applyRouteParams(String(path).replace(/^[A-Z]+:/, ""), routeParams)}`, [path, routeParams]);
664
665
  /**
@@ -684,12 +685,14 @@ function useChat(path, params = {}) {
684
685
  const abortRef = useRef(null);
685
686
  const handlers = useRef({
686
687
  onFinish,
688
+ onToolResult,
687
689
  onError,
688
690
  onAwaitingInput,
689
691
  onAttachMiss
690
692
  });
691
693
  handlers.current = {
692
694
  onFinish,
695
+ onToolResult,
693
696
  onError,
694
697
  onAwaitingInput,
695
698
  onAttachMiss
@@ -787,6 +790,8 @@ function useChat(path, params = {}) {
787
790
  const before = previous.messages.find((m) => m.id === event.messageId);
788
791
  const message = next.messages.find((m) => m.id === event.messageId);
789
792
  if (message && before?.finishReason === void 0) handlers.current.onFinish?.(message);
793
+ } else if (event.type === "tool-result") {
794
+ if (!previous.messages.some((message) => message.content.some((part) => part.type === "tool-result" && part.toolCallId === event.part.toolCallId))) handlers.current.onToolResult?.(event.part);
790
795
  } else if (event.type === "awaiting-input") handlers.current.onAwaitingInput?.(event.pending);
791
796
  else if (event.type === "error") handlers.current.onError?.(event.error);
792
797
  }
@@ -832,10 +837,11 @@ function useChat(path, params = {}) {
832
837
  setPhaseSafe("submitted");
833
838
  try {
834
839
  const payload = {
840
+ ...body,
835
841
  turn,
836
842
  clientRunId,
837
- ...stateRef.current.threadId ? { threadId: stateRef.current.threadId } : { messages: forWire(history) },
838
- ...body
843
+ threadId: stateRef.current.threadId,
844
+ messages: stateRef.current.threadId ? void 0 : forWire(history)
839
845
  };
840
846
  const response = await post(url, payload, controller.signal);
841
847
  if (!response.ok) {