xonecode 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +167 -0
- package/dist/agent/authEnDisco.js +56 -0
- package/dist/agent/authEnDisco.js.map +1 -0
- package/dist/agent/configEnDisco.js +109 -0
- package/dist/agent/configEnDisco.js.map +1 -0
- package/dist/agent/crearProyecto.js +34 -0
- package/dist/agent/crearProyecto.js.map +1 -0
- package/dist/agent/entorno.js +124 -0
- package/dist/agent/entorno.js.map +1 -0
- package/dist/agent/guionizado.js +53 -0
- package/dist/agent/guionizado.js.map +1 -0
- package/dist/agent/instantanea.js +129 -0
- package/dist/agent/instantanea.js.map +1 -0
- package/dist/agent/interrupts.js +83 -0
- package/dist/agent/interrupts.js.map +1 -0
- package/dist/agent/mensajes.js +24 -0
- package/dist/agent/mensajes.js.map +1 -0
- package/dist/agent/modelos.js +42 -0
- package/dist/agent/modelos.js.map +1 -0
- package/dist/agent/normalizar.js +20 -0
- package/dist/agent/normalizar.js.map +1 -0
- package/dist/agent/perfiles.js +103 -0
- package/dist/agent/perfiles.js.map +1 -0
- package/dist/agent/proyecto.js +107 -0
- package/dist/agent/proyecto.js.map +1 -0
- package/dist/agent/puente.js +142 -0
- package/dist/agent/puente.js.map +1 -0
- package/dist/agent/resumenDeTool.js +48 -0
- package/dist/agent/resumenDeTool.js.map +1 -0
- package/dist/agent/skills.js +65 -0
- package/dist/agent/skills.js.map +1 -0
- package/dist/agent/textoDeTool.js +113 -0
- package/dist/agent/textoDeTool.js.map +1 -0
- package/dist/agent/turnoReal.js +173 -0
- package/dist/agent/turnoReal.js.map +1 -0
- package/dist/agent/verificador.js +65 -0
- package/dist/agent/verificador.js.map +1 -0
- package/dist/agent/xoneAgent.js +106 -0
- package/dist/agent/xoneAgent.js.map +1 -0
- package/dist/bin.js +9 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/aprobar.js +82 -0
- package/dist/cli/aprobar.js.map +1 -0
- package/dist/cli/config.js +133 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/consola.js +346 -0
- package/dist/cli/consola.js.map +1 -0
- package/dist/cli/describe.js +53 -0
- package/dist/cli/describe.js.map +1 -0
- package/dist/cli/doctor.js +45 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/main.js +520 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/markdown.js +90 -0
- package/dist/cli/markdown.js.map +1 -0
- package/dist/cli/run.js +164 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/spinner.js +89 -0
- package/dist/cli/spinner.js.map +1 -0
- package/dist/cli/stdio.js +193 -0
- package/dist/cli/stdio.js.map +1 -0
- package/dist/cli/tema.js +40 -0
- package/dist/cli/tema.js.map +1 -0
- package/dist/cli/verify.js +62 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/core/bitacora.js +30 -0
- package/dist/core/bitacora.js.map +1 -0
- package/dist/core/config.js +236 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/contextos.js +56 -0
- package/dist/core/contextos.js.map +1 -0
- package/dist/core/deps.js +51 -0
- package/dist/core/deps.js.map +1 -0
- package/dist/core/diff.js +79 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/esqueleto.js +366 -0
- package/dist/core/esqueleto.js.map +1 -0
- package/dist/core/events.js +2 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/modelos.js +85 -0
- package/dist/core/modelos.js.map +1 -0
- package/dist/core/notify.js +106 -0
- package/dist/core/notify.js.map +1 -0
- package/dist/core/ports.js +114 -0
- package/dist/core/ports.js.map +1 -0
- package/dist/core/turno.js +127 -0
- package/dist/core/turno.js.map +1 -0
- package/dist/vendor/hitl.js +103 -0
- package/dist/vendor/hitl.js.map +1 -0
- package/dist/vendor/skillLoaders/catalog.js +74 -0
- package/dist/vendor/skillLoaders/catalog.js.map +1 -0
- package/dist/vendor/tokenTracking.js +58 -0
- package/dist/vendor/tokenTracking.js.map +1 -0
- package/package.json +41 -0
- package/skills/xone-debugging/SKILL.md +52 -0
- package/skills/xone-debugging/references/faq.md +561 -0
- package/skills/xone-debugging/references/troubleshooting-y-glosario.md +429 -0
- package/skills/xone-development/SKILL.md +105 -0
- package/skills/xone-development/references/anti-patrones.md +94 -0
- package/skills/xone-development/references/css/atributos-por-categoria.md +509 -0
- package/skills/xone-development/references/css/buenas-practicas-y-parser.md +419 -0
- package/skills/xone-development/references/css/dinamicos-cascada-y-componentes.md +550 -0
- package/skills/xone-development/references/css/patrones-material-y-temas.md +1140 -0
- package/skills/xone-development/references/css/propiedades-y-herencia.md +885 -0
- package/skills/xone-development/references/css/selectores-unidades-colores.md +840 -0
- package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +457 -0
- package/skills/xone-development/references/datos/appdata.md +611 -0
- package/skills/xone-development/references/datos/http-sqlmanager-y-crypto.md +720 -0
- package/skills/xone-development/references/datos/http.md +366 -0
- package/skills/xone-development/references/datos/oauth2-y-replica.md +156 -0
- package/skills/xone-development/references/device/biometria-imagedrawing-y-otros.md +544 -0
- package/skills/xone-development/references/device/objetos-de-dispositivo.md +583 -0
- package/skills/xone-development/references/device/systemsettings-referencia-ampliada.md +396 -0
- package/skills/xone-development/references/device/systemsettings-y-permisos.md +342 -0
- package/skills/xone-development/references/fundamentos/conceptos-clave.md +695 -0
- package/skills/xone-development/references/fundamentos/configuracion-app-xml-ini-mappings.md +668 -0
- package/skills/xone-development/references/fundamentos/errores-comunes.md +312 -0
- package/skills/xone-development/references/fundamentos/navegacion-convenciones-y-primer-proyecto.md +576 -0
- package/skills/xone-development/references/fundamentos/plataforma-y-anatomia-de-proyecto.md +387 -0
- package/skills/xone-development/references/indice-completo.md +77 -0
- package/skills/xone-development/references/javascript/coleccion-error-y-usuario.md +260 -0
- package/skills/xone-development/references/javascript/debugging-y-best-practices.md +245 -0
- package/skills/xone-development/references/javascript/metodos-de-los-controles.md +556 -0
- package/skills/xone-development/references/javascript/metodos-nativos-de-la-vista.md +114 -0
- package/skills/xone-development/references/javascript/motor-js-y-contexto-de-ejecucion.md +319 -0
- package/skills/xone-development/references/javascript/objeto-ai-llm-en-dispositivo.md +358 -0
- package/skills/xone-development/references/javascript/objetos-creables-a-m.md +527 -0
- package/skills/xone-development/references/javascript/objetos-creables-n-z.md +385 -0
- package/skills/xone-development/references/javascript/patrones-criticos-seguridad-y-rendimiento.md +595 -0
- package/skills/xone-development/references/javascript/patrones-de-navegacion-datos-y-codigo.md +751 -0
- package/skills/xone-development/references/javascript/patrones-de-ui-voz-integracion-y-seguridad.md +701 -0
- package/skills/xone-development/references/javascript/plantillas-y-funciones-utilitarias.md +647 -0
- package/skills/xone-development/references/javascript/self-y-dataobject.md +449 -0
- package/skills/xone-development/references/javascript/singletons-globales.md +361 -0
- package/skills/xone-development/references/javascript/ui-catalogo-de-metodos.md +464 -0
- package/skills/xone-development/references/javascript/ui-gps-camara-y-multimedia.md +506 -0
- package/skills/xone-development/references/javascript/ui-navegacion-mensajes-y-vista.md +422 -0
- package/skills/xone-development/references/resumen-js-datos-dispositivo.md +80 -0
- package/skills/xone-development/references/resumen-xml-y-css.md +74 -0
- package/skills/xone-development/references/tipos-de-prop.md +28 -0
- package/skills/xone-development/references/xml-ui/asfilter-visibilidad-eventos-y-macros.md +576 -0
- package/skills/xone-development/references/xml-ui/atributos-coll-group-frame.md +235 -0
- package/skills/xone-development/references/xml-ui/atributos-method-macro-script-event-app.md +244 -0
- package/skills/xone-development/references/xml-ui/atributos-prop.md +439 -0
- package/skills/xone-development/references/xml-ui/contents-y-macros.md +392 -0
- package/skills/xone-development/references/xml-ui/errores-comunes-xml.md +245 -0
- package/skills/xone-development/references/xml-ui/estructura-y-nodo-coll.md +326 -0
- package/skills/xone-development/references/xml-ui/eventos-ciclo-de-vida-e-interaccion.md +704 -0
- package/skills/xone-development/references/xml-ui/eventos-sistema-login-y-personalizados.md +944 -0
- package/skills/xone-development/references/xml-ui/layouts-herencia-y-buenas-practicas.md +618 -0
- package/skills/xone-development/references/xml-ui/mapas.md +685 -0
- package/skills/xone-development/references/xml-ui/mappings-y-colecciones-separadas.md +148 -0
- package/skills/xone-development/references/xml-ui/nodos-group-y-frame.md +666 -0
- package/skills/xone-development/references/xml-ui/patrones-de-pantalla.md +643 -0
- package/skills/xone-development/references/xml-ui/prop-atributos-y-condiciones.md +298 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +493 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-combos-y-controles.md +664 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-listas-y-mapas.md +412 -0
- package/skills/xone-plan-builder/SKILL.md +183 -0
- package/skills/xone-plan-builder/agents/openai.yaml +5 -0
- package/skills/xone-plan-builder/references/TASKS-FORMAT.md +132 -0
- package/skills/xone-project-generator/SKILL.md +111 -0
- package/skills/xone-project-generator/references/canonical-sizes.md +292 -0
- package/skills/xone-project-generator/references/colecciones-base.md +16 -0
- package/skills/xone-project-generator/references/convenciones-de-nombres.md +16 -0
- package/skills/xone-project-generator/references/ejemplos-por-sector-y-prohibiciones.md +140 -0
- package/skills/xone-project-generator/references/fase-3-estilos-css.md +597 -0
- package/skills/xone-project-generator/references/fase-6-colecciones.md +762 -0
- package/skills/xone-project-generator/references/fase-7-asfilter-e-integraciones.md +142 -0
- package/skills/xone-project-generator/references/fase-7-entidades-y-estructura-de-pantalla.md +494 -0
- package/skills/xone-project-generator/references/fase-7-plantilla-consola.md +477 -0
- package/skills/xone-project-generator/references/fase-7-plantillas-de-pantalla.md +302 -0
- package/skills/xone-project-generator/references/fase-7-viewmodes-graficos-y-listas.md +681 -0
- package/skills/xone-project-generator/references/fase-7-viewmodes-mapa-y-calendario.md +479 -0
- package/skills/xone-project-generator/references/fases-0-2-analisis-y-modelo-de-datos.md +350 -0
- package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +194 -0
- package/skills/xone-project-generator/references/fases-4-5-estructura-y-configuracion.md +587 -0
- package/skills/xone-project-generator/references/fases-8-9-eventos-y-javascript.md +861 -0
- package/skills/xone-project-generator/references/flujo-de-generacion.md +67 -0
- package/skills/xone-project-generator/references/plantillas-estandar.md +98 -0
- package/skills/xone-project-generator/references/tamanos-canonicos.md +49 -0
- package/skills/xone-review/SKILL.md +189 -0
- package/skills/xone-spec-builder/SKILL.md +235 -0
- package/skills/xone-spec-builder/agents/openai.yaml +5 -0
- package/skills/xone-spec-builder/references/ADR-FORMAT.md +55 -0
- package/skills/xone-spec-builder/references/CONTEXT-FORMAT.md +42 -0
- package/skills/xone-spec-builder/references/PLAN-FORMAT.md +120 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* La validación PURA de los dos ficheros de configuración: sin tocar disco (eso es cosa
|
|
3
|
+
* de `agent/configEnDisco.ts`) y sin importar nada de langchain — la frontera de `core/`
|
|
4
|
+
* está probada en `imports.test.ts`.
|
|
5
|
+
*
|
|
6
|
+
* Dos ficheros con dos ciclos de vida distintos, como opencode:
|
|
7
|
+
*
|
|
8
|
+
* - `config.json` (proyecto o global): modelos y proveedores. Comiteable. NUNCA claves.
|
|
9
|
+
* Una clave aquí no se avisa: se RECHAZA, porque un aviso dejaría el fichero
|
|
10
|
+
* funcionando y la clave camino del commit. La alternativa —`~/.xonecode/auth.json`—
|
|
11
|
+
* está a un comando de distancia.
|
|
12
|
+
* - `auth.json` (solo global): las credenciales. En un proyecto se rechaza entero, y se
|
|
13
|
+
* comprueba el modo: un `chmod` de más, un `cp -r` o un backup restaurado dejan el
|
|
14
|
+
* fichero legible por otros, y eso hay que cantarlo al leerlo, no al día del incidente.
|
|
15
|
+
*
|
|
16
|
+
* Y la regla que sostiene a las dos: un aviso NUNCA contiene el valor rechazado, ni
|
|
17
|
+
* truncado. Un mensaje de error acaba en logs, capturas e issues; el aviso dice QUÉ
|
|
18
|
+
* campo, no QUÉ contenía. Por eso estos mensajes no interpolan nunca el valor de entrada.
|
|
19
|
+
*/
|
|
20
|
+
import { PROVEEDORES, PAPELES } from "./modelos.js";
|
|
21
|
+
/**
|
|
22
|
+
* Formas plausibles de colar una clave dentro de un `config.json`. El intento se rechaza
|
|
23
|
+
* sea cual sea el valor: lo que delata es el NOMBRE del campo, porque una clave con otro
|
|
24
|
+
* nombre ya no es reconocible — y estas seis cubren lo que la gente escribe a mano.
|
|
25
|
+
*/
|
|
26
|
+
const CLAVES_DENEGADAS = [
|
|
27
|
+
"claves",
|
|
28
|
+
"apiKey",
|
|
29
|
+
"api_key",
|
|
30
|
+
"key",
|
|
31
|
+
"secret",
|
|
32
|
+
"token",
|
|
33
|
+
];
|
|
34
|
+
/** Un JSON-array NO es un objeto a estos efectos: el raíz que no sea objeto se ignora. */
|
|
35
|
+
function esObjeto(v) {
|
|
36
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Valida un `config.json` sin tocar disco. Lo que no entiende lo descarta y lo avisa
|
|
40
|
+
* nombrándolo: un campo mal escrito tiene que producir un mensaje que lo diga, si no el
|
|
41
|
+
* usuario cree haber configurado algo y no.
|
|
42
|
+
*/
|
|
43
|
+
export function validar(bruto, ruta, procedencia) {
|
|
44
|
+
// La procedencia no cambia ninguna regla —una clave de API se rechaza igual venga del
|
|
45
|
+
// proyecto o del global—: va en la firma por simetría con `validarAuth`, que sí la usa.
|
|
46
|
+
void procedencia;
|
|
47
|
+
const avisos = [];
|
|
48
|
+
if (!esObjeto(bruto)) {
|
|
49
|
+
return {
|
|
50
|
+
config: {},
|
|
51
|
+
avisos: [
|
|
52
|
+
{
|
|
53
|
+
texto: `«${ruta}»: el JSON raíz debe ser un objeto; se ignora el fichero entero.`,
|
|
54
|
+
severidad: "aviso",
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const config = {};
|
|
60
|
+
for (const clave of Object.keys(bruto)) {
|
|
61
|
+
const valor = bruto[clave];
|
|
62
|
+
// El rechazo se comprueba PRIMERO, para que una clave denegada no salga también como
|
|
63
|
+
// «campo desconocido»: el mismo campo con dos avisos es ruido en la dirección mala.
|
|
64
|
+
const proveedorConCadena = PROVEEDORES.includes(clave) && typeof valor === "string";
|
|
65
|
+
if (CLAVES_DENEGADAS.includes(clave) || proveedorConCadena) {
|
|
66
|
+
avisos.push({
|
|
67
|
+
texto: `«${ruta}»: el campo «${clave}» parece una clave de API y NO se acepta en un config.json: las claves van en ~/.xonecode/auth.json.`,
|
|
68
|
+
severidad: "grave",
|
|
69
|
+
});
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (clave === "modelo") {
|
|
73
|
+
if (typeof valor === "string") {
|
|
74
|
+
config.modelo = valor;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
avisos.push({
|
|
78
|
+
texto: `«${ruta}»: «modelo» debe ser la cadena «proveedor/modelo»; se descarta.`,
|
|
79
|
+
severidad: "aviso",
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (clave === "modelos") {
|
|
85
|
+
if (!esObjeto(valor)) {
|
|
86
|
+
avisos.push({
|
|
87
|
+
texto: `«${ruta}»: «modelos» debe ser un objeto de papel → «proveedor/modelo»; se descarta.`,
|
|
88
|
+
severidad: "aviso",
|
|
89
|
+
});
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const modelos = {};
|
|
93
|
+
for (const papel of Object.keys(valor)) {
|
|
94
|
+
const idModelo = valor[papel];
|
|
95
|
+
if (!PAPELES.includes(papel)) {
|
|
96
|
+
avisos.push({
|
|
97
|
+
texto: `«${ruta}»: «modelos.${papel}» no es un papel válido (los que hay: ${PAPELES.join(", ")}); se descarta.`,
|
|
98
|
+
severidad: "aviso",
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
else if (typeof idModelo !== "string") {
|
|
102
|
+
avisos.push({
|
|
103
|
+
texto: `«${ruta}»: «modelos.${papel}» debe ser la cadena «proveedor/modelo»; se descarta.`,
|
|
104
|
+
severidad: "aviso",
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
modelos[papel] = idModelo;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
config.modelos = modelos;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
// El tope de la ventana de contexto que la tabla de `core/contextos.ts` no
|
|
115
|
+
// sabe: cada entrada es «proveedor/modelo» → tope en tokens. Se fija a mano
|
|
116
|
+
// porque el usuario sabe más de SU modelo (sobre todo del local) que la tabla.
|
|
117
|
+
if (clave === "contextos") {
|
|
118
|
+
if (!esObjeto(valor)) {
|
|
119
|
+
avisos.push({
|
|
120
|
+
texto: `«${ruta}»: «contextos» debe ser un objeto «proveedor/modelo» → tope en tokens; se descarta.`,
|
|
121
|
+
severidad: "aviso",
|
|
122
|
+
});
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
const contextos = {};
|
|
126
|
+
for (const id of Object.keys(valor)) {
|
|
127
|
+
const tope = valor[id];
|
|
128
|
+
if (typeof tope === "number" && Number.isInteger(tope) && tope > 0) {
|
|
129
|
+
contextos[id] = tope;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
avisos.push({
|
|
133
|
+
texto: `«${ruta}»: «contextos.${id}» debe ser un número entero de tokens positivo; se descarta.`,
|
|
134
|
+
severidad: "aviso",
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
config.contextos = contextos;
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (clave === "ollama") {
|
|
142
|
+
// «ollama» como objeto es configuración; como cadena ya la cogió arriba el rechazo
|
|
143
|
+
// de proveedor-con-cadena. Por eso el orden del if importa.
|
|
144
|
+
if (!esObjeto(valor)) {
|
|
145
|
+
avisos.push({
|
|
146
|
+
texto: `«${ruta}»: «ollama» debe ser un objeto con «baseUrl»; se descarta.`,
|
|
147
|
+
severidad: "aviso",
|
|
148
|
+
});
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
const ollama = {};
|
|
152
|
+
const baseUrl = valor["baseUrl"];
|
|
153
|
+
if (baseUrl !== undefined) {
|
|
154
|
+
if (typeof baseUrl === "string") {
|
|
155
|
+
ollama.baseUrl = baseUrl;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
avisos.push({
|
|
159
|
+
texto: `«${ruta}»: «ollama.baseUrl» debe ser una cadena; se descarta.`,
|
|
160
|
+
severidad: "aviso",
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
config.ollama = ollama;
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
avisos.push({
|
|
168
|
+
texto: `«${ruta}»: el campo «${clave}» no se reconoce; se descarta.`,
|
|
169
|
+
severidad: "aviso",
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
return { config, avisos };
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Valida un `auth.json`. Las credenciales SOLO viven en la ruta global: en un proyecto
|
|
176
|
+
* se rechaza el fichero entero — no es una regla de formato, es de dónde puede vivir
|
|
177
|
+
* un secreto. El modo se comprueba al leerlo porque crearlo bien no basta.
|
|
178
|
+
*/
|
|
179
|
+
export function validarAuth(bruto, ruta, modo, procedencia) {
|
|
180
|
+
const avisos = [];
|
|
181
|
+
if (procedencia === "proyecto") {
|
|
182
|
+
return {
|
|
183
|
+
auth: {},
|
|
184
|
+
avisos: [
|
|
185
|
+
{
|
|
186
|
+
texto: `«${ruta}»: auth.json solo se acepta en la ruta global (~/.xonecode/auth.json), nunca dentro de un proyecto; se ignora el fichero entero.`,
|
|
187
|
+
severidad: "grave",
|
|
188
|
+
},
|
|
189
|
+
],
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
if ((modo & 0o077) !== 0) {
|
|
193
|
+
avisos.push({
|
|
194
|
+
texto: `«${ruta}»: el fichero de credenciales es legible por otros usuarios (grupo y resto); ejecuta chmod 600 ${ruta}.`,
|
|
195
|
+
severidad: "grave",
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
if (!esObjeto(bruto)) {
|
|
199
|
+
avisos.push({
|
|
200
|
+
texto: `«${ruta}»: el JSON raíz debe ser un objeto; se ignora el fichero.`,
|
|
201
|
+
severidad: "aviso",
|
|
202
|
+
});
|
|
203
|
+
return { auth: {}, avisos };
|
|
204
|
+
}
|
|
205
|
+
const auth = {};
|
|
206
|
+
for (const clave of Object.keys(bruto)) {
|
|
207
|
+
const valor = bruto[clave];
|
|
208
|
+
if (!PROVEEDORES.includes(clave)) {
|
|
209
|
+
avisos.push({
|
|
210
|
+
texto: `«${ruta}»: «${clave}» no es un proveedor conocido (los que hay: ${PROVEEDORES.join(", ")}); se descarta.`,
|
|
211
|
+
severidad: "aviso",
|
|
212
|
+
});
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
// La forma que va a escribir la gente a mano: {"proveedor": "sk-…"}.
|
|
216
|
+
if (typeof valor === "string") {
|
|
217
|
+
auth[clave] = { key: valor };
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
if (esObjeto(valor)) {
|
|
221
|
+
const key = valor["key"];
|
|
222
|
+
if (typeof key === "string") {
|
|
223
|
+
const tipo = valor["type"];
|
|
224
|
+
auth[clave] =
|
|
225
|
+
typeof tipo === "string" ? { key, type: tipo } : { key };
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
avisos.push({
|
|
230
|
+
texto: `«${ruta}»: la credencial de «${clave}» debe ser «{ "key": "…" }» o una cadena; se descarta.`,
|
|
231
|
+
severidad: "aviso",
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
return { auth, avisos };
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El tope de la ventana de contexto de cada modelo, con toda la honestidad de
|
|
3
|
+
* la que es capaz una tabla.
|
|
4
|
+
*
|
|
5
|
+
* **Lo que NO hay aquí es tan deliberado como lo que hay:**
|
|
6
|
+
*
|
|
7
|
+
* - `ollama` no aparece a propósito. Cada modelo local trae el suyo (y a veces
|
|
8
|
+
* lo recorta el `num_ctx` del Modelfile), así que cualquier tope sería
|
|
9
|
+
* inventado — y un porcentaje calculado sobre un tope inventado no es un
|
|
10
|
+
* indicador: es una mentira con forma de cifra.
|
|
11
|
+
* - Las familias de la tabla se emparejan por PREFIJO (`gpt-4o-mini` calza con
|
|
12
|
+
* `gpt-4o`), porque los ids son `familia-variante-fecha`.
|
|
13
|
+
*
|
|
14
|
+
* Para lo que la tabla no sabe, está el override de `config.json`
|
|
15
|
+
* («contextos»: {«proveedor/modelo»: tope}): el usuario sabe más de SU modelo
|
|
16
|
+
* que esta tabla, y se lo cree.
|
|
17
|
+
*/
|
|
18
|
+
/** Familias conocidas por proveedor, emparejadas por prefijo del id del modelo. */
|
|
19
|
+
const TOPES = {
|
|
20
|
+
anthropic: [["claude", 200_000]],
|
|
21
|
+
gemini: [["gemini", 1_000_000]],
|
|
22
|
+
openai: [
|
|
23
|
+
["gpt-4.1", 1_000_000],
|
|
24
|
+
["gpt-4o", 128_000],
|
|
25
|
+
["gpt-4-turbo", 128_000],
|
|
26
|
+
["gpt-4", 128_000],
|
|
27
|
+
],
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* El tope de contexto de un modelo, o `undefined` si no se sabe.
|
|
31
|
+
*
|
|
32
|
+
* El override se mira ANTES que la tabla y va por id completo
|
|
33
|
+
* («proveedor/modelo»): un tope fijado a mano describe a ESE modelo, no a la
|
|
34
|
+
* familia.
|
|
35
|
+
*/
|
|
36
|
+
export function topeDeContexto(proveedor, modelo, overrides = {}) {
|
|
37
|
+
const porId = overrides[`${proveedor}/${modelo}`];
|
|
38
|
+
if (typeof porId === "number")
|
|
39
|
+
return porId;
|
|
40
|
+
return TOPES[proveedor]?.find(([prefijo]) => modelo.startsWith(prefijo))?.[1];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* El tope con su ORIGEN, para `/config`: lo que el usuario fijó a mano (proyecto gana
|
|
44
|
+
* a global, igual que con los modelos), la tabla como último recurso — o nada, que es
|
|
45
|
+
* una respuesta válida y se distingue del cero.
|
|
46
|
+
*/
|
|
47
|
+
export function topeResuelto(proveedor, modelo, configs) {
|
|
48
|
+
const id = `${proveedor}/${modelo}`;
|
|
49
|
+
if (configs.proyecto?.[id] !== undefined)
|
|
50
|
+
return { tope: configs.proyecto[id], origen: "proyecto" };
|
|
51
|
+
if (configs.global?.[id] !== undefined)
|
|
52
|
+
return { tope: configs.global[id], origen: "global" };
|
|
53
|
+
const deTabla = topeDeContexto(proveedor, modelo);
|
|
54
|
+
return deTabla !== undefined ? { tope: deTabla, origen: "tabla" } : undefined;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=contextos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextos.js","sourceRoot":"","sources":["../../src/core/contextos.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,mFAAmF;AACnF,MAAM,KAAK,GAAuE;IAChF,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC/B,MAAM,EAAE;QACN,CAAC,SAAS,EAAE,SAAS,CAAC;QACtB,CAAC,QAAQ,EAAE,OAAO,CAAC;QACnB,CAAC,aAAa,EAAE,OAAO,CAAC;QACxB,CAAC,OAAO,EAAE,OAAO,CAAC;KACnB;CACF,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,SAAoB,EACpB,MAAc,EACd,YAAoC,EAAE;IAEtC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC,CAAC;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5C,OAAO,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,SAAoB,EACpB,MAAc,EACd,OAA+E;IAE/E,MAAM,EAAE,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;IACpC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IACrG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC/F,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAClD,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { esDoble, McpVacio, SkillsEnMemoria, StubVerifier, ModeloGuionizado, } from "./ports.js";
|
|
2
|
+
import { PAPELES } from "./modelos.js";
|
|
3
|
+
/** Todo dobles. La suite corre con esto, y `describe` lo canta entero. */
|
|
4
|
+
export function depsOffline() {
|
|
5
|
+
return {
|
|
6
|
+
modelos: new ModeloGuionizado(),
|
|
7
|
+
skills: new SkillsEnMemoria(),
|
|
8
|
+
verifier: new StubVerifier(),
|
|
9
|
+
mcp: new McpVacio(),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/** Los puertos, en el orden en que se le cuentan al usuario. */
|
|
13
|
+
const PUERTOS = [
|
|
14
|
+
{ clave: "verifier", nombre: "verificador", gravedad: "grave" },
|
|
15
|
+
{ clave: "modelos", nombre: "modelos", gravedad: "grave" },
|
|
16
|
+
{ clave: "skills", nombre: "skills", gravedad: "aviso" },
|
|
17
|
+
{ clave: "mcp", nombre: "MCP (proyecto remoto)", gravedad: "aviso" },
|
|
18
|
+
];
|
|
19
|
+
/**
|
|
20
|
+
* Qué hay montado, y qué de ello es de pega.
|
|
21
|
+
*
|
|
22
|
+
* Pura y sin efectos: no llama a ningún puerto, solo mira qué son. Por eso `xonecode
|
|
23
|
+
* describe` no necesita ni credenciales ni red.
|
|
24
|
+
*
|
|
25
|
+
* El verificador va PRIMERO y como `grave` por un motivo: un verificador de pega dice que
|
|
26
|
+
* todo está bien, así que es el doble que más daño hace pasando desapercibido.
|
|
27
|
+
*/
|
|
28
|
+
export function describir(deps) {
|
|
29
|
+
const lineas = ["--- qué hay montado ---"];
|
|
30
|
+
for (const { clave, nombre, gravedad } of PUERTOS) {
|
|
31
|
+
const doble = esDoble(deps[clave]);
|
|
32
|
+
const marca = doble ? (gravedad === "grave" ? "⚠ DE PEGA" : "· doble") : "✓ real";
|
|
33
|
+
lineas.push(` ${marca} ${nombre}`);
|
|
34
|
+
}
|
|
35
|
+
const desc = deps.modelos.descripcion();
|
|
36
|
+
lineas.push("--- modelos por papel ---");
|
|
37
|
+
for (const papel of PAPELES)
|
|
38
|
+
lineas.push(` ${papel.padEnd(8)} ${desc[papel]}`);
|
|
39
|
+
const graves = PUERTOS.filter((p) => p.gravedad === "grave" && esDoble(deps[p.clave]));
|
|
40
|
+
if (graves.length > 0) {
|
|
41
|
+
lineas.push("");
|
|
42
|
+
lineas.push(`⚠ ${graves.length} pieza(s) de pega: lo que diga este agente NO está respaldado ` +
|
|
43
|
+
`por ${graves.map((g) => g.nombre).join(" ni ")}.`);
|
|
44
|
+
}
|
|
45
|
+
return lineas;
|
|
46
|
+
}
|
|
47
|
+
/** Para el aviso del final del turno: los nombres de los puertos caros que son dobles. */
|
|
48
|
+
export function doblesGraves(deps) {
|
|
49
|
+
return PUERTOS.filter((p) => p.gravedad === "grave" && esDoble(deps[p.clave])).map((p) => p.nombre);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=deps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/core/deps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El diff de líneas para la aprobación: el ANTES contra el DESPUÉS de una escritura
|
|
3
|
+
* pendiente, como datos — quien pinta decide colores y presupuesto de líneas.
|
|
4
|
+
*
|
|
5
|
+
* Es PURO a propósito: quién aprueba y de dónde sale el antes y el después no son
|
|
6
|
+
* cosa de este módulo. El algoritmo es el LCS clásico por programación dinámica,
|
|
7
|
+
* con un GUARDIÁN de tamaño: dos ficheros de mil líneas serían un millón de celdas
|
|
8
|
+
* por el precio de un diff bonito, y el fallback (entero reescrito: todo quitado y
|
|
9
|
+
* todo añadido) sigue contando la verdad, solo que sin deduplicar lo que se mantiene.
|
|
10
|
+
*/
|
|
11
|
+
/** Por encima de este producto, ni LCS ni nada: fallback lineal. */
|
|
12
|
+
const MAX_CELDAS = 250_000;
|
|
13
|
+
function lineasDe(texto) {
|
|
14
|
+
const lineas = texto.split("\n");
|
|
15
|
+
// El salto final de un fichero normal no es una línea vacía.
|
|
16
|
+
if (lineas.length > 0 && lineas[lineas.length - 1] === "")
|
|
17
|
+
lineas.pop();
|
|
18
|
+
return lineas;
|
|
19
|
+
}
|
|
20
|
+
export function diffDeLineas(antes, despues) {
|
|
21
|
+
const a = lineasDe(antes);
|
|
22
|
+
const b = lineasDe(despues);
|
|
23
|
+
if (a.length * b.length > MAX_CELDAS) {
|
|
24
|
+
return [
|
|
25
|
+
...a.map((texto) => ({ tipo: "quitado", texto })),
|
|
26
|
+
...b.map((texto) => ({ tipo: "anadido", texto })),
|
|
27
|
+
];
|
|
28
|
+
}
|
|
29
|
+
// dp[i][j] = LCS de a[0..i) y b[0..j)
|
|
30
|
+
const dp = Array.from({ length: a.length + 1 }, () => new Array(b.length + 1).fill(0));
|
|
31
|
+
for (let i = 1; i <= a.length; i++) {
|
|
32
|
+
for (let j = 1; j <= b.length; j++) {
|
|
33
|
+
dp[i][j] = a[i - 1] === b[j - 1] ? dp[i - 1][j - 1] + 1 : Math.max(dp[i - 1][j], dp[i][j - 1]);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Se recorre hacia atrás y se da la vuelta; en el empate se come primero de `b`
|
|
37
|
+
// (añadido), para que al dar la vuelta el QUITADO quede delante del AÑADIDO —
|
|
38
|
+
// el orden en que los diffs se leen: qué se quita, qué se pone.
|
|
39
|
+
const salida = [];
|
|
40
|
+
let i = a.length;
|
|
41
|
+
let j = b.length;
|
|
42
|
+
while (i > 0 || j > 0) {
|
|
43
|
+
if (i > 0 && j > 0 && a[i - 1] === b[j - 1]) {
|
|
44
|
+
salida.push({ tipo: "igual", texto: a[i - 1] });
|
|
45
|
+
i--;
|
|
46
|
+
j--;
|
|
47
|
+
}
|
|
48
|
+
else if (j > 0 && (i === 0 || dp[i][j - 1] >= dp[i - 1][j])) {
|
|
49
|
+
salida.push({ tipo: "anadido", texto: b[j - 1] });
|
|
50
|
+
j--;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
salida.push({ tipo: "quitado", texto: a[i - 1] });
|
|
54
|
+
i--;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return salida.reverse();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Solo las líneas que importan para decidir: los cambios y `contexto` líneas alrededor
|
|
61
|
+
* de cada uno. Las rachas largas de «igual» se recortan por VENTANAS solapadas (dos
|
|
62
|
+
* cambios cercanos comparten el contexto), no por trozos fijos.
|
|
63
|
+
*/
|
|
64
|
+
export function conContexto(d, contexto) {
|
|
65
|
+
const mantener = new Set();
|
|
66
|
+
d.forEach((l, idx) => {
|
|
67
|
+
if (l.tipo === "igual")
|
|
68
|
+
return;
|
|
69
|
+
for (let k = Math.max(0, idx - contexto); k <= Math.min(d.length - 1, idx + contexto); k++) {
|
|
70
|
+
mantener.add(k);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
return d.filter((_, idx) => mantener.has(idx));
|
|
74
|
+
}
|
|
75
|
+
/** El techo de líneas del bloque de diff, con la cuenta honesta de lo que no cabe. */
|
|
76
|
+
export function recortar(d, tope) {
|
|
77
|
+
return { lineas: d.slice(0, tope), recortadas: Math.max(0, d.length - tope) };
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/core/diff.ts"],"names":[],"mappings":"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"}
|