@nac3/forge-cli 1.0.29 → 1.0.32

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 (71) 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/brain.d.ts.map +1 -1
  18. package/dist/commands/brain.js +26 -1
  19. package/dist/commands/brain.js.map +1 -1
  20. package/dist/commands/federation.d.ts +17 -0
  21. package/dist/commands/federation.d.ts.map +1 -0
  22. package/dist/commands/federation.js +145 -0
  23. package/dist/commands/federation.js.map +1 -0
  24. package/dist/core/brain_capabilities.d.ts +64 -0
  25. package/dist/core/brain_capabilities.d.ts.map +1 -0
  26. package/dist/core/brain_capabilities.js +127 -0
  27. package/dist/core/brain_capabilities.js.map +1 -0
  28. package/dist/core/brain_config.d.ts +13 -1
  29. package/dist/core/brain_config.d.ts.map +1 -1
  30. package/dist/core/brain_config.js +25 -0
  31. package/dist/core/brain_config.js.map +1 -1
  32. package/dist/core/cost_router.d.ts +6 -0
  33. package/dist/core/cost_router.d.ts.map +1 -1
  34. package/dist/core/cost_router.js +150 -8
  35. package/dist/core/cost_router.js.map +1 -1
  36. package/dist/core/federation_config.d.ts +17 -0
  37. package/dist/core/federation_config.d.ts.map +1 -0
  38. package/dist/core/federation_config.js +77 -0
  39. package/dist/core/federation_config.js.map +1 -0
  40. package/dist/core/provider_keys.d.ts +1 -1
  41. package/dist/core/provider_keys.d.ts.map +1 -1
  42. package/dist/core/provider_keys.js +3 -0
  43. package/dist/core/provider_keys.js.map +1 -1
  44. package/dist/core/provider_models.d.ts.map +1 -1
  45. package/dist/core/provider_models.js +10 -0
  46. package/dist/core/provider_models.js.map +1 -1
  47. package/dist/llm/federation_client.d.ts +66 -0
  48. package/dist/llm/federation_client.d.ts.map +1 -0
  49. package/dist/llm/federation_client.js +166 -0
  50. package/dist/llm/federation_client.js.map +1 -0
  51. package/dist/llm/federation_host.d.ts +16 -0
  52. package/dist/llm/federation_host.d.ts.map +1 -0
  53. package/dist/llm/federation_host.js +132 -0
  54. package/dist/llm/federation_host.js.map +1 -0
  55. package/dist/llm/gemini_client.d.ts.map +1 -1
  56. package/dist/llm/gemini_client.js +15 -6
  57. package/dist/llm/gemini_client.js.map +1 -1
  58. package/dist/llm/multi_provider_client.d.ts.map +1 -1
  59. package/dist/llm/multi_provider_client.js +27 -0
  60. package/dist/llm/multi_provider_client.js.map +1 -1
  61. package/dist/llm/openai_client.d.ts +4 -0
  62. package/dist/llm/openai_client.d.ts.map +1 -1
  63. package/dist/llm/openai_client.js +18 -6
  64. package/dist/llm/openai_client.js.map +1 -1
  65. package/dist/llm/single_step.d.ts +63 -0
  66. package/dist/llm/single_step.d.ts.map +1 -0
  67. package/dist/llm/single_step.js +171 -0
  68. package/dist/llm/single_step.js.map +1 -0
  69. package/dist/version.d.ts +1 -1
  70. package/dist/version.js +1 -1
  71. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../src/commands/brain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqI3D"}
1
+ {"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../src/commands/brain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+J3D"}
@@ -1,4 +1,4 @@
1
- import { readBrainConfig, setTierBinding, setChatDefaultTier, resetBrainConfig, ALL_BRAIN_PROVIDERS, vaultSlotForProvider, } from '../core/brain_config.js';
1
+ import { readBrainConfig, setTierBinding, setChatDefaultTier, setMultimodalBinding, clearMultimodalBinding, resetBrainConfig, ALL_BRAIN_PROVIDERS, vaultSlotForProvider, } from '../core/brain_config.js';
2
2
  import { hasKey } from '../core/provider_keys.js';
3
3
  import { listMapping, tierStats } from '../nac3/verb_tier_map.js';
4
4
  import { setLocalPlanOverride, isPlanSlug, listPlanSlugs, readBudgetStatus, } from '../core/budget.js';
@@ -15,6 +15,9 @@ export function registerBrainCommand(program) {
15
15
  .option('--eco-model <model>', 'Model id for the eco tier (e.g. gemini-2.5-flash-lite).')
16
16
  .option('--frontier-provider <provider>', 'Provider for the frontier tier.')
17
17
  .option('--frontier-model <model>', 'Model id for the frontier tier (e.g. claude-opus-4-8).')
18
+ .option('--multimodal-provider <provider>', 'Provider for image turns (e.g. zai, google_ai). Lets a text brain pair with a vision assistant.')
19
+ .option('--multimodal-model <model>', 'Model id for image turns (e.g. glm-4.5v, gemini-2.5-flash).')
20
+ .option('--multimodal-clear', 'Remove the dedicated multimodal brain (revert to auto vision routing).')
18
21
  .option('--chat-default-tier <tier>', 'Default tier when the router cannot infer (eco | frontier).')
19
22
  .option('--plan <slug>', 'Local plan override (' + listPlanSlugs().join(' | ') + '). Use "clear" to remove.')
20
23
  .option('--reset', 'Reset to factory defaults.')
@@ -48,6 +51,21 @@ export function registerBrainCommand(program) {
48
51
  await setTierBinding('frontier', provider, model);
49
52
  mutated = true;
50
53
  }
54
+ /* Multimodal brain (image turns). */
55
+ if (opts.multimodalClear) {
56
+ await clearMultimodalBinding();
57
+ mutated = true;
58
+ }
59
+ else if (opts.multimodalProvider !== undefined || opts.multimodalModel !== undefined) {
60
+ const cur = await readBrainConfig();
61
+ const provider = opts.multimodalProvider ?? cur.multimodal?.provider ?? cur.frontier.provider;
62
+ const model = opts.multimodalModel ?? cur.multimodal?.model ?? cur.frontier.model;
63
+ if (!isBrainProvider(provider)) {
64
+ throw new Error('--multimodal-provider must be one of: ' + ALL_BRAIN_PROVIDERS.join(', '));
65
+ }
66
+ await setMultimodalBinding(provider, model);
67
+ mutated = true;
68
+ }
51
69
  /* Chat default tier. */
52
70
  if (opts.chatDefaultTier !== undefined) {
53
71
  const t = opts.chatDefaultTier.toLowerCase();
@@ -87,6 +105,13 @@ export function registerBrainCommand(program) {
87
105
  api_key_slot: vaultSlotForProvider(cfg.frontier.provider),
88
106
  api_key_configured: frontierHasKey,
89
107
  },
108
+ multimodal: cfg.multimodal
109
+ ? {
110
+ ...cfg.multimodal,
111
+ api_key_slot: vaultSlotForProvider(cfg.multimodal.provider),
112
+ api_key_configured: await hasKey(vaultSlotForProvider(cfg.multimodal.provider)),
113
+ }
114
+ : null,
90
115
  chat_default_tier: cfg.chat_default_tier,
91
116
  provider_options: ALL_BRAIN_PROVIDERS,
92
117
  plan: {
@@ -1 +1 @@
1
- {"version":3,"file":"brain.js","sourceRoot":"","sources":["../../src/commands/brain.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brain.js","sourceRoot":"","sources":["../../src/commands/brain.ts"],"names":[],"mappings":"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"}
@@ -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":"AAeA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EACL,oBAAoB,EAAE,qBAAqB,EAAE,qBAAqB,EAClE,gBAAgB,EAAE,gBAAgB,GACnC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEjF,SAAS,UAAU,CAAC,SAAiB;IACnC,yDAAyD;IACzD,MAAM,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5B,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC;SACtC,WAAW,CAAC,oEAAoE,CAAC,CAAC;IAErF,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC;SACxB,WAAW,CAAC,iEAAiE,CAAC;SAC9E,MAAM,CAAC,kBAAkB,EAAE,0CAA0C,EAAE,cAAc,CAAC;SACtF,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAAyB,EAAE,EAAE;QACzD,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACrE,IAAI,GAAa,CAAC;QAClB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,GAAG,uBAAuB,EAAE;gBACnD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/D,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;aAC9C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,+BAA+B,GAAG,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YAAC,OAAO;QAC/B,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAE1C,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;YACxE,OAAO,CAAC,KAAK,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;gBACpE,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YAAC,OAAO;QAC/B,CAAC;QACD,MAAM,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,qBAAqB,CAAC;YAC1B,MAAM,EAAE,IAAI;YACZ,aAAa,EAAE,CAAC,CAAC,aAAa;YAC9B,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,QAAQ,EAAE,OAAO;YACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEL,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;SAClB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,GAAG,GAAG,MAAM,oBAAoB,EAAE,CAAC;QACzC,IAAI,CAAC,GAAG,EAAE,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACxF,MAAM,MAAM,GAAG,CAAC,MAAM,gBAAgB,EAAE,CAAC,KAAK,IAAI,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;YACzB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;YACtC,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,WAAW,EAAE,MAAM;SACpB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACb,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;IACxG,CAAC,CAAC,CAAC;IAEL,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;SACjB,WAAW,CAAC,oEAAoE,CAAC;SACjF,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,GAAG,GAAG,MAAM,oBAAoB,EAAE,CAAC;QACzC,IAAI,CAAC,GAAG,EAAE,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC1D,MAAM,qBAAqB,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,+BAA+B,GAAG,GAAG,CAAC,aAAa,GAAG,4BAA4B,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;IAEL,yBAAyB;IAEzB,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;SAClB,WAAW,CAAC,gEAAgE,CAAC;SAC7E,MAAM,CAAC,iBAAiB,EAAE,sDAAsD,CAAC;SACjF,MAAM,CAAC,kBAAkB,EAAE,0CAA0C,EAAE,cAAc,CAAC;SACtF,MAAM,CAAC,KAAK,EAAE,IAAuC,EAAE,EAAE;QACxD,MAAM,IAAI,GAAG,MAAM,iBAAiB,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,8FAA8F,CAAC,CAAC;YAC9G,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YAAC,OAAO;QAC/B,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACrE,MAAM,IAAI,GAA4B,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvF,IAAI,GAAa,CAAC;QAClB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,GAAG,uBAAuB,EAAE;gBACnD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,eAAe,EAAE,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;oBACjE,kBAAkB,EAAE,IAAI,CAAC,MAAM;oBAC/B,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC3B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,+BAA+B,GAAG,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YAAC,OAAO;QAC/B,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAA0E,CAAC;QACtH,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YACjC,OAAO,CAAC,KAAK,CAAC,0BAA0B,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAChF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YAAC,OAAO;QAC/B,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,6CAA6C,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QAC9F,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,6DAA6D,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEL,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;SAChB,WAAW,CAAC,uEAAuE,CAAC;SACpF,MAAM,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;SAChE,MAAM,CAAC,kBAAkB,EAAE,0CAA0C,EAAE,cAAc,CAAC;SACtF,MAAM,CAAC,KAAK,EAAE,IAA4C,EAAE,EAAE;QAC7D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,IAAI,CAAC;YACH,MAAM,iBAAiB,CAAC;gBACtB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC7D,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -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,CA2C/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,127 @@
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 'zai':
38
+ /* Zhipu GLM vision variants: GLM-4V, GLM-4.5V, GLM-4.1V. The text
39
+ * GLM-4.6 is NOT vision -- pair it with a *V model for image turns. */
40
+ return /glm-4v|glm-4\.[0-9]+v|4\.5v|vision/.test(m);
41
+ case 'qwen':
42
+ /* Qwen-VL family (qwen-vl-max, qwen2.5-vl, qwen3-vl). qwen3-coder
43
+ * and qwen-plus are text-only. */
44
+ return /vl|vision/.test(m);
45
+ case 'ollama':
46
+ /* Open-weight vision models the user can pull. Default text
47
+ * models (llama3.1, qwen2.5) are NOT vision. */
48
+ return /llava|llama3\.2-vision|moondream|bakllava|minicpm-v|qwen2\.5-?vl/.test(m);
49
+ case 'yujin_managed':
50
+ /* The managed proxy picks the model server-side; assume the
51
+ * server routes vision turns to a capable model + validates. */
52
+ return true;
53
+ case 'deepseek':
54
+ case 'cohere':
55
+ /* No vision endpoint wired for these. */
56
+ return false;
57
+ default:
58
+ return false;
59
+ }
60
+ }
61
+ /**
62
+ * Count image attachments across a set of chat turns. Structurally
63
+ * typed (no ChatMessage import) so it stays in the IO-free core.
64
+ */
65
+ export function countImageAttachments(messages) {
66
+ let n = 0;
67
+ for (const m of messages) {
68
+ if (m && Array.isArray(m.attachments))
69
+ n += m.attachments.length;
70
+ }
71
+ return n;
72
+ }
73
+ /** Defensive caps so a malformed / hostile client cannot blow up a
74
+ * turn with hundreds of huge images. ~6MB of bytes per image. */
75
+ const MAX_ATTACHMENTS = 8;
76
+ const MAX_B64_LEN = 8 * 1024 * 1024;
77
+ /**
78
+ * Validate + normalize a raw `attachments` payload from a chat
79
+ * request into ImageAttachment[]. Accepts several shapes a client
80
+ * might send: {media_type|mime, data|base64} or a full data URL in
81
+ * {url|data_url|data}. Strips the `data:...;base64,` prefix, maps
82
+ * image/jpg -> image/jpeg, drops anything not in the supported set
83
+ * or over the size cap. Never throws.
84
+ */
85
+ export function parseImageAttachments(raw) {
86
+ if (!Array.isArray(raw))
87
+ return [];
88
+ const out = [];
89
+ for (const item of raw) {
90
+ if (out.length >= MAX_ATTACHMENTS)
91
+ break;
92
+ if (!item || typeof item !== 'object')
93
+ continue;
94
+ const o = item;
95
+ let data = typeof o['data'] === 'string' ? o['data']
96
+ : typeof o['base64'] === 'string' ? o['base64']
97
+ : '';
98
+ let media = typeof o['media_type'] === 'string' ? o['media_type']
99
+ : typeof o['mime'] === 'string' ? o['mime']
100
+ : '';
101
+ const url = typeof o['url'] === 'string' ? o['url']
102
+ : typeof o['data_url'] === 'string' ? o['data_url']
103
+ : '';
104
+ const src = url || data;
105
+ const dm = /^data:([^;,]+);base64,(.*)$/s.exec(src);
106
+ if (dm) {
107
+ media = media || (dm[1] ?? '');
108
+ data = dm[2] ?? '';
109
+ }
110
+ if (!data || data.length > MAX_B64_LEN)
111
+ continue;
112
+ media = (media || 'image/png').toLowerCase().trim();
113
+ if (media === 'image/jpg')
114
+ media = 'image/jpeg';
115
+ if (!SUPPORTED_IMAGE_MEDIA_TYPES.includes(media))
116
+ continue;
117
+ const name = typeof o['name'] === 'string' ? o['name'].slice(0, 120) : undefined;
118
+ out.push(name ? { media_type: media, data, name } : { media_type: media, data });
119
+ }
120
+ return out;
121
+ }
122
+ /** The fallback shown when a multimodal turn arrives but no configured
123
+ * brain can do vision (no key/plan on any vision provider). */
124
+ export const NO_VISION_BRAIN_MESSAGE = 'Para realizar trabajo multimodal necesitas cargar una clave o un plan ' +
125
+ 'en algun brain multimodal (por ejemplo Anthropic/Claude, OpenAI gpt-4o ' +
126
+ 'o Google Gemini). Configuralo con `yf brain config` o en el panel de claves.';
127
+ //# 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
@@ -17,6 +17,14 @@ export interface BrainConfig {
17
17
  version: 1;
18
18
  eco: TierBinding;
19
19
  frontier: TierBinding;
20
+ /** F1+ (2026-06-20) -- optional brain dedicated to MULTIMODAL turns
21
+ * (image attachments). When set + it has a key, the vision router
22
+ * routes every image-bearing turn here, regardless of the eco/frontier
23
+ * brain. This lets a cheap TEXT frontier (e.g. DeepSeek) pair with a
24
+ * vision assistant (e.g. GLM-4.5V) so the combo handles image turns.
25
+ * Unset -> fall back to "keep the brain if it can see, else any known
26
+ * vision brain with a key". */
27
+ multimodal?: TierBinding;
20
28
  /** Default tier when the cost router cannot infer from
21
29
  * workflow state / verb_id. */
22
30
  chat_default_tier: 'eco' | 'frontier';
@@ -45,6 +53,10 @@ export declare function readBrainConfig(): Promise<BrainConfig>;
45
53
  export declare function writeBrainConfig(cfg: BrainConfig): Promise<void>;
46
54
  /** Mutate one tier without losing the other. */
47
55
  export declare function setTierBinding(tier: 'eco' | 'frontier', provider: BrainProvider, model: string): Promise<BrainConfig>;
56
+ /** F1+ -- set the dedicated multimodal brain (used for image-bearing turns). */
57
+ export declare function setMultimodalBinding(provider: BrainProvider, model: string): Promise<BrainConfig>;
58
+ /** F1+ -- remove the dedicated multimodal brain (revert to auto vision routing). */
59
+ export declare function clearMultimodalBinding(): Promise<BrainConfig>;
48
60
  /** Set the default tier for chat turns the router cannot infer. */
49
61
  export declare function setChatDefaultTier(tier: 'eco' | 'frontier'): Promise<BrainConfig>;
50
62
  /** Reset to factory defaults. */
@@ -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;;;;;;oCAMgC;IAChC,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB;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,CA6B5D;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,gFAAgF;AAChF,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAKvG;AAED,oFAAoF;AACpF,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,WAAW,CAAC,CAKnE;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() {
@@ -123,6 +130,10 @@ export async function readBrainConfig() {
123
130
  if (j.anthropic_mode === 'plan' || j.anthropic_mode === 'console') {
124
131
  cfg.anthropic_mode = j.anthropic_mode;
125
132
  }
133
+ /* Optional multimodal brain (only present when the user set one). */
134
+ if (j.multimodal && typeof j.multimodal === 'object') {
135
+ cfg.multimodal = normaliseTierBinding(j.multimodal, { provider: 'anthropic', model: 'claude-sonnet-4-6' });
136
+ }
126
137
  return cfg;
127
138
  }
128
139
  catch (err) {
@@ -145,6 +156,20 @@ export async function setTierBinding(tier, provider, model) {
145
156
  await writeBrainConfig(cfg);
146
157
  return cfg;
147
158
  }
159
+ /** F1+ -- set the dedicated multimodal brain (used for image-bearing turns). */
160
+ export async function setMultimodalBinding(provider, model) {
161
+ const cfg = await readBrainConfig();
162
+ cfg.multimodal = { provider, model };
163
+ await writeBrainConfig(cfg);
164
+ return cfg;
165
+ }
166
+ /** F1+ -- remove the dedicated multimodal brain (revert to auto vision routing). */
167
+ export async function clearMultimodalBinding() {
168
+ const cfg = await readBrainConfig();
169
+ delete cfg.multimodal;
170
+ await writeBrainConfig(cfg);
171
+ return cfg;
172
+ }
148
173
  /** Set the default tier for chat turns the router cannot infer. */
149
174
  export async function setChatDefaultTier(tier) {
150
175
  const cfg = await readBrainConfig();
@@ -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":"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"}
@@ -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;AAqVD;;;;;;;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"}