@effect-uai/core 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/dist/{AiError-CAX_48RU.d.mts → AiError-Bf1pq4BB.d.mts} +9 -4
  2. package/dist/{AiError-CAX_48RU.d.mts.map → AiError-Bf1pq4BB.d.mts.map} +1 -1
  3. package/dist/{Audio-DPlTsNdz.d.mts → Audio-CR7CSljJ.d.mts} +1 -1
  4. package/dist/{Audio-DPlTsNdz.d.mts.map → Audio-CR7CSljJ.d.mts.map} +1 -1
  5. package/dist/{Image-HNmMpMTh.d.mts → Image-BZmKfIdq.d.mts} +1 -1
  6. package/dist/{Image-HNmMpMTh.d.mts.map → Image-BZmKfIdq.d.mts.map} +1 -1
  7. package/dist/{Items-7ljaVxH_.d.mts → Items-BnIduEV2.d.mts} +7 -7
  8. package/dist/{Items-7ljaVxH_.d.mts.map → Items-BnIduEV2.d.mts.map} +1 -1
  9. package/dist/Loop-D8nWpowc.d.mts +173 -0
  10. package/dist/Loop-D8nWpowc.d.mts.map +1 -0
  11. package/dist/{SandboxError-BvKypkJm.d.mts → SandboxError-CIrVDOMV.d.mts} +2 -2
  12. package/dist/{SandboxError-BvKypkJm.d.mts.map → SandboxError-CIrVDOMV.d.mts.map} +1 -1
  13. package/dist/{StructuredFormat-BbN4dosH.d.mts → StructuredFormat-DHaUJBdd.d.mts} +2 -2
  14. package/dist/{StructuredFormat-BbN4dosH.d.mts.map → StructuredFormat-DHaUJBdd.d.mts.map} +1 -1
  15. package/dist/Tool-2lC_XMth.d.mts +284 -0
  16. package/dist/Tool-2lC_XMth.d.mts.map +1 -0
  17. package/dist/ToolEvent-cWZ2BnbS.d.mts +151 -0
  18. package/dist/ToolEvent-cWZ2BnbS.d.mts.map +1 -0
  19. package/dist/ToolResult-CL4hK_9z.d.mts +157 -0
  20. package/dist/ToolResult-CL4hK_9z.d.mts.map +1 -0
  21. package/dist/Toolkit-Dr9l_hNy.d.mts +196 -0
  22. package/dist/Toolkit-Dr9l_hNy.d.mts.map +1 -0
  23. package/dist/browser/Browser.d.mts +190 -0
  24. package/dist/browser/Browser.d.mts.map +1 -0
  25. package/dist/browser/Browser.mjs +34 -0
  26. package/dist/browser/Browser.mjs.map +1 -0
  27. package/dist/browser/BrowserError.d.mts +141 -0
  28. package/dist/browser/BrowserError.d.mts.map +1 -0
  29. package/dist/browser/BrowserError.mjs +89 -0
  30. package/dist/browser/BrowserError.mjs.map +1 -0
  31. package/dist/browser/BrowserTool.d.mts +58 -0
  32. package/dist/browser/BrowserTool.d.mts.map +1 -0
  33. package/dist/browser/BrowserTool.mjs +86 -0
  34. package/dist/browser/BrowserTool.mjs.map +1 -0
  35. package/dist/{dist-DV5ISja1.mjs → dist-B04dlFHg.mjs} +3 -3
  36. package/dist/{dist-DV5ISja1.mjs.map → dist-B04dlFHg.mjs.map} +1 -1
  37. package/dist/dist-DWgRbDN3.mjs +140 -0
  38. package/dist/dist-DWgRbDN3.mjs.map +1 -0
  39. package/dist/domain/AiError.d.mts +2 -2
  40. package/dist/domain/AiError.mjs +22 -3
  41. package/dist/domain/AiError.mjs.map +1 -1
  42. package/dist/domain/Audio.d.mts +1 -1
  43. package/dist/domain/Image.d.mts +1 -1
  44. package/dist/domain/Items.d.mts +1 -1
  45. package/dist/domain/Music.d.mts +1 -1
  46. package/dist/domain/Turn.d.mts +4 -4
  47. package/dist/domain/Turn.test.mjs +1 -1
  48. package/dist/embedding-model/Embedding.d.mts +1 -1
  49. package/dist/embedding-model/EmbeddingModel.d.mts +1 -1
  50. package/dist/embedding-model/EmbeddingModel.test.mjs +1 -1
  51. package/dist/embedding-model/EmbeddingModel.test.mjs.map +1 -1
  52. package/dist/index.d.mts +19 -13
  53. package/dist/index.mjs +15 -9
  54. package/dist/language-model/LanguageModel.d.mts +10 -5
  55. package/dist/language-model/LanguageModel.d.mts.map +1 -1
  56. package/dist/language-model/LanguageModel.mjs.map +1 -1
  57. package/dist/language-model/LanguageModel.test.mjs +1 -1
  58. package/dist/loop/Loop.d.mts +2 -141
  59. package/dist/loop/Loop.mjs +16 -20
  60. package/dist/loop/Loop.mjs.map +1 -1
  61. package/dist/loop/Loop.test.mjs +18 -1
  62. package/dist/loop/Loop.test.mjs.map +1 -1
  63. package/dist/{magic-string.es-BgIV5Mu3.mjs → magic-string.es-Dk-MMA0F.mjs} +1 -1
  64. package/dist/{magic-string.es-BgIV5Mu3.mjs.map → magic-string.es-Dk-MMA0F.mjs.map} +1 -1
  65. package/dist/music-generator/MusicGenerator.d.mts +2 -2
  66. package/dist/music-generator/MusicGenerator.test.mjs +1 -1
  67. package/dist/observability/Metrics.d.mts +116 -28
  68. package/dist/observability/Metrics.d.mts.map +1 -1
  69. package/dist/observability/Metrics.mjs +250 -38
  70. package/dist/observability/Metrics.mjs.map +1 -1
  71. package/dist/observability/Metrics.test.d.mts +1 -0
  72. package/dist/observability/Metrics.test.mjs +187 -0
  73. package/dist/observability/Metrics.test.mjs.map +1 -0
  74. package/dist/observability/Telemetry.d.mts +37 -0
  75. package/dist/observability/Telemetry.d.mts.map +1 -0
  76. package/dist/observability/Telemetry.mjs +57 -0
  77. package/dist/observability/Telemetry.mjs.map +1 -0
  78. package/dist/observability/Telemetry.test.d.mts +1 -0
  79. package/dist/observability/Telemetry.test.mjs +92 -0
  80. package/dist/observability/Telemetry.test.mjs.map +1 -0
  81. package/dist/retry/Retry.d.mts +2 -2
  82. package/dist/retry/Retry.test.mjs +1 -1
  83. package/dist/sandbox/Sandbox.d.mts +1 -1
  84. package/dist/sandbox/SandboxError.d.mts +1 -1
  85. package/dist/speech-synthesizer/SpeechSynthesizer.d.mts +2 -2
  86. package/dist/speech-synthesizer/SpeechSynthesizer.test.mjs +1 -1
  87. package/dist/streaming/JSONL.d.mts +1 -1
  88. package/dist/streaming/JSONL.test.mjs +1 -1
  89. package/dist/streaming/SSE.test.mjs +1 -1
  90. package/dist/structured-format/StructuredFormat.d.mts +1 -1
  91. package/dist/structured-format/StructuredFormat.mjs.map +1 -1
  92. package/dist/structured-format/StructuredFormat.test.mjs +1 -1
  93. package/dist/testing/MockMusicGenerator.d.mts +1 -1
  94. package/dist/testing/MockProvider.d.mts +1 -1
  95. package/dist/testing/MockSpeechSynthesizer.d.mts +1 -1
  96. package/dist/tool/Approval.d.mts +19 -7
  97. package/dist/tool/Approval.d.mts.map +1 -1
  98. package/dist/tool/Approval.mjs +18 -11
  99. package/dist/tool/Approval.mjs.map +1 -1
  100. package/dist/tool/Approval.test.mjs +80 -40
  101. package/dist/tool/Approval.test.mjs.map +1 -1
  102. package/dist/tool/HistoryCheck.d.mts +2 -2
  103. package/dist/tool/Tool.d.mts +2 -2
  104. package/dist/tool/Tool.mjs +190 -36
  105. package/dist/tool/Tool.mjs.map +1 -1
  106. package/dist/tool/Tool.test.mjs +41 -3
  107. package/dist/tool/Tool.test.mjs.map +1 -1
  108. package/dist/tool/ToolEvent.d.mts +2 -151
  109. package/dist/tool/ToolEvent.mjs +5 -0
  110. package/dist/tool/ToolEvent.mjs.map +1 -1
  111. package/dist/tool/ToolResult.d.mts +2 -138
  112. package/dist/tool/ToolResult.mjs +32 -8
  113. package/dist/tool/ToolResult.mjs.map +1 -1
  114. package/dist/tool/Toolkit.d.mts +2 -73
  115. package/dist/tool/Toolkit.mjs +153 -35
  116. package/dist/tool/Toolkit.mjs.map +1 -1
  117. package/dist/tool/Toolkit.test.mjs +271 -11
  118. package/dist/tool/Toolkit.test.mjs.map +1 -1
  119. package/dist/transcriber/Transcriber.d.mts +2 -2
  120. package/dist/transcriber/Transcriber.test.mjs +1 -1
  121. package/dist/web-read/WebRead.d.mts +44 -0
  122. package/dist/web-read/WebRead.d.mts.map +1 -0
  123. package/dist/web-read/WebRead.mjs +18 -0
  124. package/dist/web-read/WebRead.mjs.map +1 -0
  125. package/dist/web-read/WebReadTool.d.mts +57 -0
  126. package/dist/web-read/WebReadTool.d.mts.map +1 -0
  127. package/dist/web-read/WebReadTool.mjs +59 -0
  128. package/dist/web-read/WebReadTool.mjs.map +1 -0
  129. package/dist/web-search/WebSearch.d.mts +1 -1
  130. package/dist/web-search/WebSearchTool.d.mts +12 -6
  131. package/dist/web-search/WebSearchTool.d.mts.map +1 -1
  132. package/dist/web-search/WebSearchTool.mjs +10 -5
  133. package/dist/web-search/WebSearchTool.mjs.map +1 -1
  134. package/package.json +21 -1
  135. package/src/browser/Browser.ts +268 -0
  136. package/src/browser/BrowserError.ts +145 -0
  137. package/src/browser/BrowserTool.ts +161 -0
  138. package/src/domain/AiError.ts +27 -1
  139. package/src/embedding-model/EmbeddingModel.test.ts +4 -0
  140. package/src/index.ts +6 -0
  141. package/src/language-model/LanguageModel.ts +7 -2
  142. package/src/loop/Loop.test.ts +22 -0
  143. package/src/loop/Loop.ts +27 -4
  144. package/src/observability/Metrics.test.ts +266 -0
  145. package/src/observability/Metrics.ts +505 -65
  146. package/src/observability/Telemetry.test.ts +123 -0
  147. package/src/observability/Telemetry.ts +96 -0
  148. package/src/structured-format/StructuredFormat.ts +4 -0
  149. package/src/tool/Approval.test.ts +77 -26
  150. package/src/tool/Approval.ts +72 -27
  151. package/src/tool/Tool.test.ts +55 -2
  152. package/src/tool/Tool.ts +335 -70
  153. package/src/tool/ToolEvent.ts +5 -0
  154. package/src/tool/ToolResult.ts +36 -9
  155. package/src/tool/Toolkit.test.ts +339 -9
  156. package/src/tool/Toolkit.ts +470 -120
  157. package/src/web-read/WebRead.ts +70 -0
  158. package/src/web-read/WebReadTool.ts +96 -0
  159. package/src/web-search/WebSearchTool.ts +11 -5
  160. package/dist/Tool-BKiieFXk.d.mts +0 -102
  161. package/dist/Tool-BKiieFXk.d.mts.map +0 -1
  162. package/dist/loop/Loop.d.mts.map +0 -1
  163. package/dist/tool/ToolEvent.d.mts.map +0 -1
  164. package/dist/tool/ToolResult.d.mts.map +0 -1
  165. package/dist/tool/Toolkit.d.mts.map +0 -1
@@ -0,0 +1,140 @@
1
+ import { a as describe, i as beforeAll, o as it$1, r as afterAll } from "./dist-B04dlFHg.mjs";
2
+ import * as Cause from "effect/Cause";
3
+ import * as Duration from "effect/Duration";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Exit from "effect/Exit";
6
+ import { flow, pipe } from "effect/Function";
7
+ import * as Layer from "effect/Layer";
8
+ import { isObject } from "effect/Predicate";
9
+ import * as Schedule from "effect/Schedule";
10
+ import * as Schema from "effect/Schema";
11
+ import * as Scope from "effect/Scope";
12
+ import * as fc from "effect/testing/FastCheck";
13
+ import * as TestClock from "effect/testing/TestClock";
14
+ import * as TestConsole from "effect/testing/TestConsole";
15
+ //#region ../../node_modules/.pnpm/@effect+vitest@4.0.0-beta.66_effect@4.0.0-beta.57_vitest@4.1.5_@types+node@25.6.0_vite@_d7d7dab69e8c36d4c2ec9ca466208ed9/node_modules/@effect/vitest/dist/internal/internal.js
16
+ /**
17
+ * @since 1.0.0
18
+ */
19
+ const runPromise = /* @__PURE__ */ Effect.fnUntraced(function* (effect, _ctx) {
20
+ const exit = yield* Effect.exit(effect);
21
+ if (Exit.isFailure(exit)) {
22
+ const errors = Cause.prettyErrors(exit.cause);
23
+ for (let i = 0; i < errors.length; i++) yield* Effect.logError(errors[i]);
24
+ }
25
+ return yield* exit;
26
+ }, (effect, _, ctx) => Effect.runPromise(effect, { signal: ctx?.signal }));
27
+ /** @internal */
28
+ const runTest = (ctx) => (effect) => runPromise(effect, ctx);
29
+ const TestEnv = /* @__PURE__ */ Layer.mergeAll(TestConsole.layer, /* @__PURE__ */ TestClock.layer());
30
+ /** @internal */
31
+ const testOptions = (timeout) => typeof timeout === "number" ? { timeout } : timeout ?? {};
32
+ /** @internal */
33
+ const makeTester = (mapEffect, it = it$1) => {
34
+ const run = (ctx, args, self) => pipe(Effect.suspend(() => self(...args)), mapEffect, runTest(ctx));
35
+ const f = (name, self, timeout) => it(name, testOptions(timeout), (ctx) => run(ctx, [ctx], self));
36
+ const skip = (name, self, timeout) => it.skip(name, testOptions(timeout), (ctx) => run(ctx, [ctx], self));
37
+ const skipIf = (condition) => (name, self, timeout) => it.skipIf(condition)(name, testOptions(timeout), (ctx) => run(ctx, [ctx], self));
38
+ const runIf = (condition) => (name, self, timeout) => it.runIf(condition)(name, testOptions(timeout), (ctx) => run(ctx, [ctx], self));
39
+ const only = (name, self, timeout) => it.only(name, testOptions(timeout), (ctx) => run(ctx, [ctx], self));
40
+ const each = (cases) => (name, self, timeout) => it.for(cases)(name, testOptions(timeout), (args, ctx) => run(ctx, [args], self));
41
+ const fails = (name, self, timeout) => it$1.fails(name, testOptions(timeout), (ctx) => run(ctx, [ctx], self));
42
+ const prop = (name, arbitraries, self, timeout) => {
43
+ if (Array.isArray(arbitraries)) {
44
+ const arbs = arbitraries.map((arbitrary) => {
45
+ if (Schema.isSchema(arbitrary)) return Schema.toArbitrary(arbitrary);
46
+ return arbitrary;
47
+ });
48
+ return it(name, testOptions(timeout), (ctx) => fc.assert(fc.asyncProperty(...arbs, (...as) => run(ctx, [as, ctx], self)), isObject(timeout) ? timeout?.fastCheck : {}));
49
+ }
50
+ const arbs = fc.record(Object.keys(arbitraries).reduce(function(result, key) {
51
+ const arb = arbitraries[key];
52
+ if (Schema.isSchema(arb)) result[key] = Schema.toArbitrary(arb);
53
+ result[key] = arb;
54
+ return result;
55
+ }, {}));
56
+ return it(name, testOptions(timeout), (ctx) => fc.assert(fc.asyncProperty(arbs, (...as) => run(ctx, [as[0], ctx], self)), isObject(timeout) ? timeout?.fastCheck : {}));
57
+ };
58
+ return Object.assign(f, {
59
+ skip,
60
+ skipIf,
61
+ runIf,
62
+ only,
63
+ each,
64
+ fails,
65
+ prop
66
+ });
67
+ };
68
+ /** @internal */
69
+ const prop$1 = (name, arbitraries, self, timeout) => {
70
+ if (Array.isArray(arbitraries)) {
71
+ const arbs = arbitraries.map((arbitrary) => {
72
+ if (Schema.isSchema(arbitrary)) throw new Error("Schemas are not supported yet");
73
+ return arbitrary;
74
+ });
75
+ return it$1(name, testOptions(timeout), (ctx) => fc.assert(fc.property(...arbs, (...as) => self(as, ctx)), isObject(timeout) ? timeout?.fastCheck : {}));
76
+ }
77
+ const arbs = fc.record(Object.keys(arbitraries).reduce(function(result, key) {
78
+ const arb = arbitraries[key];
79
+ if (Schema.isSchema(arb)) throw new Error("Schemas are not supported yet");
80
+ result[key] = arb;
81
+ return result;
82
+ }, {}));
83
+ return it$1(name, testOptions(timeout), (ctx) => fc.assert(fc.property(arbs, (as) => self(as, ctx)), isObject(timeout) ? timeout?.fastCheck : {}));
84
+ };
85
+ /** @internal */
86
+ const layer$1 = (layer_, options) => (...args) => {
87
+ const excludeTestServices = options?.excludeTestServices ?? false;
88
+ const withTestEnv = excludeTestServices ? layer_ : Layer.provideMerge(layer_, TestEnv);
89
+ const memoMap = options?.memoMap ?? Effect.runSync(Layer.makeMemoMap);
90
+ const scope = Effect.runSync(Scope.make());
91
+ const contextEffect = Layer.buildWithMemoMap(withTestEnv, memoMap, scope).pipe(Effect.orDie, Effect.cached, Effect.runSync);
92
+ const makeIt = (it) => Object.assign(it, {
93
+ effect: makeTester((effect) => Effect.flatMap(contextEffect, (context) => effect.pipe(Effect.scoped, Effect.provide(context))), it),
94
+ prop: prop$1,
95
+ flakyTest: flakyTest$1,
96
+ layer(nestedLayer, options) {
97
+ return layer$1(Layer.provideMerge(nestedLayer, withTestEnv), {
98
+ ...options,
99
+ memoMap,
100
+ excludeTestServices
101
+ });
102
+ }
103
+ });
104
+ if (args.length === 1) {
105
+ beforeAll(() => runPromise(Effect.asVoid(contextEffect)), options?.timeout ? Duration.toMillis(Duration.fromInputUnsafe(options.timeout)) : void 0);
106
+ afterAll(() => runPromise(Scope.close(scope, Exit.void)), options?.timeout ? Duration.toMillis(Duration.fromInputUnsafe(options.timeout)) : void 0);
107
+ return args[0](makeIt(it$1));
108
+ }
109
+ return describe(args[0], () => {
110
+ beforeAll(() => runPromise(Effect.asVoid(contextEffect)), options?.timeout ? Duration.toMillis(Duration.fromInputUnsafe(options.timeout)) : void 0);
111
+ afterAll(() => runPromise(Scope.close(scope, Exit.void)), options?.timeout ? Duration.toMillis(Duration.fromInputUnsafe(options.timeout)) : void 0);
112
+ return args[1](makeIt(it$1));
113
+ });
114
+ };
115
+ /** @internal */
116
+ const flakyTest$1 = (self, timeout = Duration.seconds(30)) => pipe(self, Effect.scoped, Effect.sandbox, Effect.retry(pipe(Schedule.recurs(10), Schedule.while((_) => Effect.succeed(Duration.isLessThanOrEqualTo(Duration.fromInputUnsafe(_.elapsed), Duration.fromInputUnsafe(timeout)))))), Effect.orDie);
117
+ /** @internal */
118
+ const makeMethods = (it) => Object.assign(it, {
119
+ effect: makeTester(flow(Effect.scoped, Effect.provide(TestEnv)), it),
120
+ live: makeTester(Effect.scoped, it),
121
+ flakyTest: flakyTest$1,
122
+ layer: layer$1,
123
+ prop: prop$1
124
+ });
125
+ /** @internal */
126
+ const { effect: effect$1, live: live$1 } = /* @__PURE__ */ makeMethods(it$1);
127
+ /**
128
+ * @since 1.0.0
129
+ */
130
+ const it = /* @__PURE__ */ Object.assign(it$1, {
131
+ effect: effect$1,
132
+ live: live$1,
133
+ flakyTest: flakyTest$1,
134
+ layer: layer$1,
135
+ prop: prop$1
136
+ });
137
+ //#endregion
138
+ export { it as t };
139
+
140
+ //# sourceMappingURL=dist-DWgRbDN3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dist-DWgRbDN3.mjs","names":["V.it","prop","layer","V.describe","flakyTest","internal.effect","internal.live","internal.layer","internal.flakyTest","internal.prop","V.it"],"sources":["../../../node_modules/.pnpm/@effect+vitest@4.0.0-beta.66_effect@4.0.0-beta.57_vitest@4.1.5_@types+node@25.6.0_vite@_d7d7dab69e8c36d4c2ec9ca466208ed9/node_modules/@effect/vitest/dist/internal/internal.js","../../../node_modules/.pnpm/@effect+vitest@4.0.0-beta.66_effect@4.0.0-beta.57_vitest@4.1.5_@types+node@25.6.0_vite@_d7d7dab69e8c36d4c2ec9ca466208ed9/node_modules/@effect/vitest/dist/index.js"],"sourcesContent":["/**\n * @since 1.0.0\n */\nimport * as Cause from \"effect/Cause\";\nimport * as Duration from \"effect/Duration\";\nimport * as Effect from \"effect/Effect\";\nimport * as Exit from \"effect/Exit\";\nimport { flow, pipe } from \"effect/Function\";\nimport * as Layer from \"effect/Layer\";\nimport { isObject } from \"effect/Predicate\";\nimport * as Schedule from \"effect/Schedule\";\nimport * as Schema from \"effect/Schema\";\nimport * as Scope from \"effect/Scope\";\nimport * as fc from \"effect/testing/FastCheck\";\nimport * as TestClock from \"effect/testing/TestClock\";\nimport * as TestConsole from \"effect/testing/TestConsole\";\nimport * as V from \"vitest\";\nconst runPromise = /*#__PURE__*/Effect.fnUntraced(function* (effect, _ctx) {\n const exit = yield* Effect.exit(effect);\n if (Exit.isFailure(exit)) {\n const errors = Cause.prettyErrors(exit.cause);\n for (let i = 0; i < errors.length; i++) {\n yield* Effect.logError(errors[i]);\n }\n }\n return yield* exit;\n}, (effect, _, ctx) => Effect.runPromise(effect, {\n signal: ctx?.signal\n}));\n/** @internal */\nconst runTest = ctx => effect => runPromise(effect, ctx);\nconst TestEnv = /*#__PURE__*/Layer.mergeAll(TestConsole.layer, /*#__PURE__*/TestClock.layer());\n/** @internal */\nexport const addEqualityTesters = () => {\n V.expect.addEqualityTesters([]);\n};\n/** @internal */\nconst testOptions = timeout => typeof timeout === \"number\" ? {\n timeout\n} : timeout ?? {};\n/** @internal */\nconst makeTester = (mapEffect, it = V.it) => {\n const run = (ctx, args, self) => pipe(Effect.suspend(() => self(...args)), mapEffect, runTest(ctx));\n const f = (name, self, timeout) => it(name, testOptions(timeout), ctx => run(ctx, [ctx], self));\n const skip = (name, self, timeout) => it.skip(name, testOptions(timeout), ctx => run(ctx, [ctx], self));\n const skipIf = condition => (name, self, timeout) => it.skipIf(condition)(name, testOptions(timeout), ctx => run(ctx, [ctx], self));\n const runIf = condition => (name, self, timeout) => it.runIf(condition)(name, testOptions(timeout), ctx => run(ctx, [ctx], self));\n const only = (name, self, timeout) => it.only(name, testOptions(timeout), ctx => run(ctx, [ctx], self));\n const each = cases => (name, self, timeout) => it.for(cases)(name, testOptions(timeout), (args, ctx) => run(ctx, [args], self));\n const fails = (name, self, timeout) => V.it.fails(name, testOptions(timeout), ctx => run(ctx, [ctx], self));\n const prop = (name, arbitraries, self, timeout) => {\n if (Array.isArray(arbitraries)) {\n const arbs = arbitraries.map(arbitrary => {\n if (Schema.isSchema(arbitrary)) {\n return Schema.toArbitrary(arbitrary);\n }\n return arbitrary;\n });\n return it(name, testOptions(timeout), ctx =>\n // @ts-ignore\n fc.assert(\n // @ts-ignore\n fc.asyncProperty(...arbs, (...as) => run(ctx, [as, ctx], self)),\n // @ts-ignore\n isObject(timeout) ? timeout?.fastCheck : {}));\n }\n const arbs = fc.record(Object.keys(arbitraries).reduce(function (result, key) {\n const arb = arbitraries[key];\n if (Schema.isSchema(arb)) {\n result[key] = Schema.toArbitrary(arb);\n }\n result[key] = arb;\n return result;\n }, {}));\n return it(name, testOptions(timeout), ctx =>\n // @ts-ignore\n fc.assert(fc.asyncProperty(arbs, (...as) =>\n // @ts-ignore\n run(ctx, [as[0], ctx], self)),\n // @ts-ignore\n isObject(timeout) ? timeout?.fastCheck : {}));\n };\n return Object.assign(f, {\n skip,\n skipIf,\n runIf,\n only,\n each,\n fails,\n prop\n });\n};\n/** @internal */\nexport const prop = (name, arbitraries, self, timeout) => {\n if (Array.isArray(arbitraries)) {\n const arbs = arbitraries.map(arbitrary => {\n if (Schema.isSchema(arbitrary)) {\n throw new Error(\"Schemas are not supported yet\");\n }\n return arbitrary;\n });\n return V.it(name, testOptions(timeout),\n // @ts-ignore\n ctx => fc.assert(fc.property(...arbs, (...as) => self(as, ctx)), isObject(timeout) ? timeout?.fastCheck : {}));\n }\n const arbs = fc.record(Object.keys(arbitraries).reduce(function (result, key) {\n const arb = arbitraries[key];\n if (Schema.isSchema(arb)) {\n throw new Error(\"Schemas are not supported yet\");\n }\n result[key] = arb;\n return result;\n }, {}));\n return V.it(name, testOptions(timeout),\n // @ts-ignore\n ctx => fc.assert(fc.property(arbs, as => self(as, ctx)), isObject(timeout) ? timeout?.fastCheck : {}));\n};\n/** @internal */\nexport const layer = (layer_, options) => (...args) => {\n const excludeTestServices = options?.excludeTestServices ?? false;\n const withTestEnv = excludeTestServices ? layer_ : Layer.provideMerge(layer_, TestEnv);\n const memoMap = options?.memoMap ?? Effect.runSync(Layer.makeMemoMap);\n const scope = Effect.runSync(Scope.make());\n const contextEffect = Layer.buildWithMemoMap(withTestEnv, memoMap, scope).pipe(Effect.orDie, Effect.cached, Effect.runSync);\n const makeIt = it => Object.assign(it, {\n effect: makeTester(effect => Effect.flatMap(contextEffect, context => effect.pipe(Effect.scoped, Effect.provide(context))), it),\n prop,\n flakyTest,\n layer(nestedLayer, options) {\n return layer(Layer.provideMerge(nestedLayer, withTestEnv), {\n ...options,\n memoMap,\n excludeTestServices\n });\n }\n });\n if (args.length === 1) {\n V.beforeAll(() => runPromise(Effect.asVoid(contextEffect)), options?.timeout ? Duration.toMillis(Duration.fromInputUnsafe(options.timeout)) : undefined);\n V.afterAll(() => runPromise(Scope.close(scope, Exit.void)), options?.timeout ? Duration.toMillis(Duration.fromInputUnsafe(options.timeout)) : undefined);\n return args[0](makeIt(V.it));\n }\n return V.describe(args[0], () => {\n V.beforeAll(() => runPromise(Effect.asVoid(contextEffect)), options?.timeout ? Duration.toMillis(Duration.fromInputUnsafe(options.timeout)) : undefined);\n V.afterAll(() => runPromise(Scope.close(scope, Exit.void)), options?.timeout ? Duration.toMillis(Duration.fromInputUnsafe(options.timeout)) : undefined);\n return args[1](makeIt(V.it));\n });\n};\n/** @internal */\nexport const flakyTest = (self, timeout = Duration.seconds(30)) => pipe(self, Effect.scoped, Effect.sandbox, Effect.retry(pipe(Schedule.recurs(10), Schedule.while(_ => Effect.succeed(Duration.isLessThanOrEqualTo(Duration.fromInputUnsafe(_.elapsed), Duration.fromInputUnsafe(timeout)))))), Effect.orDie);\n/** @internal */\nexport const makeMethods = it => Object.assign(it, {\n effect: makeTester(flow(Effect.scoped, Effect.provide(TestEnv)), it),\n live: makeTester(Effect.scoped, it),\n flakyTest,\n layer,\n prop\n});\n/** @internal */\nexport const {\n /** @internal */\n effect,\n /** @internal */\n live\n} = /*#__PURE__*/makeMethods(V.it);\n/** @internal */\nexport const describeWrapped = (name, f) => V.describe(name, it => f(makeMethods(it)));\n//# sourceMappingURL=internal.js.map","import * as V from \"vitest\";\nimport * as internal from \"./internal/internal.js\";\n/**\n * @since 1.0.0\n */\nexport * from \"vitest\";\n/**\n * @since 1.0.0\n */\nexport const addEqualityTesters = internal.addEqualityTesters;\n/**\n * @since 1.0.0\n */\nexport const effect = internal.effect;\n/**\n * @since 1.0.0\n */\nexport const live = internal.live;\n/**\n * Share a `Layer` between multiple tests, optionally wrapping\n * the tests in a `describe` block if a name is provided.\n *\n * @since 1.0.0\n *\n * ```ts\n * import { expect, layer } from \"@effect/vitest\"\n * import { Effect, Layer, Context } from \"effect\"\n *\n * class Foo extends Context.Service(\"Foo\")<Foo, \"foo\">() {\n * static Live = Layer.succeed(Foo, \"foo\")\n * }\n *\n * class Bar extends Context.Service(\"Bar\")<Bar, \"bar\">() {\n * static Live = Layer.effect(\n * Bar,\n * Effect.map(Foo, () => \"bar\" as const)\n * )\n * }\n *\n * layer(Foo.Live)(\"layer\", (it) => {\n * it.effect(\"adds context\", () =>\n * Effect.gen(function*() {\n * const foo = yield* Foo\n * expect(foo).toEqual(\"foo\")\n * }))\n *\n * it.layer(Bar.Live)(\"nested\", (it) => {\n * it.effect(\"adds context\", () =>\n * Effect.gen(function*() {\n * const foo = yield* Foo\n * const bar = yield* Bar\n * expect(foo).toEqual(\"foo\")\n * expect(bar).toEqual(\"bar\")\n * }))\n * })\n * })\n * ```\n */\nexport const layer = internal.layer;\n/**\n * @since 1.0.0\n */\nexport const flakyTest = internal.flakyTest;\n/**\n * @since 1.0.0\n */\nexport const prop = internal.prop;\n/**\n * @since 1.0.0\n */\n/** @ignored */\nconst methods = {\n effect,\n live,\n flakyTest,\n layer,\n prop\n};\n/**\n * @since 1.0.0\n */\nexport const it = /*#__PURE__*/Object.assign(V.it, methods);\n/**\n * @since 1.0.0\n */\nexport const makeMethods = internal.makeMethods;\n/**\n * @since 1.0.0\n */\nexport const describeWrapped = internal.describeWrapped;\n//# sourceMappingURL=index.js.map"],"x_google_ignoreList":[0,1],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { a as Cancelled, c as GenerationFailed, d as RateLimited, f as Scope, h as Unsupported, i as AuthSubtype, l as IncompleteTurn, m as Unavailable, o as ContentFiltered, p as Timeout, r as AuthFailed, s as ContextLengthExceeded, t as AiError, u as InvalidRequest } from "../AiError-CAX_48RU.mjs";
2
- export { AiError, AuthFailed, AuthSubtype, Cancelled, ContentFiltered, ContextLengthExceeded, GenerationFailed, IncompleteTurn, InvalidRequest, RateLimited, Scope, Timeout, Unavailable, Unsupported };
1
+ import { a as Cancelled, c as GenerationFailed, d as RateLimited, f as Scope, g as describe, h as Unsupported, i as AuthSubtype, l as IncompleteTurn, m as Unavailable, o as ContentFiltered, p as Timeout, r as AuthFailed, s as ContextLengthExceeded, t as AiError, u as InvalidRequest } from "../AiError-Bf1pq4BB.mjs";
2
+ export { AiError, AuthFailed, AuthSubtype, Cancelled, ContentFiltered, ContextLengthExceeded, GenerationFailed, IncompleteTurn, InvalidRequest, RateLimited, Scope, Timeout, Unavailable, Unsupported, describe };
@@ -1,5 +1,5 @@
1
1
  import { n as __exportAll } from "../chunk-uyGKjUfl.mjs";
2
- import { Data } from "effect";
2
+ import { Data, Match } from "effect";
3
3
  //#region src/domain/AiError.ts
4
4
  var AiError_exports = /* @__PURE__ */ __exportAll({
5
5
  AuthFailed: () => AuthFailed,
@@ -12,7 +12,8 @@ var AiError_exports = /* @__PURE__ */ __exportAll({
12
12
  RateLimited: () => RateLimited,
13
13
  Timeout: () => Timeout,
14
14
  Unavailable: () => Unavailable,
15
- Unsupported: () => Unsupported
15
+ Unsupported: () => Unsupported,
16
+ describe: () => describe
16
17
  });
17
18
  var RateLimited = class extends Data.TaggedError("RateLimited") {};
18
19
  var Unavailable = class extends Data.TaggedError("Unavailable") {};
@@ -50,7 +51,25 @@ var IncompleteTurn = class extends Data.TaggedError("IncompleteTurn") {};
50
51
  * (`TtsIncrementalText`, `SttStreaming`) on the R channel instead.
51
52
  */
52
53
  var Unsupported = class extends Data.TaggedError("Unsupported") {};
54
+ const withReason = (base, reason) => reason === void 0 ? base : `${base}: ${reason}`;
55
+ /**
56
+ * Short human-readable description of an error, for logs and model-facing
57
+ * failure messages. Prose, not a contract; branch on `_tag` instead.
58
+ */
59
+ const describe = Match.type().pipe(Match.discriminatorsExhaustive("_tag")({
60
+ RateLimited: (e) => `rate limited by ${e.provider}; try again later`,
61
+ Unavailable: (e) => `${e.provider} is temporarily unavailable`,
62
+ Timeout: (e) => `the ${e.provider} request timed out`,
63
+ ContentFiltered: (e) => withReason(`blocked by ${e.provider}'s content filter`, e.reason),
64
+ ContextLengthExceeded: (e) => `the request exceeded ${e.provider}'s context limit`,
65
+ InvalidRequest: (e) => e.param === void 0 ? `${e.provider} rejected the request` : `${e.provider} rejected the request (param: ${e.param})`,
66
+ AuthFailed: (e) => `authentication against ${e.provider} failed (${e.subtype})`,
67
+ Cancelled: (e) => `the ${e.provider} request was cancelled`,
68
+ IncompleteTurn: () => "the provider stream ended without completing",
69
+ GenerationFailed: (e) => e.message ?? `${e.provider} failed mid-generation`,
70
+ Unsupported: (e) => withReason(`${e.provider} does not support ${e.capability}`, e.reason)
71
+ }));
53
72
  //#endregion
54
- export { AuthFailed, Cancelled, ContentFiltered, ContextLengthExceeded, GenerationFailed, IncompleteTurn, InvalidRequest, RateLimited, Timeout, Unavailable, Unsupported, AiError_exports as t };
73
+ export { AuthFailed, Cancelled, ContentFiltered, ContextLengthExceeded, GenerationFailed, IncompleteTurn, InvalidRequest, RateLimited, Timeout, Unavailable, Unsupported, describe, AiError_exports as t };
55
74
 
56
75
  //# sourceMappingURL=AiError.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"AiError.mjs","names":[],"sources":["../../src/domain/AiError.ts"],"sourcesContent":["import { Data, Duration } from \"effect\"\n\nexport type Scope = \"rpm\" | \"tpm\" | \"rpd\" | \"tpd\"\n\nexport class RateLimited extends Data.TaggedError(\"RateLimited\")<{\n provider: string\n retryAfter?: Duration.Duration\n scope?: Scope\n requestId?: string\n raw: unknown\n}> {}\n\nexport class Unavailable extends Data.TaggedError(\"Unavailable\")<{\n provider: string\n retryAfter?: Duration.Duration\n status?: number\n requestId?: string\n raw: unknown\n}> {}\n\nexport class Timeout extends Data.TaggedError(\"Timeout\")<{\n provider: string\n requestId?: string\n raw: unknown\n}> {}\n\nexport class ContentFiltered extends Data.TaggedError(\"ContentFiltered\")<{\n provider: string\n reason?: string\n requestId?: string\n raw: unknown\n}> {}\n\nexport class ContextLengthExceeded extends Data.TaggedError(\"ContextLengthExceeded\")<{\n provider: string\n modelLimit?: number\n requested?: number\n raw: unknown\n}> {}\n\nexport class InvalidRequest extends Data.TaggedError(\"InvalidRequest\")<{\n provider: string\n param?: string\n requestId?: string\n raw: unknown\n}> {}\n\nexport type AuthSubtype = \"auth\" | \"permission\" | \"billing\" | \"quota\"\n\nexport class AuthFailed extends Data.TaggedError(\"AuthFailed\")<{\n provider: string\n subtype: AuthSubtype\n raw: unknown\n}> {}\n\nexport class Cancelled extends Data.TaggedError(\"Cancelled\")<{\n provider: string\n}> {}\n\n/**\n * The model errored mid-generation. Distinct from `Unavailable` (transport\n * problem before generation started) and from `IncompleteTurn` (provider\n * stream ended without a terminal event). The provider's own error message,\n * if any, is on `message`.\n */\nexport class GenerationFailed extends Data.TaggedError(\"GenerationFailed\")<{\n provider: string\n code?: string\n message?: string\n requestId?: string\n raw: unknown\n}> {}\n\n/**\n * The provider's delta stream ended without a terminal `TurnComplete`.\n * Indicates a misbehaving provider or a connection that dropped mid-flight.\n * Non-terminal deltas seen so far have already been emitted downstream.\n */\nexport class IncompleteTurn extends Data.TaggedError(\"IncompleteTurn\")<{\n raw?: unknown\n}> {}\n\n/**\n * The provider does not implement the requested capability for this\n * specific request. Distinct from `InvalidRequest` (the request shape is\n * malformed) and `AuthFailed` (the request was rejected).\n *\n * Reserved for request-data-dependent gaps where the provider supports\n * the method in general but not for these inputs — e.g. Google's\n * `streamSynthesisFrom` works only for Chirp 3 HD voices; calling it\n * with a Neural2 voice ID fails `Unsupported`.\n *\n * Blanket provider-level gaps (e.g. OpenAI has no incremental-text-in\n * TTS at all) are gated at compile time via capability marker tags\n * (`TtsIncrementalText`, `SttStreaming`) on the R channel instead.\n */\nexport class Unsupported extends Data.TaggedError(\"Unsupported\")<{\n provider: string\n capability: string\n reason?: string\n}> {}\n\nexport type AiError =\n | RateLimited\n | Unavailable\n | Timeout\n | ContentFiltered\n | ContextLengthExceeded\n | InvalidRequest\n | AuthFailed\n | Cancelled\n | IncompleteTurn\n | GenerationFailed\n | Unsupported\n"],"mappings":";;;;;;;;;;;;;;;;AAIA,IAAa,cAAb,cAAiC,KAAK,YAAY,cAAc,CAM7D;AAEH,IAAa,cAAb,cAAiC,KAAK,YAAY,cAAc,CAM7D;AAEH,IAAa,UAAb,cAA6B,KAAK,YAAY,UAAU,CAIrD;AAEH,IAAa,kBAAb,cAAqC,KAAK,YAAY,kBAAkB,CAKrE;AAEH,IAAa,wBAAb,cAA2C,KAAK,YAAY,wBAAwB,CAKjF;AAEH,IAAa,iBAAb,cAAoC,KAAK,YAAY,iBAAiB,CAKnE;AAIH,IAAa,aAAb,cAAgC,KAAK,YAAY,aAAa,CAI3D;AAEH,IAAa,YAAb,cAA+B,KAAK,YAAY,YAAY,CAEzD;;;;;;;AAQH,IAAa,mBAAb,cAAsC,KAAK,YAAY,mBAAmB,CAMvE;;;;;;AAOH,IAAa,iBAAb,cAAoC,KAAK,YAAY,iBAAiB,CAEnE;;;;;;;;;;;;;;;AAgBH,IAAa,cAAb,cAAiC,KAAK,YAAY,cAAc,CAI7D"}
1
+ {"version":3,"file":"AiError.mjs","names":[],"sources":["../../src/domain/AiError.ts"],"sourcesContent":["import { Data, Duration, Match } from \"effect\"\n\nexport type Scope = \"rpm\" | \"tpm\" | \"rpd\" | \"tpd\"\n\nexport class RateLimited extends Data.TaggedError(\"RateLimited\")<{\n provider: string\n retryAfter?: Duration.Duration\n scope?: Scope\n requestId?: string\n raw: unknown\n}> {}\n\nexport class Unavailable extends Data.TaggedError(\"Unavailable\")<{\n provider: string\n retryAfter?: Duration.Duration\n status?: number\n requestId?: string\n raw: unknown\n}> {}\n\nexport class Timeout extends Data.TaggedError(\"Timeout\")<{\n provider: string\n requestId?: string\n raw: unknown\n}> {}\n\nexport class ContentFiltered extends Data.TaggedError(\"ContentFiltered\")<{\n provider: string\n reason?: string\n requestId?: string\n raw: unknown\n}> {}\n\nexport class ContextLengthExceeded extends Data.TaggedError(\"ContextLengthExceeded\")<{\n provider: string\n modelLimit?: number\n requested?: number\n raw: unknown\n}> {}\n\nexport class InvalidRequest extends Data.TaggedError(\"InvalidRequest\")<{\n provider: string\n param?: string\n requestId?: string\n raw: unknown\n}> {}\n\nexport type AuthSubtype = \"auth\" | \"permission\" | \"billing\" | \"quota\"\n\nexport class AuthFailed extends Data.TaggedError(\"AuthFailed\")<{\n provider: string\n subtype: AuthSubtype\n raw: unknown\n}> {}\n\nexport class Cancelled extends Data.TaggedError(\"Cancelled\")<{\n provider: string\n}> {}\n\n/**\n * The model errored mid-generation. Distinct from `Unavailable` (transport\n * problem before generation started) and from `IncompleteTurn` (provider\n * stream ended without a terminal event). The provider's own error message,\n * if any, is on `message`.\n */\nexport class GenerationFailed extends Data.TaggedError(\"GenerationFailed\")<{\n provider: string\n code?: string\n message?: string\n requestId?: string\n raw: unknown\n}> {}\n\n/**\n * The provider's delta stream ended without a terminal `TurnComplete`.\n * Indicates a misbehaving provider or a connection that dropped mid-flight.\n * Non-terminal deltas seen so far have already been emitted downstream.\n */\nexport class IncompleteTurn extends Data.TaggedError(\"IncompleteTurn\")<{\n raw?: unknown\n}> {}\n\n/**\n * The provider does not implement the requested capability for this\n * specific request. Distinct from `InvalidRequest` (the request shape is\n * malformed) and `AuthFailed` (the request was rejected).\n *\n * Reserved for request-data-dependent gaps where the provider supports\n * the method in general but not for these inputs — e.g. Google's\n * `streamSynthesisFrom` works only for Chirp 3 HD voices; calling it\n * with a Neural2 voice ID fails `Unsupported`.\n *\n * Blanket provider-level gaps (e.g. OpenAI has no incremental-text-in\n * TTS at all) are gated at compile time via capability marker tags\n * (`TtsIncrementalText`, `SttStreaming`) on the R channel instead.\n */\nexport class Unsupported extends Data.TaggedError(\"Unsupported\")<{\n provider: string\n capability: string\n reason?: string\n}> {}\n\nexport type AiError =\n | RateLimited\n | Unavailable\n | Timeout\n | ContentFiltered\n | ContextLengthExceeded\n | InvalidRequest\n | AuthFailed\n | Cancelled\n | IncompleteTurn\n | GenerationFailed\n | Unsupported\n\nconst withReason = (base: string, reason: string | undefined): string =>\n reason === undefined ? base : `${base}: ${reason}`\n\n/**\n * Short human-readable description of an error, for logs and model-facing\n * failure messages. Prose, not a contract; branch on `_tag` instead.\n */\nexport const describe: (e: AiError) => string = Match.type<AiError>().pipe(\n Match.discriminatorsExhaustive(\"_tag\")({\n RateLimited: (e) => `rate limited by ${e.provider}; try again later`,\n Unavailable: (e) => `${e.provider} is temporarily unavailable`,\n Timeout: (e) => `the ${e.provider} request timed out`,\n ContentFiltered: (e) => withReason(`blocked by ${e.provider}'s content filter`, e.reason),\n ContextLengthExceeded: (e) => `the request exceeded ${e.provider}'s context limit`,\n InvalidRequest: (e) =>\n e.param === undefined\n ? `${e.provider} rejected the request`\n : `${e.provider} rejected the request (param: ${e.param})`,\n AuthFailed: (e) => `authentication against ${e.provider} failed (${e.subtype})`,\n Cancelled: (e) => `the ${e.provider} request was cancelled`,\n IncompleteTurn: () => \"the provider stream ended without completing\",\n GenerationFailed: (e) => e.message ?? `${e.provider} failed mid-generation`,\n Unsupported: (e) => withReason(`${e.provider} does not support ${e.capability}`, e.reason),\n }),\n)\n"],"mappings":";;;;;;;;;;;;;;;;;AAIA,IAAa,cAAb,cAAiC,KAAK,YAAY,cAAc,CAM7D;AAEH,IAAa,cAAb,cAAiC,KAAK,YAAY,cAAc,CAM7D;AAEH,IAAa,UAAb,cAA6B,KAAK,YAAY,UAAU,CAIrD;AAEH,IAAa,kBAAb,cAAqC,KAAK,YAAY,kBAAkB,CAKrE;AAEH,IAAa,wBAAb,cAA2C,KAAK,YAAY,wBAAwB,CAKjF;AAEH,IAAa,iBAAb,cAAoC,KAAK,YAAY,iBAAiB,CAKnE;AAIH,IAAa,aAAb,cAAgC,KAAK,YAAY,aAAa,CAI3D;AAEH,IAAa,YAAb,cAA+B,KAAK,YAAY,YAAY,CAEzD;;;;;;;AAQH,IAAa,mBAAb,cAAsC,KAAK,YAAY,mBAAmB,CAMvE;;;;;;AAOH,IAAa,iBAAb,cAAoC,KAAK,YAAY,iBAAiB,CAEnE;;;;;;;;;;;;;;;AAgBH,IAAa,cAAb,cAAiC,KAAK,YAAY,cAAc,CAI7D;AAeH,MAAM,cAAc,MAAc,WAChC,WAAW,KAAA,IAAY,OAAO,GAAG,KAAK,IAAI;;;;;AAM5C,MAAa,WAAmC,MAAM,MAAe,CAAC,KACpE,MAAM,yBAAyB,OAAO,CAAC;CACrC,cAAc,MAAM,mBAAmB,EAAE,SAAS;CAClD,cAAc,MAAM,GAAG,EAAE,SAAS;CAClC,UAAU,MAAM,OAAO,EAAE,SAAS;CAClC,kBAAkB,MAAM,WAAW,cAAc,EAAE,SAAS,oBAAoB,EAAE,OAAO;CACzF,wBAAwB,MAAM,wBAAwB,EAAE,SAAS;CACjE,iBAAiB,MACf,EAAE,UAAU,KAAA,IACR,GAAG,EAAE,SAAS,yBACd,GAAG,EAAE,SAAS,gCAAgC,EAAE,MAAM;CAC5D,aAAa,MAAM,0BAA0B,EAAE,SAAS,WAAW,EAAE,QAAQ;CAC7E,YAAY,MAAM,OAAO,EAAE,SAAS;CACpC,sBAAsB;CACtB,mBAAmB,MAAM,EAAE,WAAW,GAAG,EAAE,SAAS;CACpD,cAAc,MAAM,WAAW,GAAG,EAAE,SAAS,oBAAoB,EAAE,cAAc,EAAE,OAAO;CAC3F,CAAC,CACH"}
@@ -1,2 +1,2 @@
1
- import { a as AudioSource, c as isAudioBytes, i as AudioMimeType, l as isAudioUrl, n as AudioChunk, r as AudioFormat, s as isAudioBase64, t as AudioBlob } from "../Audio-DPlTsNdz.mjs";
1
+ import { a as AudioSource, c as isAudioBytes, i as AudioMimeType, l as isAudioUrl, n as AudioChunk, r as AudioFormat, s as isAudioBase64, t as AudioBlob } from "../Audio-CR7CSljJ.mjs";
2
2
  export { AudioBlob, AudioChunk, AudioFormat, AudioMimeType, AudioSource, isAudioBase64, isAudioBytes, isAudioUrl };
@@ -1,2 +1,2 @@
1
- import { a as ImageUrlSource, c as imageBytes, d as isImageBytes, f as isImageUrl, i as ImageSource, l as imageUrl, n as ImageBytesSource, r as ImageMimeType, s as imageBase64, t as ImageBase64Source, u as isImageBase64 } from "../Image-HNmMpMTh.mjs";
1
+ import { a as ImageUrlSource, c as imageBytes, d as isImageBytes, f as isImageUrl, i as ImageSource, l as imageUrl, n as ImageBytesSource, r as ImageMimeType, s as imageBase64, t as ImageBase64Source, u as isImageBase64 } from "../Image-BZmKfIdq.mjs";
2
2
  export { ImageBase64Source, ImageBytesSource, ImageMimeType, ImageSource, ImageUrlSource, imageBase64, imageBytes, imageUrl, isImageBase64, isImageBytes, isImageUrl };
@@ -1,2 +1,2 @@
1
- import { A as isReasoning, C as isContainerFileCitation, D as isInputText, E as isInputImage, F as systemText, I as toolCallOutput, L as userText, M as isToolCall, N as isToolCallOutput, O as isMessage, P as isUrlCitation, S as assistantText, T as isFilePath, _ as StopReason, a as FilePath, b as UrlCitation, c as InputText, d as Message, f as OutputText, g as Role, h as Refusal, i as FileCitation, j as isRefusal, k as isOutputText, l as InputTokensDetails, m as Reasoning, n as ContainerFileCitation, o as HistoryItem, p as OutputTokensDetails, r as ContentBlock, s as InputImage, t as Annotation, v as ToolCall, w as isFileCitation, x as Usage, y as ToolCallOutput } from "../Items-7ljaVxH_.mjs";
1
+ import { A as isReasoning, C as isContainerFileCitation, D as isInputText, E as isInputImage, F as systemText, I as toolCallOutput, L as userText, M as isToolCall, N as isToolCallOutput, O as isMessage, P as isUrlCitation, S as assistantText, T as isFilePath, _ as StopReason, a as FilePath, b as UrlCitation, c as InputText, d as Message, f as OutputText, g as Role, h as Refusal, i as FileCitation, j as isRefusal, k as isOutputText, l as InputTokensDetails, m as Reasoning, n as ContainerFileCitation, o as HistoryItem, p as OutputTokensDetails, r as ContentBlock, s as InputImage, t as Annotation, v as ToolCall, w as isFileCitation, x as Usage, y as ToolCallOutput } from "../Items-BnIduEV2.mjs";
2
2
  export { Annotation, ContainerFileCitation, ContentBlock, FileCitation, FilePath, HistoryItem, InputImage, InputText, InputTokensDetails, Message, OutputText, OutputTokensDetails, Reasoning, Refusal, Role, StopReason, ToolCall, ToolCallOutput, UrlCitation, Usage, assistantText, isContainerFileCitation, isFileCitation, isFilePath, isInputImage, isInputText, isMessage, isOutputText, isReasoning, isRefusal, isToolCall, isToolCallOutput, isUrlCitation, systemText, toolCallOutput, userText };
@@ -1,4 +1,4 @@
1
- import { n as AudioChunk, r as AudioFormat, t as AudioBlob } from "../Audio-DPlTsNdz.mjs";
1
+ import { n as AudioChunk, r as AudioFormat, t as AudioBlob } from "../Audio-CR7CSljJ.mjs";
2
2
  import { Duration } from "effect";
3
3
 
4
4
  //#region src/domain/Music.d.ts
@@ -1,9 +1,9 @@
1
- import { i as ImageSource } from "../Image-HNmMpMTh.mjs";
2
- import { d as Message, m as Reasoning, o as HistoryItem, v as ToolCall, x as Usage, y as ToolCallOutput } from "../Items-7ljaVxH_.mjs";
3
- import { i as StructuredFormat, n as JsonParseError, r as StructuredDecodeError } from "../StructuredFormat-BbN4dosH.mjs";
1
+ import { i as ImageSource } from "../Image-BZmKfIdq.mjs";
2
+ import { d as Message, m as Reasoning, o as HistoryItem, v as ToolCall, x as Usage, y as ToolCallOutput } from "../Items-BnIduEV2.mjs";
3
+ import { i as StructuredFormat, n as JsonParseError, r as StructuredDecodeError } from "../StructuredFormat-DHaUJBdd.mjs";
4
4
  import { Data, Effect, Schema, Stream } from "effect";
5
- import * as _$effect_Types0 from "effect/Types";
6
5
  import * as _$effect_Cause0 from "effect/Cause";
6
+ import * as _$effect_Types0 from "effect/Types";
7
7
  import * as _$effect_Unify0 from "effect/Unify";
8
8
 
9
9
  //#region src/domain/Turn.d.ts
@@ -1,6 +1,6 @@
1
1
  import { assistantText, systemText, userText } from "./Items.mjs";
2
2
  import { assistantText as assistantText$1, assistantTexts } from "./Turn.mjs";
3
- import { i as it, n as globalExpect, r as describe } from "../dist-DV5ISja1.mjs";
3
+ import { a as describe, n as globalExpect, o as it } from "../dist-B04dlFHg.mjs";
4
4
  //#region src/domain/Turn.test.ts
5
5
  const turnOf = (items) => ({
6
6
  items,
@@ -1,4 +1,4 @@
1
- import { i as ImageSource } from "../Image-HNmMpMTh.mjs";
1
+ import { i as ImageSource } from "../Image-BZmKfIdq.mjs";
2
2
 
3
3
  //#region src/embedding-model/Embedding.d.ts
4
4
  declare namespace Embedding_d_exports {
@@ -1,4 +1,4 @@
1
- import { t as AiError } from "../AiError-CAX_48RU.mjs";
1
+ import { t as AiError } from "../AiError-Bf1pq4BB.mjs";
2
2
  import { EmbedInput, EmbeddingFor, ResponseEncoding, Usage } from "./Embedding.mjs";
3
3
  import { Context, Effect } from "effect";
4
4
 
@@ -1,5 +1,5 @@
1
1
  import { embed, embedMany } from "./EmbeddingModel.mjs";
2
- import { i as it, r as describe, t as import_dist } from "../dist-DV5ISja1.mjs";
2
+ import { a as describe, o as it, t as import_dist } from "../dist-B04dlFHg.mjs";
3
3
  //#region src/embedding-model/EmbeddingModel.test.ts
4
4
  describe("EmbedResponse<E> conditional narrowing", () => {
5
5
  it("defaults to Float32Embedding when E is undefined", () => {
@@ -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 // @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 })\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;AAMlF,YAAU;GAAE,QAAQ,CAAC,IAAI;GAAE,OAAO;GAAK,UAAU;GAAe,CAAC;AAEjE,QAAM;GAAE,OAAO;GAAK,OAAO;GAAK,UAAU;GAAU,CAAC;GACrD;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;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"}
package/dist/index.d.mts CHANGED
@@ -1,37 +1,43 @@
1
- import { t as Capabilities_d_exports } from "./capabilities/Capabilities.mjs";
2
- import { n as AiError_d_exports } from "./AiError-CAX_48RU.mjs";
1
+ import { t as BrowserError_d_exports } from "./browser/BrowserError.mjs";
2
+ import { t as Browser_d_exports } from "./browser/Browser.mjs";
3
3
  import { a as Media_d_exports } from "./Media-D_CpcM1Z.mjs";
4
- import { o as Audio_d_exports } from "./Audio-DPlTsNdz.mjs";
5
- import { o as Image_d_exports } from "./Image-HNmMpMTh.mjs";
6
- import { u as Items_d_exports } from "./Items-7ljaVxH_.mjs";
4
+ import { o as Image_d_exports } from "./Image-BZmKfIdq.mjs";
5
+ import { u as Items_d_exports } from "./Items-BnIduEV2.mjs";
6
+ import { _ as Tool_d_exports } from "./Tool-2lC_XMth.mjs";
7
+ import { t as BrowserTool_d_exports } from "./browser/BrowserTool.mjs";
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";
7
11
  import { t as Music_d_exports } from "./domain/Music.mjs";
8
12
  import { t as Transcript_d_exports } from "./domain/Transcript.mjs";
9
- import { a as StructuredFormat_d_exports } from "./StructuredFormat-BbN4dosH.mjs";
13
+ import { a as StructuredFormat_d_exports } from "./StructuredFormat-DHaUJBdd.mjs";
10
14
  import { t as Turn_d_exports } from "./domain/Turn.mjs";
11
15
  import { t as Embedding_d_exports } from "./embedding-model/Embedding.mjs";
12
16
  import { t as EmbeddingModel_d_exports } from "./embedding-model/EmbeddingModel.mjs";
13
- import { l as Tool_d_exports } from "./Tool-BKiieFXk.mjs";
17
+ import { t as Loop_d_exports } from "./Loop-D8nWpowc.mjs";
18
+ import { n as ToolResult_d_exports } from "./ToolResult-CL4hK_9z.mjs";
19
+ import { n as ToolEvent_d_exports } from "./ToolEvent-cWZ2BnbS.mjs";
20
+ import { l as Toolkit_d_exports } from "./Toolkit-Dr9l_hNy.mjs";
14
21
  import { t as LanguageModel_d_exports } from "./language-model/LanguageModel.mjs";
15
22
  import { t as MusicGenerator_d_exports } from "./music-generator/MusicGenerator.mjs";
16
23
  import { t as Memory_d_exports } from "./sandbox/Memory.mjs";
17
- import { o as SandboxError_d_exports } from "./SandboxError-BvKypkJm.mjs";
24
+ import { o as SandboxError_d_exports } from "./SandboxError-CIrVDOMV.mjs";
18
25
  import { t as Sandbox_d_exports } from "./sandbox/Sandbox.mjs";
19
26
  import { t as SandboxImage_d_exports } from "./sandbox/SandboxImage.mjs";
20
27
  import { t as SandboxNetwork_d_exports } from "./sandbox/SandboxNetwork.mjs";
21
28
  import { t as SpeechSynthesizer_d_exports } from "./speech-synthesizer/SpeechSynthesizer.mjs";
22
29
  import { t as Transcriber_d_exports } from "./transcriber/Transcriber.mjs";
30
+ import { t as WebRead_d_exports } from "./web-read/WebRead.mjs";
31
+ import { t as WebReadTool_d_exports } from "./web-read/WebReadTool.mjs";
23
32
  import { t as WebSearch_d_exports } from "./web-search/WebSearch.mjs";
24
33
  import { t as WebSearchTool_d_exports } from "./web-search/WebSearchTool.mjs";
25
34
  import { t as Vector_d_exports } from "./math/Vector.mjs";
26
- import { t as Loop_d_exports } from "./loop/Loop.mjs";
27
35
  import { t as Retry_d_exports } from "./retry/Retry.mjs";
28
- import { t as ToolResult_d_exports } from "./tool/ToolResult.mjs";
29
- import { t as ToolEvent_d_exports } from "./tool/ToolEvent.mjs";
30
- import { t as Toolkit_d_exports } from "./tool/Toolkit.mjs";
31
36
  import { t as Approval_d_exports } from "./tool/Approval.mjs";
32
37
  import { t as HistoryCheck_d_exports } from "./tool/HistoryCheck.mjs";
33
38
  import { t as JSONL_d_exports } from "./streaming/JSONL.mjs";
34
39
  import { t as Lines_d_exports } from "./streaming/Lines.mjs";
35
40
  import { t as SSE_d_exports } from "./streaming/SSE.mjs";
36
41
  import { t as Metrics_d_exports } from "./observability/Metrics.mjs";
37
- export { AiError_d_exports as AiError, Approval_d_exports as Approval, Audio_d_exports as Audio, Capabilities_d_exports as Capabilities, Embedding_d_exports as Embedding, EmbeddingModel_d_exports as EmbeddingModel, HistoryCheck_d_exports as HistoryCheck, Image_d_exports as Image, Items_d_exports as Items, JSONL_d_exports as JSONL, LanguageModel_d_exports as LanguageModel, Lines_d_exports as Lines, Loop_d_exports as Loop, Media_d_exports as Media, Memory_d_exports as Memory, Metrics_d_exports as Metrics, Music_d_exports as Music, MusicGenerator_d_exports as MusicGenerator, Retry_d_exports as Retry, SSE_d_exports as SSE, Sandbox_d_exports as Sandbox, SandboxError_d_exports as SandboxError, SandboxImage_d_exports as SandboxImage, SandboxNetwork_d_exports as SandboxNetwork, SpeechSynthesizer_d_exports as SpeechSynthesizer, StructuredFormat_d_exports as StructuredFormat, Tool_d_exports as Tool, ToolEvent_d_exports as ToolEvent, ToolResult_d_exports as ToolResult, Toolkit_d_exports as Toolkit, Transcriber_d_exports as Transcriber, Transcript_d_exports as Transcript, Turn_d_exports as Turn, Vector_d_exports as Vector, WebSearch_d_exports as WebSearch, WebSearchTool_d_exports as WebSearchTool };
42
+ import { t as Telemetry_d_exports } from "./observability/Telemetry.mjs";
43
+ export { AiError_d_exports as AiError, Approval_d_exports as Approval, Audio_d_exports as Audio, Browser_d_exports as Browser, BrowserError_d_exports as BrowserError, BrowserTool_d_exports as BrowserTool, Capabilities_d_exports as Capabilities, Embedding_d_exports as Embedding, EmbeddingModel_d_exports as EmbeddingModel, HistoryCheck_d_exports as HistoryCheck, Image_d_exports as Image, Items_d_exports as Items, JSONL_d_exports as JSONL, LanguageModel_d_exports as LanguageModel, Lines_d_exports as Lines, Loop_d_exports as Loop, Media_d_exports as Media, Memory_d_exports as Memory, Metrics_d_exports as Metrics, Music_d_exports as Music, MusicGenerator_d_exports as MusicGenerator, Retry_d_exports as Retry, SSE_d_exports as SSE, Sandbox_d_exports as Sandbox, SandboxError_d_exports as SandboxError, SandboxImage_d_exports as SandboxImage, SandboxNetwork_d_exports as SandboxNetwork, SpeechSynthesizer_d_exports as SpeechSynthesizer, StructuredFormat_d_exports as StructuredFormat, Telemetry_d_exports as Telemetry, Tool_d_exports as Tool, ToolEvent_d_exports as ToolEvent, ToolResult_d_exports as ToolResult, Toolkit_d_exports as Toolkit, Transcriber_d_exports as Transcriber, Transcript_d_exports as Transcript, Turn_d_exports as Turn, Vector_d_exports as Vector, WebRead_d_exports as WebRead, WebReadTool_d_exports as WebReadTool, WebSearch_d_exports as WebSearch, WebSearchTool_d_exports as WebSearchTool };
package/dist/index.mjs CHANGED
@@ -1,13 +1,21 @@
1
1
  import { t as AiError_exports } from "./domain/AiError.mjs";
2
2
  import { t as Audio_exports } from "./domain/Audio.mjs";
3
- import { t as Capabilities_exports } from "./capabilities/Capabilities.mjs";
3
+ import { t as Browser_exports } from "./browser/Browser.mjs";
4
+ import { t as BrowserError_exports } from "./browser/BrowserError.mjs";
4
5
  import { t as Image_exports } from "./domain/Image.mjs";
5
6
  import { t as Items_exports } from "./domain/Items.mjs";
7
+ import { t as ToolResult_exports } from "./tool/ToolResult.mjs";
8
+ import { t as Tool_exports } from "./tool/Tool.mjs";
9
+ import { t as StructuredFormat_exports } from "./structured-format/StructuredFormat.mjs";
10
+ import { t as Turn_exports } from "./domain/Turn.mjs";
11
+ import { t as Loop_exports } from "./loop/Loop.mjs";
12
+ import { t as ToolEvent_exports } from "./tool/ToolEvent.mjs";
13
+ import { t as Toolkit_exports } from "./tool/Toolkit.mjs";
14
+ import { t as BrowserTool_exports } from "./browser/BrowserTool.mjs";
15
+ import { t as Capabilities_exports } from "./capabilities/Capabilities.mjs";
6
16
  import { t as Media_exports } from "./domain/Media.mjs";
7
17
  import { t as Music_exports } from "./domain/Music.mjs";
8
18
  import { t as Transcript_exports } from "./domain/Transcript.mjs";
9
- import { t as StructuredFormat_exports } from "./structured-format/StructuredFormat.mjs";
10
- import { t as Turn_exports } from "./domain/Turn.mjs";
11
19
  import { t as Embedding_exports } from "./embedding-model/Embedding.mjs";
12
20
  import { t as EmbeddingModel_exports } from "./embedding-model/EmbeddingModel.mjs";
13
21
  import { t as LanguageModel_exports } from "./language-model/LanguageModel.mjs";
@@ -19,19 +27,17 @@ import { t as SandboxImage_exports } from "./sandbox/SandboxImage.mjs";
19
27
  import { t as SandboxNetwork_exports } from "./sandbox/SandboxNetwork.mjs";
20
28
  import { t as SpeechSynthesizer_exports } from "./speech-synthesizer/SpeechSynthesizer.mjs";
21
29
  import { t as Transcriber_exports } from "./transcriber/Transcriber.mjs";
30
+ import { t as WebRead_exports } from "./web-read/WebRead.mjs";
31
+ import { t as WebReadTool_exports } from "./web-read/WebReadTool.mjs";
22
32
  import { t as WebSearch_exports } from "./web-search/WebSearch.mjs";
23
- import { t as Tool_exports } from "./tool/Tool.mjs";
24
33
  import { t as WebSearchTool_exports } from "./web-search/WebSearchTool.mjs";
25
34
  import { t as Vector_exports } from "./math/Vector.mjs";
26
- import { t as Loop_exports } from "./loop/Loop.mjs";
27
35
  import { t as Retry_exports } from "./retry/Retry.mjs";
28
- import { t as ToolResult_exports } from "./tool/ToolResult.mjs";
29
- import { t as ToolEvent_exports } from "./tool/ToolEvent.mjs";
30
- import { t as Toolkit_exports } from "./tool/Toolkit.mjs";
31
36
  import { t as Approval_exports } from "./tool/Approval.mjs";
32
37
  import { t as HistoryCheck_exports } from "./tool/HistoryCheck.mjs";
33
38
  import { t as JSONL_exports } from "./streaming/JSONL.mjs";
34
39
  import { t as Lines_exports } from "./streaming/Lines.mjs";
35
40
  import { t as SSE_exports } from "./streaming/SSE.mjs";
36
41
  import { t as Metrics_exports } from "./observability/Metrics.mjs";
37
- export { AiError_exports as AiError, Approval_exports as Approval, Audio_exports as Audio, Capabilities_exports as Capabilities, Embedding_exports as Embedding, EmbeddingModel_exports as EmbeddingModel, HistoryCheck_exports as HistoryCheck, Image_exports as Image, Items_exports as Items, JSONL_exports as JSONL, LanguageModel_exports as LanguageModel, Lines_exports as Lines, Loop_exports as Loop, Media_exports as Media, Memory_exports as Memory, Metrics_exports as Metrics, Music_exports as Music, MusicGenerator_exports as MusicGenerator, Retry_exports as Retry, SSE_exports as SSE, Sandbox_exports as Sandbox, SandboxError_exports as SandboxError, SandboxImage_exports as SandboxImage, SandboxNetwork_exports as SandboxNetwork, SpeechSynthesizer_exports as SpeechSynthesizer, StructuredFormat_exports as StructuredFormat, Tool_exports as Tool, ToolEvent_exports as ToolEvent, ToolResult_exports as ToolResult, Toolkit_exports as Toolkit, Transcriber_exports as Transcriber, Transcript_exports as Transcript, Turn_exports as Turn, Vector_exports as Vector, WebSearch_exports as WebSearch, WebSearchTool_exports as WebSearchTool };
42
+ import { t as Telemetry_exports } from "./observability/Telemetry.mjs";
43
+ export { AiError_exports as AiError, Approval_exports as Approval, Audio_exports as Audio, Browser_exports as Browser, BrowserError_exports as BrowserError, BrowserTool_exports as BrowserTool, Capabilities_exports as Capabilities, Embedding_exports as Embedding, EmbeddingModel_exports as EmbeddingModel, HistoryCheck_exports as HistoryCheck, Image_exports as Image, Items_exports as Items, JSONL_exports as JSONL, LanguageModel_exports as LanguageModel, Lines_exports as Lines, Loop_exports as Loop, Media_exports as Media, Memory_exports as Memory, Metrics_exports as Metrics, Music_exports as Music, MusicGenerator_exports as MusicGenerator, Retry_exports as Retry, SSE_exports as SSE, Sandbox_exports as Sandbox, SandboxError_exports as SandboxError, SandboxImage_exports as SandboxImage, SandboxNetwork_exports as SandboxNetwork, SpeechSynthesizer_exports as SpeechSynthesizer, StructuredFormat_exports as StructuredFormat, Telemetry_exports as Telemetry, Tool_exports as Tool, ToolEvent_exports as ToolEvent, ToolResult_exports as ToolResult, Toolkit_exports as Toolkit, Transcriber_exports as Transcriber, Transcript_exports as Transcript, Turn_exports as Turn, Vector_exports as Vector, WebRead_exports as WebRead, WebReadTool_exports as WebReadTool, WebSearch_exports as WebSearch, WebSearchTool_exports as WebSearchTool };
@@ -1,8 +1,8 @@
1
- import { t as AiError } from "../AiError-CAX_48RU.mjs";
2
- import { o as HistoryItem } from "../Items-7ljaVxH_.mjs";
3
- import { i as StructuredFormat } from "../StructuredFormat-BbN4dosH.mjs";
1
+ import { o as HistoryItem } from "../Items-BnIduEV2.mjs";
2
+ import { t as AiError } from "../AiError-Bf1pq4BB.mjs";
3
+ import { i as StructuredFormat } from "../StructuredFormat-DHaUJBdd.mjs";
4
4
  import { Turn, TurnEvent } from "../domain/Turn.mjs";
5
- import { o as ToolDescriptor } from "../Tool-BKiieFXk.mjs";
5
+ import { o as Toolkit } from "../Toolkit-Dr9l_hNy.mjs";
6
6
  import { Context, Effect, Stream } from "effect";
7
7
 
8
8
  //#region src/language-model/LanguageModel.d.ts
@@ -22,7 +22,12 @@ type CommonRequest = {
22
22
  * so code that yields a typed provider tag gets autocompletion.
23
23
  */
24
24
  readonly model: string;
25
- readonly tools?: ReadonlyArray<ToolDescriptor>;
25
+ /**
26
+ * The model-visible tools for this request, as a `Toolkit`. The provider
27
+ * renders it to wire descriptors (`Tool.descriptorsOf`); omit it for a turn
28
+ * with no tools.
29
+ */
30
+ readonly tools?: Toolkit;
26
31
  readonly toolChoice?: "auto" | "required" | "none" | {
27
32
  readonly type: "function";
28
33
  readonly name: string;
@@ -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;EAAA,SACA,KAAA,GAAQ,aAAA,CAAc,cAAA;EAAA,SACtB,UAAA;IAAA,SAIM,IAAA;IAAA,SAA2B,IAAA;EAAA;EAAA,SACjC,WAAA;EAAA,SACA,IAAA;EAAA,SACA,eAAA;EAdA;;;;;;EAAA,SAqBA,UAAA,GAAa,gBAAA;AAAA;AAAA,KAGZ,oBAAA;EAAA,SACD,UAAA,GAAa,OAAA,EAAS,aAAA,KAAkB,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,OAAA;EAbjE;;;;;;;;AAYX;EAZW,SAuBA,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,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 +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 { ToolDescriptor } from \"../tool/Tool.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 readonly tools?: ReadonlyArray<ToolDescriptor>\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.asEffect(), (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.asEffect(), (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":";;;;;;;;;;;AAoDA,IAAa,gBAAb,cAAmC,QAAQ,SAA8C,CACvF,qCACD,CAAC;;;;AAKF,MAAa,cACX,YAEA,OAAO,OAAO,OAAO,IAAI,cAAc,UAAU,GAAG,MAAM,EAAE,WAAW,QAAQ,CAAC,CAAC;;;;;;;AAQnF,MAAa,QAAQ,YACnB,OAAO,QAAQ,cAAc,UAAU,GAAG,MAAM,EAAE,KAAK,QAAQ,CAAC;;;;;;;AAQlE,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.asEffect(), (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.asEffect(), (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,cAAc,UAAU,GAAG,MAAM,EAAE,WAAW,QAAQ,CAAC,CAAC;;;;;;;AAQnF,MAAa,QAAQ,YACnB,OAAO,QAAQ,cAAc,UAAU,GAAG,MAAM,EAAE,KAAK,QAAQ,CAAC;;;;;;;AAQlE,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"}
@@ -2,7 +2,7 @@ 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 { i as it, n as globalExpect, r as describe } from "../dist-DV5ISja1.mjs";
5
+ import { a as describe, n as globalExpect, o as it } from "../dist-B04dlFHg.mjs";
6
6
  import { layer } from "../testing/MockProvider.mjs";
7
7
  import { Cause, Effect, Exit, Layer, Option, Stream } from "effect";
8
8
  //#region src/language-model/LanguageModel.test.ts