@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.
- package/dist/bin/yf.d.ts.map +1 -1
- package/dist/bin/yf.js +5 -0
- package/dist/bin/yf.js.map +1 -1
- package/dist/chat/claude.d.ts +13 -0
- package/dist/chat/claude.d.ts.map +1 -1
- package/dist/chat/claude.js +18 -5
- package/dist/chat/claude.js.map +1 -1
- package/dist/chat/claude_cli.d.ts.map +1 -1
- package/dist/chat/claude_cli.js +10 -0
- package/dist/chat/claude_cli.js.map +1 -1
- package/dist/chat/panel.d.ts.map +1 -1
- package/dist/chat/panel.js +111 -10
- package/dist/chat/panel.js.map +1 -1
- package/dist/chat/server.d.ts.map +1 -1
- package/dist/chat/server.js +35 -2
- package/dist/chat/server.js.map +1 -1
- package/dist/commands/federation.d.ts +17 -0
- package/dist/commands/federation.d.ts.map +1 -0
- package/dist/commands/federation.js +145 -0
- package/dist/commands/federation.js.map +1 -0
- package/dist/core/brain_capabilities.d.ts +64 -0
- package/dist/core/brain_capabilities.d.ts.map +1 -0
- package/dist/core/brain_capabilities.js +119 -0
- package/dist/core/brain_capabilities.js.map +1 -0
- package/dist/core/brain_config.d.ts +1 -1
- package/dist/core/brain_config.d.ts.map +1 -1
- package/dist/core/brain_config.js +7 -0
- package/dist/core/brain_config.js.map +1 -1
- package/dist/core/cost_router.d.ts +6 -0
- package/dist/core/cost_router.d.ts.map +1 -1
- package/dist/core/cost_router.js +122 -8
- package/dist/core/cost_router.js.map +1 -1
- package/dist/core/federation_config.d.ts +17 -0
- package/dist/core/federation_config.d.ts.map +1 -0
- package/dist/core/federation_config.js +77 -0
- package/dist/core/federation_config.js.map +1 -0
- package/dist/core/provider_keys.d.ts +1 -1
- package/dist/core/provider_keys.d.ts.map +1 -1
- package/dist/core/provider_keys.js +3 -0
- package/dist/core/provider_keys.js.map +1 -1
- package/dist/core/provider_models.d.ts.map +1 -1
- package/dist/core/provider_models.js +10 -0
- package/dist/core/provider_models.js.map +1 -1
- package/dist/llm/federation_client.d.ts +66 -0
- package/dist/llm/federation_client.d.ts.map +1 -0
- package/dist/llm/federation_client.js +166 -0
- package/dist/llm/federation_client.js.map +1 -0
- package/dist/llm/federation_host.d.ts +16 -0
- package/dist/llm/federation_host.d.ts.map +1 -0
- package/dist/llm/federation_host.js +132 -0
- package/dist/llm/federation_host.js.map +1 -0
- package/dist/llm/gemini_client.d.ts.map +1 -1
- package/dist/llm/gemini_client.js +15 -6
- package/dist/llm/gemini_client.js.map +1 -1
- package/dist/llm/multi_provider_client.d.ts.map +1 -1
- package/dist/llm/multi_provider_client.js +27 -0
- package/dist/llm/multi_provider_client.js.map +1 -1
- package/dist/llm/openai_client.d.ts +4 -0
- package/dist/llm/openai_client.d.ts.map +1 -1
- package/dist/llm/openai_client.js +18 -6
- package/dist/llm/openai_client.js.map +1 -1
- package/dist/llm/single_step.d.ts +63 -0
- package/dist/llm/single_step.d.ts.map +1 -0
- package/dist/llm/single_step.js +171 -0
- package/dist/llm/single_step.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- 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;
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
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;
|
|
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"}
|