@nac3/forge-cli 1.0.29 → 1.0.31

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 (68) hide show
  1. package/dist/bin/yf.d.ts.map +1 -1
  2. package/dist/bin/yf.js +5 -0
  3. package/dist/bin/yf.js.map +1 -1
  4. package/dist/chat/claude.d.ts +13 -0
  5. package/dist/chat/claude.d.ts.map +1 -1
  6. package/dist/chat/claude.js +18 -5
  7. package/dist/chat/claude.js.map +1 -1
  8. package/dist/chat/claude_cli.d.ts.map +1 -1
  9. package/dist/chat/claude_cli.js +10 -0
  10. package/dist/chat/claude_cli.js.map +1 -1
  11. package/dist/chat/panel.d.ts.map +1 -1
  12. package/dist/chat/panel.js +111 -10
  13. package/dist/chat/panel.js.map +1 -1
  14. package/dist/chat/server.d.ts.map +1 -1
  15. package/dist/chat/server.js +35 -2
  16. package/dist/chat/server.js.map +1 -1
  17. package/dist/commands/federation.d.ts +17 -0
  18. package/dist/commands/federation.d.ts.map +1 -0
  19. package/dist/commands/federation.js +145 -0
  20. package/dist/commands/federation.js.map +1 -0
  21. package/dist/core/brain_capabilities.d.ts +64 -0
  22. package/dist/core/brain_capabilities.d.ts.map +1 -0
  23. package/dist/core/brain_capabilities.js +119 -0
  24. package/dist/core/brain_capabilities.js.map +1 -0
  25. package/dist/core/brain_config.d.ts +1 -1
  26. package/dist/core/brain_config.d.ts.map +1 -1
  27. package/dist/core/brain_config.js +7 -0
  28. package/dist/core/brain_config.js.map +1 -1
  29. package/dist/core/cost_router.d.ts +6 -0
  30. package/dist/core/cost_router.d.ts.map +1 -1
  31. package/dist/core/cost_router.js +122 -8
  32. package/dist/core/cost_router.js.map +1 -1
  33. package/dist/core/federation_config.d.ts +17 -0
  34. package/dist/core/federation_config.d.ts.map +1 -0
  35. package/dist/core/federation_config.js +77 -0
  36. package/dist/core/federation_config.js.map +1 -0
  37. package/dist/core/provider_keys.d.ts +1 -1
  38. package/dist/core/provider_keys.d.ts.map +1 -1
  39. package/dist/core/provider_keys.js +3 -0
  40. package/dist/core/provider_keys.js.map +1 -1
  41. package/dist/core/provider_models.d.ts.map +1 -1
  42. package/dist/core/provider_models.js +10 -0
  43. package/dist/core/provider_models.js.map +1 -1
  44. package/dist/llm/federation_client.d.ts +66 -0
  45. package/dist/llm/federation_client.d.ts.map +1 -0
  46. package/dist/llm/federation_client.js +166 -0
  47. package/dist/llm/federation_client.js.map +1 -0
  48. package/dist/llm/federation_host.d.ts +16 -0
  49. package/dist/llm/federation_host.d.ts.map +1 -0
  50. package/dist/llm/federation_host.js +132 -0
  51. package/dist/llm/federation_host.js.map +1 -0
  52. package/dist/llm/gemini_client.d.ts.map +1 -1
  53. package/dist/llm/gemini_client.js +15 -6
  54. package/dist/llm/gemini_client.js.map +1 -1
  55. package/dist/llm/multi_provider_client.d.ts.map +1 -1
  56. package/dist/llm/multi_provider_client.js +27 -0
  57. package/dist/llm/multi_provider_client.js.map +1 -1
  58. package/dist/llm/openai_client.d.ts +4 -0
  59. package/dist/llm/openai_client.d.ts.map +1 -1
  60. package/dist/llm/openai_client.js +18 -6
  61. package/dist/llm/openai_client.js.map +1 -1
  62. package/dist/llm/single_step.d.ts +63 -0
  63. package/dist/llm/single_step.d.ts.map +1 -0
  64. package/dist/llm/single_step.js +171 -0
  65. package/dist/llm/single_step.js.map +1 -0
  66. package/dist/version.d.ts +1 -1
  67. package/dist/version.js +1 -1
  68. package/package.json +1 -1
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `yf federation` CLI -- F4 brain federation, child side (2026-06-20).
3
+ *
4
+ * yf federation join <token> -- redeem a parent's pairing token; from now
5
+ * on every turn uses the PARENT's brain.
6
+ * yf federation status -- show the current federation link.
7
+ * yf federation leave -- stop using the parent's brain (local again).
8
+ *
9
+ * The parent issues the token with `yf federation invite` (Slice 3). The pairing
10
+ * is single-use; the per-link signing key is derived server-side (HKDF) and
11
+ * stored in the vault. The parent's brain keys never leave the parent.
12
+ *
13
+ * ASCII-only.
14
+ */
15
+ import type { Command } from 'commander';
16
+ export declare function registerFederationCommand(program: Command): void;
17
+ //# sourceMappingURL=federation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation.d.ts","sourceRoot":"","sources":["../../src/commands/federation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6HhE"}
@@ -0,0 +1,145 @@
1
+ import { HITO4_BASE_URL, signBearer } from '../license/hito4_client.js';
2
+ import { readFederationConfig, writeFederationConfig, clearFederationConfig, setFederationKey, getFederationKey, } from '../core/federation_config.js';
3
+ import { resolveParentAuth, runFederationHost } from '../llm/federation_host.js';
4
+ function maskHandle(fedHandle) {
5
+ /* fed:<parent>:<child_id> -> fed:<parent>:<first6>... */
6
+ const i = fedHandle.lastIndexOf(':');
7
+ if (i < 0)
8
+ return fedHandle;
9
+ return fedHandle.slice(0, i + 1) + fedHandle.slice(i + 1, i + 7) + '...';
10
+ }
11
+ export function registerFederationCommand(program) {
12
+ const fed = program.command('federation')
13
+ .description('Brain federation: use a remote parent Forge\'s brain (child side).');
14
+ fed.command('join <token>')
15
+ .description('Redeem a parent pairing token and route all turns to its brain.')
16
+ .option('--base-url <url>', 'Override the federation broker base URL.', HITO4_BASE_URL)
17
+ .action(async (token, opts) => {
18
+ const baseUrl = (opts.baseUrl || HITO4_BASE_URL).replace(/\/+$/, '');
19
+ let res;
20
+ try {
21
+ res = await fetch(baseUrl + '/v1/federation/redeem', {
22
+ method: 'POST', headers: { 'content-type': 'application/json' },
23
+ body: JSON.stringify({ token: token.trim() }),
24
+ });
25
+ }
26
+ catch (e) {
27
+ console.error('No pude contactar el broker: ' + (e instanceof Error ? e.message : String(e)));
28
+ process.exitCode = 1;
29
+ return;
30
+ }
31
+ const j = await res.json().catch(() => ({}));
32
+ if (!res.ok || !j.ok || !j.fed_handle || !j.fed_key || !j.parent_handle) {
33
+ console.error('No pude unirme: ' + (j.error || ('HTTP ' + res.status)) +
34
+ (res.status === 400 ? ' (token invalido o expirado)' : ''));
35
+ process.exitCode = 1;
36
+ return;
37
+ }
38
+ await setFederationKey(j.fed_key);
39
+ await writeFederationConfig({
40
+ active: true,
41
+ parent_handle: j.parent_handle,
42
+ fed_handle: j.fed_handle,
43
+ base_url: baseUrl,
44
+ joined_at: new Date().toISOString(),
45
+ });
46
+ console.log('Federado a ' + j.parent_handle + '.');
47
+ console.log('Desde ahora cada turno usa el brain del padre (tu codigo se ejecuta local).');
48
+ console.log('Para volver a tu brain local: yf federation leave');
49
+ });
50
+ fed.command('status')
51
+ .description('Show the current federation link.')
52
+ .action(async () => {
53
+ const cfg = await readFederationConfig();
54
+ if (!cfg) {
55
+ console.log('No estas federado. Usa: yf federation join <token>');
56
+ return;
57
+ }
58
+ const hasKey = (await getFederationKey()) !== null;
59
+ console.log(JSON.stringify({
60
+ active: cfg.active,
61
+ parent_handle: cfg.parent_handle,
62
+ fed_handle: maskHandle(cfg.fed_handle),
63
+ base_url: cfg.base_url,
64
+ joined_at: cfg.joined_at,
65
+ key_present: hasKey,
66
+ }, null, 2));
67
+ if (!hasKey)
68
+ console.log('\nAVISO: falta la clave en el vault. Re-corre: yf federation join <token>');
69
+ });
70
+ fed.command('leave')
71
+ .description('Stop using the parent brain; route turns to the local brain again.')
72
+ .action(async () => {
73
+ const cfg = await readFederationConfig();
74
+ if (!cfg) {
75
+ console.log('No estabas federado.');
76
+ return;
77
+ }
78
+ await clearFederationConfig();
79
+ console.log('Saliste de la federacion con ' + cfg.parent_handle + '. Volves a tu brain local.');
80
+ });
81
+ /* --- Parent side --- */
82
+ fed.command('invite')
83
+ .description('PARENT: mint a single-use token to lend your brain to a child.')
84
+ .option('--ttl <seconds>', 'Token lifetime in seconds (default 1800, max 86400).')
85
+ .option('--base-url <url>', 'Override the federation broker base URL.', HITO4_BASE_URL)
86
+ .action(async (opts) => {
87
+ const auth = await resolveParentAuth();
88
+ if (!auth) {
89
+ console.error('Necesitas un handle provisto (license.json + clave en el vault). Activa tu licencia primero.');
90
+ process.exitCode = 1;
91
+ return;
92
+ }
93
+ const baseUrl = (opts.baseUrl || HITO4_BASE_URL).replace(/\/+$/, '');
94
+ const body = {};
95
+ if (opts.ttl && Number.isFinite(Number(opts.ttl)))
96
+ body.ttl_seconds = Number(opts.ttl);
97
+ let res;
98
+ try {
99
+ res = await fetch(baseUrl + '/v1/federation/invite', {
100
+ method: 'POST',
101
+ headers: {
102
+ 'authorization': 'Bearer ' + signBearer(auth.secret, auth.handle),
103
+ 'x-yf-user-handle': auth.handle,
104
+ 'content-type': 'application/json',
105
+ },
106
+ body: JSON.stringify(body),
107
+ });
108
+ }
109
+ catch (e) {
110
+ console.error('No pude contactar el broker: ' + (e instanceof Error ? e.message : String(e)));
111
+ process.exitCode = 1;
112
+ return;
113
+ }
114
+ const j = await res.json().catch(() => ({}));
115
+ if (!res.ok || !j.ok || !j.token) {
116
+ console.error('No pude crear el token: ' + (j.error || ('HTTP ' + res.status)));
117
+ process.exitCode = 1;
118
+ return;
119
+ }
120
+ console.log('Token de federacion (un solo uso, vence en ' + (j.expires_in ?? 1800) + 's):\n');
121
+ console.log(' ' + j.token + '\n');
122
+ console.log('Compartilo con el hijo. En su maquina: yf federation join ' + j.token);
123
+ console.log('Y deja corriendo en ESTA maquina: yf federation host');
124
+ });
125
+ fed.command('host')
126
+ .description('PARENT: run the loop that answers federated children with your brain.')
127
+ .option('--interval <ms>', 'Poll interval in ms (default 1500).')
128
+ .option('--base-url <url>', 'Override the federation broker base URL.', HITO4_BASE_URL)
129
+ .action(async (opts) => {
130
+ const controller = new AbortController();
131
+ process.on('SIGINT', () => { console.log('\nParando host...'); controller.abort(); });
132
+ try {
133
+ await runFederationHost({
134
+ baseUrl: opts.baseUrl,
135
+ intervalMs: opts.interval ? Number(opts.interval) : undefined,
136
+ signal: controller.signal,
137
+ });
138
+ }
139
+ catch (e) {
140
+ console.error(e instanceof Error ? e.message : String(e));
141
+ process.exitCode = 1;
142
+ }
143
+ });
144
+ }
145
+ //# sourceMappingURL=federation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation.js","sourceRoot":"","sources":["../../src/commands/federation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Yujin Forge -- brain capability classification.
3
+ *
4
+ * Front 1 (multimodality, 2026-06-20). Until now no provider/model
5
+ * carried capability metadata; the whole BYOK/API chat path was
6
+ * text-only, so "analizame esta imagen" failed on Console + most
7
+ * keys (the model replied "no puedo"). This module is the single
8
+ * source of truth for "can this (provider, model) accept images?"
9
+ * so the cost router can auto-route multimodal turns to a brain
10
+ * that actually supports vision, and the chat server can fall back
11
+ * with a clear message when none is available.
12
+ *
13
+ * Pure + IO-free on purpose: capability is a static property of the
14
+ * model id. "Which available provider HAS a key/plan" is a separate
15
+ * concern that lives in the cost router (it needs the vault).
16
+ */
17
+ import type { BrainProvider } from './brain_config.js';
18
+ /**
19
+ * One image attachment carried alongside a chat message. base64 is
20
+ * the canonical wire form (data URLs are stripped to {media_type,
21
+ * data} before this point). Kept here -- the neutral core -- so both
22
+ * the chat clients (src/chat, src/llm) and the router can import the
23
+ * type without a chat<->core cycle.
24
+ */
25
+ export interface ImageAttachment {
26
+ /** MIME type, e.g. 'image/png', 'image/jpeg', 'image/webp', 'image/gif'. */
27
+ media_type: string;
28
+ /** Raw base64 of the image bytes -- NO `data:...;base64,` prefix. */
29
+ data: string;
30
+ /** Optional human label (filename) for the action trace / logs. */
31
+ name?: string;
32
+ }
33
+ /** MIME types every vision-capable provider in our v1 set accepts. */
34
+ export declare const SUPPORTED_IMAGE_MEDIA_TYPES: readonly string[];
35
+ /**
36
+ * Does this (provider, model) pair accept image input?
37
+ *
38
+ * Conservative by design: returns true only for model families we
39
+ * know are multimodal and whose client we have wired to format
40
+ * images. An unknown model id => false (so the router keeps looking
41
+ * for a known-good vision brain rather than sending images to a text
42
+ * model that will refuse).
43
+ */
44
+ export declare function isVisionCapable(provider: BrainProvider, model: string): boolean;
45
+ /**
46
+ * Count image attachments across a set of chat turns. Structurally
47
+ * typed (no ChatMessage import) so it stays in the IO-free core.
48
+ */
49
+ export declare function countImageAttachments(messages: ReadonlyArray<{
50
+ attachments?: ReadonlyArray<unknown> | null;
51
+ }>): number;
52
+ /**
53
+ * Validate + normalize a raw `attachments` payload from a chat
54
+ * request into ImageAttachment[]. Accepts several shapes a client
55
+ * might send: {media_type|mime, data|base64} or a full data URL in
56
+ * {url|data_url|data}. Strips the `data:...;base64,` prefix, maps
57
+ * image/jpg -> image/jpeg, drops anything not in the supported set
58
+ * or over the size cap. Never throws.
59
+ */
60
+ export declare function parseImageAttachments(raw: unknown): ImageAttachment[];
61
+ /** The fallback shown when a multimodal turn arrives but no configured
62
+ * brain can do vision (no key/plan on any vision provider). */
63
+ export declare const NO_VISION_BRAIN_MESSAGE: string;
64
+ //# sourceMappingURL=brain_capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain_capabilities.d.ts","sourceRoot":"","sources":["../../src/core/brain_capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,sEAAsE;AACtE,eAAO,MAAM,2BAA2B,EAAE,SAAS,MAAM,EAKxD,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAmC/E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,aAAa,CAAC;IAAE,WAAW,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;CAAE,CAAC,GACvE,MAAM,CAMR;AAOD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe,EAAE,CA8BrE;AAED;gEACgE;AAChE,eAAO,MAAM,uBAAuB,QAG4C,CAAC"}
@@ -0,0 +1,119 @@
1
+ /** MIME types every vision-capable provider in our v1 set accepts. */
2
+ export const SUPPORTED_IMAGE_MEDIA_TYPES = [
3
+ 'image/png',
4
+ 'image/jpeg',
5
+ 'image/webp',
6
+ 'image/gif',
7
+ ];
8
+ /**
9
+ * Does this (provider, model) pair accept image input?
10
+ *
11
+ * Conservative by design: returns true only for model families we
12
+ * know are multimodal and whose client we have wired to format
13
+ * images. An unknown model id => false (so the router keeps looking
14
+ * for a known-good vision brain rather than sending images to a text
15
+ * model that will refuse).
16
+ */
17
+ export function isVisionCapable(provider, model) {
18
+ const m = (model || '').toLowerCase();
19
+ switch (provider) {
20
+ case 'anthropic':
21
+ /* Every shipping Claude (3.x / 4.x: opus, sonnet, haiku)
22
+ * accepts images on /v1/messages. */
23
+ return /claude/.test(m);
24
+ case 'openai':
25
+ /* gpt-4o family, gpt-4.1 family, gpt-4-turbo (vision), and the
26
+ * o-series reasoning models with vision. Excludes 3.5. */
27
+ return /gpt-4o|gpt-4\.1|gpt-4-turbo|^o[134]\b|^o[134]-/.test(m);
28
+ case 'google_ai':
29
+ /* Gemini 1.5 and 2.x are natively multimodal. */
30
+ return /gemini-(1\.5|2|3)/.test(m) || /gemini-(pro|flash)/.test(m);
31
+ case 'xai':
32
+ /* Grok vision variants (grok-2-vision, grok-4). */
33
+ return /vision|grok-4/.test(m);
34
+ case 'mistral':
35
+ /* Pixtral is Mistral's vision model. */
36
+ return /pixtral/.test(m);
37
+ case 'ollama':
38
+ /* Open-weight vision models the user can pull. Default text
39
+ * models (llama3.1, qwen2.5) are NOT vision. */
40
+ return /llava|llama3\.2-vision|moondream|bakllava|minicpm-v|qwen2\.5-?vl/.test(m);
41
+ case 'yujin_managed':
42
+ /* The managed proxy picks the model server-side; assume the
43
+ * server routes vision turns to a capable model + validates. */
44
+ return true;
45
+ case 'deepseek':
46
+ case 'cohere':
47
+ /* No vision endpoint wired for these. */
48
+ return false;
49
+ default:
50
+ return false;
51
+ }
52
+ }
53
+ /**
54
+ * Count image attachments across a set of chat turns. Structurally
55
+ * typed (no ChatMessage import) so it stays in the IO-free core.
56
+ */
57
+ export function countImageAttachments(messages) {
58
+ let n = 0;
59
+ for (const m of messages) {
60
+ if (m && Array.isArray(m.attachments))
61
+ n += m.attachments.length;
62
+ }
63
+ return n;
64
+ }
65
+ /** Defensive caps so a malformed / hostile client cannot blow up a
66
+ * turn with hundreds of huge images. ~6MB of bytes per image. */
67
+ const MAX_ATTACHMENTS = 8;
68
+ const MAX_B64_LEN = 8 * 1024 * 1024;
69
+ /**
70
+ * Validate + normalize a raw `attachments` payload from a chat
71
+ * request into ImageAttachment[]. Accepts several shapes a client
72
+ * might send: {media_type|mime, data|base64} or a full data URL in
73
+ * {url|data_url|data}. Strips the `data:...;base64,` prefix, maps
74
+ * image/jpg -> image/jpeg, drops anything not in the supported set
75
+ * or over the size cap. Never throws.
76
+ */
77
+ export function parseImageAttachments(raw) {
78
+ if (!Array.isArray(raw))
79
+ return [];
80
+ const out = [];
81
+ for (const item of raw) {
82
+ if (out.length >= MAX_ATTACHMENTS)
83
+ break;
84
+ if (!item || typeof item !== 'object')
85
+ continue;
86
+ const o = item;
87
+ let data = typeof o['data'] === 'string' ? o['data']
88
+ : typeof o['base64'] === 'string' ? o['base64']
89
+ : '';
90
+ let media = typeof o['media_type'] === 'string' ? o['media_type']
91
+ : typeof o['mime'] === 'string' ? o['mime']
92
+ : '';
93
+ const url = typeof o['url'] === 'string' ? o['url']
94
+ : typeof o['data_url'] === 'string' ? o['data_url']
95
+ : '';
96
+ const src = url || data;
97
+ const dm = /^data:([^;,]+);base64,(.*)$/s.exec(src);
98
+ if (dm) {
99
+ media = media || (dm[1] ?? '');
100
+ data = dm[2] ?? '';
101
+ }
102
+ if (!data || data.length > MAX_B64_LEN)
103
+ continue;
104
+ media = (media || 'image/png').toLowerCase().trim();
105
+ if (media === 'image/jpg')
106
+ media = 'image/jpeg';
107
+ if (!SUPPORTED_IMAGE_MEDIA_TYPES.includes(media))
108
+ continue;
109
+ const name = typeof o['name'] === 'string' ? o['name'].slice(0, 120) : undefined;
110
+ out.push(name ? { media_type: media, data, name } : { media_type: media, data });
111
+ }
112
+ return out;
113
+ }
114
+ /** The fallback shown when a multimodal turn arrives but no configured
115
+ * brain can do vision (no key/plan on any vision provider). */
116
+ export const NO_VISION_BRAIN_MESSAGE = 'Para realizar trabajo multimodal necesitas cargar una clave o un plan ' +
117
+ 'en algun brain multimodal (por ejemplo Anthropic/Claude, OpenAI gpt-4o ' +
118
+ 'o Google Gemini). Configuralo con `yf brain config` o en el panel de claves.';
119
+ //# sourceMappingURL=brain_capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain_capabilities.js","sourceRoot":"","sources":["../../src/core/brain_capabilities.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  /** Provider id matches the slot prefix in the vault
2
2
  * (byok_<provider>_api_key). */
3
- export type BrainProvider = 'anthropic' | 'openai' | 'google_ai' | 'deepseek' | 'xai' | 'mistral' | 'cohere' | 'ollama' | 'yujin_managed';
3
+ export type BrainProvider = 'anthropic' | 'openai' | 'google_ai' | 'deepseek' | 'xai' | 'mistral' | 'cohere' | 'qwen' | 'zai' | 'ollama' | 'yujin_managed' | 'federation';
4
4
  export declare const ALL_BRAIN_PROVIDERS: readonly BrainProvider[];
5
5
  /** Vault slot name a given provider stores its key under. The
6
6
  * yujin_managed virtual provider has no client-side key (the
@@ -1 +1 @@
1
- {"version":3,"file":"brain_config.d.ts","sourceRoot":"","sources":["../../src/core/brain_config.ts"],"names":[],"mappings":"AA+BA;iCACiC;AACjC,MAAM,MAAM,aAAa,GACrB,WAAW,GACX,QAAQ,GACR,WAAW,GACX,UAAU,GACV,KAAK,GACL,SAAS,GACT,QAAQ,GAKR,QAAQ,GAMR,eAAe,CAAC;AAEpB,eAAO,MAAM,mBAAmB,EAAE,SAAS,aAAa,EAIvD,CAAC;AAEF;;;;;oDAKoD;AACpD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAc7D;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,GAAG,EAAE,WAAW,CAAC;IACjB,QAAQ,EAAE,WAAW,CAAC;IACtB;oCACgC;IAChC,iBAAiB,EAAE,KAAK,GAAG,UAAU,CAAC;IACtC;;;2DAGuD;IACvD,WAAW,EAAE,OAAO,CAAC;IACrB;;;;;+CAK2C;IAC3C,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC;;;4CAGwC;IACxC,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAgB,kBAAkB,IAAI,WAAW,CAShD;AA0BD,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhD;AAeD,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,CAyB5D;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtE;AAED,gDAAgD;AAChD,wBAAsB,cAAc,CAClC,IAAI,EAAE,KAAK,GAAG,UAAU,EACxB,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,CAAC,CAKtB;AAED,mEAAmE;AACnE,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,KAAK,GAAG,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAKvF;AAED,iCAAiC;AACjC,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC,CAI7D"}
1
+ {"version":3,"file":"brain_config.d.ts","sourceRoot":"","sources":["../../src/core/brain_config.ts"],"names":[],"mappings":"AA+BA;iCACiC;AACjC,MAAM,MAAM,aAAa,GACrB,WAAW,GACX,QAAQ,GACR,WAAW,GACX,UAAU,GACV,KAAK,GACL,SAAS,GACT,QAAQ,GAKR,MAAM,GACN,KAAK,GAKL,QAAQ,GAMR,eAAe,GAMf,YAAY,CAAC;AAEjB,eAAO,MAAM,mBAAmB,EAAE,SAAS,aAAa,EAMvD,CAAC;AAEF;;;;;oDAKoD;AACpD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAmB7D;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,GAAG,EAAE,WAAW,CAAC;IACjB,QAAQ,EAAE,WAAW,CAAC;IACtB;oCACgC;IAChC,iBAAiB,EAAE,KAAK,GAAG,UAAU,CAAC;IACtC;;;2DAGuD;IACvD,WAAW,EAAE,OAAO,CAAC;IACrB;;;;;+CAK2C;IAC3C,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC;;;4CAGwC;IACxC,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAgB,kBAAkB,IAAI,WAAW,CAShD;AA0BD,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhD;AAeD,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,CAyB5D;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtE;AAED,gDAAgD;AAChD,wBAAsB,cAAc,CAClC,IAAI,EAAE,KAAK,GAAG,UAAU,EACxB,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,CAAC,CAKtB;AAED,mEAAmE;AACnE,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,KAAK,GAAG,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAKvF;AAED,iCAAiC;AACjC,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC,CAI7D"}
@@ -30,8 +30,10 @@ import path from 'node:path';
30
30
  import os from 'node:os';
31
31
  export const ALL_BRAIN_PROVIDERS = [
32
32
  'anthropic', 'openai', 'google_ai', 'deepseek', 'xai', 'mistral', 'cohere',
33
+ 'qwen', 'zai',
33
34
  'ollama',
34
35
  'yujin_managed',
36
+ 'federation',
35
37
  ];
36
38
  /** Vault slot name a given provider stores its key under. The
37
39
  * yujin_managed virtual provider has no client-side key (the
@@ -48,10 +50,15 @@ export function vaultSlotForProvider(p) {
48
50
  case 'xai': return 'xai_api_key';
49
51
  case 'mistral': return 'mistral_api_key';
50
52
  case 'cohere': return 'cohere_api_key';
53
+ case 'qwen': return 'qwen_api_key';
54
+ case 'zai': return 'zai_api_key';
51
55
  /* ollama is keyless (local); the slot exists only for the
52
56
  * exhaustive switch -- getKey() will just return null. */
53
57
  case 'ollama': return 'ollama';
54
58
  case 'yujin_managed': return 'yujin_managed';
59
+ /* federation auth uses yf_federation_key (a raw vault slot,
60
+ * read directly by the fed client), not a byok_ slot. */
61
+ case 'federation': return 'yf_federation_key';
55
62
  }
56
63
  }
57
64
  export function defaultBrainConfig() {
@@ -1 +1 @@
1
- {"version":3,"file":"brain_config.js","sourceRoot":"","sources":["../../src/core/brain_config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brain_config.js","sourceRoot":"","sources":["../../src/core/brain_config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAoCzB,MAAM,CAAC,MAAM,mBAAmB,GAA6B;IAC3D,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ;IAC1E,MAAM,EAAE,KAAK;IACb,QAAQ;IACR,eAAe;IACf,YAAY;CACb,CAAC;AAEF;;;;;oDAKoD;AACpD,MAAM,UAAU,oBAAoB,CAAC,CAAgB;IACnD,QAAQ,CAAC,EAAE,CAAC;QACV,KAAK,WAAW,CAAC,CAAO,OAAO,mBAAmB,CAAC;QACnD,KAAK,QAAQ,CAAC,CAAU,OAAO,gBAAgB,CAAC;QAChD,KAAK,WAAW,CAAC,CAAO,OAAO,eAAe,CAAC;QAC/C,KAAK,UAAU,CAAC,CAAQ,OAAO,kBAAkB,CAAC;QAClD,KAAK,KAAK,CAAC,CAAa,OAAO,aAAa,CAAC;QAC7C,KAAK,SAAS,CAAC,CAAS,OAAO,iBAAiB,CAAC;QACjD,KAAK,QAAQ,CAAC,CAAU,OAAO,gBAAgB,CAAC;QAChD,KAAK,MAAM,CAAC,CAAY,OAAO,cAAc,CAAC;QAC9C,KAAK,KAAK,CAAC,CAAa,OAAO,aAAa,CAAC;QAC7C;mEAC2D;QAC3D,KAAK,QAAQ,CAAC,CAAU,OAAO,QAAQ,CAAC;QACxC,KAAK,eAAe,CAAC,CAAG,OAAO,eAAe,CAAC;QAC/C;kEAC0D;QAC1D,KAAK,YAAY,CAAC,CAAM,OAAO,mBAAmB,CAAC;IACrD,CAAC;AACH,CAAC;AAiCD,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,OAAO,EAAE,CAAC;QACV,GAAG,EAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,uBAAuB,EAAE;QACnE,QAAQ,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,iBAAiB,EAAE;QAC7D,iBAAiB,EAAE,UAAU;QAC7B,WAAW,EAAE,IAAI;QACjB,oBAAoB,EAAE,IAAI;KAC3B,CAAC;AACJ,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IACzE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAU;IACnC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAClC,OAAQ,mBAAyC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,EAAoB,CAAC,CAAC,CAAC,IAAI,CAAC;AAChG,CAAC;AAED;;uEAEuE;AACvE,MAAM,iBAAiB,GAA2B;IAChD,iBAAiB,EAAI,iBAAiB;IACtC,iBAAiB,EAAI,iBAAiB;IACtC,iBAAiB,EAAI,iBAAiB;IACtC,mBAAmB,EAAE,mBAAmB;IACxC,mBAAmB,EAAE,mBAAmB;IACxC,kBAAkB,EAAG,2BAA2B;CACjD,CAAC;AAEF,8EAA8E;AAC9E,MAAM,UAAU,cAAc,CAAC,CAAS;IACtC,OAAO,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,oBAAoB,CAAC,CAAU,EAAE,QAAqB;IAC7D,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACjD,MAAM,GAAG,GAAG,CAA4B,CAAC;IACzC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QACvE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;QAClB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;IACnB,OAAO;QACL,QAAQ,EAAE,QAAQ,IAAI,QAAQ,CAAC,QAAQ;QACvC,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QAClD,MAAM,GAAG,GAAgB;YACvB,OAAO,EAAE,CAAC;YACV,GAAG,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;YACzC,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC;YACxD,iBAAiB,EAAE,CAAC,CAAC,CAAC,iBAAiB,KAAK,KAAK,IAAI,CAAC,CAAC,iBAAiB,KAAK,UAAU,CAAC;gBACtF,CAAC,CAAC,CAAC,CAAC,iBAAiB;gBACrB,CAAC,CAAC,GAAG,CAAC,iBAAiB;YACzB;kDACsC;YACtC,WAAW,EAAE,CAAC,CAAC,WAAW,KAAK,KAAK;YACpC,oBAAoB,EAAE,CAAC,CAAC,oBAAoB,KAAK,KAAK;SACvD,CAAC;QACF,IAAI,CAAC,CAAC,cAAc,KAAK,MAAM,IAAI,CAAC,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YAClE,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC;QACxC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;QACjE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAgB;IACrD,MAAM,CAAC,GAAG,eAAe,EAAE,CAAC;IAC5B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC;IACvB,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/D,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAwB,EACxB,QAAuB,EACvB,KAAa;IAEb,MAAM,GAAG,GAAG,MAAM,eAAe,EAAE,CAAC;IACpC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAChC,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAwB;IAC/D,MAAM,GAAG,GAAG,MAAM,eAAe,EAAE,CAAC;IACpC,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAC7B,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iCAAiC;AACjC,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAC;IACjC,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -10,6 +10,12 @@ export interface BrainSelection {
10
10
  reason: string;
11
11
  /** True when the chosen provider is wired at runtime. */
12
12
  runtime_wired: boolean;
13
+ /** Front 1 (multimodality) -- set when the turn carries image
14
+ * attachments but NO vision-capable brain has a key/plan. The
15
+ * chat server short-circuits with NO_VISION_BRAIN_MESSAGE instead
16
+ * of calling the (text-only) model, which would just say "no
17
+ * puedo". The selection fields still echo the would-be brain. */
18
+ multimodal_blocked?: boolean;
13
19
  }
14
20
  /** Inputs the router accepts. All optional. */
15
21
  export interface BrainSelectContext {
@@ -1 +1 @@
1
- {"version":3,"file":"cost_router.d.ts","sourceRoot":"","sources":["../../src/core/cost_router.ts"],"names":[],"mappings":"AA+CA,OAAO,EAEL,KAAK,aAAa,EAAE,KAAK,WAAW,EACrC,MAAM,mBAAmB,CAAC;AAS3B,uCAAuC;AACvC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,KAAK,GAAG,UAAU,CAAC;IACzB,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,+CAA+C;AAC/C,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,aAAa,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;IACnC,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,aAAa,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;IACnC;;;yDAGqD;IACrD,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;;oCAKgC;IAChC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;;;;iCAK6B;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;kBAKkB;AAClB,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAmBvG;AAED;;wCAEwC;AACxC,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAe3I;AAiFD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,WAAW,GAAG;IACrE,IAAI,EAAE,KAAK,GAAG,UAAU,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB,CAOA;AAKD,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,KAAK,GAAG,UAAU,CAAC;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,aAAa,GAAG,IAAI,CAAC;IACjE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAgND;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,GAAE,kBAAuB,GAAG,OAAO,CAAC,cAAc,CAAC,CAuH9F;AAwDD;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGlE"}
1
+ {"version":3,"file":"cost_router.d.ts","sourceRoot":"","sources":["../../src/core/cost_router.ts"],"names":[],"mappings":"AA+CA,OAAO,EAEL,KAAK,aAAa,EAAE,KAAK,WAAW,EACrC,MAAM,mBAAmB,CAAC;AAU3B,uCAAuC;AACvC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,KAAK,GAAG,UAAU,CAAC;IACzB,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,aAAa,EAAE,OAAO,CAAC;IACvB;;;;sEAIkE;IAClE,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,+CAA+C;AAC/C,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,aAAa,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;IACnC,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,aAAa,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;IACnC;;;yDAGqD;IACrD,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;;oCAKgC;IAChC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;;;;iCAK6B;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;kBAKkB;AAClB,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAmBvG;AAED;;wCAEwC;AACxC,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAe3I;AAiFD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,WAAW,GAAG;IACrE,IAAI,EAAE,KAAK,GAAG,UAAU,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB,CAOA;AAKD,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,KAAK,GAAG,UAAU,CAAC;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,aAAa,GAAG,IAAI,CAAC;IACjE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AA4TD;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,GAAE,kBAAuB,GAAG,OAAO,CAAC,cAAc,CAAC,CA8H9F;AAwDD;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGlE"}