xonecode 0.3.0 → 0.5.1

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 (408) hide show
  1. package/README.md +50 -8
  2. package/THIRD_PARTY_NOTICES.md +160 -0
  3. package/apps/web/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  4. package/apps/web/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  5. package/apps/web/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  6. package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  7. package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  8. package/apps/web/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  9. package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  10. package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  11. package/apps/web/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  12. package/apps/web/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  13. package/apps/web/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  14. package/apps/web/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  15. package/apps/web/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  16. package/apps/web/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  17. package/apps/web/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  18. package/apps/web/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  19. package/apps/web/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  20. package/apps/web/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  21. package/apps/web/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  22. package/apps/web/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  23. package/apps/web/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  24. package/apps/web/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  25. package/apps/web/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  26. package/apps/web/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  27. package/apps/web/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  28. package/apps/web/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  29. package/apps/web/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  30. package/apps/web/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  31. package/apps/web/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  32. package/apps/web/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  33. package/apps/web/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  34. package/apps/web/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  35. package/apps/web/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  36. package/apps/web/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  37. package/apps/web/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  38. package/apps/web/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  39. package/apps/web/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  40. package/apps/web/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  41. package/apps/web/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  42. package/apps/web/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  43. package/apps/web/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  44. package/apps/web/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  45. package/apps/web/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  46. package/apps/web/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  47. package/apps/web/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  48. package/apps/web/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  49. package/apps/web/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  50. package/apps/web/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  51. package/apps/web/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  52. package/apps/web/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  53. package/apps/web/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  54. package/apps/web/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  55. package/apps/web/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  56. package/apps/web/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  57. package/apps/web/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  58. package/apps/web/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  59. package/apps/web/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  60. package/apps/web/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  61. package/apps/web/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  62. package/apps/web/dist/assets/c-BIGW1oBm.js +1 -0
  63. package/apps/web/dist/assets/cpp-DddhVWhK.js +1 -0
  64. package/apps/web/dist/assets/csharp-DSvCPggb.js +1 -0
  65. package/apps/web/dist/assets/css-CLj8gQPS.js +1 -0
  66. package/apps/web/dist/assets/go-C27-OAKa.js +1 -0
  67. package/apps/web/dist/assets/html-CfGypltT.js +1 -0
  68. package/apps/web/dist/assets/index-BB3SamhR.css +1 -0
  69. package/apps/web/dist/assets/index-CFYAoHdw.js +477 -0
  70. package/apps/web/dist/assets/ini-BEwlwnbL.js +1 -0
  71. package/apps/web/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  72. package/apps/web/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  73. package/apps/web/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  74. package/apps/web/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  75. package/apps/web/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  76. package/apps/web/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  77. package/apps/web/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  78. package/apps/web/dist/assets/java-CylS5w8V.js +1 -0
  79. package/apps/web/dist/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  80. package/apps/web/dist/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  81. package/apps/web/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  82. package/apps/web/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  83. package/apps/web/dist/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  84. package/apps/web/dist/assets/kotlin-BdnUsdx6.js +1 -0
  85. package/apps/web/dist/assets/less-B1dDrJ26.js +1 -0
  86. package/apps/web/dist/assets/lua-BaeVxFsk.js +1 -0
  87. package/apps/web/dist/assets/markdown-Cvjx9yec.js +1 -0
  88. package/apps/web/dist/assets/mdx-Cmh6b_Ma.js +1 -0
  89. package/apps/web/dist/assets/php-D_2--9WK.js +1 -0
  90. package/apps/web/dist/assets/python-B6aJPvgy.js +1 -0
  91. package/apps/web/dist/assets/ruby-DSHSDbk1.js +1 -0
  92. package/apps/web/dist/assets/rust-B1yitclQ.js +1 -0
  93. package/apps/web/dist/assets/scss-D5BDwBP9.js +1 -0
  94. package/apps/web/dist/assets/sql-CRqJ_cUM.js +1 -0
  95. package/apps/web/dist/assets/swift-C2oV4EkX.js +1 -0
  96. package/apps/web/dist/assets/toml-vGWfd6FD.js +1 -0
  97. package/apps/web/dist/assets/xml-sdJ4AIDG.js +1 -0
  98. package/apps/web/dist/assets/yaml-Buea-lGh.js +1 -0
  99. package/apps/web/dist/iconos/xonecode.png +0 -0
  100. package/apps/web/dist/index.html +20 -0
  101. package/dist/agent/agentesEnDisco.js +539 -0
  102. package/dist/agent/agentesEnDisco.js.map +1 -0
  103. package/dist/agent/arbolDeProyecto.js +245 -0
  104. package/dist/agent/arbolDeProyecto.js.map +1 -0
  105. package/dist/agent/artefactosEnDisco.js +139 -0
  106. package/dist/agent/artefactosEnDisco.js.map +1 -0
  107. package/dist/agent/aumentador.js +175 -0
  108. package/dist/agent/aumentador.js.map +1 -0
  109. package/dist/agent/authEnDisco.js +76 -1
  110. package/dist/agent/authEnDisco.js.map +1 -1
  111. package/dist/agent/busquedaRegex.js +92 -0
  112. package/dist/agent/busquedaRegex.js.map +1 -0
  113. package/dist/agent/catalogoModelos.js +345 -0
  114. package/dist/agent/catalogoModelos.js.map +1 -0
  115. package/dist/agent/checkpointer.js +127 -0
  116. package/dist/agent/checkpointer.js.map +1 -0
  117. package/dist/agent/cloudstudioClient.js +194 -0
  118. package/dist/agent/cloudstudioClient.js.map +1 -0
  119. package/dist/agent/cloudstudioMcp.js +722 -0
  120. package/dist/agent/cloudstudioMcp.js.map +1 -0
  121. package/dist/agent/configEnDisco.js +309 -11
  122. package/dist/agent/configEnDisco.js.map +1 -1
  123. package/dist/agent/consumoExterno.js +99 -0
  124. package/dist/agent/consumoExterno.js.map +1 -0
  125. package/dist/agent/descarga.js +149 -0
  126. package/dist/agent/descarga.js.map +1 -0
  127. package/dist/agent/diagnosticoDeTools.js +51 -0
  128. package/dist/agent/diagnosticoDeTools.js.map +1 -0
  129. package/dist/agent/dispositivosEnMaquina.js +596 -0
  130. package/dist/agent/dispositivosEnMaquina.js.map +1 -0
  131. package/dist/agent/escrituraDeCodex.js +134 -0
  132. package/dist/agent/escrituraDeCodex.js.map +1 -0
  133. package/dist/agent/escrituraDeOpencode.js +80 -0
  134. package/dist/agent/escrituraDeOpencode.js.map +1 -0
  135. package/dist/agent/escrituraExterna.js +742 -0
  136. package/dist/agent/escrituraExterna.js.map +1 -0
  137. package/dist/agent/gemini.js +81 -0
  138. package/dist/agent/gemini.js.map +1 -0
  139. package/dist/agent/git.js +83 -0
  140. package/dist/agent/git.js.map +1 -0
  141. package/dist/agent/gitSync.js +441 -0
  142. package/dist/agent/gitSync.js.map +1 -0
  143. package/dist/agent/hotswap.js +448 -0
  144. package/dist/agent/hotswap.js.map +1 -0
  145. package/dist/agent/instalacionEnMaquina.js +252 -0
  146. package/dist/agent/instalacionEnMaquina.js.map +1 -0
  147. package/dist/agent/instantanea.js +7 -10
  148. package/dist/agent/instantanea.js.map +1 -1
  149. package/dist/agent/interrupts.js +11 -2
  150. package/dist/agent/interrupts.js.map +1 -1
  151. package/dist/agent/juezDeTarea.js +345 -0
  152. package/dist/agent/juezDeTarea.js.map +1 -0
  153. package/dist/agent/lanzamientoEnMaquina.js +377 -0
  154. package/dist/agent/lanzamientoEnMaquina.js.map +1 -0
  155. package/dist/agent/manifiesto.js +59 -0
  156. package/dist/agent/manifiesto.js.map +1 -0
  157. package/dist/agent/memoriaDeProyecto.js +60 -0
  158. package/dist/agent/memoriaDeProyecto.js.map +1 -0
  159. package/dist/agent/modelos.js +105 -17
  160. package/dist/agent/modelos.js.map +1 -1
  161. package/dist/agent/modelosDeMotor.js +204 -0
  162. package/dist/agent/modelosDeMotor.js.map +1 -0
  163. package/dist/agent/paqueteDelProyecto.js +181 -0
  164. package/dist/agent/paqueteDelProyecto.js.map +1 -0
  165. package/dist/agent/perfiles.js +92 -31
  166. package/dist/agent/perfiles.js.map +1 -1
  167. package/dist/agent/persona.js +40 -0
  168. package/dist/agent/persona.js.map +1 -0
  169. package/dist/agent/procesosEnMaquina.js +204 -0
  170. package/dist/agent/procesosEnMaquina.js.map +1 -0
  171. package/dist/agent/proyecto.js +311 -13
  172. package/dist/agent/proyecto.js.map +1 -1
  173. package/dist/agent/puente.js +63 -6
  174. package/dist/agent/puente.js.map +1 -1
  175. package/dist/agent/resumenDeContexto.js +30 -0
  176. package/dist/agent/resumenDeContexto.js.map +1 -0
  177. package/dist/agent/resumenDeTool.js +64 -18
  178. package/dist/agent/resumenDeTool.js.map +1 -1
  179. package/dist/agent/sesionGit.js +481 -0
  180. package/dist/agent/sesionGit.js.map +1 -0
  181. package/dist/agent/settingsEnDisco.js +189 -0
  182. package/dist/agent/settingsEnDisco.js.map +1 -0
  183. package/dist/agent/subagenteCodex.js +368 -0
  184. package/dist/agent/subagenteCodex.js.map +1 -0
  185. package/dist/agent/subagenteExterno.js +423 -0
  186. package/dist/agent/subagenteExterno.js.map +1 -0
  187. package/dist/agent/subagenteOpencode.js +389 -0
  188. package/dist/agent/subagenteOpencode.js.map +1 -0
  189. package/dist/agent/subida.js +202 -0
  190. package/dist/agent/subida.js.map +1 -0
  191. package/dist/agent/tareasEnDisco.js +466 -0
  192. package/dist/agent/tareasEnDisco.js.map +1 -0
  193. package/dist/agent/turnoReal.js +663 -50
  194. package/dist/agent/turnoReal.js.map +1 -1
  195. package/dist/agent/versionEnDisco.js +48 -0
  196. package/dist/agent/versionEnDisco.js.map +1 -0
  197. package/dist/agent/xoneAgent.js +290 -49
  198. package/dist/agent/xoneAgent.js.map +1 -1
  199. package/dist/agent/zip.js +52 -0
  200. package/dist/agent/zip.js.map +1 -0
  201. package/dist/cli/acuseDeModelo.js +30 -0
  202. package/dist/cli/acuseDeModelo.js.map +1 -0
  203. package/dist/cli/aprobar.js +55 -2
  204. package/dist/cli/aprobar.js.map +1 -1
  205. package/dist/cli/config.js +9 -13
  206. package/dist/cli/config.js.map +1 -1
  207. package/dist/cli/consola.js +750 -19
  208. package/dist/cli/consola.js.map +1 -1
  209. package/dist/cli/main.js +740 -81
  210. package/dist/cli/main.js.map +1 -1
  211. package/dist/cli/markdown.js +188 -2
  212. package/dist/cli/markdown.js.map +1 -1
  213. package/dist/cli/run.js +32 -4
  214. package/dist/cli/run.js.map +1 -1
  215. package/dist/cli/stdio.js +46 -19
  216. package/dist/cli/stdio.js.map +1 -1
  217. package/dist/cli/tema.js +96 -8
  218. package/dist/cli/tema.js.map +1 -1
  219. package/dist/cli/tokens.js +29 -0
  220. package/dist/cli/tokens.js.map +1 -0
  221. package/dist/cli/tui/app.js +171 -0
  222. package/dist/cli/tui/app.js.map +1 -0
  223. package/dist/cli/tui/aprobarTui.js +80 -0
  224. package/dist/cli/tui/aprobarTui.js.map +1 -0
  225. package/dist/cli/tui/barra.js +37 -0
  226. package/dist/cli/tui/barra.js.map +1 -0
  227. package/dist/cli/tui/correrTui.js +478 -0
  228. package/dist/cli/tui/correrTui.js.map +1 -0
  229. package/dist/cli/tui/entrada.js +166 -0
  230. package/dist/cli/tui/entrada.js.map +1 -0
  231. package/dist/cli/tui/filas.js +24 -0
  232. package/dist/cli/tui/filas.js.map +1 -0
  233. package/dist/cli/tui/logo.js +49 -0
  234. package/dist/cli/tui/logo.js.map +1 -0
  235. package/dist/cli/tui/pielTui.js +14 -0
  236. package/dist/cli/tui/pielTui.js.map +1 -0
  237. package/dist/cli/tui/raton.js +126 -0
  238. package/dist/cli/tui/raton.js.map +1 -0
  239. package/dist/cli/tui/sidebar.js +86 -0
  240. package/dist/cli/tui/sidebar.js.map +1 -0
  241. package/dist/cli/tui/store.js +143 -0
  242. package/dist/cli/tui/store.js.map +1 -0
  243. package/dist/cli/tui/tarjeta.js +19 -0
  244. package/dist/cli/tui/tarjeta.js.map +1 -0
  245. package/dist/cli/tui/temaInk.js +114 -0
  246. package/dist/cli/tui/temaInk.js.map +1 -0
  247. package/dist/cli/tui/transcript.js +254 -0
  248. package/dist/cli/tui/transcript.js.map +1 -0
  249. package/dist/cli/wizardInicial.js +240 -0
  250. package/dist/cli/wizardInicial.js.map +1 -0
  251. package/dist/core/actos.js +113 -0
  252. package/dist/core/actos.js.map +1 -0
  253. package/dist/core/adjuntos.js +97 -0
  254. package/dist/core/adjuntos.js.map +1 -0
  255. package/dist/core/agentes.js +227 -0
  256. package/dist/core/agentes.js.map +1 -0
  257. package/dist/core/artefactos.js +149 -0
  258. package/dist/core/artefactos.js.map +1 -0
  259. package/dist/core/cloudstudio.js +7 -0
  260. package/dist/core/cloudstudio.js.map +1 -0
  261. package/dist/core/config.js +212 -5
  262. package/dist/core/config.js.map +1 -1
  263. package/dist/core/contextos.js +53 -1
  264. package/dist/core/contextos.js.map +1 -1
  265. package/dist/core/descargas.js +106 -0
  266. package/dist/core/descargas.js.map +1 -0
  267. package/dist/core/descriptoresDeApp.js +279 -0
  268. package/dist/core/descriptoresDeApp.js.map +1 -0
  269. package/dist/core/dispositivos.js +466 -0
  270. package/dist/core/dispositivos.js.map +1 -0
  271. package/dist/core/entrega.js +141 -0
  272. package/dist/core/entrega.js.map +1 -0
  273. package/dist/core/entrelazar.js +90 -0
  274. package/dist/core/entrelazar.js.map +1 -0
  275. package/dist/core/esqueleto.js +10 -0
  276. package/dist/core/esqueleto.js.map +1 -1
  277. package/dist/core/modelos.js +235 -3
  278. package/dist/core/modelos.js.map +1 -1
  279. package/dist/core/notify.js +27 -9
  280. package/dist/core/notify.js.map +1 -1
  281. package/dist/core/planDeSubida.js +127 -0
  282. package/dist/core/planDeSubida.js.map +1 -0
  283. package/dist/core/ports.js +189 -1
  284. package/dist/core/ports.js.map +1 -1
  285. package/dist/core/puedeLanzarse.js +239 -0
  286. package/dist/core/puedeLanzarse.js.map +1 -0
  287. package/dist/core/rutaVirtual.js +42 -0
  288. package/dist/core/rutaVirtual.js.map +1 -0
  289. package/dist/core/settings.js +246 -0
  290. package/dist/core/settings.js.map +1 -0
  291. package/dist/core/tareas.js +230 -0
  292. package/dist/core/tareas.js.map +1 -0
  293. package/dist/core/textos.js +36 -0
  294. package/dist/core/textos.js.map +1 -0
  295. package/dist/core/turno.js +56 -8
  296. package/dist/core/turno.js.map +1 -1
  297. package/dist/core/version.js +31 -0
  298. package/dist/core/version.js.map +1 -0
  299. package/dist/vendor/sqliteSaver.js +389 -0
  300. package/dist/vendor/sqliteSaver.js.map +1 -0
  301. package/dist/vendor/tokenTracking.js +22 -1
  302. package/dist/vendor/tokenTracking.js.map +1 -1
  303. package/dist/web/servidor/arranque.js +3964 -0
  304. package/dist/web/servidor/arranque.js.map +1 -0
  305. package/dist/web/servidor/consolaDeTarea.js +161 -0
  306. package/dist/web/servidor/consolaDeTarea.js.map +1 -0
  307. package/dist/web/servidor/consolaWeb.js +389 -0
  308. package/dist/web/servidor/consolaWeb.js.map +1 -0
  309. package/dist/web/servidor/corredorDeTareas.js +1119 -0
  310. package/dist/web/servidor/corredorDeTareas.js.map +1 -0
  311. package/dist/web/servidor/pielWeb.js +269 -0
  312. package/dist/web/servidor/pielWeb.js.map +1 -0
  313. package/dist/web/servidor/servidor.js +257 -0
  314. package/dist/web/servidor/servidor.js.map +1 -0
  315. package/dist/web/servidor/sesiones.js +440 -0
  316. package/dist/web/servidor/sesiones.js.map +1 -0
  317. package/dist/web/servidor/transporte.js +169 -0
  318. package/dist/web/servidor/transporte.js.map +1 -0
  319. package/dist/web/servidor/vestibulo.js +1276 -0
  320. package/dist/web/servidor/vestibulo.js.map +1 -0
  321. package/package.json +33 -9
  322. package/skills/archify/LICENSE +22 -0
  323. package/skills/archify/SKILL.md +109 -0
  324. package/skills/archify/THIRD_PARTY_NOTICES.md +56 -0
  325. package/skills/archify/assets/template.html +14787 -0
  326. package/skills/archify/bin/archify.mjs +1990 -0
  327. package/skills/archify/bin/open-artifact.mjs +86 -0
  328. package/skills/archify/bin/preview.mjs +648 -0
  329. package/skills/archify/bin/visual-check.mjs +829 -0
  330. package/skills/archify/brand-marks/README.md +31 -0
  331. package/skills/archify/brand-marks/catalog.json +131 -0
  332. package/skills/archify/delta/architecture-delta.mjs +1214 -0
  333. package/skills/archify/examples/agent-run.lifecycle.json +71 -0
  334. package/skills/archify/examples/agent-tool-call.workflow.json +94 -0
  335. package/skills/archify/examples/async-job-roundtrip.sequence.json +61 -0
  336. package/skills/archify/examples/brand-aware-delivery.architecture.json +47 -0
  337. package/skills/archify/examples/cache-miss-request.sequence.json +81 -0
  338. package/skills/archify/examples/checkout-platform.base.architecture.json +31 -0
  339. package/skills/archify/examples/checkout-platform.head.architecture.json +31 -0
  340. package/skills/archify/examples/dataflow-product-analytics.html +14898 -0
  341. package/skills/archify/examples/deployment-release.lifecycle.json +49 -0
  342. package/skills/archify/examples/event-stream.dataflow.json +57 -0
  343. package/skills/archify/examples/incident-response.workflow.json +64 -0
  344. package/skills/archify/examples/lifecycle-agent-run.html +14847 -0
  345. package/skills/archify/examples/product-analytics.dataflow.json +76 -0
  346. package/skills/archify/examples/production-deployment.architecture.json +71 -0
  347. package/skills/archify/examples/release-delivery.workflow.json +62 -0
  348. package/skills/archify/examples/sequence-cache-miss-request.html +14913 -0
  349. package/skills/archify/examples/web-app-rendered.html +14862 -0
  350. package/skills/archify/examples/web-app.architecture.json +46 -0
  351. package/skills/archify/examples/workflow-agent-tool-call-rendered.html +14904 -0
  352. package/skills/archify/migrations/workflow-v2.mjs +279 -0
  353. package/skills/archify/package.json +17 -0
  354. package/skills/archify/recipes/scenarios.mjs +391 -0
  355. package/skills/archify/references/authoring-contract.md +198 -0
  356. package/skills/archify/references/brand-marks.md +69 -0
  357. package/skills/archify/references/delivery-contract.md +116 -0
  358. package/skills/archify/references/viewer-runtime.md +45 -0
  359. package/skills/archify/renderers/architecture/grid.mjs +62 -0
  360. package/skills/archify/renderers/architecture/render-architecture.mjs +1078 -0
  361. package/skills/archify/renderers/dataflow/README.md +104 -0
  362. package/skills/archify/renderers/dataflow/render-dataflow.mjs +483 -0
  363. package/skills/archify/renderers/lifecycle/README.md +115 -0
  364. package/skills/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
  365. package/skills/archify/renderers/sequence/README.md +114 -0
  366. package/skills/archify/renderers/sequence/render-sequence.mjs +453 -0
  367. package/skills/archify/renderers/shared/brand-marks.mjs +563 -0
  368. package/skills/archify/renderers/shared/cli.mjs +218 -0
  369. package/skills/archify/renderers/shared/desktop-readability.mjs +26 -0
  370. package/skills/archify/renderers/shared/diagnostics.mjs +127 -0
  371. package/skills/archify/renderers/shared/engineering-profiles.mjs +157 -0
  372. package/skills/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
  373. package/skills/archify/renderers/shared/generated-validators.mjs +13 -0
  374. package/skills/archify/renderers/shared/geometry.mjs +1423 -0
  375. package/skills/archify/renderers/shared/i18n.mjs +594 -0
  376. package/skills/archify/renderers/shared/layout-report.mjs +40 -0
  377. package/skills/archify/renderers/shared/legend.mjs +217 -0
  378. package/skills/archify/renderers/shared/output-path.mjs +321 -0
  379. package/skills/archify/renderers/shared/repository-evidence.mjs +235 -0
  380. package/skills/archify/renderers/shared/text-fit.mjs +49 -0
  381. package/skills/archify/renderers/shared/utils.mjs +232 -0
  382. package/skills/archify/renderers/shared/validator.mjs +86 -0
  383. package/skills/archify/renderers/workflow/README.md +223 -0
  384. package/skills/archify/renderers/workflow/render-workflow.mjs +35 -0
  385. package/skills/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
  386. package/skills/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
  387. package/skills/archify/schemas/README.md +211 -0
  388. package/skills/archify/schemas/architecture.schema.json +176 -0
  389. package/skills/archify/schemas/common.schema.json +115 -0
  390. package/skills/archify/schemas/dataflow.schema.json +243 -0
  391. package/skills/archify/schemas/lifecycle.schema.json +266 -0
  392. package/skills/archify/schemas/sequence.schema.json +223 -0
  393. package/skills/archify/schemas/workflow.schema.json +428 -0
  394. package/skills/archify/scripts/check-render-output.mjs +835 -0
  395. package/skills/archify/scripts/check-update.mjs +1667 -0
  396. package/skills/archify/scripts/render-examples.mjs +26 -0
  397. package/skills/archify/scripts/update-contract.mjs +182 -0
  398. package/skills/archify/skill-release.json +10 -0
  399. package/skills/artifacts-builder/SKILL.md +120 -0
  400. package/skills/artifacts-builder/reference/diagramas.md +123 -0
  401. package/skills/artifacts-builder/reference/estilo.md +123 -0
  402. package/skills/artifacts-builder/reference/exportar-pdf.md +56 -0
  403. package/skills/artifacts-builder/reference/graficas.md +22 -0
  404. package/skills/artifacts-builder/scripts/bundle_artifact.py +109 -0
  405. package/skills/artifacts-builder/scripts/validate_artifact.py +345 -0
  406. package/skills/xone-hotswap/SKILL.md +185 -0
  407. package/skills/xone-hotswap/references/comandos.md +706 -0
  408. package/skills/xone-hotswap/references/conexion-y-despliegue.md +226 -0
@@ -10,25 +10,35 @@
10
10
  * Los nombres de campo son los de las tools de fichero de deepagents, verificados
11
11
  * contra su dist (`file_path` con `path` normalizado, `pattern` en glob/grep).
12
12
  */
13
- /** El único campo permitido de cada tool. Sin entrada: nada sale. */
14
- const CAMPO_SEGURO = {
15
- read_file: "file_path",
16
- write_file: "file_path",
17
- edit_file: "file_path",
18
- ls: "path",
19
- glob: "pattern",
20
- grep: "pattern",
21
- };
22
13
  /**
23
- * El `detalle` de una llamada, o `undefined` si no hay nada permitido que contar.
14
+ * Campos permitidos por tool. Es una lista blanca deliberada: ni `content`,
15
+ * ni `old_string`/`new_string`, ni la descripción de `task` llegan a disco.
24
16
  *
25
- * Los argumentos llegan como objeto o como cadena JSON (así viajan en las
26
- * `tool_calls`); un JSON roto es una tool rota, no una excepción que tumbe el turno.
17
+ * Los parámetros de paginación y acotación son justo los que necesitamos para
18
+ * detectar una lectura masiva o una búsqueda mal afinada.
27
19
  */
28
- export function detalleDe(nombre, args) {
29
- const campo = CAMPO_SEGURO[nombre];
30
- if (campo === undefined)
31
- return undefined;
20
+ const CAMPOS_SEGUROS = {
21
+ read_file: ["file_path", "offset", "limit"],
22
+ write_file: ["file_path"],
23
+ edit_file: ["file_path"],
24
+ ls: ["path"],
25
+ glob: ["pattern", "path"],
26
+ grep: ["pattern", "path", "glob", "max_count", "output_mode"],
27
+ regex_search: ["pattern", "path", "glob", "flags", "max_count"],
28
+ /**
29
+ * De `task` sale el NOMBRE del especialista y nada más — nunca su `description`, que es
30
+ * el encargo entero y puede llevar contenido del proyecto dentro (por eso la cabecera de
31
+ * este fichero ya la nombraba como el ejemplo de lo que NO sale).
32
+ *
33
+ * El nombre sí puede: es el de un fichero que escribió el usuario, ya se pinta en Ajustes
34
+ * y ya viaja como `origen` en cada petición de aprobación. Y hace falta: medido en la
35
+ * pantalla del usuario, la línea decía «⚙ task» a secas, así que con un motor externo no
36
+ * había NADA en la interfaz que dijera a quién se delegó — y un hijo de Claude Code son
37
+ * minutos en otro proceso, sin una sola tool que cruce.
38
+ */
39
+ task: ["subagent_type"],
40
+ };
41
+ function objetoDeArgs(args) {
32
42
  let objeto = args;
33
43
  if (typeof args === "string") {
34
44
  try {
@@ -38,9 +48,45 @@ export function detalleDe(nombre, args) {
38
48
  return undefined;
39
49
  }
40
50
  }
41
- if (!objeto || typeof objeto !== "object")
51
+ return objeto && typeof objeto === "object" && !Array.isArray(objeto)
52
+ ? objeto
53
+ : undefined;
54
+ }
55
+ /** Argumentos acotados y seguros para la traza opt-in de diagnóstico. */
56
+ export function parametrosDe(nombre, args) {
57
+ const campos = CAMPOS_SEGUROS[nombre];
58
+ const objeto = objetoDeArgs(args);
59
+ if (campos === undefined || objeto === undefined)
60
+ return undefined;
61
+ const salida = {};
62
+ for (const campo of campos) {
63
+ const valor = objeto[campo];
64
+ if (typeof valor === "string" || typeof valor === "number" || typeof valor === "boolean") {
65
+ salida[campo] = valor;
66
+ }
67
+ }
68
+ return Object.keys(salida).length > 0 ? salida : undefined;
69
+ }
70
+ /**
71
+ * El `detalle` de una llamada, o `undefined` si no hay nada permitido que contar.
72
+ *
73
+ * Los argumentos llegan como objeto o como cadena JSON (así viajan en las
74
+ * `tool_calls`); un JSON roto es una tool rota, no una excepción que tumbe el turno.
75
+ */
76
+ export function detalleDe(nombre, args) {
77
+ const parametros = parametrosDe(nombre, args);
78
+ const campo = nombre === "read_file" || nombre === "write_file" || nombre === "edit_file"
79
+ ? "file_path"
80
+ : nombre === "ls"
81
+ ? "path"
82
+ : nombre === "glob" || nombre === "grep" || nombre === "regex_search"
83
+ ? "pattern"
84
+ : nombre === "task"
85
+ ? "subagent_type"
86
+ : undefined;
87
+ if (campo === undefined || parametros === undefined)
42
88
  return undefined;
43
- const valor = objeto[campo];
89
+ const valor = parametros[campo];
44
90
  // Una cadena vacía no describe nada, y un tipo raro (`file_path: 42`) tampoco:
45
91
  // sin detalle es una respuesta válida.
46
92
  return typeof valor === "string" && valor !== "" ? valor : undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"resumenDeTool.js","sourceRoot":"","sources":["../../src/agent/resumenDeTool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,qEAAqE;AACrE,MAAM,YAAY,GAA2B;IAC3C,SAAS,EAAE,WAAW;IACtB,UAAU,EAAE,WAAW;IACvB,SAAS,EAAE,WAAW;IACtB,EAAE,EAAE,MAAM;IACV,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,IAAa;IACrD,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAE1C,IAAI,MAAM,GAAY,IAAI,CAAC;IAC3B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAE5D,MAAM,KAAK,GAAI,MAAkC,CAAC,KAAK,CAAC,CAAC;IACzD,+EAA+E;IAC/E,uCAAuC;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC"}
1
+ {"version":3,"file":"resumenDeTool.js","sourceRoot":"","sources":["../../src/agent/resumenDeTool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,481 @@
1
+ /**
2
+ * Qué ficheros ha tocado UNA sesión, con git y sin molestar al usuario.
3
+ *
4
+ * **Por qué una ref y no un tag** (que es lo primero que se le ocurre a cualquiera): un tag
5
+ * es una referencia PÚBLICA y con significado —una versión— que aparece en `git tag`, viaja
6
+ * con `push --tags` y la ve todo el equipo. Una sesión de trabajo no es una versión de nada.
7
+ * Aquí se usa `refs/xonecode/sesion/<id>`: fuera de `refs/heads` y de `refs/tags`, así que
8
+ * ni sale en `git branch`/`git tag` ni se empuja por omisión — la misma familia de truco que
9
+ * ya usa la sincronización con `refs/remotes/cloudstudio/<rama>`, donde la REF es el libro
10
+ * de cuentas y no un fichero nuestro.
11
+ *
12
+ * **Y por qué una ref y no guardar el sha en un JSON**: un árbol al que no apunta ninguna
13
+ * referencia es basura para git, y `git gc` lo borra. El día que eso pasara, la vista de la
14
+ * sesión se quedaría sin el «antes» y no habría forma de saber por qué. La ref es lo que lo
15
+ * mantiene vivo.
16
+ *
17
+ * La comparación es de ÁRBOL contra ÁRBOL, no contra el índice del usuario: se escribe un
18
+ * árbol nuevo con `add -A` sobre un índice PRIVADO (`indicePrivado`, en `tmpdir`) igual que
19
+ * `instantanea.ts`. Medido: `git diff <arbol> -- .` a secas compara contra el índice real, y
20
+ * como en él no hay nada, daba «borrado» para ficheros que están ahí delante.
21
+ */
22
+ import { execFile } from "node:child_process";
23
+ import { promisify } from "node:util";
24
+ import { claseDeCambio, indicePrivado, sacarXonecodeDelIndice } from "./git.js";
25
+ const ejecutar = promisify(execFile);
26
+ /**
27
+ * El nombre de la ref de una sesión. El id se cuela en un nombre de referencia, así que se
28
+ * acota a lo que git admite sin ambigüedad —letras, cifras, guion, guion bajo y punto— en
29
+ * vez de confiar en que quien llama traiga algo limpio: un id con `..`, con un espacio o
30
+ * empezando por guion no da un error claro, da un `update-ref` que falla raro o, peor, otra
31
+ * ref.
32
+ */
33
+ export function refDeSesion(id) {
34
+ if (!idAceptable(id))
35
+ return undefined;
36
+ return `refs/xonecode/sesion/${id}`;
37
+ }
38
+ /** La misma criba para la ref y para el sello: los dos meten el id en un argumento de git. */
39
+ function idAceptable(id) {
40
+ return /^[A-Za-z0-9._-]+$/.test(id) && !id.startsWith("-") && !id.includes("..");
41
+ }
42
+ /**
43
+ * La clave del sello que `commitDeTurno` escribe en el mensaje y que esta vista lee.
44
+ *
45
+ * Es un TRAILER y no el asunto: el asunto lleva el título de la sesión, que no identifica
46
+ * nada —dos sesiones se llaman «Hola» en el proyecto del usuario ahora mismo— y que además
47
+ * cambia si alguien la renombra. El id sí es estable, y un trailer es el sitio que git tiene
48
+ * para esto: se lee con `%(trailers:key=…)` sin adivinar formato.
49
+ *
50
+ * Vive en este módulo, que es el que lo GREPEA, y `gitSync.ts` lo importa para escribirlo:
51
+ * con el formato en los dos lados, un cambio en uno rompe la atribución del otro en silencio.
52
+ */
53
+ export const CLAVE_DE_SELLO = "Xonecode-Sesion";
54
+ /** El sello de una sesión, listo para pegar al final de un mensaje de commit. */
55
+ export function selloDeSesion(id) {
56
+ return idAceptable(id) ? `${CLAVE_DE_SELLO}: ${id}` : undefined;
57
+ }
58
+ /**
59
+ * Los commits de una sesión, del más VIEJO al más nuevo, y opcionalmente solo los que tocan
60
+ * una ruta.
61
+ *
62
+ * Dos cosas que no son opcionales:
63
+ * - **`--fixed-strings`**: `--grep` es una expresión regular por omisión, y un id lleva
64
+ * puntos y guiones. Aquí no hay daño posible con un uuid, pero el id llega de fuera de
65
+ * esta función.
66
+ * - **Y el `--grep` NO decide: verifica el TRAILER.** Un grep de texto casa por SUBCADENA,
67
+ * así que el id `abc` casaría con el sello de `abc1` — o con un id citado dentro del
68
+ * cuerpo del mensaje. Se pide el valor del trailer con `%(trailers:key=…,valueonly)` y se
69
+ * compara ENTERO. Es exactamente la misatribución silenciosa que esto viene a quitar.
70
+ */
71
+ async function commitsDeSesion(raiz, id, ruta) {
72
+ const sello = selloDeSesion(id);
73
+ if (sello === undefined)
74
+ return [];
75
+ // Un repo recién creado no tiene `HEAD`, y ahí `git log` FALLA en vez de no decir nada
76
+ // (medido: es el caso de un proyecto offline al que nadie ha commiteado todavía, y hacía
77
+ // que `parcheDeSesion` devolviera «no hay parche» con el fichero delante). Para esta
78
+ // pregunta las dos cosas son lo mismo: no hay ningún commit sellado.
79
+ let stdout;
80
+ try {
81
+ ({ stdout } = await ejecutar("git", [
82
+ "log",
83
+ "--reverse",
84
+ "--no-merges",
85
+ // La coma como separador porque el de omisión es un salto de línea, que partiría
86
+ // las filas de esta salida. Un id no puede llevar comas (`idAceptable`).
87
+ `--format=%H%x09%(trailers:key=${CLAVE_DE_SELLO},valueonly,separator=%x2C)`,
88
+ "--fixed-strings",
89
+ `--grep=${sello}`,
90
+ "HEAD",
91
+ ...(ruta === undefined ? [] : ["--", ruta]),
92
+ ], { cwd: raiz, maxBuffer: 8 * 1024 * 1024 }));
93
+ }
94
+ catch {
95
+ return [];
96
+ }
97
+ const commits = [];
98
+ for (const linea of stdout.split("\n")) {
99
+ const [sha, valores] = linea.split("\t");
100
+ if (sha === undefined || sha === "" || valores === undefined)
101
+ continue;
102
+ if (valores.split(",").some((v) => v.trim() === id))
103
+ commits.push(sha);
104
+ }
105
+ return commits;
106
+ }
107
+ /**
108
+ * La clase NETA de un fichero al que la sesión tocó en varios commits, de la primera vez a
109
+ * la última. Pura y aparte porque es una decisión, no un detalle del bucle:
110
+ *
111
+ * - creado y luego borrado por la misma sesión → **nada**: no estaba antes y no está ahora,
112
+ * así que una fila de «borrado» afirmaría que la sesión borró algo que nunca existió.
113
+ * - lo último es un borrado → borrado.
114
+ * - lo primero es un alta → nuevo (aunque después lo modificara).
115
+ * - en cualquier otro caso → modificado.
116
+ */
117
+ export function claseNeta(primera, ultima) {
118
+ if (primera === "nuevo" && ultima === "borrado")
119
+ return undefined;
120
+ if (ultima === "borrado")
121
+ return "borrado";
122
+ if (primera === "nuevo")
123
+ return "nuevo";
124
+ return "modificado";
125
+ }
126
+ /**
127
+ * Lo que NO cuenta como trabajo de la sesión, en la forma de pathspec de git.
128
+ *
129
+ * `.xonecode/` es nuestro: ahí dentro está el `.jsonl` de la propia sesión, que `volcar()`
130
+ * escribe al final de CADA turno (`web/servidor/vestibulo.ts`). Sin excluirlo, la primera
131
+ * fila de la lista sería el transcript de la sesión diciendo que la sesión lo modificó —un
132
+ * bucle, y encima el fichero que menos interesa. Es la misma regla que ya aplica
133
+ * `arbolLimpio` (`agent/gitSync.ts`), y por el mismo motivo: `.xonecode` es interno, no
134
+ * trabajo del usuario. Se paga que la memoria del proyecto (`.xonecode/memoria.md`), que
135
+ * el agente sí escribe a veces, tampoco salga aquí; es coherente con el resto del repo, que
136
+ * trata esa carpeta entera como interna, y esa escritura pasa igual por su aprobación.
137
+ *
138
+ * No basta con confiar en el `.gitignore` del proyecto: en modo offline sobre un repo del
139
+ * usuario, `prepararRepo` no ha escrito ningún `info/exclude`, y `.gitignore` no se toca
140
+ * nunca porque es un fichero del proyecto.
141
+ *
142
+ * Va en los DIFF y no en el `git add` del árbol; el porqué está donde se escribe el árbol.
143
+ */
144
+ const FUERA = ":(exclude).xonecode";
145
+ /**
146
+ * Las TRES clases que esta vista sabe contar: creado, modificado y borrado.
147
+ *
148
+ * No es decoración del listado, es una guarda: `claseDeCambio` (`agent/git.ts`) devuelve
149
+ * «modificado» para cualquier letra que no sea `A` ni `D`, así que un cambio de TIPO (`T`,
150
+ * un fichero que pasa a enlace simbólico) o una entrada sin fusionar (`U`) se colarían
151
+ * etiquetados como una modificación normal — una etiqueta falsa, no una lista incompleta.
152
+ * Pidiéndole a git solo `AMD`, lo que llega es exactamente lo que la vista sabe nombrar.
153
+ * Los renombrados ya no aparecen por `--no-renames`, que los parte en borrado + alta.
154
+ */
155
+ const FILTRO = "--diff-filter=AMD";
156
+ /** El árbol de AHORA, escrito sobre un índice privado. Incluye lo no seguido por git, que
157
+ * es justo lo que un fichero recién creado por el agente es. */
158
+ async function arbolDeAhora(raiz) {
159
+ const idx = indicePrivado("sesion");
160
+ try {
161
+ // El pathspec de exclusión NO va aquí, y no es un olvido: `git add` con
162
+ // `:(exclude).xonecode` en un repo donde `.xonecode` YA está ignorado (el caso normal:
163
+ // `prepararRepo` escribe `info/exclude`) considera que has nombrado una ruta ignorada,
164
+ // avisa y **sale con código 1**. Medido contra el proyecto de verdad: `marcarSesion`
165
+ // devolvía `false` y la pestaña entera decía «sin-marca» para siempre. Excluir en el
166
+ // DIFF hace el mismo trabajo y no tiene esa arista: si `.xonecode` está ignorado no
167
+ // entra en el árbol, y si no lo está, entra en los DOS árboles y el diff lo descarta.
168
+ await ejecutar("git", ["add", "-A", "--", "."], {
169
+ cwd: raiz,
170
+ env: { ...process.env, GIT_INDEX_FILE: idx.ruta },
171
+ });
172
+ // El pathspec no vale (ver arriba), pero `rm --cached --ignore-unmatch` sí: sin esto,
173
+ // en un proyecto offline el `checkpoint.sqlite` entra en el árbol y sus 30 MB se quedan
174
+ // en `.git/objects`, vivos para siempre porque `refs/xonecode/sesion/*` los alcanza.
175
+ await sacarXonecodeDelIndice(ejecutar, raiz, idx.ruta);
176
+ const { stdout } = await ejecutar("git", ["write-tree"], {
177
+ cwd: raiz,
178
+ env: { ...process.env, GIT_INDEX_FILE: idx.ruta },
179
+ });
180
+ return stdout.trim();
181
+ }
182
+ finally {
183
+ idx.limpiar();
184
+ }
185
+ }
186
+ /**
187
+ * Marca el ANTES de una sesión. Se llama al abrirla, no al primer turno: lo que interesa es
188
+ * lo que ha cambiado desde que te sentaste.
189
+ *
190
+ * No lanza. Un proyecto sin git usable —o con un hook que revienta— no puede impedir abrir
191
+ * una sesión; lo que pasa es que después no habrá «antes» que enseñar, y eso se dice con
192
+ * `via: "sin-marca"` en vez de con una lista vacía que parecería «no tocaste nada».
193
+ */
194
+ export async function marcarSesion(raiz, id) {
195
+ const foto = await fotoDeApertura(raiz);
196
+ return foto(id);
197
+ }
198
+ /**
199
+ * La foto se toma AHORA y se nombra DESPUÉS.
200
+ *
201
+ * Hace falta porque el id de sesión no existe hasta que se vuelca el primer acto —y para
202
+ * entonces el agente ya ha escrito—, mientras que el «antes» tiene que ser el momento en que
203
+ * se abrió el proyecto. Así que se escribe el árbol al abrir y se apunta la ref cuando hay a
204
+ * qué nombre apuntarla.
205
+ *
206
+ * No lanza: un proyecto sin git usable no puede impedir abrir una sesión. Lo que pasa es que
207
+ * después no habrá «antes» que enseñar, y eso se dice con `via: "sin-marca"` en vez de con
208
+ * una lista vacía que parecería «no tocaste nada».
209
+ */
210
+ export async function fotoDeApertura(raiz) {
211
+ let arbol;
212
+ try {
213
+ arbol = await arbolDeAhora(raiz);
214
+ }
215
+ catch {
216
+ arbol = undefined;
217
+ }
218
+ return async (id) => {
219
+ const ref = refDeSesion(id);
220
+ if (ref === undefined || arbol === undefined)
221
+ return false;
222
+ try {
223
+ await ejecutar("git", ["update-ref", ref, arbol], { cwd: raiz });
224
+ return true;
225
+ }
226
+ catch {
227
+ return false;
228
+ }
229
+ };
230
+ }
231
+ /** El árbol vacío de git: el «antes» cuando el primer commit de la sesión es la raíz del
232
+ * repo y no tiene padre. Se COMPRUEBA antes de usarlo (en un repo sha256 no es este), y si
233
+ * no está se cae a la medida de apertura en vez de inventar un extremo. */
234
+ const ARBOL_VACIO = "4b825dc642cb6eb9a060e54bf8d69288fbee4904";
235
+ /** Las opciones que comparten todos los diffs de esta vista. El porqué de cada una está en
236
+ * `FILTRO`, en `FUERA` y en el comentario de `--relative` de más abajo. */
237
+ const COMUNES = ["--relative", "--no-renames", FILTRO];
238
+ /** El diff de UN commit contra su padre. `diff-tree --root` es lo que hace que el primer
239
+ * commit de un repo (que no tiene padre) salga como altas en vez de reventar. */
240
+ const deCommit = (sha) => ["diff-tree", "-r", "--no-commit-id", "--root", ...COMUNES, sha];
241
+ /** El diff entre dos extremos cualesquiera: árboles, commits o `HEAD`. */
242
+ const entre = (a, b) => ["diff", ...COMUNES, a, b];
243
+ /**
244
+ * Las dos salidas de git de un diff, fusionadas en filas. Son dos llamadas porque
245
+ * `--name-status` y `--numstat` no se pueden pedir juntas, y la clase la da la primera y
246
+ * las cuentas la segunda.
247
+ */
248
+ async function filasDeDiff(raiz, args) {
249
+ const cola = ["--", ".", FUERA];
250
+ const [estados, numeros] = await Promise.all([
251
+ ejecutar("git", [...args, "--name-status", ...cola], { cwd: raiz, maxBuffer: 32 * 1024 * 1024 }),
252
+ ejecutar("git", [...args, "--numstat", ...cola], { cwd: raiz, maxBuffer: 32 * 1024 * 1024 }),
253
+ ]);
254
+ const cuentas = new Map();
255
+ for (const linea of numeros.stdout.split("\n")) {
256
+ const [mas, menos, ruta] = linea.split("\t");
257
+ if (ruta === undefined)
258
+ continue;
259
+ // Un binario viene como «-»: no se convierte a 0, que diría «no cambió nada».
260
+ cuentas.set(ruta.trim(), {
261
+ ...(mas === "-" ? {} : { mas: Number(mas) }),
262
+ ...(menos === "-" ? {} : { menos: Number(menos) }),
263
+ });
264
+ }
265
+ const ficheros = [];
266
+ for (const linea of estados.stdout.split("\n")) {
267
+ if (!linea.trim())
268
+ continue;
269
+ const [estado, ruta] = linea.split("\t");
270
+ if (ruta === undefined)
271
+ continue;
272
+ const limpia = ruta.trim();
273
+ ficheros.push({ ruta: limpia, clase: claseDeCambio(estado), ...(cuentas.get(limpia) ?? {}) });
274
+ }
275
+ return ficheros;
276
+ }
277
+ /**
278
+ * Lo que ha cambiado ESTA sesión.
279
+ *
280
+ * **Se atribuye por COMMIT**, que es lo único que dice de quién es cada cambio: cada turno
281
+ * commitea (`gitSync.ts#commitDeTurno`) con el id de la sesión sellado en el mensaje. La
282
+ * medida vieja —el árbol de ahora contra la foto de apertura— no atribuía nada, y desde que
283
+ * hay tareas de fondo escribiendo en la misma copia dejó de ser un proxy razonable: MEDIDO
284
+ * en el proyecto del usuario el 10-09-2026, una conversación enseñaba +1266 líneas que
285
+ * había escrito una tarea de fondo veinte minutos después, con la pestaña rotulada
286
+ * «Sesión». Se conserva como respaldo declarado (`via: "desde-apertura"`) para las sesiones
287
+ * sin sello, que son todas las de antes de esto.
288
+ *
289
+ * Y lo que la atribución por commit NO puede prometer, porque `commitDeTurno` hace `add -A`:
290
+ * un commit barre todo lo que estuviera sucio en ese instante, incluido lo que tocara otra
291
+ * sesión sin commitear. Es la misma honestidad que separa `Tarea.autorizadas` de
292
+ * «aplicados»; el aislamiento de verdad es un árbol por sesión, que no está hecho.
293
+ */
294
+ export async function cambiosDeSesion(raiz, id) {
295
+ try {
296
+ const commits = await commitsDeSesion(raiz, id);
297
+ if (commits.length > 0)
298
+ return await porCommits(raiz, commits);
299
+ }
300
+ catch {
301
+ // Cae al respaldo, que se declara como lo que es.
302
+ }
303
+ return desdeLaApertura(raiz, id);
304
+ }
305
+ /**
306
+ * La atribución por commit, con los extremos elegidos así:
307
+ *
308
+ * - **El «antes» es el PADRE del primer commit de la sesión**, no la foto de apertura, y
309
+ * eso es mejor y no un atajo: lo que otra sesión commiteara entre que te sentaste y tu
310
+ * primer turno queda fuera por construcción.
311
+ * - **El «ahora» es el árbol de ahora** y no el último commit de la sesión, porque el turno
312
+ * en vuelo no ha commiteado todavía: con el último commit, la pestaña se quedaría vacía
313
+ * justo mientras el agente escribe, que es cuando más se mira.
314
+ * - **La LISTA sale de los commits, uno a uno** —así una ruta que la sesión no tocó no
315
+ * entra aunque haya cambiado— y las CUENTAS y el PARCHE salen de los dos extremos, que es
316
+ * lo que hace que la cifra de una fila y su diff cuenten lo mismo.
317
+ */
318
+ async function porCommits(raiz, commits) {
319
+ const primero = commits[0];
320
+ const base = await padreDe(raiz, primero);
321
+ if (base === undefined)
322
+ return desdeLaApertura(raiz, "");
323
+ const ahora = await arbolDeAhora(raiz);
324
+ // Qué rutas tocó la sesión, y con qué clase la primera y la última vez.
325
+ const tocadas = new Map();
326
+ for (const sha of commits) {
327
+ for (const f of await filasDeDiff(raiz, deCommit(sha))) {
328
+ const antes = tocadas.get(f.ruta);
329
+ tocadas.set(f.ruta, { primera: antes?.primera ?? f.clase, ultima: f.clase });
330
+ }
331
+ }
332
+ const netas = await filasDeDiff(raiz, entre(base, ahora));
333
+ const pendientes = new Set((await filasDeDiff(raiz, entre("HEAD", ahora))).map((f) => f.ruta));
334
+ const ficheros = [];
335
+ for (const fila of netas) {
336
+ const suya = tocadas.get(fila.ruta);
337
+ // Una ruta que la sesión no tocó y que nadie ha commiteado se enseña igual, dicha como
338
+ // lo que es: puede ser el turno en vuelo. Una que no tocó y que SÍ está commiteada es
339
+ // de otra sesión, y esa es justamente la que sobraba.
340
+ if (suya === undefined && !pendientes.has(fila.ruta))
341
+ continue;
342
+ const clase = suya === undefined ? fila.clase : claseNeta(suya.primera, suya.ultima);
343
+ if (clase === undefined)
344
+ continue;
345
+ ficheros.push({ ...fila, clase, ...(pendientes.has(fila.ruta) ? { sinCommitear: true } : {}) });
346
+ }
347
+ const mezclados = await commitsAjenos(raiz, base, commits);
348
+ return {
349
+ via: "git",
350
+ ficheros: ficheros.sort((a, b) => a.ruta.localeCompare(b.ruta)),
351
+ ...(mezclados === undefined || mezclados === 0 ? {} : { mezclados }),
352
+ };
353
+ }
354
+ /** El padre de un commit, o el árbol vacío si es la raíz del repo. `undefined` = no se pudo
355
+ * resolver ninguno de los dos, y entonces no hay «antes» que usar. */
356
+ async function padreDe(raiz, sha) {
357
+ try {
358
+ const { stdout } = await ejecutar("git", ["rev-parse", "--verify", "--quiet", `${sha}^`], { cwd: raiz });
359
+ return stdout.trim();
360
+ }
361
+ catch {
362
+ try {
363
+ await ejecutar("git", ["rev-parse", "--verify", "--quiet", `${ARBOL_VACIO}^{tree}`], { cwd: raiz });
364
+ return ARBOL_VACIO;
365
+ }
366
+ catch {
367
+ return undefined;
368
+ }
369
+ }
370
+ }
371
+ /** Cuántos commits que NO son de esta sesión hay desde su «antes» hasta ahora. `undefined`
372
+ * si no se pudo preguntar: entonces no se afirma ni que haya ni que no haya. */
373
+ async function commitsAjenos(raiz, base, commits) {
374
+ try {
375
+ const { stdout } = await ejecutar("git", ["rev-list", `${base}..HEAD`], { cwd: raiz, maxBuffer: 8 * 1024 * 1024 });
376
+ const mios = new Set(commits);
377
+ return stdout
378
+ .split("\n")
379
+ .map((l) => l.trim())
380
+ .filter((l) => l !== "" && !mios.has(l)).length;
381
+ }
382
+ catch {
383
+ return undefined;
384
+ }
385
+ }
386
+ /**
387
+ * El respaldo: el árbol de ahora contra la foto de apertura. Es la medida de siempre y lo
388
+ * único posible en una sesión sin sello — pero NO atribuye, así que viaja con su propio
389
+ * `via` para que nadie la pinte como «lo que hizo esta sesión».
390
+ */
391
+ async function desdeLaApertura(raiz, id) {
392
+ const ref = refDeSesion(id);
393
+ if (ref === undefined)
394
+ return { via: "sin-marca", ficheros: [] };
395
+ try {
396
+ await ejecutar("git", ["rev-parse", "--verify", "--quiet", ref], { cwd: raiz });
397
+ }
398
+ catch {
399
+ return { via: "sin-marca", ficheros: [] };
400
+ }
401
+ try {
402
+ const ahora = await arbolDeAhora(raiz);
403
+ // `--relative` porque los dos árboles se escriben con rutas desde la RAÍZ DEL REPO, y el
404
+ // proyecto no tiene por qué serlo (`instantanea.ts` sostiene ese caso a propósito). Sin
405
+ // él, en un proyecto que cuelga de un repo mayor las rutas saldrían con el prefijo de la
406
+ // subcarpeta y `parcheDeSesion` no casaría con ninguna.
407
+ const ficheros = await filasDeDiff(raiz, entre(ref, ahora));
408
+ return { via: "desde-apertura", ficheros: ficheros.sort((a, b) => a.ruta.localeCompare(b.ruta)) };
409
+ }
410
+ catch {
411
+ return { via: "sin-marca", ficheros: [] };
412
+ }
413
+ }
414
+ /** Cuánto parche se sirve de un fichero. Un `.min.js` regenerado son megas y la vista no los
415
+ * puede pintar: se recorta y quien llama lo dice. */
416
+ const TOPE_DE_PARCHE = 400_000;
417
+ /**
418
+ * El parche de UN fichero de la sesión, en texto de git.
419
+ *
420
+ * La ruta se pasa después de `--`, que es lo que impide que una ruta que empiece por guion
421
+ * se lea como una opción. Y se acota el tamaño: la vista no puede pintar un fichero
422
+ * generado de tres megas, y truncar diciéndolo es mejor que colgar el navegador.
423
+ */
424
+ export async function parcheDeSesion(raiz, id, ruta) {
425
+ try {
426
+ const extremos = await extremosDelParche(raiz, id, ruta);
427
+ if (extremos === undefined)
428
+ return undefined;
429
+ const { stdout } = await ejecutar("git",
430
+ // `FUERA` también aquí: nadie debe poder pedir el parche de un fichero interno
431
+ // nombrándolo a mano, ni siquiera si se cuela en la lista por una ref antigua.
432
+ ["diff", "--relative", "--no-renames", extremos.antes, extremos.despues, "--", ruta, FUERA], { cwd: raiz, maxBuffer: 32 * 1024 * 1024 });
433
+ if (stdout.length <= TOPE_DE_PARCHE)
434
+ return { texto: stdout, recortado: false };
435
+ return { texto: stdout.slice(0, TOPE_DE_PARCHE), recortado: true };
436
+ }
437
+ catch {
438
+ return undefined;
439
+ }
440
+ }
441
+ /**
442
+ * Entre qué dos extremos se pide el parche de un fichero, y son los MISMOS que dan sus
443
+ * cuentas en la lista — si no, una fila diría «+40» y su diff enseñaría otra cosa.
444
+ *
445
+ * Con atribución por commit el «antes» es el padre del primer commit de la sesión que TOCÓ
446
+ * ESTE fichero, no el primero de la sesión: así el parche empieza donde empieza el cambio y
447
+ * no arrastra lo que otro commit de la misma sesión hiciera en otros ficheros. Sin sello, la
448
+ * foto de apertura, que es lo único que hay.
449
+ */
450
+ async function extremosDelParche(raiz, id, ruta) {
451
+ const ahora = await arbolDeAhora(raiz);
452
+ const suyos = await commitsDeSesion(raiz, id, ruta);
453
+ if (suyos.length > 0) {
454
+ const base = await padreDe(raiz, suyos[0]);
455
+ if (base !== undefined)
456
+ return { antes: base, despues: ahora };
457
+ }
458
+ // Sin commits de la sesión para este fichero: o es una sesión sin sello, o el fichero solo
459
+ // tiene cambios sin commitear. Lo primero se mide contra la foto; lo segundo, contra HEAD.
460
+ const commits = await commitsDeSesion(raiz, id);
461
+ if (commits.length > 0)
462
+ return { antes: "HEAD", despues: ahora };
463
+ const ref = refDeSesion(id);
464
+ if (ref === undefined)
465
+ return undefined;
466
+ return { antes: ref, despues: ahora };
467
+ }
468
+ /** Olvida la marca de una sesión. Para cuando se borre una sesión: una ref que apunta a un
469
+ * árbol de un proyecto que ya no interesa mantiene vivo ese árbol para siempre. */
470
+ export async function olvidarSesion(raiz, id) {
471
+ const ref = refDeSesion(id);
472
+ if (ref === undefined)
473
+ return;
474
+ try {
475
+ await ejecutar("git", ["update-ref", "-d", ref], { cwd: raiz });
476
+ }
477
+ catch {
478
+ // Borrar lo que no está no es un error.
479
+ }
480
+ }
481
+ //# sourceMappingURL=sesionGit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sesionGit.js","sourceRoot":"","sources":["../../src/agent/sesionGit.ts"],"names":[],"mappings":"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"}