@sriinnu/kosha-discovery 1.0.0 → 1.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.
Files changed (74) hide show
  1. package/README.md +51 -3
  2. package/dist/cli-format.d.ts.map +1 -1
  3. package/dist/cli-format.js +2 -1
  4. package/dist/cli-format.js.map +1 -1
  5. package/dist/context-strategy.d.ts +48 -0
  6. package/dist/context-strategy.d.ts.map +1 -0
  7. package/dist/context-strategy.js +274 -0
  8. package/dist/context-strategy.js.map +1 -0
  9. package/dist/credentials/resolver.d.ts +7 -0
  10. package/dist/credentials/resolver.d.ts.map +1 -1
  11. package/dist/credentials/resolver.js +28 -3
  12. package/dist/credentials/resolver.js.map +1 -1
  13. package/dist/discovery/index.d.ts +4 -6
  14. package/dist/discovery/index.d.ts.map +1 -1
  15. package/dist/discovery/index.js +39 -55
  16. package/dist/discovery/index.js.map +1 -1
  17. package/dist/discovery/litellm-seed.js +12 -8
  18. package/dist/discovery/litellm-seed.js.map +1 -1
  19. package/dist/discovery/modelsdev-seed.js +16 -12
  20. package/dist/discovery/modelsdev-seed.js.map +1 -1
  21. package/dist/discovery/promo-overrides.js +3 -3
  22. package/dist/discovery/promo-overrides.js.map +1 -1
  23. package/dist/discovery/vercel.d.ts +45 -0
  24. package/dist/discovery/vercel.d.ts.map +1 -0
  25. package/dist/discovery/vercel.js +232 -0
  26. package/dist/discovery/vercel.js.map +1 -0
  27. package/dist/discovery-contract.d.ts +1 -1
  28. package/dist/discovery-contract.d.ts.map +1 -1
  29. package/dist/discovery-contract.js +28 -1
  30. package/dist/discovery-contract.js.map +1 -1
  31. package/dist/enrichment/litellm-catalog.d.ts +1 -0
  32. package/dist/enrichment/litellm-catalog.d.ts.map +1 -1
  33. package/dist/enrichment/litellm-catalog.js.map +1 -1
  34. package/dist/enrichment/litellm.d.ts.map +1 -1
  35. package/dist/enrichment/litellm.js +6 -0
  36. package/dist/enrichment/litellm.js.map +1 -1
  37. package/dist/mcp-server.d.ts +18 -0
  38. package/dist/mcp-server.d.ts.map +1 -0
  39. package/dist/mcp-server.js +341 -0
  40. package/dist/mcp-server.js.map +1 -0
  41. package/dist/provider-catalog.d.ts +19 -2
  42. package/dist/provider-catalog.d.ts.map +1 -1
  43. package/dist/provider-catalog.js +104 -0
  44. package/dist/provider-catalog.js.map +1 -1
  45. package/dist/proxy.d.ts +31 -0
  46. package/dist/proxy.d.ts.map +1 -0
  47. package/dist/proxy.js +213 -0
  48. package/dist/proxy.js.map +1 -0
  49. package/dist/registry-discovery.d.ts.map +1 -1
  50. package/dist/registry-discovery.js +5 -5
  51. package/dist/registry-discovery.js.map +1 -1
  52. package/dist/registry-query.d.ts +2 -2
  53. package/dist/registry-query.d.ts.map +1 -1
  54. package/dist/registry-query.js +58 -7
  55. package/dist/registry-query.js.map +1 -1
  56. package/dist/registry-runtime.d.ts +20 -0
  57. package/dist/registry-runtime.d.ts.map +1 -1
  58. package/dist/registry-runtime.js +231 -39
  59. package/dist/registry-runtime.js.map +1 -1
  60. package/dist/registry-selection.d.ts.map +1 -1
  61. package/dist/registry-selection.js +21 -3
  62. package/dist/registry-selection.js.map +1 -1
  63. package/dist/registry.js +2 -2
  64. package/dist/registry.js.map +1 -1
  65. package/dist/security.js +6 -6
  66. package/dist/security.js.map +1 -1
  67. package/dist/server.d.ts +2 -0
  68. package/dist/server.d.ts.map +1 -1
  69. package/dist/server.js +7 -1
  70. package/dist/server.js.map +1 -1
  71. package/dist/types.d.ts +42 -2
  72. package/dist/types.d.ts.map +1 -1
  73. package/logo.png +0 -0
  74. package/package.json +102 -91
@@ -0,0 +1,341 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * kosha-discovery — MCP server (stdio transport, protocol 2024-11-05).
4
+ *
5
+ * Exposes the local kosha registry as MCP tools so AI agents can query
6
+ * model pricing, routing, and health without HTTP.
7
+ *
8
+ * Tools:
9
+ * kosha_query_models — list / filter models
10
+ * kosha_cheapest_model — cheapest model meeting requirements
11
+ * kosha_model_detail — full detail for one model
12
+ * kosha_model_routes — all provider routes for a model
13
+ * kosha_resolve_alias — alias → canonical ID
14
+ * kosha_provider_health — provider auth + error status
15
+ * @module
16
+ */
17
+ import { computeContextStrategy } from "./context-strategy.js";
18
+ import { ModelRegistry } from "./registry.js";
19
+ // ---------------------------------------------------------------------------
20
+ // Tool definitions (MCP schema)
21
+ // ---------------------------------------------------------------------------
22
+ const TOOLS = [
23
+ {
24
+ name: "kosha_query_models",
25
+ description: "List AI models from the local kosha registry. Optionally filter by provider, mode, or capability tag. Returns id, provider, name, mode, context window, capabilities, and pricing.",
26
+ inputSchema: {
27
+ type: "object",
28
+ properties: {
29
+ provider: { type: "string", description: "Provider ID (e.g. anthropic, openai, groq, openrouter)" },
30
+ mode: {
31
+ type: "string",
32
+ enum: ["chat", "embedding", "image", "video", "audio", "moderation", "rerank"],
33
+ description: "Primary model mode",
34
+ },
35
+ capability: {
36
+ type: "string",
37
+ description: "Capability tag (e.g. vision, tool_use, code, reasoning)",
38
+ },
39
+ limit: { type: "number", description: "Max results to return (default 20)" },
40
+ },
41
+ },
42
+ },
43
+ {
44
+ name: "kosha_cheapest_model",
45
+ description: "Find the cheapest AI model that meets your requirements. Returns ranked matches with per-million token pricing. Use this before routing a request to pick the most cost-effective option.",
46
+ inputSchema: {
47
+ type: "object",
48
+ properties: {
49
+ capability: {
50
+ type: "string",
51
+ description: "Required capability (e.g. tool_use, vision, code, reasoning)",
52
+ },
53
+ min_context_k: {
54
+ type: "number",
55
+ description: "Minimum context window in thousands of tokens (e.g. 128 means 128k)",
56
+ },
57
+ provider: { type: "string", description: "Pin to a specific provider" },
58
+ limit: { type: "number", description: "Number of ranked results (default 5)" },
59
+ },
60
+ },
61
+ },
62
+ {
63
+ name: "kosha_model_detail",
64
+ description: "Get full details for a specific model — pricing, capabilities, context window, tool dialect, structured output modes, status, and deprecation info.",
65
+ inputSchema: {
66
+ type: "object",
67
+ properties: {
68
+ model: {
69
+ type: "string",
70
+ description: "Model ID or alias (e.g. sonnet, claude-sonnet-4-6, gpt-4o, deepseek-v3)",
71
+ },
72
+ },
73
+ required: ["model"],
74
+ },
75
+ },
76
+ {
77
+ name: "kosha_model_routes",
78
+ description: "List all serving-layer routes for a model (direct provider, OpenRouter, Bedrock, Vertex, etc.) with pricing per route. Useful for finding the cheapest or most available path to a specific model.",
79
+ inputSchema: {
80
+ type: "object",
81
+ properties: {
82
+ model: { type: "string", description: "Model ID or alias" },
83
+ },
84
+ required: ["model"],
85
+ },
86
+ },
87
+ {
88
+ name: "kosha_resolve_alias",
89
+ description: "Resolve a model alias or short name to its canonical ID and provider.",
90
+ inputSchema: {
91
+ type: "object",
92
+ properties: {
93
+ alias: {
94
+ type: "string",
95
+ description: "Short name or alias (e.g. sonnet, opus, haiku, gpt-4o-mini, gemini-flash)",
96
+ },
97
+ },
98
+ required: ["alias"],
99
+ },
100
+ },
101
+ {
102
+ name: "kosha_provider_health",
103
+ description: "Get authentication and health status for all discovered providers. Shows which providers are active, which need credentials, and any recent discovery errors.",
104
+ inputSchema: {
105
+ type: "object",
106
+ properties: {
107
+ provider: { type: "string", description: "Filter to a specific provider ID" },
108
+ },
109
+ },
110
+ },
111
+ {
112
+ name: "kosha_context_strategy",
113
+ description: "Advise on context management for a long-running conversation. Given a model and current token usage, returns ranked options (continue, enable prompt cache, compact + continue, switch to long-context tier, switch model, batch offload) with rough cost-per-turn math. Useful before deciding whether to summarize, swap models, or just keep going.",
114
+ inputSchema: {
115
+ type: "object",
116
+ properties: {
117
+ model: { type: "string", description: "Model ID or alias the caller is currently using" },
118
+ current_tokens: { type: "number", description: "Approximate token count of the conversation so far" },
119
+ expected_output_tokens: {
120
+ type: "number",
121
+ description: "Tokens the next reply is expected to produce (default 1024)",
122
+ },
123
+ expected_remaining_turns: {
124
+ type: "number",
125
+ description: "How many more turns the caller plans (default 5)",
126
+ },
127
+ },
128
+ required: ["model", "current_tokens"],
129
+ },
130
+ },
131
+ ];
132
+ // ---------------------------------------------------------------------------
133
+ // Registry — lazy-load on first tool call so starting the MCP server has no
134
+ // filesystem/network side effects until a client actually asks for data.
135
+ // ---------------------------------------------------------------------------
136
+ let registryInstance = null;
137
+ let registryReady = null;
138
+ async function loadRegistry() {
139
+ const reg = new ModelRegistry();
140
+ await reg.discover();
141
+ registryInstance = reg;
142
+ return reg;
143
+ }
144
+ async function getRegistry() {
145
+ if (registryInstance)
146
+ return registryInstance;
147
+ registryReady ??= loadRegistry();
148
+ return registryReady;
149
+ }
150
+ // ---------------------------------------------------------------------------
151
+ // Tool handlers
152
+ // ---------------------------------------------------------------------------
153
+ async function callTool(name, args) {
154
+ const reg = await getRegistry();
155
+ switch (name) {
156
+ case "kosha_query_models": {
157
+ const models = reg.models({
158
+ provider: args.provider,
159
+ mode: args.mode,
160
+ capability: args.capability,
161
+ });
162
+ const limit = typeof args.limit === "number" ? args.limit : 20;
163
+ return models.slice(0, limit).map((m) => ({
164
+ id: m.id,
165
+ provider: m.provider,
166
+ name: m.name,
167
+ mode: m.mode,
168
+ contextWindow: m.contextWindow,
169
+ capabilities: m.capabilities,
170
+ pricing: m.pricing ?? null,
171
+ }));
172
+ }
173
+ case "kosha_cheapest_model": {
174
+ const minContext = typeof args.min_context_k === "number" ? args.min_context_k * 1_000 : undefined;
175
+ const result = reg.cheapestModels({
176
+ mode: "chat",
177
+ capability: args.capability,
178
+ provider: args.provider,
179
+ limit: typeof args.limit === "number" ? args.limit : 5,
180
+ });
181
+ const matches = minContext
182
+ ? result.matches.filter((m) => m.model.contextWindow >= minContext)
183
+ : result.matches;
184
+ return {
185
+ matches: matches.map((m) => ({
186
+ id: m.model.id,
187
+ provider: m.model.provider,
188
+ name: m.model.name,
189
+ contextWindow: m.model.contextWindow,
190
+ pricing: m.model.pricing ?? null,
191
+ score: m.score,
192
+ priceMetric: m.priceMetric,
193
+ })),
194
+ missingCredentials: result.missingCredentials.map((c) => c.providerId),
195
+ };
196
+ }
197
+ case "kosha_model_detail": {
198
+ const model = reg.model(args.model);
199
+ if (!model)
200
+ return { error: `model '${args.model}' not found` };
201
+ const provider = reg.provider(model.provider);
202
+ return {
203
+ ...model,
204
+ baseUrl: provider?.baseUrl,
205
+ authenticated: provider?.authenticated ?? false,
206
+ };
207
+ }
208
+ case "kosha_model_routes": {
209
+ const routes = reg.modelRouteInfo(args.model);
210
+ if (routes.length === 0)
211
+ return { error: `model '${args.model}' not found` };
212
+ return routes.map((r) => ({
213
+ provider: r.provider,
214
+ modelId: r.model.id,
215
+ baseUrl: r.baseUrl,
216
+ isDirect: r.isDirect,
217
+ isPreferred: r.isPreferred,
218
+ pricing: r.model.pricing ?? null,
219
+ originPricing: r.model.originPricing ?? null,
220
+ }));
221
+ }
222
+ case "kosha_resolve_alias": {
223
+ const resolved = reg.resolve(args.alias);
224
+ const model = reg.model(resolved);
225
+ return {
226
+ alias: args.alias,
227
+ resolved,
228
+ isAlias: resolved !== args.alias,
229
+ provider: model?.provider ?? null,
230
+ name: model?.name ?? null,
231
+ };
232
+ }
233
+ case "kosha_provider_health": {
234
+ const providers = reg.providers_list();
235
+ const errors = reg.discoveryErrors();
236
+ const errorByProvider = new Map(errors.map((e) => [e.providerId, e.error]));
237
+ const list = args.provider
238
+ ? providers.filter((p) => p.id === args.provider)
239
+ : providers;
240
+ return list.map((p) => ({
241
+ id: p.id,
242
+ name: p.name,
243
+ authenticated: p.authenticated,
244
+ credentialSource: p.credentialSource ?? null,
245
+ modelCount: p.models.length,
246
+ lastRefreshed: p.lastRefreshed ?? null,
247
+ lastError: errorByProvider.get(p.id) ?? null,
248
+ }));
249
+ }
250
+ case "kosha_context_strategy": {
251
+ const modelId = args.model;
252
+ if (!modelId)
253
+ return { error: "model is required" };
254
+ const currentTokens = typeof args.current_tokens === "number" ? args.current_tokens : undefined;
255
+ if (currentTokens === undefined || currentTokens < 0) {
256
+ return { error: "current_tokens must be a non-negative number" };
257
+ }
258
+ const model = reg.model(modelId);
259
+ if (!model)
260
+ return { error: `model '${modelId}' not found` };
261
+ const candidates = reg
262
+ .cheapestModels({ mode: "chat", limit: 20 })
263
+ .matches.map((m) => m.model);
264
+ return computeContextStrategy({
265
+ model,
266
+ currentTokens,
267
+ expectedRemainingTurns: typeof args.expected_remaining_turns === "number" ? args.expected_remaining_turns : undefined,
268
+ expectedOutputTokens: typeof args.expected_output_tokens === "number" ? args.expected_output_tokens : undefined,
269
+ candidateAlternatives: candidates,
270
+ });
271
+ }
272
+ default:
273
+ throw new Error(`unknown tool: ${name}`);
274
+ }
275
+ }
276
+ // ---------------------------------------------------------------------------
277
+ // Stdio JSON-RPC loop
278
+ // ---------------------------------------------------------------------------
279
+ function send(msg) {
280
+ process.stdout.write(`${JSON.stringify(msg)}\n`);
281
+ }
282
+ function respond(id, result) {
283
+ send({ jsonrpc: "2.0", id: id ?? null, result });
284
+ }
285
+ function respondError(id, code, message) {
286
+ send({ jsonrpc: "2.0", id: id ?? null, error: { code, message } });
287
+ }
288
+ async function handleMessage(msg) {
289
+ const { id, method, params } = msg;
290
+ // Notifications carry no id — no response expected.
291
+ if (!method || method.startsWith("notifications/"))
292
+ return;
293
+ switch (method) {
294
+ case "initialize":
295
+ respond(id, {
296
+ protocolVersion: "2024-11-05",
297
+ capabilities: { tools: {} },
298
+ serverInfo: { name: "kosha", version: "1.0.0" },
299
+ });
300
+ return;
301
+ case "tools/list":
302
+ respond(id, { tools: TOOLS });
303
+ return;
304
+ case "tools/call": {
305
+ const { name, arguments: args = {} } = params;
306
+ try {
307
+ const result = await callTool(name, args);
308
+ respond(id, { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] });
309
+ }
310
+ catch (err) {
311
+ const message = err instanceof Error ? err.message : String(err);
312
+ respondError(id, -32603, message);
313
+ }
314
+ return;
315
+ }
316
+ default:
317
+ respondError(id, -32601, `method not found: ${method}`);
318
+ }
319
+ }
320
+ let buffer = "";
321
+ process.stdin.setEncoding("utf-8");
322
+ process.stdin.on("data", (chunk) => {
323
+ buffer += chunk;
324
+ const lines = buffer.split("\n");
325
+ buffer = lines.pop() ?? "";
326
+ for (const line of lines) {
327
+ const trimmed = line.trim();
328
+ if (!trimmed)
329
+ continue;
330
+ try {
331
+ handleMessage(JSON.parse(trimmed)).catch((err) => {
332
+ process.stderr.write(`[kosha-mcp] ${err}\n`);
333
+ });
334
+ }
335
+ catch {
336
+ // malformed JSON — ignore
337
+ }
338
+ }
339
+ });
340
+ process.stdin.on("end", () => process.exit(0));
341
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@
6
6
  * versioned schema do not drift apart.
7
7
  * @module
8
8
  */
9
- import type { KoshaConfig, ProviderOrigin, ProviderTransport } from "./types.js";
9
+ import type { KoshaConfig, ProviderCacheBehavior, ProviderOrigin, ProviderTransport } from "./types.js";
10
10
  /**
11
11
  * Stable provider descriptor used by normalization and v1 schema emission.
12
12
  */
@@ -27,10 +27,14 @@ export interface ProviderDescriptor {
27
27
  transport: ProviderTransport;
28
28
  /** Default base URL used by the built-in discoverer. */
29
29
  defaultBaseUrl: string;
30
- /** Whether the provider normally requires credentials. */
30
+ /** Whether model discovery normally requires credentials. */
31
31
  credentialRequired: boolean;
32
+ /** Whether execution/model requests require credentials; defaults to `credentialRequired`. */
33
+ executionCredentialRequired?: boolean;
32
34
  /** Environment variables that satisfy the provider credential requirement. */
33
35
  credentialEnvVars: string[];
36
+ /** The single env var that `fallbackRegistryCredential` reads for this provider. */
37
+ primaryCredentialEnvVar?: string;
34
38
  /**
35
39
  * Minimum prompt-prefix size (in tokens) required for the provider's prompt
36
40
  * cache to engage. Only set when the provider publishes a documented floor.
@@ -38,6 +42,12 @@ export interface ProviderDescriptor {
38
42
  * consumer should fall back to its own conservative default in that case.
39
43
  */
40
44
  minCachePrefixTokens?: number;
45
+ /**
46
+ * Prompt-cache TTL semantics for the provider. Undefined means the policy
47
+ * has not been curated yet — distinct from `{ mode: "none" }` which asserts
48
+ * the provider documents no prompt cache.
49
+ */
50
+ cacheBehavior?: ProviderCacheBehavior;
41
51
  }
42
52
  /**
43
53
  * Canonical provider catalog.
@@ -62,6 +72,13 @@ export declare function listProviderDescriptors(): ProviderDescriptor[];
62
72
  * Read provider config using canonical IDs and accepted aliases.
63
73
  */
64
74
  export declare function getProviderConfig(config: KoshaConfig | undefined, providerId: string | undefined): NonNullable<KoshaConfig["providers"]>[string] | undefined;
75
+ /** Return true when model execution through this provider needs auth. */
76
+ export declare function providerExecutionCredentialRequired(descriptor: Pick<ProviderDescriptor, "credentialRequired" | "executionCredentialRequired">): boolean;
77
+ /**
78
+ * Return the curated prompt-cache behavior for a provider, or `undefined`
79
+ * if the policy has not been curated yet.
80
+ */
81
+ export declare function getProviderCacheBehavior(providerId: string | undefined): ProviderCacheBehavior | undefined;
65
82
  /**
66
83
  * True when the provider is a local runtime.
67
84
  */
@@ -1 +1 @@
1
- {"version":3,"file":"provider-catalog.d.ts","sourceRoot":"","sources":["../src/provider-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEjF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,MAAM,EAAE,cAAc,CAAC;IACvB,qDAAqD;IACrD,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,SAAS,EAAE,iBAAiB,CAAC;IAC7B,wDAAwD;IACxD,cAAc,EAAE,MAAM,CAAC;IACvB,0DAA0D;IAC1D,kBAAkB,EAAE,OAAO,CAAC;IAC5B,8EAA8E;IAC9E,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,kBAAkB,EA6QhD,CAAC;AAWX;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGtF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,kBAAkB,GAAG,SAAS,CAGpG;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,kBAAkB,EAAE,CAE9D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC5B,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,CAW3D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEvE"}
1
+ {"version":3,"file":"provider-catalog.d.ts","sourceRoot":"","sources":["../src/provider-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAExG;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,MAAM,EAAE,cAAc,CAAC;IACvB,qDAAqD;IACrD,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,SAAS,EAAE,iBAAiB,CAAC;IAC7B,wDAAwD;IACxD,cAAc,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,kBAAkB,EAAE,OAAO,CAAC;IAC5B,8FAA8F;IAC9F,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,8EAA8E;IAC9E,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,oFAAoF;IACpF,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,aAAa,CAAC,EAAE,qBAAqB,CAAC;CACtC;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,kBAAkB,EA0WhD,CAAC;AAWX;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGtF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,kBAAkB,GAAG,SAAS,CAGpG;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,kBAAkB,EAAE,CAE9D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC5B,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,CAW3D;AAED,yEAAyE;AACzE,wBAAgB,mCAAmC,CAClD,UAAU,EAAE,IAAI,CAAC,kBAAkB,EAAE,oBAAoB,GAAG,6BAA6B,CAAC,GACxF,OAAO,CAET;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,qBAAqB,GAAG,SAAS,CAE1G;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEvE"}