@effect/ai 0.26.0 → 0.27.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 (188) hide show
  1. package/Chat/package.json +6 -0
  2. package/EmbeddingModel/package.json +6 -0
  3. package/IdGenerator/package.json +6 -0
  4. package/LanguageModel/package.json +6 -0
  5. package/Model/package.json +6 -0
  6. package/Prompt/package.json +6 -0
  7. package/Response/package.json +6 -0
  8. package/Telemetry/package.json +6 -0
  9. package/Tool/package.json +6 -0
  10. package/Toolkit/package.json +6 -0
  11. package/dist/cjs/AiError.js +575 -11
  12. package/dist/cjs/AiError.js.map +1 -1
  13. package/dist/cjs/Chat.js +302 -0
  14. package/dist/cjs/Chat.js.map +1 -0
  15. package/dist/cjs/EmbeddingModel.js +184 -0
  16. package/dist/cjs/EmbeddingModel.js.map +1 -0
  17. package/dist/cjs/IdGenerator.js +255 -0
  18. package/dist/cjs/IdGenerator.js.map +1 -0
  19. package/dist/cjs/LanguageModel.js +584 -0
  20. package/dist/cjs/LanguageModel.js.map +1 -0
  21. package/dist/cjs/McpServer.js +12 -4
  22. package/dist/cjs/McpServer.js.map +1 -1
  23. package/dist/cjs/Model.js +118 -0
  24. package/dist/cjs/Model.js.map +1 -0
  25. package/dist/cjs/Prompt.js +649 -0
  26. package/dist/cjs/Prompt.js.map +1 -0
  27. package/dist/cjs/Response.js +635 -0
  28. package/dist/cjs/Response.js.map +1 -0
  29. package/dist/cjs/Telemetry.js +176 -0
  30. package/dist/cjs/Telemetry.js.map +1 -0
  31. package/dist/cjs/Tokenizer.js +87 -8
  32. package/dist/cjs/Tokenizer.js.map +1 -1
  33. package/dist/cjs/Tool.js +556 -0
  34. package/dist/cjs/Tool.js.map +1 -0
  35. package/dist/cjs/Toolkit.js +279 -0
  36. package/dist/cjs/Toolkit.js.map +1 -0
  37. package/dist/cjs/index.js +21 -19
  38. package/dist/dts/AiError.d.ts +577 -9
  39. package/dist/dts/AiError.d.ts.map +1 -1
  40. package/dist/dts/Chat.d.ts +356 -0
  41. package/dist/dts/Chat.d.ts.map +1 -0
  42. package/dist/dts/EmbeddingModel.d.ts +153 -0
  43. package/dist/dts/EmbeddingModel.d.ts.map +1 -0
  44. package/dist/dts/IdGenerator.d.ts +272 -0
  45. package/dist/dts/IdGenerator.d.ts.map +1 -0
  46. package/dist/dts/LanguageModel.d.ts +458 -0
  47. package/dist/dts/LanguageModel.d.ts.map +1 -0
  48. package/dist/dts/McpSchema.d.ts +25 -25
  49. package/dist/dts/McpServer.d.ts +6 -4
  50. package/dist/dts/McpServer.d.ts.map +1 -1
  51. package/dist/dts/Model.d.ts +124 -0
  52. package/dist/dts/Model.d.ts.map +1 -0
  53. package/dist/dts/Prompt.d.ts +1119 -0
  54. package/dist/dts/Prompt.d.ts.map +1 -0
  55. package/dist/dts/Response.d.ts +1519 -0
  56. package/dist/dts/Response.d.ts.map +1 -0
  57. package/dist/dts/Telemetry.d.ts +520 -0
  58. package/dist/dts/Telemetry.d.ts.map +1 -0
  59. package/dist/dts/Tokenizer.d.ts +131 -13
  60. package/dist/dts/Tokenizer.d.ts.map +1 -1
  61. package/dist/dts/Tool.d.ts +876 -0
  62. package/dist/dts/Tool.d.ts.map +1 -0
  63. package/dist/dts/Toolkit.d.ts +310 -0
  64. package/dist/dts/Toolkit.d.ts.map +1 -0
  65. package/dist/dts/index.d.ts +498 -13
  66. package/dist/dts/index.d.ts.map +1 -1
  67. package/dist/esm/AiError.js +570 -10
  68. package/dist/esm/AiError.js.map +1 -1
  69. package/dist/esm/Chat.js +291 -0
  70. package/dist/esm/Chat.js.map +1 -0
  71. package/dist/esm/EmbeddingModel.js +173 -0
  72. package/dist/esm/EmbeddingModel.js.map +1 -0
  73. package/dist/esm/IdGenerator.js +245 -0
  74. package/dist/esm/IdGenerator.js.map +1 -0
  75. package/dist/esm/LanguageModel.js +572 -0
  76. package/dist/esm/LanguageModel.js.map +1 -0
  77. package/dist/esm/McpServer.js +12 -4
  78. package/dist/esm/McpServer.js.map +1 -1
  79. package/dist/esm/Model.js +108 -0
  80. package/dist/esm/Model.js.map +1 -0
  81. package/dist/esm/Prompt.js +633 -0
  82. package/dist/esm/Prompt.js.map +1 -0
  83. package/dist/esm/Response.js +619 -0
  84. package/dist/esm/Response.js.map +1 -0
  85. package/dist/esm/Telemetry.js +166 -0
  86. package/dist/esm/Telemetry.js.map +1 -0
  87. package/dist/esm/Tokenizer.js +87 -8
  88. package/dist/esm/Tokenizer.js.map +1 -1
  89. package/dist/esm/Tool.js +534 -0
  90. package/dist/esm/Tool.js.map +1 -0
  91. package/dist/esm/Toolkit.js +269 -0
  92. package/dist/esm/Toolkit.js.map +1 -0
  93. package/dist/esm/index.js +498 -13
  94. package/dist/esm/index.js.map +1 -1
  95. package/package.json +76 -68
  96. package/src/AiError.ts +739 -9
  97. package/src/Chat.ts +546 -0
  98. package/src/EmbeddingModel.ts +311 -0
  99. package/src/IdGenerator.ts +320 -0
  100. package/src/LanguageModel.ts +1074 -0
  101. package/src/McpServer.ts +337 -194
  102. package/src/Model.ts +155 -0
  103. package/src/Prompt.ts +1616 -0
  104. package/src/Response.ts +2131 -0
  105. package/src/Telemetry.ts +655 -0
  106. package/src/Tokenizer.ts +145 -24
  107. package/src/Tool.ts +1267 -0
  108. package/src/Toolkit.ts +516 -0
  109. package/src/index.ts +499 -13
  110. package/AiChat/package.json +0 -6
  111. package/AiEmbeddingModel/package.json +0 -6
  112. package/AiInput/package.json +0 -6
  113. package/AiLanguageModel/package.json +0 -6
  114. package/AiModel/package.json +0 -6
  115. package/AiResponse/package.json +0 -6
  116. package/AiTelemetry/package.json +0 -6
  117. package/AiTool/package.json +0 -6
  118. package/AiToolkit/package.json +0 -6
  119. package/dist/cjs/AiChat.js +0 -122
  120. package/dist/cjs/AiChat.js.map +0 -1
  121. package/dist/cjs/AiEmbeddingModel.js +0 -109
  122. package/dist/cjs/AiEmbeddingModel.js.map +0 -1
  123. package/dist/cjs/AiInput.js +0 -458
  124. package/dist/cjs/AiInput.js.map +0 -1
  125. package/dist/cjs/AiLanguageModel.js +0 -351
  126. package/dist/cjs/AiLanguageModel.js.map +0 -1
  127. package/dist/cjs/AiModel.js +0 -37
  128. package/dist/cjs/AiModel.js.map +0 -1
  129. package/dist/cjs/AiResponse.js +0 -681
  130. package/dist/cjs/AiResponse.js.map +0 -1
  131. package/dist/cjs/AiTelemetry.js +0 -58
  132. package/dist/cjs/AiTelemetry.js.map +0 -1
  133. package/dist/cjs/AiTool.js +0 -150
  134. package/dist/cjs/AiTool.js.map +0 -1
  135. package/dist/cjs/AiToolkit.js +0 -157
  136. package/dist/cjs/AiToolkit.js.map +0 -1
  137. package/dist/cjs/internal/common.js +0 -21
  138. package/dist/cjs/internal/common.js.map +0 -1
  139. package/dist/dts/AiChat.d.ts +0 -101
  140. package/dist/dts/AiChat.d.ts.map +0 -1
  141. package/dist/dts/AiEmbeddingModel.d.ts +0 -65
  142. package/dist/dts/AiEmbeddingModel.d.ts.map +0 -1
  143. package/dist/dts/AiInput.d.ts +0 -590
  144. package/dist/dts/AiInput.d.ts.map +0 -1
  145. package/dist/dts/AiLanguageModel.d.ts +0 -302
  146. package/dist/dts/AiLanguageModel.d.ts.map +0 -1
  147. package/dist/dts/AiModel.d.ts +0 -25
  148. package/dist/dts/AiModel.d.ts.map +0 -1
  149. package/dist/dts/AiResponse.d.ts +0 -863
  150. package/dist/dts/AiResponse.d.ts.map +0 -1
  151. package/dist/dts/AiTelemetry.d.ts +0 -242
  152. package/dist/dts/AiTelemetry.d.ts.map +0 -1
  153. package/dist/dts/AiTool.d.ts +0 -334
  154. package/dist/dts/AiTool.d.ts.map +0 -1
  155. package/dist/dts/AiToolkit.d.ts +0 -96
  156. package/dist/dts/AiToolkit.d.ts.map +0 -1
  157. package/dist/dts/internal/common.d.ts +0 -2
  158. package/dist/dts/internal/common.d.ts.map +0 -1
  159. package/dist/esm/AiChat.js +0 -111
  160. package/dist/esm/AiChat.js.map +0 -1
  161. package/dist/esm/AiEmbeddingModel.js +0 -98
  162. package/dist/esm/AiEmbeddingModel.js.map +0 -1
  163. package/dist/esm/AiInput.js +0 -433
  164. package/dist/esm/AiInput.js.map +0 -1
  165. package/dist/esm/AiLanguageModel.js +0 -340
  166. package/dist/esm/AiLanguageModel.js.map +0 -1
  167. package/dist/esm/AiModel.js +0 -29
  168. package/dist/esm/AiModel.js.map +0 -1
  169. package/dist/esm/AiResponse.js +0 -657
  170. package/dist/esm/AiResponse.js.map +0 -1
  171. package/dist/esm/AiTelemetry.js +0 -48
  172. package/dist/esm/AiTelemetry.js.map +0 -1
  173. package/dist/esm/AiTool.js +0 -134
  174. package/dist/esm/AiTool.js.map +0 -1
  175. package/dist/esm/AiToolkit.js +0 -147
  176. package/dist/esm/AiToolkit.js.map +0 -1
  177. package/dist/esm/internal/common.js +0 -14
  178. package/dist/esm/internal/common.js.map +0 -1
  179. package/src/AiChat.ts +0 -251
  180. package/src/AiEmbeddingModel.ts +0 -169
  181. package/src/AiInput.ts +0 -602
  182. package/src/AiLanguageModel.ts +0 -685
  183. package/src/AiModel.ts +0 -53
  184. package/src/AiResponse.ts +0 -986
  185. package/src/AiTelemetry.ts +0 -333
  186. package/src/AiTool.ts +0 -579
  187. package/src/AiToolkit.ts +0 -265
  188. package/src/internal/common.ts +0 -12
@@ -1,29 +1,527 @@
1
+ import * as Predicate from "effect/Predicate";
2
+ import * as Schema from "effect/Schema";
1
3
  /**
4
+ * Unique identifier for AI errors.
5
+ *
2
6
  * @since 1.0.0
7
+ * @category Type Ids
3
8
  */
4
- import * as Predicate from "effect/Predicate";
5
- import * as Schema from "effect/Schema";
9
+ export const TypeId = "~@effect/ai/AiError";
10
+ /**
11
+ * Type guard to check if a value is an AI error.
12
+ *
13
+ * @param u - The value to check
14
+ * @returns `true` if the value is an `AiError`, `false` otherwise
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * import { AiError } from "@effect/ai"
19
+ *
20
+ * const someError = new Error("generic error")
21
+ * const aiError = new AiError.UnknownError({
22
+ * module: "Test",
23
+ * method: "example"
24
+ * })
25
+ *
26
+ * console.log(AiError.isAiError(someError)) // false
27
+ * console.log(AiError.isAiError(aiError)) // true
28
+ * ```
29
+ *
30
+ * @since 1.0.0
31
+ * @category Guards
32
+ */
33
+ export const isAiError = u => Predicate.hasProperty(u, TypeId);
34
+ // =============================================================================
35
+ // Http Request Error
36
+ // =============================================================================
37
+ /**
38
+ * Schema for HTTP request details used in error reporting.
39
+ *
40
+ * Captures comprehensive information about HTTP requests that failed,
41
+ * enabling detailed error analysis and debugging.
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * import { AiError } from "@effect/ai"
46
+ * import { Option } from "effect"
47
+ *
48
+ * const requestDetails: typeof AiError.HttpRequestDetails.Type = {
49
+ * method: "POST",
50
+ * url: "https://api.openai.com/v1/completions",
51
+ * urlParams: [["model", "gpt-4"], ["stream", "false"]],
52
+ * hash: Option.some("#section1"),
53
+ * headers: {
54
+ * "Content-Type": "application/json",
55
+ * "Authorization": "Bearer sk-..."
56
+ * }
57
+ * }
58
+ * ```
59
+ *
60
+ * @since 1.0.0
61
+ * @category Schemas
62
+ */
63
+ export const HttpRequestDetails = /*#__PURE__*/Schema.Struct({
64
+ method: Schema.Literal("GET", "POST", "PATCH", "PUT", "DELETE", "HEAD", "OPTIONS"),
65
+ url: Schema.String,
66
+ urlParams: Schema.Array(Schema.Tuple(Schema.String, Schema.String)),
67
+ hash: Schema.Option(Schema.String),
68
+ headers: Schema.Record({
69
+ key: Schema.String,
70
+ value: Schema.String
71
+ })
72
+ }).annotations({
73
+ identifier: "HttpRequestDetails"
74
+ });
75
+ /**
76
+ * Error that occurs during HTTP request processing.
77
+ *
78
+ * This error is raised when issues arise before receiving an HTTP response,
79
+ * such as network connectivity problems, request encoding issues, or invalid
80
+ * URLs.
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * import { AiError } from "@effect/ai"
85
+ * import { Effect } from "effect"
86
+ *
87
+ * const handleNetworkError = Effect.gen(function* () {
88
+ * const error = new AiError.HttpRequestError({
89
+ * module: "OpenAI",
90
+ * method: "createCompletion",
91
+ * reason: "Transport",
92
+ * request: {
93
+ * method: "POST",
94
+ * url: "https://api.openai.com/v1/completions",
95
+ * urlParams: [],
96
+ * hash: Option.none(),
97
+ * headers: { "Content-Type": "application/json" }
98
+ * },
99
+ * description: "Connection timeout after 30 seconds"
100
+ * })
101
+ *
102
+ * console.log(error.message)
103
+ * // "Transport: Connection timeout after 30 seconds (POST https://api.openai.com/v1/completions)"
104
+ * })
105
+ * ```
106
+ *
107
+ * @since 1.0.0
108
+ * @category Errors
109
+ */
110
+ export class HttpRequestError extends /*#__PURE__*/Schema.TaggedError("@effect/ai/AiError/HttpRequestError")("HttpRequestError", {
111
+ module: Schema.String,
112
+ method: Schema.String,
113
+ reason: /*#__PURE__*/Schema.Literal("Transport", "Encode", "InvalidUrl"),
114
+ request: HttpRequestDetails,
115
+ description: /*#__PURE__*/Schema.optional(Schema.String),
116
+ cause: /*#__PURE__*/Schema.optional(Schema.Defect)
117
+ }) {
118
+ /**
119
+ * @since 1.0.0
120
+ */
121
+ [TypeId] = TypeId;
122
+ /**
123
+ * Creates an HttpRequestError from a platform HttpClientError.RequestError.
124
+ *
125
+ * @example
126
+ * ```ts
127
+ * import { AiError } from "@effect/ai"
128
+ * import { HttpClientError } from "@effect/platform"
129
+ * import { Option } from "effect"
130
+ *
131
+ * declare const platformError: HttpClientError.RequestError
132
+ *
133
+ * const aiError = AiError.HttpRequestError.fromRequestError({
134
+ * module: "ChatGPT",
135
+ * method: "sendMessage",
136
+ * error: platformError
137
+ * })
138
+ * ```
139
+ *
140
+ * @since 1.0.0
141
+ * @category Constructors
142
+ */
143
+ static fromRequestError({
144
+ error,
145
+ ...params
146
+ }) {
147
+ return new HttpRequestError({
148
+ ...params,
149
+ cause: error,
150
+ description: error.description,
151
+ reason: error.reason,
152
+ request: {
153
+ hash: error.request.hash,
154
+ headers: error.request.headers,
155
+ method: error.request.method,
156
+ url: error.request.url,
157
+ urlParams: error.request.urlParams
158
+ }
159
+ });
160
+ }
161
+ get message() {
162
+ const methodAndUrl = `${this.request.method} ${this.request.url}`;
163
+ let baseMessage = this.description ? `${this.reason}: ${this.description}` : `${this.reason}: An HTTP request error occurred.`;
164
+ baseMessage += ` (${methodAndUrl})`;
165
+ let suggestion = "";
166
+ switch (this.reason) {
167
+ case "Encode":
168
+ {
169
+ suggestion += "Check that the request body data is properly formatted and matches the expected content type.";
170
+ break;
171
+ }
172
+ case "InvalidUrl":
173
+ {
174
+ suggestion += "Verify that the URL format is correct and that all required parameters have been provided.";
175
+ suggestion += " Check for any special characters that may need encoding.";
176
+ break;
177
+ }
178
+ case "Transport":
179
+ {
180
+ suggestion += "Check your network connection and verify that the requested URL is accessible.";
181
+ break;
182
+ }
183
+ }
184
+ baseMessage += `\n\nSuggestion: ${suggestion}`;
185
+ return baseMessage;
186
+ }
187
+ }
188
+ // =============================================================================
189
+ // Http Response Error
190
+ // =============================================================================
191
+ /**
192
+ * Schema for HTTP response details used in error reporting.
193
+ *
194
+ * Captures essential information about HTTP responses that caused errors,
195
+ * including status codes and headers for debugging purposes.
196
+ *
197
+ * @example
198
+ * ```ts
199
+ * import { AiError } from "@effect/ai"
200
+ *
201
+ * const responseDetails: typeof AiError.HttpResponseDetails.Type = {
202
+ * status: 429,
203
+ * headers: {
204
+ * "Content-Type": "application/json",
205
+ * "X-RateLimit-Remaining": "0",
206
+ * "Retry-After": "60"
207
+ * }
208
+ * }
209
+ * ```
210
+ *
211
+ * @since 1.0.0
212
+ * @category Schemas
213
+ */
214
+ export const HttpResponseDetails = /*#__PURE__*/Schema.Struct({
215
+ status: Schema.Number,
216
+ headers: Schema.Record({
217
+ key: Schema.String,
218
+ value: Schema.String
219
+ })
220
+ }).annotations({
221
+ identifier: "HttpResponseDetails"
222
+ });
223
+ /**
224
+ * Error that occurs during HTTP response processing.
225
+ *
226
+ * This error is thrown when issues arise after receiving an HTTP response,
227
+ * such as unexpected status codes, response decoding failures, or empty
228
+ * response bodies.
229
+ *
230
+ * @example
231
+ * ```ts
232
+ * import { AiError } from "@effect/ai"
233
+ * import { Option } from "effect"
234
+ *
235
+ * const responseError = new AiError.HttpResponseError({
236
+ * module: "OpenAI",
237
+ * method: "createCompletion",
238
+ * reason: "StatusCode",
239
+ * request: {
240
+ * method: "POST",
241
+ * url: "https://api.openai.com/v1/completions",
242
+ * urlParams: [],
243
+ * hash: Option.none(),
244
+ * headers: { "Authorization": "Bearer sk-..." }
245
+ * },
246
+ * response: {
247
+ * status: 429,
248
+ * headers: { "X-RateLimit-Remaining": "0" }
249
+ * },
250
+ * description: "Rate limit exceeded"
251
+ * })
252
+ *
253
+ * console.log(responseError.message)
254
+ * // "StatusCode: Rate limit exceeded (429 POST https://api.openai.com/v1/completions)"
255
+ * ```
256
+ *
257
+ * @since 1.0.0
258
+ * @category Errors
259
+ */
260
+ export class HttpResponseError extends /*#__PURE__*/Schema.TaggedError("@effect/ai/AiError/HttpResponseError")("HttpResponseError", {
261
+ module: Schema.String,
262
+ method: Schema.String,
263
+ request: HttpRequestDetails,
264
+ response: HttpResponseDetails,
265
+ reason: /*#__PURE__*/Schema.Literal("StatusCode", "Decode", "EmptyBody"),
266
+ description: /*#__PURE__*/Schema.optional(Schema.String),
267
+ cause: /*#__PURE__*/Schema.optional(Schema.Defect)
268
+ }) {
269
+ /**
270
+ * @since 1.0.0
271
+ */
272
+ [TypeId] = TypeId;
273
+ /**
274
+ * Creates an HttpResponseError from a platform HttpClientError.ResponseError.
275
+ *
276
+ * @example
277
+ * ```ts
278
+ * import { AiError } from "@effect/ai"
279
+ * import { Headers, HttpClientError } from "@effect/platform"
280
+ * import { Option } from "effect"
281
+ *
282
+ * declare const platformError: HttpClientError.ResponseError
283
+ *
284
+ * const aiError = AiError.HttpResponseError.fromResponseError({
285
+ * module: "OpenAI",
286
+ * method: "completion",
287
+ * error: platformError
288
+ * })
289
+ * ```
290
+ *
291
+ * @since 1.0.0
292
+ * @category Constructors
293
+ */
294
+ static fromResponseError({
295
+ error,
296
+ ...params
297
+ }) {
298
+ return new HttpResponseError({
299
+ ...params,
300
+ cause: error,
301
+ description: error.description,
302
+ reason: error.reason,
303
+ request: {
304
+ hash: error.request.hash,
305
+ headers: error.request.headers,
306
+ method: error.request.method,
307
+ url: error.request.url,
308
+ urlParams: error.request.urlParams
309
+ },
310
+ response: {
311
+ headers: error.response.headers,
312
+ status: error.response.status
313
+ }
314
+ });
315
+ }
316
+ get message() {
317
+ const methodUrlStatus = `${this.response.status} ${this.request.method} ${this.request.url}`;
318
+ let baseMessage = this.description ? `${this.reason}: ${this.description}` : `${this.reason}: An HTTP response error occurred.`;
319
+ baseMessage += ` (${methodUrlStatus})`;
320
+ let suggestion = "";
321
+ switch (this.reason) {
322
+ case "Decode":
323
+ {
324
+ suggestion += "The response format does not match what is expected. " + "Verify API version compatibility, check response content-type, " + "and/or examine if the endpoint schema has changed.";
325
+ break;
326
+ }
327
+ case "EmptyBody":
328
+ {
329
+ suggestion += "The response body was empty. This may indicate a server " + "issue, API version mismatch, or the endpoint may have changed its response format.";
330
+ break;
331
+ }
332
+ case "StatusCode":
333
+ {
334
+ suggestion += getStatusCodeSuggestion(this.response.status);
335
+ break;
336
+ }
337
+ }
338
+ baseMessage += `\n\nSuggestion: ${suggestion}`;
339
+ return baseMessage;
340
+ }
341
+ }
342
+ // =============================================================================
343
+ // Malformed Input Error
344
+ // =============================================================================
6
345
  /**
346
+ * Error thrown when input data doesn't match the expected format or schema.
347
+ *
348
+ * This error occurs when the data provided to an AI operation fails validation,
349
+ * is missing required fields, or doesn't conform to the expected structure.
350
+ *
351
+ * @example
352
+ * ```ts
353
+ * import { AiError } from "@effect/ai"
354
+ * import { Effect } from "effect"
355
+ *
356
+ * const validateInput = (data: unknown) =>
357
+ * typeof data === "string" && data.length > 0
358
+ * ? Effect.succeed(data)
359
+ * : Effect.fail(new AiError.MalformedInput({
360
+ * module: "ChatBot",
361
+ * method: "processMessage",
362
+ * description: "Input must be a non-empty string"
363
+ * }))
364
+ *
365
+ * const program = validateInput("").pipe(
366
+ * Effect.catchTag("MalformedInput", (error) => {
367
+ * console.log(`Input validation failed: ${error.description}`)
368
+ * return Effect.succeed("Please provide a valid message")
369
+ * })
370
+ * )
371
+ * ```
372
+ *
7
373
  * @since 1.0.0
8
- * @category type ids
374
+ * @category Errors
9
375
  */
10
- export const TypeId = /*#__PURE__*/Symbol.for("@effect/ai/AiError");
376
+ export class MalformedInput extends /*#__PURE__*/Schema.TaggedError("@effect/ai/AiError/MalformedInput")("MalformedInput", {
377
+ module: Schema.String,
378
+ method: Schema.String,
379
+ description: /*#__PURE__*/Schema.optional(Schema.String),
380
+ cause: /*#__PURE__*/Schema.optional(Schema.Defect)
381
+ }) {
382
+ /**
383
+ * @since 1.0.0
384
+ */
385
+ [TypeId] = TypeId;
386
+ }
387
+ // =============================================================================
388
+ // Malformed Output Error
389
+ // =============================================================================
11
390
  /**
391
+ * Error thrown when output data can't be parsed or validated.
392
+ *
393
+ * This error occurs when AI service responses don't match the expected format,
394
+ * contain invalid data structures, or fail schema validation during parsing.
395
+ *
396
+ * @example
397
+ * ```ts
398
+ * import { AiError } from "@effect/ai"
399
+ * import { Effect, Schema } from "effect"
400
+ *
401
+ * const ResponseSchema = Schema.Struct({
402
+ * message: Schema.String,
403
+ * tokens: Schema.Number
404
+ * })
405
+ *
406
+ * const parseResponse = (data: unknown) =>
407
+ * Schema.decodeUnknown(ResponseSchema)(data).pipe(
408
+ * Effect.mapError(parseError =>
409
+ * new AiError.MalformedOutput({
410
+ * module: "OpenAI",
411
+ * method: "completion",
412
+ * description: "Response doesn't match expected schema",
413
+ * cause: parseError
414
+ * })
415
+ * )
416
+ * )
417
+ *
418
+ * const program = parseResponse({ invalid: "data" }).pipe(
419
+ * Effect.catchTag("MalformedOutput", (error) => {
420
+ * console.log(`Parsing failed: ${error.description}`)
421
+ * return Effect.succeed({ message: "Error", tokens: 0 })
422
+ * })
423
+ * )
424
+ * ```
425
+ *
12
426
  * @since 1.0.0
13
- * @category errors
427
+ * @category Errors
14
428
  */
15
- export class AiError extends /*#__PURE__*/Schema.TaggedError("@effect/ai/AiError")("AiError", {
429
+ export class MalformedOutput extends /*#__PURE__*/Schema.TaggedError("@effect/ai/AiError/MalformedOutput")("MalformedOutput", {
16
430
  module: Schema.String,
17
431
  method: Schema.String,
18
- description: Schema.String,
432
+ description: /*#__PURE__*/Schema.optional(Schema.String),
19
433
  cause: /*#__PURE__*/Schema.optional(Schema.Defect)
20
434
  }) {
21
435
  /**
22
436
  * @since 1.0.0
23
437
  */
24
- static is(u) {
25
- return Predicate.hasProperty(u, TypeId);
438
+ [TypeId] = TypeId;
439
+ /**
440
+ * Creates a MalformedOutput error from a Schema ParseError.
441
+ *
442
+ * @example
443
+ * ```ts
444
+ * import { AiError } from "@effect/ai"
445
+ * import { Effect, Schema } from "effect"
446
+ *
447
+ * const UserSchema = Schema.Struct({
448
+ * name: Schema.String,
449
+ * age: Schema.Number
450
+ * })
451
+ *
452
+ * const parseUser = (data: unknown) =>
453
+ * Schema.decodeUnknown(UserSchema)(data).pipe(
454
+ * Effect.mapError((parseError) =>
455
+ * AiError.MalformedOutput.fromParseError({
456
+ * module: "UserService",
457
+ * method: "parseUserData",
458
+ * error: parseError
459
+ * })
460
+ * )
461
+ * )
462
+ * ```
463
+ *
464
+ * @since 1.0.0
465
+ * @category Constructors
466
+ */
467
+ static fromParseError({
468
+ error,
469
+ ...params
470
+ }) {
471
+ // TODO(Max): enhance
472
+ return new MalformedOutput({
473
+ ...params,
474
+ cause: error
475
+ });
26
476
  }
477
+ }
478
+ // =============================================================================
479
+ // Unknown Error
480
+ // =============================================================================
481
+ /**
482
+ * Catch-all error for unexpected runtime errors in AI operations.
483
+ *
484
+ * This error is used when an unexpected exception occurs that doesn't fit
485
+ * into the other specific error categories. It provides context about where
486
+ * the error occurred and preserves the original cause for debugging.
487
+ *
488
+ * @example
489
+ * ```ts
490
+ * import { AiError } from "@effect/ai"
491
+ * import { Effect } from "effect"
492
+ *
493
+ * const riskyOperation = () => {
494
+ * try {
495
+ * // Some operation that might throw
496
+ * throw new Error("Unexpected network issue")
497
+ * } catch (cause) {
498
+ * return Effect.fail(new AiError.UnknownError({
499
+ * module: "ChatService",
500
+ * method: "sendMessage",
501
+ * description: "An unexpected error occurred during message processing",
502
+ * cause
503
+ * }))
504
+ * }
505
+ * }
506
+ *
507
+ * const program = riskyOperation().pipe(
508
+ * Effect.catchTag("UnknownError", (error) => {
509
+ * console.log(error.message)
510
+ * // "ChatService.sendMessage: An unexpected error occurred during message processing"
511
+ * return Effect.succeed("Service temporarily unavailable")
512
+ * })
513
+ * )
514
+ * ```
515
+ *
516
+ * @since 1.0.0
517
+ * @category Errors
518
+ */
519
+ export class UnknownError extends /*#__PURE__*/Schema.TaggedError("@effect/ai/UnknownError")("UnknownError", {
520
+ module: Schema.String,
521
+ method: Schema.String,
522
+ description: /*#__PURE__*/Schema.optional(Schema.String),
523
+ cause: /*#__PURE__*/Schema.optional(Schema.Defect)
524
+ }) {
27
525
  /**
28
526
  * @since 1.0.0
29
527
  */
@@ -32,7 +530,69 @@ export class AiError extends /*#__PURE__*/Schema.TaggedError("@effect/ai/AiError
32
530
  * @since 1.0.0
33
531
  */
34
532
  get message() {
35
- return `${this.module}.${this.method}: ${this.description}`;
533
+ const moduleMethod = `${this.module}.${this.method}`;
534
+ return Predicate.isUndefined(this.description) ? `${moduleMethod}: An error occurred` : `${moduleMethod}: ${this.description}`;
36
535
  }
37
536
  }
537
+ /**
538
+ * Schema for validating and parsing AI errors.
539
+ *
540
+ * This schema can be used to decode unknown values into properly typed AI
541
+ * errors, ensuring type safety when handling errors from external sources or
542
+ * serialized data.
543
+ *
544
+ * @example
545
+ * ```ts
546
+ * import { AiError } from "@effect/ai"
547
+ * import { Schema, Effect } from "effect"
548
+ *
549
+ * const parseAiError = (data: unknown) =>
550
+ * Schema.decodeUnknown(AiError.AiError)(data).pipe(
551
+ * Effect.map(error => {
552
+ * console.log(`Parsed AI error: ${error._tag}`)
553
+ * return error
554
+ * }),
555
+ * Effect.catchAll(() =>
556
+ * Effect.succeed(new AiError.UnknownError({
557
+ * module: "Parser",
558
+ * method: "parseAiError",
559
+ * description: "Failed to parse error data"
560
+ * }))
561
+ * )
562
+ * )
563
+ * ```
564
+ *
565
+ * @since 1.0.0
566
+ * @category Schemas
567
+ */
568
+ export const AiError = /*#__PURE__*/Schema.Union(HttpRequestError, HttpResponseError, MalformedInput, MalformedOutput, UnknownError);
569
+ // =============================================================================
570
+ // Utilities
571
+ // =============================================================================
572
+ const getStatusCodeSuggestion = statusCode => {
573
+ if (statusCode >= 400 && statusCode < 500) {
574
+ switch (statusCode) {
575
+ case 400:
576
+ return "Bad Request - Check request parameters, headers, and body format against API documentation.";
577
+ case 401:
578
+ return "Unauthorized - Verify API key, authentication credentials, or token expiration.";
579
+ case 403:
580
+ return "Forbidden - Check API permissions, usage limits, or resource access rights.";
581
+ case 404:
582
+ return "Not Found - Verify the endpoint URL, API version, and resource identifiers.";
583
+ case 408:
584
+ return "Request Timeout - Consider increasing timeout duration or implementing retry logic.";
585
+ case 422:
586
+ return "Unprocessable Entity - Check request data validation, required fields, and data formats.";
587
+ case 429:
588
+ return "Rate Limited - Implement exponential backoff or reduce request frequency.";
589
+ default:
590
+ return "Client error - Review request format, parameters, and API documentation.";
591
+ }
592
+ } else if (statusCode >= 500) {
593
+ return "Server error - This is likely temporary. Implement retry logic with exponential backoff.";
594
+ } else {
595
+ return "Check API documentation for this status code.";
596
+ }
597
+ };
38
598
  //# sourceMappingURL=AiError.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AiError.js","names":["Predicate","Schema","TypeId","Symbol","for","AiError","TaggedError","module","String","method","description","cause","optional","Defect","is","u","hasProperty","message"],"sources":["../../src/AiError.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,SAAS,MAAM,kBAAkB;AAC7C,OAAO,KAAKC,MAAM,MAAM,eAAe;AAEvC;;;;AAIA,OAAO,MAAMC,MAAM,gBAAkBC,MAAM,CAACC,GAAG,CAAC,oBAAoB,CAAC;AAQrE;;;;AAIA,OAAM,MAAOC,OAAQ,sBAAQJ,MAAM,CAACK,WAAW,CAAU,oBAAoB,CAAC,CAAC,SAAS,EAAE;EACxFC,MAAM,EAAEN,MAAM,CAACO,MAAM;EACrBC,MAAM,EAAER,MAAM,CAACO,MAAM;EACrBE,WAAW,EAAET,MAAM,CAACO,MAAM;EAC1BG,KAAK,eAAEV,MAAM,CAACW,QAAQ,CAACX,MAAM,CAACY,MAAM;CACrC,CAAC;EACA;;;EAGA,OAAOC,EAAEA,CAACC,CAAU;IAClB,OAAOf,SAAS,CAACgB,WAAW,CAACD,CAAC,EAAEb,MAAM,CAAC;EACzC;EACA;;;EAGS,CAACA,MAAM,IAAYA,MAAM;EAClC;;;EAGA,IAAIe,OAAOA,CAAA;IACT,OAAO,GAAG,IAAI,CAACV,MAAM,IAAI,IAAI,CAACE,MAAM,KAAK,IAAI,CAACC,WAAW,EAAE;EAC7D","ignoreList":[]}
1
+ {"version":3,"file":"AiError.js","names":["Predicate","Schema","TypeId","isAiError","u","hasProperty","HttpRequestDetails","Struct","method","Literal","url","String","urlParams","Array","Tuple","hash","Option","headers","Record","key","value","annotations","identifier","HttpRequestError","TaggedError","module","reason","request","description","optional","cause","Defect","fromRequestError","error","params","message","methodAndUrl","baseMessage","suggestion","HttpResponseDetails","status","Number","HttpResponseError","response","fromResponseError","methodUrlStatus","getStatusCodeSuggestion","MalformedInput","MalformedOutput","fromParseError","UnknownError","moduleMethod","isUndefined","AiError","Union","statusCode"],"sources":["../../src/AiError.ts"],"sourcesContent":[null],"mappings":"AAyEA,OAAO,KAAKA,SAAS,MAAM,kBAAkB;AAC7C,OAAO,KAAKC,MAAM,MAAM,eAAe;AAEvC;;;;;;AAMA,OAAO,MAAMC,MAAM,GAAG,qBAAqB;AAU3C;;;;;;;;;;;;;;;;;;;;;;;AAuBA,OAAO,MAAMC,SAAS,GAAIC,CAAU,IAAmBJ,SAAS,CAACK,WAAW,CAACD,CAAC,EAAEF,MAAM,CAAC;AAEvF;AACA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,OAAO,MAAMI,kBAAkB,gBAAGL,MAAM,CAACM,MAAM,CAAC;EAC9CC,MAAM,EAAEP,MAAM,CAACQ,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC;EAClFC,GAAG,EAAET,MAAM,CAACU,MAAM;EAClBC,SAAS,EAAEX,MAAM,CAACY,KAAK,CAACZ,MAAM,CAACa,KAAK,CAACb,MAAM,CAACU,MAAM,EAAEV,MAAM,CAACU,MAAM,CAAC,CAAC;EACnEI,IAAI,EAAEd,MAAM,CAACe,MAAM,CAACf,MAAM,CAACU,MAAM,CAAC;EAClCM,OAAO,EAAEhB,MAAM,CAACiB,MAAM,CAAC;IAAEC,GAAG,EAAElB,MAAM,CAACU,MAAM;IAAES,KAAK,EAAEnB,MAAM,CAACU;EAAM,CAAE;CACpE,CAAC,CAACU,WAAW,CAAC;EAAEC,UAAU,EAAE;AAAoB,CAAE,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,OAAM,MAAOC,gBAAiB,sBAAQtB,MAAM,CAACuB,WAAW,CACtD,qCAAqC,CACtC,CAAC,kBAAkB,EAAE;EACpBC,MAAM,EAAExB,MAAM,CAACU,MAAM;EACrBH,MAAM,EAAEP,MAAM,CAACU,MAAM;EACrBe,MAAM,eAAEzB,MAAM,CAACQ,OAAO,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC;EAC3DkB,OAAO,EAAErB,kBAAkB;EAC3BsB,WAAW,eAAE3B,MAAM,CAAC4B,QAAQ,CAAC5B,MAAM,CAACU,MAAM,CAAC;EAC3CmB,KAAK,eAAE7B,MAAM,CAAC4B,QAAQ,CAAC5B,MAAM,CAAC8B,MAAM;CACrC,CAAC;EACA;;;EAGS,CAAC7B,MAAM,IAAYA,MAAM;EAElC;;;;;;;;;;;;;;;;;;;;;EAqBA,OAAO8B,gBAAgBA,CAAC;IAAEC,KAAK;IAAE,GAAGC;EAAM,CAIzC;IACC,OAAO,IAAIX,gBAAgB,CAAC;MAC1B,GAAGW,MAAM;MACTJ,KAAK,EAAEG,KAAK;MACZL,WAAW,EAAEK,KAAK,CAACL,WAAW;MAC9BF,MAAM,EAAEO,KAAK,CAACP,MAAM;MACpBC,OAAO,EAAE;QACPZ,IAAI,EAAEkB,KAAK,CAACN,OAAO,CAACZ,IAAI;QACxBE,OAAO,EAAEgB,KAAK,CAACN,OAAO,CAACV,OAAO;QAC9BT,MAAM,EAAEyB,KAAK,CAACN,OAAO,CAACnB,MAAM;QAC5BE,GAAG,EAAEuB,KAAK,CAACN,OAAO,CAACjB,GAAG;QACtBE,SAAS,EAAEqB,KAAK,CAACN,OAAO,CAACf;;KAE5B,CAAC;EACJ;EAEA,IAAIuB,OAAOA,CAAA;IACT,MAAMC,YAAY,GAAG,GAAG,IAAI,CAACT,OAAO,CAACnB,MAAM,IAAI,IAAI,CAACmB,OAAO,CAACjB,GAAG,EAAE;IAEjE,IAAI2B,WAAW,GAAG,IAAI,CAACT,WAAW,GAC9B,GAAG,IAAI,CAACF,MAAM,KAAK,IAAI,CAACE,WAAW,EAAE,GACrC,GAAG,IAAI,CAACF,MAAM,mCAAmC;IAErDW,WAAW,IAAI,KAAKD,YAAY,GAAG;IAEnC,IAAIE,UAAU,GAAG,EAAE;IACnB,QAAQ,IAAI,CAACZ,MAAM;MACjB,KAAK,QAAQ;QAAE;UACbY,UAAU,IAAI,+FAA+F;UAC7G;QACF;MAEA,KAAK,YAAY;QAAE;UACjBA,UAAU,IAAI,4FAA4F;UAC1GA,UAAU,IAAI,2DAA2D;UACzE;QACF;MAEA,KAAK,WAAW;QAAE;UAChBA,UAAU,IAAI,gFAAgF;UAC9F;QACF;IACF;IAEAD,WAAW,IAAI,mBAAmBC,UAAU,EAAE;IAE9C,OAAOD,WAAW;EACpB;;AAGF;AACA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;;AAuBA,OAAO,MAAME,mBAAmB,gBAAGtC,MAAM,CAACM,MAAM,CAAC;EAC/CiC,MAAM,EAAEvC,MAAM,CAACwC,MAAM;EACrBxB,OAAO,EAAEhB,MAAM,CAACiB,MAAM,CAAC;IAAEC,GAAG,EAAElB,MAAM,CAACU,MAAM;IAAES,KAAK,EAAEnB,MAAM,CAACU;EAAM,CAAE;CACpE,CAAC,CAACU,WAAW,CAAC;EAAEC,UAAU,EAAE;AAAqB,CAAE,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,OAAM,MAAOoB,iBAAkB,sBAAQzC,MAAM,CAACuB,WAAW,CACvD,sCAAsC,CACvC,CAAC,mBAAmB,EAAE;EACrBC,MAAM,EAAExB,MAAM,CAACU,MAAM;EACrBH,MAAM,EAAEP,MAAM,CAACU,MAAM;EACrBgB,OAAO,EAAErB,kBAAkB;EAC3BqC,QAAQ,EAAEJ,mBAAmB;EAC7Bb,MAAM,eAAEzB,MAAM,CAACQ,OAAO,CAAC,YAAY,EAAE,QAAQ,EAAE,WAAW,CAAC;EAC3DmB,WAAW,eAAE3B,MAAM,CAAC4B,QAAQ,CAAC5B,MAAM,CAACU,MAAM,CAAC;EAC3CmB,KAAK,eAAE7B,MAAM,CAAC4B,QAAQ,CAAC5B,MAAM,CAAC8B,MAAM;CACrC,CAAC;EACA;;;EAGS,CAAC7B,MAAM,IAAYA,MAAM;EAElC;;;;;;;;;;;;;;;;;;;;;EAqBA,OAAO0C,iBAAiBA,CAAC;IAAEX,KAAK;IAAE,GAAGC;EAAM,CAI1C;IACC,OAAO,IAAIQ,iBAAiB,CAAC;MAC3B,GAAGR,MAAM;MACTJ,KAAK,EAAEG,KAAK;MACZL,WAAW,EAAEK,KAAK,CAACL,WAAW;MAC9BF,MAAM,EAAEO,KAAK,CAACP,MAAM;MACpBC,OAAO,EAAE;QACPZ,IAAI,EAAEkB,KAAK,CAACN,OAAO,CAACZ,IAAI;QACxBE,OAAO,EAAEgB,KAAK,CAACN,OAAO,CAACV,OAAO;QAC9BT,MAAM,EAAEyB,KAAK,CAACN,OAAO,CAACnB,MAAM;QAC5BE,GAAG,EAAEuB,KAAK,CAACN,OAAO,CAACjB,GAAG;QACtBE,SAAS,EAAEqB,KAAK,CAACN,OAAO,CAACf;OAC1B;MACD+B,QAAQ,EAAE;QACR1B,OAAO,EAAEgB,KAAK,CAACU,QAAQ,CAAC1B,OAAO;QAC/BuB,MAAM,EAAEP,KAAK,CAACU,QAAQ,CAACH;;KAE1B,CAAC;EACJ;EAEA,IAAIL,OAAOA,CAAA;IACT,MAAMU,eAAe,GAAG,GAAG,IAAI,CAACF,QAAQ,CAACH,MAAM,IAAI,IAAI,CAACb,OAAO,CAACnB,MAAM,IAAI,IAAI,CAACmB,OAAO,CAACjB,GAAG,EAAE;IAE5F,IAAI2B,WAAW,GAAG,IAAI,CAACT,WAAW,GAC9B,GAAG,IAAI,CAACF,MAAM,KAAK,IAAI,CAACE,WAAW,EAAE,GACrC,GAAG,IAAI,CAACF,MAAM,oCAAoC;IAEtDW,WAAW,IAAI,KAAKQ,eAAe,GAAG;IAEtC,IAAIP,UAAU,GAAG,EAAE;IACnB,QAAQ,IAAI,CAACZ,MAAM;MACjB,KAAK,QAAQ;QAAE;UACbY,UAAU,IAAI,uDAAuD,GACnE,iEAAiE,GACjE,oDAAoD;UACtD;QACF;MACA,KAAK,WAAW;QAAE;UAChBA,UAAU,IAAI,0DAA0D,GACtE,oFAAoF;UACtF;QACF;MACA,KAAK,YAAY;QAAE;UACjBA,UAAU,IAAIQ,uBAAuB,CAAC,IAAI,CAACH,QAAQ,CAACH,MAAM,CAAC;UAC3D;QACF;IACF;IAEAH,WAAW,IAAI,mBAAmBC,UAAU,EAAE;IAE9C,OAAOD,WAAW;EACpB;;AAGF;AACA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,OAAM,MAAOU,cAAe,sBAAQ9C,MAAM,CAACuB,WAAW,CACpD,mCAAmC,CACpC,CAAC,gBAAgB,EAAE;EAClBC,MAAM,EAAExB,MAAM,CAACU,MAAM;EACrBH,MAAM,EAAEP,MAAM,CAACU,MAAM;EACrBiB,WAAW,eAAE3B,MAAM,CAAC4B,QAAQ,CAAC5B,MAAM,CAACU,MAAM,CAAC;EAC3CmB,KAAK,eAAE7B,MAAM,CAAC4B,QAAQ,CAAC5B,MAAM,CAAC8B,MAAM;CACrC,CAAC;EACA;;;EAGS,CAAC7B,MAAM,IAAYA,MAAM;;AAGpC;AACA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,OAAM,MAAO8C,eAAgB,sBAAQ/C,MAAM,CAACuB,WAAW,CACrD,oCAAoC,CACrC,CAAC,iBAAiB,EAAE;EACnBC,MAAM,EAAExB,MAAM,CAACU,MAAM;EACrBH,MAAM,EAAEP,MAAM,CAACU,MAAM;EACrBiB,WAAW,eAAE3B,MAAM,CAAC4B,QAAQ,CAAC5B,MAAM,CAACU,MAAM,CAAC;EAC3CmB,KAAK,eAAE7B,MAAM,CAAC4B,QAAQ,CAAC5B,MAAM,CAAC8B,MAAM;CACrC,CAAC;EACA;;;EAGS,CAAC7B,MAAM,IAAYA,MAAM;EAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BA,OAAO+C,cAAcA,CAAC;IAAEhB,KAAK;IAAE,GAAGC;EAAM,CAIvC;IACC;IACA,OAAO,IAAIc,eAAe,CAAC;MACzB,GAAGd,MAAM;MACTJ,KAAK,EAAEG;KACR,CAAC;EACJ;;AAGF;AACA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA,OAAM,MAAOiB,YAAa,sBAAQjD,MAAM,CAACuB,WAAW,CAClD,yBAAyB,CAC1B,CAAC,cAAc,EAAE;EAChBC,MAAM,EAAExB,MAAM,CAACU,MAAM;EACrBH,MAAM,EAAEP,MAAM,CAACU,MAAM;EACrBiB,WAAW,eAAE3B,MAAM,CAAC4B,QAAQ,CAAC5B,MAAM,CAACU,MAAM,CAAC;EAC3CmB,KAAK,eAAE7B,MAAM,CAAC4B,QAAQ,CAAC5B,MAAM,CAAC8B,MAAM;CACrC,CAAC;EACA;;;EAGS,CAAC7B,MAAM,IAAYA,MAAM;EAElC;;;EAGA,IAAIiC,OAAOA,CAAA;IACT,MAAMgB,YAAY,GAAG,GAAG,IAAI,CAAC1B,MAAM,IAAI,IAAI,CAACjB,MAAM,EAAE;IACpD,OAAOR,SAAS,CAACoD,WAAW,CAAC,IAAI,CAACxB,WAAW,CAAC,GAC1C,GAAGuB,YAAY,qBAAqB,GACpC,GAAGA,YAAY,KAAK,IAAI,CAACvB,WAAW,EAAE;EAC5C;;AA+CF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,OAAO,MAAMyB,OAAO,gBAMfpD,MAAM,CAACqD,KAAK,CACf/B,gBAAgB,EAChBmB,iBAAiB,EACjBK,cAAc,EACdC,eAAe,EACfE,YAAY,CACb;AAED;AACA;AACA;AAEA,MAAMJ,uBAAuB,GAAIS,UAAkB,IAAY;EAC7D,IAAIA,UAAU,IAAI,GAAG,IAAIA,UAAU,GAAG,GAAG,EAAE;IACzC,QAAQA,UAAU;MAChB,KAAK,GAAG;QACN,OAAO,6FAA6F;MACtG,KAAK,GAAG;QACN,OAAO,iFAAiF;MAC1F,KAAK,GAAG;QACN,OAAO,6EAA6E;MACtF,KAAK,GAAG;QACN,OAAO,6EAA6E;MACtF,KAAK,GAAG;QACN,OAAO,qFAAqF;MAC9F,KAAK,GAAG;QACN,OAAO,0FAA0F;MACnG,KAAK,GAAG;QACN,OAAO,2EAA2E;MACpF;QACE,OAAO,0EAA0E;IACrF;EACF,CAAC,MAAM,IAAIA,UAAU,IAAI,GAAG,EAAE;IAC5B,OAAO,0FAA0F;EACnG,CAAC,MAAM;IACL,OAAO,+CAA+C;EACxD;AACF,CAAC","ignoreList":[]}