xonecode 0.5.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/apps/web/dist/assets/{index-BB3SamhR.css → index-Boak51UP.css} +1 -1
  2. package/apps/web/dist/assets/index-Cg28x6nG.js +477 -0
  3. package/apps/web/dist/assets/{php-D_2--9WK.js → php-Cu6F_QCJ.js} +1 -1
  4. package/apps/web/dist/assets/{ruby-DSHSDbk1.js → ruby-BiqQPoC6.js} +1 -1
  5. package/apps/web/dist/index.html +2 -2
  6. package/dist/agent/{cloudstudioClient.js → cloudstudio/cloudstudioClient.js} +10 -0
  7. package/dist/agent/cloudstudio/cloudstudioClient.js.map +1 -0
  8. package/dist/agent/{cloudstudioMcp.js → cloudstudio/cloudstudioMcp.js} +5 -5
  9. package/dist/agent/cloudstudio/cloudstudioMcp.js.map +1 -0
  10. package/dist/agent/{descarga.js → cloudstudio/descarga.js} +17 -7
  11. package/dist/agent/cloudstudio/descarga.js.map +1 -0
  12. package/dist/agent/cloudstudio/manifiesto.js.map +1 -0
  13. package/dist/agent/cloudstudio/ramaActiva.js +11 -0
  14. package/dist/agent/cloudstudio/ramaActiva.js.map +1 -0
  15. package/dist/agent/{subida.js → cloudstudio/subida.js} +16 -7
  16. package/dist/agent/cloudstudio/subida.js.map +1 -0
  17. package/dist/agent/{zip.js → cloudstudio/zip.js} +1 -1
  18. package/dist/agent/cloudstudio/zip.js.map +1 -0
  19. package/dist/agent/{authEnDisco.js → config/authEnDisco.js} +3 -3
  20. package/dist/agent/config/authEnDisco.js.map +1 -0
  21. package/dist/agent/{catalogoModelos.js → config/catalogoModelos.js} +47 -1
  22. package/dist/agent/config/catalogoModelos.js.map +1 -0
  23. package/dist/agent/{configEnDisco.js → config/configEnDisco.js} +6 -6
  24. package/dist/agent/config/configEnDisco.js.map +1 -0
  25. package/dist/agent/{crearProyecto.js → config/crearProyecto.js} +2 -2
  26. package/dist/agent/config/crearProyecto.js.map +1 -0
  27. package/dist/agent/config/entorno.js.map +1 -0
  28. package/dist/agent/config/gemini.js.map +1 -0
  29. package/dist/agent/config/modelos.js +235 -0
  30. package/dist/agent/config/modelos.js.map +1 -0
  31. package/dist/agent/{modelosDeMotor.js → config/modelosDeMotor.js} +1 -1
  32. package/dist/agent/config/modelosDeMotor.js.map +1 -0
  33. package/dist/agent/config/mudanzaEnDisco.js +121 -0
  34. package/dist/agent/config/mudanzaEnDisco.js.map +1 -0
  35. package/dist/agent/{persona.js → config/persona.js} +1 -1
  36. package/dist/agent/config/persona.js.map +1 -0
  37. package/dist/agent/config/selectorEnMaquina.js +45 -0
  38. package/dist/agent/config/selectorEnMaquina.js.map +1 -0
  39. package/dist/agent/{settingsEnDisco.js → config/settingsEnDisco.js} +37 -2
  40. package/dist/agent/config/settingsEnDisco.js.map +1 -0
  41. package/dist/agent/{versionEnDisco.js → config/versionEnDisco.js} +8 -4
  42. package/dist/agent/config/versionEnDisco.js.map +1 -0
  43. package/dist/agent/dispositivos/arranqueDeEmulador.js +146 -0
  44. package/dist/agent/dispositivos/arranqueDeEmulador.js.map +1 -0
  45. package/dist/agent/{dispositivosEnMaquina.js → dispositivos/dispositivosEnMaquina.js} +93 -6
  46. package/dist/agent/dispositivos/dispositivosEnMaquina.js.map +1 -0
  47. package/dist/agent/dispositivos/hotswap.js.map +1 -0
  48. package/dist/agent/dispositivos/instalacionEnMaquina.js.map +1 -0
  49. package/dist/agent/dispositivos/juezVisual.js +152 -0
  50. package/dist/agent/dispositivos/juezVisual.js.map +1 -0
  51. package/dist/agent/{lanzamientoEnMaquina.js → dispositivos/lanzamientoEnMaquina.js} +1 -1
  52. package/dist/agent/dispositivos/lanzamientoEnMaquina.js.map +1 -0
  53. package/dist/agent/{paqueteDelProyecto.js → dispositivos/paqueteDelProyecto.js} +5 -5
  54. package/dist/agent/dispositivos/paqueteDelProyecto.js.map +1 -0
  55. package/dist/agent/dispositivos/procesosEnMaquina.js.map +1 -0
  56. package/dist/agent/dispositivos/sensorDeArranque.js +154 -0
  57. package/dist/agent/dispositivos/sensorDeArranque.js.map +1 -0
  58. package/dist/agent/exportarPdf.js +140 -0
  59. package/dist/agent/exportarPdf.js.map +1 -0
  60. package/dist/agent/{arbolDeProyecto.js → grafo/arbolDeProyecto.js} +2 -2
  61. package/dist/agent/grafo/arbolDeProyecto.js.map +1 -0
  62. package/dist/agent/{artefactosEnDisco.js → grafo/artefactosEnDisco.js} +2 -2
  63. package/dist/agent/grafo/artefactosEnDisco.js.map +1 -0
  64. package/dist/agent/{busquedaRegex.js → grafo/busquedaRegex.js} +41 -1
  65. package/dist/agent/grafo/busquedaRegex.js.map +1 -0
  66. package/dist/agent/grafo/criticaVisual.js +115 -0
  67. package/dist/agent/grafo/criticaVisual.js.map +1 -0
  68. package/dist/agent/grafo/excluirTools.js +82 -0
  69. package/dist/agent/grafo/excluirTools.js.map +1 -0
  70. package/dist/agent/{memoriaDeProyecto.js → grafo/memoriaDeProyecto.js} +1 -1
  71. package/dist/agent/grafo/memoriaDeProyecto.js.map +1 -0
  72. package/dist/agent/grafo/navegacionXone.js +231 -0
  73. package/dist/agent/grafo/navegacionXone.js.map +1 -0
  74. package/dist/agent/{perfiles.js → grafo/perfiles.js} +96 -10
  75. package/dist/agent/grafo/perfiles.js.map +1 -0
  76. package/dist/agent/{proyecto.js → grafo/proyecto.js} +274 -24
  77. package/dist/agent/grafo/proyecto.js.map +1 -0
  78. package/dist/agent/grafo/skills.js +425 -0
  79. package/dist/agent/grafo/skills.js.map +1 -0
  80. package/dist/agent/grafo/xoneAgent.js +566 -0
  81. package/dist/agent/grafo/xoneAgent.js.map +1 -0
  82. package/dist/agent/navegacion/estilosEnDisco.js +110 -0
  83. package/dist/agent/navegacion/estilosEnDisco.js.map +1 -0
  84. package/dist/agent/navegacion/hechosEnDisco.js +26 -0
  85. package/dist/agent/navegacion/hechosEnDisco.js.map +1 -0
  86. package/dist/agent/navegacion/indiceEnDisco.js +36 -0
  87. package/dist/agent/navegacion/indiceEnDisco.js.map +1 -0
  88. package/dist/agent/navegacion/modeloDeProyecto.js +228 -0
  89. package/dist/agent/navegacion/modeloDeProyecto.js.map +1 -0
  90. package/dist/agent/raizDelPaquete.js +56 -0
  91. package/dist/agent/raizDelPaquete.js.map +1 -0
  92. package/dist/agent/{checkpointer.js → sesiones/checkpointer.js} +1 -1
  93. package/dist/agent/sesiones/checkpointer.js.map +1 -0
  94. package/dist/agent/sesiones/git.js.map +1 -0
  95. package/dist/agent/{gitSync.js → sesiones/gitSync.js} +3 -3
  96. package/dist/agent/sesiones/gitSync.js.map +1 -0
  97. package/dist/agent/{sesionGit.js → sesiones/sesionGit.js} +2 -2
  98. package/dist/agent/sesiones/sesionGit.js.map +1 -0
  99. package/dist/agent/subagentes/agentesEnDisco.js +818 -0
  100. package/dist/agent/subagentes/agentesEnDisco.js.map +1 -0
  101. package/dist/agent/subagentes/consumoExterno.js.map +1 -0
  102. package/dist/agent/subagentes/escrituraDeCodex.js.map +1 -0
  103. package/dist/agent/{escrituraDeOpencode.js → subagentes/escrituraDeOpencode.js} +1 -1
  104. package/dist/agent/subagentes/escrituraDeOpencode.js.map +1 -0
  105. package/dist/agent/{escrituraExterna.js → subagentes/escrituraExterna.js} +59 -6
  106. package/dist/agent/subagentes/escrituraExterna.js.map +1 -0
  107. package/dist/agent/subagentes/pluginDeSkills.js +99 -0
  108. package/dist/agent/subagentes/pluginDeSkills.js.map +1 -0
  109. package/dist/agent/subagentes/subagenteCodex.js.map +1 -0
  110. package/dist/agent/{subagenteExterno.js → subagentes/subagenteExterno.js} +48 -0
  111. package/dist/agent/subagentes/subagenteExterno.js.map +1 -0
  112. package/dist/agent/{subagenteOpencode.js → subagentes/subagenteOpencode.js} +53 -1
  113. package/dist/agent/subagentes/subagenteOpencode.js.map +1 -0
  114. package/dist/agent/{aumentador.js → tareas/aumentador.js} +2 -2
  115. package/dist/agent/tareas/aumentador.js.map +1 -0
  116. package/dist/agent/{juezDeTarea.js → tareas/juezDeTarea.js} +6 -6
  117. package/dist/agent/tareas/juezDeTarea.js.map +1 -0
  118. package/dist/agent/{tareasEnDisco.js → tareas/tareasEnDisco.js} +53 -4
  119. package/dist/agent/tareas/tareasEnDisco.js.map +1 -0
  120. package/dist/agent/{diagnosticoDeTools.js → turno/diagnosticoDeTools.js} +5 -1
  121. package/dist/agent/turno/diagnosticoDeTools.js.map +1 -0
  122. package/dist/agent/{guionizado.js → turno/guionizado.js} +1 -1
  123. package/dist/agent/turno/guionizado.js.map +1 -0
  124. package/dist/agent/turno/informeDeTraza.js +245 -0
  125. package/dist/agent/turno/informeDeTraza.js.map +1 -0
  126. package/dist/agent/turno/inspectorDePrompt.js +205 -0
  127. package/dist/agent/turno/inspectorDePrompt.js.map +1 -0
  128. package/dist/agent/{instantanea.js → turno/instantanea.js} +7 -2
  129. package/dist/agent/turno/instantanea.js.map +1 -0
  130. package/dist/agent/{interrupts.js → turno/interrupts.js} +2 -2
  131. package/dist/agent/turno/interrupts.js.map +1 -0
  132. package/dist/agent/turno/mensajes.js.map +1 -0
  133. package/dist/agent/turno/normalizar.js.map +1 -0
  134. package/dist/agent/{puente.js → turno/puente.js} +71 -4
  135. package/dist/agent/turno/puente.js.map +1 -0
  136. package/dist/agent/turno/resumenDeContexto.js +260 -0
  137. package/dist/agent/turno/resumenDeContexto.js.map +1 -0
  138. package/dist/agent/{resumenDeTool.js → turno/resumenDeTool.js} +33 -0
  139. package/dist/agent/turno/resumenDeTool.js.map +1 -0
  140. package/dist/agent/turno/rubrica.js +91 -0
  141. package/dist/agent/turno/rubrica.js.map +1 -0
  142. package/dist/agent/turno/textoDeTool.js.map +1 -0
  143. package/dist/agent/{turnoReal.js → turno/turnoReal.js} +210 -25
  144. package/dist/agent/turno/turnoReal.js.map +1 -0
  145. package/dist/agent/turno/verificador.js.map +1 -0
  146. package/dist/cli/config.js +1 -1
  147. package/dist/cli/config.js.map +1 -1
  148. package/dist/cli/consola.js +72 -9
  149. package/dist/cli/consola.js.map +1 -1
  150. package/dist/cli/describe.js +2 -2
  151. package/dist/cli/describe.js.map +1 -1
  152. package/dist/cli/doctor.js +1 -1
  153. package/dist/cli/doctor.js.map +1 -1
  154. package/dist/cli/fuentesDeDisco.js +29 -0
  155. package/dist/cli/fuentesDeDisco.js.map +1 -0
  156. package/dist/cli/main.js +87 -31
  157. package/dist/cli/main.js.map +1 -1
  158. package/dist/cli/run.js +40 -10
  159. package/dist/cli/run.js.map +1 -1
  160. package/dist/cli/traza.js +48 -0
  161. package/dist/cli/traza.js.map +1 -0
  162. package/dist/cli/tui/correrTui.js +4 -4
  163. package/dist/cli/tui/correrTui.js.map +1 -1
  164. package/dist/cli/verify.js +1 -1
  165. package/dist/cli/verify.js.map +1 -1
  166. package/dist/core/actos.js +1 -1
  167. package/dist/core/adjuntos.js +2 -2
  168. package/dist/core/agentes.js +247 -7
  169. package/dist/core/agentes.js.map +1 -1
  170. package/dist/core/artefactos.js +4 -4
  171. package/dist/core/config.js +1 -1
  172. package/dist/core/contextos.js +12 -1
  173. package/dist/core/contextos.js.map +1 -1
  174. package/dist/core/descargas.js +1 -1
  175. package/dist/core/dispositivos.js +53 -3
  176. package/dist/core/dispositivos.js.map +1 -1
  177. package/dist/core/esfuerzo.js +141 -0
  178. package/dist/core/esfuerzo.js.map +1 -0
  179. package/dist/core/esqueleto.js +1 -1
  180. package/dist/core/estilos.js +78 -0
  181. package/dist/core/estilos.js.map +1 -0
  182. package/dist/core/exportacion.js +140 -0
  183. package/dist/core/exportacion.js.map +1 -0
  184. package/dist/core/hechosDelProyecto.js +87 -0
  185. package/dist/core/hechosDelProyecto.js.map +1 -0
  186. package/dist/core/logDeDispositivo.js +143 -0
  187. package/dist/core/logDeDispositivo.js.map +1 -0
  188. package/dist/core/modelos.js +48 -3
  189. package/dist/core/modelos.js.map +1 -1
  190. package/dist/core/mudanzaDeWorkspace.js +93 -0
  191. package/dist/core/mudanzaDeWorkspace.js.map +1 -0
  192. package/dist/core/navegacion.js +134 -0
  193. package/dist/core/navegacion.js.map +1 -0
  194. package/dist/core/notify.js +5 -0
  195. package/dist/core/notify.js.map +1 -1
  196. package/dist/core/planDeSubida.js +1 -1
  197. package/dist/core/planes.js +70 -0
  198. package/dist/core/planes.js.map +1 -0
  199. package/dist/core/ports.js +4 -0
  200. package/dist/core/ports.js.map +1 -1
  201. package/dist/core/rubrica.js +90 -0
  202. package/dist/core/rubrica.js.map +1 -0
  203. package/dist/core/selectorDeCarpeta.js +87 -0
  204. package/dist/core/selectorDeCarpeta.js.map +1 -0
  205. package/dist/core/settings.js +56 -7
  206. package/dist/core/settings.js.map +1 -1
  207. package/dist/core/shellDeAgente.js +144 -0
  208. package/dist/core/shellDeAgente.js.map +1 -0
  209. package/dist/core/skills.js +158 -0
  210. package/dist/core/skills.js.map +1 -0
  211. package/dist/core/topeAgotado.js +69 -0
  212. package/dist/core/topeAgotado.js.map +1 -0
  213. package/dist/core/zipDeSkill.js +107 -0
  214. package/dist/core/zipDeSkill.js.map +1 -0
  215. package/dist/web/servidor/arranque.js +853 -54
  216. package/dist/web/servidor/arranque.js.map +1 -1
  217. package/dist/web/servidor/corredorDeTareas.js +3 -3
  218. package/dist/web/servidor/corredorDeTareas.js.map +1 -1
  219. package/dist/web/servidor/sesiones.js +34 -6
  220. package/dist/web/servidor/sesiones.js.map +1 -1
  221. package/dist/web/servidor/transporte.js +1 -1
  222. package/dist/web/servidor/transporte.js.map +1 -1
  223. package/dist/web/servidor/vestibulo.js +62 -13
  224. package/dist/web/servidor/vestibulo.js.map +1 -1
  225. package/package.json +7 -4
  226. package/skills/archify/SKILL.md +25 -2
  227. package/skills/artifacts-builder/SKILL.md +23 -0
  228. package/skills/xone-hotswap/SKILL.md +96 -0
  229. package/skills/xone-hotswap/scripts/xone-arrancar-android +202 -0
  230. package/skills/xone-hotswap/scripts/xone-arrancar-ios +85 -0
  231. package/skills/xone-hotswap/scripts/xone-captura-android +93 -0
  232. package/skills/xone-hotswap/scripts/xone-desplegar-android +439 -0
  233. package/skills/xone-hotswap/scripts/xone-hotswap +201 -0
  234. package/skills/xone-hotswap/scripts/xone-log-android +102 -0
  235. package/skills/xone-hotswap/scripts/xone-reiniciar-android +132 -0
  236. package/skills/xone-plan-builder/SKILL.md +22 -4
  237. package/skills/xone-spec-builder/SKILL.md +37 -7
  238. package/apps/web/dist/assets/index-CFYAoHdw.js +0 -477
  239. package/dist/agent/agentesEnDisco.js +0 -539
  240. package/dist/agent/agentesEnDisco.js.map +0 -1
  241. package/dist/agent/arbolDeProyecto.js.map +0 -1
  242. package/dist/agent/artefactosEnDisco.js.map +0 -1
  243. package/dist/agent/aumentador.js.map +0 -1
  244. package/dist/agent/authEnDisco.js.map +0 -1
  245. package/dist/agent/busquedaRegex.js.map +0 -1
  246. package/dist/agent/catalogoModelos.js.map +0 -1
  247. package/dist/agent/checkpointer.js.map +0 -1
  248. package/dist/agent/cloudstudioClient.js.map +0 -1
  249. package/dist/agent/cloudstudioMcp.js.map +0 -1
  250. package/dist/agent/configEnDisco.js.map +0 -1
  251. package/dist/agent/consumoExterno.js.map +0 -1
  252. package/dist/agent/crearProyecto.js.map +0 -1
  253. package/dist/agent/descarga.js.map +0 -1
  254. package/dist/agent/diagnosticoDeTools.js.map +0 -1
  255. package/dist/agent/dispositivosEnMaquina.js.map +0 -1
  256. package/dist/agent/entorno.js.map +0 -1
  257. package/dist/agent/escrituraDeCodex.js.map +0 -1
  258. package/dist/agent/escrituraDeOpencode.js.map +0 -1
  259. package/dist/agent/escrituraExterna.js.map +0 -1
  260. package/dist/agent/gemini.js.map +0 -1
  261. package/dist/agent/git.js.map +0 -1
  262. package/dist/agent/gitSync.js.map +0 -1
  263. package/dist/agent/guionizado.js.map +0 -1
  264. package/dist/agent/hotswap.js.map +0 -1
  265. package/dist/agent/instalacionEnMaquina.js.map +0 -1
  266. package/dist/agent/instantanea.js.map +0 -1
  267. package/dist/agent/interrupts.js.map +0 -1
  268. package/dist/agent/juezDeTarea.js.map +0 -1
  269. package/dist/agent/lanzamientoEnMaquina.js.map +0 -1
  270. package/dist/agent/manifiesto.js.map +0 -1
  271. package/dist/agent/memoriaDeProyecto.js.map +0 -1
  272. package/dist/agent/mensajes.js.map +0 -1
  273. package/dist/agent/modelos.js +0 -130
  274. package/dist/agent/modelos.js.map +0 -1
  275. package/dist/agent/modelosDeMotor.js.map +0 -1
  276. package/dist/agent/normalizar.js.map +0 -1
  277. package/dist/agent/paqueteDelProyecto.js.map +0 -1
  278. package/dist/agent/perfiles.js.map +0 -1
  279. package/dist/agent/persona.js.map +0 -1
  280. package/dist/agent/procesosEnMaquina.js.map +0 -1
  281. package/dist/agent/proyecto.js.map +0 -1
  282. package/dist/agent/puente.js.map +0 -1
  283. package/dist/agent/resumenDeContexto.js +0 -30
  284. package/dist/agent/resumenDeContexto.js.map +0 -1
  285. package/dist/agent/resumenDeTool.js.map +0 -1
  286. package/dist/agent/sesionGit.js.map +0 -1
  287. package/dist/agent/settingsEnDisco.js.map +0 -1
  288. package/dist/agent/skills.js +0 -65
  289. package/dist/agent/skills.js.map +0 -1
  290. package/dist/agent/subagenteCodex.js.map +0 -1
  291. package/dist/agent/subagenteExterno.js.map +0 -1
  292. package/dist/agent/subagenteOpencode.js.map +0 -1
  293. package/dist/agent/subida.js.map +0 -1
  294. package/dist/agent/tareasEnDisco.js.map +0 -1
  295. package/dist/agent/textoDeTool.js.map +0 -1
  296. package/dist/agent/turnoReal.js.map +0 -1
  297. package/dist/agent/verificador.js.map +0 -1
  298. package/dist/agent/versionEnDisco.js.map +0 -1
  299. package/dist/agent/xoneAgent.js +0 -347
  300. package/dist/agent/xoneAgent.js.map +0 -1
  301. package/dist/agent/zip.js.map +0 -1
  302. /package/dist/agent/{manifiesto.js → cloudstudio/manifiesto.js} +0 -0
  303. /package/dist/agent/{entorno.js → config/entorno.js} +0 -0
  304. /package/dist/agent/{gemini.js → config/gemini.js} +0 -0
  305. /package/dist/agent/{hotswap.js → dispositivos/hotswap.js} +0 -0
  306. /package/dist/agent/{instalacionEnMaquina.js → dispositivos/instalacionEnMaquina.js} +0 -0
  307. /package/dist/agent/{procesosEnMaquina.js → dispositivos/procesosEnMaquina.js} +0 -0
  308. /package/dist/agent/{git.js → sesiones/git.js} +0 -0
  309. /package/dist/agent/{consumoExterno.js → subagentes/consumoExterno.js} +0 -0
  310. /package/dist/agent/{escrituraDeCodex.js → subagentes/escrituraDeCodex.js} +0 -0
  311. /package/dist/agent/{subagenteCodex.js → subagentes/subagenteCodex.js} +0 -0
  312. /package/dist/agent/{mensajes.js → turno/mensajes.js} +0 -0
  313. /package/dist/agent/{normalizar.js → turno/normalizar.js} +0 -0
  314. /package/dist/agent/{textoDeTool.js → turno/textoDeTool.js} +0 -0
  315. /package/dist/agent/{verificador.js → turno/verificador.js} +0 -0
@@ -0,0 +1,87 @@
1
+ /**
2
+ * El selector de carpeta NATIVO: qué comando lo abre en cada sistema y cómo se lee su
3
+ * respuesta.
4
+ *
5
+ * **Por qué no lo pone el navegador, que es lo primero que uno intenta.** Una página no
6
+ * puede devolver una ruta absoluta y no es un descuido de nadie: `showDirectoryPicker()`
7
+ * entrega un handle del que solo se puede leer el NOMBRE de la carpeta, y un
8
+ * `<input webkitdirectory>` entrega rutas RELATIVAS a lo elegido. Las dos cosas son
9
+ * deliberadas —una web no tiene por qué saber cómo está montado tu disco— y las dos son
10
+ * justo lo que aquí no sirve: `settings.workspace` necesita la ruta entera.
11
+ *
12
+ * **Por qué tampoco un explorador propio servido por nosotros.** Se puede: el servidor lista
13
+ * carpetas y el cliente navega. El precio es que el ÁRBOL DE CARPETAS de la máquina empieza
14
+ * a viajar por el cable, y eso es exactamente lo que `sinRutas` evita — una ruta del
15
+ * workspace es la excepción declarada; el mapa del disco entero no lo es, y sería una
16
+ * excepción mucho más ancha para el mismo resultado.
17
+ *
18
+ * **Así que lo abre el sistema donde corre la consola.** Solo cruza el cable la carpeta que
19
+ * la persona elige, que es la misma que iba a teclear. El precio declarado es que el diálogo
20
+ * sale en ESA máquina: con la consola por un túnel, el botón no sirve — por eso el campo de
21
+ * texto sigue siendo el camino principal y esto es un atajo, nunca el único.
22
+ *
23
+ * Esta parte es pura: compone el comando y lee su salida. Lanzarlo es de
24
+ * `agent/config/selectorEnMaquina.ts`.
25
+ */
26
+ /** Lo que tarda un diálogo en contestar lo pone una persona, así que el tope es largo: solo
27
+ * existe para que un diálogo que nadie cierra no deje un proceso vivo para siempre. */
28
+ export const TOPE_DEL_SELECTOR_MS = 5 * 60 * 1000;
29
+ /**
30
+ * El comando que abre el selector, o AUSENTE si este sistema no tiene ninguno conocido.
31
+ *
32
+ * Ausente no es un fallo: es «aquí no hay selector», y entonces no se ofrece el botón. Un
33
+ * botón que no hace nada es peor que no tenerlo, y el campo de texto ya resuelve el caso.
34
+ *
35
+ * `desde` es dónde se abre el diálogo — la carpeta que hay puesta ahora, para no empezar en
36
+ * un sitio cualquiera. Se pasa como argumento SEPARADO, nunca interpolado en el guion de
37
+ * AppleScript: ahí dentro una comilla en un nombre de carpeta cerraría la cadena.
38
+ */
39
+ export function comandoDelSelector(plataforma, desde) {
40
+ if (plataforma === "darwin") {
41
+ // `choose folder` con la ubicación por argumento (`argv of me`), y no pegada al guion.
42
+ // Un `POSIX file` que no existe hace fallar el diálogo entero, así que el guion cae a la
43
+ // casa cuando no se le da ninguna o la que se le da no vale.
44
+ const guion = [
45
+ "on run argumentos",
46
+ " set destino to item 1 of argumentos",
47
+ " try",
48
+ ' set inicio to POSIX file destino as alias',
49
+ " on error",
50
+ " set inicio to path to home folder",
51
+ " end try",
52
+ ' set elegida to choose folder with prompt "Dónde se bajan los proyectos de xonecode" default location inicio',
53
+ " return POSIX path of elegida",
54
+ "end run",
55
+ ].join("\n");
56
+ return { programa: "osascript", argumentos: ["-e", guion, desde ?? ""] };
57
+ }
58
+ if (plataforma === "linux") {
59
+ return {
60
+ programa: "zenity",
61
+ argumentos: [
62
+ "--file-selection",
63
+ "--directory",
64
+ "--title=Dónde se bajan los proyectos de xonecode",
65
+ ...(desde === undefined ? [] : [`--filename=${desde.replace(/\/*$/, "/")}`]),
66
+ ],
67
+ };
68
+ }
69
+ return undefined;
70
+ }
71
+ /**
72
+ * La carpeta elegida, leída de lo que escupió el comando — o AUSENTE si no se eligió ninguna.
73
+ *
74
+ * **Cancelar no es un fallo y se cuenta igual que no elegir.** `osascript` sale con código 1
75
+ * y `zenity` con 1 cuando la persona cierra el diálogo, así que quien llama no puede
76
+ * distinguir un «no, gracias» de una avería por el código; lo que sí distingue es que no hay
77
+ * ruta, y con eso basta: el campo se queda como estaba.
78
+ *
79
+ * Se recorta el salto de línea final, que es del terminal y no del dato, y se exige que
80
+ * empiece por `/`: cualquier otra cosa que salga por ahí no es una carpeta y no se cuela
81
+ * hasta el validador disfrazada de ruta.
82
+ */
83
+ export function carpetaDeLaSalida(salida) {
84
+ const limpia = salida.trim().replace(/\/+$/, "");
85
+ return limpia.startsWith("/") ? limpia : undefined;
86
+ }
87
+ //# sourceMappingURL=selectorDeCarpeta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectorDeCarpeta.js","sourceRoot":"","sources":["../../src/core/selectorDeCarpeta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;wFACwF;AACxF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAOlD;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,KAAc;IACnE,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,uFAAuF;QACvF,yFAAyF;QACzF,6DAA6D;QAC7D,MAAM,KAAK,GAAG;YACZ,mBAAmB;YACnB,uCAAuC;YACvC,OAAO;YACP,+CAA+C;YAC/C,YAAY;YACZ,uCAAuC;YACvC,WAAW;YACX,+GAA+G;YAC/G,gCAAgC;YAChC,SAAS;SACV,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;IAC3E,CAAC;IACD,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE;gBACV,kBAAkB;gBAClB,aAAa;gBACb,kDAAkD;gBAClD,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;aAC7E;SACF,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC"}
@@ -6,8 +6,8 @@
6
6
  * de un cliente. Vive en global y no en el proyecto porque un entorno sirve a muchos
7
7
  * proyectos; el proyecto solo guarda a cuál pertenece.
8
8
  *
9
- * TypeScript puro: ni disco ni red. El disco lo pone `agent/settingsEnDisco.ts`, igual
10
- * que `core/config.ts` deja el I/O a `agent/configEnDisco.ts` y `agent/authEnDisco.ts`.
9
+ * TypeScript puro: ni disco ni red. El disco lo pone `agent/config/settingsEnDisco.ts`, igual
10
+ * que `core/config.ts` deja el I/O a `agent/config/configEnDisco.ts` y `agent/config/authEnDisco.ts`.
11
11
  */
12
12
  import { posix } from "node:path";
13
13
  import { CLAVES_DENEGADAS } from "./config.js";
@@ -216,16 +216,27 @@ export function segmentoSeguro(valor, que) {
216
216
  return valor;
217
217
  }
218
218
  /**
219
- * Dónde queda la copia local de un proyecto.
219
+ * Dónde queda la copia local de un proyecto: `<workspace>/<entorno>/<proyecto>`.
220
220
  *
221
- * La BASE es configurable (`settings.workspace`); la disposición de dentro NO, porque es
222
- * lo que hace predecible encontrar una copia sin consultar un índice.
221
+ * El WORKSPACE es configurable (`settings.workspace`); la disposición de dentro NO, porque
222
+ * es lo que hace predecible encontrar una copia sin consultar un índice.
223
+ *
224
+ * **El literal `workspace` vivía aquí, en MEDIO** (`<base>/<entorno>/workspace/<proyecto>`),
225
+ * y se ha mudado a la omisión de la base (`~/.xonecode/workspace`). Dos motivos medidos:
226
+ * con la base en `~/.xonecode`, los ids de los entornos quedaban de HERMANOS de `agentes/`,
227
+ * `skills/`, `tareas/` y `auth.json` —la casa del harness mezclada con el trabajo—; y quien
228
+ * eligiera una carpeta suya se encontraba un nivel `workspace/` que no había pedido. Con el
229
+ * literal en la base, lo que se configura ES el workspace.
230
+ *
231
+ * **El segmento del ENTORNO se queda, y no es decoración**: el mismo nombre de proyecto
232
+ * existe a la vez en dos entornos, y sin ese nivel serían la misma carpeta (ver
233
+ * `Wizard.tsx`, que ya explica por qué un on-premise necesita id propio).
223
234
  */
224
235
  /**
225
236
  * ¿Esa raíz es una copia que creó xonecode, o una carpeta del usuario?
226
237
  *
227
238
  * De esto depende si el harness puede COMMITEAR solo al cerrar cada turno. En
228
- * `<base>/<entorno>/workspace/<proyecto>` la carpeta la creó él y es suya; en la que abrió
239
+ * `<workspace>/<entorno>/<proyecto>` la carpeta la creó él y es suya; en la que abrió
229
240
  * una persona —un proyecto offline, o `./bin/xonecode` dentro de su propio repo— un commit
230
241
  * por turno sería ensuciarle el historial cada vez que habla con el agente.
231
242
  *
@@ -240,7 +251,45 @@ export function dentroDelWorkspace(raiz, base) {
240
251
  const fuera = normal(base);
241
252
  return dentro.length > fuera.length && fuera.every((seg, i) => dentro[i] === seg);
242
253
  }
254
+ /**
255
+ * Un `~/…` tecleado, resuelto contra la casa. Solo `~` y `~/…`: un `~otro` es la casa de
256
+ * OTRA persona en la sintaxis del shell, y aquí no se resuelve — se deja tal cual y se
257
+ * rechaza después por no ser absoluta.
258
+ *
259
+ * Es una comodidad de ENTRADA y nada más. **Lo que se enseña y lo que se guarda es la ruta
260
+ * ENTERA**: se probó a mandarla abreviada por el cable, para que el caso normal no llevara
261
+ * el nombre de la cuenta del sistema, y no se sostiene — la cabecera de esa misma consola ya
262
+ * saluda por el nombre del usuario, así que el `~` no tapaba nada que no estuviera ya, y a
263
+ * cambio dejaba en pantalla una ruta que no se puede comprobar de un vistazo, que es justo
264
+ * para lo que ese campo existe. `casa` entra por parámetro: este módulo es puro.
265
+ */
266
+ export function expandirConCasa(ruta, casa) {
267
+ const limpio = ruta.trim();
268
+ if (limpio === "~")
269
+ return casa;
270
+ return limpio.startsWith("~/") ? posix.join(casa, limpio.slice(2)) : limpio;
271
+ }
272
+ /**
273
+ * ¿Vale eso como workspace? Ausente = sí.
274
+ *
275
+ * Se comprueba sobre la ruta ya EXPANDIDA. Tres noes, y ninguno es de estilo: vacío no es
276
+ * una elección, una ruta relativa dependería del directorio desde el que se arrancó la
277
+ * consola —que no es el proyecto ni nada estable— y la raíz del disco convertiría cada id de
278
+ * entorno en una carpeta de primer nivel del sistema.
279
+ */
280
+ export function motivoDeWorkspaceInaceptable(ruta) {
281
+ const limpio = ruta.trim();
282
+ if (limpio === "")
283
+ return "escribe una carpeta: en blanco no es una elección";
284
+ if (!posix.isAbsolute(limpio)) {
285
+ return "tiene que ser una ruta absoluta, que empiece por «/» o por «~/»";
286
+ }
287
+ if (posix.normalize(limpio).replace(/\/+$/, "") === "") {
288
+ return "la raíz del disco no: ahí cada entorno sería una carpeta de primer nivel del sistema";
289
+ }
290
+ return undefined;
291
+ }
243
292
  export function rutaDeWorkspace(base, entorno, proyecto) {
244
- return posix.join(base, segmentoSeguro(entorno, "id de entorno"), "workspace", segmentoSeguro(proyecto, "nombre de proyecto"));
293
+ return posix.join(base, segmentoSeguro(entorno, "id de entorno"), segmentoSeguro(proyecto, "nombre de proyecto"));
245
294
  }
246
295
  //# sourceMappingURL=settings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/core/settings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/core/settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * El ENTORNO con el que corre la shell de un subagente con ejecución.
3
+ *
4
+ * TypeScript puro: aquí se decide QUÉ variables ve esa shell, y quien la monta es
5
+ * `agent/grafo/proyecto.ts`. Separado por lo de siempre —compuesto dentro del montaje, que
6
+ * todos los tests doblan, la regla quedaría escrita y no probada—, y porque esto es una
7
+ * decisión sobre secretos, que es justo lo que no puede depender de acordarse.
8
+ *
9
+ * **Lo que se quita, y por qué es obligatorio quitarlo.** `guardarCredencial` escribe la
10
+ * clave de API TAMBIÉN en `process.env`, a propósito (`agent/config/authEnDisco.ts`). Un
11
+ * `inheritEnv: true` a secas le pasaría esas claves a la shell del modelo, y entonces un
12
+ * `printenv` —que es lo primero que hace cualquiera para orientarse— las deja en el
13
+ * resultado de la tool, o sea en el contexto y en el `.jsonl` de la sesión. No es una fuga
14
+ * hipotética: es la salida normal de un comando normal.
15
+ *
16
+ * Se quitan **por la tabla** (`VARIABLES_POR_PROVEEDOR`, el único sitio donde vive el nombre
17
+ * de la variable de cada proveedor — hubo cuatro copias y ya habían divergido) más el
18
+ * prefijo `XONECODE_CLAVE_`, que es el de los proveedores PERSONALIZADOS y por definición no
19
+ * puede estar en ninguna tabla: el slug lo elige el usuario. Y no se quita todo lo que
20
+ * empiece por `XONECODE_`, que se llevaría `XONECODE_TRACE_TOOLS` y `XONECODE_MODELO` sin
21
+ * que sean secretos de nadie.
22
+ *
23
+ * **Límite declarado, y conviene no engañarse con él**: esto quita NUESTRAS credenciales,
24
+ * las que xonecode puso ahí. El entorno de quien arranca el proceso puede traer un
25
+ * `GITHUB_TOKEN` o un `AWS_SECRET_ACCESS_KEY` suyos, y eso no se filtra — ni se podría con
26
+ * honestidad, porque «lo que parece una clave» es una heurística y una heurística que falla
27
+ * en silencio es peor que una regla declarada. Quien concede ejecución concede leer el
28
+ * entorno y el disco; lo que esto evita es que el harness REGALE lo que él mismo escribió.
29
+ *
30
+ * **Y los scripts de una skill se ponen en el PATH, que es lo que quita el problema en vez de
31
+ * explicarlo.** Medido corriéndolo: el agente tenía DOS espacios de rutas —las virtuales de
32
+ * `read_file` y las reales de sus comandos— y se pasó decenas de llamadas mezclándolos, leyendo
33
+ * con `read_file` rutas absolutas que no existen para esa tool y no van a existir nunca. Con los
34
+ * `scripts/` de cada skill montada en el PATH, un script se llama por su NOMBRE
35
+ * (`xone-hotswap …`) y no hay ninguna ruta que acertar, ni que meter en el prompt, ni que viaje
36
+ * en el evento. Un aparato nuevo mañana trae su skill con sus scripts y quedan disponibles solos.
37
+ *
38
+ * **Se AÑADEN al final, no al principio.** Prepender dejaría que una skill —que puede venir en
39
+ * un `.zip` de cualquier sitio— sombreara un binario del sistema llamando a un script suyo `ls`
40
+ * o `git`. Al final, lo que ya existe gana.
41
+ *
42
+ * **Y lo que se AÑADE además son rutas, una variable por cosa.** Una shell ve el disco de verdad,
43
+ * no nuestras rutas virtuales: `/skills/xone-hotswap/` no existe para ella. Pero meter la
44
+ * ruta absoluta en el prompt tendría dos precios —el comando que el modelo componga sería el
45
+ * `detalle` del evento, y ahí no puede viajar una ruta de la máquina (`sinRutas`), y la
46
+ * raíz no es UNA sino tres con la del proyecto ganando—. Con una variable por skill, el
47
+ * prompt dice `$XONECODE_SKILL_XONE_HOTSWAP/scripts/android.mjs` y ni el contexto ni el
48
+ * cable ven una ruta.
49
+ */
50
+ import { VARIABLES_POR_PROVEEDOR } from "./modelos.js";
51
+ /** El prefijo de las claves de un proveedor personalizado (`core/modelos.ts#variableDeProveedor`). */
52
+ const PREFIJO_DE_CLAVE = "XONECODE_CLAVE_";
53
+ /**
54
+ * La variable que nombra la carpeta donde dejar lo que se quiera enseñar a una persona.
55
+ *
56
+ * Sin ella, un script escribe en el `cwd` —la raíz del proyecto— que es justo lo que
57
+ * `artefactoFueraDeSitio` prohíbe a las tools de fichero, y una shell no pasa por ahí.
58
+ */
59
+ export const VARIABLE_DE_ARTEFACTOS = "XONECODE_ARTEFACTOS";
60
+ /**
61
+ * Cómo se llama la variable que lleva la ruta real de una skill.
62
+ *
63
+ * La MISMA derivación que `variableDeProveedor` para un personalizado (mayúsculas y los
64
+ * guiones a guión bajo): dos formas de convertir un slug en variable son dos formas de
65
+ * discrepar. El prefijo es otro a propósito — `XONECODE_SKILL_` frente a
66
+ * `XONECODE_CLAVE_`—, así que una skill no puede fabricarse el nombre de una credencial.
67
+ */
68
+ export function variableDeSkill(nombre) {
69
+ return `XONECODE_SKILL_${nombre.toUpperCase().replace(/-/g, "_")}`;
70
+ }
71
+ /**
72
+ * Las dos rutas de Android que la shell necesita y no puede deducir.
73
+ *
74
+ * **Medido en la máquina de desarrollo**: `adb` está en el PATH (`/opt/homebrew/bin/adb`) y
75
+ * `emulator` **no** —vive en `.../share/android-commandlinetools/emulator/`— con
76
+ * `ANDROID_HOME` y `ANDROID_SDK_ROOT` vacías. O sea que el caso normal de un Mac con
77
+ * Homebrew es justo el que deja al agente sin el binario que arranca un emulador.
78
+ *
79
+ * Quien sabe dónde está el SDK es `localizadorDeAndroid` (`agent/dispositivos/`), que ya
80
+ * mira las dos variables de entorno y las raíces por omisión de cada plataforma. Pasarlo por
81
+ * aquí es lo que evita que el script tenga que adivinarlo: **una segunda regla sobre dónde
82
+ * vive el SDK es una segunda regla que puede divergir**, y ésta es la clase de cosa que falla
83
+ * en silencio —el script no encuentra el binario, el modelo se apaña por su cuenta—.
84
+ *
85
+ * Va por VARIABLE y no por el prompt por lo mismo que las skills: el comando que el modelo
86
+ * componga sale como `detalle` del evento, y ahí no puede viajar una ruta de la máquina
87
+ * (`sinRutas`).
88
+ */
89
+ export const VARIABLE_DE_EMULATOR = "XONECODE_EMULATOR";
90
+ export const VARIABLE_DE_ADB = "XONECODE_ADB";
91
+ /**
92
+ * De un localizador de binarios del SDK a las variables que ve la shell.
93
+ *
94
+ * PURA y con el localizador por parámetro: así se prueba sin disco, y sobre todo así la
95
+ * composición de producción no vive dentro de `entornoDeLaShellDelProyecto` —que toca
96
+ * `process.env` y `existsSync`, y por tanto ningún test suyo podría ver si el localizador
97
+ * llegó a estar cableado—. Es el patrón de fallo que este repo lleva contadas nueve veces.
98
+ *
99
+ * Lo que no se encuentra **no sale**, ni siquiera como cadena vacía: la misma regla que el
100
+ * resto del módulo. Un `XONECODE_EMULATOR=""` no es «no consta», es una ruta rota que el
101
+ * script tomaría por buena.
102
+ */
103
+ export function variablesDeAndroid(enSdk) {
104
+ const variables = {};
105
+ const emulator = enSdk("emulator", "emulator");
106
+ if (emulator !== undefined)
107
+ variables[VARIABLE_DE_EMULATOR] = emulator;
108
+ const adb = enSdk("adb", "platform-tools");
109
+ if (adb !== undefined)
110
+ variables[VARIABLE_DE_ADB] = adb;
111
+ return variables;
112
+ }
113
+ export function entornoDeShell(opciones) {
114
+ const credenciales = new Set(Object.values(VARIABLES_POR_PROVEEDOR));
115
+ const limpio = {};
116
+ for (const [clave, valor] of Object.entries(opciones.entorno)) {
117
+ // Una variable sin valor se DESCARTA en vez de pasarse como cadena vacía: un `PATH=""`
118
+ // no es «no consta», es un PATH roto.
119
+ if (valor === undefined)
120
+ continue;
121
+ if (credenciales.has(clave))
122
+ continue;
123
+ if (clave.startsWith(PREFIJO_DE_CLAVE))
124
+ continue;
125
+ limpio[clave] = valor;
126
+ }
127
+ for (const skill of opciones.skills ?? []) {
128
+ limpio[variableDeSkill(skill.nombre)] = skill.dir;
129
+ }
130
+ const binarios = opciones.binarios ?? [];
131
+ if (binarios.length > 0) {
132
+ // Sin PATH heredado no se parte de vacío: `sh` se inventaría el suyo y perderíamos el del
133
+ // proceso, que es donde están el `adb` y el `node` del usuario.
134
+ const actual = limpio["PATH"];
135
+ limpio["PATH"] = actual === undefined || actual === "" ? binarios.join(":") : [actual, ...binarios].join(":");
136
+ }
137
+ if (opciones.artefactos !== undefined)
138
+ limpio[VARIABLE_DE_ARTEFACTOS] = opciones.artefactos;
139
+ // Después de la copia del entorno heredado, así que lo que resuelve el localizador gana
140
+ // sobre un valor que viniera de fuera: el localizador SÍ ha comprobado que el fichero está.
141
+ Object.assign(limpio, opciones.android ?? {});
142
+ return limpio;
143
+ }
144
+ //# sourceMappingURL=shellDeAgente.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellDeAgente.js","sourceRoot":"","sources":["../../src/core/shellDeAgente.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Una skill: el `SKILL.md` que el agente carga bajo demanda, y de quién es.
3
+ *
4
+ * **Este módulo es PURO.** Quién lee el disco es `agent/grafo/skills.ts`; quién las monta
5
+ * para el agente, `agent/grafo/proyecto.ts#backendConSkills`. Aquí solo vive el formato del
6
+ * fichero y la regla de qué nombre vale — las dos cosas que la ventana de Ajustes, el
7
+ * cargador y los tests tienen que entender igual.
8
+ *
9
+ * **Tres orígenes y no dos**, con la misma precedencia que los subagentes y los modelos:
10
+ *
11
+ * | origen | dónde | quién la escribe |
12
+ * |---|---|---|
13
+ * | `serie` | la carpeta `skills/` del PAQUETE | xonecode, y no se toca desde la consola |
14
+ * | `global` | `~/.xonecode/skills/` | el usuario, para todos sus proyectos |
15
+ * | `proyecto` | `<raiz>/.xonecode/skills/` | el usuario, solo para ese proyecto |
16
+ *
17
+ * Las de serie son de SOLO LECTURA y no se borran ni se editan: viven dentro del paquete
18
+ * instalado, así que una edición se la llevaría por delante el siguiente `npm install` sin
19
+ * decir nada. Lo que sí se puede es COPIARLA a las tuyas y cambiarla ahí, que además deja
20
+ * ver de dónde salió. Por eso no hay `.semilla.json` como en los subagentes: nada nuestro
21
+ * se copia nunca a la casa del usuario, así que no hay marca que llevar ni nada que
22
+ * restaurar.
23
+ *
24
+ * El `SKILL.md` es el formato de Claude Code, y eso no es una coincidencia que convenga
25
+ * mantener: es lo que hace que una skill escrita para otro harness se lea aquí tal cual, y
26
+ * que `SkillsMiddleware` de deepagents —que es quien las descubre de verdad— la encuentre
27
+ * sin que xonecode traduzca nada.
28
+ */
29
+ import { motivoDeNombreInaceptable, nombreSugerido } from "./agentes.js";
30
+ /** 4 caracteres por token, la regla de servilleta de siempre. */
31
+ export const tokensDeSkill = (texto) => Math.ceil(texto.length / 4);
32
+ /**
33
+ * El nombre de una skill es un SEGMENTO DE RUTA —la carpeta donde vive— y también lo que el
34
+ * subagente declara en su `.md`, así que vale la MISMA regla que la de un subagente y por la
35
+ * misma razón: `motivoDeNombreInaceptable` (`core/agentes.ts`). No se escribe una segunda
36
+ * aquí porque dos reglas para el mismo tipo de nombre es donde divergen.
37
+ */
38
+ export const motivoDeNombreDeSkillInaceptable = motivoDeNombreInaceptable;
39
+ export const nombreDeSkillSugerido = nombreSugerido;
40
+ /** El texto que sale del frontmatter cuando un campo lleva caracteres que lo romperían. */
41
+ const enUnaLinea = (texto) => texto.replace(/\r?\n/g, " ").trim();
42
+ /** ¿Esta línea abre la clave `clave` en el primer nivel del frontmatter? */
43
+ const abreClave = (linea, clave) => linea.startsWith(`${clave}:`) && !linea.startsWith(" ") && !linea.startsWith("\t");
44
+ /**
45
+ * Compone el `SKILL.md`.
46
+ *
47
+ * El frontmatter es el mínimo que `parseFrontmatter` (`vendor/skillLoaders/catalog.ts`) y
48
+ * deepagents leen: `name` y `description`, una línea cada uno. La descripción se aplana a
49
+ * una línea porque ahí un salto la partiría en dos claves y la segunda mitad se perdería en
50
+ * silencio — el mismo motivo por el que el nombre es un slug.
51
+ *
52
+ * **Y lo demás del frontmatter se CONSERVA**: las claves que no son `name` ni `description`
53
+ * se reescriben tal cual, en su orden. Componer uno nuevo desde cero le borraba a una skill
54
+ * escrita a mano su `license`, su `allowed-tools` o su bloque `metadata` en cuanto alguien
55
+ * abriera la ventana y pulsara Guardar — sin error, sin aviso y sobre un fichero suyo. Las
56
+ * líneas INDENTADAS van con la clave que las abre, que es lo que deja pasar un bloque
57
+ * anidado entero sin entender YAML.
58
+ */
59
+ export function escribirSkill(skill) {
60
+ const cuerpo = skill.cuerpo.replace(/^\n+/, "");
61
+ const resto = [];
62
+ let saltando = false;
63
+ for (const linea of (skill.frontmatter ?? "").split("\n")) {
64
+ if (abreClave(linea, "name") || abreClave(linea, "description")) {
65
+ saltando = true;
66
+ continue;
67
+ }
68
+ // Una línea indentada pertenece a la clave de arriba: si se estaba saltando, se salta.
69
+ const indentada = /^[ \t]/.test(linea);
70
+ if (saltando && indentada)
71
+ continue;
72
+ saltando = false;
73
+ if (linea.trim() !== "")
74
+ resto.push(linea);
75
+ }
76
+ const extra = resto.length === 0 ? "" : `${resto.join("\n")}\n`;
77
+ return `---\nname: ${skill.nombre}\ndescription: ${enUnaLinea(skill.descripcion)}\n${extra}---\n\n${cuerpo}`;
78
+ }
79
+ /**
80
+ * Lee un `SKILL.md`.
81
+ *
82
+ * **El nombre sale de la CARPETA, no del frontmatter**, exactamente como el de un subagente
83
+ * sale del fichero: es lo que la hace direccionable (`/skills/<nombre>/`) y lo que el
84
+ * subagente declara. Un `name:` que diga otra cosa se ignora — mandaría sobre una ruta que
85
+ * ya está decidida, y entonces `rutasDeSkills` apuntaría a una carpeta que no existe.
86
+ *
87
+ * **Sin `description` no se carga.** Es lo que el modelo lee para decidir si esta skill le
88
+ * sirve: sin ella, la skill está en el catálogo y no la usa nadie nunca, que es peor que no
89
+ * estar. Misma regla que la `descripcion` de un subagente.
90
+ */
91
+ export function leerSkill(texto, nombreDeCarpeta, origen, ficheros = []) {
92
+ const { descripcion, frontmatter, cuerpo } = partirFrontmatter(texto);
93
+ if (descripcion === "")
94
+ return { error: "no tiene `description` en el frontmatter" };
95
+ return {
96
+ skill: {
97
+ nombre: nombreDeCarpeta,
98
+ descripcion,
99
+ cuerpo,
100
+ frontmatter,
101
+ origen,
102
+ tokens: tokensDeSkill(texto),
103
+ ficheros,
104
+ },
105
+ };
106
+ }
107
+ /**
108
+ * El frontmatter mínimo, sin traer un parser de YAML.
109
+ *
110
+ * Es el mismo criterio que `core/agentes.ts` y que `vendor/skillLoaders/catalog.ts`: la
111
+ * superficie es `clave: valor` de una línea entre `---`, y un parser entero sería una
112
+ * dependencia para leer dos campos. Lo que no se entiende no se inventa: sin frontmatter,
113
+ * el fichero entero es cuerpo y la descripción sale vacía, que es lo que `leerSkill`
114
+ * rechaza.
115
+ */
116
+ function partirFrontmatter(texto) {
117
+ if (!texto.startsWith("---"))
118
+ return { descripcion: "", frontmatter: "", cuerpo: texto };
119
+ const fin = texto.indexOf("\n---", 3);
120
+ if (fin === -1)
121
+ return { descripcion: "", frontmatter: "", cuerpo: texto };
122
+ // El bloque entero, tal cual, sin los `---` ni el salto que los sigue. Es lo que se enseña
123
+ // y lo que se conserva al guardar: recomponerlo de las claves que entendemos tiraría las
124
+ // que no.
125
+ const frontmatter = texto.slice(3, fin).replace(/^\n/, "");
126
+ let descripcion = "";
127
+ for (const linea of frontmatter.split("\n")) {
128
+ const i = linea.indexOf(":");
129
+ if (i === -1)
130
+ continue;
131
+ if (linea.slice(0, i).trim() === "description")
132
+ descripcion = linea.slice(i + 1).trim();
133
+ }
134
+ const salto = texto.indexOf("\n", fin + 1);
135
+ return {
136
+ descripcion,
137
+ frontmatter,
138
+ cuerpo: salto === -1 ? "" : texto.slice(salto + 1).replace(/^\n+/, ""),
139
+ };
140
+ }
141
+ /**
142
+ * Funde las listas por nombre: la ÚLTIMA gana.
143
+ *
144
+ * Se llama con `serie`, `global`, `proyecto` en ese orden, así que una skill del proyecto
145
+ * tapa a la global del mismo nombre y las dos tapan a la de serie — la misma precedencia
146
+ * que los subagentes y que los modelos, y por lo mismo: lo particular manda sobre lo
147
+ * general. Que una tape a otra NO es un problema que reportar: es la forma de afinar una
148
+ * skill nuestra sin editarla donde el `npm install` la pisaría. Quien lo dice es la ficha,
149
+ * con su origen al lado.
150
+ */
151
+ export function fusionarSkills(...listas) {
152
+ const porNombre = new Map();
153
+ for (const lista of listas)
154
+ for (const skill of lista)
155
+ porNombre.set(skill.nombre, skill);
156
+ return [...porNombre.values()].sort((a, b) => a.nombre.localeCompare(b.nombre));
157
+ }
158
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Lo que se le dice a quien delegó cuando a un especialista se le acabó el presupuesto.
3
+ *
4
+ * ## El fallo que cierra, medido el 19-09-2026
5
+ *
6
+ * Cada especialista corre con un tope de llamadas al modelo
7
+ * (`TOPE_DE_LLAMADAS_DEL_ESPECIALISTA`, con `exitBehavior: "end"`). Al agotarse, la librería
8
+ * añade un `AIMessage` con SU texto —«Model call limits exceeded: run level call limit reached
9
+ * with 15 model calls»— y salta al final. Y el `task` de deepagents devuelve **solo el último
10
+ * mensaje** (`extractLastMessage`).
11
+ *
12
+ * O sea que lo que el orquestador recibe como respuesta del especialista es esa frase, en
13
+ * inglés y en jerga del harness, **y todo lo que el especialista averiguó en sus quince
14
+ * llamadas se tira**. Medido: 100-160k de entrada por especialista, y menos de 900 tokens de
15
+ * salida devueltos. Por eso el orquestador encadena al siguiente: no es que enrute mal, es que
16
+ * no recibe nada con lo que seguir.
17
+ *
18
+ * **Por eso el tope es NUESTRO** (`topeDeLlamadas`) en vez de parchear el de la librería: sus
19
+ * dos ganchos de salida —el mensaje y el reset del contador— van detrás de un `jumpTo: "end"`
20
+ * que cortocircuita todo lo que haya debajo, así que **no corre NINGÚN middleware posterior**
21
+ * (medido contra la librería real, con `FakeToolCallingModel` y `runLimit: 0`). No había dónde
22
+ * engancharse: ni `afterAgent`, ni otro `beforeModel`. Reconocer su frase en inglés para
23
+ * sustituirla habría atado esto a un texto suyo, y encima sin sitio donde hacerlo.
24
+ *
25
+ * Esto NO sube el tope —que está medido y argumentado— ni lo quita. Hace tres cosas:
26
+ * devuelve el trabajo que se iba a tirar, lo marca como PARCIAL para que nadie lo lea como una
27
+ * conclusión, y dice qué hacer a continuación. Que un presupuesto se agote es normal; que se
28
+ * agote **en silencio** es el fallo.
29
+ *
30
+ * Puro y en `core/`: el texto se puede probar sin librería ni modelo. Quién lo mete en la
31
+ * conversación es de `agent/`.
32
+ */
33
+ /**
34
+ * Cuánto del trabajo parcial se devuelve.
35
+ *
36
+ * Hay tope porque esto viaja como respuesta de una `task` y entra ENTERO en el contexto del
37
+ * orquestador: devolver sin límite convertiría el arreglo de un gasto en otro gasto. Lo que no
38
+ * cabe se dice, como en todas partes aquí.
39
+ */
40
+ export const TOPE_DE_PARCIAL = 4_000;
41
+ /**
42
+ * El mensaje que sustituye al de la librería.
43
+ *
44
+ * **Habla con voz del harness y en primera persona del especialista**, porque quien lo va a
45
+ * leer es el orquestador y lo va a leer como la respuesta de aquél. Y dice las tres cosas que
46
+ * la frase de la librería no dice: que está a medias, qué había, y qué NO hacer — volver a
47
+ * encargarle lo mismo a otro es exactamente lo que se midió que pasa.
48
+ */
49
+ export function mensajeDeTopeAgotado({ limite, parcial }) {
50
+ const hay = parcial !== undefined && parcial.trim() !== "";
51
+ const recortado = hay && parcial.length > TOPE_DE_PARCIAL;
52
+ return [
53
+ `[harness] Me he quedado sin presupuesto: ${limite} llamadas al modelo, y NO he terminado.`,
54
+ "",
55
+ ...(hay
56
+ ? [
57
+ "Esto es lo último que tenía, y es PARCIAL — no es una conclusión:",
58
+ "",
59
+ recortado ? `${parcial.slice(0, TOPE_DE_PARCIAL)}…` : parcial,
60
+ ...(recortado ? ["", `(recortado: había ${parcial.length} caracteres)`] : []),
61
+ ]
62
+ : ["No llegué a dejar nada en claro: se me fue el presupuesto antes."]),
63
+ "",
64
+ "NO se lo encargues igual a otro especialista: gastará su presupuesto en volver a averiguar",
65
+ "lo mismo. O le pasas lo de arriba en el bloque `HANDOFF DE ANÁLISIS`, o parte el encargo en",
66
+ "uno más pequeño.",
67
+ ].join("\n");
68
+ }
69
+ //# sourceMappingURL=topeAgotado.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topeAgotado.js","sourceRoot":"","sources":["../../src/core/topeAgotado.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;AASrC;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAe;IACnE,MAAM,GAAG,GAAG,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IAC3D,MAAM,SAAS,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,GAAG,eAAe,CAAC;IAC1D,OAAO;QACL,4CAA4C,MAAM,yCAAyC;QAC3F,EAAE;QACF,GAAG,CAAC,GAAG;YACL,CAAC,CAAC;gBACE,mEAAmE;gBACnE,EAAE;gBACF,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO;gBAC7D,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,qBAAqB,OAAO,CAAC,MAAM,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9E;YACH,CAAC,CAAC,CAAC,kEAAkE,CAAC,CAAC;QACzE,EAAE;QACF,4FAA4F;QAC5F,6FAA6F;QAC7F,kBAAkB;KACnB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}