@effect-uai/core 0.12.0 → 0.12.1

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 (284) hide show
  1. package/dist/{AiError-Bf1pq4BB.d.mts → AiError-eLV9t1lU.d.mts} +12 -16
  2. package/dist/AiError-eLV9t1lU.d.mts.map +1 -0
  3. package/dist/{Audio-CR7CSljJ.d.mts → Audio-60lKKHxS.d.mts} +4 -5
  4. package/dist/Audio-60lKKHxS.d.mts.map +1 -0
  5. package/dist/{Image-C4vuBmu0.d.mts → Image-BK8-4H6s.d.mts} +12 -14
  6. package/dist/Image-BK8-4H6s.d.mts.map +1 -0
  7. package/dist/{Items-BKQgqJ8A.d.mts → Items-SfUabNuB.d.mts} +74 -76
  8. package/dist/Items-SfUabNuB.d.mts.map +1 -0
  9. package/dist/{Loop-D8nWpowc.d.mts → Loop-B54AB1ME.d.mts} +19 -21
  10. package/dist/Loop-B54AB1ME.d.mts.map +1 -0
  11. package/dist/{Media-D_CpcM1Z.d.mts → Media-DwgpifPD.d.mts} +1 -1
  12. package/dist/Media-DwgpifPD.d.mts.map +1 -0
  13. package/dist/{SandboxError-CIrVDOMV.d.mts → SandboxError-BN8b28Bh.d.mts} +11 -15
  14. package/dist/SandboxError-BN8b28Bh.d.mts.map +1 -0
  15. package/dist/{StructuredFormat-DHaUJBdd.d.mts → StructuredFormat-BlZhyOsi.d.mts} +3 -7
  16. package/dist/StructuredFormat-BlZhyOsi.d.mts.map +1 -0
  17. package/dist/{Tool-u5bag8SO.d.mts → Tool-DE-rnvkw.d.mts} +5 -8
  18. package/dist/Tool-DE-rnvkw.d.mts.map +1 -0
  19. package/dist/{ToolEvent-BBfOdhF_.d.mts → ToolEvent-D99MGQYH.d.mts} +56 -63
  20. package/dist/ToolEvent-D99MGQYH.d.mts.map +1 -0
  21. package/dist/{ToolResult-CRpmkBXR.d.mts → ToolResult-Cj8ChodL.d.mts} +49 -54
  22. package/dist/ToolResult-Cj8ChodL.d.mts.map +1 -0
  23. package/dist/{Toolkit-D4mQvhjq.d.mts → Toolkit-BEZrNPTI.d.mts} +13 -16
  24. package/dist/Toolkit-BEZrNPTI.d.mts.map +1 -0
  25. package/dist/browser/Browser.d.mts +11 -7
  26. package/dist/browser/Browser.d.mts.map +1 -1
  27. package/dist/browser/Browser.mjs +1 -1
  28. package/dist/browser/Browser.mjs.map +1 -1
  29. package/dist/browser/BrowserError.d.mts +9 -13
  30. package/dist/browser/BrowserError.d.mts.map +1 -1
  31. package/dist/browser/BrowserError.mjs +1 -1
  32. package/dist/browser/BrowserError.mjs.map +1 -1
  33. package/dist/browser/BrowserTool.d.mts +33 -36
  34. package/dist/browser/BrowserTool.d.mts.map +1 -1
  35. package/dist/browser/BrowserTool.mjs +1 -1
  36. package/dist/browser/BrowserTool.mjs.map +1 -1
  37. package/dist/capabilities/Capabilities.d.mts +8 -6
  38. package/dist/capabilities/Capabilities.d.mts.map +1 -1
  39. package/dist/capabilities/Capabilities.mjs +1 -1
  40. package/dist/capabilities/Capabilities.mjs.map +1 -1
  41. package/dist/dist-BaenoU1A.mjs +145 -0
  42. package/dist/dist-BaenoU1A.mjs.map +1 -0
  43. package/dist/{dist-C0m0QnUP.mjs → dist-nohcnkD6.mjs} +16 -15
  44. package/dist/dist-nohcnkD6.mjs.map +1 -0
  45. package/dist/domain/AiError.d.mts +1 -1
  46. package/dist/domain/AiError.mjs +1 -1
  47. package/dist/domain/AiError.mjs.map +1 -1
  48. package/dist/domain/Audio.d.mts +1 -1
  49. package/dist/domain/Audio.mjs +1 -1
  50. package/dist/domain/Citation.d.mts +0 -2
  51. package/dist/domain/Citation.d.mts.map +1 -1
  52. package/dist/domain/Citation.mjs +1 -1
  53. package/dist/domain/Image.d.mts +1 -1
  54. package/dist/domain/Image.mjs +1 -1
  55. package/dist/domain/Image.mjs.map +1 -1
  56. package/dist/domain/Items.d.mts +1 -1
  57. package/dist/domain/Items.mjs +1 -1
  58. package/dist/domain/Items.mjs.map +1 -1
  59. package/dist/domain/Media.d.mts +1 -1
  60. package/dist/domain/Media.mjs +1 -1
  61. package/dist/domain/Music.d.mts +18 -11
  62. package/dist/domain/Music.d.mts.map +1 -1
  63. package/dist/domain/Music.mjs +1 -1
  64. package/dist/domain/Music.mjs.map +1 -1
  65. package/dist/domain/Research.d.mts +3 -4
  66. package/dist/domain/Research.d.mts.map +1 -1
  67. package/dist/domain/Research.mjs +1 -1
  68. package/dist/domain/Transcript.d.mts +2 -3
  69. package/dist/domain/Transcript.d.mts.map +1 -1
  70. package/dist/domain/Transcript.mjs +1 -1
  71. package/dist/domain/Turn.d.mts +143 -164
  72. package/dist/domain/Turn.d.mts.map +1 -1
  73. package/dist/domain/Turn.mjs +1 -1
  74. package/dist/domain/Turn.mjs.map +1 -1
  75. package/dist/domain/Turn.test.d.mts +1 -1
  76. package/dist/domain/Turn.test.mjs +28 -18
  77. package/dist/domain/Turn.test.mjs.map +1 -1
  78. package/dist/embedding-model/Embedding.d.mts +1 -3
  79. package/dist/embedding-model/Embedding.d.mts.map +1 -1
  80. package/dist/embedding-model/Embedding.mjs +1 -1
  81. package/dist/embedding-model/EmbeddingModel.d.mts +1 -3
  82. package/dist/embedding-model/EmbeddingModel.d.mts.map +1 -1
  83. package/dist/embedding-model/EmbeddingModel.mjs +1 -1
  84. package/dist/embedding-model/EmbeddingModel.mjs.map +1 -1
  85. package/dist/embedding-model/EmbeddingModel.test.d.mts +1 -1
  86. package/dist/embedding-model/EmbeddingModel.test.mjs +14 -9
  87. package/dist/embedding-model/EmbeddingModel.test.mjs.map +1 -1
  88. package/dist/index.d.mts +12 -12
  89. package/dist/job/Job.d.mts +4 -4
  90. package/dist/job/Job.d.mts.map +1 -1
  91. package/dist/job/Job.mjs +1 -1
  92. package/dist/job/Job.mjs.map +1 -1
  93. package/dist/language-model/LanguageModel.d.mts +4 -6
  94. package/dist/language-model/LanguageModel.d.mts.map +1 -1
  95. package/dist/language-model/LanguageModel.mjs +1 -1
  96. package/dist/language-model/LanguageModel.mjs.map +1 -1
  97. package/dist/language-model/LanguageModel.test.d.mts +1 -1
  98. package/dist/language-model/LanguageModel.test.mjs +6 -3
  99. package/dist/language-model/LanguageModel.test.mjs.map +1 -1
  100. package/dist/loop/Loop.d.mts +1 -1
  101. package/dist/loop/Loop.mjs +1 -1
  102. package/dist/loop/Loop.mjs.map +1 -1
  103. package/dist/loop/Loop.test.d.mts +1 -1
  104. package/dist/loop/Loop.test.mjs +60 -34
  105. package/dist/loop/Loop.test.mjs.map +1 -1
  106. package/dist/{magic-string.es-Dk-MMA0F.mjs → magic-string.es-CB2hOw9v.mjs} +14 -13
  107. package/dist/{magic-string.es-Dk-MMA0F.mjs.map → magic-string.es-CB2hOw9v.mjs.map} +1 -1
  108. package/dist/math/Vector.d.mts +0 -2
  109. package/dist/math/Vector.d.mts.map +1 -1
  110. package/dist/math/Vector.mjs +1 -1
  111. package/dist/math/Vector.mjs.map +1 -1
  112. package/dist/music-generator/MusicGenerator.d.mts +2 -4
  113. package/dist/music-generator/MusicGenerator.d.mts.map +1 -1
  114. package/dist/music-generator/MusicGenerator.mjs +1 -1
  115. package/dist/music-generator/MusicGenerator.mjs.map +1 -1
  116. package/dist/music-generator/MusicGenerator.test.d.mts +1 -1
  117. package/dist/music-generator/MusicGenerator.test.mjs +19 -10
  118. package/dist/music-generator/MusicGenerator.test.mjs.map +1 -1
  119. package/dist/observability/Metrics.d.mts +10 -7
  120. package/dist/observability/Metrics.d.mts.map +1 -1
  121. package/dist/observability/Metrics.mjs +1 -1
  122. package/dist/observability/Metrics.mjs.map +1 -1
  123. package/dist/observability/Metrics.test.d.mts +1 -1
  124. package/dist/observability/Metrics.test.mjs +50 -28
  125. package/dist/observability/Metrics.test.mjs.map +1 -1
  126. package/dist/observability/Telemetry.d.mts +2 -3
  127. package/dist/observability/Telemetry.d.mts.map +1 -1
  128. package/dist/observability/Telemetry.mjs +1 -1
  129. package/dist/observability/Telemetry.mjs.map +1 -1
  130. package/dist/observability/Telemetry.test.d.mts +1 -1
  131. package/dist/observability/Telemetry.test.mjs +15 -7
  132. package/dist/observability/Telemetry.test.mjs.map +1 -1
  133. package/dist/research/DeepResearch.d.mts +1 -3
  134. package/dist/research/DeepResearch.d.mts.map +1 -1
  135. package/dist/research/DeepResearch.mjs +1 -1
  136. package/dist/research/DeepResearch.mjs.map +1 -1
  137. package/dist/retry/Retry.d.mts +2 -6
  138. package/dist/retry/Retry.d.mts.map +1 -1
  139. package/dist/retry/Retry.mjs +1 -1
  140. package/dist/retry/Retry.mjs.map +1 -1
  141. package/dist/retry/Retry.test.d.mts +1 -1
  142. package/dist/retry/Retry.test.mjs +6 -3
  143. package/dist/retry/Retry.test.mjs.map +1 -1
  144. package/dist/sandbox/Memory.d.mts +0 -2
  145. package/dist/sandbox/Memory.d.mts.map +1 -1
  146. package/dist/sandbox/Memory.mjs +4 -4
  147. package/dist/sandbox/Memory.mjs.map +1 -1
  148. package/dist/sandbox/Sandbox.d.mts +144 -156
  149. package/dist/sandbox/Sandbox.d.mts.map +1 -1
  150. package/dist/sandbox/Sandbox.mjs +1 -1
  151. package/dist/sandbox/Sandbox.mjs.map +1 -1
  152. package/dist/sandbox/SandboxError.d.mts +1 -1
  153. package/dist/sandbox/SandboxError.mjs +1 -1
  154. package/dist/sandbox/SandboxError.mjs.map +1 -1
  155. package/dist/sandbox/SandboxImage.d.mts +0 -2
  156. package/dist/sandbox/SandboxImage.d.mts.map +1 -1
  157. package/dist/sandbox/SandboxImage.mjs +1 -1
  158. package/dist/sandbox/SandboxImage.mjs.map +1 -1
  159. package/dist/sandbox/SandboxNetwork.d.mts +0 -2
  160. package/dist/sandbox/SandboxNetwork.d.mts.map +1 -1
  161. package/dist/sandbox/SandboxNetwork.mjs +1 -1
  162. package/dist/sandbox/SandboxNetwork.mjs.map +1 -1
  163. package/dist/speech-synthesizer/SpeechSynthesizer.d.mts +8 -7
  164. package/dist/speech-synthesizer/SpeechSynthesizer.d.mts.map +1 -1
  165. package/dist/speech-synthesizer/SpeechSynthesizer.mjs +1 -1
  166. package/dist/speech-synthesizer/SpeechSynthesizer.mjs.map +1 -1
  167. package/dist/speech-synthesizer/SpeechSynthesizer.test.d.mts +1 -1
  168. package/dist/speech-synthesizer/SpeechSynthesizer.test.mjs +31 -16
  169. package/dist/speech-synthesizer/SpeechSynthesizer.test.mjs.map +1 -1
  170. package/dist/streaming/JSONL.d.mts +1 -5
  171. package/dist/streaming/JSONL.d.mts.map +1 -1
  172. package/dist/streaming/JSONL.mjs +1 -1
  173. package/dist/streaming/JSONL.mjs.map +1 -1
  174. package/dist/streaming/JSONL.test.d.mts +1 -1
  175. package/dist/streaming/JSONL.test.mjs +16 -8
  176. package/dist/streaming/JSONL.test.mjs.map +1 -1
  177. package/dist/streaming/Lines.d.mts +0 -2
  178. package/dist/streaming/Lines.d.mts.map +1 -1
  179. package/dist/streaming/Lines.mjs +1 -1
  180. package/dist/streaming/Lines.mjs.map +1 -1
  181. package/dist/streaming/SSE.d.mts +0 -2
  182. package/dist/streaming/SSE.d.mts.map +1 -1
  183. package/dist/streaming/SSE.mjs +1 -1
  184. package/dist/streaming/SSE.mjs.map +1 -1
  185. package/dist/streaming/SSE.test.d.mts +1 -1
  186. package/dist/streaming/SSE.test.mjs +34 -17
  187. package/dist/streaming/SSE.test.mjs.map +1 -1
  188. package/dist/structured-format/StructuredFormat.d.mts +1 -1
  189. package/dist/structured-format/StructuredFormat.mjs +1 -1
  190. package/dist/structured-format/StructuredFormat.mjs.map +1 -1
  191. package/dist/structured-format/StructuredFormat.test.d.mts +1 -1
  192. package/dist/structured-format/StructuredFormat.test.mjs +7 -4
  193. package/dist/structured-format/StructuredFormat.test.mjs.map +1 -1
  194. package/dist/{dist-CcRV3-A5.mjs → test.DNmyFkvJ-YPzDR0Co.mjs} +1644 -5172
  195. package/dist/test.DNmyFkvJ-YPzDR0Co.mjs.map +1 -0
  196. package/dist/testing/MockMusicGenerator.d.mts +4 -3
  197. package/dist/testing/MockMusicGenerator.d.mts.map +1 -1
  198. package/dist/testing/MockMusicGenerator.mjs.map +1 -1
  199. package/dist/testing/MockProvider.d.mts +1 -2
  200. package/dist/testing/MockProvider.d.mts.map +1 -1
  201. package/dist/testing/MockProvider.mjs.map +1 -1
  202. package/dist/testing/MockSandbox.d.mts +256 -290
  203. package/dist/testing/MockSandbox.d.mts.map +1 -1
  204. package/dist/testing/MockSandbox.mjs.map +1 -1
  205. package/dist/testing/MockSpeechSynthesizer.d.mts +10 -6
  206. package/dist/testing/MockSpeechSynthesizer.d.mts.map +1 -1
  207. package/dist/testing/MockSpeechSynthesizer.mjs.map +1 -1
  208. package/dist/testing/MockTranscriber.d.mts +3 -2
  209. package/dist/testing/MockTranscriber.d.mts.map +1 -1
  210. package/dist/testing/MockTranscriber.mjs.map +1 -1
  211. package/dist/tool/Approval.d.mts +31 -36
  212. package/dist/tool/Approval.d.mts.map +1 -1
  213. package/dist/tool/Approval.mjs +1 -1
  214. package/dist/tool/Approval.mjs.map +1 -1
  215. package/dist/tool/Approval.test.d.mts +1 -1
  216. package/dist/tool/Approval.test.mjs +37 -24
  217. package/dist/tool/Approval.test.mjs.map +1 -1
  218. package/dist/tool/HistoryCheck.d.mts +2 -4
  219. package/dist/tool/HistoryCheck.d.mts.map +1 -1
  220. package/dist/tool/HistoryCheck.mjs +1 -1
  221. package/dist/tool/HistoryCheck.mjs.map +1 -1
  222. package/dist/tool/Tool.d.mts +1 -1
  223. package/dist/tool/Tool.mjs +4 -4
  224. package/dist/tool/Tool.mjs.map +1 -1
  225. package/dist/tool/Tool.test.d.mts +1 -1
  226. package/dist/tool/Tool.test.mjs +23 -11
  227. package/dist/tool/Tool.test.mjs.map +1 -1
  228. package/dist/tool/ToolEvent.d.mts +1 -1
  229. package/dist/tool/ToolEvent.mjs +1 -1
  230. package/dist/tool/ToolEvent.mjs.map +1 -1
  231. package/dist/tool/ToolResult.d.mts +1 -1
  232. package/dist/tool/ToolResult.mjs +1 -1
  233. package/dist/tool/ToolResult.mjs.map +1 -1
  234. package/dist/tool/Toolkit.d.mts +1 -1
  235. package/dist/tool/Toolkit.mjs +4 -3
  236. package/dist/tool/Toolkit.mjs.map +1 -1
  237. package/dist/tool/Toolkit.test.d.mts +1 -1
  238. package/dist/tool/Toolkit.test.mjs +40 -21
  239. package/dist/tool/Toolkit.test.mjs.map +1 -1
  240. package/dist/transcriber/Transcriber.d.mts +6 -6
  241. package/dist/transcriber/Transcriber.d.mts.map +1 -1
  242. package/dist/transcriber/Transcriber.mjs +1 -1
  243. package/dist/transcriber/Transcriber.mjs.map +1 -1
  244. package/dist/transcriber/Transcriber.test.d.mts +1 -1
  245. package/dist/transcriber/Transcriber.test.mjs +20 -10
  246. package/dist/transcriber/Transcriber.test.mjs.map +1 -1
  247. package/dist/utils-CiH_DjFW.mjs +3918 -0
  248. package/dist/utils-CiH_DjFW.mjs.map +1 -0
  249. package/dist/web-read/WebRead.d.mts +15 -9
  250. package/dist/web-read/WebRead.d.mts.map +1 -1
  251. package/dist/web-read/WebRead.mjs +1 -1
  252. package/dist/web-read/WebRead.mjs.map +1 -1
  253. package/dist/web-read/WebReadTool.d.mts +4 -5
  254. package/dist/web-read/WebReadTool.d.mts.map +1 -1
  255. package/dist/web-read/WebReadTool.mjs +1 -1
  256. package/dist/web-read/WebReadTool.mjs.map +1 -1
  257. package/dist/web-search/WebSearch.d.mts +22 -13
  258. package/dist/web-search/WebSearch.d.mts.map +1 -1
  259. package/dist/web-search/WebSearch.mjs +1 -1
  260. package/dist/web-search/WebSearch.mjs.map +1 -1
  261. package/dist/web-search/WebSearchTool.d.mts +6 -6
  262. package/dist/web-search/WebSearchTool.d.mts.map +1 -1
  263. package/dist/web-search/WebSearchTool.mjs +1 -1
  264. package/dist/web-search/WebSearchTool.mjs.map +1 -1
  265. package/package.json +4 -4
  266. package/src/loop/Loop.test.ts +13 -14
  267. package/src/loop/Loop.ts +74 -76
  268. package/src/testing/MockProvider.ts +8 -9
  269. package/src/tool/Tool.ts +13 -13
  270. package/dist/AiError-Bf1pq4BB.d.mts.map +0 -1
  271. package/dist/Audio-CR7CSljJ.d.mts.map +0 -1
  272. package/dist/Image-C4vuBmu0.d.mts.map +0 -1
  273. package/dist/Items-BKQgqJ8A.d.mts.map +0 -1
  274. package/dist/Loop-D8nWpowc.d.mts.map +0 -1
  275. package/dist/Media-D_CpcM1Z.d.mts.map +0 -1
  276. package/dist/SandboxError-CIrVDOMV.d.mts.map +0 -1
  277. package/dist/StructuredFormat-DHaUJBdd.d.mts.map +0 -1
  278. package/dist/Tool-u5bag8SO.d.mts.map +0 -1
  279. package/dist/ToolEvent-BBfOdhF_.d.mts.map +0 -1
  280. package/dist/ToolResult-CRpmkBXR.d.mts.map +0 -1
  281. package/dist/Toolkit-D4mQvhjq.d.mts.map +0 -1
  282. package/dist/dist-C0m0QnUP.mjs.map +0 -1
  283. package/dist/dist-CcRV3-A5.mjs.map +0 -1
  284. /package/dist/{chunk-uyGKjUfl.mjs → rolldown-runtime-EAsCxrDo.mjs} +0 -0
@@ -1,6 +1,7 @@
1
1
  import { assistantText, systemText, userText } from "./Items.mjs";
2
2
  import { assistantText as assistantText$1, assistantTexts } from "./Turn.mjs";
3
- import { c as it, n as globalExpect, o as describe } from "../dist-CcRV3-A5.mjs";
3
+ import { m as it, o as describe } from "../utils-CiH_DjFW.mjs";
4
+ import { n as globalExpect } from "../test.DNmyFkvJ-YPzDR0Co.mjs";
4
5
  //#region src/domain/Turn.test.ts
5
6
  const turnOf = (items) => ({
6
7
  items,
@@ -12,7 +13,7 @@ const turnOf = (items) => ({
12
13
  });
13
14
  describe("Turn.assistantTexts", () => {
14
15
  it("returns each output_text block in order across a single assistant message", () => {
15
- globalExpect(assistantTexts(turnOf([{
16
+ const turn = turnOf([{
16
17
  type: "message",
17
18
  role: "assistant",
18
19
  content: [{
@@ -22,21 +23,23 @@ describe("Turn.assistantTexts", () => {
22
23
  type: "output_text",
23
24
  text: "second"
24
25
  }]
25
- }]))).toEqual(["first", "second"]);
26
+ }]);
27
+ globalExpect(assistantTexts(turn)).toEqual(["first", "second"]);
26
28
  });
27
29
  it("preserves order across multiple assistant messages", () => {
28
- globalExpect(assistantTexts(turnOf([
30
+ const turn = turnOf([
29
31
  assistantText("alpha"),
30
32
  assistantText("beta"),
31
33
  assistantText("gamma")
32
- ]))).toEqual([
34
+ ]);
35
+ globalExpect(assistantTexts(turn)).toEqual([
33
36
  "alpha",
34
37
  "beta",
35
38
  "gamma"
36
39
  ]);
37
40
  });
38
41
  it("drops refusal blocks and non-assistant messages", () => {
39
- globalExpect(assistantTexts(turnOf([userText("ignored"), {
42
+ const turn = turnOf([userText("ignored"), {
40
43
  type: "message",
41
44
  role: "assistant",
42
45
  content: [{
@@ -46,7 +49,8 @@ describe("Turn.assistantTexts", () => {
46
49
  type: "refusal",
47
50
  text: "I can't help with that."
48
51
  }]
49
- }]))).toEqual(["kept"]);
52
+ }]);
53
+ globalExpect(assistantTexts(turn)).toEqual(["kept"]);
50
54
  });
51
55
  it("returns an empty array when there's nothing to extract", () => {
52
56
  globalExpect(assistantTexts(turnOf([]))).toEqual([]);
@@ -61,7 +65,7 @@ describe("Turn.assistantTexts", () => {
61
65
  });
62
66
  describe("Turn.assistantText", () => {
63
67
  it("concatenates output_text across a single assistant message's content blocks", () => {
64
- globalExpect(assistantText$1(turnOf([{
68
+ const turn = turnOf([{
65
69
  type: "message",
66
70
  role: "assistant",
67
71
  content: [{
@@ -71,20 +75,23 @@ describe("Turn.assistantText", () => {
71
75
  type: "output_text",
72
76
  text: "world"
73
77
  }]
74
- }]))).toBe("hello world");
78
+ }]);
79
+ globalExpect(assistantText$1(turn)).toBe("hello world");
75
80
  });
76
81
  it("concatenates output_text across multiple assistant messages", () => {
77
- globalExpect(assistantText$1(turnOf([assistantText("first "), assistantText("second")]))).toBe("first second");
82
+ const turn = turnOf([assistantText("first "), assistantText("second")]);
83
+ globalExpect(assistantText$1(turn)).toBe("first second");
78
84
  });
79
85
  it("ignores non-assistant messages", () => {
80
- globalExpect(assistantText$1(turnOf([
86
+ const turn = turnOf([
81
87
  userText("ignored"),
82
88
  systemText("also ignored"),
83
89
  assistantText("kept")
84
- ]))).toBe("kept");
90
+ ]);
91
+ globalExpect(assistantText$1(turn)).toBe("kept");
85
92
  });
86
93
  it("ignores non-output_text content blocks (refusals, etc.)", () => {
87
- globalExpect(assistantText$1(turnOf([{
94
+ const turn = turnOf([{
88
95
  type: "message",
89
96
  role: "assistant",
90
97
  content: [
@@ -101,10 +108,11 @@ describe("Turn.assistantText", () => {
101
108
  text: "after"
102
109
  }
103
110
  ]
104
- }]))).toBe("before after");
111
+ }]);
112
+ globalExpect(assistantText$1(turn)).toBe("before after");
105
113
  });
106
114
  it("ignores function_call items even when interleaved with messages", () => {
107
- globalExpect(assistantText$1(turnOf([
115
+ const turn = turnOf([
108
116
  assistantText("text "),
109
117
  {
110
118
  type: "function_call",
@@ -113,21 +121,23 @@ describe("Turn.assistantText", () => {
113
121
  arguments: "{}"
114
122
  },
115
123
  assistantText("more text")
116
- ]))).toBe("text more text");
124
+ ]);
125
+ globalExpect(assistantText$1(turn)).toBe("text more text");
117
126
  });
118
127
  it("returns the empty string when no assistant messages exist", () => {
119
128
  globalExpect(assistantText$1(turnOf([]))).toBe("");
120
129
  globalExpect(assistantText$1(turnOf([userText("only user")]))).toBe("");
121
130
  });
122
131
  it("returns the empty string when the assistant message has no output_text blocks", () => {
123
- globalExpect(assistantText$1(turnOf([{
132
+ const turn = turnOf([{
124
133
  type: "message",
125
134
  role: "assistant",
126
135
  content: [{
127
136
  type: "refusal",
128
137
  text: "I can't help."
129
138
  }]
130
- }]))).toBe("");
139
+ }]);
140
+ globalExpect(assistantText$1(turn)).toBe("");
131
141
  });
132
142
  });
133
143
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"Turn.test.mjs","names":["Turn.assistantTexts","Items.assistantText","Items.userText","Turn.assistantText","Items.systemText"],"sources":["../../src/domain/Turn.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\"\nimport * as Items from \"./Items.js\"\nimport * as Turn from \"./Turn.js\"\n\nconst turnOf = (items: Turn.Turn[\"items\"]): Turn.Turn => ({\n items,\n usage: { input_tokens: 0, output_tokens: 0 },\n stop_reason: \"stop\",\n})\n\ndescribe(\"Turn.assistantTexts\", () => {\n it(\"returns each output_text block in order across a single assistant message\", () => {\n const turn = turnOf([\n {\n type: \"message\",\n role: \"assistant\",\n content: [\n { type: \"output_text\", text: \"first\" },\n { type: \"output_text\", text: \"second\" },\n ],\n },\n ])\n\n expect(Turn.assistantTexts(turn)).toEqual([\"first\", \"second\"])\n })\n\n it(\"preserves order across multiple assistant messages\", () => {\n const turn = turnOf([\n Items.assistantText(\"alpha\"),\n Items.assistantText(\"beta\"),\n Items.assistantText(\"gamma\"),\n ])\n\n expect(Turn.assistantTexts(turn)).toEqual([\"alpha\", \"beta\", \"gamma\"])\n })\n\n it(\"drops refusal blocks and non-assistant messages\", () => {\n const turn = turnOf([\n Items.userText(\"ignored\"),\n {\n type: \"message\",\n role: \"assistant\",\n content: [\n { type: \"output_text\", text: \"kept\" },\n { type: \"refusal\", text: \"I can't help with that.\" },\n ],\n },\n ])\n\n expect(Turn.assistantTexts(turn)).toEqual([\"kept\"])\n })\n\n it(\"returns an empty array when there's nothing to extract\", () => {\n expect(Turn.assistantTexts(turnOf([]))).toEqual([])\n expect(Turn.assistantTexts(turnOf([Items.userText(\"only user\")]))).toEqual([])\n })\n\n it(\"composes with caller-chosen separators\", () => {\n const turn = turnOf([Items.assistantText(\"hello\"), Items.assistantText(\"world\")])\n\n expect(Turn.assistantTexts(turn).join(\"\")).toBe(\"helloworld\")\n expect(Turn.assistantTexts(turn).join(\" \")).toBe(\"hello world\")\n expect(Turn.assistantTexts(turn).join(\"\\n\")).toBe(\"hello\\nworld\")\n })\n})\n\ndescribe(\"Turn.assistantText\", () => {\n it(\"concatenates output_text across a single assistant message's content blocks\", () => {\n const turn = turnOf([\n {\n type: \"message\",\n role: \"assistant\",\n content: [\n { type: \"output_text\", text: \"hello \" },\n { type: \"output_text\", text: \"world\" },\n ],\n },\n ])\n\n expect(Turn.assistantText(turn)).toBe(\"hello world\")\n })\n\n it(\"concatenates output_text across multiple assistant messages\", () => {\n const turn = turnOf([Items.assistantText(\"first \"), Items.assistantText(\"second\")])\n\n expect(Turn.assistantText(turn)).toBe(\"first second\")\n })\n\n it(\"ignores non-assistant messages\", () => {\n const turn = turnOf([\n Items.userText(\"ignored\"),\n Items.systemText(\"also ignored\"),\n Items.assistantText(\"kept\"),\n ])\n\n expect(Turn.assistantText(turn)).toBe(\"kept\")\n })\n\n it(\"ignores non-output_text content blocks (refusals, etc.)\", () => {\n const turn = turnOf([\n {\n type: \"message\",\n role: \"assistant\",\n content: [\n { type: \"output_text\", text: \"before \" },\n { type: \"refusal\", text: \"I can't help with that.\" },\n { type: \"output_text\", text: \"after\" },\n ],\n },\n ])\n\n expect(Turn.assistantText(turn)).toBe(\"before after\")\n })\n\n it(\"ignores function_call items even when interleaved with messages\", () => {\n const turn = turnOf([\n Items.assistantText(\"text \"),\n { type: \"function_call\", call_id: \"c1\", name: \"search\", arguments: \"{}\" },\n Items.assistantText(\"more text\"),\n ])\n\n expect(Turn.assistantText(turn)).toBe(\"text more text\")\n })\n\n it(\"returns the empty string when no assistant messages exist\", () => {\n expect(Turn.assistantText(turnOf([]))).toBe(\"\")\n expect(Turn.assistantText(turnOf([Items.userText(\"only user\")]))).toBe(\"\")\n })\n\n it(\"returns the empty string when the assistant message has no output_text blocks\", () => {\n const turn = turnOf([\n {\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"refusal\", text: \"I can't help.\" }],\n },\n ])\n\n expect(Turn.assistantText(turn)).toBe(\"\")\n })\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"Turn.test.mjs","names":["Turn.assistantTexts","Items.assistantText","Items.userText","Turn.assistantText","Items.systemText"],"sources":["../../src/domain/Turn.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\"\nimport * as Items from \"./Items.js\"\nimport * as Turn from \"./Turn.js\"\n\nconst turnOf = (items: Turn.Turn[\"items\"]): Turn.Turn => ({\n items,\n usage: { input_tokens: 0, output_tokens: 0 },\n stop_reason: \"stop\",\n})\n\ndescribe(\"Turn.assistantTexts\", () => {\n it(\"returns each output_text block in order across a single assistant message\", () => {\n const turn = turnOf([\n {\n type: \"message\",\n role: \"assistant\",\n content: [\n { type: \"output_text\", text: \"first\" },\n { type: \"output_text\", text: \"second\" },\n ],\n },\n ])\n\n expect(Turn.assistantTexts(turn)).toEqual([\"first\", \"second\"])\n })\n\n it(\"preserves order across multiple assistant messages\", () => {\n const turn = turnOf([\n Items.assistantText(\"alpha\"),\n Items.assistantText(\"beta\"),\n Items.assistantText(\"gamma\"),\n ])\n\n expect(Turn.assistantTexts(turn)).toEqual([\"alpha\", \"beta\", \"gamma\"])\n })\n\n it(\"drops refusal blocks and non-assistant messages\", () => {\n const turn = turnOf([\n Items.userText(\"ignored\"),\n {\n type: \"message\",\n role: \"assistant\",\n content: [\n { type: \"output_text\", text: \"kept\" },\n { type: \"refusal\", text: \"I can't help with that.\" },\n ],\n },\n ])\n\n expect(Turn.assistantTexts(turn)).toEqual([\"kept\"])\n })\n\n it(\"returns an empty array when there's nothing to extract\", () => {\n expect(Turn.assistantTexts(turnOf([]))).toEqual([])\n expect(Turn.assistantTexts(turnOf([Items.userText(\"only user\")]))).toEqual([])\n })\n\n it(\"composes with caller-chosen separators\", () => {\n const turn = turnOf([Items.assistantText(\"hello\"), Items.assistantText(\"world\")])\n\n expect(Turn.assistantTexts(turn).join(\"\")).toBe(\"helloworld\")\n expect(Turn.assistantTexts(turn).join(\" \")).toBe(\"hello world\")\n expect(Turn.assistantTexts(turn).join(\"\\n\")).toBe(\"hello\\nworld\")\n })\n})\n\ndescribe(\"Turn.assistantText\", () => {\n it(\"concatenates output_text across a single assistant message's content blocks\", () => {\n const turn = turnOf([\n {\n type: \"message\",\n role: \"assistant\",\n content: [\n { type: \"output_text\", text: \"hello \" },\n { type: \"output_text\", text: \"world\" },\n ],\n },\n ])\n\n expect(Turn.assistantText(turn)).toBe(\"hello world\")\n })\n\n it(\"concatenates output_text across multiple assistant messages\", () => {\n const turn = turnOf([Items.assistantText(\"first \"), Items.assistantText(\"second\")])\n\n expect(Turn.assistantText(turn)).toBe(\"first second\")\n })\n\n it(\"ignores non-assistant messages\", () => {\n const turn = turnOf([\n Items.userText(\"ignored\"),\n Items.systemText(\"also ignored\"),\n Items.assistantText(\"kept\"),\n ])\n\n expect(Turn.assistantText(turn)).toBe(\"kept\")\n })\n\n it(\"ignores non-output_text content blocks (refusals, etc.)\", () => {\n const turn = turnOf([\n {\n type: \"message\",\n role: \"assistant\",\n content: [\n { type: \"output_text\", text: \"before \" },\n { type: \"refusal\", text: \"I can't help with that.\" },\n { type: \"output_text\", text: \"after\" },\n ],\n },\n ])\n\n expect(Turn.assistantText(turn)).toBe(\"before after\")\n })\n\n it(\"ignores function_call items even when interleaved with messages\", () => {\n const turn = turnOf([\n Items.assistantText(\"text \"),\n { type: \"function_call\", call_id: \"c1\", name: \"search\", arguments: \"{}\" },\n Items.assistantText(\"more text\"),\n ])\n\n expect(Turn.assistantText(turn)).toBe(\"text more text\")\n })\n\n it(\"returns the empty string when no assistant messages exist\", () => {\n expect(Turn.assistantText(turnOf([]))).toBe(\"\")\n expect(Turn.assistantText(turnOf([Items.userText(\"only user\")]))).toBe(\"\")\n })\n\n it(\"returns the empty string when the assistant message has no output_text blocks\", () => {\n const turn = turnOf([\n {\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"refusal\", text: \"I can't help.\" }],\n },\n ])\n\n expect(Turn.assistantText(turn)).toBe(\"\")\n })\n})\n"],"mappings":"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"}
@@ -1,6 +1,4 @@
1
- import { i as ImageSource } from "../Image-C4vuBmu0.mjs";
2
-
3
- //#region src/embedding-model/Embedding.d.ts
1
+ import { i as ImageSource } from "../Image-BK8-4H6s.mjs";
4
2
  declare namespace Embedding_d_exports {
5
3
  export { BinaryEmbedding, EmbedContentPart, EmbedInput, Embedding, EmbeddingFor, Float32Embedding, Int8Embedding, MultivectorEmbedding, ResponseEncoding, SparseEmbedding, Usage, isBinary, isFloat32, isInt8, isMultivector, isSparse };
6
4
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Embedding.d.mts","names":[],"sources":["../../src/embedding-model/Embedding.ts"],"mappings":";;;;;;;;;;;KAOY,gBAAA;EAAA,SAA8B,IAAA;AAAA;EAAA,SAA4B,KAAA,EAAO,WAAA;AAAA;;;;;;;;;;KAWjE,UAAA;EAAA,SAEG,IAAA;AAAA;EAAA,SACA,KAAA,EAAO,WAAA;AAAA;EAAA,SACP,OAAA,EAAS,aAAA,CAAc,gBAAA;AAAA;;KAY1B,gBAAA;EAAA,SACD,IAAA;EAAA,SACA,MAAA,EAAQ,YAAA;AAAA;;;;;KAOP,aAAA;EAAA,SACD,IAAA;EAAA,SACA,MAAA,EAAQ,SAAA;AAAA;;;;;;KAQP,eAAA;EAAA,SACD,IAAA;EAAA,SACA,MAAA,EAAQ,UAAA;AAAA;;;;;;;;AAZnB;;;;;;;;;AAUA;;KAuBY,eAAA;EAAA,SACD,IAAA;EAAA,SACA,OAAA,EAAS,QAAA,CAAS,MAAA;AAAA;;;;AAF7B;;;;;;;KAeY,oBAAA;EAAA,SACD,IAAA;EAAA,SACA,OAAA,EAAS,aAAA,CAAc,YAAA;AAAA;AAAA,KAGtB,SAAA,GACR,gBAAA,GACA,aAAA,GACA,eAAA,GACA,eAAA,GACA,oBAAA;AAAA,cAES,SAAA,GAAa,CAAA,EAAG,SAAA,KAAY,CAAA,IAAK,gBAAA;AAAA,cACjC,MAAA,GAAU,CAAA,EAAG,SAAA,KAAY,CAAA,IAAK,aAAA;AAAA,cAC9B,QAAA,GAAY,CAAA,EAAG,SAAA,KAAY,CAAA,IAAK,eAAA;AAAA,cAChC,QAAA,GAAY,CAAA,EAAG,SAAA,KAAY,CAAA,IAAK,eAAA;AAAA,cAChC,aAAA,GAAiB,CAAA,EAAG,SAAA,KAAY,CAAA,IAAK,oBAAA;;;;AAXlD;;;;;;KAsBY,gBAAA;;;;;;;;;;;AAfZ;KA4BY,YAAA,OAAmB,CAAA,oCAC3B,gBAAA,IACC,CAAA,qBACC,aAAA,IACC,CAAA,uBACC,eAAA,IACC,CAAA,uBACC,eAAA,IACC,CAAA,4BACC,oBAAA,GACA,SAAA;;;;;;KAOA,KAAA;EAAA,SACD,WAAA;AAAA"}
1
+ {"version":3,"file":"Embedding.d.mts","names":[],"sources":["../../src/embedding-model/Embedding.ts"],"mappings":";;;;;;;;;KAOY;WAA8B;;WAA4B,OAAO;;;;;;;;;;;KAWjE;WAEG;;WACA,OAAO;;WACP,SAAS,cAAc;;;KAY1B;WACD;WACA,QAAQ;;;;;;KAOP;WACD;WACA,QAAQ;;;;;;;KAQP;WACD;WACA,QAAQ;;;;;;;;;;;;;;;;;;;;KAqBP;WACD;WACA,SAAS,SAAS;;;;;;;;;;;;KAajB;WACD;WACA,SAAS,cAAc;;KAGtB,YACR,mBACA,gBACA,kBACA,kBACA;cAES,YAAS,GAAO,cAAY,KAAK;cACjC,SAAM,GAAO,cAAY,KAAK;cAC9B,WAAQ,GAAO,cAAY,KAAK;cAChC,WAAQ,GAAO,cAAY,KAAK;cAChC,gBAAa,GAAO,cAAY,KAAK;;;;;;;;;;KAWtC;;;;;;;;;;;;KAaA,aAAa,MAAM,qCAC3B,oBACC,sBACC,iBACC,wBACC,mBACC,wBACC,mBACC,6BACC,uBACA;;;;;;KAOA;WACD"}
@@ -1,4 +1,4 @@
1
- import { n as __exportAll } from "../chunk-uyGKjUfl.mjs";
1
+ import { n as __exportAll } from "../rolldown-runtime-EAsCxrDo.mjs";
2
2
  //#region src/embedding-model/Embedding.ts
3
3
  var Embedding_exports = /* @__PURE__ */ __exportAll({
4
4
  isBinary: () => isBinary,
@@ -1,8 +1,6 @@
1
- import { t as AiError } from "../AiError-Bf1pq4BB.mjs";
1
+ import { t as AiError } from "../AiError-eLV9t1lU.mjs";
2
2
  import { EmbedInput, EmbeddingFor, ResponseEncoding, Usage } from "./Embedding.mjs";
3
3
  import { Context, Effect } from "effect";
4
-
5
- //#region src/embedding-model/EmbeddingModel.d.ts
6
4
  declare namespace EmbeddingModel_d_exports {
7
5
  export { CommonEmbedManyRequest, CommonEmbedRequest, EmbedEncoding, EmbedManyResponse, EmbedResponse, EmbeddingModel, EmbeddingModelService, assertEncoding, embed, embedMany };
8
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EmbeddingModel.d.mts","names":[],"sources":["../../src/embedding-model/EmbeddingModel.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAyBA;;;;;AAYA;KAZY,aAAA;;;;;;;;;;;KAYA,kBAAA;EAAA,SACD,KAAA,EAAO,UAAA;EAiCgB;;;;EAAA,SA5BvB,KAAA;EA6BQ;;;;;;;EAAA,SArBR,IAAA;EAqBgC;;AAU3C;;;EAV2C,SAfhC,UAAA;EA0BwB;;;;;EAAA,SApBxB,QAAA,GAAW,aAAA;AAAA;;;;;;KAQV,sBAAA,GAAyB,IAAA,CAAK,kBAAA;EAAA,SAC/B,MAAA,EAAQ,aAAA,CAAc,UAAA;AAAA;;;;;;;;KAUrB,aAAA,WAAwB,gBAAA;EAAA,SACzB,SAAA,EAAW,YAAA,CAAa,CAAA;EAAA,SACxB,KAAA,EAAO,KAAA;AAAA;;KAIN,iBAAA,WAA4B,gBAAA;EAAA,SAC7B,UAAA,EAAY,aAAA,CAAc,YAAA,CAAa,CAAA;EAAA,SACvC,KAAA,EAAO,KAAA;AAAA;AAAA,KAGN,qBAAA;EAAA,SACD,KAAA,aAAkB,aAAA,0BACzB,OAAA,EAAS,IAAA,CAAK,kBAAA;IAAA,SAA6C,QAAA,GAAW,CAAA;EAAA,MACnE,MAAA,CAAO,MAAA,CAAO,aAAA,CAAc,CAAA,GAAI,OAAA;EAAA,SAC5B,SAAA,aAAsB,aAAA,0BAC7B,OAAA,EAAS,IAAA,CAAK,sBAAA;IAAA,SAAiD,QAAA,GAAW,CAAA;EAAA,MACvE,MAAA,CAAO,MAAA,CAAO,iBAAA,CAAkB,CAAA,GAAI,OAAA;AAAA;AAAA,cAC1C,mBAAA;cAEY,cAAA,SAAuB,mBAAA;;cAKvB,KAAA,aAAmB,aAAA,0BAC9B,OAAA,EAAS,IAAA,CAAK,kBAAA;EAAA,SAA6C,QAAA,GAAW,CAAA;AAAA,MACrE,MAAA,CAAO,MAAA,CAAO,aAAA,CAAc,CAAA,GAAI,OAAA,EAAiB,cAAA;;cAIvC,SAAA,aAAuB,aAAA,0BAClC,OAAA,EAAS,IAAA,CAAK,sBAAA;EAAA,SAAiD,QAAA,GAAW,CAAA;AAAA,MACzE,MAAA,CAAO,MAAA,CAAO,iBAAA,CAAkB,CAAA,GAAI,OAAA,EAAiB,cAAA;;;;;;;;;;;;;cAe3C,cAAA,GACX,QAAA,EAAU,aAAA,cACV,SAAA,EAAW,aAAA,CAAc,aAAA,GACzB,QAAA,aACC,MAAA,CAAO,MAAA,OAAa,OAAA"}
1
+ {"version":3,"file":"EmbeddingModel.d.mts","names":[],"sources":["../../src/embedding-model/EmbeddingModel.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;KAyBY;;;;;;;;;;;KAYA;WACD,OAAO;;;;;WAKP;;;;;;;;WAQA;;;;;;WAMA;;;;;;WAMA,WAAW;;;;;;;KAQV,yBAAyB,KAAK;WAC/B,QAAQ,cAAc;;;;;;;;;KAUrB,cAAc,UAAU;WACzB,WAAW,aAAa;WACxB,OAAO;;;KAIN,kBAAkB,UAAU;WAC7B,YAAY,cAAc,aAAa;WACvC,OAAO;;KAGN;WACD,QAAQ,UAAU,uCACzB,SAAS,KAAK;aAA6C,WAAW;QACnE,OAAO,OAAO,cAAc,IAAI;WAC5B,YAAY,UAAU,uCAC7B,SAAS,KAAK;aAAiD,WAAW;QACvE,OAAO,OAAO,kBAAkB,IAAI;;;cAG9B,uBAAuB;;cAKvB,QAAS,UAAU,uCAAqC,SAC1D,KAAK;WAA6C,WAAW;MACrE,OAAO,OAAO,cAAc,IAAI,SAAiB;;cAIvC,YAAa,UAAU,uCAAqC,SAC9D,KAAK;WAAiD,WAAW;MACzE,OAAO,OAAO,kBAAkB,IAAI,SAAiB;;;;;;;;;;;;;cAe3C,iBAAc,UACf,2BAAyB,WACxB,cAAc,gBAAc,qBAEtC,OAAO,aAAa"}
@@ -1,4 +1,4 @@
1
- import { n as __exportAll } from "../chunk-uyGKjUfl.mjs";
1
+ import { n as __exportAll } from "../rolldown-runtime-EAsCxrDo.mjs";
2
2
  import { Unsupported } from "../domain/AiError.mjs";
3
3
  import { Context, Effect } from "effect";
4
4
  //#region src/embedding-model/EmbeddingModel.ts
@@ -1 +1 @@
1
- {"version":3,"file":"EmbeddingModel.mjs","names":["AiError.Unsupported"],"sources":["../../src/embedding-model/EmbeddingModel.ts"],"sourcesContent":["import { Context, Effect } from \"effect\"\nimport * as AiError from \"../domain/AiError.js\"\nimport type { EmbeddingFor, EmbedInput, ResponseEncoding, Usage } from \"./Embedding.js\"\n\n/**\n * Output representation requested from the provider. Cross-provider dense\n * quantization only, the same vector at different storage cost:\n * - `float32`: universal default.\n * - `int8`: ~4x smaller, minimal recall loss on most benchmarks. Supported\n * by Cohere, Voyage, Jina (binary only), Mixedbread.\n * - `binary`: ~32x smaller, meaningful recall loss but pairs well with a\n * float32 reranker pass over a small candidate set.\n *\n * Non-dense representations (`sparse`, `multivector`) are a different vector\n * *structure*, not a storage option, and are produced by Jina only. They\n * live on `JinaEncoding`, not here (the same widening pattern `task` uses).\n * The response `Embedding` union still carries all arms, see\n * {@link ResponseEncoding}.\n *\n * Each provider's typed request narrows this to its supported set. On the\n * generic `EmbeddingModel` path, a provider that emits float32 only (OpenAI,\n * Gemini) rejects a non-float32 encoding with `AiError.Unsupported`\n * (bucket 1) via {@link assertEncoding}, rather than silently returning a\n * mislabeled float32 vector.\n */\nexport type EmbedEncoding = \"float32\" | \"int8\" | \"binary\"\n\n/**\n * Cross-provider single-embed request. Mirrors the shape of\n * `LanguageModel.CommonRequest`: cross-cutting fields here, vendor\n * specifics in the provider's typed request.\n *\n * Provider-specific extensions (Cohere widened `task` enum, Jina LoRA\n * tasks, Mixedbread free-form `prompt`, etc.) live in that provider's own\n * request interface, which extends this and narrows `model` / widens\n * `task`.\n */\nexport type CommonEmbedRequest = {\n readonly input: EmbedInput\n /**\n * Model identifier. Each provider narrows this to its typed literal\n * union, so code that yields a typed provider tag gets autocompletion.\n */\n readonly model: string\n /**\n * Retrieval-task hint. Applies to the input. OpenAI ignores this;\n * Mixedbread doesn't have it; Cohere v3+ requires it on the wire (typed\n * as required in `CohereEmbedRequest`). Provider-specific task enums\n * (classification, clustering, code retrieval, …) live on the\n * provider's own request type.\n */\n readonly task?: \"query\" | \"document\"\n /**\n * Matryoshka truncation. Default: provider's native dimension.\n * Discrete-value providers (Cohere, Vertex `multimodalembedding@001`)\n * narrow this to a literal union in their typed request.\n */\n readonly dimensions?: number\n /**\n * Output representation - see {@link EmbedEncoding}. Dense float32 is the\n * default; provider layers reject unsupported values up front with\n * `InvalidRequest`.\n */\n readonly encoding?: EmbedEncoding\n}\n\n/**\n * Cross-provider batch-embed request. One `task` for the whole batch -\n * mixed-task batches aren't a real provider feature (rerankers exist for\n * that).\n */\nexport type CommonEmbedManyRequest = Omit<CommonEmbedRequest, \"input\"> & {\n readonly inputs: ReadonlyArray<EmbedInput>\n}\n\n/**\n * Single-embed response. The `embedding` type is determined by the\n * request's `encoding` field via `EmbeddingFor<E>` — callers that don't\n * specify an encoding get a `Float32Embedding` directly with no runtime\n * narrowing. Defaults to `undefined` for back-compat with consumers that\n * use the bare `EmbedResponse` name.\n */\nexport type EmbedResponse<E extends ResponseEncoding | undefined = undefined> = {\n readonly embedding: EmbeddingFor<E>\n readonly usage: Usage\n}\n\n/** Batch-embed response. Same encoding rule as {@link EmbedResponse}. */\nexport type EmbedManyResponse<E extends ResponseEncoding | undefined = undefined> = {\n readonly embeddings: ReadonlyArray<EmbeddingFor<E>>\n readonly usage: Usage\n}\n\nexport type EmbeddingModelService = {\n readonly embed: <E extends EmbedEncoding | undefined = undefined>(\n request: Omit<CommonEmbedRequest, \"encoding\"> & { readonly encoding?: E },\n ) => Effect.Effect<EmbedResponse<E>, AiError.AiError>\n readonly embedMany: <E extends EmbedEncoding | undefined = undefined>(\n request: Omit<CommonEmbedManyRequest, \"encoding\"> & { readonly encoding?: E },\n ) => Effect.Effect<EmbedManyResponse<E>, AiError.AiError>\n}\n\nexport class EmbeddingModel extends Context.Service<EmbeddingModel, EmbeddingModelService>()(\n \"@betalyra/effect-uai/EmbeddingModel\",\n) {}\n\n/** Embed a single input. */\nexport const embed = <E extends EmbedEncoding | undefined = undefined>(\n request: Omit<CommonEmbedRequest, \"encoding\"> & { readonly encoding?: E },\n): Effect.Effect<EmbedResponse<E>, AiError.AiError, EmbeddingModel> =>\n Effect.flatMap(EmbeddingModel, (m) => m.embed(request))\n\n/** Embed a batch in one provider call. Same `task` for every input. */\nexport const embedMany = <E extends EmbedEncoding | undefined = undefined>(\n request: Omit<CommonEmbedManyRequest, \"encoding\"> & { readonly encoding?: E },\n): Effect.Effect<EmbedManyResponse<E>, AiError.AiError, EmbeddingModel> =>\n Effect.flatMap(EmbeddingModel, (m) => m.embedMany(request))\n\n/**\n * Guard a requested `encoding` against a provider's supported set. Returns\n * `void` when the encoding is unset or supported, and fails\n * `AiError.Unsupported` (bucket 1) otherwise.\n *\n * Used by the generic-tag registration of providers that emit a strict\n * subset of `EmbedEncoding`: OpenAI / Gemini pass `[\"float32\"]`, Jina passes\n * `[\"float32\", \"binary\"]`. Without this guard, a non-supported encoding on\n * the generic path silently returns a float32 vector mislabeled as the\n * requested type (the `as`-cast lie), which breaks downstream storage and\n * vector math.\n */\nexport const assertEncoding = (\n encoding: EmbedEncoding | undefined,\n supported: ReadonlyArray<EmbedEncoding>,\n provider: string,\n): Effect.Effect<void, AiError.AiError> =>\n encoding === undefined || supported.includes(encoding)\n ? Effect.void\n : Effect.fail(\n new AiError.Unsupported({\n provider,\n capability: \"encoding\",\n reason: `${provider} emits ${supported.join(\" / \")} only; encoding=\"${encoding}\" is unavailable.`,\n }),\n )\n"],"mappings":";;;;;;;;;;AAsGA,IAAa,iBAAb,cAAoC,QAAQ,SAAgD,CAC1F,sCACD,CAAC;;AAGF,MAAa,SACX,YAEA,OAAO,QAAQ,iBAAiB,MAAM,EAAE,MAAM,QAAQ,CAAC;;AAGzD,MAAa,aACX,YAEA,OAAO,QAAQ,iBAAiB,MAAM,EAAE,UAAU,QAAQ,CAAC;;;;;;;;;;;;;AAc7D,MAAa,kBACX,UACA,WACA,aAEA,aAAa,KAAA,KAAa,UAAU,SAAS,SAAS,GAClD,OAAO,OACP,OAAO,KACL,IAAIA,YAAoB;CACtB;CACA,YAAY;CACZ,QAAQ,GAAG,SAAS,SAAS,UAAU,KAAK,MAAM,CAAC,mBAAmB,SAAS;CAChF,CAAC,CACH"}
1
+ {"version":3,"file":"EmbeddingModel.mjs","names":["AiError.Unsupported"],"sources":["../../src/embedding-model/EmbeddingModel.ts"],"sourcesContent":["import { Context, Effect } from \"effect\"\nimport * as AiError from \"../domain/AiError.js\"\nimport type { EmbeddingFor, EmbedInput, ResponseEncoding, Usage } from \"./Embedding.js\"\n\n/**\n * Output representation requested from the provider. Cross-provider dense\n * quantization only, the same vector at different storage cost:\n * - `float32`: universal default.\n * - `int8`: ~4x smaller, minimal recall loss on most benchmarks. Supported\n * by Cohere, Voyage, Jina (binary only), Mixedbread.\n * - `binary`: ~32x smaller, meaningful recall loss but pairs well with a\n * float32 reranker pass over a small candidate set.\n *\n * Non-dense representations (`sparse`, `multivector`) are a different vector\n * *structure*, not a storage option, and are produced by Jina only. They\n * live on `JinaEncoding`, not here (the same widening pattern `task` uses).\n * The response `Embedding` union still carries all arms, see\n * {@link ResponseEncoding}.\n *\n * Each provider's typed request narrows this to its supported set. On the\n * generic `EmbeddingModel` path, a provider that emits float32 only (OpenAI,\n * Gemini) rejects a non-float32 encoding with `AiError.Unsupported`\n * (bucket 1) via {@link assertEncoding}, rather than silently returning a\n * mislabeled float32 vector.\n */\nexport type EmbedEncoding = \"float32\" | \"int8\" | \"binary\"\n\n/**\n * Cross-provider single-embed request. Mirrors the shape of\n * `LanguageModel.CommonRequest`: cross-cutting fields here, vendor\n * specifics in the provider's typed request.\n *\n * Provider-specific extensions (Cohere widened `task` enum, Jina LoRA\n * tasks, Mixedbread free-form `prompt`, etc.) live in that provider's own\n * request interface, which extends this and narrows `model` / widens\n * `task`.\n */\nexport type CommonEmbedRequest = {\n readonly input: EmbedInput\n /**\n * Model identifier. Each provider narrows this to its typed literal\n * union, so code that yields a typed provider tag gets autocompletion.\n */\n readonly model: string\n /**\n * Retrieval-task hint. Applies to the input. OpenAI ignores this;\n * Mixedbread doesn't have it; Cohere v3+ requires it on the wire (typed\n * as required in `CohereEmbedRequest`). Provider-specific task enums\n * (classification, clustering, code retrieval, …) live on the\n * provider's own request type.\n */\n readonly task?: \"query\" | \"document\"\n /**\n * Matryoshka truncation. Default: provider's native dimension.\n * Discrete-value providers (Cohere, Vertex `multimodalembedding@001`)\n * narrow this to a literal union in their typed request.\n */\n readonly dimensions?: number\n /**\n * Output representation - see {@link EmbedEncoding}. Dense float32 is the\n * default; provider layers reject unsupported values up front with\n * `InvalidRequest`.\n */\n readonly encoding?: EmbedEncoding\n}\n\n/**\n * Cross-provider batch-embed request. One `task` for the whole batch -\n * mixed-task batches aren't a real provider feature (rerankers exist for\n * that).\n */\nexport type CommonEmbedManyRequest = Omit<CommonEmbedRequest, \"input\"> & {\n readonly inputs: ReadonlyArray<EmbedInput>\n}\n\n/**\n * Single-embed response. The `embedding` type is determined by the\n * request's `encoding` field via `EmbeddingFor<E>` — callers that don't\n * specify an encoding get a `Float32Embedding` directly with no runtime\n * narrowing. Defaults to `undefined` for back-compat with consumers that\n * use the bare `EmbedResponse` name.\n */\nexport type EmbedResponse<E extends ResponseEncoding | undefined = undefined> = {\n readonly embedding: EmbeddingFor<E>\n readonly usage: Usage\n}\n\n/** Batch-embed response. Same encoding rule as {@link EmbedResponse}. */\nexport type EmbedManyResponse<E extends ResponseEncoding | undefined = undefined> = {\n readonly embeddings: ReadonlyArray<EmbeddingFor<E>>\n readonly usage: Usage\n}\n\nexport type EmbeddingModelService = {\n readonly embed: <E extends EmbedEncoding | undefined = undefined>(\n request: Omit<CommonEmbedRequest, \"encoding\"> & { readonly encoding?: E },\n ) => Effect.Effect<EmbedResponse<E>, AiError.AiError>\n readonly embedMany: <E extends EmbedEncoding | undefined = undefined>(\n request: Omit<CommonEmbedManyRequest, \"encoding\"> & { readonly encoding?: E },\n ) => Effect.Effect<EmbedManyResponse<E>, AiError.AiError>\n}\n\nexport class EmbeddingModel extends Context.Service<EmbeddingModel, EmbeddingModelService>()(\n \"@betalyra/effect-uai/EmbeddingModel\",\n) {}\n\n/** Embed a single input. */\nexport const embed = <E extends EmbedEncoding | undefined = undefined>(\n request: Omit<CommonEmbedRequest, \"encoding\"> & { readonly encoding?: E },\n): Effect.Effect<EmbedResponse<E>, AiError.AiError, EmbeddingModel> =>\n Effect.flatMap(EmbeddingModel, (m) => m.embed(request))\n\n/** Embed a batch in one provider call. Same `task` for every input. */\nexport const embedMany = <E extends EmbedEncoding | undefined = undefined>(\n request: Omit<CommonEmbedManyRequest, \"encoding\"> & { readonly encoding?: E },\n): Effect.Effect<EmbedManyResponse<E>, AiError.AiError, EmbeddingModel> =>\n Effect.flatMap(EmbeddingModel, (m) => m.embedMany(request))\n\n/**\n * Guard a requested `encoding` against a provider's supported set. Returns\n * `void` when the encoding is unset or supported, and fails\n * `AiError.Unsupported` (bucket 1) otherwise.\n *\n * Used by the generic-tag registration of providers that emit a strict\n * subset of `EmbedEncoding`: OpenAI / Gemini pass `[\"float32\"]`, Jina passes\n * `[\"float32\", \"binary\"]`. Without this guard, a non-supported encoding on\n * the generic path silently returns a float32 vector mislabeled as the\n * requested type (the `as`-cast lie), which breaks downstream storage and\n * vector math.\n */\nexport const assertEncoding = (\n encoding: EmbedEncoding | undefined,\n supported: ReadonlyArray<EmbedEncoding>,\n provider: string,\n): Effect.Effect<void, AiError.AiError> =>\n encoding === undefined || supported.includes(encoding)\n ? Effect.void\n : Effect.fail(\n new AiError.Unsupported({\n provider,\n capability: \"encoding\",\n reason: `${provider} emits ${supported.join(\" / \")} only; encoding=\"${encoding}\" is unavailable.`,\n }),\n )\n"],"mappings":";;;;;;;;;;AAsGA,IAAa,iBAAb,cAAoC,QAAQ,QAA+C,CAAC,CAC1F,qCACF,CAAC,CAAC,CAAC;;AAGH,MAAa,SACX,YAEA,OAAO,QAAQ,iBAAiB,MAAM,EAAE,MAAM,OAAO,CAAC;;AAGxD,MAAa,aACX,YAEA,OAAO,QAAQ,iBAAiB,MAAM,EAAE,UAAU,OAAO,CAAC;;;;;;;;;;;;;AAc5D,MAAa,kBACX,UACA,WACA,aAEA,aAAa,KAAA,KAAa,UAAU,SAAS,QAAQ,IACjD,OAAO,OACP,OAAO,KACL,IAAIA,YAAoB;CACtB;CACA,YAAY;CACZ,QAAQ,GAAG,SAAS,SAAS,UAAU,KAAK,KAAK,EAAE,mBAAmB,SAAS;AACjF,CAAC,CACH"}
@@ -1 +1 @@
1
- export { };
1
+ export {}
@@ -1,5 +1,6 @@
1
1
  import { embed, embedMany } from "./EmbeddingModel.mjs";
2
- import { c as it, o as describe, t as import_dist } from "../dist-CcRV3-A5.mjs";
2
+ import { m as it, o as describe } from "../utils-CiH_DjFW.mjs";
3
+ import { t as import_dist } from "../dist-BaenoU1A.mjs";
3
4
  //#region src/embedding-model/EmbeddingModel.test.ts
4
5
  describe("EmbedResponse<E> conditional narrowing", () => {
5
6
  it("defaults to Float32Embedding when E is undefined", () => {
@@ -26,24 +27,27 @@ describe("EmbedManyResponse<E> mirrors EmbedResponse<E>", () => {
26
27
  });
27
28
  describe("embed / embedMany free exports preserve E in their return type", () => {
28
29
  it("embed with no encoding returns EmbedResponse<undefined> = Float32", () => {
29
- (0, import_dist.expectTypeOf)(embed({
30
+ const result = embed({
30
31
  input: "x",
31
32
  model: "m"
32
- })).toEqualTypeOf();
33
+ });
34
+ (0, import_dist.expectTypeOf)(result).toEqualTypeOf();
33
35
  });
34
36
  it("embed with encoding: int8 returns EmbedResponse<int8>", () => {
35
- (0, import_dist.expectTypeOf)(embed({
37
+ const result = embed({
36
38
  input: "x",
37
39
  model: "m",
38
40
  encoding: "int8"
39
- })).toEqualTypeOf();
41
+ });
42
+ (0, import_dist.expectTypeOf)(result).toEqualTypeOf();
40
43
  });
41
44
  it("embedMany with encoding: binary returns EmbedManyResponse<binary>", () => {
42
- (0, import_dist.expectTypeOf)(embedMany({
45
+ const result = embedMany({
43
46
  inputs: ["x"],
44
47
  model: "m",
45
48
  encoding: "binary"
46
- })).toEqualTypeOf();
49
+ });
50
+ (0, import_dist.expectTypeOf)(result).toEqualTypeOf();
47
51
  });
48
52
  it("rejects non-dense encodings on the generic path (trimmed EmbedEncoding)", () => {
49
53
  embedMany({
@@ -58,11 +62,12 @@ describe("embed / embedMany free exports preserve E in their return type", () =>
58
62
  });
59
63
  });
60
64
  it("when the request is widened to CommonEmbedRequest, the response is the open union", () => {
61
- (0, import_dist.expectTypeOf)(embed({
65
+ const result = embed({
62
66
  input: "x",
63
67
  model: "m",
64
68
  encoding: "int8"
65
- })).toEqualTypeOf();
69
+ });
70
+ (0, import_dist.expectTypeOf)(result).toEqualTypeOf();
66
71
  });
67
72
  });
68
73
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"EmbeddingModel.test.mjs","names":[],"sources":["../../src/embedding-model/EmbeddingModel.test.ts"],"sourcesContent":["import { Effect } from \"effect\"\nimport { describe, expectTypeOf, it } from \"vitest\"\nimport type * as AiError from \"../domain/AiError.js\"\nimport type {\n BinaryEmbedding,\n Float32Embedding,\n Int8Embedding,\n MultivectorEmbedding,\n SparseEmbedding,\n} from \"./Embedding.js\"\nimport {\n type EmbedEncoding,\n embed,\n embedMany,\n type EmbedManyResponse,\n type EmbedResponse,\n EmbeddingModel,\n} from \"./EmbeddingModel.js\"\n\n// Type-level tests only. The actual narrowing happens at the type system\n// boundary — the runtime impl is exercised in provider-specific test files.\ndescribe(\"EmbedResponse<E> conditional narrowing\", () => {\n it(\"defaults to Float32Embedding when E is undefined\", () => {\n expectTypeOf<EmbedResponse>().toEqualTypeOf<{\n readonly embedding: Float32Embedding\n readonly usage: import(\"./Embedding.js\").Usage\n }>()\n })\n\n it(\"maps each encoding literal to the matching Embedding variant\", () => {\n expectTypeOf<EmbedResponse<\"float32\">[\"embedding\"]>().toEqualTypeOf<Float32Embedding>()\n expectTypeOf<EmbedResponse<\"int8\">[\"embedding\"]>().toEqualTypeOf<Int8Embedding>()\n expectTypeOf<EmbedResponse<\"binary\">[\"embedding\"]>().toEqualTypeOf<BinaryEmbedding>()\n expectTypeOf<EmbedResponse<\"sparse\">[\"embedding\"]>().toEqualTypeOf<SparseEmbedding>()\n expectTypeOf<EmbedResponse<\"multivector\">[\"embedding\"]>().toEqualTypeOf<MultivectorEmbedding>()\n })\n\n it(\"falls back to the open Embedding union when E is the full EmbedEncoding\", () => {\n expectTypeOf<EmbedResponse<EmbedEncoding>[\"embedding\"]>().toEqualTypeOf<\n Float32Embedding | Int8Embedding | BinaryEmbedding | SparseEmbedding | MultivectorEmbedding\n >()\n })\n})\n\ndescribe(\"EmbedManyResponse<E> mirrors EmbedResponse<E>\", () => {\n it(\"defaults to ReadonlyArray<Float32Embedding>\", () => {\n expectTypeOf<EmbedManyResponse[\"embeddings\"]>().toEqualTypeOf<ReadonlyArray<Float32Embedding>>()\n })\n\n it(\"narrows per encoding\", () => {\n expectTypeOf<EmbedManyResponse<\"int8\">[\"embeddings\"]>().toEqualTypeOf<\n ReadonlyArray<Int8Embedding>\n >()\n })\n})\n\ndescribe(\"embed / embedMany free exports preserve E in their return type\", () => {\n it(\"embed with no encoding returns EmbedResponse<undefined> = Float32\", () => {\n const result = embed({ input: \"x\", model: \"m\" })\n expectTypeOf(result).toEqualTypeOf<\n Effect.Effect<EmbedResponse<undefined>, AiError.AiError, EmbeddingModel>\n >()\n })\n\n it(\"embed with encoding: int8 returns EmbedResponse<int8>\", () => {\n const result = embed({ input: \"x\", model: \"m\", encoding: \"int8\" })\n expectTypeOf(result).toEqualTypeOf<\n Effect.Effect<EmbedResponse<\"int8\">, AiError.AiError, EmbeddingModel>\n >()\n })\n\n it(\"embedMany with encoding: binary returns EmbedManyResponse<binary>\", () => {\n const result = embedMany({ inputs: [\"x\"], model: \"m\", encoding: \"binary\" })\n expectTypeOf(result).toEqualTypeOf<\n Effect.Effect<EmbedManyResponse<\"binary\">, AiError.AiError, EmbeddingModel>\n >()\n })\n\n it(\"rejects non-dense encodings on the generic path (trimmed EmbedEncoding)\", () => {\n // `sparse` / `multivector` are Jina-only representation kinds, not part\n // of the cross-provider request set. Requesting them on the generic\n // helper is a compile error; they're reachable only via the typed\n // `JinaEmbedding` tag.\n // These calls exist only to assert the encoding is a compile error; they\n // are intentionally never run, so the floating-effect check is off here.\n // @effect-diagnostics effect/floatingEffect:off\n // @ts-expect-error \"multivector\" is not an EmbedEncoding\n embedMany({ inputs: [\"x\"], model: \"m\", encoding: \"multivector\" })\n // @ts-expect-error \"sparse\" is not an EmbedEncoding\n embed({ input: \"x\", model: \"m\", encoding: \"sparse\" })\n // @effect-diagnostics effect/floatingEffect:error\n })\n\n it(\"when the request is widened to CommonEmbedRequest, the response is the open union\", () => {\n // Demonstrates the documented case: annotating the request type erases\n // the literal `encoding` and the response falls back to `Embedding`.\n const req: { input: string; model: string; encoding?: EmbedEncoding } = {\n input: \"x\",\n model: \"m\",\n encoding: \"int8\",\n }\n const result = embed(req)\n expectTypeOf(result).toEqualTypeOf<\n Effect.Effect<EmbedResponse<EmbedEncoding>, AiError.AiError, EmbeddingModel>\n >()\n })\n})\n"],"mappings":";;;AAqBA,SAAS,gDAAgD;AACvD,IAAG,0DAA0D;AAC3D,GAAA,GAAA,YAAA,eAA6B,CAAC,eAG1B;GACJ;AAEF,IAAG,sEAAsE;AACvE,GAAA,GAAA,YAAA,eAAqD,CAAC,eAAiC;AACvF,GAAA,GAAA,YAAA,eAAkD,CAAC,eAA8B;AACjF,GAAA,GAAA,YAAA,eAAoD,CAAC,eAAgC;AACrF,GAAA,GAAA,YAAA,eAAoD,CAAC,eAAgC;AACrF,GAAA,GAAA,YAAA,eAAyD,CAAC,eAAqC;GAC/F;AAEF,IAAG,iFAAiF;AAClF,GAAA,GAAA,YAAA,eAAyD,CAAC,eAEvD;GACH;EACF;AAEF,SAAS,uDAAuD;AAC9D,IAAG,qDAAqD;AACtD,GAAA,GAAA,YAAA,eAA+C,CAAC,eAAgD;GAChG;AAEF,IAAG,8BAA8B;AAC/B,GAAA,GAAA,YAAA,eAAuD,CAAC,eAErD;GACH;EACF;AAEF,SAAS,wEAAwE;AAC/E,IAAG,2EAA2E;AAE5E,GAAA,GAAA,YAAA,cADe,MAAM;GAAE,OAAO;GAAK,OAAO;GAAK,CAC5B,CAAC,CAAC,eAElB;GACH;AAEF,IAAG,+DAA+D;AAEhE,GAAA,GAAA,YAAA,cADe,MAAM;GAAE,OAAO;GAAK,OAAO;GAAK,UAAU;GAAQ,CAC9C,CAAC,CAAC,eAElB;GACH;AAEF,IAAG,2EAA2E;AAE5E,GAAA,GAAA,YAAA,cADe,UAAU;GAAE,QAAQ,CAAC,IAAI;GAAE,OAAO;GAAK,UAAU;GAAU,CACvD,CAAC,CAAC,eAElB;GACH;AAEF,IAAG,iFAAiF;AASlF,YAAU;GAAE,QAAQ,CAAC,IAAI;GAAE,OAAO;GAAK,UAAU;GAAe,CAAC;AAEjE,QAAM;GAAE,OAAO;GAAK,OAAO;GAAK,UAAU;GAAU,CAAC;GAErD;AAEF,IAAG,2FAA2F;AAS5F,GAAA,GAAA,YAAA,cADe,MAAM;GAJnB,OAAO;GACP,OAAO;GACP,UAAU;GAEY,CACL,CAAC,CAAC,eAElB;GACH;EACF"}
1
+ {"version":3,"file":"EmbeddingModel.test.mjs","names":[],"sources":["../../src/embedding-model/EmbeddingModel.test.ts"],"sourcesContent":["import { Effect } from \"effect\"\nimport { describe, expectTypeOf, it } from \"vitest\"\nimport type * as AiError from \"../domain/AiError.js\"\nimport type {\n BinaryEmbedding,\n Float32Embedding,\n Int8Embedding,\n MultivectorEmbedding,\n SparseEmbedding,\n} from \"./Embedding.js\"\nimport {\n type EmbedEncoding,\n embed,\n embedMany,\n type EmbedManyResponse,\n type EmbedResponse,\n EmbeddingModel,\n} from \"./EmbeddingModel.js\"\n\n// Type-level tests only. The actual narrowing happens at the type system\n// boundary — the runtime impl is exercised in provider-specific test files.\ndescribe(\"EmbedResponse<E> conditional narrowing\", () => {\n it(\"defaults to Float32Embedding when E is undefined\", () => {\n expectTypeOf<EmbedResponse>().toEqualTypeOf<{\n readonly embedding: Float32Embedding\n readonly usage: import(\"./Embedding.js\").Usage\n }>()\n })\n\n it(\"maps each encoding literal to the matching Embedding variant\", () => {\n expectTypeOf<EmbedResponse<\"float32\">[\"embedding\"]>().toEqualTypeOf<Float32Embedding>()\n expectTypeOf<EmbedResponse<\"int8\">[\"embedding\"]>().toEqualTypeOf<Int8Embedding>()\n expectTypeOf<EmbedResponse<\"binary\">[\"embedding\"]>().toEqualTypeOf<BinaryEmbedding>()\n expectTypeOf<EmbedResponse<\"sparse\">[\"embedding\"]>().toEqualTypeOf<SparseEmbedding>()\n expectTypeOf<EmbedResponse<\"multivector\">[\"embedding\"]>().toEqualTypeOf<MultivectorEmbedding>()\n })\n\n it(\"falls back to the open Embedding union when E is the full EmbedEncoding\", () => {\n expectTypeOf<EmbedResponse<EmbedEncoding>[\"embedding\"]>().toEqualTypeOf<\n Float32Embedding | Int8Embedding | BinaryEmbedding | SparseEmbedding | MultivectorEmbedding\n >()\n })\n})\n\ndescribe(\"EmbedManyResponse<E> mirrors EmbedResponse<E>\", () => {\n it(\"defaults to ReadonlyArray<Float32Embedding>\", () => {\n expectTypeOf<EmbedManyResponse[\"embeddings\"]>().toEqualTypeOf<ReadonlyArray<Float32Embedding>>()\n })\n\n it(\"narrows per encoding\", () => {\n expectTypeOf<EmbedManyResponse<\"int8\">[\"embeddings\"]>().toEqualTypeOf<\n ReadonlyArray<Int8Embedding>\n >()\n })\n})\n\ndescribe(\"embed / embedMany free exports preserve E in their return type\", () => {\n it(\"embed with no encoding returns EmbedResponse<undefined> = Float32\", () => {\n const result = embed({ input: \"x\", model: \"m\" })\n expectTypeOf(result).toEqualTypeOf<\n Effect.Effect<EmbedResponse<undefined>, AiError.AiError, EmbeddingModel>\n >()\n })\n\n it(\"embed with encoding: int8 returns EmbedResponse<int8>\", () => {\n const result = embed({ input: \"x\", model: \"m\", encoding: \"int8\" })\n expectTypeOf(result).toEqualTypeOf<\n Effect.Effect<EmbedResponse<\"int8\">, AiError.AiError, EmbeddingModel>\n >()\n })\n\n it(\"embedMany with encoding: binary returns EmbedManyResponse<binary>\", () => {\n const result = embedMany({ inputs: [\"x\"], model: \"m\", encoding: \"binary\" })\n expectTypeOf(result).toEqualTypeOf<\n Effect.Effect<EmbedManyResponse<\"binary\">, AiError.AiError, EmbeddingModel>\n >()\n })\n\n it(\"rejects non-dense encodings on the generic path (trimmed EmbedEncoding)\", () => {\n // `sparse` / `multivector` are Jina-only representation kinds, not part\n // of the cross-provider request set. Requesting them on the generic\n // helper is a compile error; they're reachable only via the typed\n // `JinaEmbedding` tag.\n // These calls exist only to assert the encoding is a compile error; they\n // are intentionally never run, so the floating-effect check is off here.\n // @effect-diagnostics effect/floatingEffect:off\n // @ts-expect-error \"multivector\" is not an EmbedEncoding\n embedMany({ inputs: [\"x\"], model: \"m\", encoding: \"multivector\" })\n // @ts-expect-error \"sparse\" is not an EmbedEncoding\n embed({ input: \"x\", model: \"m\", encoding: \"sparse\" })\n // @effect-diagnostics effect/floatingEffect:error\n })\n\n it(\"when the request is widened to CommonEmbedRequest, the response is the open union\", () => {\n // Demonstrates the documented case: annotating the request type erases\n // the literal `encoding` and the response falls back to `Embedding`.\n const req: { input: string; model: string; encoding?: EmbedEncoding } = {\n input: \"x\",\n model: \"m\",\n encoding: \"int8\",\n }\n const result = embed(req)\n expectTypeOf(result).toEqualTypeOf<\n Effect.Effect<EmbedResponse<EmbedEncoding>, AiError.AiError, EmbeddingModel>\n >()\n })\n})\n"],"mappings":";;;;AAqBA,SAAS,gDAAgD;CACvD,GAAG,0DAA0D;EAC3D,CAAA,GAAA,YAAA,aAAA,CAA4B,CAAC,CAAC,cAG3B;CACL,CAAC;CAED,GAAG,sEAAsE;EACvE,CAAA,GAAA,YAAA,aAAA,CAAoD,CAAC,CAAC,cAAgC;EACtF,CAAA,GAAA,YAAA,aAAA,CAAiD,CAAC,CAAC,cAA6B;EAChF,CAAA,GAAA,YAAA,aAAA,CAAmD,CAAC,CAAC,cAA+B;EACpF,CAAA,GAAA,YAAA,aAAA,CAAmD,CAAC,CAAC,cAA+B;EACpF,CAAA,GAAA,YAAA,aAAA,CAAwD,CAAC,CAAC,cAAoC;CAChG,CAAC;CAED,GAAG,iFAAiF;EAClF,CAAA,GAAA,YAAA,aAAA,CAAwD,CAAC,CAAC,cAExD;CACJ,CAAC;AACH,CAAC;AAED,SAAS,uDAAuD;CAC9D,GAAG,qDAAqD;EACtD,CAAA,GAAA,YAAA,aAAA,CAA8C,CAAC,CAAC,cAA+C;CACjG,CAAC;CAED,GAAG,8BAA8B;EAC/B,CAAA,GAAA,YAAA,aAAA,CAAsD,CAAC,CAAC,cAEtD;CACJ,CAAC;AACH,CAAC;AAED,SAAS,wEAAwE;CAC/E,GAAG,2EAA2E;EAC5E,MAAM,SAAS,MAAM;GAAE,OAAO;GAAK,OAAO;EAAI,CAAC;EAC/C,CAAA,GAAA,YAAA,aAAA,CAAa,MAAM,CAAC,CAAC,cAEnB;CACJ,CAAC;CAED,GAAG,+DAA+D;EAChE,MAAM,SAAS,MAAM;GAAE,OAAO;GAAK,OAAO;GAAK,UAAU;EAAO,CAAC;EACjE,CAAA,GAAA,YAAA,aAAA,CAAa,MAAM,CAAC,CAAC,cAEnB;CACJ,CAAC;CAED,GAAG,2EAA2E;EAC5E,MAAM,SAAS,UAAU;GAAE,QAAQ,CAAC,GAAG;GAAG,OAAO;GAAK,UAAU;EAAS,CAAC;EAC1E,CAAA,GAAA,YAAA,aAAA,CAAa,MAAM,CAAC,CAAC,cAEnB;CACJ,CAAC;CAED,GAAG,iFAAiF;EASlF,UAAU;GAAE,QAAQ,CAAC,GAAG;GAAG,OAAO;GAAK,UAAU;EAAc,CAAC;EAEhE,MAAM;GAAE,OAAO;GAAK,OAAO;GAAK,UAAU;EAAS,CAAC;CAEtD,CAAC;CAED,GAAG,2FAA2F;EAQ5F,MAAM,SAAS,MAAM;GAJnB,OAAO;GACP,OAAO;GACP,UAAU;EAEW,CAAC;EACxB,CAAA,GAAA,YAAA,aAAA,CAAa,MAAM,CAAC,CAAC,cAEnB;CACJ,CAAC;AACH,CAAC"}
package/dist/index.d.mts CHANGED
@@ -1,31 +1,31 @@
1
1
  import { t as BrowserError_d_exports } from "./browser/BrowserError.mjs";
2
2
  import { t as Browser_d_exports } from "./browser/Browser.mjs";
3
- import { a as Media_d_exports } from "./Media-D_CpcM1Z.mjs";
4
- import { o as Image_d_exports } from "./Image-C4vuBmu0.mjs";
5
- import { u as Items_d_exports } from "./Items-BKQgqJ8A.mjs";
6
- import { _ as Tool_d_exports } from "./Tool-u5bag8SO.mjs";
3
+ import { a as Media_d_exports } from "./Media-DwgpifPD.mjs";
4
+ import { o as Image_d_exports } from "./Image-BK8-4H6s.mjs";
5
+ import { u as Items_d_exports } from "./Items-SfUabNuB.mjs";
6
+ import { _ as Tool_d_exports } from "./Tool-DE-rnvkw.mjs";
7
7
  import { t as BrowserTool_d_exports } from "./browser/BrowserTool.mjs";
8
8
  import { t as Capabilities_d_exports } from "./capabilities/Capabilities.mjs";
9
- import { n as AiError_d_exports } from "./AiError-Bf1pq4BB.mjs";
10
- import { o as Audio_d_exports } from "./Audio-CR7CSljJ.mjs";
9
+ import { n as AiError_d_exports } from "./AiError-eLV9t1lU.mjs";
10
+ import { o as Audio_d_exports } from "./Audio-60lKKHxS.mjs";
11
11
  import { t as Citation_d_exports } from "./domain/Citation.mjs";
12
12
  import { t as Music_d_exports } from "./domain/Music.mjs";
13
13
  import { t as Job_d_exports } from "./job/Job.mjs";
14
- import { a as StructuredFormat_d_exports } from "./StructuredFormat-DHaUJBdd.mjs";
14
+ import { a as StructuredFormat_d_exports } from "./StructuredFormat-BlZhyOsi.mjs";
15
15
  import { t as Turn_d_exports } from "./domain/Turn.mjs";
16
16
  import { t as Research_d_exports } from "./domain/Research.mjs";
17
17
  import { t as Transcript_d_exports } from "./domain/Transcript.mjs";
18
18
  import { t as Embedding_d_exports } from "./embedding-model/Embedding.mjs";
19
19
  import { t as EmbeddingModel_d_exports } from "./embedding-model/EmbeddingModel.mjs";
20
20
  import { t as DeepResearch_d_exports } from "./research/DeepResearch.mjs";
21
- import { t as Loop_d_exports } from "./Loop-D8nWpowc.mjs";
22
- import { n as ToolResult_d_exports } from "./ToolResult-CRpmkBXR.mjs";
23
- import { n as ToolEvent_d_exports } from "./ToolEvent-BBfOdhF_.mjs";
24
- import { l as Toolkit_d_exports } from "./Toolkit-D4mQvhjq.mjs";
21
+ import { t as Loop_d_exports } from "./Loop-B54AB1ME.mjs";
22
+ import { n as ToolResult_d_exports } from "./ToolResult-Cj8ChodL.mjs";
23
+ import { n as ToolEvent_d_exports } from "./ToolEvent-D99MGQYH.mjs";
24
+ import { l as Toolkit_d_exports } from "./Toolkit-BEZrNPTI.mjs";
25
25
  import { t as LanguageModel_d_exports } from "./language-model/LanguageModel.mjs";
26
26
  import { t as MusicGenerator_d_exports } from "./music-generator/MusicGenerator.mjs";
27
27
  import { t as Memory_d_exports } from "./sandbox/Memory.mjs";
28
- import { o as SandboxError_d_exports } from "./SandboxError-CIrVDOMV.mjs";
28
+ import { o as SandboxError_d_exports } from "./SandboxError-BN8b28Bh.mjs";
29
29
  import { t as Sandbox_d_exports } from "./sandbox/Sandbox.mjs";
30
30
  import { t as SandboxImage_d_exports } from "./sandbox/SandboxImage.mjs";
31
31
  import { t as SandboxNetwork_d_exports } from "./sandbox/SandboxNetwork.mjs";
@@ -1,7 +1,5 @@
1
- import { t as AiError } from "../AiError-Bf1pq4BB.mjs";
1
+ import { t as AiError } from "../AiError-eLV9t1lU.mjs";
2
2
  import { Duration, Effect } from "effect";
3
-
4
- //#region src/job/Job.d.ts
5
3
  declare namespace Job_d_exports {
6
4
  export { JobConfig, JobOps, JobRef, JobState, collect, isSettled, jobRef, run };
7
5
  }
@@ -59,7 +57,9 @@ type JobOps<Result> = {
59
57
  readonly cancel: (ref: JobRef<Result>) => Effect.Effect<void, AiError>;
60
58
  };
61
59
  type JobConfig = {
62
- /** Cadence between status fetches. Default 10 seconds, jittered. */readonly pollInterval?: Duration.Input; /** Overall wait cap; exceeding it fails `Timeout`. Default 45 minutes. */
60
+ /** Cadence between status fetches. Default 10 seconds, jittered. */
61
+ readonly pollInterval?: Duration.Input;
62
+ /** Overall wait cap; exceeding it fails `Timeout`. Default 45 minutes. */
63
63
  readonly timeout?: Duration.Input;
64
64
  };
65
65
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Job.d.mts","names":[],"sources":["../../src/job/Job.ts"],"mappings":";;;;;;;;;;;;;;KAcY,QAAA;EAAA,SACG,IAAA;AAAA;EAAA,SACA,IAAA;AAAA;EAAA,SACA,IAAA;EAAA,SAA4B,MAAA,EAAQ,CAAA;AAAA;EAAA,SACpC,IAAA;EAAA,SAAyB,MAAA;EAAA,SAA0B,GAAA;AAAA;;cAGrD,SAAA,MACX,KAAA,EAAO,QAAA,CAAS,CAAA,MACf,KAAA,IAAS,OAAA,CAAQ,QAAA,CAAS,CAAA;EAAM,IAAA;AAAA;AAAA,cAGrB,UAAA;;;;;AALd;;;;;;KAiBY,MAAA;EAAA,SACD,IAAA;EAAA,SACA,QAAA;EAAA,SACA,EAAA;EAAA,UACC,UAAA,IAAc,CAAA;AAAA;AAAA,cAGb,MAAA,gBAAuB,QAAA,UAAkB,EAAA,aAAa,MAAA,CAAO,CAAA;;;;;;;;KAiB9D,MAAA;EAAA,SACD,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,OAAA;EAAA,SACtC,IAAA,GAAO,GAAA,EAAK,MAAA,CAAO,MAAA,MAAY,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,MAAA,GAAS,OAAA;EAAA,SAC/D,MAAA,GAAS,GAAA,EAAK,MAAA,CAAO,MAAA,MAAY,MAAA,CAAO,MAAA,OAAa,OAAA;AAAA;AAAA,KAGpD,SAAA;EA9BA,6EAgCD,YAAA,GAAe,QAAA,CAAS,KAAA,EAhCjB;EAAA,SAkCP,OAAA,GAAU,QAAA,CAAS,KAAA;AAAA;;;;;;;cAYjB,OAAA,WACX,IAAA,GAAO,GAAA,EAAK,MAAA,CAAO,MAAA,MAAY,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,MAAA,GAAS,OAAA,GAC/D,GAAA,EAAK,MAAA,CAAO,MAAA,GACZ,MAAA,GAAS,SAAA,KACR,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,OAAA;AA3CzB;;;;;AAAA,cAuEa,GAAA,WACX,GAAA,EAAK,MAAA,CAAO,MAAA,GACZ,MAAA,GAAS,SAAA,KACR,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,OAAA"}
1
+ {"version":3,"file":"Job.d.mts","names":[],"sources":["../../src/job/Job.ts"],"mappings":";;;;;;;;;;;;KAcY,SAAS;WACN;;WACA;;WACA;WAA4B,QAAQ;;WACpC;WAAyB;WAA0B;;;cAGrD,YAAa,GAAC,OAClB,SAAS,OACf,SAAS,QAAQ,SAAS;EAAM;;cAGrB;;;;;;;;;;;KAYF,OAAO;WACR;WACA;WACA;YACC,cAAc;;cAGb,SAAU,aAAW,kBAAkB,eAAe,OAAO;;;;;;;;KAiB9D,OAAO;WACR,QAAQ,OAAO,OAAO,OAAO,SAAS;WACtC,OAAO,KAAK,OAAO,YAAY,OAAO,OAAO,SAAS,SAAS;WAC/D,SAAS,KAAK,OAAO,YAAY,OAAO,aAAa;;KAGpD;;WAED,eAAe,SAAS;;WAExB,UAAU,SAAS;;;;;;;;cAYjB,UAAW,QAAM,OACrB,KAAK,OAAO,YAAY,OAAO,OAAO,SAAS,SAAS,UAAgB,KAC1E,OAAO,SAAO,SACV,cACR,OAAO,OAAO,QAAQ;;;;;;cA4BZ,MAAO,QAAM,KACnB,OAAO,SAAO,SACV,cACR,OAAO,OAAO,QAAQ"}
package/dist/job/Job.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { n as __exportAll } from "../chunk-uyGKjUfl.mjs";
1
+ import { n as __exportAll } from "../rolldown-runtime-EAsCxrDo.mjs";
2
2
  import { GenerationFailed, Timeout } from "../domain/AiError.mjs";
3
3
  import { Effect, Schedule } from "effect";
4
4
  //#region src/job/Job.ts
@@ -1 +1 @@
1
- {"version":3,"file":"Job.mjs","names":["AiError.GenerationFailed","AiError.Timeout"],"sources":["../../src/job/Job.ts"],"sourcesContent":["import { Duration, Effect, Schedule } from \"effect\"\nimport * as AiError from \"../domain/AiError.js\"\n\n// ---------------------------------------------------------------------------\n// Status + handle\n// ---------------------------------------------------------------------------\n\n/**\n * Normalized state of a provider-hosted background job. Implementors map their\n * provider's status vocabulary onto these four states. The terminal states\n * carry their payload: `Succeeded` the collected result, `Failed` an optional\n * reason and the raw provider error. This mirrors the wire, where a single\n * poll response returns both status and (when done) the result.\n */\nexport type JobState<A> =\n | { readonly _tag: \"Pending\" }\n | { readonly _tag: \"Running\" }\n | { readonly _tag: \"Succeeded\"; readonly result: A }\n | { readonly _tag: \"Failed\"; readonly reason?: string; readonly raw?: unknown }\n\n/** The two states that end a poll loop. */\nexport const isSettled = <A>(\n state: JobState<A>,\n): state is Extract<JobState<A>, { _tag: \"Succeeded\" | \"Failed\" }> =>\n state._tag === \"Succeeded\" || state._tag === \"Failed\"\n\ndeclare const ResultType: unique symbol\n\n/**\n * Opaque, provider-tagged handle to a running background job. Jobs can run for\n * minutes and outlive a single process, so the handle is detachable: submit\n * now, collect later. `provider` tags who owns `id`.\n *\n * Parameterized by the result type `A` it collects to, so a ref cannot be\n * crossed between capabilities (a `JobRef<Turn>` is not a `JobRef<VideoResult>`).\n * The brand is phantom: the runtime value is just `{ _tag, provider, id }`, so\n * a ref stays plain serializable data for persistence across restarts.\n */\nexport type JobRef<A = unknown> = {\n readonly _tag: \"JobRef\"\n readonly provider: string\n readonly id: string\n readonly [ResultType]?: A\n}\n\nexport const jobRef = <A = unknown>(provider: string, id: string): JobRef<A> => ({\n _tag: \"JobRef\",\n provider,\n id,\n})\n\n// ---------------------------------------------------------------------------\n// Poll driver\n// ---------------------------------------------------------------------------\n\n/**\n * The three wire operations a poll-based async job supplies. `run` / `collect`\n * drive the submit -> poll -> settle cadence around them, so an implementor\n * states only its provider calls, not the loop. `poll` returns the current\n * `JobState`, carrying the result in `Succeeded`. Generic over the collected\n * `Result`.\n */\nexport type JobOps<Result> = {\n readonly submit: Effect.Effect<JobRef<Result>, AiError.AiError>\n readonly poll: (ref: JobRef<Result>) => Effect.Effect<JobState<Result>, AiError.AiError>\n readonly cancel: (ref: JobRef<Result>) => Effect.Effect<void, AiError.AiError>\n}\n\nexport type JobConfig = {\n /** Cadence between status fetches. Default 10 seconds, jittered. */\n readonly pollInterval?: Duration.Input\n /** Overall wait cap; exceeding it fails `Timeout`. Default 45 minutes. */\n readonly timeout?: Duration.Input\n}\n\nconst DEFAULT_POLL_INTERVAL: Duration.Input = \"10 seconds\"\nconst DEFAULT_TIMEOUT: Duration.Input = \"45 minutes\"\n\n/**\n * Poll `poll(ref)` on a jittered fixed cadence until the job settles, then\n * return the result or fail `GenerationFailed`. Bounded by `timeout`, which\n * fails `Timeout` if the job never settles. Takes the poll op alone (not the\n * full `JobOps`) so a detached `collect(ref)` needs no submit-bound request.\n */\nexport const collect = <Result>(\n poll: (ref: JobRef<Result>) => Effect.Effect<JobState<Result>, AiError.AiError>,\n ref: JobRef<Result>,\n config?: JobConfig,\n): Effect.Effect<Result, AiError.AiError> =>\n poll(ref).pipe(\n Effect.repeat({\n schedule: Schedule.jittered(Schedule.spaced(config?.pollInterval ?? DEFAULT_POLL_INTERVAL)),\n until: isSettled,\n }),\n Effect.flatMap((state) =>\n state._tag === \"Succeeded\"\n ? Effect.succeed(state.result)\n : Effect.fail(\n new AiError.GenerationFailed({\n provider: ref.provider,\n message: state._tag === \"Failed\" ? (state.reason ?? \"job failed\") : \"job failed\",\n raw: state._tag === \"Failed\" ? (state.raw ?? ref) : ref,\n }),\n ),\n ),\n Effect.timeoutOrElse({\n duration: config?.timeout ?? DEFAULT_TIMEOUT,\n orElse: () => Effect.fail(new AiError.Timeout({ provider: ref.provider, raw: ref })),\n }),\n )\n\n/**\n * Submit, then poll to completion. Best-effort cancels the server job if the\n * caller interrupts (where the provider supports it). The one-call path; use\n * `ops.submit` + `collect` directly for the detached case.\n */\nexport const run = <Result>(\n ops: JobOps<Result>,\n config?: JobConfig,\n): Effect.Effect<Result, AiError.AiError> =>\n ops.submit.pipe(\n Effect.flatMap((ref) =>\n collect(ops.poll, ref, config).pipe(Effect.onInterrupt(() => Effect.ignore(ops.cancel(ref)))),\n ),\n )\n"],"mappings":";;;;;;;;;;;AAqBA,MAAa,aACX,UAEA,MAAM,SAAS,eAAe,MAAM,SAAS;AAqB/C,MAAa,UAAuB,UAAkB,QAA2B;CAC/E,MAAM;CACN;CACA;CACD;AA0BD,MAAM,wBAAwC;AAC9C,MAAM,kBAAkC;;;;;;;AAQxC,MAAa,WACX,MACA,KACA,WAEA,KAAK,IAAI,CAAC,KACR,OAAO,OAAO;CACZ,UAAU,SAAS,SAAS,SAAS,OAAO,QAAQ,gBAAgB,sBAAsB,CAAC;CAC3F,OAAO;CACR,CAAC,EACF,OAAO,SAAS,UACd,MAAM,SAAS,cACX,OAAO,QAAQ,MAAM,OAAO,GAC5B,OAAO,KACL,IAAIA,iBAAyB;CAC3B,UAAU,IAAI;CACd,SAAS,MAAM,SAAS,WAAY,MAAM,UAAU,eAAgB;CACpE,KAAK,MAAM,SAAS,WAAY,MAAM,OAAO,MAAO;CACrD,CAAC,CACH,CACN,EACD,OAAO,cAAc;CACnB,UAAU,QAAQ,WAAW;CAC7B,cAAc,OAAO,KAAK,IAAIC,QAAgB;EAAE,UAAU,IAAI;EAAU,KAAK;EAAK,CAAC,CAAC;CACrF,CAAC,CACH;;;;;;AAOH,MAAa,OACX,KACA,WAEA,IAAI,OAAO,KACT,OAAO,SAAS,QACd,QAAQ,IAAI,MAAM,KAAK,OAAO,CAAC,KAAK,OAAO,kBAAkB,OAAO,OAAO,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,CAC9F,CACF"}
1
+ {"version":3,"file":"Job.mjs","names":["AiError.GenerationFailed","AiError.Timeout"],"sources":["../../src/job/Job.ts"],"sourcesContent":["import { Duration, Effect, Schedule } from \"effect\"\nimport * as AiError from \"../domain/AiError.js\"\n\n// ---------------------------------------------------------------------------\n// Status + handle\n// ---------------------------------------------------------------------------\n\n/**\n * Normalized state of a provider-hosted background job. Implementors map their\n * provider's status vocabulary onto these four states. The terminal states\n * carry their payload: `Succeeded` the collected result, `Failed` an optional\n * reason and the raw provider error. This mirrors the wire, where a single\n * poll response returns both status and (when done) the result.\n */\nexport type JobState<A> =\n | { readonly _tag: \"Pending\" }\n | { readonly _tag: \"Running\" }\n | { readonly _tag: \"Succeeded\"; readonly result: A }\n | { readonly _tag: \"Failed\"; readonly reason?: string; readonly raw?: unknown }\n\n/** The two states that end a poll loop. */\nexport const isSettled = <A>(\n state: JobState<A>,\n): state is Extract<JobState<A>, { _tag: \"Succeeded\" | \"Failed\" }> =>\n state._tag === \"Succeeded\" || state._tag === \"Failed\"\n\ndeclare const ResultType: unique symbol\n\n/**\n * Opaque, provider-tagged handle to a running background job. Jobs can run for\n * minutes and outlive a single process, so the handle is detachable: submit\n * now, collect later. `provider` tags who owns `id`.\n *\n * Parameterized by the result type `A` it collects to, so a ref cannot be\n * crossed between capabilities (a `JobRef<Turn>` is not a `JobRef<VideoResult>`).\n * The brand is phantom: the runtime value is just `{ _tag, provider, id }`, so\n * a ref stays plain serializable data for persistence across restarts.\n */\nexport type JobRef<A = unknown> = {\n readonly _tag: \"JobRef\"\n readonly provider: string\n readonly id: string\n readonly [ResultType]?: A\n}\n\nexport const jobRef = <A = unknown>(provider: string, id: string): JobRef<A> => ({\n _tag: \"JobRef\",\n provider,\n id,\n})\n\n// ---------------------------------------------------------------------------\n// Poll driver\n// ---------------------------------------------------------------------------\n\n/**\n * The three wire operations a poll-based async job supplies. `run` / `collect`\n * drive the submit -> poll -> settle cadence around them, so an implementor\n * states only its provider calls, not the loop. `poll` returns the current\n * `JobState`, carrying the result in `Succeeded`. Generic over the collected\n * `Result`.\n */\nexport type JobOps<Result> = {\n readonly submit: Effect.Effect<JobRef<Result>, AiError.AiError>\n readonly poll: (ref: JobRef<Result>) => Effect.Effect<JobState<Result>, AiError.AiError>\n readonly cancel: (ref: JobRef<Result>) => Effect.Effect<void, AiError.AiError>\n}\n\nexport type JobConfig = {\n /** Cadence between status fetches. Default 10 seconds, jittered. */\n readonly pollInterval?: Duration.Input\n /** Overall wait cap; exceeding it fails `Timeout`. Default 45 minutes. */\n readonly timeout?: Duration.Input\n}\n\nconst DEFAULT_POLL_INTERVAL: Duration.Input = \"10 seconds\"\nconst DEFAULT_TIMEOUT: Duration.Input = \"45 minutes\"\n\n/**\n * Poll `poll(ref)` on a jittered fixed cadence until the job settles, then\n * return the result or fail `GenerationFailed`. Bounded by `timeout`, which\n * fails `Timeout` if the job never settles. Takes the poll op alone (not the\n * full `JobOps`) so a detached `collect(ref)` needs no submit-bound request.\n */\nexport const collect = <Result>(\n poll: (ref: JobRef<Result>) => Effect.Effect<JobState<Result>, AiError.AiError>,\n ref: JobRef<Result>,\n config?: JobConfig,\n): Effect.Effect<Result, AiError.AiError> =>\n poll(ref).pipe(\n Effect.repeat({\n schedule: Schedule.jittered(Schedule.spaced(config?.pollInterval ?? DEFAULT_POLL_INTERVAL)),\n until: isSettled,\n }),\n Effect.flatMap((state) =>\n state._tag === \"Succeeded\"\n ? Effect.succeed(state.result)\n : Effect.fail(\n new AiError.GenerationFailed({\n provider: ref.provider,\n message: state._tag === \"Failed\" ? (state.reason ?? \"job failed\") : \"job failed\",\n raw: state._tag === \"Failed\" ? (state.raw ?? ref) : ref,\n }),\n ),\n ),\n Effect.timeoutOrElse({\n duration: config?.timeout ?? DEFAULT_TIMEOUT,\n orElse: () => Effect.fail(new AiError.Timeout({ provider: ref.provider, raw: ref })),\n }),\n )\n\n/**\n * Submit, then poll to completion. Best-effort cancels the server job if the\n * caller interrupts (where the provider supports it). The one-call path; use\n * `ops.submit` + `collect` directly for the detached case.\n */\nexport const run = <Result>(\n ops: JobOps<Result>,\n config?: JobConfig,\n): Effect.Effect<Result, AiError.AiError> =>\n ops.submit.pipe(\n Effect.flatMap((ref) =>\n collect(ops.poll, ref, config).pipe(Effect.onInterrupt(() => Effect.ignore(ops.cancel(ref)))),\n ),\n )\n"],"mappings":";;;;;;;;;;;AAqBA,MAAa,aACX,UAEA,MAAM,SAAS,eAAe,MAAM,SAAS;AAqB/C,MAAa,UAAuB,UAAkB,QAA2B;CAC/E,MAAM;CACN;CACA;AACF;AA0BA,MAAM,wBAAwC;AAC9C,MAAM,kBAAkC;;;;;;;AAQxC,MAAa,WACX,MACA,KACA,WAEA,KAAK,GAAG,CAAC,CAAC,KACR,OAAO,OAAO;CACZ,UAAU,SAAS,SAAS,SAAS,OAAO,QAAQ,gBAAgB,qBAAqB,CAAC;CAC1F,OAAO;AACT,CAAC,GACD,OAAO,SAAS,UACd,MAAM,SAAS,cACX,OAAO,QAAQ,MAAM,MAAM,IAC3B,OAAO,KACL,IAAIA,iBAAyB;CAC3B,UAAU,IAAI;CACd,SAAS,MAAM,SAAS,WAAY,MAAM,UAAU,eAAgB;CACpE,KAAK,MAAM,SAAS,WAAY,MAAM,OAAO,MAAO;AACtD,CAAC,CACH,CACN,GACA,OAAO,cAAc;CACnB,UAAU,QAAQ,WAAW;CAC7B,cAAc,OAAO,KAAK,IAAIC,QAAgB;EAAE,UAAU,IAAI;EAAU,KAAK;CAAI,CAAC,CAAC;AACrF,CAAC,CACH;;;;;;AAOF,MAAa,OACX,KACA,WAEA,IAAI,OAAO,KACT,OAAO,SAAS,QACd,QAAQ,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC,KAAK,OAAO,kBAAkB,OAAO,OAAO,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAC9F,CACF"}
@@ -1,11 +1,9 @@
1
- import { o as HistoryItem } from "../Items-BKQgqJ8A.mjs";
2
- import { t as AiError } from "../AiError-Bf1pq4BB.mjs";
3
- import { i as StructuredFormat } from "../StructuredFormat-DHaUJBdd.mjs";
1
+ import { o as HistoryItem } from "../Items-SfUabNuB.mjs";
2
+ import { t as AiError } from "../AiError-eLV9t1lU.mjs";
3
+ import { i as StructuredFormat } from "../StructuredFormat-BlZhyOsi.mjs";
4
4
  import { Turn, TurnEvent } from "../domain/Turn.mjs";
5
- import { o as Toolkit } from "../Toolkit-D4mQvhjq.mjs";
5
+ import { o as Toolkit } from "../Toolkit-BEZrNPTI.mjs";
6
6
  import { Context, Effect, Stream } from "effect";
7
-
8
- //#region src/language-model/LanguageModel.d.ts
9
7
  declare namespace LanguageModel_d_exports {
10
8
  export { CommonRequest, LanguageModel, LanguageModelService, streamTurn, turn, turnFromStream };
11
9
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LanguageModel.d.mts","names":[],"sources":["../../src/language-model/LanguageModel.ts"],"mappings":";;;;;;;;;;;;;;;;;KAaY,aAAA;EAAA,SACD,OAAA,EAAS,aAAA,CAAc,WAAA;;;;AADlC;WAMW,KAAA;;;;;;WAMA,KAAA,GAAQ,OAAA;EAAA,SACR,UAAA;IAAA,SAIM,IAAA;IAAA,SAA2B,IAAA;EAAA;EAAA,SACjC,WAAA;EAAA,SACA,IAAA;EAAA,SACA,eAAA;EAPA;;;;;;EAAA,SAcA,UAAA,GAAa,gBAAA;AAAA;AAAA,KAGZ,oBAAA;EAAA,SACD,UAAA,GAAa,OAAA,EAAS,aAAA,KAAkB,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,OAAA;EAJnB;AAGzD;;;;;;;;EAHyD,SAc9C,IAAA,GAAO,OAAA,EAAS,aAAA,KAAkB,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,OAAA;AAAA;AAAA,cAChE,kBAAA;cAEY,aAAA,SAAsB,kBAAA;;;;cAOtB,UAAA,GACX,OAAA,EAAS,aAAA,KACR,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,OAAA,EAAiB,aAAA;;;;;;;cAShC,IAAA,GAAQ,OAAA,EAAS,aAAA,KAAgB,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,OAAA,EAAiB,aAAA;;;;;;;cAStE,cAAA,QACL,UAAA,GAAa,OAAA,EAAS,GAAA,KAAQ,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,OAAA,OAC5D,OAAA,EAAS,GAAA,KAAM,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,OAAA"}
1
+ {"version":3,"file":"LanguageModel.d.mts","names":[],"sources":["../../src/language-model/LanguageModel.ts"],"mappings":";;;;;;;;;;;;;;;KAaY;WACD,SAAS,cAAc;;;;;WAKvB;;;;;;WAMA,QAAQ;WACR;aAIM;aAA2B;;WACjC;WACA;WACA;;;;;;;WAOA,aAAa;;KAGZ;WACD,aAAa,SAAS,kBAAkB,OAAO,OAAO,WAAW;;;;;;;;;;WAUjE,OAAO,SAAS,kBAAkB,OAAO,OAAO,MAAM;;;cAGpD,sBAAsB;;;;cAOtB,aAAU,SACZ,kBACR,OAAO,OAAO,WAAW,SAAiB;;;;;;;cAShC,OAAI,SAAa,kBAAgB,OAAO,OAAO,MAAM,SAAiB;;;;;;;cAStE,iBACV,KAAG,aAAe,SAAS,QAAQ,OAAO,OAAO,WAAW,cAAgB,SACnE,QAAM,OAAO,OAAO,MAAM"}
@@ -1,4 +1,4 @@
1
- import { n as __exportAll } from "../chunk-uyGKjUfl.mjs";
1
+ import { n as __exportAll } from "../rolldown-runtime-EAsCxrDo.mjs";
2
2
  import { IncompleteTurn } from "../domain/AiError.mjs";
3
3
  import { isTurnComplete } from "../domain/Turn.mjs";
4
4
  import { Array, Context, Effect, Option, Stream } from "effect";
@@ -1 +1 @@
1
- {"version":3,"file":"LanguageModel.mjs","names":["Arr","AiError.IncompleteTurn"],"sources":["../../src/language-model/LanguageModel.ts"],"sourcesContent":["import { Array as Arr, Context, Effect, Option, Stream } from \"effect\"\nimport * as AiError from \"../domain/AiError.js\"\nimport type { HistoryItem } from \"../domain/Items.js\"\nimport type * as StructuredFormat from \"../structured-format/StructuredFormat.js\"\nimport type { Toolkit } from \"../tool/Toolkit.js\"\nimport { isTurnComplete, type Turn, type TurnEvent } from \"../domain/Turn.js\"\n\n/**\n * Cross-provider request shape. Every call carries its own `history` and\n * `model` - models are not bound at layer construction. Anything specific\n * to a single provider (reasoning effort, prompt caching, store flags,\n * ...) lives in that provider's own request interface, which extends this.\n */\nexport type CommonRequest = {\n readonly history: ReadonlyArray<HistoryItem>\n /**\n * Model identifier. Each provider narrows this to its typed literal union,\n * so code that yields a typed provider tag gets autocompletion.\n */\n readonly model: string\n /**\n * The model-visible tools for this request, as a `Toolkit`. The provider\n * renders it to wire descriptors (`Tool.descriptorsOf`); omit it for a turn\n * with no tools.\n */\n readonly tools?: Toolkit\n readonly toolChoice?:\n | \"auto\"\n | \"required\"\n | \"none\"\n | { readonly type: \"function\"; readonly name: string }\n readonly temperature?: number\n readonly topP?: number\n readonly maxOutputTokens?: number\n /**\n * Schema-bound JSON output. The provider constrains the wire to match the\n * schema; pair with `Turn.decodeStructured` for runtime validation. Supported\n * across all current providers (OpenAI Responses json_schema, Anthropic\n * `output_config`, Gemini `responseJsonSchema`).\n */\n readonly structured?: StructuredFormat.StructuredFormat<unknown>\n}\n\nexport type LanguageModelService = {\n readonly streamTurn: (request: CommonRequest) => Stream.Stream<TurnEvent, AiError.AiError>\n /**\n * Drain a single turn and return the assembled `Turn` from the\n * terminal `TurnComplete` event. Fails with `IncompleteTurn` if the\n * stream ends without one.\n *\n * Most providers derive this from `streamTurn` via\n * {@link turnFromStream}; providers with a native non-streaming\n * endpoint may override with a cheaper direct call.\n */\n readonly turn: (request: CommonRequest) => Effect.Effect<Turn, AiError.AiError>\n}\n\nexport class LanguageModel extends Context.Service<LanguageModel, LanguageModelService>()(\n \"@betalyra/effect-uai/LanguageModel\",\n) {}\n\n/**\n * Stream the deltas of a single turn.\n */\nexport const streamTurn = (\n request: CommonRequest,\n): Stream.Stream<TurnEvent, AiError.AiError, LanguageModel> =>\n Stream.unwrap(Effect.map(LanguageModel, (m) => m.streamTurn(request)))\n\n/**\n * Drain a single turn and return the assembled `Turn`. Delegates to the\n * service's `turn` method — providers with a native complete endpoint\n * can override; the rest get the default streamTurn-drain via\n * {@link turnFromStream}.\n */\nexport const turn = (request: CommonRequest): Effect.Effect<Turn, AiError.AiError, LanguageModel> =>\n Effect.flatMap(LanguageModel, (m) => m.turn(request))\n\n/**\n * Build a `turn` implementation from a `streamTurn` implementation.\n * Providers without a native non-streaming endpoint use this to\n * populate the service's `turn` field. Generic over the request type so\n * provider-typed services (with their narrowed request) can reuse it.\n */\nexport const turnFromStream =\n <Req>(streamTurn: (request: Req) => Stream.Stream<TurnEvent, AiError.AiError>) =>\n (request: Req): Effect.Effect<Turn, AiError.AiError> =>\n streamTurn(request).pipe(\n Stream.runCollect,\n Effect.flatMap((events) =>\n Arr.findLast(events, isTurnComplete).pipe(\n Option.match({\n onNone: () => Effect.fail(new AiError.IncompleteTurn({})),\n onSome: (e) => Effect.succeed(e.turn),\n }),\n ),\n ),\n )\n"],"mappings":";;;;;;;;;;;AAyDA,IAAa,gBAAb,cAAmC,QAAQ,SAA8C,CACvF,qCACD,CAAC;;;;AAKF,MAAa,cACX,YAEA,OAAO,OAAO,OAAO,IAAI,gBAAgB,MAAM,EAAE,WAAW,QAAQ,CAAC,CAAC;;;;;;;AAQxE,MAAa,QAAQ,YACnB,OAAO,QAAQ,gBAAgB,MAAM,EAAE,KAAK,QAAQ,CAAC;;;;;;;AAQvD,MAAa,kBACL,gBACL,YACC,WAAW,QAAQ,CAAC,KAClB,OAAO,YACP,OAAO,SAAS,WACdA,MAAI,SAAS,QAAQ,eAAe,CAAC,KACnC,OAAO,MAAM;CACX,cAAc,OAAO,KAAK,IAAIC,eAAuB,EAAE,CAAC,CAAC;CACzD,SAAS,MAAM,OAAO,QAAQ,EAAE,KAAK;CACtC,CAAC,CACH,CACF,CACF"}
1
+ {"version":3,"file":"LanguageModel.mjs","names":["Arr","AiError.IncompleteTurn"],"sources":["../../src/language-model/LanguageModel.ts"],"sourcesContent":["import { Array as Arr, Context, Effect, Option, Stream } from \"effect\"\nimport * as AiError from \"../domain/AiError.js\"\nimport type { HistoryItem } from \"../domain/Items.js\"\nimport type * as StructuredFormat from \"../structured-format/StructuredFormat.js\"\nimport type { Toolkit } from \"../tool/Toolkit.js\"\nimport { isTurnComplete, type Turn, type TurnEvent } from \"../domain/Turn.js\"\n\n/**\n * Cross-provider request shape. Every call carries its own `history` and\n * `model` - models are not bound at layer construction. Anything specific\n * to a single provider (reasoning effort, prompt caching, store flags,\n * ...) lives in that provider's own request interface, which extends this.\n */\nexport type CommonRequest = {\n readonly history: ReadonlyArray<HistoryItem>\n /**\n * Model identifier. Each provider narrows this to its typed literal union,\n * so code that yields a typed provider tag gets autocompletion.\n */\n readonly model: string\n /**\n * The model-visible tools for this request, as a `Toolkit`. The provider\n * renders it to wire descriptors (`Tool.descriptorsOf`); omit it for a turn\n * with no tools.\n */\n readonly tools?: Toolkit\n readonly toolChoice?:\n | \"auto\"\n | \"required\"\n | \"none\"\n | { readonly type: \"function\"; readonly name: string }\n readonly temperature?: number\n readonly topP?: number\n readonly maxOutputTokens?: number\n /**\n * Schema-bound JSON output. The provider constrains the wire to match the\n * schema; pair with `Turn.decodeStructured` for runtime validation. Supported\n * across all current providers (OpenAI Responses json_schema, Anthropic\n * `output_config`, Gemini `responseJsonSchema`).\n */\n readonly structured?: StructuredFormat.StructuredFormat<unknown>\n}\n\nexport type LanguageModelService = {\n readonly streamTurn: (request: CommonRequest) => Stream.Stream<TurnEvent, AiError.AiError>\n /**\n * Drain a single turn and return the assembled `Turn` from the\n * terminal `TurnComplete` event. Fails with `IncompleteTurn` if the\n * stream ends without one.\n *\n * Most providers derive this from `streamTurn` via\n * {@link turnFromStream}; providers with a native non-streaming\n * endpoint may override with a cheaper direct call.\n */\n readonly turn: (request: CommonRequest) => Effect.Effect<Turn, AiError.AiError>\n}\n\nexport class LanguageModel extends Context.Service<LanguageModel, LanguageModelService>()(\n \"@betalyra/effect-uai/LanguageModel\",\n) {}\n\n/**\n * Stream the deltas of a single turn.\n */\nexport const streamTurn = (\n request: CommonRequest,\n): Stream.Stream<TurnEvent, AiError.AiError, LanguageModel> =>\n Stream.unwrap(Effect.map(LanguageModel, (m) => m.streamTurn(request)))\n\n/**\n * Drain a single turn and return the assembled `Turn`. Delegates to the\n * service's `turn` method — providers with a native complete endpoint\n * can override; the rest get the default streamTurn-drain via\n * {@link turnFromStream}.\n */\nexport const turn = (request: CommonRequest): Effect.Effect<Turn, AiError.AiError, LanguageModel> =>\n Effect.flatMap(LanguageModel, (m) => m.turn(request))\n\n/**\n * Build a `turn` implementation from a `streamTurn` implementation.\n * Providers without a native non-streaming endpoint use this to\n * populate the service's `turn` field. Generic over the request type so\n * provider-typed services (with their narrowed request) can reuse it.\n */\nexport const turnFromStream =\n <Req>(streamTurn: (request: Req) => Stream.Stream<TurnEvent, AiError.AiError>) =>\n (request: Req): Effect.Effect<Turn, AiError.AiError> =>\n streamTurn(request).pipe(\n Stream.runCollect,\n Effect.flatMap((events) =>\n Arr.findLast(events, isTurnComplete).pipe(\n Option.match({\n onNone: () => Effect.fail(new AiError.IncompleteTurn({})),\n onSome: (e) => Effect.succeed(e.turn),\n }),\n ),\n ),\n )\n"],"mappings":";;;;;;;;;;;AAyDA,IAAa,gBAAb,cAAmC,QAAQ,QAA6C,CAAC,CACvF,oCACF,CAAC,CAAC,CAAC;;;;AAKH,MAAa,cACX,YAEA,OAAO,OAAO,OAAO,IAAI,gBAAgB,MAAM,EAAE,WAAW,OAAO,CAAC,CAAC;;;;;;;AAQvE,MAAa,QAAQ,YACnB,OAAO,QAAQ,gBAAgB,MAAM,EAAE,KAAK,OAAO,CAAC;;;;;;;AAQtD,MAAa,kBACL,gBACL,YACC,WAAW,OAAO,CAAC,CAAC,KAClB,OAAO,YACP,OAAO,SAAS,WACdA,MAAI,SAAS,QAAQ,cAAc,CAAC,CAAC,KACnC,OAAO,MAAM;CACX,cAAc,OAAO,KAAK,IAAIC,eAAuB,CAAC,CAAC,CAAC;CACxD,SAAS,MAAM,OAAO,QAAQ,EAAE,IAAI;AACtC,CAAC,CACH,CACF,CACF"}
@@ -1 +1 @@
1
- export { };
1
+ export {}
@@ -2,7 +2,8 @@ import { IncompleteTurn, RateLimited } from "../domain/AiError.mjs";
2
2
  import { assistantText, userText } from "../domain/Items.mjs";
3
3
  import { TurnEvent } from "../domain/Turn.mjs";
4
4
  import { LanguageModel, turn, turnFromStream } from "./LanguageModel.mjs";
5
- import { c as it, n as globalExpect, o as describe } from "../dist-CcRV3-A5.mjs";
5
+ import { m as it, o as describe } from "../utils-CiH_DjFW.mjs";
6
+ import { n as globalExpect } from "../test.DNmyFkvJ-YPzDR0Co.mjs";
6
7
  import { layer } from "../testing/MockProvider.mjs";
7
8
  import { Cause, Effect, Exit, Layer, Option, Stream } from "effect";
8
9
  //#region src/language-model/LanguageModel.test.ts
@@ -25,7 +26,8 @@ describe("LanguageModel.turn", () => {
25
26
  history: [userText("hi")],
26
27
  model: "mock"
27
28
  });
28
- globalExpect(await Effect.runPromise(program.pipe(Effect.provide(layer([expected]))))).toEqual(expected);
29
+ const result = await Effect.runPromise(program.pipe(Effect.provide(layer([expected]))));
30
+ globalExpect(result).toEqual(expected);
29
31
  });
30
32
  it("fails with IncompleteTurn when the stream ends without TurnComplete", async () => {
31
33
  const broken = Layer.succeed(LanguageModel, serviceFromStream(() => Stream.fromIterable([TurnEvent.TextDelta({ text: "partial" })])));
@@ -63,7 +65,8 @@ describe("LanguageModel.turn", () => {
63
65
  history: [],
64
66
  model: "mock"
65
67
  });
66
- globalExpect(await Effect.runPromise(program.pipe(Effect.provide(weird)))).toEqual(second);
68
+ const result = await Effect.runPromise(program.pipe(Effect.provide(weird)));
69
+ globalExpect(result).toEqual(second);
67
70
  });
68
71
  });
69
72
  //#endregion