@prestyj/core 5.1.1 → 5.2.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.
@@ -33,7 +33,7 @@ interface ModelInfo {
33
33
  * enabled to pick the strongest setting per model:
34
34
  * - OpenAI GPT-5.5-era: `xhigh`
35
35
  * - OpenAI Pro/Codex/old: clamped to what the model accepts
36
- * - Claude Fable 5 / Mythos 5, Opus 4.8 / 4.7 / 4.6 and Sonnet 4.6: `max`
36
+ * - Claude Fable 5 / Mythos 5, Opus 4.8 / 4.7 / 4.6 and Sonnet 5: `max`
37
37
  * (Fable 5 / Mythos 5 use always-on adaptive thinking, low→max ladder)
38
38
  * - Claude Haiku 4.5: `high` (no adaptive `max` tier)
39
39
  * - GLM / Moonshot / Xiaomi / MiniMax / Qwen: `high` — binary-thinking
@@ -41,10 +41,37 @@ interface ModelInfo {
41
41
  * - DeepSeek V4: `xhigh` (DeepSeek maps `xhigh` → its internal `max`)
42
42
  */
43
43
  maxThinkingLevel: ThinkingLevel;
44
+ /**
45
+ * Ordered preference of auth-storage keys this model resolves credentials
46
+ * from, for providers that split auth across multiple distinct
47
+ * endpoints/keys (currently only Xiaomi: the Token Plan endpoint vs. the
48
+ * API Credits endpoint). The first key with stored credentials wins, so a
49
+ * model can both prefer one endpoint AND fall back to another the user has
50
+ * configured instead:
51
+ * - `mimo-v2.5-pro` / `mimo-v2.5`: `["xiaomi", XIAOMI_CREDITS_KEY]` —
52
+ * prefer the Token Plan, fall back to API Credits (API Credits serves
53
+ * every MiMo model, so a Credits-only user still reaches these).
54
+ * - `mimo-v2.5-pro-ultraspeed`: `[XIAOMI_CREDITS_KEY]` only — not served
55
+ * over the Token Plan endpoint, so there's no fallback to it.
56
+ * Falls back to `[provider]` — the normal single-credential case — when
57
+ * unset. Read via `getAuthStorageKeys()` / `getAuthStorageKey()`.
58
+ */
59
+ authStorageKeys?: string[];
44
60
  }
45
61
  declare const MODELS: ModelInfo[];
46
62
  declare function getModel(id: string): ModelInfo | undefined;
47
63
  declare function getModelsForProvider(provider: Provider): ModelInfo[];
64
+ /**
65
+ * Ordered auth-storage keys to try resolving credentials from for
66
+ * `(provider, model)`, first match wins. Almost every model just uses its
67
+ * provider id (one credential per provider). Models with `authStorageKeys`
68
+ * set (currently only Xiaomi) can prefer one endpoint and fall back to
69
+ * another — e.g. `mimo-v2.5-pro` prefers the Token Plan but falls back to API
70
+ * Credits, while the API-only `mimo-v2.5-pro-ultraspeed` has no fallback.
71
+ */
72
+ declare function getAuthStorageKeys(provider: Provider, modelId: string): string[];
73
+ /** The preferred (first) auth-storage key for `(provider, model)` — see `getAuthStorageKeys()`. */
74
+ declare function getAuthStorageKey(provider: Provider, modelId: string): string;
48
75
  /** Default video payload cap (bytes) when a video model doesn't declare one. */
49
76
  declare const DEFAULT_MAX_VIDEO_BYTES: number;
50
77
  /**
@@ -67,7 +94,7 @@ declare function getContextWindow(modelId: string, options?: ContextWindowOption
67
94
  declare function getMaxThinkingLevel(modelId: string): ThinkingLevel;
68
95
  /**
69
96
  * Get the model to use for compaction summarization.
70
- * - Anthropic: always Sonnet 4.6
97
+ * - Anthropic: always Sonnet 5
71
98
  * - OpenAI: cheapest (Codex Mini)
72
99
  * - Gemini: use the current model
73
100
  * - GLM: GLM-4.7 Flash (cheap alternative)
@@ -75,4 +102,4 @@ declare function getMaxThinkingLevel(modelId: string): ThinkingLevel;
75
102
  */
76
103
  declare function getSummaryModel(provider: Provider, currentModelId: string): ModelInfo;
77
104
 
78
- export { type ContextWindowOptions, DEFAULT_MAX_VIDEO_BYTES, MODELS, type ModelInfo, getContextWindow, getDefaultModel, getMaxThinkingLevel, getModel, getModelsForProvider, getSummaryModel, getVideoByteLimit, usesOpenAICodexTransport };
105
+ export { type ContextWindowOptions, DEFAULT_MAX_VIDEO_BYTES, MODELS, type ModelInfo, getAuthStorageKey, getAuthStorageKeys, getContextWindow, getDefaultModel, getMaxThinkingLevel, getModel, getModelsForProvider, getSummaryModel, getVideoByteLimit, usesOpenAICodexTransport };
@@ -1,6 +1,8 @@
1
1
  import {
2
2
  DEFAULT_MAX_VIDEO_BYTES,
3
3
  MODELS,
4
+ getAuthStorageKey,
5
+ getAuthStorageKeys,
4
6
  getContextWindow,
5
7
  getDefaultModel,
6
8
  getMaxThinkingLevel,
@@ -9,10 +11,13 @@ import {
9
11
  getSummaryModel,
10
12
  getVideoByteLimit,
11
13
  usesOpenAICodexTransport
12
- } from "./chunk-GRBEFHTI.js";
14
+ } from "./chunk-5GGCATYH.js";
15
+ import "./chunk-WQFTKHPJ.js";
13
16
  export {
14
17
  DEFAULT_MAX_VIDEO_BYTES,
15
18
  MODELS,
19
+ getAuthStorageKey,
20
+ getAuthStorageKeys,
16
21
  getContextWindow,
17
22
  getDefaultModel,
18
23
  getMaxThinkingLevel,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prestyj/core",
3
- "version": "5.1.1",
3
+ "version": "5.2.0",
4
4
  "type": "module",
5
5
  "description": "Provider-agnostic, UI-free shared foundation: model registry, auth, paths, telegram, voice",
6
6
  "license": "MIT",
@@ -33,7 +33,7 @@
33
33
  "dist"
34
34
  ],
35
35
  "dependencies": {
36
- "@prestyj/ai": "5.1.1"
36
+ "@prestyj/ai": "5.2.0"
37
37
  },
38
38
  "optionalDependencies": {
39
39
  "@huggingface/transformers": "^3.6.0",
@@ -1,404 +0,0 @@
1
- // src/model-registry.ts
2
- var MODELS = [
3
- // ── Anthropic ──────────────────────────────────────────
4
- // NOTE: Claude Fable 5 (`claude-fable-5`) and Claude Mythos 5
5
- // (`claude-mythos-5`) are temporarily unavailable, so they're commented out
6
- // here to keep them out of the /model selector and avoid user confusion.
7
- // Re-enable once they're generally available again.
8
- // {
9
- // id: "claude-fable-5",
10
- // name: "Claude Fable 5",
11
- // provider: "anthropic",
12
- // contextWindow: 1_000_000,
13
- // maxOutputTokens: 128_000,
14
- // supportsThinking: true,
15
- // supportsImages: true,
16
- // supportsVideo: false,
17
- // costTier: "high",
18
- // maxThinkingLevel: "max",
19
- // },
20
- // {
21
- // // Mythos-class model offered through Project Glasswing (limited
22
- // // availability, invitation-only). Same underlying model as Fable 5 with
23
- // // some safeguards lifted; kept here so approved accounts can select it.
24
- // id: "claude-mythos-5",
25
- // name: "Claude Mythos 5",
26
- // provider: "anthropic",
27
- // contextWindow: 1_000_000,
28
- // maxOutputTokens: 128_000,
29
- // supportsThinking: true,
30
- // supportsImages: true,
31
- // supportsVideo: false,
32
- // costTier: "high",
33
- // maxThinkingLevel: "max",
34
- // },
35
- {
36
- id: "claude-opus-4-8",
37
- name: "Claude Opus 4.8",
38
- provider: "anthropic",
39
- contextWindow: 1e6,
40
- maxOutputTokens: 128e3,
41
- supportsThinking: true,
42
- supportsImages: true,
43
- supportsVideo: false,
44
- costTier: "high",
45
- maxThinkingLevel: "max"
46
- },
47
- {
48
- id: "claude-sonnet-4-6",
49
- name: "Claude Sonnet 4.6",
50
- provider: "anthropic",
51
- contextWindow: 1e6,
52
- maxOutputTokens: 64e3,
53
- supportsThinking: true,
54
- supportsImages: true,
55
- supportsVideo: false,
56
- costTier: "medium",
57
- maxThinkingLevel: "max"
58
- },
59
- {
60
- id: "claude-haiku-4-5-20251001",
61
- name: "Claude Haiku 4.5",
62
- provider: "anthropic",
63
- contextWindow: 2e5,
64
- maxOutputTokens: 64e3,
65
- supportsThinking: true,
66
- supportsImages: true,
67
- supportsVideo: false,
68
- costTier: "low",
69
- maxThinkingLevel: "high"
70
- },
71
- // ── OpenAI (Codex) ─────────────────────────────────────
72
- {
73
- id: "gpt-5.5",
74
- name: "GPT-5.5",
75
- provider: "openai",
76
- contextWindow: 105e4,
77
- codexContextWindow: 272e3,
78
- maxOutputTokens: 128e3,
79
- supportsThinking: true,
80
- supportsImages: true,
81
- supportsVideo: false,
82
- costTier: "high",
83
- maxThinkingLevel: "xhigh"
84
- },
85
- {
86
- id: "gpt-5.4",
87
- name: "GPT-5.4",
88
- provider: "openai",
89
- contextWindow: 105e4,
90
- codexContextWindow: 272e3,
91
- maxOutputTokens: 128e3,
92
- supportsThinking: true,
93
- supportsImages: true,
94
- supportsVideo: false,
95
- costTier: "high",
96
- maxThinkingLevel: "xhigh"
97
- },
98
- {
99
- id: "gpt-5.4-mini",
100
- name: "GPT-5.4 Mini",
101
- provider: "openai",
102
- contextWindow: 4e5,
103
- maxOutputTokens: 128e3,
104
- supportsThinking: true,
105
- supportsImages: true,
106
- supportsVideo: false,
107
- costTier: "low",
108
- maxThinkingLevel: "xhigh"
109
- },
110
- {
111
- id: "gpt-5.3-codex",
112
- name: "GPT-5.3 Codex",
113
- provider: "openai",
114
- contextWindow: 4e5,
115
- maxOutputTokens: 128e3,
116
- supportsThinking: true,
117
- supportsImages: true,
118
- supportsVideo: false,
119
- costTier: "high",
120
- maxThinkingLevel: "xhigh"
121
- },
122
- // ── Sakana (Fugu) ──────────────────────────────────────
123
- // Sakana Fugu is a multi-agent system surfaced as a standard LLM via the
124
- // OpenAI-compatible Sakana API (https://api.sakana.ai/v1). Both models take
125
- // text + image input and only accept "high"/"xhigh" reasoning effort, so the
126
- // top tier is `xhigh`. `fugu` routes across all providers; `fugu-ultra` is
127
- // the heavier tier (may need larger client timeouts on complex tasks).
128
- {
129
- id: "fugu",
130
- name: "Fugu",
131
- provider: "sakana",
132
- contextWindow: 1e6,
133
- maxOutputTokens: 128e3,
134
- supportsThinking: true,
135
- supportsImages: true,
136
- supportsVideo: false,
137
- costTier: "medium",
138
- maxThinkingLevel: "xhigh"
139
- },
140
- {
141
- id: "fugu-ultra",
142
- name: "Fugu Ultra",
143
- provider: "sakana",
144
- contextWindow: 1e6,
145
- maxOutputTokens: 128e3,
146
- supportsThinking: true,
147
- supportsImages: true,
148
- supportsVideo: false,
149
- costTier: "high",
150
- maxThinkingLevel: "xhigh"
151
- },
152
- // ── Gemini ─────────────────────────────────────────────
153
- {
154
- id: "gemini-3.1-flash-lite-preview",
155
- name: "Gemini 3.1 Flash Lite Preview",
156
- provider: "gemini",
157
- contextWindow: 1048576,
158
- maxOutputTokens: 65536,
159
- supportsThinking: true,
160
- supportsImages: true,
161
- supportsVideo: true,
162
- maxVideoBytes: 20 * 1024 * 1024,
163
- costTier: "low",
164
- maxThinkingLevel: "high"
165
- },
166
- {
167
- id: "gemini-3.5-flash",
168
- name: "Gemini 3.5 Flash",
169
- provider: "gemini",
170
- contextWindow: 1048576,
171
- maxOutputTokens: 65536,
172
- supportsThinking: true,
173
- supportsImages: true,
174
- supportsVideo: true,
175
- maxVideoBytes: 20 * 1024 * 1024,
176
- costTier: "low",
177
- maxThinkingLevel: "high"
178
- },
179
- // ── Moonshot (Kimi) ────────────────────────────────────
180
- {
181
- id: "kimi-k2.7-code",
182
- name: "Kimi K2.7",
183
- provider: "moonshot",
184
- contextWindow: 262144,
185
- maxOutputTokens: 262144,
186
- supportsThinking: true,
187
- supportsImages: true,
188
- supportsVideo: true,
189
- maxVideoBytes: 100 * 1024 * 1024,
190
- costTier: "medium",
191
- maxThinkingLevel: "high"
192
- },
193
- // ── Z.AI (GLM) ─────────────────────────────────────────
194
- // GLM-5.2: coding-first flagship with a usable 1M-token context window
195
- // (5x jump over GLM-5.1's ~200K) and 131K max output. Released 2026-06-13.
196
- {
197
- id: "glm-5.2",
198
- name: "GLM-5.2",
199
- provider: "glm",
200
- contextWindow: 1e6,
201
- maxOutputTokens: 131072,
202
- supportsThinking: true,
203
- supportsImages: false,
204
- supportsVideo: false,
205
- costTier: "medium",
206
- maxThinkingLevel: "high"
207
- },
208
- {
209
- id: "glm-5.1",
210
- name: "GLM-5.1",
211
- provider: "glm",
212
- contextWindow: 204800,
213
- maxOutputTokens: 131072,
214
- supportsThinking: true,
215
- supportsImages: false,
216
- supportsVideo: false,
217
- costTier: "medium",
218
- maxThinkingLevel: "high"
219
- },
220
- {
221
- id: "glm-4.7",
222
- name: "GLM-4.7",
223
- provider: "glm",
224
- contextWindow: 2e5,
225
- maxOutputTokens: 131072,
226
- supportsThinking: true,
227
- supportsImages: false,
228
- supportsVideo: false,
229
- costTier: "low",
230
- maxThinkingLevel: "high"
231
- },
232
- {
233
- id: "glm-4.7-flash",
234
- name: "GLM-4.7 Flash",
235
- provider: "glm",
236
- contextWindow: 2e5,
237
- maxOutputTokens: 131072,
238
- supportsThinking: true,
239
- supportsImages: false,
240
- supportsVideo: false,
241
- costTier: "low",
242
- maxThinkingLevel: "high"
243
- },
244
- // ── MiniMax ────────────────────────────────────────────
245
- {
246
- id: "MiniMax-M3",
247
- name: "MiniMax M3",
248
- provider: "minimax",
249
- contextWindow: 1e6,
250
- maxOutputTokens: 131072,
251
- supportsThinking: true,
252
- supportsImages: true,
253
- supportsVideo: true,
254
- maxVideoBytes: 50 * 1024 * 1024,
255
- costTier: "medium",
256
- maxThinkingLevel: "high"
257
- },
258
- // ── Xiaomi (MiMo) ──────────────────────────────────────
259
- // Pro series: text-only coding/agentic flagship. The legacy mimo-v2-pro
260
- // auto-routes to v2.5 on 2026-06-01 and is fully deprecated by 2026-06-30.
261
- {
262
- id: "mimo-v2.5-pro",
263
- name: "MiMo-V2.5-Pro",
264
- provider: "xiaomi",
265
- contextWindow: 1e6,
266
- maxOutputTokens: 131072,
267
- supportsThinking: true,
268
- supportsImages: false,
269
- supportsVideo: false,
270
- costTier: "medium",
271
- maxThinkingLevel: "high"
272
- },
273
- // UltraSpeed: latency-optimized Pro variant (beta). Same text-only coding
274
- // profile as mimo-v2.5-pro, tuned for faster time-to-first-token.
275
- {
276
- id: "mimo-v2.5-pro-ultraspeed",
277
- name: "MiMo-V2.5-Pro UltraSpeed",
278
- provider: "xiaomi",
279
- contextWindow: 1e6,
280
- maxOutputTokens: 131072,
281
- supportsThinking: true,
282
- supportsImages: false,
283
- supportsVideo: false,
284
- costTier: "medium",
285
- maxThinkingLevel: "high"
286
- },
287
- // Omni series: native full-modal understanding (image + audio + video).
288
- // Video/image ride the OpenAI-compatible transport as base64 data URLs
289
- // (`video_url`/`image_url`), which the shared transform already emits.
290
- {
291
- id: "mimo-v2.5",
292
- name: "MiMo-V2.5",
293
- provider: "xiaomi",
294
- contextWindow: 1e6,
295
- maxOutputTokens: 131072,
296
- supportsThinking: true,
297
- supportsImages: true,
298
- supportsVideo: true,
299
- maxVideoBytes: 36 * 1024 * 1024,
300
- costTier: "medium",
301
- maxThinkingLevel: "high"
302
- },
303
- // ── DeepSeek ───────────────────────────────────────────
304
- {
305
- id: "deepseek-v4-pro",
306
- name: "DeepSeek V4 Pro",
307
- provider: "deepseek",
308
- contextWindow: 1048576,
309
- maxOutputTokens: 384e3,
310
- supportsThinking: true,
311
- supportsImages: false,
312
- supportsVideo: false,
313
- costTier: "high",
314
- // DeepSeek V4 maps `xhigh` → its internal `max` tier.
315
- maxThinkingLevel: "xhigh"
316
- },
317
- {
318
- id: "deepseek-v4-flash",
319
- name: "DeepSeek V4 Flash",
320
- provider: "deepseek",
321
- contextWindow: 1048576,
322
- maxOutputTokens: 384e3,
323
- supportsThinking: true,
324
- supportsImages: false,
325
- supportsVideo: false,
326
- costTier: "low",
327
- maxThinkingLevel: "xhigh"
328
- },
329
- // ── OpenRouter ─────────────────────────────────────────
330
- {
331
- id: "qwen/qwen3.6-plus",
332
- name: "Qwen3.6-Plus",
333
- provider: "openrouter",
334
- contextWindow: 1e6,
335
- maxOutputTokens: 65536,
336
- supportsThinking: true,
337
- supportsImages: false,
338
- supportsVideo: false,
339
- costTier: "medium",
340
- maxThinkingLevel: "high"
341
- }
342
- ];
343
- function getModel(id) {
344
- return MODELS.find((m) => m.id === id);
345
- }
346
- function getModelsForProvider(provider) {
347
- return MODELS.filter((m) => m.provider === provider);
348
- }
349
- var DEFAULT_MAX_VIDEO_BYTES = 20 * 1024 * 1024;
350
- function getVideoByteLimit(modelId) {
351
- const model = getModel(modelId);
352
- if (!model?.supportsVideo) return void 0;
353
- return model.maxVideoBytes ?? DEFAULT_MAX_VIDEO_BYTES;
354
- }
355
- function getDefaultModel(provider) {
356
- if (provider === "xiaomi") return MODELS.find((m) => m.id === "mimo-v2.5-pro");
357
- if (provider === "openai") return MODELS.find((m) => m.id === "gpt-5.5");
358
- if (provider === "gemini") return MODELS.find((m) => m.id === "gemini-3.1-flash-lite-preview");
359
- if (provider === "glm") return MODELS.find((m) => m.id === "glm-5.2");
360
- if (provider === "moonshot") return MODELS.find((m) => m.id === "kimi-k2.7-code");
361
- if (provider === "minimax") return MODELS.find((m) => m.id === "MiniMax-M3");
362
- if (provider === "deepseek") return MODELS.find((m) => m.id === "deepseek-v4-pro");
363
- if (provider === "openrouter") return MODELS.find((m) => m.id === "qwen/qwen3.6-plus");
364
- if (provider === "sakana") return MODELS.find((m) => m.id === "fugu");
365
- return MODELS.find((m) => m.id === "claude-sonnet-4-6");
366
- }
367
- function usesOpenAICodexTransport(options) {
368
- return options?.provider === "openai" && Boolean(options.accountId);
369
- }
370
- function getContextWindow(modelId, options) {
371
- const model = getModel(modelId);
372
- if (!model) return 2e5;
373
- if (usesOpenAICodexTransport(options) && model.codexContextWindow) {
374
- return model.codexContextWindow;
375
- }
376
- return model.contextWindow;
377
- }
378
- function getMaxThinkingLevel(modelId) {
379
- return getModel(modelId)?.maxThinkingLevel ?? "high";
380
- }
381
- function getSummaryModel(provider, currentModelId) {
382
- if (provider === "anthropic") {
383
- return MODELS.find((m) => m.id === "claude-sonnet-4-6");
384
- }
385
- if (provider === "openai" || provider === "glm" || provider === "deepseek") {
386
- const low = getModelsForProvider(provider).find((m) => m.costTier === "low");
387
- if (low) return low;
388
- }
389
- return getModel(currentModelId) ?? getDefaultModel(provider);
390
- }
391
-
392
- export {
393
- MODELS,
394
- getModel,
395
- getModelsForProvider,
396
- DEFAULT_MAX_VIDEO_BYTES,
397
- getVideoByteLimit,
398
- getDefaultModel,
399
- usesOpenAICodexTransport,
400
- getContextWindow,
401
- getMaxThinkingLevel,
402
- getSummaryModel
403
- };
404
- //# sourceMappingURL=chunk-GRBEFHTI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/model-registry.ts"],"sourcesContent":["import type { Provider, ThinkingLevel } from \"@prestyj/ai\";\n\nexport interface ModelInfo {\n id: string;\n name: string;\n provider: Provider;\n contextWindow: number;\n /**\n * ChatGPT Codex transport uses product-specific windows that can differ from\n * the public API model window. OpenAI OAuth requests include an accountId and\n * route through `/codex/responses`; API-key requests do not.\n */\n codexContextWindow?: number;\n maxOutputTokens: number;\n supportsThinking: boolean;\n supportsImages: boolean;\n supportsVideo: boolean;\n /**\n * Max video payload (bytes) this model's transport accepts, used to decide\n * when an attached/read video must be compressed before sending. Differs by\n * provider delivery mechanism:\n * - Moonshot/Kimi: 100 MB (file-service upload cap)\n * - MiniMax: 50 MB (Anthropic-compatible base64 inline cap)\n * - Gemini: 20 MB (inlineData per-request cap)\n * - Xiaomi (MiMo): ~36 MB raw — the API caps the base64 STRING at 50 MB,\n * and base64 inflates bytes by ~4/3, so 36 MB raw ≈ 48 MB encoded.\n * Only meaningful when `supportsVideo` is true.\n */\n maxVideoBytes?: number;\n costTier: \"low\" | \"medium\" | \"high\";\n /**\n * The top reasoning tier this model genuinely uses. Used when thinking is\n * enabled to pick the strongest setting per model:\n * - OpenAI GPT-5.5-era: `xhigh`\n * - OpenAI Pro/Codex/old: clamped to what the model accepts\n * - Claude Fable 5 / Mythos 5, Opus 4.8 / 4.7 / 4.6 and Sonnet 4.6: `max`\n * (Fable 5 / Mythos 5 use always-on adaptive thinking, low→max ladder)\n * - Claude Haiku 4.5: `high` (no adaptive `max` tier)\n * - GLM / Moonshot / Xiaomi / MiniMax / Qwen: `high` — binary-thinking\n * providers ignore the level on the wire, so the value is cosmetic\n * - DeepSeek V4: `xhigh` (DeepSeek maps `xhigh` → its internal `max`)\n */\n maxThinkingLevel: ThinkingLevel;\n}\n\n// Provider display order — mirrors `PROVIDERS` in ui/login.tsx so the\n// /model selector and login selector sort models identically.\nexport const MODELS: ModelInfo[] = [\n // ── Anthropic ──────────────────────────────────────────\n // NOTE: Claude Fable 5 (`claude-fable-5`) and Claude Mythos 5\n // (`claude-mythos-5`) are temporarily unavailable, so they're commented out\n // here to keep them out of the /model selector and avoid user confusion.\n // Re-enable once they're generally available again.\n // {\n // id: \"claude-fable-5\",\n // name: \"Claude Fable 5\",\n // provider: \"anthropic\",\n // contextWindow: 1_000_000,\n // maxOutputTokens: 128_000,\n // supportsThinking: true,\n // supportsImages: true,\n // supportsVideo: false,\n // costTier: \"high\",\n // maxThinkingLevel: \"max\",\n // },\n // {\n // // Mythos-class model offered through Project Glasswing (limited\n // // availability, invitation-only). Same underlying model as Fable 5 with\n // // some safeguards lifted; kept here so approved accounts can select it.\n // id: \"claude-mythos-5\",\n // name: \"Claude Mythos 5\",\n // provider: \"anthropic\",\n // contextWindow: 1_000_000,\n // maxOutputTokens: 128_000,\n // supportsThinking: true,\n // supportsImages: true,\n // supportsVideo: false,\n // costTier: \"high\",\n // maxThinkingLevel: \"max\",\n // },\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n provider: \"anthropic\",\n contextWindow: 1_000_000,\n maxOutputTokens: 128_000,\n supportsThinking: true,\n supportsImages: true,\n supportsVideo: false,\n costTier: \"high\",\n maxThinkingLevel: \"max\",\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n provider: \"anthropic\",\n contextWindow: 1_000_000,\n maxOutputTokens: 64_000,\n supportsThinking: true,\n supportsImages: true,\n supportsVideo: false,\n costTier: \"medium\",\n maxThinkingLevel: \"max\",\n },\n {\n id: \"claude-haiku-4-5-20251001\",\n name: \"Claude Haiku 4.5\",\n provider: \"anthropic\",\n contextWindow: 200_000,\n maxOutputTokens: 64_000,\n supportsThinking: true,\n supportsImages: true,\n supportsVideo: false,\n costTier: \"low\",\n maxThinkingLevel: \"high\",\n },\n // ── OpenAI (Codex) ─────────────────────────────────────\n {\n id: \"gpt-5.5\",\n name: \"GPT-5.5\",\n provider: \"openai\",\n contextWindow: 1_050_000,\n codexContextWindow: 272_000,\n maxOutputTokens: 128_000,\n supportsThinking: true,\n supportsImages: true,\n supportsVideo: false,\n costTier: \"high\",\n maxThinkingLevel: \"xhigh\",\n },\n {\n id: \"gpt-5.4\",\n name: \"GPT-5.4\",\n provider: \"openai\",\n contextWindow: 1_050_000,\n codexContextWindow: 272_000,\n maxOutputTokens: 128_000,\n supportsThinking: true,\n supportsImages: true,\n supportsVideo: false,\n costTier: \"high\",\n maxThinkingLevel: \"xhigh\",\n },\n {\n id: \"gpt-5.4-mini\",\n name: \"GPT-5.4 Mini\",\n provider: \"openai\",\n contextWindow: 400_000,\n maxOutputTokens: 128_000,\n supportsThinking: true,\n supportsImages: true,\n supportsVideo: false,\n costTier: \"low\",\n maxThinkingLevel: \"xhigh\",\n },\n {\n id: \"gpt-5.3-codex\",\n name: \"GPT-5.3 Codex\",\n provider: \"openai\",\n contextWindow: 400_000,\n maxOutputTokens: 128_000,\n supportsThinking: true,\n supportsImages: true,\n supportsVideo: false,\n costTier: \"high\",\n maxThinkingLevel: \"xhigh\",\n },\n // ── Sakana (Fugu) ──────────────────────────────────────\n // Sakana Fugu is a multi-agent system surfaced as a standard LLM via the\n // OpenAI-compatible Sakana API (https://api.sakana.ai/v1). Both models take\n // text + image input and only accept \"high\"/\"xhigh\" reasoning effort, so the\n // top tier is `xhigh`. `fugu` routes across all providers; `fugu-ultra` is\n // the heavier tier (may need larger client timeouts on complex tasks).\n {\n id: \"fugu\",\n name: \"Fugu\",\n provider: \"sakana\",\n contextWindow: 1_000_000,\n maxOutputTokens: 128_000,\n supportsThinking: true,\n supportsImages: true,\n supportsVideo: false,\n costTier: \"medium\",\n maxThinkingLevel: \"xhigh\",\n },\n {\n id: \"fugu-ultra\",\n name: \"Fugu Ultra\",\n provider: \"sakana\",\n contextWindow: 1_000_000,\n maxOutputTokens: 128_000,\n supportsThinking: true,\n supportsImages: true,\n supportsVideo: false,\n costTier: \"high\",\n maxThinkingLevel: \"xhigh\",\n },\n // ── Gemini ─────────────────────────────────────────────\n {\n id: \"gemini-3.1-flash-lite-preview\",\n name: \"Gemini 3.1 Flash Lite Preview\",\n provider: \"gemini\",\n contextWindow: 1_048_576,\n maxOutputTokens: 65_536,\n supportsThinking: true,\n supportsImages: true,\n supportsVideo: true,\n maxVideoBytes: 20 * 1024 * 1024,\n costTier: \"low\",\n maxThinkingLevel: \"high\",\n },\n {\n id: \"gemini-3.5-flash\",\n name: \"Gemini 3.5 Flash\",\n provider: \"gemini\",\n contextWindow: 1_048_576,\n maxOutputTokens: 65_536,\n supportsThinking: true,\n supportsImages: true,\n supportsVideo: true,\n maxVideoBytes: 20 * 1024 * 1024,\n costTier: \"low\",\n maxThinkingLevel: \"high\",\n },\n // ── Moonshot (Kimi) ────────────────────────────────────\n {\n id: \"kimi-k2.7-code\",\n name: \"Kimi K2.7\",\n provider: \"moonshot\",\n contextWindow: 262_144,\n maxOutputTokens: 262_144,\n supportsThinking: true,\n supportsImages: true,\n supportsVideo: true,\n maxVideoBytes: 100 * 1024 * 1024,\n costTier: \"medium\",\n maxThinkingLevel: \"high\",\n },\n // ── Z.AI (GLM) ─────────────────────────────────────────\n // GLM-5.2: coding-first flagship with a usable 1M-token context window\n // (5x jump over GLM-5.1's ~200K) and 131K max output. Released 2026-06-13.\n {\n id: \"glm-5.2\",\n name: \"GLM-5.2\",\n provider: \"glm\",\n contextWindow: 1_000_000,\n maxOutputTokens: 131_072,\n supportsThinking: true,\n supportsImages: false,\n supportsVideo: false,\n costTier: \"medium\",\n maxThinkingLevel: \"high\",\n },\n {\n id: \"glm-5.1\",\n name: \"GLM-5.1\",\n provider: \"glm\",\n contextWindow: 204_800,\n maxOutputTokens: 131_072,\n supportsThinking: true,\n supportsImages: false,\n supportsVideo: false,\n costTier: \"medium\",\n maxThinkingLevel: \"high\",\n },\n {\n id: \"glm-4.7\",\n name: \"GLM-4.7\",\n provider: \"glm\",\n contextWindow: 200_000,\n maxOutputTokens: 131_072,\n supportsThinking: true,\n supportsImages: false,\n supportsVideo: false,\n costTier: \"low\",\n maxThinkingLevel: \"high\",\n },\n {\n id: \"glm-4.7-flash\",\n name: \"GLM-4.7 Flash\",\n provider: \"glm\",\n contextWindow: 200_000,\n maxOutputTokens: 131_072,\n supportsThinking: true,\n supportsImages: false,\n supportsVideo: false,\n costTier: \"low\",\n maxThinkingLevel: \"high\",\n },\n // ── MiniMax ────────────────────────────────────────────\n {\n id: \"MiniMax-M3\",\n name: \"MiniMax M3\",\n provider: \"minimax\",\n contextWindow: 1_000_000,\n maxOutputTokens: 131_072,\n supportsThinking: true,\n supportsImages: true,\n supportsVideo: true,\n maxVideoBytes: 50 * 1024 * 1024,\n costTier: \"medium\",\n maxThinkingLevel: \"high\",\n },\n // ── Xiaomi (MiMo) ──────────────────────────────────────\n // Pro series: text-only coding/agentic flagship. The legacy mimo-v2-pro\n // auto-routes to v2.5 on 2026-06-01 and is fully deprecated by 2026-06-30.\n {\n id: \"mimo-v2.5-pro\",\n name: \"MiMo-V2.5-Pro\",\n provider: \"xiaomi\",\n contextWindow: 1_000_000,\n maxOutputTokens: 131_072,\n supportsThinking: true,\n supportsImages: false,\n supportsVideo: false,\n costTier: \"medium\",\n maxThinkingLevel: \"high\",\n },\n // UltraSpeed: latency-optimized Pro variant (beta). Same text-only coding\n // profile as mimo-v2.5-pro, tuned for faster time-to-first-token.\n {\n id: \"mimo-v2.5-pro-ultraspeed\",\n name: \"MiMo-V2.5-Pro UltraSpeed\",\n provider: \"xiaomi\",\n contextWindow: 1_000_000,\n maxOutputTokens: 131_072,\n supportsThinking: true,\n supportsImages: false,\n supportsVideo: false,\n costTier: \"medium\",\n maxThinkingLevel: \"high\",\n },\n // Omni series: native full-modal understanding (image + audio + video).\n // Video/image ride the OpenAI-compatible transport as base64 data URLs\n // (`video_url`/`image_url`), which the shared transform already emits.\n {\n id: \"mimo-v2.5\",\n name: \"MiMo-V2.5\",\n provider: \"xiaomi\",\n contextWindow: 1_000_000,\n maxOutputTokens: 131_072,\n supportsThinking: true,\n supportsImages: true,\n supportsVideo: true,\n maxVideoBytes: 36 * 1024 * 1024,\n costTier: \"medium\",\n maxThinkingLevel: \"high\",\n },\n // ── DeepSeek ───────────────────────────────────────────\n {\n id: \"deepseek-v4-pro\",\n name: \"DeepSeek V4 Pro\",\n provider: \"deepseek\",\n contextWindow: 1_048_576,\n maxOutputTokens: 384_000,\n supportsThinking: true,\n supportsImages: false,\n supportsVideo: false,\n costTier: \"high\",\n // DeepSeek V4 maps `xhigh` → its internal `max` tier.\n maxThinkingLevel: \"xhigh\",\n },\n {\n id: \"deepseek-v4-flash\",\n name: \"DeepSeek V4 Flash\",\n provider: \"deepseek\",\n contextWindow: 1_048_576,\n maxOutputTokens: 384_000,\n supportsThinking: true,\n supportsImages: false,\n supportsVideo: false,\n costTier: \"low\",\n maxThinkingLevel: \"xhigh\",\n },\n // ── OpenRouter ─────────────────────────────────────────\n {\n id: \"qwen/qwen3.6-plus\",\n name: \"Qwen3.6-Plus\",\n provider: \"openrouter\",\n contextWindow: 1_000_000,\n maxOutputTokens: 65_536,\n supportsThinking: true,\n supportsImages: false,\n supportsVideo: false,\n costTier: \"medium\",\n maxThinkingLevel: \"high\",\n },\n];\n\nexport function getModel(id: string): ModelInfo | undefined {\n return MODELS.find((m) => m.id === id);\n}\n\nexport function getModelsForProvider(provider: Provider): ModelInfo[] {\n return MODELS.filter((m) => m.provider === provider);\n}\n\n/** Default video payload cap (bytes) when a video model doesn't declare one. */\nexport const DEFAULT_MAX_VIDEO_BYTES = 20 * 1024 * 1024;\n\n/**\n * Max video payload (bytes) the given model's transport accepts before the clip\n * must be compressed. Returns `undefined` for models without video support, so\n * callers can skip the native-video path entirely.\n */\nexport function getVideoByteLimit(modelId: string): number | undefined {\n const model = getModel(modelId);\n if (!model?.supportsVideo) return undefined;\n return model.maxVideoBytes ?? DEFAULT_MAX_VIDEO_BYTES;\n}\n\nexport function getDefaultModel(provider: Provider): ModelInfo {\n if (provider === \"xiaomi\") return MODELS.find((m) => m.id === \"mimo-v2.5-pro\")!;\n if (provider === \"openai\") return MODELS.find((m) => m.id === \"gpt-5.5\")!;\n if (provider === \"gemini\") return MODELS.find((m) => m.id === \"gemini-3.1-flash-lite-preview\")!;\n if (provider === \"glm\") return MODELS.find((m) => m.id === \"glm-5.2\")!;\n if (provider === \"moonshot\") return MODELS.find((m) => m.id === \"kimi-k2.7-code\")!;\n if (provider === \"minimax\") return MODELS.find((m) => m.id === \"MiniMax-M3\")!;\n if (provider === \"deepseek\") return MODELS.find((m) => m.id === \"deepseek-v4-pro\")!;\n if (provider === \"openrouter\") return MODELS.find((m) => m.id === \"qwen/qwen3.6-plus\")!;\n if (provider === \"sakana\") return MODELS.find((m) => m.id === \"fugu\")!;\n return MODELS.find((m) => m.id === \"claude-sonnet-4-6\")!;\n}\n\nexport interface ContextWindowOptions {\n provider?: Provider;\n accountId?: string;\n}\n\nexport function usesOpenAICodexTransport(options?: ContextWindowOptions): boolean {\n return options?.provider === \"openai\" && Boolean(options.accountId);\n}\n\nexport function getContextWindow(modelId: string, options?: ContextWindowOptions): number {\n const model = getModel(modelId);\n if (!model) return 200_000;\n if (usesOpenAICodexTransport(options) && model.codexContextWindow) {\n return model.codexContextWindow;\n }\n return model.contextWindow;\n}\n\n/**\n * The strongest thinking level the given model genuinely uses. Falls back to\n * `\"high\"` for unknown models since every provider we ship accepts it.\n */\nexport function getMaxThinkingLevel(modelId: string): ThinkingLevel {\n return getModel(modelId)?.maxThinkingLevel ?? \"high\";\n}\n\n/**\n * Get the model to use for compaction summarization.\n * - Anthropic: always Sonnet 4.6\n * - OpenAI: cheapest (Codex Mini)\n * - Gemini: use the current model\n * - GLM: GLM-4.7 Flash (cheap alternative)\n * - Moonshot: use the current model (no cheap alternative)\n */\nexport function getSummaryModel(provider: Provider, currentModelId: string): ModelInfo {\n if (provider === \"anthropic\") {\n return MODELS.find((m) => m.id === \"claude-sonnet-4-6\")!;\n }\n if (provider === \"openai\" || provider === \"glm\" || provider === \"deepseek\") {\n const low = getModelsForProvider(provider).find((m) => m.costTier === \"low\");\n if (low) return low;\n }\n // Moonshot or fallback: use current model\n return getModel(currentModelId) ?? getDefaultModel(provider);\n}\n"],"mappings":";AA+CO,IAAM,SAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCjC;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA;AAAA,EAEA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA;AAAA,EAEA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,eAAe,KAAK,OAAO;AAAA,IAC3B,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,eAAe,KAAK,OAAO;AAAA,IAC3B,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA;AAAA,EAEA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,eAAe,MAAM,OAAO;AAAA,IAC5B,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA;AAAA,EAEA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,eAAe,KAAK,OAAO;AAAA,IAC3B,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA;AAAA;AAAA,EAGA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,eAAe,KAAK,OAAO;AAAA,IAC3B,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA;AAAA,EAEA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA;AAAA,IAEV,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AAAA;AAAA,EAEA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,kBAAkB;AAAA,EACpB;AACF;AAEO,SAAS,SAAS,IAAmC;AAC1D,SAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACvC;AAEO,SAAS,qBAAqB,UAAiC;AACpE,SAAO,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ;AACrD;AAGO,IAAM,0BAA0B,KAAK,OAAO;AAO5C,SAAS,kBAAkB,SAAqC;AACrE,QAAM,QAAQ,SAAS,OAAO;AAC9B,MAAI,CAAC,OAAO,cAAe,QAAO;AAClC,SAAO,MAAM,iBAAiB;AAChC;AAEO,SAAS,gBAAgB,UAA+B;AAC7D,MAAI,aAAa,SAAU,QAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,eAAe;AAC7E,MAAI,aAAa,SAAU,QAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS;AACvE,MAAI,aAAa,SAAU,QAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,+BAA+B;AAC7F,MAAI,aAAa,MAAO,QAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS;AACpE,MAAI,aAAa,WAAY,QAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,gBAAgB;AAChF,MAAI,aAAa,UAAW,QAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,YAAY;AAC3E,MAAI,aAAa,WAAY,QAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,iBAAiB;AACjF,MAAI,aAAa,aAAc,QAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,mBAAmB;AACrF,MAAI,aAAa,SAAU,QAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AACpE,SAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,mBAAmB;AACxD;AAOO,SAAS,yBAAyB,SAAyC;AAChF,SAAO,SAAS,aAAa,YAAY,QAAQ,QAAQ,SAAS;AACpE;AAEO,SAAS,iBAAiB,SAAiB,SAAwC;AACxF,QAAM,QAAQ,SAAS,OAAO;AAC9B,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,yBAAyB,OAAO,KAAK,MAAM,oBAAoB;AACjE,WAAO,MAAM;AAAA,EACf;AACA,SAAO,MAAM;AACf;AAMO,SAAS,oBAAoB,SAAgC;AAClE,SAAO,SAAS,OAAO,GAAG,oBAAoB;AAChD;AAUO,SAAS,gBAAgB,UAAoB,gBAAmC;AACrF,MAAI,aAAa,aAAa;AAC5B,WAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,mBAAmB;AAAA,EACxD;AACA,MAAI,aAAa,YAAY,aAAa,SAAS,aAAa,YAAY;AAC1E,UAAM,MAAM,qBAAqB,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,aAAa,KAAK;AAC3E,QAAI,IAAK,QAAO;AAAA,EAClB;AAEA,SAAO,SAAS,cAAc,KAAK,gBAAgB,QAAQ;AAC7D;","names":[]}