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.
Files changed (266) hide show
  1. package/README.md +1 -1
  2. package/THIRD_PARTY_NOTICES.md +32 -0
  3. package/apps/web/dist/assets/index-DBZTodio.js +477 -0
  4. package/apps/web/dist/assets/{index-BB3SamhR.css → index-rqecK6s2.css} +1 -1
  5. package/apps/web/dist/assets/{php-D_2--9WK.js → php-BBij3Lhc.js} +1 -1
  6. package/apps/web/dist/assets/{ruby-DSHSDbk1.js → ruby-Dq2YEaLo.js} +1 -1
  7. package/apps/web/dist/index.html +2 -2
  8. package/dist/agent/cloudstudio/cloudstudioClient.js.map +1 -0
  9. package/dist/agent/{cloudstudioMcp.js → cloudstudio/cloudstudioMcp.js} +5 -5
  10. package/dist/agent/cloudstudio/cloudstudioMcp.js.map +1 -0
  11. package/dist/agent/{descarga.js → cloudstudio/descarga.js} +3 -3
  12. package/dist/agent/cloudstudio/descarga.js.map +1 -0
  13. package/dist/agent/cloudstudio/manifiesto.js.map +1 -0
  14. package/dist/agent/{subida.js → cloudstudio/subida.js} +3 -3
  15. package/dist/agent/cloudstudio/subida.js.map +1 -0
  16. package/dist/agent/{zip.js → cloudstudio/zip.js} +1 -1
  17. package/dist/agent/cloudstudio/zip.js.map +1 -0
  18. package/dist/agent/{authEnDisco.js → config/authEnDisco.js} +3 -3
  19. package/dist/agent/config/authEnDisco.js.map +1 -0
  20. package/dist/agent/{catalogoModelos.js → config/catalogoModelos.js} +2 -1
  21. package/dist/agent/config/catalogoModelos.js.map +1 -0
  22. package/dist/agent/{configEnDisco.js → config/configEnDisco.js} +6 -6
  23. package/dist/agent/config/configEnDisco.js.map +1 -0
  24. package/dist/agent/{crearProyecto.js → config/crearProyecto.js} +2 -2
  25. package/dist/agent/config/crearProyecto.js.map +1 -0
  26. package/dist/agent/config/entorno.js.map +1 -0
  27. package/dist/agent/config/gemini.js.map +1 -0
  28. package/dist/agent/{modelos.js → config/modelos.js} +17 -3
  29. package/dist/agent/config/modelos.js.map +1 -0
  30. package/dist/agent/{modelosDeMotor.js → config/modelosDeMotor.js} +1 -1
  31. package/dist/agent/config/modelosDeMotor.js.map +1 -0
  32. package/dist/agent/{persona.js → config/persona.js} +1 -1
  33. package/dist/agent/config/persona.js.map +1 -0
  34. package/dist/agent/{settingsEnDisco.js → config/settingsEnDisco.js} +2 -2
  35. package/dist/agent/config/settingsEnDisco.js.map +1 -0
  36. package/dist/agent/{versionEnDisco.js → config/versionEnDisco.js} +8 -4
  37. package/dist/agent/config/versionEnDisco.js.map +1 -0
  38. package/dist/agent/dispositivos/arranqueDeEmulador.js +146 -0
  39. package/dist/agent/dispositivos/arranqueDeEmulador.js.map +1 -0
  40. package/dist/agent/{dispositivosEnMaquina.js → dispositivos/dispositivosEnMaquina.js} +93 -6
  41. package/dist/agent/dispositivos/dispositivosEnMaquina.js.map +1 -0
  42. package/dist/agent/dispositivos/hotswap.js.map +1 -0
  43. package/dist/agent/dispositivos/instalacionEnMaquina.js.map +1 -0
  44. package/dist/agent/{lanzamientoEnMaquina.js → dispositivos/lanzamientoEnMaquina.js} +1 -1
  45. package/dist/agent/dispositivos/lanzamientoEnMaquina.js.map +1 -0
  46. package/dist/agent/{paqueteDelProyecto.js → dispositivos/paqueteDelProyecto.js} +5 -5
  47. package/dist/agent/dispositivos/paqueteDelProyecto.js.map +1 -0
  48. package/dist/agent/dispositivos/procesosEnMaquina.js.map +1 -0
  49. package/dist/agent/{arbolDeProyecto.js → grafo/arbolDeProyecto.js} +2 -2
  50. package/dist/agent/grafo/arbolDeProyecto.js.map +1 -0
  51. package/dist/agent/{artefactosEnDisco.js → grafo/artefactosEnDisco.js} +2 -2
  52. package/dist/agent/grafo/artefactosEnDisco.js.map +1 -0
  53. package/dist/agent/{busquedaRegex.js → grafo/busquedaRegex.js} +41 -1
  54. package/dist/agent/grafo/busquedaRegex.js.map +1 -0
  55. package/dist/agent/grafo/excluirTools.js +82 -0
  56. package/dist/agent/grafo/excluirTools.js.map +1 -0
  57. package/dist/agent/{memoriaDeProyecto.js → grafo/memoriaDeProyecto.js} +1 -1
  58. package/dist/agent/grafo/memoriaDeProyecto.js.map +1 -0
  59. package/dist/agent/grafo/navegacionXone.js +198 -0
  60. package/dist/agent/grafo/navegacionXone.js.map +1 -0
  61. package/dist/agent/{perfiles.js → grafo/perfiles.js} +51 -8
  62. package/dist/agent/grafo/perfiles.js.map +1 -0
  63. package/dist/agent/{proyecto.js → grafo/proyecto.js} +207 -24
  64. package/dist/agent/grafo/proyecto.js.map +1 -0
  65. package/dist/agent/grafo/skills.js +393 -0
  66. package/dist/agent/grafo/skills.js.map +1 -0
  67. package/dist/agent/{xoneAgent.js → grafo/xoneAgent.js} +196 -67
  68. package/dist/agent/grafo/xoneAgent.js.map +1 -0
  69. package/dist/agent/navegacion/indiceEnDisco.js +21 -0
  70. package/dist/agent/navegacion/indiceEnDisco.js.map +1 -0
  71. package/dist/agent/navegacion/modeloDeProyecto.js +228 -0
  72. package/dist/agent/navegacion/modeloDeProyecto.js.map +1 -0
  73. package/dist/agent/raizDelPaquete.js +56 -0
  74. package/dist/agent/raizDelPaquete.js.map +1 -0
  75. package/dist/agent/{checkpointer.js → sesiones/checkpointer.js} +2 -2
  76. package/dist/agent/sesiones/checkpointer.js.map +1 -0
  77. package/dist/agent/sesiones/git.js.map +1 -0
  78. package/dist/agent/{gitSync.js → sesiones/gitSync.js} +3 -3
  79. package/dist/agent/sesiones/gitSync.js.map +1 -0
  80. package/dist/agent/{sesionGit.js → sesiones/sesionGit.js} +2 -2
  81. package/dist/agent/sesiones/sesionGit.js.map +1 -0
  82. package/dist/agent/{agentesEnDisco.js → subagentes/agentesEnDisco.js} +304 -86
  83. package/dist/agent/subagentes/agentesEnDisco.js.map +1 -0
  84. package/dist/agent/subagentes/consumoExterno.js.map +1 -0
  85. package/dist/agent/subagentes/escrituraDeCodex.js.map +1 -0
  86. package/dist/agent/{escrituraDeOpencode.js → subagentes/escrituraDeOpencode.js} +1 -1
  87. package/dist/agent/subagentes/escrituraDeOpencode.js.map +1 -0
  88. package/dist/agent/{escrituraExterna.js → subagentes/escrituraExterna.js} +6 -6
  89. package/dist/agent/subagentes/escrituraExterna.js.map +1 -0
  90. package/dist/agent/subagentes/subagenteCodex.js.map +1 -0
  91. package/dist/agent/subagentes/subagenteExterno.js.map +1 -0
  92. package/dist/agent/subagentes/subagenteOpencode.js.map +1 -0
  93. package/dist/agent/{aumentador.js → tareas/aumentador.js} +2 -2
  94. package/dist/agent/tareas/aumentador.js.map +1 -0
  95. package/dist/agent/{juezDeTarea.js → tareas/juezDeTarea.js} +5 -5
  96. package/dist/agent/tareas/juezDeTarea.js.map +1 -0
  97. package/dist/agent/{tareasEnDisco.js → tareas/tareasEnDisco.js} +4 -4
  98. package/dist/agent/tareas/tareasEnDisco.js.map +1 -0
  99. package/dist/agent/turno/diagnosticoDeTools.js.map +1 -0
  100. package/dist/agent/{guionizado.js → turno/guionizado.js} +1 -1
  101. package/dist/agent/turno/guionizado.js.map +1 -0
  102. package/dist/agent/turno/informeDeTraza.js +222 -0
  103. package/dist/agent/turno/informeDeTraza.js.map +1 -0
  104. package/dist/agent/turno/inspectorDePrompt.js +205 -0
  105. package/dist/agent/turno/inspectorDePrompt.js.map +1 -0
  106. package/dist/agent/{instantanea.js → turno/instantanea.js} +7 -2
  107. package/dist/agent/turno/instantanea.js.map +1 -0
  108. package/dist/agent/{interrupts.js → turno/interrupts.js} +2 -2
  109. package/dist/agent/turno/interrupts.js.map +1 -0
  110. package/dist/agent/turno/mensajes.js.map +1 -0
  111. package/dist/agent/turno/normalizar.js.map +1 -0
  112. package/dist/agent/{puente.js → turno/puente.js} +47 -3
  113. package/dist/agent/turno/puente.js.map +1 -0
  114. package/dist/agent/turno/resumenDeContexto.js +176 -0
  115. package/dist/agent/turno/resumenDeContexto.js.map +1 -0
  116. package/dist/agent/{resumenDeTool.js → turno/resumenDeTool.js} +15 -0
  117. package/dist/agent/turno/resumenDeTool.js.map +1 -0
  118. package/dist/agent/turno/textoDeTool.js.map +1 -0
  119. package/dist/agent/{turnoReal.js → turno/turnoReal.js} +38 -14
  120. package/dist/agent/turno/turnoReal.js.map +1 -0
  121. package/dist/agent/turno/verificador.js.map +1 -0
  122. package/dist/cli/config.js +1 -1
  123. package/dist/cli/config.js.map +1 -1
  124. package/dist/cli/consola.js +9 -9
  125. package/dist/cli/consola.js.map +1 -1
  126. package/dist/cli/describe.js +2 -2
  127. package/dist/cli/describe.js.map +1 -1
  128. package/dist/cli/doctor.js +1 -1
  129. package/dist/cli/doctor.js.map +1 -1
  130. package/dist/cli/fuentesDeDisco.js +29 -0
  131. package/dist/cli/fuentesDeDisco.js.map +1 -0
  132. package/dist/cli/main.js +37 -28
  133. package/dist/cli/main.js.map +1 -1
  134. package/dist/cli/run.js +32 -10
  135. package/dist/cli/run.js.map +1 -1
  136. package/dist/cli/traza.js +48 -0
  137. package/dist/cli/traza.js.map +1 -0
  138. package/dist/cli/tui/correrTui.js +4 -4
  139. package/dist/cli/tui/correrTui.js.map +1 -1
  140. package/dist/cli/verify.js +1 -1
  141. package/dist/cli/verify.js.map +1 -1
  142. package/dist/core/actos.js +1 -1
  143. package/dist/core/adjuntos.js +2 -2
  144. package/dist/core/agentes.js +145 -7
  145. package/dist/core/agentes.js.map +1 -1
  146. package/dist/core/artefactos.js +4 -4
  147. package/dist/core/config.js +1 -1
  148. package/dist/core/contextos.js +12 -1
  149. package/dist/core/contextos.js.map +1 -1
  150. package/dist/core/descargas.js +1 -1
  151. package/dist/core/dispositivos.js +53 -3
  152. package/dist/core/dispositivos.js.map +1 -1
  153. package/dist/core/esqueleto.js +1 -1
  154. package/dist/core/modelos.js +16 -3
  155. package/dist/core/modelos.js.map +1 -1
  156. package/dist/core/navegacion.js +134 -0
  157. package/dist/core/navegacion.js.map +1 -0
  158. package/dist/core/notify.js +5 -0
  159. package/dist/core/notify.js.map +1 -1
  160. package/dist/core/planDeSubida.js +1 -1
  161. package/dist/core/settings.js +2 -2
  162. package/dist/core/shellDeAgente.js +99 -0
  163. package/dist/core/shellDeAgente.js.map +1 -0
  164. package/dist/core/skills.js +158 -0
  165. package/dist/core/skills.js.map +1 -0
  166. package/dist/core/zipDeSkill.js +107 -0
  167. package/dist/core/zipDeSkill.js.map +1 -0
  168. package/dist/vendor/sqliteSaver.js +389 -0
  169. package/dist/vendor/sqliteSaver.js.map +1 -0
  170. package/dist/web/servidor/arranque.js +531 -47
  171. package/dist/web/servidor/arranque.js.map +1 -1
  172. package/dist/web/servidor/corredorDeTareas.js +3 -3
  173. package/dist/web/servidor/corredorDeTareas.js.map +1 -1
  174. package/dist/web/servidor/sesiones.js +4 -4
  175. package/dist/web/servidor/transporte.js +1 -1
  176. package/dist/web/servidor/transporte.js.map +1 -1
  177. package/dist/web/servidor/vestibulo.js +7 -7
  178. package/dist/web/servidor/vestibulo.js.map +1 -1
  179. package/package.json +9 -5
  180. package/skills/archify/SKILL.md +25 -2
  181. package/skills/artifacts-builder/SKILL.md +23 -0
  182. package/skills/xone-hotswap/SKILL.md +74 -0
  183. package/skills/xone-hotswap/scripts/xone-arrancar-ios +85 -0
  184. package/skills/xone-hotswap/scripts/xone-desplegar-android +411 -0
  185. package/skills/xone-hotswap/scripts/xone-hotswap +171 -0
  186. package/skills/xone-hotswap/scripts/xone-log-android +102 -0
  187. package/skills/xone-hotswap/scripts/xone-reiniciar-android +104 -0
  188. package/apps/web/dist/assets/index-CFYAoHdw.js +0 -477
  189. package/dist/agent/agentesEnDisco.js.map +0 -1
  190. package/dist/agent/arbolDeProyecto.js.map +0 -1
  191. package/dist/agent/artefactosEnDisco.js.map +0 -1
  192. package/dist/agent/aumentador.js.map +0 -1
  193. package/dist/agent/authEnDisco.js.map +0 -1
  194. package/dist/agent/busquedaRegex.js.map +0 -1
  195. package/dist/agent/catalogoModelos.js.map +0 -1
  196. package/dist/agent/checkpointer.js.map +0 -1
  197. package/dist/agent/cloudstudioClient.js.map +0 -1
  198. package/dist/agent/cloudstudioMcp.js.map +0 -1
  199. package/dist/agent/configEnDisco.js.map +0 -1
  200. package/dist/agent/consumoExterno.js.map +0 -1
  201. package/dist/agent/crearProyecto.js.map +0 -1
  202. package/dist/agent/descarga.js.map +0 -1
  203. package/dist/agent/diagnosticoDeTools.js.map +0 -1
  204. package/dist/agent/dispositivosEnMaquina.js.map +0 -1
  205. package/dist/agent/entorno.js.map +0 -1
  206. package/dist/agent/escrituraDeCodex.js.map +0 -1
  207. package/dist/agent/escrituraDeOpencode.js.map +0 -1
  208. package/dist/agent/escrituraExterna.js.map +0 -1
  209. package/dist/agent/gemini.js.map +0 -1
  210. package/dist/agent/git.js.map +0 -1
  211. package/dist/agent/gitSync.js.map +0 -1
  212. package/dist/agent/guionizado.js.map +0 -1
  213. package/dist/agent/hotswap.js.map +0 -1
  214. package/dist/agent/instalacionEnMaquina.js.map +0 -1
  215. package/dist/agent/instantanea.js.map +0 -1
  216. package/dist/agent/interrupts.js.map +0 -1
  217. package/dist/agent/juezDeTarea.js.map +0 -1
  218. package/dist/agent/lanzamientoEnMaquina.js.map +0 -1
  219. package/dist/agent/manifiesto.js.map +0 -1
  220. package/dist/agent/memoriaDeProyecto.js.map +0 -1
  221. package/dist/agent/mensajes.js.map +0 -1
  222. package/dist/agent/modelos.js.map +0 -1
  223. package/dist/agent/modelosDeMotor.js.map +0 -1
  224. package/dist/agent/normalizar.js.map +0 -1
  225. package/dist/agent/paqueteDelProyecto.js.map +0 -1
  226. package/dist/agent/perfiles.js.map +0 -1
  227. package/dist/agent/persona.js.map +0 -1
  228. package/dist/agent/procesosEnMaquina.js.map +0 -1
  229. package/dist/agent/proyecto.js.map +0 -1
  230. package/dist/agent/puente.js.map +0 -1
  231. package/dist/agent/resumenDeContexto.js +0 -30
  232. package/dist/agent/resumenDeContexto.js.map +0 -1
  233. package/dist/agent/resumenDeTool.js.map +0 -1
  234. package/dist/agent/sesionGit.js.map +0 -1
  235. package/dist/agent/settingsEnDisco.js.map +0 -1
  236. package/dist/agent/skills.js +0 -65
  237. package/dist/agent/skills.js.map +0 -1
  238. package/dist/agent/subagenteCodex.js.map +0 -1
  239. package/dist/agent/subagenteExterno.js.map +0 -1
  240. package/dist/agent/subagenteOpencode.js.map +0 -1
  241. package/dist/agent/subida.js.map +0 -1
  242. package/dist/agent/tareasEnDisco.js.map +0 -1
  243. package/dist/agent/textoDeTool.js.map +0 -1
  244. package/dist/agent/turnoReal.js.map +0 -1
  245. package/dist/agent/verificador.js.map +0 -1
  246. package/dist/agent/versionEnDisco.js.map +0 -1
  247. package/dist/agent/xoneAgent.js.map +0 -1
  248. package/dist/agent/zip.js.map +0 -1
  249. /package/dist/agent/{cloudstudioClient.js → cloudstudio/cloudstudioClient.js} +0 -0
  250. /package/dist/agent/{manifiesto.js → cloudstudio/manifiesto.js} +0 -0
  251. /package/dist/agent/{entorno.js → config/entorno.js} +0 -0
  252. /package/dist/agent/{gemini.js → config/gemini.js} +0 -0
  253. /package/dist/agent/{hotswap.js → dispositivos/hotswap.js} +0 -0
  254. /package/dist/agent/{instalacionEnMaquina.js → dispositivos/instalacionEnMaquina.js} +0 -0
  255. /package/dist/agent/{procesosEnMaquina.js → dispositivos/procesosEnMaquina.js} +0 -0
  256. /package/dist/agent/{git.js → sesiones/git.js} +0 -0
  257. /package/dist/agent/{consumoExterno.js → subagentes/consumoExterno.js} +0 -0
  258. /package/dist/agent/{escrituraDeCodex.js → subagentes/escrituraDeCodex.js} +0 -0
  259. /package/dist/agent/{subagenteCodex.js → subagentes/subagenteCodex.js} +0 -0
  260. /package/dist/agent/{subagenteExterno.js → subagentes/subagenteExterno.js} +0 -0
  261. /package/dist/agent/{subagenteOpencode.js → subagentes/subagenteOpencode.js} +0 -0
  262. /package/dist/agent/{diagnosticoDeTools.js → turno/diagnosticoDeTools.js} +0 -0
  263. /package/dist/agent/{mensajes.js → turno/mensajes.js} +0 -0
  264. /package/dist/agent/{normalizar.js → turno/normalizar.js} +0 -0
  265. /package/dist/agent/{textoDeTool.js → turno/textoDeTool.js} +0 -0
  266. /package/dist/agent/{verificador.js → turno/verificador.js} +0 -0
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Quita del PROMPT las tools que un agente no puede usar.
3
+ *
4
+ * ## Por qué, medido el 17-09-2026
5
+ *
6
+ * El inspector (`agent/turno/inspectorDePrompt.ts`) enseñó que en un turno de la pregunta más
7
+ * barata que tenemos, los esquemas de las tools eran **12.350 de los 14.135 caracteres** de la
8
+ * primera llamada — el 87 % — y que se reenvían ENTEROS en cada una: ~12.400 de los 15.466
9
+ * tokens del turno. La pregunta ocupaba cuarenta caracteres.
10
+ *
11
+ * Y dentro de eso, el orquestador —que es de SOLO LECTURA por `permisosDe`— cargaba los
12
+ * esquemas de `write_file`, `edit_file` y `delete`: 3.743 caracteres, unos 940 tokens POR
13
+ * LLAMADA, por tres tools que tiene prohibido usar. `permissions` acota el PERMISO; el esquema
14
+ * viaja igual.
15
+ *
16
+ * ## Qué es y qué NO es
17
+ *
18
+ * **No es una frontera de seguridad**, y eso no es una opinión nuestra: deepagents tiene el
19
+ * mismo middleware (`createToolExclusionMiddleware`, que no exporta) y su propia documentación
20
+ * lo dice con esas palabras — «exclusions calibrate the agent per model; they are not a security
21
+ * boundary». La frontera sigue siendo `permisosDe`, intacta, y esto es coste.
22
+ *
23
+ * Por eso hace las DOS cosas: quita la tool de la petición (que es lo que ahorra) **y** rechaza
24
+ * su llamada si aun así llegara. Solo lo primero sería fiar la barrera a que el modelo no
25
+ * invente un nombre que no ha visto, y en este repo eso no es una barrera.
26
+ */
27
+ import { ToolMessage } from "@langchain/core/messages";
28
+ import { createMiddleware } from "langchain";
29
+ import { toolsDe } from "./perfiles.js";
30
+ function nombreDeTool(t) {
31
+ const n = t?.name;
32
+ return typeof n === "string" ? n : undefined;
33
+ }
34
+ export function excluirTools(nombres) {
35
+ const fuera = new Set(nombres);
36
+ return createMiddleware({
37
+ name: "ExcluirToolsMiddleware",
38
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
39
+ wrapModelCall: (request, handler) => {
40
+ const tools = request?.tools;
41
+ if (!Array.isArray(tools))
42
+ return handler(request);
43
+ const quedan = tools.filter((t) => {
44
+ const n = nombreDeTool(t);
45
+ // Una tool sin nombre legible no se descarta: no se puede afirmar que sea una de las
46
+ // excluidas, y quitar de más deja al agente sin capacidades en silencio.
47
+ return n === undefined || !fuera.has(n);
48
+ });
49
+ return quedan.length === tools.length ? handler(request) : handler({ ...request, tools: quedan });
50
+ },
51
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
52
+ wrapToolCall: (request, handler) => {
53
+ const nombre = request?.toolCall?.name;
54
+ if (typeof nombre !== "string" || !fuera.has(nombre))
55
+ return handler(request);
56
+ return new ToolMessage({
57
+ content: `Error: ${nombre} no está disponible para este agente.`,
58
+ tool_call_id: request?.toolCall?.id ?? "",
59
+ });
60
+ },
61
+ });
62
+ }
63
+ /**
64
+ * Todas las tools de fichero que monta `createFilesystemMiddleware`.
65
+ *
66
+ * `delete` no está en `TOOLS_LECTURA` ni en `TOOLS_ESCRITURA` porque ningún perfil nuestro la
67
+ * concede: la monta la librería y nadie la usa, así que su esquema viaja en cada llamada de
68
+ * cada agente sin comprar nada.
69
+ */
70
+ const TOOLS_DE_FICHERO = ["ls", "read_file", "glob", "grep", "write_file", "edit_file", "delete"];
71
+ /**
72
+ * Las que este perfil NO puede usar, DERIVADAS de lo que ya decide `toolsDe`.
73
+ *
74
+ * Escritas a mano serían una segunda lista que hay que acordarse de actualizar, y el día que un
75
+ * perfil gane una capacidad se quedaría sin ella en silencio — el patrón de fallo de este repo.
76
+ * Así, conceder una tool en `perfiles.ts` la saca de aquí sola.
77
+ */
78
+ export function toolsQueNoUsa(perfil) {
79
+ const puede = new Set(toolsDe(perfil));
80
+ return TOOLS_DE_FICHERO.filter((t) => !puede.has(t));
81
+ }
82
+ //# sourceMappingURL=excluirTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"excluirTools.js","sourceRoot":"","sources":["../../../src/agent/grafo/excluirTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAA4B,MAAM,eAAe,CAAC;AAElE,SAAS,YAAY,CAAC,CAAU;IAC9B,MAAM,CAAC,GAAI,CAA+B,EAAE,IAAI,CAAC;IACjD,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAA0B;IACrD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,gBAAgB,CAAC;QACtB,IAAI,EAAE,wBAAwB;QAC9B,8DAA8D;QAC9D,aAAa,EAAE,CAAC,OAAY,EAAE,OAAY,EAAE,EAAE;YAC5C,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAU,EAAE,EAAE;gBACzC,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC1B,qFAAqF;gBACrF,yEAAyE;gBACzE,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACpG,CAAC;QACD,8DAA8D;QAC9D,YAAY,EAAE,CAAC,OAAY,EAAE,OAAY,EAAE,EAAE;YAC3C,MAAM,MAAM,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC;YACvC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9E,OAAO,IAAI,WAAW,CAAC;gBACrB,OAAO,EAAE,UAAU,MAAM,uCAAuC;gBAChE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE;aAC1C,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAU,CAAC;AAE3G;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,MAA2B;IACvD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC"}
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import { existsSync, mkdirSync, writeFileSync } from "node:fs";
9
9
  import { join } from "node:path";
10
- import { NOMBRE_CARPETA } from "./configEnDisco.js";
10
+ import { NOMBRE_CARPETA } from "../config/configEnDisco.js";
11
11
  export const NOMBRE_ARCHIVO_MEMORIA = "memoria.md";
12
12
  /** Ruta que ve el agente dentro de su backend virtual. */
13
13
  export const RUTA_MEMORIA_VIRTUAL = "/MEMORIA_PROYECTO.md";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoriaDeProyecto.js","sourceRoot":"","sources":["../../../src/agent/grafo/memoriaDeProyecto.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY,CAAC;AACnD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAC3D,uEAAuE;AACvE,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,cAAc,IAAI,sBAAsB,EAAE,CAAC;AACnF,wEAAwE;AACxE,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,cAAc,uBAAuB,CAAC;AAEjF,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,sBAAsB,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;CAiBhC,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,aAAa,CAAC,IAAI,EAAE,iBAAiB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,mFAAmF;QACnF,gFAAgF;QAChF,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACnG,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,198 @@
1
+ import { tool } from "@langchain/core/tools";
2
+ import { z } from "zod";
3
+ import { llamadaDeBusqueda } from "./busquedaRegex.js";
4
+ /**
5
+ * `xone_navegacion`: preguntar por la ESTRUCTURA del proyecto sin leer ficheros.
6
+ *
7
+ * **Por qué existe, medido.** Sobre un proyecto real de 41 `.xne`, contestar «¿qué
8
+ * colecciones tiene el proyecto?» leyendo ficheros cuesta unos 18.000 tokens; contestarla
9
+ * desde el índice cuesta 141. Y una pregunta de capacidad («¿podríamos hacer un CRM?») llegó
10
+ * a gastar 21 pasos de exploración. Lo caro no es abrir un `.xne` —son un par de kilobytes—,
11
+ * es **no saber cuál de los cuarenta y uno abrir**. `grep` y `regex_search` buscan TEXTO;
12
+ * esto contesta sobre el modelo ya resuelto, así que un `mapcol` encuentra su colección
13
+ * aunque el nombre aparezca en otros veinte sitios.
14
+ *
15
+ * **El esquema es deliberadamente pequeño.** El inspector midió que el 87 % de una llamada
16
+ * son los esquemas de las tools y quitarle al orquestador tres que no podía usar valió un
17
+ * −24 % del turno. Una tool con una operación enumerada y un nombre opcional cuesta poco en
18
+ * cada llamada; cuatro tools separadas costarían cuatro veces eso para siempre.
19
+ *
20
+ * **Las rutas que devuelve son VIRTUALES y ya están filtradas.** Quien las traduce y aplica
21
+ * `puedeLeerRuta` y `esVistaAplanada` es el adaptador (`navegacion/modeloDeProyecto.ts`), y
22
+ * lo hace en la FUENTE: lo que el agente no puede abrir no llega ni a estar en el índice. Se
23
+ * filtra ahí y no aquí a propósito — es el único sitio donde una ruta se crea, está probado
24
+ * contra una fuga, y un segundo filtro sobre los mismos datos sería un segundo sitio donde
25
+ * equivocarse sin añadir barrera. Lo que esta tool NO hace nunca es aceptar una ruta del
26
+ * modelo: se pregunta por NOMBRE, así que no hay ruta que validar a la entrada.
27
+ */
28
+ /** Topes. Una respuesta que no cabe se recorta DICIENDO cuánto se dejó fuera: una lista
29
+ * truncada en silencio se lee como la lista entera, y sobre eso se concluye de más. */
30
+ export const LIMITES_NAVEGACION = {
31
+ inventario: 200,
32
+ referencias: 60,
33
+ campos: 150,
34
+ definiciones: 20,
35
+ problemas: 40,
36
+ };
37
+ const ESQUEMA = z.object({
38
+ operacion: z
39
+ .enum(["inventario", "definicion", "referencias", "campos", "detalle", "app", "problemas"])
40
+ .describe("inventario: todas las colecciones. definicion: dónde se declara. referencias: quién la usa. " +
41
+ "campos: los campos de una colección. detalle: todo de una (campos, eventos, nodos, conexiones). " +
42
+ "app: por dónde arranca la aplicación, login y estilos. problemas: referencias rotas y colecciones que no usa nadie"),
43
+ nombre: z
44
+ .string()
45
+ .min(1)
46
+ .max(200)
47
+ .optional()
48
+ .describe("`Coleccion` o `Coleccion.CAMPO`. No hace falta en `inventario`"),
49
+ });
50
+ /** Recorta y DICE lo que se dejó fuera. */
51
+ function recortar(lista, tope, pinta) {
52
+ const cabe = lista.slice(0, tope).map(pinta).join("\n");
53
+ return lista.length > tope ? `${cabe}\n… y ${lista.length - tope} más` : cabe;
54
+ }
55
+ const pintarDeclaracion = (d) => d.clase === "coleccion"
56
+ ? `${d.nombre} ${d.fichero}`
57
+ : `${d.coleccion}.${d.nombre}${d.tipo === undefined ? "" : `:${d.tipo}`} ${d.fichero}`;
58
+ const pintarReferencia = (r) => `${r.desde} --${r.por}--> ${r.hacia} ${r.fichero}`;
59
+ /**
60
+ * La tool. `cargar` entra por parámetro —y con él la raíz ya fijada— para que el modelo no
61
+ * pueda decir sobre QUÉ proyecto pregunta: si pudiera, esto sería una tool que lee cualquier
62
+ * carpeta de la máquina.
63
+ */
64
+ export function crearNavegacionXone(cargar, ficheros) {
65
+ return tool(async (entrada) => {
66
+ let indice;
67
+ try {
68
+ indice = await cargar(ficheros);
69
+ }
70
+ catch (error) {
71
+ // El motivo de un error de Node lleva la ruta absoluta y esto va al modelo: se dice
72
+ // QUÉ pasó, no dónde. Y se DEVUELVE en vez de lanzarse, para que el agente pueda
73
+ // seguir con `read_file` en vez de llevarse el turno por delante.
74
+ return (`No se pudo leer la estructura del proyecto (${error instanceof Error ? error.name : "error"}). ` +
75
+ `Sigue por texto:\n${llamadaDeBusqueda("coll name=")}`);
76
+ }
77
+ if (entrada.operacion === "inventario") {
78
+ const todas = indice.inventario();
79
+ if (todas.length === 0) {
80
+ return ("El proyecto no declara ninguna colección. Si esperabas alguna, puede que el `.xne` no la " +
81
+ `declare como espera el parser:\n${llamadaDeBusqueda("coll name=")}`);
82
+ }
83
+ return `${todas.length} colecciones:\n${recortar(todas, LIMITES_NAVEGACION.inventario, pintarDeclaracion)}`;
84
+ }
85
+ if (entrada.operacion === "app") {
86
+ const app = indice.app();
87
+ const filas = [];
88
+ // Vacío es «no consta», no «no hay», y por eso se dice con palabras en vez de
89
+ // devolver una fila en blanco que se leería como una afirmación.
90
+ filas.push(app.entrada.length > 0
91
+ ? `arranca por: ${app.entrada.join(", ")}`
92
+ : "arranca por: no consta en app.xml");
93
+ if (app.login.length > 0)
94
+ filas.push(`login: ${app.login.join(", ")}`);
95
+ if (app.estilos.length > 0)
96
+ filas.push(`estilos: ${app.estilos.join(" ")}`);
97
+ if (app.conexiones.length > 0)
98
+ filas.push(`conexiones: ${app.conexiones.join(" ")}`);
99
+ return filas.join("\n");
100
+ }
101
+ if (entrada.operacion === "problemas") {
102
+ const { rotas } = indice.problemas();
103
+ if (rotas.length === 0) {
104
+ return "Ninguna referencia apunta a una colección que no exista.";
105
+ }
106
+ return `${rotas.length} referencia(s) a una colección que no existe:\n${recortar(rotas, LIMITES_NAVEGACION.problemas, pintarReferencia)}`;
107
+ }
108
+ const nombre = entrada.nombre?.trim();
109
+ if (nombre === undefined || nombre === "") {
110
+ return "Falta `nombre`: di la colección (`Clientes`) o el campo (`Clientes.NOMBRE`).";
111
+ }
112
+ if (entrada.operacion === "definicion") {
113
+ const donde = indice.definicion(nombre);
114
+ // Vacío no es un fallo: es que no está. Y se dice CÓMO seguir, que es lo que evita
115
+ // que el modelo pruebe seis rutas inventadas — la misma postura que `porQueNo`.
116
+ if (donde.length === 0) {
117
+ return (`No hay ninguna declaración de «${nombre}». Prueba \`inventario\` para ver las que sí existen, ` +
118
+ `o búscalo como texto:\n${llamadaDeBusqueda(nombre)}`);
119
+ }
120
+ return recortar(donde, LIMITES_NAVEGACION.definiciones, pintarDeclaracion);
121
+ }
122
+ if (entrada.operacion === "campos") {
123
+ const campos = indice.campos(nombre);
124
+ if (campos.length === 0) {
125
+ return (`«${nombre}» no declara campos, o no existe. Prueba \`definicion\` para saber cuál de las dos, ` +
126
+ `o búscalo como texto:\n${llamadaDeBusqueda(nombre)}`);
127
+ }
128
+ return recortar(campos, LIMITES_NAVEGACION.campos, pintarDeclaracion);
129
+ }
130
+ if (entrada.operacion === "detalle") {
131
+ const d = indice.detalle(nombre);
132
+ // `undefined` y no un detalle vacío: «no existe» y «existe y está vacía» son dos
133
+ // cosas, y contestar la segunda sobre la primera hace que el agente deje de buscar.
134
+ if (d === undefined) {
135
+ return (`No hay ninguna colección «${nombre}». Prueba \`inventario\`, o búscala como texto:\n` +
136
+ llamadaDeBusqueda(nombre));
137
+ }
138
+ const partes = [
139
+ `${d.nombre} ${d.fichero}`,
140
+ d.campos.length === 0
141
+ ? "campos: (ninguno)"
142
+ : `campos: ${d.campos.map((c) => `${c.nombre}${c.tipo === undefined ? "" : ":" + c.tipo}`).join(" ")}`,
143
+ ];
144
+ // Lo que está VACÍO no se pinta: una fila «eventos: (ninguno)» por cada cosa que la
145
+ // colección no tiene convierte la respuesta en una plantilla y cuesta tokens en cada
146
+ // llamada. Lo único que se afirma vacío son los campos, porque una colección sin
147
+ // ellos es rara y merece decirse.
148
+ if (d.eventos.length > 0)
149
+ partes.push(`eventos: ${d.eventos.join(" ")}`);
150
+ if (d.nodos.length > 0)
151
+ partes.push(`nodos: ${d.nodos.join(" ")}`);
152
+ if (d.conexiones.length > 0)
153
+ partes.push(`conexiones: ${d.conexiones.join(" ")}`);
154
+ if (d.apuntaA.length > 0) {
155
+ partes.push(`apunta a:\n${recortar(d.apuntaA, LIMITES_NAVEGACION.referencias, pintarReferencia)}`);
156
+ }
157
+ return partes.join("\n");
158
+ }
159
+ const usos = indice.referencias(nombre);
160
+ if (usos.length === 0) {
161
+ /**
162
+ * **El caso que más importa, y por eso la salida es una llamada y no un consejo.**
163
+ *
164
+ * «Nadie la referencia» es una afirmación fuerte y este índice no puede sostenerla:
165
+ * tiene un límite declarado —no ve un nombre calculado en JavaScript, ni un
166
+ * `getCollection(variable)`— así que un vacío aquí puede ser «no se usa» o «se usa por
167
+ * un camino que no modelo». Devolver el vacío a secas invita a concluir lo primero, y
168
+ * sobre esa conclusión se borra código vivo. Se dice la duda Y se da el siguiente paso
169
+ * hecho: un modelo al que se le dice qué hacer sin decirle cómo se inventa los
170
+ * argumentos, y eso cuesta un viaje y un error de esquema.
171
+ */
172
+ return (`Ninguna referencia declarada a «${nombre}» (mapcol, mapfld, linkedfield, contents, inherits ni ` +
173
+ `getCollection con literal). Puede usarse por un camino que esto no ve —un nombre calculado en ` +
174
+ `JavaScript—, así que NO concluyas que no se usa sin comprobarlo:\n${llamadaDeBusqueda(nombre)}`);
175
+ }
176
+ /**
177
+ * **Se DICE cuál es floja.** `mencion` es un literal que coincide con el nombre de una
178
+ * colección, no una llamada resuelta: la cadena real puede tener tres saltos
179
+ * (`ExecuteNode(abrirColl('X'))` → nodo → `irColl(coll)` → `getCollection`). Sin esta
180
+ * línea, el modelo leería las dos con la misma autoridad y afirmaría un uso que solo es
181
+ * probable.
182
+ */
183
+ const hayMenciones = usos.some((r) => r.por === "mencion");
184
+ const lista = recortar(usos, LIMITES_NAVEGACION.referencias, pintarReferencia);
185
+ return hayMenciones
186
+ ? `${lista}\n(«mencion» = el nombre aparece como literal en un script; es probable, no seguro)`
187
+ : lista;
188
+ }, {
189
+ name: "xone_navegacion",
190
+ description: "Estructura del proyecto XOne resuelta: qué colecciones hay, dónde se declara una colección o un campo, " +
191
+ "quién la referencia (mapcol, mapfld, linkedfield, contents, inherits y desde scripts), qué campos, eventos y nodos tiene, " +
192
+ "por dónde arranca la aplicación y qué referencias están rotas. " +
193
+ "Úsala ANTES de leer ficheros para saber CUÁL leer. No busca texto: para eso están grep y regex_search. " +
194
+ "No ve referencias calculadas en JavaScript.",
195
+ schema: ESQUEMA,
196
+ });
197
+ }
198
+ //# sourceMappingURL=navegacionXone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navegacionXone.js","sourceRoot":"","sources":["../../../src/agent/grafo/navegacionXone.ts"],"names":[],"mappings":"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"}
@@ -2,13 +2,13 @@
2
2
  * Los PERMISOS de un especialista, con tools de FICHERO (la v1 no usa MCP).
3
3
  *
4
4
  * Este fichero ya no tiene la lista de especialistas: los cuatro que vivían aquí a fuego
5
- * son ahora ficheros `.md` (`core/agentes.ts`, `agent/agentesEnDisco.ts`), sembrados la
5
+ * son ahora ficheros `.md` (`core/agentes.ts`, `agent/subagentes/agentesEnDisco.ts`), sembrados la
6
6
  * primera vez y editables por el usuario. Lo que se queda es lo que NO puede salir de un
7
7
  * fichero: qué se le deniega a todo el mundo, qué tools le tocan a quien escribe y cómo se
8
8
  * monta su aprobación humana. Un `.md` puede cambiar el prompt de un agente; no puede
9
9
  * concederle leer `/.env`.
10
10
  */
11
- import { artefactoFueraDeSitio } from "../core/artefactos.js";
11
+ import { artefactoFueraDeSitio } from "../../core/artefactos.js";
12
12
  /** Las tools de fichero que monta deepagents sobre el backend. */
13
13
  export const TOOLS_LECTURA = ["ls", "read_file", "glob", "grep"];
14
14
  export const TOOLS_ESCRITURA = ["write_file", "edit_file"];
@@ -54,14 +54,57 @@ export function permisosDe(perfil) {
54
54
  const base = [...DENEGADO_SIEMPRE];
55
55
  if (!perfil.soloLectura)
56
56
  return base;
57
- // OJO para cuando el `xone-device-tester` sepa hablar con el móvil: este `/**` también deniega
58
- // `/artefactos/**`, así que un agente de SOLO LECTURA no puede dejar una captura. Hoy no
59
- // hay ningún productor de solo lectura, así que no se abre un hueco por si acaso pero
60
- // el día que lo haya, la excepción va aquí y antes hay que medir el orden de reglas de
61
- // deepagents (¿gana la primera que casa, o gana la denegación?), porque de eso depende que
62
- // un `allow` sobre `/artefactos/**` haga algo o sea decorativo.
57
+ // OJO: este `/**` también deniega `/artefactos/**`, así que un agente de SOLO LECTURA no
58
+ // puede dejar una captura CON UNA TOOL DE FICHERO. `device-controller` la deja igual, pero
59
+ // por otro camino —un comando, que no pasa por aquí— y por eso el anuncio del artefacto
60
+ // tuvo que ir aparte (`proyecto.ts#anunciarArtefactosDeLaShell`). Si algún día hace falta
61
+ // un productor de solo lectura SIN shell, la excepción va aquí, y antes hay que medir el
62
+ // orden de reglas de deepagents (¿gana la primera que casa, o gana la denegación?), porque
63
+ // de eso depende que un `allow` sobre `/artefactos/**` haga algo o sea decorativo.
63
64
  return [...base, { operations: ["write"], paths: ["/**"], mode: "deny" }];
64
65
  }
66
+ /**
67
+ * Las tools de fichero de un agente con EJECUCIÓN.
68
+ *
69
+ * `read_file` tiene que estar siempre (lo exige el middleware). Lo que NO está son
70
+ * `write_file` y `edit_file`: no porque no pueda escribir —con una shell puede, y fingir lo
71
+ * contrario sería peor que no decir nada— sino para que el camino normal de tocar el
72
+ * proyecto siga siendo el que pasa por la aprobación y por el diff. Quien escribe el proyecto
73
+ * es `developer-xone`; éste conduce un aparato.
74
+ */
75
+ export const TOOLS_CON_EJECUCION = ["read_file", "ls", "glob", "grep", "execute"];
76
+ /**
77
+ * Si a este agente le toca la shell.
78
+ *
79
+ * Dos condiciones, y la segunda no es una formalidad: en los tres motores EXTERNOS la shell
80
+ * está cerrada a propósito (`Bash` denegada, la tool retirada, el sandbox `read-only`) y el
81
+ * hijo corre en otro proceso donde este campo no manda nada. Honrarlo ahí sería prometer una
82
+ * capacidad que no llega; ignorarlo en silencio, esconder que no llega. Se decide aquí, en un
83
+ * sitio, y la ventana de Ajustes lo cuenta.
84
+ */
85
+ export function puedeEjecutar(perfil) {
86
+ return perfil.ejecucion === true && (perfil.motor ?? "modelo") === "modelo";
87
+ }
88
+ /**
89
+ * Con qué backend y con qué reglas se le montan las tools de fichero a un especialista.
90
+ *
91
+ * Existe como función PURA y exportada por el patrón de fallo de este repo: compuesto dentro
92
+ * de `construirAgente` —que todos sus tests doblan— «este agente lleva shell y aquél no»
93
+ * quedaría escrito y sin probar, y el síntoma sería el peor de todos: todo en verde y un
94
+ * especialista corriente con una shell, o el de dispositivos sin ella y sin error que leer.
95
+ *
96
+ * **Y `permissions` NO se pasa con un backend ejecutable.** No es una elección: deepagents
97
+ * LANZA (`ConfigurationError`) si se combinan, porque «los comandos alcanzan cualquier ruta
98
+ * independientemente de las reglas de ruta». O sea que la biblioteca se niega a sostener una
99
+ * barrera que no sería verdad — y esa negativa es la razón por la que esto se concede a UN
100
+ * agente y se declara en su fichero.
101
+ */
102
+ export function montajeDeFicheros(perfil, backends) {
103
+ if (!puedeEjecutar(perfil) || backends.conShell === undefined) {
104
+ return { backend: backends.normal, permissions: permisosDe(perfil) };
105
+ }
106
+ return { backend: backends.conShell, tools: TOOLS_CON_EJECUCION };
107
+ }
65
108
  /**
66
109
  * Barrera de lectura para tools propias.
67
110
  *
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perfiles.js","sourceRoot":"","sources":["../../../src/agent/grafo/perfiles.ts"],"names":[],"mappings":"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"}