xonecode 0.5.0 → 0.6.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 +1 -1
- package/THIRD_PARTY_NOTICES.md +32 -0
- package/apps/web/dist/assets/index-DBZTodio.js +477 -0
- package/apps/web/dist/assets/{index-BB3SamhR.css → index-rqecK6s2.css} +1 -1
- package/apps/web/dist/assets/{php-D_2--9WK.js → php-BBij3Lhc.js} +1 -1
- package/apps/web/dist/assets/{ruby-DSHSDbk1.js → ruby-Dq2YEaLo.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/cloudstudio/cloudstudioClient.js.map +1 -0
- package/dist/agent/{cloudstudioMcp.js → cloudstudio/cloudstudioMcp.js} +5 -5
- package/dist/agent/cloudstudio/cloudstudioMcp.js.map +1 -0
- package/dist/agent/{descarga.js → cloudstudio/descarga.js} +3 -3
- package/dist/agent/cloudstudio/descarga.js.map +1 -0
- package/dist/agent/cloudstudio/manifiesto.js.map +1 -0
- package/dist/agent/{subida.js → cloudstudio/subida.js} +3 -3
- package/dist/agent/cloudstudio/subida.js.map +1 -0
- package/dist/agent/{zip.js → cloudstudio/zip.js} +1 -1
- package/dist/agent/cloudstudio/zip.js.map +1 -0
- package/dist/agent/{authEnDisco.js → config/authEnDisco.js} +3 -3
- package/dist/agent/config/authEnDisco.js.map +1 -0
- package/dist/agent/{catalogoModelos.js → config/catalogoModelos.js} +2 -1
- package/dist/agent/config/catalogoModelos.js.map +1 -0
- package/dist/agent/{configEnDisco.js → config/configEnDisco.js} +6 -6
- package/dist/agent/config/configEnDisco.js.map +1 -0
- package/dist/agent/{crearProyecto.js → config/crearProyecto.js} +2 -2
- package/dist/agent/config/crearProyecto.js.map +1 -0
- package/dist/agent/config/entorno.js.map +1 -0
- package/dist/agent/config/gemini.js.map +1 -0
- package/dist/agent/{modelos.js → config/modelos.js} +17 -3
- package/dist/agent/config/modelos.js.map +1 -0
- package/dist/agent/{modelosDeMotor.js → config/modelosDeMotor.js} +1 -1
- package/dist/agent/config/modelosDeMotor.js.map +1 -0
- package/dist/agent/{persona.js → config/persona.js} +1 -1
- package/dist/agent/config/persona.js.map +1 -0
- package/dist/agent/{settingsEnDisco.js → config/settingsEnDisco.js} +2 -2
- package/dist/agent/config/settingsEnDisco.js.map +1 -0
- package/dist/agent/{versionEnDisco.js → config/versionEnDisco.js} +8 -4
- package/dist/agent/config/versionEnDisco.js.map +1 -0
- package/dist/agent/dispositivos/arranqueDeEmulador.js +146 -0
- package/dist/agent/dispositivos/arranqueDeEmulador.js.map +1 -0
- package/dist/agent/{dispositivosEnMaquina.js → dispositivos/dispositivosEnMaquina.js} +93 -6
- package/dist/agent/dispositivos/dispositivosEnMaquina.js.map +1 -0
- package/dist/agent/dispositivos/hotswap.js.map +1 -0
- package/dist/agent/dispositivos/instalacionEnMaquina.js.map +1 -0
- package/dist/agent/{lanzamientoEnMaquina.js → dispositivos/lanzamientoEnMaquina.js} +1 -1
- package/dist/agent/dispositivos/lanzamientoEnMaquina.js.map +1 -0
- package/dist/agent/{paqueteDelProyecto.js → dispositivos/paqueteDelProyecto.js} +5 -5
- package/dist/agent/dispositivos/paqueteDelProyecto.js.map +1 -0
- package/dist/agent/dispositivos/procesosEnMaquina.js.map +1 -0
- package/dist/agent/{arbolDeProyecto.js → grafo/arbolDeProyecto.js} +2 -2
- package/dist/agent/grafo/arbolDeProyecto.js.map +1 -0
- package/dist/agent/{artefactosEnDisco.js → grafo/artefactosEnDisco.js} +2 -2
- package/dist/agent/grafo/artefactosEnDisco.js.map +1 -0
- package/dist/agent/{busquedaRegex.js → grafo/busquedaRegex.js} +41 -1
- package/dist/agent/grafo/busquedaRegex.js.map +1 -0
- package/dist/agent/grafo/excluirTools.js +82 -0
- package/dist/agent/grafo/excluirTools.js.map +1 -0
- package/dist/agent/{memoriaDeProyecto.js → grafo/memoriaDeProyecto.js} +1 -1
- package/dist/agent/grafo/memoriaDeProyecto.js.map +1 -0
- package/dist/agent/grafo/navegacionXone.js +198 -0
- package/dist/agent/grafo/navegacionXone.js.map +1 -0
- package/dist/agent/{perfiles.js → grafo/perfiles.js} +51 -8
- package/dist/agent/grafo/perfiles.js.map +1 -0
- package/dist/agent/{proyecto.js → grafo/proyecto.js} +207 -24
- package/dist/agent/grafo/proyecto.js.map +1 -0
- package/dist/agent/grafo/skills.js +393 -0
- package/dist/agent/grafo/skills.js.map +1 -0
- package/dist/agent/{xoneAgent.js → grafo/xoneAgent.js} +196 -67
- package/dist/agent/grafo/xoneAgent.js.map +1 -0
- package/dist/agent/navegacion/indiceEnDisco.js +21 -0
- package/dist/agent/navegacion/indiceEnDisco.js.map +1 -0
- package/dist/agent/navegacion/modeloDeProyecto.js +228 -0
- package/dist/agent/navegacion/modeloDeProyecto.js.map +1 -0
- package/dist/agent/raizDelPaquete.js +56 -0
- package/dist/agent/raizDelPaquete.js.map +1 -0
- package/dist/agent/{checkpointer.js → sesiones/checkpointer.js} +2 -2
- package/dist/agent/sesiones/checkpointer.js.map +1 -0
- package/dist/agent/sesiones/git.js.map +1 -0
- package/dist/agent/{gitSync.js → sesiones/gitSync.js} +3 -3
- package/dist/agent/sesiones/gitSync.js.map +1 -0
- package/dist/agent/{sesionGit.js → sesiones/sesionGit.js} +2 -2
- package/dist/agent/sesiones/sesionGit.js.map +1 -0
- package/dist/agent/{agentesEnDisco.js → subagentes/agentesEnDisco.js} +304 -86
- package/dist/agent/subagentes/agentesEnDisco.js.map +1 -0
- package/dist/agent/subagentes/consumoExterno.js.map +1 -0
- package/dist/agent/subagentes/escrituraDeCodex.js.map +1 -0
- package/dist/agent/{escrituraDeOpencode.js → subagentes/escrituraDeOpencode.js} +1 -1
- package/dist/agent/subagentes/escrituraDeOpencode.js.map +1 -0
- package/dist/agent/{escrituraExterna.js → subagentes/escrituraExterna.js} +6 -6
- package/dist/agent/subagentes/escrituraExterna.js.map +1 -0
- package/dist/agent/subagentes/subagenteCodex.js.map +1 -0
- package/dist/agent/subagentes/subagenteExterno.js.map +1 -0
- package/dist/agent/subagentes/subagenteOpencode.js.map +1 -0
- package/dist/agent/{aumentador.js → tareas/aumentador.js} +2 -2
- package/dist/agent/tareas/aumentador.js.map +1 -0
- package/dist/agent/{juezDeTarea.js → tareas/juezDeTarea.js} +5 -5
- package/dist/agent/tareas/juezDeTarea.js.map +1 -0
- package/dist/agent/{tareasEnDisco.js → tareas/tareasEnDisco.js} +4 -4
- package/dist/agent/tareas/tareasEnDisco.js.map +1 -0
- package/dist/agent/turno/diagnosticoDeTools.js.map +1 -0
- package/dist/agent/{guionizado.js → turno/guionizado.js} +1 -1
- package/dist/agent/turno/guionizado.js.map +1 -0
- package/dist/agent/turno/informeDeTraza.js +222 -0
- package/dist/agent/turno/informeDeTraza.js.map +1 -0
- package/dist/agent/turno/inspectorDePrompt.js +205 -0
- package/dist/agent/turno/inspectorDePrompt.js.map +1 -0
- package/dist/agent/{instantanea.js → turno/instantanea.js} +7 -2
- package/dist/agent/turno/instantanea.js.map +1 -0
- package/dist/agent/{interrupts.js → turno/interrupts.js} +2 -2
- package/dist/agent/turno/interrupts.js.map +1 -0
- package/dist/agent/turno/mensajes.js.map +1 -0
- package/dist/agent/turno/normalizar.js.map +1 -0
- package/dist/agent/{puente.js → turno/puente.js} +47 -3
- package/dist/agent/turno/puente.js.map +1 -0
- package/dist/agent/turno/resumenDeContexto.js +176 -0
- package/dist/agent/turno/resumenDeContexto.js.map +1 -0
- package/dist/agent/{resumenDeTool.js → turno/resumenDeTool.js} +15 -0
- package/dist/agent/turno/resumenDeTool.js.map +1 -0
- package/dist/agent/turno/textoDeTool.js.map +1 -0
- package/dist/agent/{turnoReal.js → turno/turnoReal.js} +38 -14
- package/dist/agent/turno/turnoReal.js.map +1 -0
- package/dist/agent/turno/verificador.js.map +1 -0
- package/dist/cli/config.js +1 -1
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/consola.js +9 -9
- package/dist/cli/consola.js.map +1 -1
- package/dist/cli/describe.js +2 -2
- package/dist/cli/describe.js.map +1 -1
- package/dist/cli/doctor.js +1 -1
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/fuentesDeDisco.js +29 -0
- package/dist/cli/fuentesDeDisco.js.map +1 -0
- package/dist/cli/main.js +37 -28
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/run.js +32 -10
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/traza.js +48 -0
- package/dist/cli/traza.js.map +1 -0
- package/dist/cli/tui/correrTui.js +4 -4
- package/dist/cli/tui/correrTui.js.map +1 -1
- package/dist/cli/verify.js +1 -1
- package/dist/cli/verify.js.map +1 -1
- package/dist/core/actos.js +1 -1
- package/dist/core/adjuntos.js +2 -2
- package/dist/core/agentes.js +145 -7
- package/dist/core/agentes.js.map +1 -1
- package/dist/core/artefactos.js +4 -4
- package/dist/core/config.js +1 -1
- package/dist/core/contextos.js +12 -1
- package/dist/core/contextos.js.map +1 -1
- package/dist/core/descargas.js +1 -1
- package/dist/core/dispositivos.js +53 -3
- package/dist/core/dispositivos.js.map +1 -1
- package/dist/core/esqueleto.js +1 -1
- package/dist/core/modelos.js +16 -3
- package/dist/core/modelos.js.map +1 -1
- package/dist/core/navegacion.js +134 -0
- package/dist/core/navegacion.js.map +1 -0
- package/dist/core/notify.js +5 -0
- package/dist/core/notify.js.map +1 -1
- package/dist/core/planDeSubida.js +1 -1
- package/dist/core/settings.js +2 -2
- package/dist/core/shellDeAgente.js +99 -0
- package/dist/core/shellDeAgente.js.map +1 -0
- package/dist/core/skills.js +158 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/zipDeSkill.js +107 -0
- package/dist/core/zipDeSkill.js.map +1 -0
- package/dist/vendor/sqliteSaver.js +389 -0
- package/dist/vendor/sqliteSaver.js.map +1 -0
- package/dist/web/servidor/arranque.js +531 -47
- package/dist/web/servidor/arranque.js.map +1 -1
- package/dist/web/servidor/corredorDeTareas.js +3 -3
- package/dist/web/servidor/corredorDeTareas.js.map +1 -1
- package/dist/web/servidor/sesiones.js +4 -4
- package/dist/web/servidor/transporte.js +1 -1
- package/dist/web/servidor/transporte.js.map +1 -1
- package/dist/web/servidor/vestibulo.js +7 -7
- package/dist/web/servidor/vestibulo.js.map +1 -1
- package/package.json +9 -5
- package/skills/archify/SKILL.md +25 -2
- package/skills/artifacts-builder/SKILL.md +23 -0
- package/skills/xone-hotswap/SKILL.md +74 -0
- package/skills/xone-hotswap/scripts/xone-arrancar-ios +85 -0
- package/skills/xone-hotswap/scripts/xone-desplegar-android +411 -0
- package/skills/xone-hotswap/scripts/xone-hotswap +171 -0
- package/skills/xone-hotswap/scripts/xone-log-android +102 -0
- package/skills/xone-hotswap/scripts/xone-reiniciar-android +104 -0
- package/apps/web/dist/assets/index-CFYAoHdw.js +0 -477
- package/dist/agent/agentesEnDisco.js.map +0 -1
- package/dist/agent/arbolDeProyecto.js.map +0 -1
- package/dist/agent/artefactosEnDisco.js.map +0 -1
- package/dist/agent/aumentador.js.map +0 -1
- package/dist/agent/authEnDisco.js.map +0 -1
- package/dist/agent/busquedaRegex.js.map +0 -1
- package/dist/agent/catalogoModelos.js.map +0 -1
- package/dist/agent/checkpointer.js.map +0 -1
- package/dist/agent/cloudstudioClient.js.map +0 -1
- package/dist/agent/cloudstudioMcp.js.map +0 -1
- package/dist/agent/configEnDisco.js.map +0 -1
- package/dist/agent/consumoExterno.js.map +0 -1
- package/dist/agent/crearProyecto.js.map +0 -1
- package/dist/agent/descarga.js.map +0 -1
- package/dist/agent/diagnosticoDeTools.js.map +0 -1
- package/dist/agent/dispositivosEnMaquina.js.map +0 -1
- package/dist/agent/entorno.js.map +0 -1
- package/dist/agent/escrituraDeCodex.js.map +0 -1
- package/dist/agent/escrituraDeOpencode.js.map +0 -1
- package/dist/agent/escrituraExterna.js.map +0 -1
- package/dist/agent/gemini.js.map +0 -1
- package/dist/agent/git.js.map +0 -1
- package/dist/agent/gitSync.js.map +0 -1
- package/dist/agent/guionizado.js.map +0 -1
- package/dist/agent/hotswap.js.map +0 -1
- package/dist/agent/instalacionEnMaquina.js.map +0 -1
- package/dist/agent/instantanea.js.map +0 -1
- package/dist/agent/interrupts.js.map +0 -1
- package/dist/agent/juezDeTarea.js.map +0 -1
- package/dist/agent/lanzamientoEnMaquina.js.map +0 -1
- package/dist/agent/manifiesto.js.map +0 -1
- package/dist/agent/memoriaDeProyecto.js.map +0 -1
- package/dist/agent/mensajes.js.map +0 -1
- package/dist/agent/modelos.js.map +0 -1
- package/dist/agent/modelosDeMotor.js.map +0 -1
- package/dist/agent/normalizar.js.map +0 -1
- package/dist/agent/paqueteDelProyecto.js.map +0 -1
- package/dist/agent/perfiles.js.map +0 -1
- package/dist/agent/persona.js.map +0 -1
- package/dist/agent/procesosEnMaquina.js.map +0 -1
- package/dist/agent/proyecto.js.map +0 -1
- package/dist/agent/puente.js.map +0 -1
- package/dist/agent/resumenDeContexto.js +0 -30
- package/dist/agent/resumenDeContexto.js.map +0 -1
- package/dist/agent/resumenDeTool.js.map +0 -1
- package/dist/agent/sesionGit.js.map +0 -1
- package/dist/agent/settingsEnDisco.js.map +0 -1
- package/dist/agent/skills.js +0 -65
- package/dist/agent/skills.js.map +0 -1
- package/dist/agent/subagenteCodex.js.map +0 -1
- package/dist/agent/subagenteExterno.js.map +0 -1
- package/dist/agent/subagenteOpencode.js.map +0 -1
- package/dist/agent/subida.js.map +0 -1
- package/dist/agent/tareasEnDisco.js.map +0 -1
- package/dist/agent/textoDeTool.js.map +0 -1
- package/dist/agent/turnoReal.js.map +0 -1
- package/dist/agent/verificador.js.map +0 -1
- package/dist/agent/versionEnDisco.js.map +0 -1
- package/dist/agent/xoneAgent.js.map +0 -1
- package/dist/agent/zip.js.map +0 -1
- /package/dist/agent/{cloudstudioClient.js → cloudstudio/cloudstudioClient.js} +0 -0
- /package/dist/agent/{manifiesto.js → cloudstudio/manifiesto.js} +0 -0
- /package/dist/agent/{entorno.js → config/entorno.js} +0 -0
- /package/dist/agent/{gemini.js → config/gemini.js} +0 -0
- /package/dist/agent/{hotswap.js → dispositivos/hotswap.js} +0 -0
- /package/dist/agent/{instalacionEnMaquina.js → dispositivos/instalacionEnMaquina.js} +0 -0
- /package/dist/agent/{procesosEnMaquina.js → dispositivos/procesosEnMaquina.js} +0 -0
- /package/dist/agent/{git.js → sesiones/git.js} +0 -0
- /package/dist/agent/{consumoExterno.js → subagentes/consumoExterno.js} +0 -0
- /package/dist/agent/{escrituraDeCodex.js → subagentes/escrituraDeCodex.js} +0 -0
- /package/dist/agent/{subagenteCodex.js → subagentes/subagenteCodex.js} +0 -0
- /package/dist/agent/{subagenteExterno.js → subagentes/subagenteExterno.js} +0 -0
- /package/dist/agent/{subagenteOpencode.js → subagentes/subagenteOpencode.js} +0 -0
- /package/dist/agent/{diagnosticoDeTools.js → turno/diagnosticoDeTools.js} +0 -0
- /package/dist/agent/{mensajes.js → turno/mensajes.js} +0 -0
- /package/dist/agent/{normalizar.js → turno/normalizar.js} +0 -0
- /package/dist/agent/{textoDeTool.js → turno/textoDeTool.js} +0 -0
- /package/dist/agent/{verificador.js → turno/verificador.js} +0 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El INSPECTOR: qué entra de verdad al modelo en cada llamada.
|
|
3
|
+
*
|
|
4
|
+
* Todo lo que se ha medido en este harness hasta ahora era lo que SALE —tokens contados por el
|
|
5
|
+
* proveedor, tools llamadas, ficheros leídos—, y de ahí se DEDUCÍA lo que entra. Eso llegó
|
|
6
|
+
* lejos, pero se quedó corto dos veces el mismo día: cuando un especialista perdió su encargo en
|
|
7
|
+
* el resumen hubo que reconstruirlo leyendo la fuente de la librería, y cuando el chat empezó a
|
|
8
|
+
* enseñar ficheros enteros hubo que adivinar por dónde se colaban. Con esto se mira.
|
|
9
|
+
*
|
|
10
|
+
* Es un `wrapModelCall`, o sea el último sitio antes de que la petición salga: lo que ve es
|
|
11
|
+
* exactamente lo que el modelo va a recibir, después de TODOS los middleware —el resumen, la
|
|
12
|
+
* devolución del encargo, la conversión de los `ToolMessage`— y no lo que alguien creía haber
|
|
13
|
+
* puesto.
|
|
14
|
+
*
|
|
15
|
+
* ## Dos niveles, y el de por omisión no lleva contenido
|
|
16
|
+
*
|
|
17
|
+
* - `XONECODE_TRACE_PROMPT=1` apunta la FORMA: origen, cuántos mensajes, de qué tipo, cuánto
|
|
18
|
+
* ocupa cada uno, el tamaño del prompt de sistema y cuántas tools van declaradas. Con eso se
|
|
19
|
+
* contesta la pregunta cara —a dónde se va el contexto— sin sacar a disco una línea del
|
|
20
|
+
* proyecto.
|
|
21
|
+
* - `XONECODE_TRACE_PROMPT=todo` añade el TEXTO. Es lo que hace falta para ver por qué un
|
|
22
|
+
* agente contesta lo que contesta, y por eso existe; pero saca a disco el contenido de lo que
|
|
23
|
+
* se haya leído, así que se pide aparte y a sabiendas. Es la misma disciplina que
|
|
24
|
+
* `diagnosticoDeTools.ts`, que nunca guarda contenido: aquí el contenido ES la pregunta, así
|
|
25
|
+
* que no se puede prohibir — se puede hacer explícito.
|
|
26
|
+
*
|
|
27
|
+
* El fichero vive en `.xonecode/`, que está denegada al agente, fuera de git y fuera de lo que
|
|
28
|
+
* sube a CloudStudio.
|
|
29
|
+
*/
|
|
30
|
+
import { createHash } from "node:crypto";
|
|
31
|
+
import { appendFileSync, mkdirSync } from "node:fs";
|
|
32
|
+
import { join } from "node:path";
|
|
33
|
+
import { createMiddleware } from "langchain";
|
|
34
|
+
export const VARIABLE_TRAZA_PROMPT = "XONECODE_TRACE_PROMPT";
|
|
35
|
+
export const NOMBRE_TRAZA_PROMPT = "traza-prompt.jsonl";
|
|
36
|
+
/** Ruta pública, solo para poder decirle a alguien dónde quedó su diagnóstico. */
|
|
37
|
+
export function rutaTrazaDePrompt(raiz) {
|
|
38
|
+
return join(raiz, ".xonecode", NOMBRE_TRAZA_PROMPT);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Lo que ocupa el esquema de una tool, tal y como viaja.
|
|
42
|
+
*
|
|
43
|
+
* Se serializa lo que la librería expone —nombre, descripción y esquema de parámetros— porque
|
|
44
|
+
* una tool de LangChain no publica su forma de red. Es una ESTIMACIÓN y se dice: sirve para
|
|
45
|
+
* comparar unas tools con otras y para ver cuánto pesa la cabecera, no para cuadrar con la
|
|
46
|
+
* factura del proveedor.
|
|
47
|
+
*/
|
|
48
|
+
/**
|
|
49
|
+
* El esquema de una tool como TEXTO: nombre, descripción y parámetros.
|
|
50
|
+
*
|
|
51
|
+
* Es lo que se mide y lo que se huele, y tiene que ser el CONTENIDO y no un resumen: la primera
|
|
52
|
+
* versión hacía la huella sobre `{nombre, caracteres}`, o sea sobre la propia medida, y entonces
|
|
53
|
+
* una descripción que cambiara conservando el largo habría dado la misma huella. Una huella que
|
|
54
|
+
* no cambia cuando cambia lo que representa no vale para nada.
|
|
55
|
+
*/
|
|
56
|
+
export function textoDeEsquema(t) {
|
|
57
|
+
const tool = (t ?? {});
|
|
58
|
+
const nombre = typeof tool.name === "string" ? tool.name : "?";
|
|
59
|
+
const descripcion = typeof tool.description === "string" ? tool.description : "";
|
|
60
|
+
let esquema = "";
|
|
61
|
+
try {
|
|
62
|
+
esquema = JSON.stringify(tool.schema) ?? "";
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Un esquema con referencias circulares no se puede medir, y no medirlo es mejor que
|
|
66
|
+
// tumbar el turno por un diagnóstico.
|
|
67
|
+
esquema = "";
|
|
68
|
+
}
|
|
69
|
+
return `${nombre}\u0000${descripcion}\u0000${esquema}`;
|
|
70
|
+
}
|
|
71
|
+
export function esquemaDeTool(t) {
|
|
72
|
+
const nombre = typeof t?.name === "string" ? (t.name) : "?";
|
|
73
|
+
// La MISMA función que la huella: dos formas de contar lo mismo son dos cifras que divergen.
|
|
74
|
+
return { nombre, caracteres: textoDeEsquema(t).length - 2 };
|
|
75
|
+
}
|
|
76
|
+
/** El tipo de un mensaje, venga como venga: langchain no lo expone igual en todos. */
|
|
77
|
+
export function tipoDeMensaje(msg) {
|
|
78
|
+
if (!msg || typeof msg !== "object")
|
|
79
|
+
return "?";
|
|
80
|
+
const m = msg;
|
|
81
|
+
if (typeof m.type === "string")
|
|
82
|
+
return m.type;
|
|
83
|
+
if (typeof m.role === "string")
|
|
84
|
+
return m.role;
|
|
85
|
+
if (typeof m.tool_call_id === "string")
|
|
86
|
+
return "tool";
|
|
87
|
+
const clase = m.constructor?.name;
|
|
88
|
+
return typeof clase === "string" ? clase : "?";
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* El consumo que declara una respuesta del modelo, si lo declara.
|
|
92
|
+
*
|
|
93
|
+
* Se mira `usage_metadata` (el estándar de LangChain, que los tres adaptadores que usamos
|
|
94
|
+
* rellenan) y su `input_token_details.cache_read`. Lo que no venga se queda AUSENTE en vez de
|
|
95
|
+
* volverse cero: ya hay bastantes ceros inventados en este oficio.
|
|
96
|
+
*/
|
|
97
|
+
export function usoDeRespuesta(respuesta) {
|
|
98
|
+
const u = respuesta?.usage_metadata;
|
|
99
|
+
if (u === undefined || u === null)
|
|
100
|
+
return undefined;
|
|
101
|
+
const n = (v) => (typeof v === "number" && Number.isFinite(v) ? v : 0);
|
|
102
|
+
const detalles = u.input_token_details;
|
|
103
|
+
return { entrada: n(u.input_tokens), salida: n(u.output_tokens), cache: n(detalles?.cache_read) };
|
|
104
|
+
}
|
|
105
|
+
/** El texto de un mensaje, con los bloques concatenados. Nunca `undefined`. */
|
|
106
|
+
export function textoDeMensaje(msg) {
|
|
107
|
+
const c = msg?.content;
|
|
108
|
+
if (typeof c === "string")
|
|
109
|
+
return c;
|
|
110
|
+
if (Array.isArray(c)) {
|
|
111
|
+
return c
|
|
112
|
+
.map((b) => (typeof b === "string" ? b : typeof b === "object" && b !== null && "text" in b ? String(b.text) : ""))
|
|
113
|
+
.join("");
|
|
114
|
+
}
|
|
115
|
+
return "";
|
|
116
|
+
}
|
|
117
|
+
function cuantasToolCalls(msg) {
|
|
118
|
+
const llamadas = msg?.tool_calls;
|
|
119
|
+
return Array.isArray(llamadas) ? llamadas.length : 0;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* La FOTO de una petición al modelo, sin tocar disco: pura, y por eso con test.
|
|
123
|
+
*
|
|
124
|
+
* `conTexto` decide si se lleva el contenido. Separar el cálculo de la escritura es lo que
|
|
125
|
+
* permite comprobar que la forma es correcta sin montar un agente ni escribir un fichero.
|
|
126
|
+
*/
|
|
127
|
+
export function inspeccionarLlamada(origen, peticion, conTexto) {
|
|
128
|
+
const p = (peticion ?? {});
|
|
129
|
+
const mensajes = Array.isArray(p.messages) ? p.messages : [];
|
|
130
|
+
const sistema = typeof p.systemPrompt === "string" ? p.systemPrompt : textoDeMensaje(p.systemMessage);
|
|
131
|
+
const inspeccionados = mensajes.map((m) => {
|
|
132
|
+
const texto = textoDeMensaje(m);
|
|
133
|
+
const toolCalls = cuantasToolCalls(m);
|
|
134
|
+
return {
|
|
135
|
+
tipo: tipoDeMensaje(m),
|
|
136
|
+
caracteres: texto.length,
|
|
137
|
+
...(toolCalls > 0 ? { toolCalls } : {}),
|
|
138
|
+
...(conTexto ? { texto } : {}),
|
|
139
|
+
};
|
|
140
|
+
});
|
|
141
|
+
const tools = Array.isArray(p.tools) ? p.tools : [];
|
|
142
|
+
const porTool = tools.map(esquemaDeTool).sort((a, b) => b.caracteres - a.caracteres);
|
|
143
|
+
const esquemas = porTool.reduce((a, t) => a + t.caracteres, 0);
|
|
144
|
+
// El orden cuenta: dos peticiones con las mismas tools en distinto orden son dos prefijos
|
|
145
|
+
// distintos para la caché, así que la huella se toma de `tools` tal y como viaja, no de la
|
|
146
|
+
// lista ordenada por tamaño que se guarda para leerla.
|
|
147
|
+
const prefijo = `${sistema}\u0000${tools.map(textoDeEsquema).join("\u0000")}`;
|
|
148
|
+
return {
|
|
149
|
+
origen,
|
|
150
|
+
mensajes: inspeccionados,
|
|
151
|
+
prefijo: { caracteres: prefijo.length, huella: createHash("sha1").update(prefijo).digest("hex").slice(0, 12) },
|
|
152
|
+
sistema: { caracteres: sistema.length, ...(conTexto ? { texto: sistema } : {}) },
|
|
153
|
+
tools: tools.length,
|
|
154
|
+
esquemas: { caracteres: esquemas, porTool },
|
|
155
|
+
// El prompt de sistema y los esquemas se reenvían en CADA llamada: sin sumarlos aquí, la
|
|
156
|
+
// cifra diría que una conversación corta es barata cuando su cabecera es lo que cuesta.
|
|
157
|
+
caracteresTotales: sistema.length + esquemas + inspeccionados.reduce((a, m) => a + m.caracteres, 0),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* El middleware. Devuelve `undefined` si la traza no está pedida, para no montarlo.
|
|
162
|
+
*
|
|
163
|
+
* Se pone al FINAL de la lista de cada agente: el primero envuelve al siguiente, así que el
|
|
164
|
+
* último es el que ve la petición ya pasada por todos los demás — que es justo lo que se quiere
|
|
165
|
+
* inspeccionar. Puesto delante mentiría enseñando lo que otros van a cambiar después.
|
|
166
|
+
*/
|
|
167
|
+
export function inspectorDePrompt(raiz, origen, entorno = process.env) {
|
|
168
|
+
const nivel = entorno[VARIABLE_TRAZA_PROMPT];
|
|
169
|
+
if (nivel !== "1" && nivel !== "todo")
|
|
170
|
+
return undefined;
|
|
171
|
+
const conTexto = nivel === "todo";
|
|
172
|
+
const ruta = rutaTrazaDePrompt(raiz);
|
|
173
|
+
const sesion = `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
174
|
+
return createMiddleware({
|
|
175
|
+
name: "InspectorDePromptMiddleware",
|
|
176
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
177
|
+
wrapModelCall: async (request, handler) => {
|
|
178
|
+
const foto = (() => {
|
|
179
|
+
try {
|
|
180
|
+
return inspeccionarLlamada(origen, request, conTexto);
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return undefined;
|
|
184
|
+
}
|
|
185
|
+
})();
|
|
186
|
+
// La llamada va PRIMERO y su fallo se propaga intacto: inspeccionar no puede cambiar lo
|
|
187
|
+
// que le pasa al turno, ni siquiera para apuntarlo.
|
|
188
|
+
const respuesta = await handler(request);
|
|
189
|
+
try {
|
|
190
|
+
const uso = usoDeRespuesta(respuesta);
|
|
191
|
+
if (foto !== undefined) {
|
|
192
|
+
mkdirSync(join(raiz, ".xonecode"), { recursive: true });
|
|
193
|
+
const linea = { v: 1, sesion, at: new Date().toISOString(), ...foto, ...(uso === undefined ? {} : { uso }) };
|
|
194
|
+
appendFileSync(ruta, `${JSON.stringify(linea)}\n`, "utf8");
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// Inspeccionar no puede impedir que el agente conteste: es un modo de diagnóstico,
|
|
199
|
+
// no parte del camino del turno. La misma regla que `diagnosticoDeTools`.
|
|
200
|
+
}
|
|
201
|
+
return respuesta;
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=inspectorDePrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspectorDePrompt.js","sourceRoot":"","sources":["../../../src/agent/turno/inspectorDePrompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { promisify } from "node:util";
|
|
|
3
3
|
import { createHash } from "node:crypto";
|
|
4
4
|
import { readFileSync, readdirSync, statSync, existsSync } from "node:fs";
|
|
5
5
|
import { join } from "node:path";
|
|
6
|
-
import { indicePrivado, claseDeCambio, sacarXonecodeDelIndice } from "
|
|
6
|
+
import { indicePrivado, claseDeCambio, sacarXonecodeDelIndice } from "../sesiones/git.js";
|
|
7
7
|
const ejecutar = promisify(execFile);
|
|
8
8
|
/**
|
|
9
9
|
* La foto por árbol de git.
|
|
@@ -70,7 +70,12 @@ function huellas(raiz, base, prof = 0) {
|
|
|
70
70
|
if (prof > 6 || !existsSync(raiz))
|
|
71
71
|
return m;
|
|
72
72
|
for (const entrada of readdirSync(raiz)) {
|
|
73
|
-
|
|
73
|
+
// `.xonecode` fuera, igual que en la rama de git (`sacarXonecodeDelIndice`) y por las
|
|
74
|
+
// MISMAS dos razones: ahí vive el `checkpoint.sqlite` —hashear megas en cada foto— y
|
|
75
|
+
// ahí escribe el harness su contabilidad, que no es un cambio del proyecto. Sin esta
|
|
76
|
+
// línea, un `run --real` con la traza encendida listaba `traza-tools.jsonl` bajo
|
|
77
|
+
// «cambios en el proyecto»: un informe afirmando que el turno tocó lo que no tocó.
|
|
78
|
+
if (entrada === "node_modules" || entrada === ".git" || entrada === ".xonecode")
|
|
74
79
|
continue;
|
|
75
80
|
const ruta = join(raiz, entrada);
|
|
76
81
|
try {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instantanea.js","sourceRoot":"","sources":["../../../src/agent/turno/instantanea.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE1F,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAgBrC;;;;;;;;;;GAUG;AACH,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,OAAe;IACnD,MAAM,aAAa,GAAG,KAAK,IAAqB,EAAE;QAChD,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE;gBAC9C,GAAG,EAAE,IAAI;gBACT,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,CAAC,IAAI,EAAE;aAClD,CAAC,CAAC;YACH,qFAAqF;YACrF,6EAA6E;YAC7E,MAAM,sBAAsB,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,YAAY,CAAC,EAAE;gBACvD,GAAG,EAAE,IAAI;gBACT,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,CAAC,IAAI,EAAE;aAClD,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;gBAAS,CAAC;YACT,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IACpC,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzG,OAAO;QACL,GAAG,EAAE,KAAK;QACV,KAAK,CAAC,OAAO;YACX,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;YACpC,IAAI,KAAK,KAAK,KAAK;gBAAE,OAAO,EAAE,CAAC;YAC/B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;YACvH,OAAO,MAAM;iBACV,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACT,MAAM,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,MAAO,CAAC,EAAE,CAAC;YAC5F,CAAC,CAAC,CAAC;QACP,CAAC;QACD,KAAK,CAAC,IAAI;YACR,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;YACpC,IAAI,KAAK,KAAK,KAAK;gBAAE,OAAO,EAAE,CAAC;YAC/B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;YACxH,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAE7F,SAAS,OAAO,CAAC,IAAY,EAAE,IAAY,EAAE,IAAI,GAAG,CAAC;IACnD,MAAM,CAAC,GAAG,IAAI,GAAG,EAAkB,CAAC;IACpC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC5C,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,sFAAsF;QACtF,qFAAqF;QACrF,qFAAqF;QACrF,iFAAiF;QACjF,mFAAmF;QACnF,IAAI,OAAO,KAAK,cAAc,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,WAAW;YAAE,SAAS;QAC1F,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;gBAAE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC;oBAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;gBAC7F,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;QAClD,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,sFAAsF;AACtF,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,OAAO;QACL,GAAG,EAAE,SAAS;QACd,KAAK,CAAC,OAAO;YACX,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAClC,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC/B,IAAI,MAAM,KAAK,SAAS;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;qBAC3D,IAAI,MAAM,KAAK,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE;gBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAC/F,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,KAAK,CAAC,IAAI;YACR,OAAO,EAAE,CAAC,CAAC,2DAA2D;QACxE,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,GAAyC;IAEzC,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,mFAAmF;QACnF,iFAAiF;QACjF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { collectPending, buildResume } from "
|
|
2
|
-
import { diffDeLineas } from "
|
|
1
|
+
import { collectPending, buildResume } from "../../vendor/hitl.js";
|
|
2
|
+
import { diffDeLineas } from "../../core/diff.js";
|
|
3
3
|
export { buildResume };
|
|
4
4
|
/**
|
|
5
5
|
* Los interrupts pendientes de un hilo, en el vocabulario de xonecode.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interrupts.js","sourceRoot":"","sources":["../../../src/agent/turno/interrupts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mensajes.js","sourceRoot":"","sources":["../../../src/agent/turno/mensajes.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,QAAQ;IACX,OAAO,CAAqB;IACnB,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAE9C,mFAAmF;IACnF,KAAK,CAAC,EAAsB,EAAE,KAAyB;QACrD,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QACzD,IAAI,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,+BAA+B;QAC/E,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC;QACtE,IAAI,WAAW;YAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IACvC,CAAC;IAED,mDAAmD;IACnD,GAAG;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizar.js","sourceRoot":"","sources":["../../../src/agent/turno/normalizar.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,gDAAgD;IAChD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,KAAoC,CAAC;QAC9D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAChE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC5C,CAAC;IAED,+BAA+B;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,KAA2B,CAAC;QACjD,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { normalizar } from "./normalizar.js";
|
|
2
2
|
import { Mensajes } from "./mensajes.js";
|
|
3
3
|
import { detalleDe, parametrosDe } from "./resumenDeTool.js";
|
|
4
|
+
import { esMensajeDeTool } from "./textoDeTool.js";
|
|
4
5
|
/** El texto de un mensaje, venga como venga. */
|
|
5
6
|
export function textoDe(msg) {
|
|
6
7
|
if (!msg || typeof msg !== "object")
|
|
@@ -61,7 +62,19 @@ export function razonamientoDe(msg) {
|
|
|
61
62
|
})
|
|
62
63
|
.join("");
|
|
63
64
|
}
|
|
64
|
-
/**
|
|
65
|
+
/**
|
|
66
|
+
* Los nombres de tool de un chunk de `updates`, con su detalle de la lista blanca y su ID.
|
|
67
|
+
*
|
|
68
|
+
* **El `id` viaja porque el mismo chunk trae la historia ENTERA.** Un `updates` de un subgrafo
|
|
69
|
+
* no llega con los mensajes nuevos: llega con los acumulados, así que sin distinguir cuáles ya
|
|
70
|
+
* se contaron, cada paso reemite todas las tools anteriores. Medido sobre un turno real: 286
|
|
71
|
+
* eventos `execute` para **10 comandos distintos**, con el primero repetido 43 veces — y eso
|
|
72
|
+
* se ve en la PANTALLA, en tramos repetidos, además de inflar la traza y el contador de pasos.
|
|
73
|
+
*
|
|
74
|
+
* El `id` de un `tool_call` es identidad, no parecido: dos llamadas idénticas a la misma tool
|
|
75
|
+
* con los mismos argumentos son dos llamadas, y colapsarlas por su contenido escondería trabajo
|
|
76
|
+
* de verdad. Por eso se deduplica por ahí y no por el par nombre+argumentos.
|
|
77
|
+
*/
|
|
65
78
|
export function toolsDe(dato) {
|
|
66
79
|
if (!dato || typeof dato !== "object")
|
|
67
80
|
return [];
|
|
@@ -79,7 +92,13 @@ export function toolsDe(dato) {
|
|
|
79
92
|
const args = l.args;
|
|
80
93
|
const detalle = detalleDe(n, args);
|
|
81
94
|
const parametros = parametrosDe(n, args);
|
|
82
|
-
|
|
95
|
+
const id = l?.id;
|
|
96
|
+
salida.push({
|
|
97
|
+
nombre: n,
|
|
98
|
+
...(detalle === undefined ? {} : { detalle }),
|
|
99
|
+
...(parametros === undefined ? {} : { parametros }),
|
|
100
|
+
...(typeof id === "string" && id !== "" ? { id } : {}),
|
|
101
|
+
});
|
|
83
102
|
}
|
|
84
103
|
}
|
|
85
104
|
}
|
|
@@ -130,13 +149,23 @@ export function esDelPadre(ns) {
|
|
|
130
149
|
*/
|
|
131
150
|
export async function* aEventos(stream, pendientes, alLlamarTool) {
|
|
132
151
|
const mensajes = new Mensajes();
|
|
152
|
+
/** Los `tool_call` ya contados, por id: el stream reenvía los mensajes acumulados. */
|
|
153
|
+
const vistas = new Set();
|
|
133
154
|
try {
|
|
134
155
|
for await (const bruto of stream) {
|
|
135
156
|
const chunk = normalizar(bruto);
|
|
136
157
|
if (!chunk)
|
|
137
158
|
continue;
|
|
138
159
|
if (chunk.modo === "updates") {
|
|
139
|
-
for (const { nombre, detalle, parametros } of toolsDe(chunk.dato)) {
|
|
160
|
+
for (const { nombre, detalle, parametros, id } of toolsDe(chunk.dato)) {
|
|
161
|
+
// Ya contada: este mismo chunk trae la historia acumulada del subgrafo (ver
|
|
162
|
+
// `toolsDe`). Sin `id` no se puede afirmar que sea repetida, así que se emite —
|
|
163
|
+
// la dirección segura es contar de más, no callar una llamada que ocurrió.
|
|
164
|
+
if (id !== undefined) {
|
|
165
|
+
if (vistas.has(id))
|
|
166
|
+
continue;
|
|
167
|
+
vistas.add(id);
|
|
168
|
+
}
|
|
140
169
|
try {
|
|
141
170
|
alLlamarTool?.({ nombre, ...(detalle === undefined ? {} : { detalle }), ...(parametros === undefined ? {} : { parametros }) });
|
|
142
171
|
}
|
|
@@ -153,6 +182,21 @@ export async function* aEventos(stream, pendientes, alLlamarTool) {
|
|
|
153
182
|
if (!Array.isArray(chunk.dato))
|
|
154
183
|
continue;
|
|
155
184
|
const [msg] = chunk.dato;
|
|
185
|
+
/**
|
|
186
|
+
* **El RESULTADO de una tool no es la respuesta del asistente**, y por este modo de
|
|
187
|
+
* stream llega igual que un token. Sin esta línea se pintaba en el chat el fichero
|
|
188
|
+
* entero que acababa de leer —con sus números de línea y el pie `[Read 12 lines…]`—,
|
|
189
|
+
* que es justo lo que `core/events.ts` prohíbe: ningún evento lleva contenido de
|
|
190
|
+
* tool, ni truncado. Lo que el usuario debe ver de una tool es su LÍNEA (`tipo:
|
|
191
|
+
* "tool"`, con el detalle de la lista blanca), y eso ya se emite en la rama de
|
|
192
|
+
* `updates`.
|
|
193
|
+
*
|
|
194
|
+
* Estuvo mudo hasta que el orquestador dejó de delegarlo todo: mientras su única
|
|
195
|
+
* tool era `task`, lo que se colaba era la respuesta del especialista, que pasaba por
|
|
196
|
+
* una respuesta. Desde que lee ficheros, se colaba cada fichero.
|
|
197
|
+
*/
|
|
198
|
+
if (esMensajeDeTool(msg))
|
|
199
|
+
continue;
|
|
156
200
|
const texto = textoDe(msg);
|
|
157
201
|
const id = msg?.id;
|
|
158
202
|
const idTexto = typeof id === "string" ? id : undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"puente.js","sourceRoot":"","sources":["../../../src/agent/turno/puente.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Política de contexto del harness.
|
|
3
|
+
*
|
|
4
|
+
* DeepAgents usa 170k tokens cuando el proveedor no publica su ventana de contexto. Con
|
|
5
|
+
* Ollama eso retrasa demasiado la compresión y cada llamada reenvía lecturas ya resueltas.
|
|
6
|
+
* Este umbral es independiente del proveedor: limita el coste sin borrar el trabajo reciente.
|
|
7
|
+
*/
|
|
8
|
+
import { createSummarizationMiddleware } from "deepagents";
|
|
9
|
+
import { createMiddleware, modelCallLimitMiddleware, toolCallLimitMiddleware } from "langchain";
|
|
10
|
+
import { HumanMessage } from "@langchain/core/messages";
|
|
11
|
+
import { RUTA_HISTORIAL_RESUMIDO } from "../grafo/memoriaDeProyecto.js";
|
|
12
|
+
export const UMBRAL_RESUMEN_TOKENS = 32_000;
|
|
13
|
+
export const CONTEXTO_RECIENTE_TOKENS = 8_000;
|
|
14
|
+
export function resumenDeContexto(backend) {
|
|
15
|
+
return createSummarizationMiddleware({
|
|
16
|
+
backend,
|
|
17
|
+
trigger: { type: "tokens", value: UMBRAL_RESUMEN_TOKENS },
|
|
18
|
+
keep: { type: "tokens", value: CONTEXTO_RECIENTE_TOKENS },
|
|
19
|
+
// Las tools de fichero pueden llevar contenido grande. Los argumentos antiguos ya
|
|
20
|
+
// están representados por el resumen, no deben volver a inflar las siguientes llamadas.
|
|
21
|
+
truncateArgsSettings: {
|
|
22
|
+
trigger: { type: "tokens", value: UMBRAL_RESUMEN_TOKENS },
|
|
23
|
+
keep: { type: "tokens", value: CONTEXTO_RECIENTE_TOKENS },
|
|
24
|
+
maxLength: 1_000,
|
|
25
|
+
},
|
|
26
|
+
trimTokensToSummarize: 12_000,
|
|
27
|
+
// El backend lo escribe directamente; no debe aparecer en el árbol ni en las tools del
|
|
28
|
+
// agente. Así el estado de sesión permanece junto al proyecto y fuera de la app XOne.
|
|
29
|
+
historyPathPrefix: RUTA_HISTORIAL_RESUMIDO,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Devuelve el ENCARGO a la conversación después de que el resumen se lo lleve.
|
|
34
|
+
*
|
|
35
|
+
* ## El fallo que cierra, medido offline el 17-09-2026
|
|
36
|
+
*
|
|
37
|
+
* Un turno real del usuario: el orquestador delegó una pregunta sobre si XOne servía para un
|
|
38
|
+
* CRM, el especialista dio 57 pasos y volvió con la respuesta de la pregunta **anterior** —«la
|
|
39
|
+
* ventana de inicio de mi app»—. El orquestador lo detectó y relanzó dos veces: 1,5M de tokens
|
|
40
|
+
* para una pregunta. El propio modelo dijo que «parece que trae una sesión antigua pegada», y
|
|
41
|
+
* esa hipótesis era falsa: los subagentes van en `handoff`, así que arrancan con el encargo y
|
|
42
|
+
* nada más, y aunque HEREDAN nuestro checkpointer, el namespace de cada `task` lleva el paso y
|
|
43
|
+
* el id del checkpoint dentro, así que no puede reanudar nada.
|
|
44
|
+
*
|
|
45
|
+
* Lo que pasa de verdad está en el middleware de resumen: al cruzar el umbral, los mensajes
|
|
46
|
+
* `[0, corte)` se sustituyen por UN resumen, y el mensaje 0 es justamente el encargo. `keep`
|
|
47
|
+
* solo conserva la COLA —no hay opción para el primero— y el prompt de resumen por omisión
|
|
48
|
+
* pide «temas, decisiones y contexto para continuar», no el encargo. O sea que a partir de los
|
|
49
|
+
* 32k el especialista sigue trabajando **sin la pregunta que le hicieron**, y contesta a lo que
|
|
50
|
+
* el resumen le deje entender. Medido en `resumenDeContexto.test.ts`.
|
|
51
|
+
*
|
|
52
|
+
* ## Por qué por CÓDIGO y no por `summaryPrompt`
|
|
53
|
+
*
|
|
54
|
+
* Se podría pedir en el prompt del resumen que conserve el encargo, y a veces lo haría. Un
|
|
55
|
+
* agente que pierde su encargo no contesta peor: contesta a otra cosa, y el coste de eso ya
|
|
56
|
+
* está medido en millones de tokens. Es la misma regla que hace que los avisos de honestidad
|
|
57
|
+
* sean código y no prompt (`core/bitacora.ts`).
|
|
58
|
+
*
|
|
59
|
+
* El encargo se saca del ESTADO, que el resumen no reescribe (guarda un `_summarizationEvent`
|
|
60
|
+
* y reconstruye la lista efectiva), así que ahí sigue intacto el mensaje 0. Y se reinserta solo
|
|
61
|
+
* si NO está: por debajo del umbral no hay nada que devolver y duplicarlo sería peor.
|
|
62
|
+
*/
|
|
63
|
+
export function conservarElEncargo() {
|
|
64
|
+
return createMiddleware({
|
|
65
|
+
name: "ConservarElEncargoMiddleware",
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
67
|
+
wrapModelCall: (request, handler) => {
|
|
68
|
+
const mensajes = request?.messages;
|
|
69
|
+
const historial = request?.state?.messages;
|
|
70
|
+
if (!Array.isArray(mensajes) || !Array.isArray(historial) || mensajes.length === 0)
|
|
71
|
+
return handler(request);
|
|
72
|
+
// **El ÚLTIMO humano, no el primero**, y la diferencia es el defecto entero: en la
|
|
73
|
+
// conversación de un ESPECIALISTA solo hay uno —el encargo— y los dos coinciden, pero la
|
|
74
|
+
// del ORQUESTADOR es multiturno, y ahí el primero es la pregunta de hace tres turnos.
|
|
75
|
+
// Reinyectar esa sería reintroducir a mano justo el fallo que esto arregla.
|
|
76
|
+
const encargo = [...historial].reverse().find((m) => esDeHumano(m));
|
|
77
|
+
if (encargo === undefined || mensajes.includes(encargo))
|
|
78
|
+
return handler(request);
|
|
79
|
+
// Por CONTENIDO además de por identidad: la lista efectiva se reconstruye, así que el
|
|
80
|
+
// mensaje puede ser otro objeto con el mismo texto. Sin esto se duplicaría el encargo en
|
|
81
|
+
// cada llamada posterior al resumen.
|
|
82
|
+
const texto = textoPlano(encargo);
|
|
83
|
+
if (texto !== "" && mensajes.some((m) => esDeHumano(m) && textoPlano(m) === texto))
|
|
84
|
+
return handler(request);
|
|
85
|
+
return handler({ ...request, messages: [encargo, ...mensajes] });
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function esDeHumano(msg) {
|
|
90
|
+
if (!msg || typeof msg !== "object")
|
|
91
|
+
return false;
|
|
92
|
+
const m = msg;
|
|
93
|
+
return m.type === "human" || m.role === "user" || m instanceof HumanMessage;
|
|
94
|
+
}
|
|
95
|
+
function textoPlano(msg) {
|
|
96
|
+
const c = msg?.content;
|
|
97
|
+
if (typeof c === "string")
|
|
98
|
+
return c;
|
|
99
|
+
if (Array.isArray(c))
|
|
100
|
+
return c.map((b) => (typeof b === "object" && b !== null && "text" in b ? String(b.text) : "")).join("");
|
|
101
|
+
return "";
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* El resumen y la devolución del encargo, SIEMPRE juntos y en este orden.
|
|
105
|
+
*
|
|
106
|
+
* Van en una sola función porque separarlos es el fallo: el primero de la lista envuelve al
|
|
107
|
+
* siguiente, así que `conservarElEncargo` tiene que ver los mensajes YA resumidos — delante no
|
|
108
|
+
* habría nada que devolver. Montarlos a mano en dos sitios (el orquestador y cada especialista)
|
|
109
|
+
* es el patrón que en este repo ha fallado nueve veces: una composición de producción que vive
|
|
110
|
+
* en un cierre que los tests doblan, y que puede dejar de estar montada con todo en verde.
|
|
111
|
+
*/
|
|
112
|
+
export function resumenConEncargo(backend) {
|
|
113
|
+
return [resumenDeContexto(backend), conservarElEncargo()];
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Cuántas llamadas al modelo puede gastar UN especialista en un encargo.
|
|
117
|
+
*
|
|
118
|
+
* Medido el 17-09-2026 con el banco: una pregunta de estructura se resuelve en 3-7 llamadas en
|
|
119
|
+
* TODO el turno, y la de capacidad —la clase cara— la terminó bien un modelo en 10. El que se
|
|
120
|
+
* descarriló llevaba 32 y subiendo cuando el reloj lo mató, y 57 en el turno que lo destapó. El
|
|
121
|
+
* tope deja intacto lo que funciona y corta lo otro.
|
|
122
|
+
*
|
|
123
|
+
* **No es un ahorro, es una frontera.** Un especialista hace una tarea específica con un
|
|
124
|
+
* encargo bien descrito; si necesita treinta llamadas, lo que falla es la delegación, y seguir
|
|
125
|
+
* dándole cuerda solo hace más cara la misma respuesta mala.
|
|
126
|
+
*/
|
|
127
|
+
export const TOPE_DE_LLAMADAS_DEL_ESPECIALISTA = 15;
|
|
128
|
+
/**
|
|
129
|
+
* El tope, con `exitBehavior: "end"` y no `"error"`.
|
|
130
|
+
*
|
|
131
|
+
* Con `"error"` la delegación entera se cae y el orquestador se queda sin nada, que es como
|
|
132
|
+
* empieza el bucle de reintentos que ya costó 1,5M de tokens. Con `"end"` el especialista
|
|
133
|
+
* devuelve lo que tenga y quien decide es el orquestador, que para eso lee la respuesta.
|
|
134
|
+
*
|
|
135
|
+
* Es de la librería (`langchain`), y deepagents lo contempla: sus claves de conteo están en
|
|
136
|
+
* `EXCLUDED_STATE_KEYS` a propósito, «each agent counts its own calls, so they never cross the
|
|
137
|
+
* boundary». O sea que el tope de un especialista no toca el del padre.
|
|
138
|
+
*/
|
|
139
|
+
export function topeDeLlamadas(limite = TOPE_DE_LLAMADAS_DEL_ESPECIALISTA) {
|
|
140
|
+
return modelCallLimitMiddleware({ runLimit: limite, exitBehavior: "end" });
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Cuántas TOOLS puede gastar un especialista en un encargo.
|
|
144
|
+
*
|
|
145
|
+
* El tope de llamadas al modelo acota los VIAJES; este acota **lo que se acumula**, que es lo
|
|
146
|
+
* que multiplica. Medido el 17-09-2026 en una conversación de tres preguntas: en la tercera, el
|
|
147
|
+
* consultor llegó a 43 resultados de tool metidos en su contexto, y como cada llamada al modelo
|
|
148
|
+
* reenvía todo lo anterior, la primera costó 5.264 tokens y la última 39.888 — 406k en total. No
|
|
149
|
+
* era un bucle: era la acumulación al cuadrado.
|
|
150
|
+
*
|
|
151
|
+
* Veinte es generoso contra su propia regla, que ya le pide «máximo tres referencias por
|
|
152
|
+
* pregunta y un `grep` por hipótesis»: si con veinte no le llega, lo que falla es la delegación
|
|
153
|
+
* o la regla, no el tope.
|
|
154
|
+
*/
|
|
155
|
+
export const TOPE_DE_TOOLS_DEL_ESPECIALISTA = 20;
|
|
156
|
+
/**
|
|
157
|
+
* **`continue`, y NO `end`: son incompatibles con pedir varias tools a la vez.**
|
|
158
|
+
*
|
|
159
|
+
* Medido el 17-09-2026 en el primer turno con el tope puesto: «Cannot end execution with other
|
|
160
|
+
* tool calls pending. Found calls to: read_file, ls, grep». La documentación de langchain lo
|
|
161
|
+
* dice igual —`end` «raises NotImplementedError if there are multiple tool calls»— y nosotros le
|
|
162
|
+
* PEDIMOS al especialista que agrupe las lecturas independientes en un mismo mensaje, así que
|
|
163
|
+
* llegar al tope con varias en vuelo es el caso normal, no el raro.
|
|
164
|
+
*
|
|
165
|
+
* `continue` bloquea las que sobran con un mensaje de error y deja que el modelo termine: se
|
|
166
|
+
* queda sin más tools y contesta con lo que tiene, que es lo mismo que buscaba `end` pero sin
|
|
167
|
+
* romperse. `error` tumbaría la delegación entera, que es como empieza el bucle de reintentos.
|
|
168
|
+
*
|
|
169
|
+
* Dos reglas nuestras que vivían sin hablarse —«agrupa las tools» y «corta al llegar al tope»—
|
|
170
|
+
* y cuyo choque solo se ve corriendo. Por eso el test las ata juntas.
|
|
171
|
+
*/
|
|
172
|
+
export const SALIDA_DEL_TOPE_DE_TOOLS = "continue";
|
|
173
|
+
export function topeDeTools(limite = TOPE_DE_TOOLS_DEL_ESPECIALISTA) {
|
|
174
|
+
return toolCallLimitMiddleware({ runLimit: limite, exitBehavior: SALIDA_DEL_TOPE_DE_TOOLS });
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=resumenDeContexto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resumenDeContexto.js","sourceRoot":"","sources":["../../../src/agent/turno/resumenDeContexto.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,6 +37,21 @@ const CAMPOS_SEGUROS = {
|
|
|
37
37
|
* minutos en otro proceso, sin una sola tool que cruce.
|
|
38
38
|
*/
|
|
39
39
|
task: ["subagent_type"],
|
|
40
|
+
/**
|
|
41
|
+
* **El comando ENTERO**, y es la única entrada de esta tabla que no es una ruta ni un
|
|
42
|
+
* patrón. Está aquí a propósito: a un agente con `ejecucion: true` no se le pregunta antes
|
|
43
|
+
* de cada comando —preguntar cuatro veces por «lanza la app» mata el bucle—, así que lo
|
|
44
|
+
* que sustituye a esa pregunta es VERLO. Un `⚙ execute` sin detalle sería la peor de las
|
|
45
|
+
* dos: ni se pregunta ni se enseña.
|
|
46
|
+
*
|
|
47
|
+
* **Límite declarado, y no se tapa con un filtro**: si el modelo escribe una ruta absoluta
|
|
48
|
+
* en su comando, esa ruta sale en el evento y por tanto por el cable, que es lo que
|
|
49
|
+
* `sinRutas` evita en los demás sitios. Por eso el entorno le da una variable por skill y
|
|
50
|
+
* el `cwd` es la raíz del proyecto: para que no le haga falta escribir ninguna. Un
|
|
51
|
+
* limpiador que adivinara qué trozo de una línea de shell es una ruta fallaría en
|
|
52
|
+
* silencio, que es peor que un límite escrito.
|
|
53
|
+
*/
|
|
54
|
+
execute: ["command"],
|
|
40
55
|
};
|
|
41
56
|
function objetoDeArgs(args) {
|
|
42
57
|
let objeto = args;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resumenDeTool.js","sourceRoot":"","sources":["../../../src/agent/turno/resumenDeTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textoDeTool.js","sourceRoot":"","sources":["../../../src/agent/turno/textoDeTool.ts"],"names":[],"mappings":"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"}
|