xonecode 0.2.0 → 0.5.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 (406) hide show
  1. package/README.md +49 -7
  2. package/THIRD_PARTY_NOTICES.md +128 -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 +70 -10
  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/tokenTracking.js +22 -1
  300. package/dist/vendor/tokenTracking.js.map +1 -1
  301. package/dist/web/servidor/arranque.js +3964 -0
  302. package/dist/web/servidor/arranque.js.map +1 -0
  303. package/dist/web/servidor/consolaDeTarea.js +161 -0
  304. package/dist/web/servidor/consolaDeTarea.js.map +1 -0
  305. package/dist/web/servidor/consolaWeb.js +389 -0
  306. package/dist/web/servidor/consolaWeb.js.map +1 -0
  307. package/dist/web/servidor/corredorDeTareas.js +1119 -0
  308. package/dist/web/servidor/corredorDeTareas.js.map +1 -0
  309. package/dist/web/servidor/pielWeb.js +269 -0
  310. package/dist/web/servidor/pielWeb.js.map +1 -0
  311. package/dist/web/servidor/servidor.js +257 -0
  312. package/dist/web/servidor/servidor.js.map +1 -0
  313. package/dist/web/servidor/sesiones.js +440 -0
  314. package/dist/web/servidor/sesiones.js.map +1 -0
  315. package/dist/web/servidor/transporte.js +169 -0
  316. package/dist/web/servidor/transporte.js.map +1 -0
  317. package/dist/web/servidor/vestibulo.js +1276 -0
  318. package/dist/web/servidor/vestibulo.js.map +1 -0
  319. package/package.json +30 -8
  320. package/skills/archify/LICENSE +22 -0
  321. package/skills/archify/SKILL.md +109 -0
  322. package/skills/archify/THIRD_PARTY_NOTICES.md +56 -0
  323. package/skills/archify/assets/template.html +14787 -0
  324. package/skills/archify/bin/archify.mjs +1990 -0
  325. package/skills/archify/bin/open-artifact.mjs +86 -0
  326. package/skills/archify/bin/preview.mjs +648 -0
  327. package/skills/archify/bin/visual-check.mjs +829 -0
  328. package/skills/archify/brand-marks/README.md +31 -0
  329. package/skills/archify/brand-marks/catalog.json +131 -0
  330. package/skills/archify/delta/architecture-delta.mjs +1214 -0
  331. package/skills/archify/examples/agent-run.lifecycle.json +71 -0
  332. package/skills/archify/examples/agent-tool-call.workflow.json +94 -0
  333. package/skills/archify/examples/async-job-roundtrip.sequence.json +61 -0
  334. package/skills/archify/examples/brand-aware-delivery.architecture.json +47 -0
  335. package/skills/archify/examples/cache-miss-request.sequence.json +81 -0
  336. package/skills/archify/examples/checkout-platform.base.architecture.json +31 -0
  337. package/skills/archify/examples/checkout-platform.head.architecture.json +31 -0
  338. package/skills/archify/examples/dataflow-product-analytics.html +14898 -0
  339. package/skills/archify/examples/deployment-release.lifecycle.json +49 -0
  340. package/skills/archify/examples/event-stream.dataflow.json +57 -0
  341. package/skills/archify/examples/incident-response.workflow.json +64 -0
  342. package/skills/archify/examples/lifecycle-agent-run.html +14847 -0
  343. package/skills/archify/examples/product-analytics.dataflow.json +76 -0
  344. package/skills/archify/examples/production-deployment.architecture.json +71 -0
  345. package/skills/archify/examples/release-delivery.workflow.json +62 -0
  346. package/skills/archify/examples/sequence-cache-miss-request.html +14913 -0
  347. package/skills/archify/examples/web-app-rendered.html +14862 -0
  348. package/skills/archify/examples/web-app.architecture.json +46 -0
  349. package/skills/archify/examples/workflow-agent-tool-call-rendered.html +14904 -0
  350. package/skills/archify/migrations/workflow-v2.mjs +279 -0
  351. package/skills/archify/package.json +17 -0
  352. package/skills/archify/recipes/scenarios.mjs +391 -0
  353. package/skills/archify/references/authoring-contract.md +198 -0
  354. package/skills/archify/references/brand-marks.md +69 -0
  355. package/skills/archify/references/delivery-contract.md +116 -0
  356. package/skills/archify/references/viewer-runtime.md +45 -0
  357. package/skills/archify/renderers/architecture/grid.mjs +62 -0
  358. package/skills/archify/renderers/architecture/render-architecture.mjs +1078 -0
  359. package/skills/archify/renderers/dataflow/README.md +104 -0
  360. package/skills/archify/renderers/dataflow/render-dataflow.mjs +483 -0
  361. package/skills/archify/renderers/lifecycle/README.md +115 -0
  362. package/skills/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
  363. package/skills/archify/renderers/sequence/README.md +114 -0
  364. package/skills/archify/renderers/sequence/render-sequence.mjs +453 -0
  365. package/skills/archify/renderers/shared/brand-marks.mjs +563 -0
  366. package/skills/archify/renderers/shared/cli.mjs +218 -0
  367. package/skills/archify/renderers/shared/desktop-readability.mjs +26 -0
  368. package/skills/archify/renderers/shared/diagnostics.mjs +127 -0
  369. package/skills/archify/renderers/shared/engineering-profiles.mjs +157 -0
  370. package/skills/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
  371. package/skills/archify/renderers/shared/generated-validators.mjs +13 -0
  372. package/skills/archify/renderers/shared/geometry.mjs +1423 -0
  373. package/skills/archify/renderers/shared/i18n.mjs +594 -0
  374. package/skills/archify/renderers/shared/layout-report.mjs +40 -0
  375. package/skills/archify/renderers/shared/legend.mjs +217 -0
  376. package/skills/archify/renderers/shared/output-path.mjs +321 -0
  377. package/skills/archify/renderers/shared/repository-evidence.mjs +235 -0
  378. package/skills/archify/renderers/shared/text-fit.mjs +49 -0
  379. package/skills/archify/renderers/shared/utils.mjs +232 -0
  380. package/skills/archify/renderers/shared/validator.mjs +86 -0
  381. package/skills/archify/renderers/workflow/README.md +223 -0
  382. package/skills/archify/renderers/workflow/render-workflow.mjs +35 -0
  383. package/skills/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
  384. package/skills/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
  385. package/skills/archify/schemas/README.md +211 -0
  386. package/skills/archify/schemas/architecture.schema.json +176 -0
  387. package/skills/archify/schemas/common.schema.json +115 -0
  388. package/skills/archify/schemas/dataflow.schema.json +243 -0
  389. package/skills/archify/schemas/lifecycle.schema.json +266 -0
  390. package/skills/archify/schemas/sequence.schema.json +223 -0
  391. package/skills/archify/schemas/workflow.schema.json +428 -0
  392. package/skills/archify/scripts/check-render-output.mjs +835 -0
  393. package/skills/archify/scripts/check-update.mjs +1667 -0
  394. package/skills/archify/scripts/render-examples.mjs +26 -0
  395. package/skills/archify/scripts/update-contract.mjs +182 -0
  396. package/skills/archify/skill-release.json +10 -0
  397. package/skills/artifacts-builder/SKILL.md +120 -0
  398. package/skills/artifacts-builder/reference/diagramas.md +123 -0
  399. package/skills/artifacts-builder/reference/estilo.md +123 -0
  400. package/skills/artifacts-builder/reference/exportar-pdf.md +56 -0
  401. package/skills/artifacts-builder/reference/graficas.md +22 -0
  402. package/skills/artifacts-builder/scripts/bundle_artifact.py +109 -0
  403. package/skills/artifacts-builder/scripts/validate_artifact.py +345 -0
  404. package/skills/xone-hotswap/SKILL.md +185 -0
  405. package/skills/xone-hotswap/references/comandos.md +706 -0
  406. package/skills/xone-hotswap/references/conexion-y-despliegue.md +226 -0
@@ -0,0 +1,466 @@
1
+ /**
2
+ * La cola de tareas en disco: `~/.xonecode/tareas/`.
3
+ *
4
+ * **De la MÁQUINA, no de un proyecto**, y esa es la decisión de este fichero. El kanban es
5
+ * global y no puede depender de tener descargados los dieciocho proyectos del entorno: con
6
+ * la cola dentro de cada uno, listar las tareas obligaría a abrirlos todos. Es el mismo
7
+ * reparto que ya existe entre `settings.json` y el `config.json` de proyecto.
8
+ *
9
+ * Los ADJUNTOS también van aquí y no en el proyecto: una tarea puede crearse para uno que
10
+ * no se ha abierto nunca, y guardar ahí un adjunto sería estrenarle el `.xonecode/` por la
11
+ * puerta de atrás. Fuera del proyecto se gana además gratis lo que importaba — no entran en
12
+ * git y no suben a CloudStudio — sin depender de ninguna exclusión.
13
+ */
14
+ import { chmodSync, existsSync, linkSync, lstatSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeFileSync, readdirSync } from "node:fs";
15
+ import { homedir } from "node:os";
16
+ import { join } from "node:path";
17
+ import { conFeedback } from "../core/tareas.js";
18
+ import { mimeDeAdjunto, nombreDeAdjuntoAceptable } from "../core/adjuntos.js";
19
+ /** Bytes que se aceptan por adjunto y por tarea. */
20
+ export const TOPE_DE_ADJUNTO = 20_000_000;
21
+ export const TOPE_DE_ADJUNTOS_POR_TAREA = 50_000_000;
22
+ /** Un nombre de adjunto: un segmento llano y nada más. La lista BLANCA de forma vive en
23
+ * `core/adjuntos.ts` —la comparten esto, la ruta de subida y el listado—, y de ella depende
24
+ * que esto no escriba fuera. */
25
+ const nombreAceptable = nombreDeAdjuntoAceptable;
26
+ export function crearTareasEnDisco(opciones) {
27
+ const base = join(opciones.base ?? join(homedir(), ".xonecode"), "tareas");
28
+ const pid = opciones.pid ?? process.pid;
29
+ const vivo = opciones.vivo ?? estaVivo;
30
+ const informar = opciones.informar ?? (() => { });
31
+ const topeDeAdjunto = opciones.topeDeAdjunto ?? TOPE_DE_ADJUNTO;
32
+ const topePorTarea = opciones.topePorTarea ?? TOPE_DE_ADJUNTOS_POR_TAREA;
33
+ const renombrar = opciones.renombrar ?? renameSync;
34
+ const enlazar = opciones.enlazar ?? linkSync;
35
+ const borrar = opciones.borrar ?? ((ruta) => rmSync(ruta, { force: true }));
36
+ const indice = join(base, "indice.json");
37
+ const cerrojo = join(base, "corredor.lock");
38
+ /**
39
+ * La carpeta de adjuntos de una tarea, **si su camino REAL sigue dentro de la cola**.
40
+ *
41
+ * La barrera se aplica DOS veces, igual que la del lector de ficheros del proyecto
42
+ * (`agent/arbolDeProyecto.ts`): sobre el TEXTO del id —de balde, antes de tocar el
43
+ * disco— y sobre el camino REAL, que es lo único que caza un enlace simbólico. Y hace
44
+ * falta, porque estaba medido: con `<base>/<id>` apuntando a otra carpeta,
45
+ * `mkdirSync(…, {recursive:true})` lo SIGUE y `guardarAdjunto` escribía fuera de la cola.
46
+ * No es alcanzable desde el cable —hay que plantar el enlace en un directorio a 0700 del
47
+ * home—, pero es la misma clase de agujero que ese lector ya cierra, y aquí de esta
48
+ * carpeta cuelga además el `/adjuntos/` que se monta en el backend del agente: un enlace
49
+ * ahí le daría lectura fuera de la cola.
50
+ *
51
+ * **Se mira con `lstatSync` los dos segmentos, y no solo el `realpath` del final.** Un
52
+ * enlace que apunte a otra carpeta DENTRO de la cola pasaría la comprobación de
53
+ * contención y seguiría siendo un alias de los adjuntos de otra tarea. Y `lstat` no
54
+ * necesita que exista nada: `ENOENT` es «no hay enlace», que es el caso normal.
55
+ */
56
+ const carpetaDeAdjuntos = (tarea) => {
57
+ if (!nombreAceptable(tarea))
58
+ return undefined;
59
+ const carpeta = join(base, tarea, "adjuntos");
60
+ if (esEnlace(join(base, tarea)) || esEnlace(carpeta))
61
+ return undefined;
62
+ try {
63
+ // Y si ya existe, que su camino real siga dentro. Los dos lados se canonicalizan: en
64
+ // macOS el propio temporal del sistema es `/var` → `/private/var`, así que comparar
65
+ // un `realpath` contra una ruta sin resolver daría falsos negativos.
66
+ if (existsSync(carpeta) && !realpathSync(carpeta).startsWith(realpathSync(base)))
67
+ return undefined;
68
+ }
69
+ catch {
70
+ // No se pudo resolver: no se afirma que valga. Falla cerrado, como todo lo que
71
+ // decide sobre una ruta.
72
+ return undefined;
73
+ }
74
+ return carpeta;
75
+ };
76
+ /**
77
+ * **El índice lleva el ENCARGO entero del usuario**, así que la carpeta y el fichero van a
78
+ * 0600/0700: la misma regla que ya sigue `checkpoint.sqlite`, y por el mismo motivo — es
79
+ * contenido de una persona, no un dato de sistema.
80
+ */
81
+ function guardarIndice(tareas) {
82
+ // El `mode` de estas dos llamadas solo se aplica al CREAR: si la carpeta o el índice ya
83
+ // existían con permisos más flojos —los dejó una versión anterior, o un `umask` raro—,
84
+ // seguirían flojos para siempre. Es la lección de `checkpoint.sqlite`, y aquí importa
85
+ // por lo mismo: el índice lleva el encargo que escribió una persona. El `chmod` es
86
+ // aparte y no falla el guardado si no se puede aplicar (un sistema de ficheros sin
87
+ // permisos POSIX): el aviso sería inútil y la escritura sí valió.
88
+ mkdirSync(base, { recursive: true, mode: 0o700 });
89
+ asegurarModo(base, 0o700);
90
+ writeFileSync(indice, `${JSON.stringify(tareas, null, 1)}\n`, { encoding: "utf8", mode: 0o600 });
91
+ asegurarModo(indice, 0o600);
92
+ }
93
+ /**
94
+ * Lee el índice y dice además si se PUDO leer — pero NO avisa por su cuenta: quien la
95
+ * llama sabe qué está haciendo (enseñar la cola, o borrar una tarea) y es quien tiene que
96
+ * elegir las palabras. Avisar aquí dentro con un solo mensaje fijo fue el propio error que
97
+ * esto corrige: `borrarTarea` heredaba el «la cola se enseña vacía» de `listar()`, que
98
+ * describe la situación de otro sitio — un aviso que manda a mirar donde no está el
99
+ * problema es peor que ninguno.
100
+ *
101
+ * Un índice sintácticamente válido pero que no es una lista (`{}`, por ejemplo) es tan
102
+ * ilegible como uno con JSON roto: las dos formas de «esto no es la cola» devuelven vacío
103
+ * y ninguna se sobrescribe sola.
104
+ */
105
+ function leerIndice() {
106
+ if (!existsSync(indice))
107
+ return { tareas: [], legible: true };
108
+ try {
109
+ const leido = JSON.parse(readFileSync(indice, "utf8"));
110
+ if (!Array.isArray(leido))
111
+ return { tareas: [], legible: false };
112
+ return { tareas: leido, legible: true };
113
+ }
114
+ catch {
115
+ // No se sobrescribe: perder la cola de alguien por no saber leerla sería peor que
116
+ // no enseñarla. Misma postura que una línea corrupta del `.jsonl` de una sesión.
117
+ return { tareas: [], legible: false };
118
+ }
119
+ }
120
+ /**
121
+ * Quién aparece en un fichero de cerrojo, si se puede leer y trae un pid. Por omisión, el
122
+ * cerrojo vigente; tras una recogida hace falta leer el `.caduco` en su lugar en vez del
123
+ * `cerrojo` (que puede que ni exista todavía) — es la única lectura AUTORITATIVA de qué
124
+ * era lo que se apartó, porque en cuanto el `rename` tiene éxito ese inodo es nuestro y
125
+ * nadie más puede tocarlo.
126
+ */
127
+ function asegurarModo(ruta, modo) {
128
+ try {
129
+ chmodSync(ruta, modo);
130
+ }
131
+ catch {
132
+ // Ver el comentario de `guardar`.
133
+ }
134
+ }
135
+ function leerDueño(ruta = cerrojo) {
136
+ try {
137
+ const dueño = JSON.parse(readFileSync(ruta, "utf8"));
138
+ return typeof dueño.pid === "number" ? { pid: dueño.pid } : undefined;
139
+ }
140
+ catch {
141
+ return undefined;
142
+ }
143
+ }
144
+ function intentar() {
145
+ try {
146
+ writeFileSync(cerrojo, `${JSON.stringify({ pid, desde: new Date().toISOString() })}\n`, {
147
+ encoding: "utf8",
148
+ mode: 0o600,
149
+ flag: "wx",
150
+ });
151
+ return true;
152
+ }
153
+ catch (error) {
154
+ if (error.code === "EEXIST")
155
+ return false;
156
+ throw error;
157
+ }
158
+ }
159
+ function confirmar() {
160
+ const dueño = leerDueño();
161
+ if (dueño?.pid === pid)
162
+ return { tomado: true };
163
+ // Alguien escribió encima entre nuestro `wx` y esta relectura: perdimos la carrera.
164
+ // -1 nunca es un pid real: es lo que se devuelve si ni siquiera el ganador se puede
165
+ // leer, que no debería pasar en la práctica pero no es motivo para lanzar — fallar
166
+ // aquí bloquearía al llamante sin decir por qué.
167
+ return { tomado: false, dePid: dueño?.pid ?? -1 };
168
+ }
169
+ /**
170
+ * Recoge un cerrojo que la FOTO de `tomarCerrojo` dio por caduco: lo aparta, comprueba
171
+ * con autoridad qué era, y lo restituye si resultó estar vivo.
172
+ *
173
+ * **La recogida de un cerrojo MUERTO usa `renameSync` para apartarlo, y una relectura
174
+ * de confirmación tras cada `wx` ganado — pero esas dos piezas, SOLAS, no bastan.** Un
175
+ * commit anterior de este mismo fichero afirmó que sí bastaban («cierra las dos
176
+ * direcciones de la carrera»), y no era cierto — quedó sin medir, y se midió después con
177
+ * un script que reproduce el orden que sigue: A y B ven los dos al mismo dueño muerto; A
178
+ * recoge, gana su `wx` y CONFIRMA (`{tomado:true}`); SOLO ENTONCES B, que ya había
179
+ * decidido apartar el cerrojo que vio muerto, ejecuta su `renameSync` — y ese `rename`
180
+ * tiene éxito igual, porque `rename` arbitra QUIÉN aparta un inodo dado, no si ESE
181
+ * inodo se podía apartar. B se lleva por delante el cerrojo VIVO de A, hace su propio
182
+ * `wx` sobre la ruta que él mismo dejó libre, relee, confirma con su propio pid — y los
183
+ * dos procesos terminan con `{tomado:true}`. Medido con un script de dos instancias
184
+ * (`vivo` de B disparando la recogida completa de A a mitad de su propia decisión):
185
+ * `deA` y `deB` salían los dos `{tomado:true}`.
186
+ *
187
+ * **Lo que de verdad falta es comprobar DESPUÉS del `rename`, no solo antes.** Antes del
188
+ * `rename` solo se puede leer una FOTO (`dueño`, más abajo) que puede quedarse vieja en
189
+ * el instante que tarda el propio `rename` en correr. Tras un `rename` con éxito, en
190
+ * cambio, se tiene acceso EXCLUSIVO al inodo que se acaba de apartar — nadie más puede
191
+ * ya estar escribiéndolo — así que ES el único momento en que leerlo vale con autoridad:
192
+ * - Si el `.caduco` nombra un pid VIVO que no es el nuestro, apartamos un cerrojo que no
193
+ * estaba muerto de verdad, y hay que DEVOLVERLO. `linkSync(caduco, cerrojo)` crea un
194
+ * segundo nombre para el MISMO inodo del `.caduco` en la ruta del cerrojo: si esa ruta
195
+ * sigue libre (nadie más ha escrito ahí desde que la dejamos vacía con el `rename`),
196
+ * tiene éxito y el cerrojo vivo queda restituido tal cual estaba. Si un TERCERO ya
197
+ * escribió un cerrojo nuevo en esa ruta mientras tanto, `link` falla con `EEXIST` —esa
198
+ * es una carrera de orden superior, exige un tercer proceso en el mismo instante— y
199
+ * entonces no se restituye nada (machacar el cerrojo del tercero sería la misma pérdida
200
+ * que se intenta evitar): se dice el dueño que haya. El `.caduco` se borra al final de
201
+ * las dos ramas.
202
+ * - Si el `.caduco` nombra un pid muerto, el nuestro, o es ilegible, la recogida era
203
+ * legítima y sigue el camino de siempre: `wx` sobre la ruta que quedó libre, y
204
+ * relectura de confirmación.
205
+ *
206
+ * **Y queda un residuo que esta capa NO puede cerrar, dicho aquí en vez de prometido de
207
+ * más.** Decidir «el dueño está muerto» es una observación de un INSTANTE, y con
208
+ * primitivas de sistema de ficheros no hay forma de actuar sobre ella atómicamente: no
209
+ * existe un «renombra solo si sigue siendo este inodo». Así que toda recogida de un
210
+ * cerrojo caduco puede apartar uno que revivió entre la observación y el `rename`. La
211
+ * restitución con `link` cubre ese caso salvo cuando un TERCER proceso ocupó la ruta en
212
+ * el hueco — entonces `link` falla con `EEXIST`, no se restituye (machacar al tercero
213
+ * sería la misma pérdida) y el dueño apartado se queda creyéndose dueño mientras el
214
+ * tercero también lo es. Un `flock` del núcleo no tendría este problema —el sistema lo
215
+ * suelta al morir el proceso, así que no hay cerrojo caduco que recoger— pero Node no lo
216
+ * expone sin un módulo nativo.
217
+ *
218
+ * Lo que hace verdad «un solo corredor» no es entonces esta función sola: es
219
+ * `sigoSiendoDueño`, que el corredor pregunta antes de cada cosa consecuente. Todo lo de
220
+ * arriba estrecha la ventana; la comprobación del dueño es la que hace que el perdedor se
221
+ * entere antes de arrancar una tarea.
222
+ */
223
+ function recoger() {
224
+ // Dueño soy yo según esta FOTO, está muerto, o el fichero es ilegible: se aparta para
225
+ // poder comprobar con autoridad qué era, después — esa foto puede haberse quedado
226
+ // vieja mientras el `rename` corría (ver el comentario de esta función).
227
+ // La cuarentena lleva el PID, y eso NO es cosmético: con un nombre compartido
228
+ // (`.caduco` a secas) la propia limpieza de más abajo se llevaba por delante el
229
+ // cerrojo vivo de otro. Medido: A recoge —`rename` a la cuarentena, `wx`, confirma— y,
230
+ // en el hueco entre su confirmación y su limpieza, el `rename` de B mete el cerrojo
231
+ // VIVO de A en esa misma ruta compartida (POSIX `rename` reemplaza el destino sin
232
+ // chistar); el `rmSync` de A borra entonces su PROPIO cerrojo creyendo borrar el
233
+ // muerto de antes, y B —que ya no encuentra nada que leer ahí— se cree la recogida
234
+ // legítima. A decía `{tomado:true}` sin fichero en disco y B se lo llevaba: dos
235
+ // dueños. Con la ruta por proceso, el `rename` de B solo puede aterrizar en la
236
+ // cuarentena de B, donde la lectura autoritativa de abajo ve a A vivo y lo restituye.
237
+ const caduco = `${cerrojo}.caduco-${pid}`;
238
+ try {
239
+ renombrar(cerrojo, caduco);
240
+ }
241
+ catch (error) {
242
+ if (error.code !== "ENOENT")
243
+ throw error;
244
+ // Otro proceso ya apartó el mismo cerrojo: nos ganó la recogida. Puede que ya tenga
245
+ // el suyo escrito, o que lo esté escribiendo en este instante — un solo reintento
246
+ // del `wx` y, si sigue ocupado, se dice de quién es.
247
+ if (intentar())
248
+ return confirmar();
249
+ const otro = leerDueño();
250
+ return { tomado: false, dePid: otro?.pid ?? -1 };
251
+ }
252
+ // El `rename` tuvo éxito: el inodo apartado es EXCLUSIVAMENTE nuestro ya, así que esta
253
+ // lectura sí vale con autoridad — al contrario que la de `dueño`, de antes del rename.
254
+ const apartado = leerDueño(caduco);
255
+ if (apartado && apartado.pid !== pid && vivo(apartado.pid)) {
256
+ // Nos llevamos por delante un cerrojo VIVO: hay que devolverlo. `link` falla con
257
+ // `EEXIST` si un TERCERO ya escribió un cerrojo nuevo en esa ruta mientras tanto, y
258
+ // ahí NO se restituye nada: machacar el del tercero sería la misma pérdida que se
259
+ // intenta evitar. Y esa rama es el residuo que no se puede cerrar aquí — el dueño
260
+ // que apartamos sigue creyéndose dueño y el tercero también lo es. Se dice el dueño
261
+ // que haya, y lo que hace que el perdedor se entere es `sigoSiendoDueño`.
262
+ try {
263
+ enlazar(caduco, cerrojo);
264
+ }
265
+ catch (error) {
266
+ if (error.code !== "EEXIST")
267
+ throw error;
268
+ const tercero = leerDueño();
269
+ borrar(caduco);
270
+ return { tomado: false, dePid: tercero?.pid ?? -1 };
271
+ }
272
+ borrar(caduco);
273
+ return { tomado: false, dePid: apartado.pid };
274
+ }
275
+ // El `.caduco` nombraba un cerrojo muerto de verdad, el nuestro, o era ilegible: la
276
+ // recogida es legítima. La ruta quedó libre con el `rename` de arriba. Si alguien crea
277
+ // un cerrojo nuevo en el hueco minúsculo entre eso y nuestro `wx` de abajo (un tercer
278
+ // proceso arrancando desde cero, sin dueño previo que recoger), nuestro propio `wx` lo
279
+ // ve como cualquier otro «ya hay uno» y no hace falta un caso especial.
280
+ const resultado = intentar() ? confirmar() : { tomado: false, dePid: leerDueño()?.pid ?? -1 };
281
+ // Basura de un cuelgue ajeno: se borra tras resolver, y si el borrado falla da igual —
282
+ // nadie vuelve a mirar esa ruta. Un proceso que muera entre el `rename` y esta línea
283
+ // deja su `.caduco-<pid>` ahí para siempre: es un fichero de basura y no un cerrojo,
284
+ // porque `tomarCerrojo` solo mira `corredor.lock` — que ese `rename` dejó libre.
285
+ borrar(caduco);
286
+ return resultado;
287
+ }
288
+ return {
289
+ listar() {
290
+ const { tareas, legible } = leerIndice();
291
+ if (!legible)
292
+ informar("el índice de tareas no se pudo leer; la cola se enseña vacía");
293
+ return tareas;
294
+ },
295
+ guardar(tareas) {
296
+ guardarIndice(tareas);
297
+ },
298
+ /**
299
+ * **Un solo corredor por máquina.** Dos consolas abiertas serían dos ejecutores sobre la
300
+ * misma cola, y con ellos dos turnos del mismo proyecto a la vez — que es exactamente lo
301
+ * que el cerrojo por proyecto existe para evitar.
302
+ *
303
+ * La toma tiene dos caminos, y solo el primero es atómico de verdad: `wx` cuando no hay
304
+ * cerrojo, y `recoger()` cuando hay uno cuyo dueño parece muerto. El segundo NO se puede
305
+ * hacer atómico con primitivas de ficheros y deja un residuo declarado —está escrito en
306
+ * `recoger`, con el orden exacto—, así que «un solo corredor» no lo sostiene esta función
307
+ * sola: lo sostiene `sigoSiendoDueño`, que el corredor pregunta antes de cada cosa
308
+ * consecuente.
309
+ *
310
+ * **La toma directa es atómica**: `flag: "wx"` crea el fichero solo si no existe, y falla
311
+ * con `EEXIST` si ya está — comprobar con `existsSync` y escribir después, como antes,
312
+ * deja una ventana entre las dos llamadas donde dos procesos que arrancan a la vez pueden
313
+ * leer los dos «no hay cerrojo» y escribir los dos.
314
+ */
315
+ tomarCerrojo() {
316
+ mkdirSync(base, { recursive: true, mode: 0o700 });
317
+ asegurarModo(base, 0o700);
318
+ if (intentar())
319
+ return confirmar();
320
+ const dueño = leerDueño();
321
+ if (dueño && dueño.pid !== pid && vivo(dueño.pid)) {
322
+ return { tomado: false, dePid: dueño.pid };
323
+ }
324
+ return recoger();
325
+ },
326
+ sigoSiendoDueño() {
327
+ return leerDueño()?.pid === pid;
328
+ },
329
+ soltarCerrojo() {
330
+ // Solo el propio: soltar el de otro dejaría dos corredores.
331
+ const dueño = leerDueño();
332
+ if (dueño && dueño.pid === pid)
333
+ rmSync(cerrojo, { force: true });
334
+ },
335
+ guardarAdjunto(tarea, nombre, datos) {
336
+ if (!nombreAceptable(nombre)) {
337
+ return { ok: false, motivo: "ese nombre no vale para un adjunto" };
338
+ }
339
+ if (datos.length > topeDeAdjunto) {
340
+ return { ok: false, motivo: `el fichero es demasiado grande (tope ${Math.round(topeDeAdjunto / 1_000_000)} MB)` };
341
+ }
342
+ // La carpeta y no `join` a pelo: `carpetaDeAdjuntos` es quien comprueba el id y quien
343
+ // recomprueba el camino real. Sin ella, un enlace simbólico plantado en la cola hacía
344
+ // que esto escribiera fuera (medido).
345
+ const carpeta = carpetaDeAdjuntos(tarea);
346
+ if (carpeta === undefined)
347
+ return { ok: false, motivo: "ese nombre no vale para un adjunto" };
348
+ mkdirSync(carpeta, { recursive: true, mode: 0o700 });
349
+ const ya = readdirSync(carpeta).reduce((suma, f) => suma + statSync(join(carpeta, f)).size, 0);
350
+ if (ya + datos.length > topePorTarea) {
351
+ return { ok: false, motivo: `esta tarea ya no admite más adjuntos (tope ${Math.round(topePorTarea / 1_000_000)} MB)` };
352
+ }
353
+ // Un adjunto es un documento de la persona, no un dato de sistema: mismo 0600 que el
354
+ // índice.
355
+ writeFileSync(join(carpeta, nombre), datos, { mode: 0o600 });
356
+ return { ok: true };
357
+ },
358
+ listarAdjuntos(tarea) {
359
+ const carpeta = carpetaDeAdjuntos(tarea);
360
+ if (carpeta === undefined || !existsSync(carpeta))
361
+ return [];
362
+ const salida = [];
363
+ for (const nombre of readdirSync(carpeta).sort()) {
364
+ // Solo ficheros llanos y con nombre aceptable: lo que haya llegado ahí por otro
365
+ // camino (una carpeta, un enlace) no es un adjunto, y `lstatSync` es lo que
366
+ // distingue el enlace del fichero al que apunta.
367
+ if (!nombreAceptable(nombre))
368
+ continue;
369
+ let bytes;
370
+ try {
371
+ const info = lstatSync(join(carpeta, nombre));
372
+ if (!info.isFile())
373
+ continue;
374
+ bytes = info.size;
375
+ }
376
+ catch {
377
+ continue;
378
+ }
379
+ const mime = mimeDeAdjunto(nombre);
380
+ salida.push({ nombre, bytes, ...(mime === undefined ? {} : { mime }) });
381
+ }
382
+ return salida;
383
+ },
384
+ carpetaDeAdjuntos,
385
+ borrarTarea(id) {
386
+ if (nombreAceptable(id))
387
+ rmSync(join(base, id), { recursive: true, force: true });
388
+ const { tareas, legible } = leerIndice();
389
+ if (!legible) {
390
+ // Un índice que no se pudo leer no se toca: sobrescribirlo con una lista vacía sería
391
+ // la misma pérdida de datos que la lectura ya evita en `listar()` — sólo que por la
392
+ // puerta de atrás. Y el aviso es el suyo propio, no el de `leerIndice`: ahí no se
393
+ // está enseñando una cola vacía, se está BORRANDO algo y dejando el índice intacto —
394
+ // un aviso que describe la situación equivocada manda a mirar donde no está.
395
+ informar("la tarea se borró del disco, pero el índice no se pudo leer y se deja intacto");
396
+ return;
397
+ }
398
+ guardarIndice(tareas.filter((t) => t.id !== id));
399
+ },
400
+ };
401
+ }
402
+ /**
403
+ * Añade un feedback a una tarea «esperando feedback» y la devuelve al lazo (`nuevo`).
404
+ *
405
+ * §0 del diseño, textual: «se edita la tarea y se agrega el feedback del usuario». Esto es
406
+ * exactamente eso — y nada más: no toca el proyecto, no abre ninguna consola, solo escribe
407
+ * el índice. Quien lo recoge es el corredor, en su siguiente `revisar()`.
408
+ *
409
+ * Solo toma `listar`/`guardar` del puerto, no la interfaz entera: es lo mínimo que hace
410
+ * falta, y es lo que ya usa `atenderCrearTarea`/`atenderAccionDeTarea` en `arranque.ts`
411
+ * (`Pick<TareasEnDisco, "listar" | "guardar" | "borrarTarea">`) — con esto, `aplicarFeedback`
412
+ * encaja ahí sin ensanchar ese tipo.
413
+ *
414
+ * **El rechazo se DEVUELVE, nunca se lanza.** Es la misma regla que `write_file`
415
+ * (`agent/proyecto.ts`): quien llama —el cable, o un test— necesita poder decir por qué sin
416
+ * envolver esto en un `try`, y un `{hecho:false}` es más fácil de propagar hasta una persona
417
+ * que una excepción.
418
+ *
419
+ * **Dos motivos de rechazo, y los dos pasan por `conFeedback`/`conEstado` sin duplicar la
420
+ * lógica aquí**: un feedback en blanco —devolvería la tarea al lazo sin nada nuevo que
421
+ * decirle, el mismo argumento que rechaza un título vacío en `sesiones.ts#renombrarSesion`—
422
+ * y una tarea que no está `requiere-atencion` —no hay pregunta que este feedback esté
423
+ * contestando—. `conEstado` ya sabe decir la segunda (`«nuevo» no puede pasar a «nuevo»`,
424
+ * etc.); repetir esa comprobación aquí sería la misma regla en dos sitios que divergen.
425
+ */
426
+ export function aplicarFeedback(disco, id, texto) {
427
+ const tareas = disco.listar();
428
+ const actual = tareas.find((t) => t.id === id);
429
+ if (actual === undefined) {
430
+ return { hecho: false, motivo: "la tarea ya no está en la cola" };
431
+ }
432
+ let siguiente;
433
+ try {
434
+ siguiente = conFeedback(actual, texto);
435
+ }
436
+ catch (error) {
437
+ return { hecho: false, motivo: error instanceof Error ? error.message : String(error) };
438
+ }
439
+ disco.guardar(tareas.map((t) => (t.id === id ? siguiente : t)));
440
+ return { hecho: true };
441
+ }
442
+ /**
443
+ * ¿Es esa ruta un enlace simbólico? `ENOENT` es «no hay nada ahí», que no es un enlace.
444
+ *
445
+ * `lstatSync` y no `statSync`, que es la misma elección que `ficherosDelProyecto`: `stat`
446
+ * sigue el enlace y contestaría por el destino, o sea justo lo que hay que detectar.
447
+ */
448
+ function esEnlace(ruta) {
449
+ try {
450
+ return lstatSync(ruta).isSymbolicLink();
451
+ }
452
+ catch {
453
+ return false;
454
+ }
455
+ }
456
+ /** `kill(pid, 0)` no manda ninguna señal: solo pregunta si el proceso existe. */
457
+ function estaVivo(pid) {
458
+ try {
459
+ process.kill(pid, 0);
460
+ return true;
461
+ }
462
+ catch {
463
+ return false;
464
+ }
465
+ }
466
+ //# sourceMappingURL=tareasEnDisco.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tareasEnDisco.js","sourceRoot":"","sources":["../../src/agent/tareasEnDisco.ts"],"names":[],"mappings":"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"}