xonecode 0.6.0 → 0.8.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/apps/web/dist/assets/{index-rqecK6s2.css → index-Boak51UP.css} +1 -1
- package/apps/web/dist/assets/index-Cg28x6nG.js +477 -0
- package/apps/web/dist/assets/{php-BBij3Lhc.js → php-Cu6F_QCJ.js} +1 -1
- package/apps/web/dist/assets/{ruby-Dq2YEaLo.js → ruby-BiqQPoC6.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/cloudstudio/cloudstudioClient.js +10 -0
- package/dist/agent/cloudstudio/cloudstudioClient.js.map +1 -1
- package/dist/agent/cloudstudio/descarga.js +14 -4
- package/dist/agent/cloudstudio/descarga.js.map +1 -1
- package/dist/agent/cloudstudio/ramaActiva.js +11 -0
- package/dist/agent/cloudstudio/ramaActiva.js.map +1 -0
- package/dist/agent/cloudstudio/subida.js +13 -4
- package/dist/agent/cloudstudio/subida.js.map +1 -1
- package/dist/agent/config/catalogoModelos.js +45 -0
- package/dist/agent/config/catalogoModelos.js.map +1 -1
- package/dist/agent/config/modelos.js +103 -12
- package/dist/agent/config/modelos.js.map +1 -1
- package/dist/agent/config/mudanzaEnDisco.js +121 -0
- package/dist/agent/config/mudanzaEnDisco.js.map +1 -0
- package/dist/agent/config/selectorEnMaquina.js +45 -0
- package/dist/agent/config/selectorEnMaquina.js.map +1 -0
- package/dist/agent/config/settingsEnDisco.js +35 -0
- package/dist/agent/config/settingsEnDisco.js.map +1 -1
- package/dist/agent/dispositivos/juezVisual.js +152 -0
- package/dist/agent/dispositivos/juezVisual.js.map +1 -0
- package/dist/agent/dispositivos/sensorDeArranque.js +154 -0
- package/dist/agent/dispositivos/sensorDeArranque.js.map +1 -0
- package/dist/agent/exportarPdf.js +140 -0
- package/dist/agent/exportarPdf.js.map +1 -0
- package/dist/agent/grafo/criticaVisual.js +115 -0
- package/dist/agent/grafo/criticaVisual.js.map +1 -0
- package/dist/agent/grafo/navegacionXone.js +37 -4
- package/dist/agent/grafo/navegacionXone.js.map +1 -1
- package/dist/agent/grafo/perfiles.js +52 -9
- package/dist/agent/grafo/perfiles.js.map +1 -1
- package/dist/agent/grafo/proyecto.js +74 -7
- package/dist/agent/grafo/proyecto.js.map +1 -1
- package/dist/agent/grafo/skills.js +32 -0
- package/dist/agent/grafo/skills.js.map +1 -1
- package/dist/agent/grafo/xoneAgent.js +103 -13
- package/dist/agent/grafo/xoneAgent.js.map +1 -1
- package/dist/agent/navegacion/estilosEnDisco.js +110 -0
- package/dist/agent/navegacion/estilosEnDisco.js.map +1 -0
- package/dist/agent/navegacion/hechosEnDisco.js +26 -0
- package/dist/agent/navegacion/hechosEnDisco.js.map +1 -0
- package/dist/agent/navegacion/indiceEnDisco.js +15 -0
- package/dist/agent/navegacion/indiceEnDisco.js.map +1 -1
- package/dist/agent/subagentes/agentesEnDisco.js +85 -24
- package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
- package/dist/agent/subagentes/escrituraExterna.js +53 -0
- package/dist/agent/subagentes/escrituraExterna.js.map +1 -1
- package/dist/agent/subagentes/pluginDeSkills.js +99 -0
- package/dist/agent/subagentes/pluginDeSkills.js.map +1 -0
- package/dist/agent/subagentes/subagenteExterno.js +48 -0
- package/dist/agent/subagentes/subagenteExterno.js.map +1 -1
- package/dist/agent/subagentes/subagenteOpencode.js +53 -1
- package/dist/agent/subagentes/subagenteOpencode.js.map +1 -1
- package/dist/agent/tareas/juezDeTarea.js +1 -1
- package/dist/agent/tareas/juezDeTarea.js.map +1 -1
- package/dist/agent/tareas/tareasEnDisco.js +49 -0
- package/dist/agent/tareas/tareasEnDisco.js.map +1 -1
- package/dist/agent/turno/diagnosticoDeTools.js +5 -1
- package/dist/agent/turno/diagnosticoDeTools.js.map +1 -1
- package/dist/agent/turno/informeDeTraza.js +27 -4
- package/dist/agent/turno/informeDeTraza.js.map +1 -1
- package/dist/agent/turno/puente.js +24 -1
- package/dist/agent/turno/puente.js.map +1 -1
- package/dist/agent/turno/resumenDeContexto.js +88 -4
- package/dist/agent/turno/resumenDeContexto.js.map +1 -1
- package/dist/agent/turno/resumenDeTool.js +18 -0
- package/dist/agent/turno/resumenDeTool.js.map +1 -1
- package/dist/agent/turno/rubrica.js +91 -0
- package/dist/agent/turno/rubrica.js.map +1 -0
- package/dist/agent/turno/turnoReal.js +172 -11
- package/dist/agent/turno/turnoReal.js.map +1 -1
- package/dist/cli/consola.js +63 -0
- package/dist/cli/consola.js.map +1 -1
- package/dist/cli/main.js +51 -4
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/run.js +8 -0
- package/dist/cli/run.js.map +1 -1
- package/dist/core/agentes.js +111 -9
- package/dist/core/agentes.js.map +1 -1
- package/dist/core/esfuerzo.js +141 -0
- package/dist/core/esfuerzo.js.map +1 -0
- package/dist/core/estilos.js +78 -0
- package/dist/core/estilos.js.map +1 -0
- package/dist/core/exportacion.js +140 -0
- package/dist/core/exportacion.js.map +1 -0
- package/dist/core/hechosDelProyecto.js +87 -0
- package/dist/core/hechosDelProyecto.js.map +1 -0
- package/dist/core/logDeDispositivo.js +143 -0
- package/dist/core/logDeDispositivo.js.map +1 -0
- package/dist/core/modelos.js +32 -0
- package/dist/core/modelos.js.map +1 -1
- package/dist/core/mudanzaDeWorkspace.js +93 -0
- package/dist/core/mudanzaDeWorkspace.js.map +1 -0
- package/dist/core/planes.js +70 -0
- package/dist/core/planes.js.map +1 -0
- package/dist/core/ports.js +4 -0
- package/dist/core/ports.js.map +1 -1
- package/dist/core/rubrica.js +90 -0
- package/dist/core/rubrica.js.map +1 -0
- package/dist/core/selectorDeCarpeta.js +87 -0
- package/dist/core/selectorDeCarpeta.js.map +1 -0
- package/dist/core/settings.js +54 -5
- package/dist/core/settings.js.map +1 -1
- package/dist/core/shellDeAgente.js +45 -0
- package/dist/core/shellDeAgente.js.map +1 -1
- package/dist/core/topeAgotado.js +69 -0
- package/dist/core/topeAgotado.js.map +1 -0
- package/dist/web/servidor/arranque.js +324 -9
- package/dist/web/servidor/arranque.js.map +1 -1
- package/dist/web/servidor/sesiones.js +30 -2
- package/dist/web/servidor/sesiones.js.map +1 -1
- package/dist/web/servidor/transporte.js.map +1 -1
- package/dist/web/servidor/vestibulo.js +55 -6
- package/dist/web/servidor/vestibulo.js.map +1 -1
- package/package.json +2 -1
- package/skills/xone-hotswap/SKILL.md +31 -9
- package/skills/xone-hotswap/scripts/xone-arrancar-android +202 -0
- package/skills/xone-hotswap/scripts/xone-captura-android +93 -0
- package/skills/xone-hotswap/scripts/xone-desplegar-android +28 -0
- package/skills/xone-hotswap/scripts/xone-hotswap +39 -9
- package/skills/xone-hotswap/scripts/xone-reiniciar-android +28 -0
- package/skills/xone-plan-builder/SKILL.md +22 -4
- package/skills/xone-spec-builder/SKILL.md +37 -7
- package/apps/web/dist/assets/index-DBZTodio.js +0 -477
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El selector de carpeta NATIVO: qué comando lo abre en cada sistema y cómo se lee su
|
|
3
|
+
* respuesta.
|
|
4
|
+
*
|
|
5
|
+
* **Por qué no lo pone el navegador, que es lo primero que uno intenta.** Una página no
|
|
6
|
+
* puede devolver una ruta absoluta y no es un descuido de nadie: `showDirectoryPicker()`
|
|
7
|
+
* entrega un handle del que solo se puede leer el NOMBRE de la carpeta, y un
|
|
8
|
+
* `<input webkitdirectory>` entrega rutas RELATIVAS a lo elegido. Las dos cosas son
|
|
9
|
+
* deliberadas —una web no tiene por qué saber cómo está montado tu disco— y las dos son
|
|
10
|
+
* justo lo que aquí no sirve: `settings.workspace` necesita la ruta entera.
|
|
11
|
+
*
|
|
12
|
+
* **Por qué tampoco un explorador propio servido por nosotros.** Se puede: el servidor lista
|
|
13
|
+
* carpetas y el cliente navega. El precio es que el ÁRBOL DE CARPETAS de la máquina empieza
|
|
14
|
+
* a viajar por el cable, y eso es exactamente lo que `sinRutas` evita — una ruta del
|
|
15
|
+
* workspace es la excepción declarada; el mapa del disco entero no lo es, y sería una
|
|
16
|
+
* excepción mucho más ancha para el mismo resultado.
|
|
17
|
+
*
|
|
18
|
+
* **Así que lo abre el sistema donde corre la consola.** Solo cruza el cable la carpeta que
|
|
19
|
+
* la persona elige, que es la misma que iba a teclear. El precio declarado es que el diálogo
|
|
20
|
+
* sale en ESA máquina: con la consola por un túnel, el botón no sirve — por eso el campo de
|
|
21
|
+
* texto sigue siendo el camino principal y esto es un atajo, nunca el único.
|
|
22
|
+
*
|
|
23
|
+
* Esta parte es pura: compone el comando y lee su salida. Lanzarlo es de
|
|
24
|
+
* `agent/config/selectorEnMaquina.ts`.
|
|
25
|
+
*/
|
|
26
|
+
/** Lo que tarda un diálogo en contestar lo pone una persona, así que el tope es largo: solo
|
|
27
|
+
* existe para que un diálogo que nadie cierra no deje un proceso vivo para siempre. */
|
|
28
|
+
export const TOPE_DEL_SELECTOR_MS = 5 * 60 * 1000;
|
|
29
|
+
/**
|
|
30
|
+
* El comando que abre el selector, o AUSENTE si este sistema no tiene ninguno conocido.
|
|
31
|
+
*
|
|
32
|
+
* Ausente no es un fallo: es «aquí no hay selector», y entonces no se ofrece el botón. Un
|
|
33
|
+
* botón que no hace nada es peor que no tenerlo, y el campo de texto ya resuelve el caso.
|
|
34
|
+
*
|
|
35
|
+
* `desde` es dónde se abre el diálogo — la carpeta que hay puesta ahora, para no empezar en
|
|
36
|
+
* un sitio cualquiera. Se pasa como argumento SEPARADO, nunca interpolado en el guion de
|
|
37
|
+
* AppleScript: ahí dentro una comilla en un nombre de carpeta cerraría la cadena.
|
|
38
|
+
*/
|
|
39
|
+
export function comandoDelSelector(plataforma, desde) {
|
|
40
|
+
if (plataforma === "darwin") {
|
|
41
|
+
// `choose folder` con la ubicación por argumento (`argv of me`), y no pegada al guion.
|
|
42
|
+
// Un `POSIX file` que no existe hace fallar el diálogo entero, así que el guion cae a la
|
|
43
|
+
// casa cuando no se le da ninguna o la que se le da no vale.
|
|
44
|
+
const guion = [
|
|
45
|
+
"on run argumentos",
|
|
46
|
+
" set destino to item 1 of argumentos",
|
|
47
|
+
" try",
|
|
48
|
+
' set inicio to POSIX file destino as alias',
|
|
49
|
+
" on error",
|
|
50
|
+
" set inicio to path to home folder",
|
|
51
|
+
" end try",
|
|
52
|
+
' set elegida to choose folder with prompt "Dónde se bajan los proyectos de xonecode" default location inicio',
|
|
53
|
+
" return POSIX path of elegida",
|
|
54
|
+
"end run",
|
|
55
|
+
].join("\n");
|
|
56
|
+
return { programa: "osascript", argumentos: ["-e", guion, desde ?? ""] };
|
|
57
|
+
}
|
|
58
|
+
if (plataforma === "linux") {
|
|
59
|
+
return {
|
|
60
|
+
programa: "zenity",
|
|
61
|
+
argumentos: [
|
|
62
|
+
"--file-selection",
|
|
63
|
+
"--directory",
|
|
64
|
+
"--title=Dónde se bajan los proyectos de xonecode",
|
|
65
|
+
...(desde === undefined ? [] : [`--filename=${desde.replace(/\/*$/, "/")}`]),
|
|
66
|
+
],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* La carpeta elegida, leída de lo que escupió el comando — o AUSENTE si no se eligió ninguna.
|
|
73
|
+
*
|
|
74
|
+
* **Cancelar no es un fallo y se cuenta igual que no elegir.** `osascript` sale con código 1
|
|
75
|
+
* y `zenity` con 1 cuando la persona cierra el diálogo, así que quien llama no puede
|
|
76
|
+
* distinguir un «no, gracias» de una avería por el código; lo que sí distingue es que no hay
|
|
77
|
+
* ruta, y con eso basta: el campo se queda como estaba.
|
|
78
|
+
*
|
|
79
|
+
* Se recorta el salto de línea final, que es del terminal y no del dato, y se exige que
|
|
80
|
+
* empiece por `/`: cualquier otra cosa que salga por ahí no es una carpeta y no se cuela
|
|
81
|
+
* hasta el validador disfrazada de ruta.
|
|
82
|
+
*/
|
|
83
|
+
export function carpetaDeLaSalida(salida) {
|
|
84
|
+
const limpia = salida.trim().replace(/\/+$/, "");
|
|
85
|
+
return limpia.startsWith("/") ? limpia : undefined;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=selectorDeCarpeta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectorDeCarpeta.js","sourceRoot":"","sources":["../../src/core/selectorDeCarpeta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;wFACwF;AACxF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAOlD;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,KAAc;IACnE,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,uFAAuF;QACvF,yFAAyF;QACzF,6DAA6D;QAC7D,MAAM,KAAK,GAAG;YACZ,mBAAmB;YACnB,uCAAuC;YACvC,OAAO;YACP,+CAA+C;YAC/C,YAAY;YACZ,uCAAuC;YACvC,WAAW;YACX,+GAA+G;YAC/G,gCAAgC;YAChC,SAAS;SACV,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;IAC3E,CAAC;IACD,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE;gBACV,kBAAkB;gBAClB,aAAa;gBACb,kDAAkD;gBAClD,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;aAC7E;SACF,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC"}
|
package/dist/core/settings.js
CHANGED
|
@@ -216,16 +216,27 @@ export function segmentoSeguro(valor, que) {
|
|
|
216
216
|
return valor;
|
|
217
217
|
}
|
|
218
218
|
/**
|
|
219
|
-
* Dónde queda la copia local de un proyecto
|
|
219
|
+
* Dónde queda la copia local de un proyecto: `<workspace>/<entorno>/<proyecto>`.
|
|
220
220
|
*
|
|
221
|
-
*
|
|
222
|
-
* lo que hace predecible encontrar una copia sin consultar un índice.
|
|
221
|
+
* El WORKSPACE es configurable (`settings.workspace`); la disposición de dentro NO, porque
|
|
222
|
+
* es lo que hace predecible encontrar una copia sin consultar un índice.
|
|
223
|
+
*
|
|
224
|
+
* **El literal `workspace` vivía aquí, en MEDIO** (`<base>/<entorno>/workspace/<proyecto>`),
|
|
225
|
+
* y se ha mudado a la omisión de la base (`~/.xonecode/workspace`). Dos motivos medidos:
|
|
226
|
+
* con la base en `~/.xonecode`, los ids de los entornos quedaban de HERMANOS de `agentes/`,
|
|
227
|
+
* `skills/`, `tareas/` y `auth.json` —la casa del harness mezclada con el trabajo—; y quien
|
|
228
|
+
* eligiera una carpeta suya se encontraba un nivel `workspace/` que no había pedido. Con el
|
|
229
|
+
* literal en la base, lo que se configura ES el workspace.
|
|
230
|
+
*
|
|
231
|
+
* **El segmento del ENTORNO se queda, y no es decoración**: el mismo nombre de proyecto
|
|
232
|
+
* existe a la vez en dos entornos, y sin ese nivel serían la misma carpeta (ver
|
|
233
|
+
* `Wizard.tsx`, que ya explica por qué un on-premise necesita id propio).
|
|
223
234
|
*/
|
|
224
235
|
/**
|
|
225
236
|
* ¿Esa raíz es una copia que creó xonecode, o una carpeta del usuario?
|
|
226
237
|
*
|
|
227
238
|
* De esto depende si el harness puede COMMITEAR solo al cerrar cada turno. En
|
|
228
|
-
* `<
|
|
239
|
+
* `<workspace>/<entorno>/<proyecto>` la carpeta la creó él y es suya; en la que abrió
|
|
229
240
|
* una persona —un proyecto offline, o `./bin/xonecode` dentro de su propio repo— un commit
|
|
230
241
|
* por turno sería ensuciarle el historial cada vez que habla con el agente.
|
|
231
242
|
*
|
|
@@ -240,7 +251,45 @@ export function dentroDelWorkspace(raiz, base) {
|
|
|
240
251
|
const fuera = normal(base);
|
|
241
252
|
return dentro.length > fuera.length && fuera.every((seg, i) => dentro[i] === seg);
|
|
242
253
|
}
|
|
254
|
+
/**
|
|
255
|
+
* Un `~/…` tecleado, resuelto contra la casa. Solo `~` y `~/…`: un `~otro` es la casa de
|
|
256
|
+
* OTRA persona en la sintaxis del shell, y aquí no se resuelve — se deja tal cual y se
|
|
257
|
+
* rechaza después por no ser absoluta.
|
|
258
|
+
*
|
|
259
|
+
* Es una comodidad de ENTRADA y nada más. **Lo que se enseña y lo que se guarda es la ruta
|
|
260
|
+
* ENTERA**: se probó a mandarla abreviada por el cable, para que el caso normal no llevara
|
|
261
|
+
* el nombre de la cuenta del sistema, y no se sostiene — la cabecera de esa misma consola ya
|
|
262
|
+
* saluda por el nombre del usuario, así que el `~` no tapaba nada que no estuviera ya, y a
|
|
263
|
+
* cambio dejaba en pantalla una ruta que no se puede comprobar de un vistazo, que es justo
|
|
264
|
+
* para lo que ese campo existe. `casa` entra por parámetro: este módulo es puro.
|
|
265
|
+
*/
|
|
266
|
+
export function expandirConCasa(ruta, casa) {
|
|
267
|
+
const limpio = ruta.trim();
|
|
268
|
+
if (limpio === "~")
|
|
269
|
+
return casa;
|
|
270
|
+
return limpio.startsWith("~/") ? posix.join(casa, limpio.slice(2)) : limpio;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* ¿Vale eso como workspace? Ausente = sí.
|
|
274
|
+
*
|
|
275
|
+
* Se comprueba sobre la ruta ya EXPANDIDA. Tres noes, y ninguno es de estilo: vacío no es
|
|
276
|
+
* una elección, una ruta relativa dependería del directorio desde el que se arrancó la
|
|
277
|
+
* consola —que no es el proyecto ni nada estable— y la raíz del disco convertiría cada id de
|
|
278
|
+
* entorno en una carpeta de primer nivel del sistema.
|
|
279
|
+
*/
|
|
280
|
+
export function motivoDeWorkspaceInaceptable(ruta) {
|
|
281
|
+
const limpio = ruta.trim();
|
|
282
|
+
if (limpio === "")
|
|
283
|
+
return "escribe una carpeta: en blanco no es una elección";
|
|
284
|
+
if (!posix.isAbsolute(limpio)) {
|
|
285
|
+
return "tiene que ser una ruta absoluta, que empiece por «/» o por «~/»";
|
|
286
|
+
}
|
|
287
|
+
if (posix.normalize(limpio).replace(/\/+$/, "") === "") {
|
|
288
|
+
return "la raíz del disco no: ahí cada entorno sería una carpeta de primer nivel del sistema";
|
|
289
|
+
}
|
|
290
|
+
return undefined;
|
|
291
|
+
}
|
|
243
292
|
export function rutaDeWorkspace(base, entorno, proyecto) {
|
|
244
|
-
return posix.join(base, segmentoSeguro(entorno, "id de entorno"),
|
|
293
|
+
return posix.join(base, segmentoSeguro(entorno, "id de entorno"), segmentoSeguro(proyecto, "nombre de proyecto"));
|
|
245
294
|
}
|
|
246
295
|
//# sourceMappingURL=settings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/core/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAc,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAqB3D;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE,cAAc,CAAU,CAAC;AAsBzG,2CAA2C;AAC3C,MAAM,UAAU,MAAM,CAAC,OAA0C,EAAE,UAAmC;IACpG,OAAO,OAAO,EAAE,CAAC,UAAU,CAAC,KAAK,KAAK,CAAC;AACzC,CAAC;AAsBD;;;;GAIG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/core/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -68,6 +68,48 @@ export const VARIABLE_DE_ARTEFACTOS = "XONECODE_ARTEFACTOS";
|
|
|
68
68
|
export function variableDeSkill(nombre) {
|
|
69
69
|
return `XONECODE_SKILL_${nombre.toUpperCase().replace(/-/g, "_")}`;
|
|
70
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Las dos rutas de Android que la shell necesita y no puede deducir.
|
|
73
|
+
*
|
|
74
|
+
* **Medido en la máquina de desarrollo**: `adb` está en el PATH (`/opt/homebrew/bin/adb`) y
|
|
75
|
+
* `emulator` **no** —vive en `.../share/android-commandlinetools/emulator/`— con
|
|
76
|
+
* `ANDROID_HOME` y `ANDROID_SDK_ROOT` vacías. O sea que el caso normal de un Mac con
|
|
77
|
+
* Homebrew es justo el que deja al agente sin el binario que arranca un emulador.
|
|
78
|
+
*
|
|
79
|
+
* Quien sabe dónde está el SDK es `localizadorDeAndroid` (`agent/dispositivos/`), que ya
|
|
80
|
+
* mira las dos variables de entorno y las raíces por omisión de cada plataforma. Pasarlo por
|
|
81
|
+
* aquí es lo que evita que el script tenga que adivinarlo: **una segunda regla sobre dónde
|
|
82
|
+
* vive el SDK es una segunda regla que puede divergir**, y ésta es la clase de cosa que falla
|
|
83
|
+
* en silencio —el script no encuentra el binario, el modelo se apaña por su cuenta—.
|
|
84
|
+
*
|
|
85
|
+
* Va por VARIABLE y no por el prompt por lo mismo que las skills: el comando que el modelo
|
|
86
|
+
* componga sale como `detalle` del evento, y ahí no puede viajar una ruta de la máquina
|
|
87
|
+
* (`sinRutas`).
|
|
88
|
+
*/
|
|
89
|
+
export const VARIABLE_DE_EMULATOR = "XONECODE_EMULATOR";
|
|
90
|
+
export const VARIABLE_DE_ADB = "XONECODE_ADB";
|
|
91
|
+
/**
|
|
92
|
+
* De un localizador de binarios del SDK a las variables que ve la shell.
|
|
93
|
+
*
|
|
94
|
+
* PURA y con el localizador por parámetro: así se prueba sin disco, y sobre todo así la
|
|
95
|
+
* composición de producción no vive dentro de `entornoDeLaShellDelProyecto` —que toca
|
|
96
|
+
* `process.env` y `existsSync`, y por tanto ningún test suyo podría ver si el localizador
|
|
97
|
+
* llegó a estar cableado—. Es el patrón de fallo que este repo lleva contadas nueve veces.
|
|
98
|
+
*
|
|
99
|
+
* Lo que no se encuentra **no sale**, ni siquiera como cadena vacía: la misma regla que el
|
|
100
|
+
* resto del módulo. Un `XONECODE_EMULATOR=""` no es «no consta», es una ruta rota que el
|
|
101
|
+
* script tomaría por buena.
|
|
102
|
+
*/
|
|
103
|
+
export function variablesDeAndroid(enSdk) {
|
|
104
|
+
const variables = {};
|
|
105
|
+
const emulator = enSdk("emulator", "emulator");
|
|
106
|
+
if (emulator !== undefined)
|
|
107
|
+
variables[VARIABLE_DE_EMULATOR] = emulator;
|
|
108
|
+
const adb = enSdk("adb", "platform-tools");
|
|
109
|
+
if (adb !== undefined)
|
|
110
|
+
variables[VARIABLE_DE_ADB] = adb;
|
|
111
|
+
return variables;
|
|
112
|
+
}
|
|
71
113
|
export function entornoDeShell(opciones) {
|
|
72
114
|
const credenciales = new Set(Object.values(VARIABLES_POR_PROVEEDOR));
|
|
73
115
|
const limpio = {};
|
|
@@ -94,6 +136,9 @@ export function entornoDeShell(opciones) {
|
|
|
94
136
|
}
|
|
95
137
|
if (opciones.artefactos !== undefined)
|
|
96
138
|
limpio[VARIABLE_DE_ARTEFACTOS] = opciones.artefactos;
|
|
139
|
+
// Después de la copia del entorno heredado, así que lo que resuelve el localizador gana
|
|
140
|
+
// sobre un valor que viniera de fuera: el localizador SÍ ha comprobado que el fichero está.
|
|
141
|
+
Object.assign(limpio, opciones.android ?? {});
|
|
97
142
|
return limpio;
|
|
98
143
|
}
|
|
99
144
|
//# sourceMappingURL=shellDeAgente.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shellDeAgente.js","sourceRoot":"","sources":["../../src/core/shellDeAgente.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,sGAAsG;AACtG,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,qBAAqB,CAAC;AAE5D;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,kBAAkB,MAAM,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;AACrE,CAAC;AAQD,MAAM,UAAU,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"shellDeAgente.js","sourceRoot":"","sources":["../../src/core/shellDeAgente.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,sGAAsG;AACtG,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,qBAAqB,CAAC;AAE5D;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,kBAAkB,MAAM,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;AACrE,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AACxD,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC;AAE9C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAiE;IAEjE,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC/C,IAAI,QAAQ,KAAK,SAAS;QAAE,SAAS,CAAC,oBAAoB,CAAC,GAAG,QAAQ,CAAC;IACvE,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IAC3C,IAAI,GAAG,KAAK,SAAS;QAAE,SAAS,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC;IACxD,OAAO,SAAS,CAAC;AACnB,CAAC;AAQD,MAAM,UAAU,cAAc,CAAC,QAgB9B;IACC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC7E,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,uFAAuF;QACvF,sCAAsC;QACtC,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QACtC,IAAI,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC;YAAE,SAAS;QACjD,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;IACpD,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;IACzC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,0FAA0F;QAC1F,gEAAgE;QAChE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChH,CAAC;IACD,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS;QAAE,MAAM,CAAC,sBAAsB,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC;IAC5F,wFAAwF;IACxF,4FAA4F;IAC5F,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAE9C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lo que se le dice a quien delegó cuando a un especialista se le acabó el presupuesto.
|
|
3
|
+
*
|
|
4
|
+
* ## El fallo que cierra, medido el 19-09-2026
|
|
5
|
+
*
|
|
6
|
+
* Cada especialista corre con un tope de llamadas al modelo
|
|
7
|
+
* (`TOPE_DE_LLAMADAS_DEL_ESPECIALISTA`, con `exitBehavior: "end"`). Al agotarse, la librería
|
|
8
|
+
* añade un `AIMessage` con SU texto —«Model call limits exceeded: run level call limit reached
|
|
9
|
+
* with 15 model calls»— y salta al final. Y el `task` de deepagents devuelve **solo el último
|
|
10
|
+
* mensaje** (`extractLastMessage`).
|
|
11
|
+
*
|
|
12
|
+
* O sea que lo que el orquestador recibe como respuesta del especialista es esa frase, en
|
|
13
|
+
* inglés y en jerga del harness, **y todo lo que el especialista averiguó en sus quince
|
|
14
|
+
* llamadas se tira**. Medido: 100-160k de entrada por especialista, y menos de 900 tokens de
|
|
15
|
+
* salida devueltos. Por eso el orquestador encadena al siguiente: no es que enrute mal, es que
|
|
16
|
+
* no recibe nada con lo que seguir.
|
|
17
|
+
*
|
|
18
|
+
* **Por eso el tope es NUESTRO** (`topeDeLlamadas`) en vez de parchear el de la librería: sus
|
|
19
|
+
* dos ganchos de salida —el mensaje y el reset del contador— van detrás de un `jumpTo: "end"`
|
|
20
|
+
* que cortocircuita todo lo que haya debajo, así que **no corre NINGÚN middleware posterior**
|
|
21
|
+
* (medido contra la librería real, con `FakeToolCallingModel` y `runLimit: 0`). No había dónde
|
|
22
|
+
* engancharse: ni `afterAgent`, ni otro `beforeModel`. Reconocer su frase en inglés para
|
|
23
|
+
* sustituirla habría atado esto a un texto suyo, y encima sin sitio donde hacerlo.
|
|
24
|
+
*
|
|
25
|
+
* Esto NO sube el tope —que está medido y argumentado— ni lo quita. Hace tres cosas:
|
|
26
|
+
* devuelve el trabajo que se iba a tirar, lo marca como PARCIAL para que nadie lo lea como una
|
|
27
|
+
* conclusión, y dice qué hacer a continuación. Que un presupuesto se agote es normal; que se
|
|
28
|
+
* agote **en silencio** es el fallo.
|
|
29
|
+
*
|
|
30
|
+
* Puro y en `core/`: el texto se puede probar sin librería ni modelo. Quién lo mete en la
|
|
31
|
+
* conversación es de `agent/`.
|
|
32
|
+
*/
|
|
33
|
+
/**
|
|
34
|
+
* Cuánto del trabajo parcial se devuelve.
|
|
35
|
+
*
|
|
36
|
+
* Hay tope porque esto viaja como respuesta de una `task` y entra ENTERO en el contexto del
|
|
37
|
+
* orquestador: devolver sin límite convertiría el arreglo de un gasto en otro gasto. Lo que no
|
|
38
|
+
* cabe se dice, como en todas partes aquí.
|
|
39
|
+
*/
|
|
40
|
+
export const TOPE_DE_PARCIAL = 4_000;
|
|
41
|
+
/**
|
|
42
|
+
* El mensaje que sustituye al de la librería.
|
|
43
|
+
*
|
|
44
|
+
* **Habla con voz del harness y en primera persona del especialista**, porque quien lo va a
|
|
45
|
+
* leer es el orquestador y lo va a leer como la respuesta de aquél. Y dice las tres cosas que
|
|
46
|
+
* la frase de la librería no dice: que está a medias, qué había, y qué NO hacer — volver a
|
|
47
|
+
* encargarle lo mismo a otro es exactamente lo que se midió que pasa.
|
|
48
|
+
*/
|
|
49
|
+
export function mensajeDeTopeAgotado({ limite, parcial }) {
|
|
50
|
+
const hay = parcial !== undefined && parcial.trim() !== "";
|
|
51
|
+
const recortado = hay && parcial.length > TOPE_DE_PARCIAL;
|
|
52
|
+
return [
|
|
53
|
+
`[harness] Me he quedado sin presupuesto: ${limite} llamadas al modelo, y NO he terminado.`,
|
|
54
|
+
"",
|
|
55
|
+
...(hay
|
|
56
|
+
? [
|
|
57
|
+
"Esto es lo último que tenía, y es PARCIAL — no es una conclusión:",
|
|
58
|
+
"",
|
|
59
|
+
recortado ? `${parcial.slice(0, TOPE_DE_PARCIAL)}…` : parcial,
|
|
60
|
+
...(recortado ? ["", `(recortado: había ${parcial.length} caracteres)`] : []),
|
|
61
|
+
]
|
|
62
|
+
: ["No llegué a dejar nada en claro: se me fue el presupuesto antes."]),
|
|
63
|
+
"",
|
|
64
|
+
"NO se lo encargues igual a otro especialista: gastará su presupuesto en volver a averiguar",
|
|
65
|
+
"lo mismo. O le pasas lo de arriba en el bloque `HANDOFF DE ANÁLISIS`, o parte el encargo en",
|
|
66
|
+
"uno más pequeño.",
|
|
67
|
+
].join("\n");
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=topeAgotado.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topeAgotado.js","sourceRoot":"","sources":["../../src/core/topeAgotado.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;AASrC;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAe;IACnE,MAAM,GAAG,GAAG,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IAC3D,MAAM,SAAS,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,GAAG,eAAe,CAAC;IAC1D,OAAO;QACL,4CAA4C,MAAM,yCAAyC;QAC3F,EAAE;QACF,GAAG,CAAC,GAAG;YACL,CAAC,CAAC;gBACE,mEAAmE;gBACnE,EAAE;gBACF,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO;gBAC7D,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,qBAAqB,OAAO,CAAC,MAAM,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9E;YACH,CAAC,CAAC,CAAC,kEAAkE,CAAC,CAAC;QACzE,EAAE;QACF,4FAA4F;QAC5F,6FAA6F;QAC7F,kBAAkB;KACnB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|