@hoilab/ada-cli 0.84.21 → 0.85.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 (1337) hide show
  1. package/CHANGELOG.md +49 -2
  2. package/README.es.md +174 -0
  3. package/README.md +203 -658
  4. package/dist/ada-publico.d.ts +35 -0
  5. package/dist/ada-publico.d.ts.map +1 -0
  6. package/dist/ada-publico.js +40 -0
  7. package/dist/ada-publico.js.map +1 -0
  8. package/dist/cli/args.d.ts +3 -0
  9. package/dist/cli/args.d.ts.map +1 -1
  10. package/dist/cli/args.js +11 -0
  11. package/dist/cli/args.js.map +1 -1
  12. package/dist/cli/audit-command.d.ts +15 -0
  13. package/dist/cli/audit-command.d.ts.map +1 -0
  14. package/dist/cli/audit-command.js +280 -0
  15. package/dist/cli/audit-command.js.map +1 -0
  16. package/dist/cli/banco-command.d.ts +15 -0
  17. package/dist/cli/banco-command.d.ts.map +1 -0
  18. package/dist/cli/banco-command.js +213 -0
  19. package/dist/cli/banco-command.js.map +1 -0
  20. package/dist/cli/cleanse-command.d.ts +11 -0
  21. package/dist/cli/cleanse-command.d.ts.map +1 -0
  22. package/dist/cli/cleanse-command.js +101 -0
  23. package/dist/cli/cleanse-command.js.map +1 -0
  24. package/dist/cli/commit-command.d.ts +31 -0
  25. package/dist/cli/commit-command.d.ts.map +1 -0
  26. package/dist/cli/commit-command.js +158 -0
  27. package/dist/cli/commit-command.js.map +1 -0
  28. package/dist/cli/computer-command.d.ts +12 -0
  29. package/dist/cli/computer-command.d.ts.map +1 -0
  30. package/dist/cli/computer-command.js +141 -0
  31. package/dist/cli/computer-command.js.map +1 -0
  32. package/dist/cli/discover-command.d.ts +18 -0
  33. package/dist/cli/discover-command.d.ts.map +1 -0
  34. package/dist/cli/discover-command.js +108 -0
  35. package/dist/cli/discover-command.js.map +1 -0
  36. package/dist/cli/file-processor.d.ts.map +1 -1
  37. package/dist/cli/file-processor.js +2 -1
  38. package/dist/cli/file-processor.js.map +1 -1
  39. package/dist/cli/hashline-command.d.ts +11 -0
  40. package/dist/cli/hashline-command.d.ts.map +1 -0
  41. package/dist/cli/hashline-command.js +106 -0
  42. package/dist/cli/hashline-command.js.map +1 -0
  43. package/dist/cli/home-screen.d.ts.map +1 -1
  44. package/dist/cli/home-screen.js +2 -2
  45. package/dist/cli/home-screen.js.map +1 -1
  46. package/dist/cli/import-command.d.ts +35 -0
  47. package/dist/cli/import-command.d.ts.map +1 -0
  48. package/dist/cli/import-command.js +164 -0
  49. package/dist/cli/import-command.js.map +1 -0
  50. package/dist/cli/politica-command.d.ts +20 -0
  51. package/dist/cli/politica-command.d.ts.map +1 -0
  52. package/dist/cli/politica-command.js +93 -0
  53. package/dist/cli/politica-command.js.map +1 -0
  54. package/dist/cli/refine-command.d.ts +18 -0
  55. package/dist/cli/refine-command.d.ts.map +1 -0
  56. package/dist/cli/refine-command.js +101 -0
  57. package/dist/cli/refine-command.js.map +1 -0
  58. package/dist/cli/review-command.d.ts +24 -0
  59. package/dist/cli/review-command.d.ts.map +1 -0
  60. package/dist/cli/review-command.js +168 -0
  61. package/dist/cli/review-command.js.map +1 -0
  62. package/dist/cli/schedule-command.d.ts +17 -0
  63. package/dist/cli/schedule-command.d.ts.map +1 -0
  64. package/dist/cli/schedule-command.js +117 -0
  65. package/dist/cli/schedule-command.js.map +1 -0
  66. package/dist/cli/serve-command.d.ts +72 -0
  67. package/dist/cli/serve-command.d.ts.map +1 -0
  68. package/dist/cli/serve-command.js +568 -0
  69. package/dist/cli/serve-command.js.map +1 -0
  70. package/dist/cli/startup-ui.d.ts.map +1 -1
  71. package/dist/cli/startup-ui.js +9 -3
  72. package/dist/cli/startup-ui.js.map +1 -1
  73. package/dist/cli/telegram-command.d.ts +18 -0
  74. package/dist/cli/telegram-command.d.ts.map +1 -0
  75. package/dist/cli/telegram-command.js +137 -0
  76. package/dist/cli/telegram-command.js.map +1 -0
  77. package/dist/cli/telemetria-command.d.ts +22 -0
  78. package/dist/cli/telemetria-command.d.ts.map +1 -0
  79. package/dist/cli/telemetria-command.js +127 -0
  80. package/dist/cli/telemetria-command.js.map +1 -0
  81. package/dist/cli/undo-command.d.ts +9 -0
  82. package/dist/cli/undo-command.d.ts.map +1 -0
  83. package/dist/cli/undo-command.js +56 -0
  84. package/dist/cli/undo-command.js.map +1 -0
  85. package/dist/cli/usage-command.d.ts +10 -0
  86. package/dist/cli/usage-command.d.ts.map +1 -0
  87. package/dist/cli/usage-command.js +209 -0
  88. package/dist/cli/usage-command.js.map +1 -0
  89. package/dist/cli/wiki-command.d.ts +9 -0
  90. package/dist/cli/wiki-command.d.ts.map +1 -0
  91. package/dist/cli/wiki-command.js +76 -0
  92. package/dist/cli/wiki-command.js.map +1 -0
  93. package/dist/cli.d.ts +6 -0
  94. package/dist/cli.d.ts.map +1 -1
  95. package/dist/cli.js +10 -11
  96. package/dist/cli.js.map +1 -1
  97. package/dist/config.d.ts +1 -1
  98. package/dist/config.d.ts.map +1 -1
  99. package/dist/config.js +3 -2
  100. package/dist/config.js.map +1 -1
  101. package/dist/core/ada.d.ts +58 -0
  102. package/dist/core/ada.d.ts.map +1 -0
  103. package/dist/core/ada.js +61 -0
  104. package/dist/core/ada.js.map +1 -0
  105. package/dist/core/advisor/guarda.d.ts +66 -0
  106. package/dist/core/advisor/guarda.d.ts.map +1 -0
  107. package/dist/core/advisor/guarda.js +191 -0
  108. package/dist/core/advisor/guarda.js.map +1 -0
  109. package/dist/core/advisor/runtime.d.ts +66 -0
  110. package/dist/core/advisor/runtime.d.ts.map +1 -0
  111. package/dist/core/advisor/runtime.js +121 -0
  112. package/dist/core/advisor/runtime.js.map +1 -0
  113. package/dist/core/advisor/sesion.d.ts +109 -0
  114. package/dist/core/advisor/sesion.d.ts.map +1 -0
  115. package/dist/core/advisor/sesion.js +139 -0
  116. package/dist/core/advisor/sesion.js.map +1 -0
  117. package/dist/core/agent-session.d.ts +85 -7
  118. package/dist/core/agent-session.d.ts.map +1 -1
  119. package/dist/core/agent-session.js +862 -78
  120. package/dist/core/agent-session.js.map +1 -1
  121. package/dist/core/agents/loader.d.ts +77 -0
  122. package/dist/core/agents/loader.d.ts.map +1 -0
  123. package/dist/core/agents/loader.js +154 -0
  124. package/dist/core/agents/loader.js.map +1 -0
  125. package/dist/core/aprobacion/generados.d.ts +37 -0
  126. package/dist/core/aprobacion/generados.d.ts.map +1 -0
  127. package/dist/core/aprobacion/generados.js +85 -0
  128. package/dist/core/aprobacion/generados.js.map +1 -0
  129. package/dist/core/aprobacion/politica-de-maquina.d.ts +90 -0
  130. package/dist/core/aprobacion/politica-de-maquina.d.ts.map +1 -0
  131. package/dist/core/aprobacion/politica-de-maquina.js +212 -0
  132. package/dist/core/aprobacion/politica-de-maquina.js.map +1 -0
  133. package/dist/core/aprobacion/politica.d.ts +90 -0
  134. package/dist/core/aprobacion/politica.d.ts.map +1 -0
  135. package/dist/core/aprobacion/politica.js +375 -0
  136. package/dist/core/aprobacion/politica.js.map +1 -0
  137. package/dist/core/arranque/atajos.d.ts +46 -0
  138. package/dist/core/arranque/atajos.d.ts.map +1 -0
  139. package/dist/core/arranque/atajos.js +113 -0
  140. package/dist/core/arranque/atajos.js.map +1 -0
  141. package/dist/core/audit/exportacion.d.ts +54 -0
  142. package/dist/core/audit/exportacion.d.ts.map +1 -0
  143. package/dist/core/audit/exportacion.js +265 -0
  144. package/dist/core/audit/exportacion.js.map +1 -0
  145. package/dist/core/audit/libro.d.ts +318 -0
  146. package/dist/core/audit/libro.d.ts.map +1 -0
  147. package/dist/core/audit/libro.js +508 -0
  148. package/dist/core/audit/libro.js.map +1 -0
  149. package/dist/core/audit/registro-sesion.d.ts +78 -0
  150. package/dist/core/audit/registro-sesion.d.ts.map +1 -0
  151. package/dist/core/audit/registro-sesion.js +202 -0
  152. package/dist/core/audit/registro-sesion.js.map +1 -0
  153. package/dist/core/audit/retencion.d.ts +82 -0
  154. package/dist/core/audit/retencion.d.ts.map +1 -0
  155. package/dist/core/audit/retencion.js +152 -0
  156. package/dist/core/audit/retencion.js.map +1 -0
  157. package/dist/core/audit/rutas.d.ts +23 -0
  158. package/dist/core/audit/rutas.d.ts.map +1 -0
  159. package/dist/core/audit/rutas.js +23 -0
  160. package/dist/core/audit/rutas.js.map +1 -0
  161. package/dist/core/auth-storage.d.ts +0 -3
  162. package/dist/core/auth-storage.d.ts.map +1 -1
  163. package/dist/core/auth-storage.js +21 -8
  164. package/dist/core/auth-storage.js.map +1 -1
  165. package/dist/core/banco/almacenamiento.d.ts +18 -0
  166. package/dist/core/banco/almacenamiento.d.ts.map +1 -0
  167. package/dist/core/banco/almacenamiento.js +50 -0
  168. package/dist/core/banco/almacenamiento.js.map +1 -0
  169. package/dist/core/banco/analisis.d.ts +37 -0
  170. package/dist/core/banco/analisis.d.ts.map +1 -0
  171. package/dist/core/banco/analisis.js +164 -0
  172. package/dist/core/banco/analisis.js.map +1 -0
  173. package/dist/core/banco/bloques.d.ts +39 -0
  174. package/dist/core/banco/bloques.d.ts.map +1 -0
  175. package/dist/core/banco/bloques.js +84 -0
  176. package/dist/core/banco/bloques.js.map +1 -0
  177. package/dist/core/banco/cargas.d.ts +84 -0
  178. package/dist/core/banco/cargas.d.ts.map +1 -0
  179. package/dist/core/banco/cargas.js +520 -0
  180. package/dist/core/banco/cargas.js.map +1 -0
  181. package/dist/core/banco/comparar.d.ts +29 -0
  182. package/dist/core/banco/comparar.d.ts.map +1 -0
  183. package/dist/core/banco/comparar.js +28 -0
  184. package/dist/core/banco/comparar.js.map +1 -0
  185. package/dist/core/banco/ejecutar.d.ts +44 -0
  186. package/dist/core/banco/ejecutar.d.ts.map +1 -0
  187. package/dist/core/banco/ejecutar.js +183 -0
  188. package/dist/core/banco/ejecutar.js.map +1 -0
  189. package/dist/core/banco/generar.d.ts +24 -0
  190. package/dist/core/banco/generar.d.ts.map +1 -0
  191. package/dist/core/banco/generar.js +159 -0
  192. package/dist/core/banco/generar.js.map +1 -0
  193. package/dist/core/banco/mutaciones.d.ts +25 -0
  194. package/dist/core/banco/mutaciones.d.ts.map +1 -0
  195. package/dist/core/banco/mutaciones.js +215 -0
  196. package/dist/core/banco/mutaciones.js.map +1 -0
  197. package/dist/core/banco/tipos.d.ts +121 -0
  198. package/dist/core/banco/tipos.d.ts.map +1 -0
  199. package/dist/core/banco/tipos.js +16 -0
  200. package/dist/core/banco/tipos.js.map +1 -0
  201. package/dist/core/blobs/almacen.d.ts +81 -0
  202. package/dist/core/blobs/almacen.d.ts.map +1 -0
  203. package/dist/core/blobs/almacen.js +198 -0
  204. package/dist/core/blobs/almacen.js.map +1 -0
  205. package/dist/core/blobs/broker.d.ts +103 -0
  206. package/dist/core/blobs/broker.d.ts.map +1 -0
  207. package/dist/core/blobs/broker.js +204 -0
  208. package/dist/core/blobs/broker.js.map +1 -0
  209. package/dist/core/blobs/index.d.ts +70 -0
  210. package/dist/core/blobs/index.d.ts.map +1 -0
  211. package/dist/core/blobs/index.js +232 -0
  212. package/dist/core/blobs/index.js.map +1 -0
  213. package/dist/core/blobs/payload.d.ts +55 -0
  214. package/dist/core/blobs/payload.d.ts.map +1 -0
  215. package/dist/core/blobs/payload.js +255 -0
  216. package/dist/core/blobs/payload.js.map +1 -0
  217. package/dist/core/blobs/proveedor.d.ts +85 -0
  218. package/dist/core/blobs/proveedor.d.ts.map +1 -0
  219. package/dist/core/blobs/proveedor.js +196 -0
  220. package/dist/core/blobs/proveedor.js.map +1 -0
  221. package/dist/core/browser/cdp.d.ts +41 -0
  222. package/dist/core/browser/cdp.d.ts.map +1 -0
  223. package/dist/core/browser/cdp.js +119 -0
  224. package/dist/core/browser/cdp.js.map +1 -0
  225. package/dist/core/browser/politica.d.ts +51 -0
  226. package/dist/core/browser/politica.d.ts.map +1 -0
  227. package/dist/core/browser/politica.js +123 -0
  228. package/dist/core/browser/politica.js.map +1 -0
  229. package/dist/core/browser/sesion.d.ts +52 -0
  230. package/dist/core/browser/sesion.d.ts.map +1 -0
  231. package/dist/core/browser/sesion.js +176 -0
  232. package/dist/core/browser/sesion.js.map +1 -0
  233. package/dist/core/browser/tools.d.ts +16 -0
  234. package/dist/core/browser/tools.d.ts.map +1 -0
  235. package/dist/core/browser/tools.js +279 -0
  236. package/dist/core/browser/tools.js.map +1 -0
  237. package/dist/core/commit/diff.d.ts +56 -0
  238. package/dist/core/commit/diff.d.ts.map +1 -0
  239. package/dist/core/commit/diff.js +145 -0
  240. package/dist/core/commit/diff.js.map +1 -0
  241. package/dist/core/commit/mensaje.d.ts +80 -0
  242. package/dist/core/commit/mensaje.d.ts.map +1 -0
  243. package/dist/core/commit/mensaje.js +207 -0
  244. package/dist/core/commit/mensaje.js.map +1 -0
  245. package/dist/core/compactar/index.d.ts +52 -0
  246. package/dist/core/compactar/index.d.ts.map +1 -0
  247. package/dist/core/compactar/index.js +91 -0
  248. package/dist/core/compactar/index.js.map +1 -0
  249. package/dist/core/compactar/registro-denso.d.ts +160 -0
  250. package/dist/core/compactar/registro-denso.d.ts.map +1 -0
  251. package/dist/core/compactar/registro-denso.js +620 -0
  252. package/dist/core/compactar/registro-denso.js.map +1 -0
  253. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  254. package/dist/core/compaction/branch-summarization.js +3 -0
  255. package/dist/core/compaction/branch-summarization.js.map +1 -1
  256. package/dist/core/compaction/compaction.d.ts +4 -3
  257. package/dist/core/compaction/compaction.d.ts.map +1 -1
  258. package/dist/core/compaction/compaction.js +41 -32
  259. package/dist/core/compaction/compaction.js.map +1 -1
  260. package/dist/core/computer/captura.d.ts +35 -0
  261. package/dist/core/computer/captura.d.ts.map +1 -0
  262. package/dist/core/computer/captura.js +140 -0
  263. package/dist/core/computer/captura.js.map +1 -0
  264. package/dist/core/computer/driver.d.ts +130 -0
  265. package/dist/core/computer/driver.d.ts.map +1 -0
  266. package/dist/core/computer/driver.js +206 -0
  267. package/dist/core/computer/driver.js.map +1 -0
  268. package/dist/core/computer/motor/actions.d.ts +109 -0
  269. package/dist/core/computer/motor/actions.d.ts.map +1 -0
  270. package/dist/core/computer/motor/actions.js +157 -0
  271. package/dist/core/computer/motor/actions.js.map +1 -0
  272. package/dist/core/computer/motor/bridge.d.ts +232 -0
  273. package/dist/core/computer/motor/bridge.d.ts.map +1 -0
  274. package/dist/core/computer/motor/bridge.js +2335 -0
  275. package/dist/core/computer/motor/bridge.js.map +1 -0
  276. package/dist/core/computer/motor/cdp.d.ts +107 -0
  277. package/dist/core/computer/motor/cdp.d.ts.map +1 -0
  278. package/dist/core/computer/motor/cdp.js +659 -0
  279. package/dist/core/computer/motor/cdp.js.map +1 -0
  280. package/dist/core/computer/motor/config.d.ts +23 -0
  281. package/dist/core/computer/motor/config.d.ts.map +1 -0
  282. package/dist/core/computer/motor/config.js +100 -0
  283. package/dist/core/computer/motor/config.js.map +1 -0
  284. package/dist/core/computer/motor/contract.d.ts +81 -0
  285. package/dist/core/computer/motor/contract.d.ts.map +1 -0
  286. package/dist/core/computer/motor/contract.js +14 -0
  287. package/dist/core/computer/motor/contract.js.map +1 -0
  288. package/dist/core/computer/motor/note.d.ts +37 -0
  289. package/dist/core/computer/motor/note.d.ts.map +1 -0
  290. package/dist/core/computer/motor/note.js +162 -0
  291. package/dist/core/computer/motor/note.js.map +1 -0
  292. package/dist/core/computer/motor/outline.d.ts +155 -0
  293. package/dist/core/computer/motor/outline.d.ts.map +1 -0
  294. package/dist/core/computer/motor/outline.js +590 -0
  295. package/dist/core/computer/motor/outline.js.map +1 -0
  296. package/dist/core/computer/motor/output.d.ts +18 -0
  297. package/dist/core/computer/motor/output.d.ts.map +1 -0
  298. package/dist/core/computer/motor/output.js +148 -0
  299. package/dist/core/computer/motor/output.js.map +1 -0
  300. package/dist/core/computer/motor/permissions.d.ts +41 -0
  301. package/dist/core/computer/motor/permissions.d.ts.map +1 -0
  302. package/dist/core/computer/motor/permissions.js +51 -0
  303. package/dist/core/computer/motor/permissions.js.map +1 -0
  304. package/dist/core/computer/motor/platform/architecture.d.ts +5 -0
  305. package/dist/core/computer/motor/platform/architecture.d.ts.map +1 -0
  306. package/dist/core/computer/motor/platform/architecture.js +21 -0
  307. package/dist/core/computer/motor/platform/architecture.js.map +1 -0
  308. package/dist/core/computer/motor/platform/coerce.d.ts +4 -0
  309. package/dist/core/computer/motor/platform/coerce.d.ts.map +1 -0
  310. package/dist/core/computer/motor/platform/coerce.js +17 -0
  311. package/dist/core/computer/motor/platform/coerce.js.map +1 -0
  312. package/dist/core/computer/motor/platform/index.d.ts +4 -0
  313. package/dist/core/computer/motor/platform/index.d.ts.map +1 -0
  314. package/dist/core/computer/motor/platform/index.js +79 -0
  315. package/dist/core/computer/motor/platform/index.js.map +1 -0
  316. package/dist/core/computer/motor/platform/linux/backend.d.ts +3 -0
  317. package/dist/core/computer/motor/platform/linux/backend.d.ts.map +1 -0
  318. package/dist/core/computer/motor/platform/linux/backend.js +173 -0
  319. package/dist/core/computer/motor/platform/linux/backend.js.map +1 -0
  320. package/dist/core/computer/motor/platform/linux/helper.d.ts +29 -0
  321. package/dist/core/computer/motor/platform/linux/helper.d.ts.map +1 -0
  322. package/dist/core/computer/motor/platform/linux/helper.js +261 -0
  323. package/dist/core/computer/motor/platform/linux/helper.js.map +1 -0
  324. package/dist/core/computer/motor/platform/macos/backend.d.ts +3 -0
  325. package/dist/core/computer/motor/platform/macos/backend.d.ts.map +1 -0
  326. package/dist/core/computer/motor/platform/macos/backend.js +124 -0
  327. package/dist/core/computer/motor/platform/macos/backend.js.map +1 -0
  328. package/dist/core/computer/motor/platform/macos/browser.d.ts +7 -0
  329. package/dist/core/computer/motor/platform/macos/browser.d.ts.map +1 -0
  330. package/dist/core/computer/motor/platform/macos/browser.js +101 -0
  331. package/dist/core/computer/motor/platform/macos/browser.js.map +1 -0
  332. package/dist/core/computer/motor/platform/macos/helper-path.mjs +34 -0
  333. package/dist/core/computer/motor/platform/macos/helper.d.ts +32 -0
  334. package/dist/core/computer/motor/platform/macos/helper.d.ts.map +1 -0
  335. package/dist/core/computer/motor/platform/macos/helper.js +277 -0
  336. package/dist/core/computer/motor/platform/macos/helper.js.map +1 -0
  337. package/dist/core/computer/motor/platform/macos/permissions.d.ts +4 -0
  338. package/dist/core/computer/motor/platform/macos/permissions.d.ts.map +1 -0
  339. package/dist/core/computer/motor/platform/macos/permissions.js +118 -0
  340. package/dist/core/computer/motor/platform/macos/permissions.js.map +1 -0
  341. package/dist/core/computer/motor/platform/types.d.ts +263 -0
  342. package/dist/core/computer/motor/platform/types.d.ts.map +1 -0
  343. package/dist/core/computer/motor/platform/types.js +2 -0
  344. package/dist/core/computer/motor/platform/types.js.map +1 -0
  345. package/dist/core/computer/motor/platform/windows/backend.d.ts +3 -0
  346. package/dist/core/computer/motor/platform/windows/backend.d.ts.map +1 -0
  347. package/dist/core/computer/motor/platform/windows/backend.js +163 -0
  348. package/dist/core/computer/motor/platform/windows/backend.js.map +1 -0
  349. package/dist/core/computer/motor/platform/windows/helper.d.ts +18 -0
  350. package/dist/core/computer/motor/platform/windows/helper.d.ts.map +1 -0
  351. package/dist/core/computer/motor/platform/windows/helper.js +174 -0
  352. package/dist/core/computer/motor/platform/windows/helper.js.map +1 -0
  353. package/dist/core/computer/motor/root-selection.d.ts +6 -0
  354. package/dist/core/computer/motor/root-selection.d.ts.map +1 -0
  355. package/dist/core/computer/motor/root-selection.js +28 -0
  356. package/dist/core/computer/motor/root-selection.js.map +1 -0
  357. package/dist/core/computer/motor/runtime.d.ts +50 -0
  358. package/dist/core/computer/motor/runtime.d.ts.map +1 -0
  359. package/dist/core/computer/motor/runtime.js +119 -0
  360. package/dist/core/computer/motor/runtime.js.map +1 -0
  361. package/dist/core/computer/motor/state.d.ts +68 -0
  362. package/dist/core/computer/motor/state.d.ts.map +1 -0
  363. package/dist/core/computer/motor/state.js +100 -0
  364. package/dist/core/computer/motor/state.js.map +1 -0
  365. package/dist/core/computer/motor/view.d.ts +6 -0
  366. package/dist/core/computer/motor/view.d.ts.map +1 -0
  367. package/dist/core/computer/motor/view.js +185 -0
  368. package/dist/core/computer/motor/view.js.map +1 -0
  369. package/dist/core/computer/motor-ada.d.ts +159 -0
  370. package/dist/core/computer/motor-ada.d.ts.map +1 -0
  371. package/dist/core/computer/motor-ada.js +412 -0
  372. package/dist/core/computer/motor-ada.js.map +1 -0
  373. package/dist/core/computer/politica.d.ts +56 -0
  374. package/dist/core/computer/politica.d.ts.map +1 -0
  375. package/dist/core/computer/politica.js +163 -0
  376. package/dist/core/computer/politica.js.map +1 -0
  377. package/dist/core/computer/tools.d.ts +26 -0
  378. package/dist/core/computer/tools.d.ts.map +1 -0
  379. package/dist/core/computer/tools.js +399 -0
  380. package/dist/core/computer/tools.js.map +1 -0
  381. package/dist/core/context-breakdown.d.ts +80 -0
  382. package/dist/core/context-breakdown.d.ts.map +1 -0
  383. package/dist/core/context-breakdown.js +87 -0
  384. package/dist/core/context-breakdown.js.map +1 -0
  385. package/dist/core/credenciales/cliente.d.ts +60 -0
  386. package/dist/core/credenciales/cliente.d.ts.map +1 -0
  387. package/dist/core/credenciales/cliente.js +81 -0
  388. package/dist/core/credenciales/cliente.js.map +1 -0
  389. package/dist/core/credenciales/pool.d.ts +96 -0
  390. package/dist/core/credenciales/pool.d.ts.map +1 -0
  391. package/dist/core/credenciales/pool.js +128 -0
  392. package/dist/core/credenciales/pool.js.map +1 -0
  393. package/dist/core/credenciales/reposo.d.ts +93 -0
  394. package/dist/core/credenciales/reposo.d.ts.map +1 -0
  395. package/dist/core/credenciales/reposo.js +489 -0
  396. package/dist/core/credenciales/reposo.js.map +1 -0
  397. package/dist/core/credenciales/servidor.d.ts +55 -0
  398. package/dist/core/credenciales/servidor.d.ts.map +1 -0
  399. package/dist/core/credenciales/servidor.js +205 -0
  400. package/dist/core/credenciales/servidor.js.map +1 -0
  401. package/dist/core/defaults.d.ts +1 -0
  402. package/dist/core/defaults.d.ts.map +1 -1
  403. package/dist/core/defaults.js +9 -0
  404. package/dist/core/defaults.js.map +1 -1
  405. package/dist/core/descubrimiento/comandos.d.ts +30 -0
  406. package/dist/core/descubrimiento/comandos.d.ts.map +1 -0
  407. package/dist/core/descubrimiento/comandos.js +76 -0
  408. package/dist/core/descubrimiento/comandos.js.map +1 -0
  409. package/dist/core/descubrimiento/mcp.d.ts +42 -0
  410. package/dist/core/descubrimiento/mcp.d.ts.map +1 -0
  411. package/dist/core/descubrimiento/mcp.js +130 -0
  412. package/dist/core/descubrimiento/mcp.js.map +1 -0
  413. package/dist/core/descubrimiento/reglas.d.ts +61 -0
  414. package/dist/core/descubrimiento/reglas.d.ts.map +1 -0
  415. package/dist/core/descubrimiento/reglas.js +134 -0
  416. package/dist/core/descubrimiento/reglas.js.map +1 -0
  417. package/dist/core/descubrimiento/skills.d.ts +57 -0
  418. package/dist/core/descubrimiento/skills.d.ts.map +1 -0
  419. package/dist/core/descubrimiento/skills.js +113 -0
  420. package/dist/core/descubrimiento/skills.js.map +1 -0
  421. package/dist/core/dificultad/clasificador.d.ts +133 -0
  422. package/dist/core/dificultad/clasificador.d.ts.map +1 -0
  423. package/dist/core/dificultad/clasificador.js +288 -0
  424. package/dist/core/dificultad/clasificador.js.map +1 -0
  425. package/dist/core/edicion/diario.d.ts +37 -0
  426. package/dist/core/edicion/diario.d.ts.map +1 -0
  427. package/dist/core/edicion/diario.js +51 -0
  428. package/dist/core/edicion/diario.js.map +1 -0
  429. package/dist/core/edicion/hashline.d.ts +71 -0
  430. package/dist/core/edicion/hashline.d.ts.map +1 -0
  431. package/dist/core/edicion/hashline.js +111 -0
  432. package/dist/core/edicion/hashline.js.map +1 -0
  433. package/dist/core/edicion/hueco.d.ts +64 -0
  434. package/dist/core/edicion/hueco.d.ts.map +1 -0
  435. package/dist/core/edicion/hueco.js +162 -0
  436. package/dist/core/edicion/hueco.js.map +1 -0
  437. package/dist/core/edicion/limpiar-carga.d.ts +39 -0
  438. package/dist/core/edicion/limpiar-carga.d.ts.map +1 -0
  439. package/dist/core/edicion/limpiar-carga.js +121 -0
  440. package/dist/core/edicion/limpiar-carga.js.map +1 -0
  441. package/dist/core/edicion/observador.d.ts +80 -0
  442. package/dist/core/edicion/observador.d.ts.map +1 -0
  443. package/dist/core/edicion/observador.js +183 -0
  444. package/dist/core/edicion/observador.js.map +1 -0
  445. package/dist/core/edicion/parecido.d.ts +53 -0
  446. package/dist/core/edicion/parecido.d.ts.map +1 -0
  447. package/dist/core/edicion/parecido.js +145 -0
  448. package/dist/core/edicion/parecido.js.map +1 -0
  449. package/dist/core/edicion/parseo.d.ts +58 -0
  450. package/dist/core/edicion/parseo.d.ts.map +1 -0
  451. package/dist/core/edicion/parseo.js +124 -0
  452. package/dist/core/edicion/parseo.js.map +1 -0
  453. package/dist/core/edicion/reparacion.d.ts +67 -0
  454. package/dist/core/edicion/reparacion.d.ts.map +1 -0
  455. package/dist/core/edicion/reparacion.js +202 -0
  456. package/dist/core/edicion/reparacion.js.map +1 -0
  457. package/dist/core/edicion/sangria.d.ts +121 -0
  458. package/dist/core/edicion/sangria.d.ts.map +1 -0
  459. package/dist/core/edicion/sangria.js +341 -0
  460. package/dist/core/edicion/sangria.js.map +1 -0
  461. package/dist/core/edicion/tipos.d.ts +58 -0
  462. package/dist/core/edicion/tipos.d.ts.map +1 -0
  463. package/dist/core/edicion/tipos.js +160 -0
  464. package/dist/core/edicion/tipos.js.map +1 -0
  465. package/dist/core/engine-personality.d.ts +12 -0
  466. package/dist/core/engine-personality.d.ts.map +1 -0
  467. package/dist/core/engine-personality.js +53 -0
  468. package/dist/core/engine-personality.js.map +1 -0
  469. package/dist/core/errores/proveedor.d.ts +53 -0
  470. package/dist/core/errores/proveedor.d.ts.map +1 -0
  471. package/dist/core/errores/proveedor.js +191 -0
  472. package/dist/core/errores/proveedor.js.map +1 -0
  473. package/dist/core/estructural/buscar.d.ts +61 -0
  474. package/dist/core/estructural/buscar.d.ts.map +1 -0
  475. package/dist/core/estructural/buscar.js +261 -0
  476. package/dist/core/estructural/buscar.js.map +1 -0
  477. package/dist/core/estructural/editar.d.ts +36 -0
  478. package/dist/core/estructural/editar.d.ts.map +1 -0
  479. package/dist/core/estructural/editar.js +123 -0
  480. package/dist/core/estructural/editar.js.map +1 -0
  481. package/dist/core/estructural/tools.d.ts +11 -0
  482. package/dist/core/estructural/tools.d.ts.map +1 -0
  483. package/dist/core/estructural/tools.js +100 -0
  484. package/dist/core/estructural/tools.js.map +1 -0
  485. package/dist/core/experimental.d.ts.map +1 -1
  486. package/dist/core/experimental.js +10 -1
  487. package/dist/core/experimental.js.map +1 -1
  488. package/dist/core/extensiones/suplantacion.d.ts +49 -0
  489. package/dist/core/extensiones/suplantacion.d.ts.map +1 -0
  490. package/dist/core/extensiones/suplantacion.js +61 -0
  491. package/dist/core/extensiones/suplantacion.js.map +1 -0
  492. package/dist/core/extensiones/vigilancia.d.ts +54 -0
  493. package/dist/core/extensiones/vigilancia.d.ts.map +1 -0
  494. package/dist/core/extensiones/vigilancia.js +217 -0
  495. package/dist/core/extensiones/vigilancia.js.map +1 -0
  496. package/dist/core/extensions/index.d.ts +1 -1
  497. package/dist/core/extensions/index.d.ts.map +1 -1
  498. package/dist/core/extensions/index.js.map +1 -1
  499. package/dist/core/extensions/loader.d.ts.map +1 -1
  500. package/dist/core/extensions/loader.js +21 -6
  501. package/dist/core/extensions/loader.js.map +1 -1
  502. package/dist/core/extensions/types.d.ts +23 -4
  503. package/dist/core/extensions/types.d.ts.map +1 -1
  504. package/dist/core/extensions/types.js.map +1 -1
  505. package/dist/core/harness/fuentes-de-contexto.d.ts +29 -0
  506. package/dist/core/harness/fuentes-de-contexto.d.ts.map +1 -0
  507. package/dist/core/harness/fuentes-de-contexto.js +44 -0
  508. package/dist/core/harness/fuentes-de-contexto.js.map +1 -0
  509. package/dist/core/harness/refine.d.ts +40 -0
  510. package/dist/core/harness/refine.d.ts.map +1 -0
  511. package/dist/core/harness/refine.js +109 -0
  512. package/dist/core/harness/refine.js.map +1 -0
  513. package/dist/core/harness/store.d.ts +75 -0
  514. package/dist/core/harness/store.d.ts.map +1 -0
  515. package/dist/core/harness/store.js +149 -0
  516. package/dist/core/harness/store.js.map +1 -0
  517. package/dist/core/hooks/contract.d.ts +85 -0
  518. package/dist/core/hooks/contract.d.ts.map +1 -0
  519. package/dist/core/hooks/contract.js +140 -0
  520. package/dist/core/hooks/contract.js.map +1 -0
  521. package/dist/core/hooks/runner.d.ts +42 -0
  522. package/dist/core/hooks/runner.d.ts.map +1 -0
  523. package/dist/core/hooks/runner.js +85 -0
  524. package/dist/core/hooks/runner.js.map +1 -0
  525. package/dist/core/hooks/session-hooks.d.ts +62 -0
  526. package/dist/core/hooks/session-hooks.d.ts.map +1 -0
  527. package/dist/core/hooks/session-hooks.js +84 -0
  528. package/dist/core/hooks/session-hooks.js.map +1 -0
  529. package/dist/core/importar/formatos.d.ts +69 -0
  530. package/dist/core/importar/formatos.d.ts.map +1 -0
  531. package/dist/core/importar/formatos.js +235 -0
  532. package/dist/core/importar/formatos.js.map +1 -0
  533. package/dist/core/interactivo/deteccion.d.ts +44 -0
  534. package/dist/core/interactivo/deteccion.d.ts.map +1 -0
  535. package/dist/core/interactivo/deteccion.js +82 -0
  536. package/dist/core/interactivo/deteccion.js.map +1 -0
  537. package/dist/core/interactivo/sesion.d.ts +50 -0
  538. package/dist/core/interactivo/sesion.d.ts.map +1 -0
  539. package/dist/core/interactivo/sesion.js +156 -0
  540. package/dist/core/interactivo/sesion.js.map +1 -0
  541. package/dist/core/interactivo/tools.d.ts +21 -0
  542. package/dist/core/interactivo/tools.d.ts.map +1 -0
  543. package/dist/core/interactivo/tools.js +122 -0
  544. package/dist/core/interactivo/tools.js.map +1 -0
  545. package/dist/core/keybindings.d.ts.map +1 -1
  546. package/dist/core/keybindings.js +2 -1
  547. package/dist/core/keybindings.js.map +1 -1
  548. package/dist/core/lectura/mapa.d.ts +70 -0
  549. package/dist/core/lectura/mapa.d.ts.map +1 -0
  550. package/dist/core/lectura/mapa.js +177 -0
  551. package/dist/core/lectura/mapa.js.map +1 -0
  552. package/dist/core/lectura/pdf.d.ts +49 -0
  553. package/dist/core/lectura/pdf.d.ts.map +1 -0
  554. package/dist/core/lectura/pdf.js +337 -0
  555. package/dist/core/lectura/pdf.js.map +1 -0
  556. package/dist/core/limpieza/comprobadores.d.ts +28 -0
  557. package/dist/core/limpieza/comprobadores.d.ts.map +1 -0
  558. package/dist/core/limpieza/comprobadores.js +311 -0
  559. package/dist/core/limpieza/comprobadores.js.map +1 -0
  560. package/dist/core/limpieza/parseo.d.ts +19 -0
  561. package/dist/core/limpieza/parseo.d.ts.map +1 -0
  562. package/dist/core/limpieza/parseo.js +124 -0
  563. package/dist/core/limpieza/parseo.js.map +1 -0
  564. package/dist/core/limpieza/reparacion.d.ts +77 -0
  565. package/dist/core/limpieza/reparacion.d.ts.map +1 -0
  566. package/dist/core/limpieza/reparacion.js +254 -0
  567. package/dist/core/limpieza/reparacion.js.map +1 -0
  568. package/dist/core/limpieza/tipos.d.ts +56 -0
  569. package/dist/core/limpieza/tipos.d.ts.map +1 -0
  570. package/dist/core/limpieza/tipos.js +9 -0
  571. package/dist/core/limpieza/tipos.js.map +1 -0
  572. package/dist/core/lsp/cliente.d.ts +52 -0
  573. package/dist/core/lsp/cliente.d.ts.map +1 -0
  574. package/dist/core/lsp/cliente.js +232 -0
  575. package/dist/core/lsp/cliente.js.map +1 -0
  576. package/dist/core/lsp/descubrimiento.d.ts +62 -0
  577. package/dist/core/lsp/descubrimiento.d.ts.map +1 -0
  578. package/dist/core/lsp/descubrimiento.js +152 -0
  579. package/dist/core/lsp/descubrimiento.js.map +1 -0
  580. package/dist/core/lsp/ediciones.d.ts +59 -0
  581. package/dist/core/lsp/ediciones.d.ts.map +1 -0
  582. package/dist/core/lsp/ediciones.js +89 -0
  583. package/dist/core/lsp/ediciones.js.map +1 -0
  584. package/dist/core/lsp/extension.d.ts +28 -0
  585. package/dist/core/lsp/extension.d.ts.map +1 -0
  586. package/dist/core/lsp/extension.js +34 -0
  587. package/dist/core/lsp/extension.js.map +1 -0
  588. package/dist/core/lsp/tools.d.ts +45 -0
  589. package/dist/core/lsp/tools.d.ts.map +1 -0
  590. package/dist/core/lsp/tools.js +265 -0
  591. package/dist/core/lsp/tools.js.map +1 -0
  592. package/dist/core/mcp/client.d.ts +60 -0
  593. package/dist/core/mcp/client.d.ts.map +1 -0
  594. package/dist/core/mcp/client.js +139 -0
  595. package/dist/core/mcp/client.js.map +1 -0
  596. package/dist/core/mcp/manager.d.ts +86 -0
  597. package/dist/core/mcp/manager.d.ts.map +1 -0
  598. package/dist/core/mcp/manager.js +124 -0
  599. package/dist/core/mcp/manager.js.map +1 -0
  600. package/dist/core/mcp/tools.d.ts +15 -0
  601. package/dist/core/mcp/tools.d.ts.map +1 -0
  602. package/dist/core/mcp/tools.js +84 -0
  603. package/dist/core/mcp/tools.js.map +1 -0
  604. package/dist/core/memory-engine/audit-export.d.ts +56 -0
  605. package/dist/core/memory-engine/audit-export.d.ts.map +1 -0
  606. package/dist/core/memory-engine/audit-export.js +100 -0
  607. package/dist/core/memory-engine/audit-export.js.map +1 -0
  608. package/dist/core/memory-engine/audit-indice.d.ts +153 -0
  609. package/dist/core/memory-engine/audit-indice.d.ts.map +1 -0
  610. package/dist/core/memory-engine/audit-indice.js +271 -0
  611. package/dist/core/memory-engine/audit-indice.js.map +1 -0
  612. package/dist/core/memory-engine/audit.d.ts +18 -6
  613. package/dist/core/memory-engine/audit.d.ts.map +1 -1
  614. package/dist/core/memory-engine/audit.js +32 -50
  615. package/dist/core/memory-engine/audit.js.map +1 -1
  616. package/dist/core/memory-engine/engine.d.ts +21 -4
  617. package/dist/core/memory-engine/engine.d.ts.map +1 -1
  618. package/dist/core/memory-engine/engine.js +219 -55
  619. package/dist/core/memory-engine/engine.js.map +1 -1
  620. package/dist/core/memory-engine/inverted-index.d.ts.map +1 -1
  621. package/dist/core/memory-engine/inverted-index.js +67 -10
  622. package/dist/core/memory-engine/inverted-index.js.map +1 -1
  623. package/dist/core/memory-engine/keychain.d.ts.map +1 -1
  624. package/dist/core/memory-engine/keychain.js +1 -6
  625. package/dist/core/memory-engine/keychain.js.map +1 -1
  626. package/dist/core/memory-engine/observation-store.d.ts +0 -1
  627. package/dist/core/memory-engine/observation-store.d.ts.map +1 -1
  628. package/dist/core/memory-engine/observation-store.js +40 -12
  629. package/dist/core/memory-engine/observation-store.js.map +1 -1
  630. package/dist/core/memory-engine/refinements.d.ts +51 -0
  631. package/dist/core/memory-engine/refinements.d.ts.map +1 -0
  632. package/dist/core/memory-engine/refinements.js +99 -0
  633. package/dist/core/memory-engine/refinements.js.map +1 -0
  634. package/dist/core/memory-engine/scanner.d.ts.map +1 -1
  635. package/dist/core/memory-engine/scanner.js +25 -5
  636. package/dist/core/memory-engine/scanner.js.map +1 -1
  637. package/dist/core/memory-engine/security.d.ts.map +1 -1
  638. package/dist/core/memory-engine/security.js +131 -23
  639. package/dist/core/memory-engine/security.js.map +1 -1
  640. package/dist/core/memory-engine/session-indexer.d.ts.map +1 -1
  641. package/dist/core/memory-engine/session-indexer.js +8 -2
  642. package/dist/core/memory-engine/session-indexer.js.map +1 -1
  643. package/dist/core/memory-engine/tools.d.ts +2 -2
  644. package/dist/core/memory-engine/tools.d.ts.map +1 -1
  645. package/dist/core/memory-engine/tools.js +41 -8
  646. package/dist/core/memory-engine/tools.js.map +1 -1
  647. package/dist/core/memory-engine/types.d.ts +2 -0
  648. package/dist/core/memory-engine/types.d.ts.map +1 -1
  649. package/dist/core/memory-engine/types.js.map +1 -1
  650. package/dist/core/memory-engine/vault.d.ts.map +1 -1
  651. package/dist/core/memory-engine/vault.js +2 -2
  652. package/dist/core/memory-engine/vault.js.map +1 -1
  653. package/dist/core/model-config.d.ts.map +1 -1
  654. package/dist/core/model-config.js +2 -1
  655. package/dist/core/model-config.js.map +1 -1
  656. package/dist/core/model-resolver.d.ts +1 -0
  657. package/dist/core/model-resolver.d.ts.map +1 -1
  658. package/dist/core/model-resolver.js +19 -7
  659. package/dist/core/model-resolver.js.map +1 -1
  660. package/dist/core/models-store.d.ts.map +1 -1
  661. package/dist/core/models-store.js +2 -1
  662. package/dist/core/models-store.js.map +1 -1
  663. package/dist/core/muestreo-restringido.d.ts +49 -0
  664. package/dist/core/muestreo-restringido.d.ts.map +1 -0
  665. package/dist/core/muestreo-restringido.js +65 -0
  666. package/dist/core/muestreo-restringido.js.map +1 -0
  667. package/dist/core/orphan-process-journal.d.ts +48 -0
  668. package/dist/core/orphan-process-journal.d.ts.map +1 -0
  669. package/dist/core/orphan-process-journal.js +116 -0
  670. package/dist/core/orphan-process-journal.js.map +1 -0
  671. package/dist/core/package-manager.d.ts.map +1 -1
  672. package/dist/core/package-manager.js +11 -6
  673. package/dist/core/package-manager.js.map +1 -1
  674. package/dist/core/pi-manifest.d.ts.map +1 -1
  675. package/dist/core/pi-manifest.js +2 -1
  676. package/dist/core/pi-manifest.js.map +1 -1
  677. package/dist/core/privacidad/categorias-especiales.d.ts +186 -0
  678. package/dist/core/privacidad/categorias-especiales.d.ts.map +1 -0
  679. package/dist/core/privacidad/categorias-especiales.js +745 -0
  680. package/dist/core/privacidad/categorias-especiales.js.map +1 -0
  681. package/dist/core/privacidad/tapar.d.ts +48 -0
  682. package/dist/core/privacidad/tapar.d.ts.map +1 -0
  683. package/dist/core/privacidad/tapar.js +66 -0
  684. package/dist/core/privacidad/tapar.js.map +1 -0
  685. package/dist/core/prompt-cache/diagnostics.d.ts +33 -0
  686. package/dist/core/prompt-cache/diagnostics.d.ts.map +1 -0
  687. package/dist/core/prompt-cache/diagnostics.js +100 -0
  688. package/dist/core/prompt-cache/diagnostics.js.map +1 -0
  689. package/dist/core/prompt-cache/index.d.ts +33 -0
  690. package/dist/core/prompt-cache/index.d.ts.map +1 -0
  691. package/dist/core/prompt-cache/index.js +189 -0
  692. package/dist/core/prompt-cache/index.js.map +1 -0
  693. package/dist/core/prompt-cache/payload.d.ts +58 -0
  694. package/dist/core/prompt-cache/payload.d.ts.map +1 -0
  695. package/dist/core/prompt-cache/payload.js +122 -0
  696. package/dist/core/prompt-cache/payload.js.map +1 -0
  697. package/dist/core/prompt-cache/stabilize.d.ts +65 -0
  698. package/dist/core/prompt-cache/stabilize.d.ts.map +1 -0
  699. package/dist/core/prompt-cache/stabilize.js +137 -0
  700. package/dist/core/prompt-cache/stabilize.js.map +1 -0
  701. package/dist/core/prompt-cache/stats.d.ts +55 -0
  702. package/dist/core/prompt-cache/stats.d.ts.map +1 -0
  703. package/dist/core/prompt-cache/stats.js +158 -0
  704. package/dist/core/prompt-cache/stats.js.map +1 -0
  705. package/dist/core/prompt-eleccion.d.ts +38 -0
  706. package/dist/core/prompt-eleccion.d.ts.map +1 -0
  707. package/dist/core/prompt-eleccion.js +46 -0
  708. package/dist/core/prompt-eleccion.js.map +1 -0
  709. package/dist/core/prompt-optimizer.d.ts +53 -0
  710. package/dist/core/prompt-optimizer.d.ts.map +1 -0
  711. package/dist/core/prompt-optimizer.js +138 -0
  712. package/dist/core/prompt-optimizer.js.map +1 -0
  713. package/dist/core/prompts/montar.d.ts +75 -0
  714. package/dist/core/prompts/montar.d.ts.map +1 -0
  715. package/dist/core/prompts/montar.js +146 -0
  716. package/dist/core/prompts/montar.js.map +1 -0
  717. package/dist/core/prompts/plantilla.d.ts +54 -0
  718. package/dist/core/prompts/plantilla.d.ts.map +1 -0
  719. package/dist/core/prompts/plantilla.js +153 -0
  720. package/dist/core/prompts/plantilla.js.map +1 -0
  721. package/dist/core/prompts/sistema.md +134 -0
  722. package/dist/core/provider-attribution.d.ts +24 -2
  723. package/dist/core/provider-attribution.d.ts.map +1 -1
  724. package/dist/core/provider-attribution.js +24 -42
  725. package/dist/core/provider-attribution.js.map +1 -1
  726. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  727. package/dist/core/remote-catalog-provider.js +2 -1
  728. package/dist/core/remote-catalog-provider.js.map +1 -1
  729. package/dist/core/remoto/destino.d.ts +38 -0
  730. package/dist/core/remoto/destino.d.ts.map +1 -0
  731. package/dist/core/remoto/destino.js +105 -0
  732. package/dist/core/remoto/destino.js.map +1 -0
  733. package/dist/core/remoto/ejecutor.d.ts +59 -0
  734. package/dist/core/remoto/ejecutor.d.ts.map +1 -0
  735. package/dist/core/remoto/ejecutor.js +225 -0
  736. package/dist/core/remoto/ejecutor.js.map +1 -0
  737. package/dist/core/remoto/ficheros.d.ts +29 -0
  738. package/dist/core/remoto/ficheros.d.ts.map +1 -0
  739. package/dist/core/remoto/ficheros.js +90 -0
  740. package/dist/core/remoto/ficheros.js.map +1 -0
  741. package/dist/core/remoto/registro-extension.d.ts +15 -0
  742. package/dist/core/remoto/registro-extension.d.ts.map +1 -0
  743. package/dist/core/remoto/registro-extension.js +17 -0
  744. package/dist/core/remoto/registro-extension.js.map +1 -0
  745. package/dist/core/remoto/tools.d.ts +28 -0
  746. package/dist/core/remoto/tools.d.ts.map +1 -0
  747. package/dist/core/remoto/tools.js +31 -0
  748. package/dist/core/remoto/tools.js.map +1 -0
  749. package/dist/core/resource-loader.d.ts +58 -0
  750. package/dist/core/resource-loader.d.ts.map +1 -1
  751. package/dist/core/resource-loader.js +326 -8
  752. package/dist/core/resource-loader.js.map +1 -1
  753. package/dist/core/revision/hallazgo.d.ts +51 -0
  754. package/dist/core/revision/hallazgo.d.ts.map +1 -0
  755. package/dist/core/revision/hallazgo.js +73 -0
  756. package/dist/core/revision/hallazgo.js.map +1 -0
  757. package/dist/core/revision/revisor.d.ts +81 -0
  758. package/dist/core/revision/revisor.d.ts.map +1 -0
  759. package/dist/core/revision/revisor.js +132 -0
  760. package/dist/core/revision/revisor.js.map +1 -0
  761. package/dist/core/revision/sarif.d.ts +30 -0
  762. package/dist/core/revision/sarif.d.ts.map +1 -0
  763. package/dist/core/revision/sarif.js +83 -0
  764. package/dist/core/revision/sarif.js.map +1 -0
  765. package/dist/core/scheduler/scheduler.d.ts +87 -0
  766. package/dist/core/scheduler/scheduler.d.ts.map +1 -0
  767. package/dist/core/scheduler/scheduler.js +178 -0
  768. package/dist/core/scheduler/scheduler.js.map +1 -0
  769. package/dist/core/sdk.d.ts +8 -0
  770. package/dist/core/sdk.d.ts.map +1 -1
  771. package/dist/core/sdk.js +11 -1
  772. package/dist/core/sdk.js.map +1 -1
  773. package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts +49 -0
  774. package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts.map +1 -0
  775. package/dist/core/sesion/cerrar-llamadas-abiertas.js +77 -0
  776. package/dist/core/sesion/cerrar-llamadas-abiertas.js.map +1 -0
  777. package/dist/core/session-manager.d.ts.map +1 -1
  778. package/dist/core/session-manager.js +2 -1
  779. package/dist/core/session-manager.js.map +1 -1
  780. package/dist/core/settings-diagnostics.d.ts +9 -0
  781. package/dist/core/settings-diagnostics.d.ts.map +1 -0
  782. package/dist/core/settings-diagnostics.js +21 -0
  783. package/dist/core/settings-diagnostics.js.map +1 -0
  784. package/dist/core/settings-manager.d.ts +156 -0
  785. package/dist/core/settings-manager.d.ts.map +1 -1
  786. package/dist/core/settings-manager.js +255 -10
  787. package/dist/core/settings-manager.js.map +1 -1
  788. package/dist/core/skills.d.ts.map +1 -1
  789. package/dist/core/skills.js +51 -33
  790. package/dist/core/skills.js.map +1 -1
  791. package/dist/core/slash-commands.d.ts.map +1 -1
  792. package/dist/core/slash-commands.js +2 -1
  793. package/dist/core/slash-commands.js.map +1 -1
  794. package/dist/core/system-prompt.d.ts +17 -0
  795. package/dist/core/system-prompt.d.ts.map +1 -1
  796. package/dist/core/system-prompt.js +13 -5
  797. package/dist/core/system-prompt.js.map +1 -1
  798. package/dist/core/telemetria/otlp.d.ts +122 -0
  799. package/dist/core/telemetria/otlp.d.ts.map +1 -0
  800. package/dist/core/telemetria/otlp.js +373 -0
  801. package/dist/core/telemetria/otlp.js.map +1 -0
  802. package/dist/core/tools/coercion-argumentos.d.ts +48 -0
  803. package/dist/core/tools/coercion-argumentos.d.ts.map +1 -0
  804. package/dist/core/tools/coercion-argumentos.js +99 -0
  805. package/dist/core/tools/coercion-argumentos.js.map +1 -0
  806. package/dist/core/tools/edit-diff.d.ts +0 -12
  807. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  808. package/dist/core/tools/edit-diff.js +234 -12
  809. package/dist/core/tools/edit-diff.js.map +1 -1
  810. package/dist/core/tools/edit.d.ts.map +1 -1
  811. package/dist/core/tools/edit.js +28 -5
  812. package/dist/core/tools/edit.js.map +1 -1
  813. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  814. package/dist/core/tools/file-mutation-queue.js +5 -0
  815. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  816. package/dist/core/tools/index.d.ts.map +1 -1
  817. package/dist/core/tools/index.js +2 -2
  818. package/dist/core/tools/index.js.map +1 -1
  819. package/dist/core/tools/json-tolerante.d.ts +30 -0
  820. package/dist/core/tools/json-tolerante.d.ts.map +1 -0
  821. package/dist/core/tools/json-tolerante.js +70 -0
  822. package/dist/core/tools/json-tolerante.js.map +1 -0
  823. package/dist/core/tools/project-memory-tool.d.ts.map +1 -1
  824. package/dist/core/tools/project-memory-tool.js +4 -1
  825. package/dist/core/tools/project-memory-tool.js.map +1 -1
  826. package/dist/core/tools/read.d.ts.map +1 -1
  827. package/dist/core/tools/read.js +17 -0
  828. package/dist/core/tools/read.js.map +1 -1
  829. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -1
  830. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  831. package/dist/core/tools/tool-definition-wrapper.js +17 -1
  832. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  833. package/dist/core/trust-manager.d.ts.map +1 -1
  834. package/dist/core/trust-manager.js +2 -1
  835. package/dist/core/trust-manager.js.map +1 -1
  836. package/dist/core/turno-vacio/detectar.d.ts +38 -0
  837. package/dist/core/turno-vacio/detectar.d.ts.map +1 -0
  838. package/dist/core/turno-vacio/detectar.js +66 -0
  839. package/dist/core/turno-vacio/detectar.js.map +1 -0
  840. package/dist/core/undo/journal.d.ts +57 -0
  841. package/dist/core/undo/journal.d.ts.map +1 -0
  842. package/dist/core/undo/journal.js +178 -0
  843. package/dist/core/undo/journal.js.map +1 -0
  844. package/dist/core/urls-internas/auditoria.d.ts +10 -0
  845. package/dist/core/urls-internas/auditoria.d.ts.map +1 -0
  846. package/dist/core/urls-internas/auditoria.js +42 -0
  847. package/dist/core/urls-internas/auditoria.js.map +1 -0
  848. package/dist/core/urls-internas/boveda.d.ts +13 -0
  849. package/dist/core/urls-internas/boveda.d.ts.map +1 -0
  850. package/dist/core/urls-internas/boveda.js +40 -0
  851. package/dist/core/urls-internas/boveda.js.map +1 -0
  852. package/dist/core/urls-internas/lector.d.ts +30 -0
  853. package/dist/core/urls-internas/lector.d.ts.map +1 -0
  854. package/dist/core/urls-internas/lector.js +56 -0
  855. package/dist/core/urls-internas/lector.js.map +1 -0
  856. package/dist/core/urls-internas/memoria.d.ts +11 -0
  857. package/dist/core/urls-internas/memoria.d.ts.map +1 -0
  858. package/dist/core/urls-internas/memoria.js +25 -0
  859. package/dist/core/urls-internas/memoria.js.map +1 -0
  860. package/dist/core/urls-internas/parse.d.ts +28 -0
  861. package/dist/core/urls-internas/parse.d.ts.map +1 -0
  862. package/dist/core/urls-internas/parse.js +32 -0
  863. package/dist/core/urls-internas/parse.js.map +1 -0
  864. package/dist/core/urls-internas/reglas.d.ts +10 -0
  865. package/dist/core/urls-internas/reglas.d.ts.map +1 -0
  866. package/dist/core/urls-internas/reglas.js +31 -0
  867. package/dist/core/urls-internas/reglas.js.map +1 -0
  868. package/dist/core/usage/aggregate.d.ts +68 -0
  869. package/dist/core/usage/aggregate.d.ts.map +1 -0
  870. package/dist/core/usage/aggregate.js +93 -0
  871. package/dist/core/usage/aggregate.js.map +1 -0
  872. package/dist/core/usage/cuota/anthropic.d.ts +10 -0
  873. package/dist/core/usage/cuota/anthropic.d.ts.map +1 -0
  874. package/dist/core/usage/cuota/anthropic.js +63 -0
  875. package/dist/core/usage/cuota/anthropic.js.map +1 -0
  876. package/dist/core/usage/cuota/cache.d.ts +20 -0
  877. package/dist/core/usage/cuota/cache.d.ts.map +1 -0
  878. package/dist/core/usage/cuota/cache.js +36 -0
  879. package/dist/core/usage/cuota/cache.js.map +1 -0
  880. package/dist/core/usage/cuota/github-copilot.d.ts +9 -0
  881. package/dist/core/usage/cuota/github-copilot.d.ts.map +1 -0
  882. package/dist/core/usage/cuota/github-copilot.js +67 -0
  883. package/dist/core/usage/cuota/github-copilot.js.map +1 -0
  884. package/dist/core/usage/cuota/google-gemini.d.ts +9 -0
  885. package/dist/core/usage/cuota/google-gemini.d.ts.map +1 -0
  886. package/dist/core/usage/cuota/google-gemini.js +72 -0
  887. package/dist/core/usage/cuota/google-gemini.js.map +1 -0
  888. package/dist/core/usage/cuota/index.d.ts +25 -0
  889. package/dist/core/usage/cuota/index.d.ts.map +1 -0
  890. package/dist/core/usage/cuota/index.js +50 -0
  891. package/dist/core/usage/cuota/index.js.map +1 -0
  892. package/dist/core/usage/cuota/openai-codex.d.ts +9 -0
  893. package/dist/core/usage/cuota/openai-codex.d.ts.map +1 -0
  894. package/dist/core/usage/cuota/openai-codex.js +59 -0
  895. package/dist/core/usage/cuota/openai-codex.js.map +1 -0
  896. package/dist/core/usage/cuota/openrouter.d.ts +10 -0
  897. package/dist/core/usage/cuota/openrouter.d.ts.map +1 -0
  898. package/dist/core/usage/cuota/openrouter.js +47 -0
  899. package/dist/core/usage/cuota/openrouter.js.map +1 -0
  900. package/dist/core/usage/cuota/tipos.d.ts +50 -0
  901. package/dist/core/usage/cuota/tipos.d.ts.map +1 -0
  902. package/dist/core/usage/cuota/tipos.js +25 -0
  903. package/dist/core/usage/cuota/tipos.js.map +1 -0
  904. package/dist/core/web/busqueda-nativa.d.ts +82 -0
  905. package/dist/core/web/busqueda-nativa.d.ts.map +1 -0
  906. package/dist/core/web/busqueda-nativa.js +163 -0
  907. package/dist/core/web/busqueda-nativa.js.map +1 -0
  908. package/dist/core/web/destino.d.ts +58 -0
  909. package/dist/core/web/destino.d.ts.map +1 -0
  910. package/dist/core/web/destino.js +127 -0
  911. package/dist/core/web/destino.js.map +1 -0
  912. package/dist/core/web/proveedores/brave.d.ts +6 -0
  913. package/dist/core/web/proveedores/brave.d.ts.map +1 -0
  914. package/dist/core/web/proveedores/brave.js +20 -0
  915. package/dist/core/web/proveedores/brave.js.map +1 -0
  916. package/dist/core/web/proveedores/claves.d.ts +19 -0
  917. package/dist/core/web/proveedores/claves.d.ts.map +1 -0
  918. package/dist/core/web/proveedores/claves.js +36 -0
  919. package/dist/core/web/proveedores/claves.js.map +1 -0
  920. package/dist/core/web/proveedores/duckduckgo.d.ts +3 -0
  921. package/dist/core/web/proveedores/duckduckgo.d.ts.map +1 -0
  922. package/dist/core/web/proveedores/duckduckgo.js +109 -0
  923. package/dist/core/web/proveedores/duckduckgo.js.map +1 -0
  924. package/dist/core/web/proveedores/ecosia.d.ts +3 -0
  925. package/dist/core/web/proveedores/ecosia.d.ts.map +1 -0
  926. package/dist/core/web/proveedores/ecosia.js +72 -0
  927. package/dist/core/web/proveedores/ecosia.js.map +1 -0
  928. package/dist/core/web/proveedores/exa.d.ts +6 -0
  929. package/dist/core/web/proveedores/exa.d.ts.map +1 -0
  930. package/dist/core/web/proveedores/exa.js +24 -0
  931. package/dist/core/web/proveedores/exa.js.map +1 -0
  932. package/dist/core/web/proveedores/mojeek.d.ts +3 -0
  933. package/dist/core/web/proveedores/mojeek.d.ts.map +1 -0
  934. package/dist/core/web/proveedores/mojeek.js +65 -0
  935. package/dist/core/web/proveedores/mojeek.js.map +1 -0
  936. package/dist/core/web/proveedores/navegador.d.ts +10 -0
  937. package/dist/core/web/proveedores/navegador.d.ts.map +1 -0
  938. package/dist/core/web/proveedores/navegador.js +13 -0
  939. package/dist/core/web/proveedores/navegador.js.map +1 -0
  940. package/dist/core/web/proveedores/registro.d.ts +43 -0
  941. package/dist/core/web/proveedores/registro.d.ts.map +1 -0
  942. package/dist/core/web/proveedores/registro.js +49 -0
  943. package/dist/core/web/proveedores/registro.js.map +1 -0
  944. package/dist/core/web/proveedores/searxng.d.ts +9 -0
  945. package/dist/core/web/proveedores/searxng.d.ts.map +1 -0
  946. package/dist/core/web/proveedores/searxng.js +17 -0
  947. package/dist/core/web/proveedores/searxng.js.map +1 -0
  948. package/dist/core/web/proveedores/serper.d.ts +9 -0
  949. package/dist/core/web/proveedores/serper.d.ts.map +1 -0
  950. package/dist/core/web/proveedores/serper.js +19 -0
  951. package/dist/core/web/proveedores/serper.js.map +1 -0
  952. package/dist/core/web/proveedores/tavily.d.ts +6 -0
  953. package/dist/core/web/proveedores/tavily.d.ts.map +1 -0
  954. package/dist/core/web/proveedores/tavily.js +19 -0
  955. package/dist/core/web/proveedores/tavily.js.map +1 -0
  956. package/dist/core/web/proveedores/tipos.d.ts +36 -0
  957. package/dist/core/web/proveedores/tipos.d.ts.map +1 -0
  958. package/dist/core/web/proveedores/tipos.js +10 -0
  959. package/dist/core/web/proveedores/tipos.js.map +1 -0
  960. package/dist/core/web/registro-red.d.ts +43 -0
  961. package/dist/core/web/registro-red.d.ts.map +1 -0
  962. package/dist/core/web/registro-red.js +86 -0
  963. package/dist/core/web/registro-red.js.map +1 -0
  964. package/dist/core/web/scrapers/cisa-kev.d.ts +10 -0
  965. package/dist/core/web/scrapers/cisa-kev.d.ts.map +1 -0
  966. package/dist/core/web/scrapers/cisa-kev.js +38 -0
  967. package/dist/core/web/scrapers/cisa-kev.js.map +1 -0
  968. package/dist/core/web/scrapers/crates-io.d.ts +11 -0
  969. package/dist/core/web/scrapers/crates-io.d.ts.map +1 -0
  970. package/dist/core/web/scrapers/crates-io.js +29 -0
  971. package/dist/core/web/scrapers/crates-io.js.map +1 -0
  972. package/dist/core/web/scrapers/docs-rs.d.ts +10 -0
  973. package/dist/core/web/scrapers/docs-rs.d.ts.map +1 -0
  974. package/dist/core/web/scrapers/docs-rs.js +35 -0
  975. package/dist/core/web/scrapers/docs-rs.js.map +1 -0
  976. package/dist/core/web/scrapers/github.d.ts +3 -0
  977. package/dist/core/web/scrapers/github.d.ts.map +1 -0
  978. package/dist/core/web/scrapers/github.js +72 -0
  979. package/dist/core/web/scrapers/github.js.map +1 -0
  980. package/dist/core/web/scrapers/go-pkg.d.ts +7 -0
  981. package/dist/core/web/scrapers/go-pkg.d.ts.map +1 -0
  982. package/dist/core/web/scrapers/go-pkg.js +30 -0
  983. package/dist/core/web/scrapers/go-pkg.js.map +1 -0
  984. package/dist/core/web/scrapers/hex.d.ts +6 -0
  985. package/dist/core/web/scrapers/hex.d.ts.map +1 -0
  986. package/dist/core/web/scrapers/hex.js +27 -0
  987. package/dist/core/web/scrapers/hex.js.map +1 -0
  988. package/dist/core/web/scrapers/maven.d.ts +8 -0
  989. package/dist/core/web/scrapers/maven.d.ts.map +1 -0
  990. package/dist/core/web/scrapers/maven.js +41 -0
  991. package/dist/core/web/scrapers/maven.js.map +1 -0
  992. package/dist/core/web/scrapers/mdn.d.ts +6 -0
  993. package/dist/core/web/scrapers/mdn.d.ts.map +1 -0
  994. package/dist/core/web/scrapers/mdn.js +28 -0
  995. package/dist/core/web/scrapers/mdn.js.map +1 -0
  996. package/dist/core/web/scrapers/npm.d.ts +11 -0
  997. package/dist/core/web/scrapers/npm.d.ts.map +1 -0
  998. package/dist/core/web/scrapers/npm.js +57 -0
  999. package/dist/core/web/scrapers/npm.js.map +1 -0
  1000. package/dist/core/web/scrapers/nuget.d.ts +8 -0
  1001. package/dist/core/web/scrapers/nuget.d.ts.map +1 -0
  1002. package/dist/core/web/scrapers/nuget.js +22 -0
  1003. package/dist/core/web/scrapers/nuget.js.map +1 -0
  1004. package/dist/core/web/scrapers/nvd.d.ts +7 -0
  1005. package/dist/core/web/scrapers/nvd.d.ts.map +1 -0
  1006. package/dist/core/web/scrapers/nvd.js +37 -0
  1007. package/dist/core/web/scrapers/nvd.js.map +1 -0
  1008. package/dist/core/web/scrapers/pypi.d.ts +6 -0
  1009. package/dist/core/web/scrapers/pypi.d.ts.map +1 -0
  1010. package/dist/core/web/scrapers/pypi.js +31 -0
  1011. package/dist/core/web/scrapers/pypi.js.map +1 -0
  1012. package/dist/core/web/scrapers/registro.d.ts +13 -0
  1013. package/dist/core/web/scrapers/registro.d.ts.map +1 -0
  1014. package/dist/core/web/scrapers/registro.js +65 -0
  1015. package/dist/core/web/scrapers/registro.js.map +1 -0
  1016. package/dist/core/web/scrapers/rubygems.d.ts +6 -0
  1017. package/dist/core/web/scrapers/rubygems.d.ts.map +1 -0
  1018. package/dist/core/web/scrapers/rubygems.js +23 -0
  1019. package/dist/core/web/scrapers/rubygems.js.map +1 -0
  1020. package/dist/core/web/scrapers/stackoverflow.d.ts +3 -0
  1021. package/dist/core/web/scrapers/stackoverflow.d.ts.map +1 -0
  1022. package/dist/core/web/scrapers/stackoverflow.js +46 -0
  1023. package/dist/core/web/scrapers/stackoverflow.js.map +1 -0
  1024. package/dist/core/web/scrapers/tipos.d.ts +42 -0
  1025. package/dist/core/web/scrapers/tipos.d.ts.map +1 -0
  1026. package/dist/core/web/scrapers/tipos.js +23 -0
  1027. package/dist/core/web/scrapers/tipos.js.map +1 -0
  1028. package/dist/core/web/texto.d.ts +10 -0
  1029. package/dist/core/web/texto.d.ts.map +1 -0
  1030. package/dist/core/web/texto.js +26 -0
  1031. package/dist/core/web/texto.js.map +1 -0
  1032. package/dist/core/web/tools.d.ts +91 -0
  1033. package/dist/core/web/tools.d.ts.map +1 -0
  1034. package/dist/core/web/tools.js +304 -0
  1035. package/dist/core/web/tools.js.map +1 -0
  1036. package/dist/core/wiki/almacen.d.ts +33 -0
  1037. package/dist/core/wiki/almacen.d.ts.map +1 -0
  1038. package/dist/core/wiki/almacen.js +93 -0
  1039. package/dist/core/wiki/almacen.js.map +1 -0
  1040. package/dist/core/wiki/citas.d.ts +111 -0
  1041. package/dist/core/wiki/citas.d.ts.map +1 -0
  1042. package/dist/core/wiki/citas.js +146 -0
  1043. package/dist/core/wiki/citas.js.map +1 -0
  1044. package/dist/core/workflows/agent-runner.d.ts +88 -0
  1045. package/dist/core/workflows/agent-runner.d.ts.map +1 -0
  1046. package/dist/core/workflows/agent-runner.js +312 -0
  1047. package/dist/core/workflows/agent-runner.js.map +1 -0
  1048. package/dist/core/workflows/builtins.d.ts +41 -0
  1049. package/dist/core/workflows/builtins.d.ts.map +1 -0
  1050. package/dist/core/workflows/builtins.js +283 -0
  1051. package/dist/core/workflows/builtins.js.map +1 -0
  1052. package/dist/core/workflows/contrato/esquema.d.ts +32 -0
  1053. package/dist/core/workflows/contrato/esquema.d.ts.map +1 -0
  1054. package/dist/core/workflows/contrato/esquema.js +25 -0
  1055. package/dist/core/workflows/contrato/esquema.js.map +1 -0
  1056. package/dist/core/workflows/contrato/reparar-argumentos.d.ts +69 -0
  1057. package/dist/core/workflows/contrato/reparar-argumentos.d.ts.map +1 -0
  1058. package/dist/core/workflows/contrato/reparar-argumentos.js +117 -0
  1059. package/dist/core/workflows/contrato/reparar-argumentos.js.map +1 -0
  1060. package/dist/core/workflows/contrato/validador.d.ts +30 -0
  1061. package/dist/core/workflows/contrato/validador.d.ts.map +1 -0
  1062. package/dist/core/workflows/contrato/validador.js +56 -0
  1063. package/dist/core/workflows/contrato/validador.js.map +1 -0
  1064. package/dist/core/workflows/contrato/yield.d.ts +65 -0
  1065. package/dist/core/workflows/contrato/yield.d.ts.map +1 -0
  1066. package/dist/core/workflows/contrato/yield.js +80 -0
  1067. package/dist/core/workflows/contrato/yield.js.map +1 -0
  1068. package/dist/core/workflows/goal-engine/engine.d.ts +151 -0
  1069. package/dist/core/workflows/goal-engine/engine.d.ts.map +1 -0
  1070. package/dist/core/workflows/goal-engine/engine.js +503 -0
  1071. package/dist/core/workflows/goal-engine/engine.js.map +1 -0
  1072. package/dist/core/workflows/goal-engine/errors.d.ts +7 -0
  1073. package/dist/core/workflows/goal-engine/errors.d.ts.map +1 -0
  1074. package/dist/core/workflows/goal-engine/errors.js +9 -0
  1075. package/dist/core/workflows/goal-engine/errors.js.map +1 -0
  1076. package/dist/core/workflows/goal-engine/index.d.ts +13 -0
  1077. package/dist/core/workflows/goal-engine/index.d.ts.map +1 -0
  1078. package/dist/core/workflows/goal-engine/index.js +8 -0
  1079. package/dist/core/workflows/goal-engine/index.js.map +1 -0
  1080. package/dist/core/workflows/goal-engine/persistence.d.ts +31 -0
  1081. package/dist/core/workflows/goal-engine/persistence.d.ts.map +1 -0
  1082. package/dist/core/workflows/goal-engine/persistence.js +145 -0
  1083. package/dist/core/workflows/goal-engine/persistence.js.map +1 -0
  1084. package/dist/core/workflows/goal-engine/prompts.d.ts +37 -0
  1085. package/dist/core/workflows/goal-engine/prompts.d.ts.map +1 -0
  1086. package/dist/core/workflows/goal-engine/prompts.js +131 -0
  1087. package/dist/core/workflows/goal-engine/prompts.js.map +1 -0
  1088. package/dist/core/workflows/goal-engine/state.d.ts +41 -0
  1089. package/dist/core/workflows/goal-engine/state.d.ts.map +1 -0
  1090. package/dist/core/workflows/goal-engine/state.js +397 -0
  1091. package/dist/core/workflows/goal-engine/state.js.map +1 -0
  1092. package/dist/core/workflows/goal-engine/tools.d.ts +31 -0
  1093. package/dist/core/workflows/goal-engine/tools.d.ts.map +1 -0
  1094. package/dist/core/workflows/goal-engine/tools.js +211 -0
  1095. package/dist/core/workflows/goal-engine/tools.js.map +1 -0
  1096. package/dist/core/workflows/goal-engine/types.d.ts +286 -0
  1097. package/dist/core/workflows/goal-engine/types.d.ts.map +1 -0
  1098. package/dist/core/workflows/goal-engine/types.js +17 -0
  1099. package/dist/core/workflows/goal-engine/types.js.map +1 -0
  1100. package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts +23 -0
  1101. package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts.map +1 -0
  1102. package/dist/core/workflows/goal-engine/worktree-fingerprint.js +72 -0
  1103. package/dist/core/workflows/goal-engine/worktree-fingerprint.js.map +1 -0
  1104. package/dist/core/workflows/graph-sync.d.ts +67 -0
  1105. package/dist/core/workflows/graph-sync.d.ts.map +1 -0
  1106. package/dist/core/workflows/graph-sync.js +188 -0
  1107. package/dist/core/workflows/graph-sync.js.map +1 -0
  1108. package/dist/core/workflows/graph.d.ts +143 -0
  1109. package/dist/core/workflows/graph.d.ts.map +1 -0
  1110. package/dist/core/workflows/graph.js +319 -0
  1111. package/dist/core/workflows/graph.js.map +1 -0
  1112. package/dist/core/workflows/index.d.ts +26 -0
  1113. package/dist/core/workflows/index.d.ts.map +1 -0
  1114. package/dist/core/workflows/index.js +18 -0
  1115. package/dist/core/workflows/index.js.map +1 -0
  1116. package/dist/core/workflows/journal.d.ts +68 -0
  1117. package/dist/core/workflows/journal.d.ts.map +1 -0
  1118. package/dist/core/workflows/journal.js +83 -0
  1119. package/dist/core/workflows/journal.js.map +1 -0
  1120. package/dist/core/workflows/manager.d.ts +122 -0
  1121. package/dist/core/workflows/manager.d.ts.map +1 -0
  1122. package/dist/core/workflows/manager.js +351 -0
  1123. package/dist/core/workflows/manager.js.map +1 -0
  1124. package/dist/core/workflows/resolve-script.d.ts +35 -0
  1125. package/dist/core/workflows/resolve-script.d.ts.map +1 -0
  1126. package/dist/core/workflows/resolve-script.js +66 -0
  1127. package/dist/core/workflows/resolve-script.js.map +1 -0
  1128. package/dist/core/workflows/runtime.d.ts +62 -0
  1129. package/dist/core/workflows/runtime.d.ts.map +1 -0
  1130. package/dist/core/workflows/runtime.js +380 -0
  1131. package/dist/core/workflows/runtime.js.map +1 -0
  1132. package/dist/core/workflows/save-as-skill.d.ts +27 -0
  1133. package/dist/core/workflows/save-as-skill.d.ts.map +1 -0
  1134. package/dist/core/workflows/save-as-skill.js +54 -0
  1135. package/dist/core/workflows/save-as-skill.js.map +1 -0
  1136. package/dist/core/workflows/shared-store.d.ts +31 -0
  1137. package/dist/core/workflows/shared-store.d.ts.map +1 -0
  1138. package/dist/core/workflows/shared-store.js +80 -0
  1139. package/dist/core/workflows/shared-store.js.map +1 -0
  1140. package/dist/core/workflows/subagent-host.d.ts +50 -0
  1141. package/dist/core/workflows/subagent-host.d.ts.map +1 -0
  1142. package/dist/core/workflows/subagent-host.js +225 -0
  1143. package/dist/core/workflows/subagent-host.js.map +1 -0
  1144. package/dist/core/workflows/tool-workflow.d.ts +22 -0
  1145. package/dist/core/workflows/tool-workflow.d.ts.map +1 -0
  1146. package/dist/core/workflows/tool-workflow.js +120 -0
  1147. package/dist/core/workflows/tool-workflow.js.map +1 -0
  1148. package/dist/core/workflows/types.d.ts +191 -0
  1149. package/dist/core/workflows/types.d.ts.map +1 -0
  1150. package/dist/core/workflows/types.js +26 -0
  1151. package/dist/core/workflows/types.js.map +1 -0
  1152. package/dist/core/workflows/worktree.d.ts +42 -0
  1153. package/dist/core/workflows/worktree.d.ts.map +1 -0
  1154. package/dist/core/workflows/worktree.js +107 -0
  1155. package/dist/core/workflows/worktree.js.map +1 -0
  1156. package/dist/extensions/llama/index.d.ts.map +1 -1
  1157. package/dist/extensions/llama/index.js +2 -0
  1158. package/dist/extensions/llama/index.js.map +1 -1
  1159. package/dist/extensions/llama/provider.d.ts.map +1 -1
  1160. package/dist/extensions/llama/provider.js +6 -2
  1161. package/dist/extensions/llama/provider.js.map +1 -1
  1162. package/dist/extensions/remoto/index.d.ts +22 -0
  1163. package/dist/extensions/remoto/index.d.ts.map +1 -0
  1164. package/dist/extensions/remoto/index.js +54 -0
  1165. package/dist/extensions/remoto/index.js.map +1 -0
  1166. package/dist/index.d.ts +1 -13
  1167. package/dist/index.d.ts.map +1 -1
  1168. package/dist/index.js +7 -13
  1169. package/dist/index.js.map +1 -1
  1170. package/dist/main.d.ts +4 -0
  1171. package/dist/main.d.ts.map +1 -1
  1172. package/dist/main.js +26 -15
  1173. package/dist/main.js.map +1 -1
  1174. package/dist/migrations.d.ts.map +1 -1
  1175. package/dist/migrations.js +4 -3
  1176. package/dist/migrations.js.map +1 -1
  1177. package/dist/modes/acp/acp-mode.d.ts +42 -0
  1178. package/dist/modes/acp/acp-mode.d.ts.map +1 -0
  1179. package/dist/modes/acp/acp-mode.js +190 -0
  1180. package/dist/modes/acp/acp-mode.js.map +1 -0
  1181. package/dist/modes/acp/events.d.ts +74 -0
  1182. package/dist/modes/acp/events.d.ts.map +1 -0
  1183. package/dist/modes/acp/events.js +116 -0
  1184. package/dist/modes/acp/events.js.map +1 -0
  1185. package/dist/modes/interactive/components/home-screen.d.ts.map +1 -1
  1186. package/dist/modes/interactive/components/home-screen.js +2 -2
  1187. package/dist/modes/interactive/components/home-screen.js.map +1 -1
  1188. package/dist/modes/interactive/components/model-selector.d.ts +9 -3
  1189. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  1190. package/dist/modes/interactive/components/model-selector.js +56 -12
  1191. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  1192. package/dist/modes/interactive/components/prompt-optimization.d.ts +16 -0
  1193. package/dist/modes/interactive/components/prompt-optimization.d.ts.map +1 -0
  1194. package/dist/modes/interactive/components/prompt-optimization.js +46 -0
  1195. package/dist/modes/interactive/components/prompt-optimization.js.map +1 -0
  1196. package/dist/modes/interactive/components/settings-selector.d.ts +19 -2
  1197. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  1198. package/dist/modes/interactive/components/settings-selector.js +180 -56
  1199. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  1200. package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
  1201. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
  1202. package/dist/modes/interactive/components/settings-submenu.js +165 -0
  1203. package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
  1204. package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
  1205. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  1206. package/dist/modes/interactive/components/thinking-selector.js +74 -17
  1207. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  1208. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  1209. package/dist/modes/interactive/external-editor.js +2 -1
  1210. package/dist/modes/interactive/external-editor.js.map +1 -1
  1211. package/dist/modes/interactive/interactive-mode.d.ts +21 -1
  1212. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  1213. package/dist/modes/interactive/interactive-mode.js +709 -75
  1214. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  1215. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  1216. package/dist/modes/interactive/theme/theme.js +4 -3
  1217. package/dist/modes/interactive/theme/theme.js.map +1 -1
  1218. package/dist/modes/json-event.d.ts +16 -13
  1219. package/dist/modes/json-event.d.ts.map +1 -1
  1220. package/dist/modes/json-event.js +20 -6
  1221. package/dist/modes/json-event.js.map +1 -1
  1222. package/dist/modes/print-mode.d.ts.map +1 -1
  1223. package/dist/modes/print-mode.js +11 -0
  1224. package/dist/modes/print-mode.js.map +1 -1
  1225. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  1226. package/dist/modes/rpc/rpc-mode.js +173 -0
  1227. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  1228. package/dist/modes/rpc/rpc-types.d.ts +29 -0
  1229. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  1230. package/dist/modes/rpc/rpc-types.js.map +1 -1
  1231. package/dist/package-manager-cli.d.ts.map +1 -1
  1232. package/dist/package-manager-cli.js +27 -5
  1233. package/dist/package-manager-cli.js.map +1 -1
  1234. package/dist/server/attach.d.ts +56 -0
  1235. package/dist/server/attach.d.ts.map +1 -0
  1236. package/dist/server/attach.js +130 -0
  1237. package/dist/server/attach.js.map +1 -0
  1238. package/dist/server/extension-ops.d.ts +40 -0
  1239. package/dist/server/extension-ops.d.ts.map +1 -0
  1240. package/dist/server/extension-ops.js +146 -0
  1241. package/dist/server/extension-ops.js.map +1 -0
  1242. package/dist/server/pi-server-service.d.ts +85 -0
  1243. package/dist/server/pi-server-service.d.ts.map +1 -0
  1244. package/dist/server/pi-server-service.js +213 -0
  1245. package/dist/server/pi-server-service.js.map +1 -0
  1246. package/dist/server/scheduler-tick.d.ts +32 -0
  1247. package/dist/server/scheduler-tick.d.ts.map +1 -0
  1248. package/dist/server/scheduler-tick.js +47 -0
  1249. package/dist/server/scheduler-tick.js.map +1 -0
  1250. package/dist/server/serve.d.ts +25 -0
  1251. package/dist/server/serve.d.ts.map +1 -0
  1252. package/dist/server/serve.js +83 -0
  1253. package/dist/server/serve.js.map +1 -0
  1254. package/dist/server/transcript.d.ts +38 -0
  1255. package/dist/server/transcript.d.ts.map +1 -0
  1256. package/dist/server/transcript.js +176 -0
  1257. package/dist/server/transcript.js.map +1 -0
  1258. package/dist/skills/ada-engine/SKILL.md +153 -0
  1259. package/dist/skills/skill-creator/SKILL.md +90 -0
  1260. package/dist/telegram/api.d.ts +75 -0
  1261. package/dist/telegram/api.d.ts.map +1 -0
  1262. package/dist/telegram/api.js +104 -0
  1263. package/dist/telegram/api.js.map +1 -0
  1264. package/dist/telegram/bridge.d.ts +85 -0
  1265. package/dist/telegram/bridge.d.ts.map +1 -0
  1266. package/dist/telegram/bridge.js +182 -0
  1267. package/dist/telegram/bridge.js.map +1 -0
  1268. package/dist/telegram/journal.d.ts +67 -0
  1269. package/dist/telegram/journal.d.ts.map +1 -0
  1270. package/dist/telegram/journal.js +119 -0
  1271. package/dist/telegram/journal.js.map +1 -0
  1272. package/dist/telegram/servidor.d.ts +15 -0
  1273. package/dist/telegram/servidor.d.ts.map +1 -0
  1274. package/dist/telegram/servidor.js +74 -0
  1275. package/dist/telegram/servidor.js.map +1 -0
  1276. package/dist/utils/frontmatter.d.ts.map +1 -1
  1277. package/dist/utils/frontmatter.js +2 -1
  1278. package/dist/utils/frontmatter.js.map +1 -1
  1279. package/dist/utils/management-http.d.ts +5 -3
  1280. package/dist/utils/management-http.d.ts.map +1 -1
  1281. package/dist/utils/management-http.js +14 -10
  1282. package/dist/utils/management-http.js.map +1 -1
  1283. package/dist/utils/shell.d.ts +11 -0
  1284. package/dist/utils/shell.d.ts.map +1 -1
  1285. package/dist/utils/shell.js +11 -0
  1286. package/dist/utils/shell.js.map +1 -1
  1287. package/dist/utils/text.d.ts +8 -0
  1288. package/dist/utils/text.d.ts.map +1 -0
  1289. package/dist/utils/text.js +9 -0
  1290. package/dist/utils/text.js.map +1 -0
  1291. package/dist/utils/version-check.d.ts.map +1 -1
  1292. package/dist/utils/version-check.js +29 -1
  1293. package/dist/utils/version-check.js.map +1 -1
  1294. package/docs/compaction.md +25 -10
  1295. package/docs/compliance.md +241 -0
  1296. package/docs/containerization.md +24 -24
  1297. package/docs/custom-provider.md +15 -12
  1298. package/docs/development.md +47 -10
  1299. package/docs/docs.json +14 -2
  1300. package/docs/environment-variables.md +20 -17
  1301. package/docs/extensions.md +62 -51
  1302. package/docs/index.md +15 -21
  1303. package/docs/json.md +10 -5
  1304. package/docs/keybindings.md +5 -5
  1305. package/docs/llama-cpp.md +9 -7
  1306. package/docs/models.md +18 -12
  1307. package/docs/packages.md +45 -45
  1308. package/docs/prompt-templates.md +5 -5
  1309. package/docs/providers.md +12 -12
  1310. package/docs/quickstart.md +39 -39
  1311. package/docs/rpc.md +21 -15
  1312. package/docs/sdk.md +38 -38
  1313. package/docs/security.md +26 -21
  1314. package/docs/session-format.md +7 -7
  1315. package/docs/sessions.md +14 -14
  1316. package/docs/settings.md +47 -22
  1317. package/docs/shell-aliases.md +2 -2
  1318. package/docs/skills.md +14 -13
  1319. package/docs/terminal-setup.md +14 -14
  1320. package/docs/termux.md +7 -7
  1321. package/docs/themes.md +11 -11
  1322. package/docs/tmux.md +4 -4
  1323. package/docs/tui.md +3 -3
  1324. package/docs/usage.md +54 -54
  1325. package/docs/windows.md +2 -2
  1326. package/examples/extensions/border-status-editor.ts +1 -1
  1327. package/examples/extensions/git-checkpoint.ts +2 -2
  1328. package/examples/extensions/notify.ts +3 -1
  1329. package/examples/extensions/subagent/README.md +1 -1
  1330. package/examples/extensions/subagent/index.ts +6 -1
  1331. package/examples/extensions/titlebar-spinner.ts +1 -1
  1332. package/examples/rpc-extension-ui.ts +1 -1
  1333. package/examples/sdk/06-extensions.ts +1 -1
  1334. package/examples/sdk/12-full-control.ts +9 -0
  1335. package/examples/sdk/README.md +1 -1
  1336. package/npm-shrinkwrap.json +35 -261
  1337. package/package.json +9 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reposo.js","sourceRoot":"","sources":["../../../src/core/credenciales/reposo.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cifrado en reposo de `<agentDir>/auth.json`.\n *\n * EL HUECO: vendemos \"vault cifrado con clasificación y auditoría\"\n * (memory-engine/vault.ts) mientras las claves de API y los tokens OAuth de\n * los proveedores viven en auth.json EN CLARO, con permisos 0600 pero\n * legibles por cualquier proceso del usuario. La política de aprobación\n * (aprobacion/politica.ts) ya le impide leerlo a NUESTRO agente; esto le\n * cierra la puerta a cualquier OTRO proceso.\n *\n * DISEÑO — envolver, no sustituir:\n * `auth-storage.ts` es de upstream y el presupuesto de fork está agotado\n * (ver scripts/sync-ada.sh --check). No podemos reescribir su lectura/\n * escritura de fichero ni su bloqueo entre procesos (proper-lockfile) sin\n * pagar hunks que no tenemos. En vez de eso, ENVOLVEMOS su\n * `AuthStorageBackend`: el interior (`FileAuthStorageBackend`) sigue\n * poseyendo el candado y el `ensureFileExists`/`ensureParentDir`; nosotros\n * solo transformamos el CONTENIDO que entra y sale del candado. Todo el\n * cifrado ocurre DENTRO de la sección crítica del candado que ya existía,\n * así que la seguridad frente a otros procesos de Ada no cambia.\n *\n * CLAVE: un secreto aleatorio de 256 bits en el LLAVERO del sistema (no una\n * passphrase memorizable — nadie va a teclear una contraseña para que el\n * CLI arranque). Se deriva de nada: se genera con randomBytes y se guarda\n * en Keychain la primera vez que hace falta. Sin llavero disponible (CI,\n * contenedor, Linux sin secret-service) NO SE CIFRA: una clave que vive en\n * el mismo disco que el fichero que protege es ofuscación, no cifrado, y\n * llamarlo cifrado sería mentir en la única parte del producto donde no se\n * puede mentir. Se avisa una vez, con una línea clara, y se sigue\n * funcionando en claro (mismo comportamiento que hoy).\n *\n * FORMATO: una cabecera literal al principio del fichero distingue claro de\n * cifrado — nunca adivinamos intentando JSON.parse (un fichero cifrado\n * corrupto a medias podría parsear igual como JSON basura y confundirse con\n * \"en claro\", perdiendo credenciales calladamente).\n *\n * MIGRACIÓN: en cada lectura, si el contenido está en claro se devuelve tal\n * cual (nunca bloquea al llamador) y se agenda un recifrado en segundo\n * plano con `setImmediate` — nunca DENTRO del candado que la propia lectura\n * mantiene abierto, porque volver a pedirlo desde dentro se autobloquearía.\n * En cada escritura (a través del wrapper) se cifra antes de tocar disco,\n * con copia de seguridad y escritura atómica (fichero temporal + rename):\n * si esto corrompe auth.json, el usuario pierde el acceso a TODOS sus\n * proveedores, así que no se sustituye el fichero real hasta que el\n * temporal esté completo en disco.\n */\n\nimport { execFileSync } from \"node:child_process\";\nimport { createCipheriv, createDecipheriv, randomBytes } from \"node:crypto\";\nimport { chmodSync, existsSync, readFileSync, renameSync, statSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AuthOperationOptions, Credential } from \"@earendil-works/pi-ai\";\nimport { getAgentDir } from \"../../config.ts\";\nimport { stripBom } from \"../../utils/text.ts\";\nimport type { AuthStorageBackend } from \"../auth-storage.ts\";\n\n// ─── Formato: cabecera literal, nunca \"adivinada\" por JSON.parse ───────────\n\nconst CABECERA_CIFRADO = \"ADA-AUTHJSON-CIFRADO-V1\\n\";\n\ninterface SobreCifrado {\n\tiv: string; // base64\n\ttag: string; // base64 (GCM auth tag)\n\tdatos: string; // base64\n}\n\nfunction esFormatoCifrado(contenido: string): boolean {\n\treturn contenido.startsWith(CABECERA_CIFRADO);\n}\n\n// ─── Llavero del sistema (macOS Keychain vía `security`, sin bindings nativos) ───\n\nconst SERVICIO_LLAVERO_PRODUCCION = \"ada-cli-credenciales\";\nconst CUENTA_LLAVERO = \"auth-json-clave-maestra\";\nconst TIMEOUT_LLAVERO_MS = 5_000;\n\n/**\n * Bajo qué nombre vive la clave maestra en el llavero REAL de la máquina.\n *\n * Se puede sustituir por entorno porque las pruebas de este módulo necesitan un\n * llavero de verdad —no hay bindings nativos que fingir, y fingir `execFileSync`\n * probaría el mock, no el Keychain— y hasta ahora usaban la entrada de\n * PRODUCCIÓN. Con `__eliminarClaveDeLlaveroParaPruebas()` en su `afterEach`,\n * cada corrida de la suite BORRABA la clave maestra del usuario y creaba otra.\n *\n * Lo que eso deja detrás no es un inconveniente: el `~/.ada/agent/auth.json`\n * del usuario quedó cifrado con la clave anterior, así que pasa a ser\n * indescifrable PARA SIEMPRE, y su `.bak` también (se recifra con la misma\n * clave). Medido en esta máquina, con la huella SHA-256 de la clave del\n * llavero antes y después:\n *\n * == antes == 15900260def30338\n * npx vitest --run test/commit-mensaje.test.ts\n * == después == 15900260def30338 (intacta)\n * npx vitest --run test/credenciales-reposo.test.ts\n * == después == c8b382bb95b2285b (OTRA)\n *\n * Y AGENTS.md manda ejecutar la suite antes de dar nada por terminado, así que\n * el flujo de trabajo del propio proyecto rompía las credenciales del usuario.\n *\n * Falla CERRADO bajo vitest: si alguien quita el ajuste de `vitest.config.ts`,\n * las pruebas del llavero se caen con este mensaje en vez de volver\n * calladamente a morder la entrada de producción.\n */\nfunction servicioLlavero(): string {\n\tconst propio = process.env.ADA_LLAVERO_SERVICIO;\n\tif (propio) return propio;\n\tif (process.env.VITEST) {\n\t\tthrow new Error(\n\t\t\t\"Una prueba ha intentado usar la entrada de llavero de PRODUCCIÓN \" +\n\t\t\t\t`(\"${SERVICIO_LLAVERO_PRODUCCION}\"). Eso borra la clave maestra del usuario y deja su ` +\n\t\t\t\t\"auth.json indescifrable. Define ADA_LLAVERO_SERVICIO (lo hace vitest.config.ts).\",\n\t\t);\n\t}\n\treturn SERVICIO_LLAVERO_PRODUCCION;\n}\n\nfunction esMacOS(): boolean {\n\treturn typeof process !== \"undefined\" && process.platform === \"darwin\";\n}\n\n/**\n * True cuando hay un llavero de sistema utilizable en esta máquina.\n *\n * `ADA_SIN_LLAVERO=1` fuerza \"no disponible\" aunque estemos en macOS — es la\n * única forma de probar de verdad la rama \"sin llavero\" (headless/CI) sin\n * necesitar una máquina Linux, y también sirve de escape manual para quien\n * quiera desactivar el uso del Keychain explícitamente.\n */\nexport function hayLlaveroDisponible(): boolean {\n\treturn esMacOS() && process.env.ADA_SIN_LLAVERO !== \"1\";\n}\n\n/**\n * Tres estados, y la diferencia entre el segundo y el tercero costó las\n * credenciales de esta máquina.\n *\n * Antes esto devolvía `Buffer | null` y `null` significaba a la vez «todavía no\n * hay clave» y «no he podido leerla». Quien llamaba entendía lo primero,\n * generaba una clave nueva y la guardaba con `-U` (sobrescribir). Un fallo\n * PASAJERO de `security` —un tiempo de espera agotado con la máquina cargada,\n * el llavero bloqueado— bastaba para rotar la clave maestra y dejar\n * PERMANENTEMENTE ilegible todo `auth.json` cifrado con la anterior.\n *\n * Pasó de verdad el 2026-08-24 sobre `~/.ada/agent/auth.json`: seis\n * proveedores perdidos, sin recuperación posible, porque el llavero de macOS no\n * guarda historial.\n *\n * Es la familia de siempre —«no puedo» leído como «no hay»— pero aquí no\n * informa mal: DESTRUYE DATOS. Por eso son tres estados y no dos.\n */\ntype LecturaDeClave =\n\t| { estado: \"leida\"; clave: Buffer }\n\t| { estado: \"no-existe\" }\n\t| { estado: \"error\"; motivo: string };\n\n/** `security` devuelve 44 (errSecItemNotFound) cuando la entrada no está. */\nconst CODIGO_NO_ENCONTRADO = 44;\n\nfunction leerClaveDelLlavero(): LecturaDeClave {\n\tif (!hayLlaveroDisponible()) return { estado: \"no-existe\" };\n\t// Fuera del try a propósito: si `servicioLlavero()` se planta porque una\n\t// prueba iba a morder la entrada de producción, ese error tiene que SALIR.\n\t// Dentro del try acabaría clasificado como un `estado: \"error\"` cualquiera,\n\t// y lo que hay que hacer con él es parar, no seguir sin cifrar.\n\tconst servicio = servicioLlavero();\n\tlet salida: string;\n\ttry {\n\t\tsalida = execFileSync(\n\t\t\t\"/usr/bin/security\",\n\t\t\t[\"find-generic-password\", \"-s\", servicio, \"-a\", CUENTA_LLAVERO, \"-w\"],\n\t\t\t// stdio \"pipe\" en los tres canales: sin esto, `security` hereda\n\t\t\t// nuestro stderr y el \"could not be found in the keychain\" (normal\n\t\t\t// en el primer arranque, antes de crear la clave) se ve como si\n\t\t\t// algo hubiera ido mal.\n\t\t\t{ timeout: TIMEOUT_LLAVERO_MS, encoding: \"utf-8\", windowsHide: true, stdio: [\"pipe\", \"pipe\", \"pipe\"] },\n\t\t).trim();\n\t} catch (error) {\n\t\tconst e = error as NodeJS.ErrnoException & { status?: number | null };\n\t\tif (e.status === CODIGO_NO_ENCONTRADO) return { estado: \"no-existe\" };\n\t\t// Todo lo demás es un fallo del que NO se puede deducir que no haya\n\t\t// clave: tiempo agotado (`ETIMEDOUT`), llavero bloqueado, `security`\n\t\t// que no arranca. Rotar aquí es lo que destruyó las credenciales.\n\t\treturn { estado: \"error\", motivo: e.code ?? `security salió con ${e.status}` };\n\t}\n\tif (!salida) return { estado: \"error\", motivo: \"el llavero devolvió una entrada vacía\" };\n\tconst clave = Buffer.from(salida, \"base64\");\n\t// Una entrada presente pero con el tamaño equivocado también es un error, no\n\t// una ausencia: sobrescribirla tiraría la clave buena si el fallo está en la\n\t// lectura y no en el dato.\n\tif (clave.length !== 32)\n\t\treturn { estado: \"error\", motivo: `la clave del llavero mide ${clave.length} bytes, no 32` };\n\treturn { estado: \"leida\", clave };\n}\n\nfunction guardarClaveEnLlavero(clave: Buffer): boolean {\n\tif (!hayLlaveroDisponible()) return false;\n\tconst servicio = servicioLlavero(); // fuera del try: ver `leerClaveDelLlavero`\n\ttry {\n\t\t// -w sin valor en argv: la contraseña se pasa por stdin para que no quede\n\t\t// visible en `ps`/el historial del proceso (mismo patrón que\n\t\t// memory-engine/keychain.ts). Comprobado a mano: `security` pide el valor\n\t\t// DOS VECES por stdin (password + confirmación) aunque no haya terminal;\n\t\t// una sola línea deja la segunda lectura vacía y falla con \"passwords\n\t\t// don't match\".\n\t\tconst valor = clave.toString(\"base64\");\n\t\texecFileSync(\n\t\t\t\"/usr/bin/security\",\n\t\t\t// SIN `-U`. Con `-U` esto SOBRESCRIBE la entrada existente, y ese es el\n\t\t\t// segundo camino por el que se perdieron las credenciales de esta\n\t\t\t// máquina: un fallo de lectura hacía creer que no había clave y este\n\t\t\t// `-U` remataba tirando la buena. Sin él, `security` falla si ya existe,\n\t\t\t// que es justo la señal que quien llama necesita para releer.\n\t\t\t//\n\t\t\t// El PRIMER camino lo encontró la revisión de `hueco-commit` y es\n\t\t\t// distinto: las pruebas de este módulo borraban la entrada de\n\t\t\t// PRODUCCIÓN en su `afterEach`. Los dos arreglos hacen falta —\n\t\t\t// `servicioLlavero()` impide que una prueba toque la clave real, y esto\n\t\t\t// impide que un fallo pasajero la rote.\n\t\t\t[\"add-generic-password\", \"-s\", servicio, \"-a\", CUENTA_LLAVERO, \"-w\"],\n\t\t\t{\n\t\t\t\ttimeout: TIMEOUT_LLAVERO_MS,\n\t\t\t\twindowsHide: true,\n\t\t\t\tinput: `${valor}\\n${valor}\\n`,\n\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t},\n\t\t);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nlet claveEnCache: Buffer | null | undefined; // undefined = aún no consultada\n\n/**\n * Clave maestra. `null` = no hay llavero en esta máquina (CI, contenedor), que\n * es el caso legítimo de \"no se cifra\". **Lanza** si el llavero está pero no se\n * ha podido leer: ahí seguir sería inventarse una clave nueva y perder lo\n * cifrado con la anterior.\n */\nfunction obtenerOCrearClave(): Buffer | null {\n\tif (!hayLlaveroDisponible()) return null;\n\tif (claveEnCache !== undefined) return claveEnCache;\n\n\tconst lectura = leerClaveDelLlavero();\n\tif (lectura.estado === \"leida\") {\n\t\tclaveEnCache = lectura.clave;\n\t\treturn claveEnCache;\n\t}\n\tif (lectura.estado === \"error\") {\n\t\t// Fallar cerrado. Un error aquí NO se cachea: el fallo puede ser pasajero\n\t\t// y el siguiente intento debe volver a preguntarle al llavero.\n\t\tthrow new Error(\n\t\t\t`No se ha podido leer la clave maestra del llavero (${lectura.motivo}).\\n` +\n\t\t\t\t\"No se genera una nueva a propósito: eso dejaría ilegible para siempre el auth.json\\n\" +\n\t\t\t\t\"ya cifrado. Desbloquea el llavero y vuelve a intentarlo, o exporta ADA_SIN_LLAVERO=1\\n\" +\n\t\t\t\t\"para trabajar sin cifrado en reposo.\",\n\t\t);\n\t}\n\n\t// No existe: primera vez. Se crea SIN `-U`, para que dos procesos a la vez no\n\t// se pisen — quien pierde la carrera relee en vez de sobrescribir.\n\tconst nueva = randomBytes(32);\n\tif (guardarClaveEnLlavero(nueva)) {\n\t\tclaveEnCache = nueva;\n\t\treturn claveEnCache;\n\t}\n\tconst segunda = leerClaveDelLlavero();\n\tif (segunda.estado === \"leida\") {\n\t\tclaveEnCache = segunda.clave;\n\t\treturn claveEnCache;\n\t}\n\t// Ni se pudo crear ni leer: sin llavero utilizable. Se deja sin cifrar, que\n\t// es el comportamiento documentado, y se avisa una vez.\n\tclaveEnCache = null;\n\treturn null;\n}\n\n// ─── AES-256-GCM ────────────────────────────────────────────────────────────\n\nfunction cifrar(contenidoClaro: string, clave: Buffer): string {\n\tconst iv = randomBytes(12);\n\tconst cipher = createCipheriv(\"aes-256-gcm\", clave, iv);\n\tconst datos = Buffer.concat([cipher.update(contenidoClaro, \"utf-8\"), cipher.final()]);\n\tconst sobre: SobreCifrado = {\n\t\tiv: iv.toString(\"base64\"),\n\t\ttag: cipher.getAuthTag().toString(\"base64\"),\n\t\tdatos: datos.toString(\"base64\"),\n\t};\n\treturn CABECERA_CIFRADO + JSON.stringify(sobre);\n}\n\nfunction descifrar(contenidoFichero: string, clave: Buffer): string {\n\tconst sobre = JSON.parse(contenidoFichero.slice(CABECERA_CIFRADO.length)) as SobreCifrado;\n\tconst decipher = createDecipheriv(\"aes-256-gcm\", clave, Buffer.from(sobre.iv, \"base64\"));\n\tdecipher.setAuthTag(Buffer.from(sobre.tag, \"base64\"));\n\tconst claro = Buffer.concat([decipher.update(Buffer.from(sobre.datos, \"base64\")), decipher.final()]);\n\treturn claro.toString(\"utf-8\");\n}\n\n// ─── Error legible: nunca un stack para un fichero dañado ─────────────────\n\n/**\n * auth.json cifrado que no se puede leer: auth tag inválido, JSON del sobre\n * truncado, o llavero sin la clave que lo cifró (p.ej. copiado desde otra\n * máquina). \"no he podido leerlo\" y \"no hay credenciales\" son cosas\n * distintas: esto SIEMPRE es lo primero, nunca se confunde con un auth.json\n * vacío legítimo.\n */\nexport class AuthJsonCorruptoError extends Error {\n\tconstructor(authPath: string, causa: unknown) {\n\t\tsuper(\n\t\t\t`auth.json está cifrado pero no se ha podido leer (${authPath}).\\n` +\n\t\t\t\t`Puede estar dañado, o cifrado con la clave de otra máquina.\\n` +\n\t\t\t\t`Qué hacer:\\n` +\n\t\t\t\t` 1. Si existe una copia de seguridad, restáurala:\\n` +\n\t\t\t\t` cp \"${authPath}.bak\" \"${authPath}\"\\n` +\n\t\t\t\t` 2. Si no, vuelve a iniciar sesión con cada proveedor:\\n` +\n\t\t\t\t` ada-cli auth login <proveedor>\\n` +\n\t\t\t\t(causa instanceof Error ? `(detalle técnico: ${causa.message})` : \"\"),\n\t\t);\n\t\tthis.name = \"AuthJsonCorruptoError\";\n\t}\n}\n\n// ─── Escritura: copia de seguridad + atómica (temporal + rename) ──────────\n\nfunction escrituraAtomicaConCopia(authPath: string, contenido: string, contenidoParaCopia?: string): void {\n\t// El permiso del fichero (0600, o 0660 si un administrador lo gestiona) es\n\t// intencional y no es nuestro para decidir — igual que\n\t// AUTH_FILE_WRITE_OPTIONS en auth-storage.ts, que solo fija el modo al\n\t// CREAR. Un rename sustituye el inodo entero, así que sin esto el permiso\n\t// original se perdería silenciosamente en cada recifrado.\n\tconst modoExistente = existsSync(authPath) ? statSync(authPath).mode & 0o777 : 0o600;\n\t// Copia ANTES de tocar el fichero real: si el rename de abajo no llegara a\n\t// completarse (disco lleno a mitad, proceso matado entre write y rename),\n\t// .bak es la única vía para no perder el acceso a TODOS los proveedores.\n\t//\n\t// `contenidoParaCopia` (si se pasa) sustituye lo que hay en disco: la\n\t// primera migración de un auth.json en claro pasa por aquí con el fichero\n\t// TODAVÍA en claro sobre disco, y una copia literal (`readFileSync`)\n\t// dejaría el secreto en claro para siempre en `.bak` — con el mismo modo\n\t// 0600 que el propio auth.json ya tenía, así que no cierra nada: reabre\n\t// exactamente el agujero que este módulo existe para tapar. Quien llama\n\t// (`escribirConCifradoSiHayClave`) cifra ese contenido antes de pasarlo.\n\tif (existsSync(authPath)) {\n\t\tconst backupPath = `${authPath}.bak`;\n\t\twriteFileSync(backupPath, contenidoParaCopia ?? readFileSync(authPath), { mode: modoExistente });\n\t\tchmodSync(backupPath, modoExistente); // mismo motivo que el temporal: el umask no debe recortar el modo\n\t}\n\tconst tmpPath = `${authPath}.tmp-${process.pid}-${Date.now()}`;\n\twriteFileSync(tmpPath, contenido, { encoding: \"utf-8\", mode: modoExistente });\n\t// El `mode` de writeFileSync pasa por el umask del proceso al CREAR un\n\t// fichero (0660 con umask 022 se queda en 0640) — algo que un `writeFileSync`\n\t// normal sobre un fichero YA existente no sufre, porque el modo se ignora\n\t// del todo si no hay creación. Como el temporal siempre es nuevo, hace\n\t// falta un chmod explícito (ignora el umask) para replicar ese mismo\n\t// comportamiento y no perder un modo gestionado por un administrador.\n\tchmodSync(tmpPath, modoExistente);\n\trenameSync(tmpPath, authPath); // rename es atómico dentro del mismo filesystem\n}\n\nlet avisoSinLlaveroMostrado = false;\n\n/** Se llama tanto al detectar un fichero en claro sin poder cifrarlo como al querer escribir sin llavero. */\nfunction avisarSinLlaveroUnaVez(): void {\n\tif (avisoSinLlaveroMostrado) return;\n\tavisoSinLlaveroMostrado = true;\n\tconsole.error(\n\t\t`[ada] auth.json NO se cifra: no hay llavero del sistema disponible en esta máquina ` +\n\t\t\t`(CI, contenedor, o Linux sin secret-service). Una clave guardada en el mismo disco que ` +\n\t\t\t`el fichero que protege sería ofuscación, no cifrado — se deja en claro con permisos 0600, ` +\n\t\t\t`como hasta ahora.`,\n\t);\n}\n\nfunction escribirConCifradoSiHayClave(authPath: string, contenidoClaro: string): void {\n\tconst clave = obtenerOCrearClave();\n\tif (!clave) {\n\t\tavisarSinLlaveroUnaVez();\n\t\tescrituraAtomicaConCopia(authPath, contenidoClaro);\n\t\treturn;\n\t}\n\t// Si lo que hay AHORA en disco está en claro (primera migración), la copia\n\t// de seguridad se cifra también con la misma clave — en vez de dejar que\n\t// `escrituraAtomicaConCopia` copie los bytes tal cual. `.bak` sigue\n\t// sirviendo para recuperar de una escritura a medias: al restaurarlo,\n\t// `decodificarParaLectura` reconoce la cabecera y lo descifra igual que al\n\t// auth.json real.\n\tconst actual = existsSync(authPath) ? readFileSync(authPath, \"utf-8\") : undefined;\n\tconst copiaSegura = actual !== undefined && !esFormatoCifrado(actual) ? cifrar(actual, clave) : actual;\n\tescrituraAtomicaConCopia(authPath, cifrar(contenidoClaro, clave), copiaSegura);\n}\n\nlet avisoCorruptoMostrado = false;\n\n/**\n * `AuthStorage.reload()` (upstream, `auth-storage.ts`) atrapa CUALQUIER error\n * de su backend y lo trata como \"transitorio, conserva el último estado\n * bueno\" — y sin `signal`, `readLatestData()` hace lo mismo. Si solo\n * lanzáramos, ese catch se come el error y el llamador ve \"no hay\n * credenciales\" en vez de \"no he podido leerlas\": exactamente la confusión\n * que no puede pasar (ver AGENTS.md, regla de errores). Por eso esto SIEMPRE\n * imprime la guía en stderr, una vez, ANTES de lanzar: quien atrape la\n * excepción se la queda para sí, pero el aviso ya salió por su cuenta.\n */\nfunction lanzarCorrupto(authPath: string, causa: unknown): never {\n\tconst error = new AuthJsonCorruptoError(authPath, causa);\n\tif (!avisoCorruptoMostrado) {\n\t\tavisoCorruptoMostrado = true;\n\t\tconsole.error(`[ada] ${error.message}`);\n\t}\n\tthrow error;\n}\n\n/** Descifra si hace falta; el contenido en claro se devuelve tal cual, sin adivinar. */\nfunction decodificarParaLectura(authPath: string, contenidoBruto: string | undefined): string | undefined {\n\tif (contenidoBruto === undefined || !esFormatoCifrado(contenidoBruto)) return contenidoBruto;\n\tconst clave = obtenerOCrearClave();\n\tif (!clave) {\n\t\tlanzarCorrupto(\n\t\t\tauthPath,\n\t\t\tnew Error(\"el fichero está cifrado pero no hay llavero disponible para descifrarlo aquí\"),\n\t\t);\n\t}\n\ttry {\n\t\treturn descifrar(contenidoBruto, clave);\n\t} catch (error) {\n\t\tlanzarCorrupto(authPath, error);\n\t}\n}\n\n// ─── Migración en segundo plano (nunca dentro del candado de la lectura) ──\n\nconst migracionEnCursoPara = new Set<string>();\n\nfunction programarMigracionEnSegundoPlano(interno: AuthStorageBackend, authPath: string): void {\n\tif (!hayLlaveroDisponible()) {\n\t\t// Sin llavero no hay nada que recifrar: pedir el candado igualmente\n\t\t// solo para reescribir el mismo texto en claro es trabajo (y contención\n\t\t// entre procesos) sin beneficio. Basta con avisar.\n\t\tavisarSinLlaveroUnaVez();\n\t\treturn;\n\t}\n\tif (migracionEnCursoPara.has(authPath)) return; // ya hay una en vuelo; la lectura repetida no acumula trabajo\n\tmigracionEnCursoPara.add(authPath);\n\t// setImmediate: la lectura que detectó \"en claro\" todavía mantiene el\n\t// candado de `interno` abierto en su propia pila de llamadas. Pedirlo de\n\t// nuevo aquí mismo se autobloquearía; con setImmediate se agenda para\n\t// DESPUÉS de que esa lectura suelte el candado.\n\tsetImmediate(() => {\n\t\tvoid interno\n\t\t\t.withLockAsync(async (actual) => {\n\t\t\t\tif (actual === undefined || esFormatoCifrado(actual)) {\n\t\t\t\t\treturn { result: undefined }; // otro proceso ya migró, o no hay nada que migrar\n\t\t\t\t}\n\t\t\t\tescribirConCifradoSiHayClave(authPath, actual);\n\t\t\t\t// Ya escribimos nosotros mismos (copia + atómico); devolver `next`\n\t\t\t\t// aquí haría que el backend interno reescribiera SIN copia de\n\t\t\t\t// seguridad, pisando la que acabamos de crear.\n\t\t\t\treturn { result: undefined };\n\t\t\t}, {})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`[ada] no se pudo recifrar auth.json en segundo plano: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tmigracionEnCursoPara.delete(authPath);\n\t\t\t});\n\t});\n}\n\n// ─── El wrapper ─────────────────────────────────────────────────────────────\n\n/**\n * Envuelve un `AuthStorageBackend` (normalmente un `FileAuthStorageBackend`\n * ya construido, que sigue poseyendo el candado entre procesos) para que\n * cifre/descifre en reposo de forma transparente para quien lo use.\n */\nexport function envolverBackendCifrado(interno: AuthStorageBackend, authPath: string): AuthStorageBackend {\n\treturn {\n\t\twithLock<T>(fn: (current: string | undefined) => { result: T; next?: string }): T {\n\t\t\treturn interno.withLock((actual) => {\n\t\t\t\tconst claro = decodificarParaLectura(authPath, actual);\n\t\t\t\tif (actual !== undefined && !esFormatoCifrado(actual)) {\n\t\t\t\t\tprogramarMigracionEnSegundoPlano(interno, authPath);\n\t\t\t\t}\n\t\t\t\tconst { result, next } = fn(claro);\n\t\t\t\tif (next !== undefined) escribirConCifradoSiHayClave(authPath, next);\n\t\t\t\treturn { result }; // `next` siempre undefined hacia `interno`: la escritura ya ocurrió arriba\n\t\t\t});\n\t\t},\n\t\tasync withLockAsync<T>(\n\t\t\tfn: (current: string | undefined) => Promise<{ result: T; next?: string }>,\n\t\t\toptions?: AuthOperationOptions,\n\t\t): Promise<T> {\n\t\t\treturn interno.withLockAsync(async (actual) => {\n\t\t\t\tconst claro = decodificarParaLectura(authPath, actual);\n\t\t\t\tif (actual !== undefined && !esFormatoCifrado(actual)) {\n\t\t\t\t\tprogramarMigracionEnSegundoPlano(interno, authPath);\n\t\t\t\t}\n\t\t\t\tconst { result, next } = await fn(claro);\n\t\t\t\tif (next !== undefined) escribirConCifradoSiHayClave(authPath, next);\n\t\t\t\treturn { result };\n\t\t\t}, options);\n\t\t},\n\t};\n}\n\n/**\n * Lectura síncrona de UNA credencial ya guardada, descifrando si hace falta.\n *\n * Sustituye a `readStoredCredential` (upstream, `auth-storage.ts`), exportada\n * en `index.ts` como parte de la API pública del SDK (`@hoilab/ada-cli`) para\n * lecturas puntuales sin instanciar `AuthStorage`. Esa función hace su propio\n * `readFileSync` + `JSON.parse` sin pasar por este módulo: con auth.json ya\n * migrado a cifrado, la cabecera `ADA-AUTHJSON-CIFRADO-V1\\n` delante del JSON\n * hace que `JSON.parse` lance un `SyntaxError` que su `catch { return\n * undefined; }` convierte en \"no hay credencial\" — indistinguible de un\n * proveedor sin configurar, para CUALQUIER consumidor de esta función\n * pública, presente o futuro. Mismo nombre y misma firma (con el mismo valor\n * por defecto de `authPath`) para seguir siendo un reemplazo directo.\n */\nexport function leerCredencialGuardada(\n\tproviderId: string,\n\tauthPath: string = join(getAgentDir(), \"auth.json\"),\n): Credential | undefined {\n\ttry {\n\t\tconst bruto = stripBom(readFileSync(authPath, \"utf-8\"));\n\t\tconst claro = decodificarParaLectura(authPath, bruto);\n\t\tif (claro === undefined) return undefined;\n\t\tconst datos = JSON.parse(claro) as Record<string, Credential>;\n\t\treturn datos[providerId];\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Solo para pruebas: limpia el estado en memoria del módulo entre casos. */\nexport function __resetEstadoParaPruebas(): void {\n\tclaveEnCache = undefined;\n\tavisoSinLlaveroMostrado = false;\n\tavisoCorruptoMostrado = false;\n\tmigracionEnCursoPara.clear();\n}\n\n/** Solo para pruebas: borra la clave maestra del llavero real de esta máquina. */\nexport function __eliminarClaveDeLlaveroParaPruebas(): void {\n\tif (!esMacOS()) return;\n\tconst servicio = servicioLlavero(); // fuera del try: ver `leerClaveDelLlavero`\n\ttry {\n\t\texecFileSync(\"/usr/bin/security\", [\"delete-generic-password\", \"-s\", servicio, \"-a\", CUENTA_LLAVERO], {\n\t\t\ttimeout: TIMEOUT_LLAVERO_MS,\n\t\t\twindowsHide: true,\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t});\n\t} catch {\n\t\t// no había clave que borrar\n\t}\n}\n"]}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Servidor HTTP del broker de credenciales.
3
+ *
4
+ * No es un producto nuevo: es un MODO de `ada-cli serve` (ver
5
+ * `cli/serve-command.ts`). El gateway de oh-my-pi resuelve la credencial en el
6
+ * servidor y la inyecta para que el cliente nunca vea el token; aquí no hay
7
+ * proxy de peticiones a proveedores (fuera de alcance), así que `/v1/credential`
8
+ * SÍ entrega el secreto — es lo mínimo para que un cliente pueda llamar al
9
+ * proveedor sin tenerlo nunca en su disco. Lo que sí se copia sin rebajar:
10
+ *
11
+ * - **Fallar cerrado.** Sin bearer configurado, `iniciarServidorBroker` lanza
12
+ * antes de abrir el socket de escucha. Un broker que arrancara sin auth
13
+ * "por ahora" es exactamente el tipo de atajo que se queda para siempre.
14
+ * - **Comparación en tiempo constante del bearer**, para no dar una guía de
15
+ * temporización a quien intente adivinarlo por fuerza bruta.
16
+ * - **Todo excepto `/v1/health` exige bearer.** La salud tiene que poder
17
+ * contestar aunque el token esté mal configurado en quien pregunta — es lo
18
+ * único que un balanceador o un `curl` de comprobación necesita sin secreto.
19
+ *
20
+ * Cada resolución de credencial y cada reporte de uso quedan en el libro de
21
+ * sesión (`core/audit/libro.ts`) — es la pieza que oh-my-pi no tiene: quién
22
+ * usó qué cuenta y cuándo, auditable.
23
+ */
24
+ import type { LibroDeSesion } from "../audit/libro.ts";
25
+ import type { CredencialPool } from "./pool.ts";
26
+ export declare const DEFAULT_BROKER_BIND = "127.0.0.1:8765";
27
+ export interface OpcionesServidorBroker {
28
+ pool: CredencialPool;
29
+ /** Bearer requerido en cada petición salvo `/v1/health`. Vacío = error: ver `iniciarServidorBroker`. */
30
+ token: string;
31
+ libro: LibroDeSesion;
32
+ /** `host:puerto`. Por defecto `127.0.0.1:8765` — solo loopback, sin exposición externa. */
33
+ bind?: string;
34
+ /**
35
+ * Permite escuchar FUERA de loopback aun sabiendo que el transporte es HTTP
36
+ * sin cifrar. Sin esto, un `bind` a una interfaz real no arranca.
37
+ *
38
+ * El nombre es largo y feo a propósito: quien lo escribe no puede decir
39
+ * después que no lo sabía, y queda escrito en el fichero de despliegue —que
40
+ * es auditable— en vez de en un aviso que se va con el scroll.
41
+ */
42
+ inseguroSinTls?: boolean;
43
+ }
44
+ export interface ServidorBroker {
45
+ url: string;
46
+ puerto: number;
47
+ cerrar(): Promise<void>;
48
+ }
49
+ /**
50
+ * Arranca el broker. Lanza SIN escuchar si no hay bearer — fallar cerrado, no
51
+ * "escuchar sin auth por ahora". Esto es lo que la puerta de verificación
52
+ * comprueba forzando el caso vacío y confirmando que no hay servidor.
53
+ */
54
+ export declare function iniciarServidorBroker(opciones: OpcionesServidorBroker): Promise<ServidorBroker>;
55
+ //# sourceMappingURL=servidor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"servidor.d.ts","sourceRoot":"","sources":["../../../src/core/credenciales/servidor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AAEpD,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,cAAc,CAAC;IACrB,0GAAwG;IACxG,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,aAAa,CAAC;IACrB,8FAA2F;IAC3F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAuCD;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAAC,cAAc,CAAC,CA2JrG","sourcesContent":["/**\n * Servidor HTTP del broker de credenciales.\n *\n * No es un producto nuevo: es un MODO de `ada-cli serve` (ver\n * `cli/serve-command.ts`). El gateway de oh-my-pi resuelve la credencial en el\n * servidor y la inyecta para que el cliente nunca vea el token; aquí no hay\n * proxy de peticiones a proveedores (fuera de alcance), así que `/v1/credential`\n * SÍ entrega el secreto — es lo mínimo para que un cliente pueda llamar al\n * proveedor sin tenerlo nunca en su disco. Lo que sí se copia sin rebajar:\n *\n * - **Fallar cerrado.** Sin bearer configurado, `iniciarServidorBroker` lanza\n * antes de abrir el socket de escucha. Un broker que arrancara sin auth\n * \"por ahora\" es exactamente el tipo de atajo que se queda para siempre.\n * - **Comparación en tiempo constante del bearer**, para no dar una guía de\n * temporización a quien intente adivinarlo por fuerza bruta.\n * - **Todo excepto `/v1/health` exige bearer.** La salud tiene que poder\n * contestar aunque el token esté mal configurado en quien pregunta — es lo\n * único que un balanceador o un `curl` de comprobación necesita sin secreto.\n *\n * Cada resolución de credencial y cada reporte de uso quedan en el libro de\n * sesión (`core/audit/libro.ts`) — es la pieza que oh-my-pi no tiene: quién\n * usó qué cuenta y cuándo, auditable.\n */\n\nimport { timingSafeEqual } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport type { LibroDeSesion } from \"../audit/libro.ts\";\nimport type { CredencialPool } from \"./pool.ts\";\n\nexport const DEFAULT_BROKER_BIND = \"127.0.0.1:8765\";\n\nexport interface OpcionesServidorBroker {\n\tpool: CredencialPool;\n\t/** Bearer requerido en cada petición salvo `/v1/health`. Vacío = error: ver `iniciarServidorBroker`. */\n\ttoken: string;\n\tlibro: LibroDeSesion;\n\t/** `host:puerto`. Por defecto `127.0.0.1:8765` — solo loopback, sin exposición externa. */\n\tbind?: string;\n\t/**\n\t * Permite escuchar FUERA de loopback aun sabiendo que el transporte es HTTP\n\t * sin cifrar. Sin esto, un `bind` a una interfaz real no arranca.\n\t *\n\t * El nombre es largo y feo a propósito: quien lo escribe no puede decir\n\t * después que no lo sabía, y queda escrito en el fichero de despliegue —que\n\t * es auditable— en vez de en un aviso que se va con el scroll.\n\t */\n\tinseguroSinTls?: boolean;\n}\n\nexport interface ServidorBroker {\n\turl: string;\n\tpuerto: number;\n\tcerrar(): Promise<void>;\n}\n\nfunction leerCuerpo(req: IncomingMessage): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst trozos: Buffer[] = [];\n\t\treq.on(\"data\", (t) => trozos.push(t));\n\t\treq.on(\"end\", () => resolve(Buffer.concat(trozos).toString(\"utf-8\")));\n\t\treq.on(\"error\", reject);\n\t});\n}\n\nfunction enviarJson(res: ServerResponse, estado: number, cuerpo: unknown): void {\n\tconst texto = JSON.stringify(cuerpo);\n\tres.writeHead(estado, {\n\t\t\"content-type\": \"application/json; charset=utf-8\",\n\t\t\"content-length\": Buffer.byteLength(texto),\n\t});\n\tres.end(texto);\n}\n\n/** `true` si `host` no sale de la máquina — lo único que hace inofensivo el HTTP sin cifrar. */\nfunction esLoopback(host: string): boolean {\n\treturn host === \"127.0.0.1\" || host === \"localhost\" || host === \"::1\" || host === \"[::1]\";\n}\n\n/**\n * Compara el bearer en tiempo constante. `timingSafeEqual` exige buffers de\n * igual longitud, así que una longitud distinta ya es \"no coincide\" sin pasar\n * por la comparación — no hay atajo de timing ahí porque la longitud de un\n * bearer típico no es secreta (va en la URL de configuración de cada cliente).\n */\nfunction bearerValido(cabecera: string | undefined, token: string): boolean {\n\tif (!cabecera?.startsWith(\"Bearer \")) return false;\n\tconst recibido = Buffer.from(cabecera.slice(\"Bearer \".length));\n\tconst esperado = Buffer.from(token);\n\tif (recibido.length !== esperado.length) return false;\n\treturn timingSafeEqual(recibido, esperado);\n}\n\n/**\n * Arranca el broker. Lanza SIN escuchar si no hay bearer — fallar cerrado, no\n * \"escuchar sin auth por ahora\". Esto es lo que la puerta de verificación\n * comprueba forzando el caso vacío y confirmando que no hay servidor.\n */\nexport async function iniciarServidorBroker(opciones: OpcionesServidorBroker): Promise<ServidorBroker> {\n\tconst token = opciones.token?.trim() ?? \"\";\n\tif (token === \"\") {\n\t\tthrow new Error(\n\t\t\t\"El broker no arranca sin un bearer configurado (ADA_BROKER_TOKEN). \" +\n\t\t\t\t\"Escuchar sin auth expondría las credenciales de todo el equipo a quien alcance el puerto.\",\n\t\t);\n\t}\n\n\tconst { pool, libro } = opciones;\n\tconst [host, puertoTexto] = (opciones.bind ?? DEFAULT_BROKER_BIND).split(\":\");\n\tconst puertoPedido = Number(puertoTexto);\n\n\t// El bearer viaja en texto plano: HTTP, no HTTPS. En loopback eso es\n\t// inofensivo (no sale de la máquina). En cuanto el bind apunta a una interfaz\n\t// real —que es justo lo que hace falta para que el equipo lo alcance desde\n\t// otro portátil, el caso de uso que motiva este módulo— el bearer y las\n\t// credenciales que reparte cruzan la red sin cifrar: quien esnife ese\n\t// segmento se lleva el token y, con él, cualquier credencial.\n\t//\n\t// Aquí SE FALLA CERRADO, y no es lo mismo que avisar. Un aviso por stderr\n\t// compite con la señal de éxito («broker escuchando en 0.0.0.0:8765») y\n\t// pierde: el operador lee que arrancó y sigue. Es un fallo que se lee como\n\t// éxito, la familia de defectos que más nos ha costado en este repositorio.\n\t//\n\t// El despliegue legítimo —un proxy TLS terminando por delante de este mismo\n\t// bind— sigue siendo posible: escribe `inseguroSinTls` una vez y queda en su\n\t// fichero de configuración, que es auditable. Un aviso no queda en ninguna\n\t// parte, y «te avisamos por stderr» no se sostiene delante de un auditor.\n\tif (!esLoopback(host) && opciones.inseguroSinTls !== true) {\n\t\tthrow new Error(\n\t\t\t`El broker no arranca en ${host}: fuera de loopback el bearer y todas las credenciales que ` +\n\t\t\t\t\"reparte viajarían en HTTP sin cifrar, y cualquiera en esa red podría esnifarlos.\\n\\n\" +\n\t\t\t\t\" · Recomendado: déjalo en 127.0.0.1 y llega a él por un túnel (SSH, WireGuard) o por un\\n\" +\n\t\t\t\t\" proxy TLS que termine delante.\\n\" +\n\t\t\t\t\" · Si YA tienes ese proxy TLS delante de este mismo bind, pasa `inseguroSinTls: true`\\n\" +\n\t\t\t\t\" (CLI: --inseguro-sin-tls) para confirmarlo de forma explícita.\",\n\t\t);\n\t}\n\tif (!esLoopback(host)) {\n\t\t// Llegar aquí es haberlo pedido a conciencia. Se deja constancia igualmente:\n\t\t// el que lo escribió no es siempre el que lee los registros seis meses después.\n\t\tconsole.error(\n\t\t\t`AVISO: el broker escucha en ${host} sin TLS propio, por --inseguro-sin-tls. Solo es seguro si ` +\n\t\t\t\t\"hay un proxy TLS terminando delante de este bind.\",\n\t\t);\n\t}\n\n\tconst manejar = async (req: IncomingMessage, res: ServerResponse): Promise<void> => {\n\t\tconst url = new URL(req.url ?? \"/\", \"http://localhost\");\n\n\t\tif (req.method === \"GET\" && url.pathname === \"/v1/health\") {\n\t\t\tenviarJson(res, 200, { ok: true });\n\t\t\treturn;\n\t\t}\n\n\t\tif (!bearerValido(req.headers.authorization, token)) {\n\t\t\tenviarJson(res, 401, { error: \"bearer-invalido\" });\n\t\t\treturn;\n\t\t}\n\n\t\tif (req.method === \"GET\" && url.pathname === \"/v1/snapshot\") {\n\t\t\tenviarJson(res, 200, { credenciales: pool.snapshot() });\n\t\t\treturn;\n\t\t}\n\n\t\tif (req.method === \"POST\" && url.pathname === \"/v1/credential\") {\n\t\t\tlet cuerpo: { proveedor?: string; promptCacheKey?: string; cliente?: string };\n\t\t\ttry {\n\t\t\t\tcuerpo = JSON.parse(await leerCuerpo(req));\n\t\t\t} catch {\n\t\t\t\tenviarJson(res, 400, { error: \"cuerpo-invalido\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst proveedor = cuerpo.proveedor;\n\t\t\tif (!proveedor) {\n\t\t\t\tenviarJson(res, 400, { error: \"falta-proveedor\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst elegida = pool.elegir(proveedor, cuerpo.promptCacheKey);\n\t\t\tawait libro.anotar({\n\t\t\t\ttipo: \"credencial\",\n\t\t\t\taccion: \"resuelta\",\n\t\t\t\tproveedor,\n\t\t\t\tcredencialId: elegida?.id ?? null,\n\t\t\t\tresultado: elegida ? \"ok\" : \"sin-credencial-activa\",\n\t\t\t\tcliente: cuerpo.cliente,\n\t\t\t});\n\t\t\tif (!elegida) {\n\t\t\t\t// \"No hay nada\" (todas bloqueadas o proveedor desconocido), no \"no he\n\t\t\t\t// podido\": por eso 404 con un motivo, no un 500.\n\t\t\t\tenviarJson(res, 404, { error: \"sin-credencial-activa\", proveedor });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tenviarJson(res, 200, elegida);\n\t\t\treturn;\n\t\t}\n\n\t\tif (req.method === \"POST\" && url.pathname === \"/v1/usage\") {\n\t\t\tlet cuerpo: { id?: string; ok?: boolean; estadoHttp?: number; mensaje?: string; proveedor?: string };\n\t\t\ttry {\n\t\t\t\tcuerpo = JSON.parse(await leerCuerpo(req));\n\t\t\t} catch {\n\t\t\t\tenviarJson(res, 400, { error: \"cuerpo-invalido\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!cuerpo.id) {\n\t\t\t\tenviarJson(res, 400, { error: \"falta-id\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst resultado =\n\t\t\t\tcuerpo.ok === true\n\t\t\t\t\t? ({ ok: true } as const)\n\t\t\t\t\t: ({ ok: false, estadoHttp: cuerpo.estadoHttp, mensaje: cuerpo.mensaje ?? \"\" } as const);\n\t\t\tconst efecto = pool.marcarUso(cuerpo.id, resultado);\n\t\t\tif (!efecto) {\n\t\t\t\tenviarJson(res, 404, { error: \"credencial-desconocida\", id: cuerpo.id });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait libro.anotar({\n\t\t\t\ttipo: \"credencial\",\n\t\t\t\taccion: \"uso\",\n\t\t\t\tproveedor: cuerpo.proveedor ?? \"desconocido\",\n\t\t\t\tcredencialId: cuerpo.id,\n\t\t\t\tresultado: efecto.clase,\n\t\t\t});\n\t\t\tenviarJson(res, 200, efecto);\n\t\t\treturn;\n\t\t}\n\n\t\tenviarJson(res, 404, { error: \"ruta-desconocida\" });\n\t};\n\n\tconst server: Server = createServer((req, res) => {\n\t\tmanejar(req, res).catch((error) => {\n\t\t\tenviarJson(res, 500, {\n\t\t\t\terror: \"fallo-interno\",\n\t\t\t\tmensaje: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t});\n\t});\n\n\tawait new Promise<void>((resolve, reject) => {\n\t\tserver.once(\"error\", reject);\n\t\tserver.listen(puertoPedido, host, () => resolve());\n\t});\n\n\tconst direccion = server.address();\n\tconst puerto = typeof direccion === \"object\" && direccion ? direccion.port : puertoPedido;\n\n\treturn {\n\t\turl: `http://${host}:${puerto}`,\n\t\tpuerto,\n\t\tcerrar: () => new Promise<void>((resolve) => server.close(() => resolve())),\n\t};\n}\n"]}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Servidor HTTP del broker de credenciales.
3
+ *
4
+ * No es un producto nuevo: es un MODO de `ada-cli serve` (ver
5
+ * `cli/serve-command.ts`). El gateway de oh-my-pi resuelve la credencial en el
6
+ * servidor y la inyecta para que el cliente nunca vea el token; aquí no hay
7
+ * proxy de peticiones a proveedores (fuera de alcance), así que `/v1/credential`
8
+ * SÍ entrega el secreto — es lo mínimo para que un cliente pueda llamar al
9
+ * proveedor sin tenerlo nunca en su disco. Lo que sí se copia sin rebajar:
10
+ *
11
+ * - **Fallar cerrado.** Sin bearer configurado, `iniciarServidorBroker` lanza
12
+ * antes de abrir el socket de escucha. Un broker que arrancara sin auth
13
+ * "por ahora" es exactamente el tipo de atajo que se queda para siempre.
14
+ * - **Comparación en tiempo constante del bearer**, para no dar una guía de
15
+ * temporización a quien intente adivinarlo por fuerza bruta.
16
+ * - **Todo excepto `/v1/health` exige bearer.** La salud tiene que poder
17
+ * contestar aunque el token esté mal configurado en quien pregunta — es lo
18
+ * único que un balanceador o un `curl` de comprobación necesita sin secreto.
19
+ *
20
+ * Cada resolución de credencial y cada reporte de uso quedan en el libro de
21
+ * sesión (`core/audit/libro.ts`) — es la pieza que oh-my-pi no tiene: quién
22
+ * usó qué cuenta y cuándo, auditable.
23
+ */
24
+ import { timingSafeEqual } from "node:crypto";
25
+ import { createServer } from "node:http";
26
+ export const DEFAULT_BROKER_BIND = "127.0.0.1:8765";
27
+ function leerCuerpo(req) {
28
+ return new Promise((resolve, reject) => {
29
+ const trozos = [];
30
+ req.on("data", (t) => trozos.push(t));
31
+ req.on("end", () => resolve(Buffer.concat(trozos).toString("utf-8")));
32
+ req.on("error", reject);
33
+ });
34
+ }
35
+ function enviarJson(res, estado, cuerpo) {
36
+ const texto = JSON.stringify(cuerpo);
37
+ res.writeHead(estado, {
38
+ "content-type": "application/json; charset=utf-8",
39
+ "content-length": Buffer.byteLength(texto),
40
+ });
41
+ res.end(texto);
42
+ }
43
+ /** `true` si `host` no sale de la máquina — lo único que hace inofensivo el HTTP sin cifrar. */
44
+ function esLoopback(host) {
45
+ return host === "127.0.0.1" || host === "localhost" || host === "::1" || host === "[::1]";
46
+ }
47
+ /**
48
+ * Compara el bearer en tiempo constante. `timingSafeEqual` exige buffers de
49
+ * igual longitud, así que una longitud distinta ya es "no coincide" sin pasar
50
+ * por la comparación — no hay atajo de timing ahí porque la longitud de un
51
+ * bearer típico no es secreta (va en la URL de configuración de cada cliente).
52
+ */
53
+ function bearerValido(cabecera, token) {
54
+ if (!cabecera?.startsWith("Bearer "))
55
+ return false;
56
+ const recibido = Buffer.from(cabecera.slice("Bearer ".length));
57
+ const esperado = Buffer.from(token);
58
+ if (recibido.length !== esperado.length)
59
+ return false;
60
+ return timingSafeEqual(recibido, esperado);
61
+ }
62
+ /**
63
+ * Arranca el broker. Lanza SIN escuchar si no hay bearer — fallar cerrado, no
64
+ * "escuchar sin auth por ahora". Esto es lo que la puerta de verificación
65
+ * comprueba forzando el caso vacío y confirmando que no hay servidor.
66
+ */
67
+ export async function iniciarServidorBroker(opciones) {
68
+ const token = opciones.token?.trim() ?? "";
69
+ if (token === "") {
70
+ throw new Error("El broker no arranca sin un bearer configurado (ADA_BROKER_TOKEN). " +
71
+ "Escuchar sin auth expondría las credenciales de todo el equipo a quien alcance el puerto.");
72
+ }
73
+ const { pool, libro } = opciones;
74
+ const [host, puertoTexto] = (opciones.bind ?? DEFAULT_BROKER_BIND).split(":");
75
+ const puertoPedido = Number(puertoTexto);
76
+ // El bearer viaja en texto plano: HTTP, no HTTPS. En loopback eso es
77
+ // inofensivo (no sale de la máquina). En cuanto el bind apunta a una interfaz
78
+ // real —que es justo lo que hace falta para que el equipo lo alcance desde
79
+ // otro portátil, el caso de uso que motiva este módulo— el bearer y las
80
+ // credenciales que reparte cruzan la red sin cifrar: quien esnife ese
81
+ // segmento se lleva el token y, con él, cualquier credencial.
82
+ //
83
+ // Aquí SE FALLA CERRADO, y no es lo mismo que avisar. Un aviso por stderr
84
+ // compite con la señal de éxito («broker escuchando en 0.0.0.0:8765») y
85
+ // pierde: el operador lee que arrancó y sigue. Es un fallo que se lee como
86
+ // éxito, la familia de defectos que más nos ha costado en este repositorio.
87
+ //
88
+ // El despliegue legítimo —un proxy TLS terminando por delante de este mismo
89
+ // bind— sigue siendo posible: escribe `inseguroSinTls` una vez y queda en su
90
+ // fichero de configuración, que es auditable. Un aviso no queda en ninguna
91
+ // parte, y «te avisamos por stderr» no se sostiene delante de un auditor.
92
+ if (!esLoopback(host) && opciones.inseguroSinTls !== true) {
93
+ throw new Error(`El broker no arranca en ${host}: fuera de loopback el bearer y todas las credenciales que ` +
94
+ "reparte viajarían en HTTP sin cifrar, y cualquiera en esa red podría esnifarlos.\n\n" +
95
+ " · Recomendado: déjalo en 127.0.0.1 y llega a él por un túnel (SSH, WireGuard) o por un\n" +
96
+ " proxy TLS que termine delante.\n" +
97
+ " · Si YA tienes ese proxy TLS delante de este mismo bind, pasa `inseguroSinTls: true`\n" +
98
+ " (CLI: --inseguro-sin-tls) para confirmarlo de forma explícita.");
99
+ }
100
+ if (!esLoopback(host)) {
101
+ // Llegar aquí es haberlo pedido a conciencia. Se deja constancia igualmente:
102
+ // el que lo escribió no es siempre el que lee los registros seis meses después.
103
+ console.error(`AVISO: el broker escucha en ${host} sin TLS propio, por --inseguro-sin-tls. Solo es seguro si ` +
104
+ "hay un proxy TLS terminando delante de este bind.");
105
+ }
106
+ const manejar = async (req, res) => {
107
+ const url = new URL(req.url ?? "/", "http://localhost");
108
+ if (req.method === "GET" && url.pathname === "/v1/health") {
109
+ enviarJson(res, 200, { ok: true });
110
+ return;
111
+ }
112
+ if (!bearerValido(req.headers.authorization, token)) {
113
+ enviarJson(res, 401, { error: "bearer-invalido" });
114
+ return;
115
+ }
116
+ if (req.method === "GET" && url.pathname === "/v1/snapshot") {
117
+ enviarJson(res, 200, { credenciales: pool.snapshot() });
118
+ return;
119
+ }
120
+ if (req.method === "POST" && url.pathname === "/v1/credential") {
121
+ let cuerpo;
122
+ try {
123
+ cuerpo = JSON.parse(await leerCuerpo(req));
124
+ }
125
+ catch {
126
+ enviarJson(res, 400, { error: "cuerpo-invalido" });
127
+ return;
128
+ }
129
+ const proveedor = cuerpo.proveedor;
130
+ if (!proveedor) {
131
+ enviarJson(res, 400, { error: "falta-proveedor" });
132
+ return;
133
+ }
134
+ const elegida = pool.elegir(proveedor, cuerpo.promptCacheKey);
135
+ await libro.anotar({
136
+ tipo: "credencial",
137
+ accion: "resuelta",
138
+ proveedor,
139
+ credencialId: elegida?.id ?? null,
140
+ resultado: elegida ? "ok" : "sin-credencial-activa",
141
+ cliente: cuerpo.cliente,
142
+ });
143
+ if (!elegida) {
144
+ // "No hay nada" (todas bloqueadas o proveedor desconocido), no "no he
145
+ // podido": por eso 404 con un motivo, no un 500.
146
+ enviarJson(res, 404, { error: "sin-credencial-activa", proveedor });
147
+ return;
148
+ }
149
+ enviarJson(res, 200, elegida);
150
+ return;
151
+ }
152
+ if (req.method === "POST" && url.pathname === "/v1/usage") {
153
+ let cuerpo;
154
+ try {
155
+ cuerpo = JSON.parse(await leerCuerpo(req));
156
+ }
157
+ catch {
158
+ enviarJson(res, 400, { error: "cuerpo-invalido" });
159
+ return;
160
+ }
161
+ if (!cuerpo.id) {
162
+ enviarJson(res, 400, { error: "falta-id" });
163
+ return;
164
+ }
165
+ const resultado = cuerpo.ok === true
166
+ ? { ok: true }
167
+ : { ok: false, estadoHttp: cuerpo.estadoHttp, mensaje: cuerpo.mensaje ?? "" };
168
+ const efecto = pool.marcarUso(cuerpo.id, resultado);
169
+ if (!efecto) {
170
+ enviarJson(res, 404, { error: "credencial-desconocida", id: cuerpo.id });
171
+ return;
172
+ }
173
+ await libro.anotar({
174
+ tipo: "credencial",
175
+ accion: "uso",
176
+ proveedor: cuerpo.proveedor ?? "desconocido",
177
+ credencialId: cuerpo.id,
178
+ resultado: efecto.clase,
179
+ });
180
+ enviarJson(res, 200, efecto);
181
+ return;
182
+ }
183
+ enviarJson(res, 404, { error: "ruta-desconocida" });
184
+ };
185
+ const server = createServer((req, res) => {
186
+ manejar(req, res).catch((error) => {
187
+ enviarJson(res, 500, {
188
+ error: "fallo-interno",
189
+ mensaje: error instanceof Error ? error.message : String(error),
190
+ });
191
+ });
192
+ });
193
+ await new Promise((resolve, reject) => {
194
+ server.once("error", reject);
195
+ server.listen(puertoPedido, host, () => resolve());
196
+ });
197
+ const direccion = server.address();
198
+ const puerto = typeof direccion === "object" && direccion ? direccion.port : puertoPedido;
199
+ return {
200
+ url: `http://${host}:${puerto}`,
201
+ puerto,
202
+ cerrar: () => new Promise((resolve) => server.close(() => resolve())),
203
+ };
204
+ }
205
+ //# sourceMappingURL=servidor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"servidor.js","sourceRoot":"","sources":["../../../src/core/credenciales/servidor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Servidor HTTP del broker de credenciales.\n *\n * No es un producto nuevo: es un MODO de `ada-cli serve` (ver\n * `cli/serve-command.ts`). El gateway de oh-my-pi resuelve la credencial en el\n * servidor y la inyecta para que el cliente nunca vea el token; aquí no hay\n * proxy de peticiones a proveedores (fuera de alcance), así que `/v1/credential`\n * SÍ entrega el secreto — es lo mínimo para que un cliente pueda llamar al\n * proveedor sin tenerlo nunca en su disco. Lo que sí se copia sin rebajar:\n *\n * - **Fallar cerrado.** Sin bearer configurado, `iniciarServidorBroker` lanza\n * antes de abrir el socket de escucha. Un broker que arrancara sin auth\n * \"por ahora\" es exactamente el tipo de atajo que se queda para siempre.\n * - **Comparación en tiempo constante del bearer**, para no dar una guía de\n * temporización a quien intente adivinarlo por fuerza bruta.\n * - **Todo excepto `/v1/health` exige bearer.** La salud tiene que poder\n * contestar aunque el token esté mal configurado en quien pregunta — es lo\n * único que un balanceador o un `curl` de comprobación necesita sin secreto.\n *\n * Cada resolución de credencial y cada reporte de uso quedan en el libro de\n * sesión (`core/audit/libro.ts`) — es la pieza que oh-my-pi no tiene: quién\n * usó qué cuenta y cuándo, auditable.\n */\n\nimport { timingSafeEqual } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport type { LibroDeSesion } from \"../audit/libro.ts\";\nimport type { CredencialPool } from \"./pool.ts\";\n\nexport const DEFAULT_BROKER_BIND = \"127.0.0.1:8765\";\n\nexport interface OpcionesServidorBroker {\n\tpool: CredencialPool;\n\t/** Bearer requerido en cada petición salvo `/v1/health`. Vacío = error: ver `iniciarServidorBroker`. */\n\ttoken: string;\n\tlibro: LibroDeSesion;\n\t/** `host:puerto`. Por defecto `127.0.0.1:8765` — solo loopback, sin exposición externa. */\n\tbind?: string;\n\t/**\n\t * Permite escuchar FUERA de loopback aun sabiendo que el transporte es HTTP\n\t * sin cifrar. Sin esto, un `bind` a una interfaz real no arranca.\n\t *\n\t * El nombre es largo y feo a propósito: quien lo escribe no puede decir\n\t * después que no lo sabía, y queda escrito en el fichero de despliegue —que\n\t * es auditable— en vez de en un aviso que se va con el scroll.\n\t */\n\tinseguroSinTls?: boolean;\n}\n\nexport interface ServidorBroker {\n\turl: string;\n\tpuerto: number;\n\tcerrar(): Promise<void>;\n}\n\nfunction leerCuerpo(req: IncomingMessage): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst trozos: Buffer[] = [];\n\t\treq.on(\"data\", (t) => trozos.push(t));\n\t\treq.on(\"end\", () => resolve(Buffer.concat(trozos).toString(\"utf-8\")));\n\t\treq.on(\"error\", reject);\n\t});\n}\n\nfunction enviarJson(res: ServerResponse, estado: number, cuerpo: unknown): void {\n\tconst texto = JSON.stringify(cuerpo);\n\tres.writeHead(estado, {\n\t\t\"content-type\": \"application/json; charset=utf-8\",\n\t\t\"content-length\": Buffer.byteLength(texto),\n\t});\n\tres.end(texto);\n}\n\n/** `true` si `host` no sale de la máquina — lo único que hace inofensivo el HTTP sin cifrar. */\nfunction esLoopback(host: string): boolean {\n\treturn host === \"127.0.0.1\" || host === \"localhost\" || host === \"::1\" || host === \"[::1]\";\n}\n\n/**\n * Compara el bearer en tiempo constante. `timingSafeEqual` exige buffers de\n * igual longitud, así que una longitud distinta ya es \"no coincide\" sin pasar\n * por la comparación — no hay atajo de timing ahí porque la longitud de un\n * bearer típico no es secreta (va en la URL de configuración de cada cliente).\n */\nfunction bearerValido(cabecera: string | undefined, token: string): boolean {\n\tif (!cabecera?.startsWith(\"Bearer \")) return false;\n\tconst recibido = Buffer.from(cabecera.slice(\"Bearer \".length));\n\tconst esperado = Buffer.from(token);\n\tif (recibido.length !== esperado.length) return false;\n\treturn timingSafeEqual(recibido, esperado);\n}\n\n/**\n * Arranca el broker. Lanza SIN escuchar si no hay bearer — fallar cerrado, no\n * \"escuchar sin auth por ahora\". Esto es lo que la puerta de verificación\n * comprueba forzando el caso vacío y confirmando que no hay servidor.\n */\nexport async function iniciarServidorBroker(opciones: OpcionesServidorBroker): Promise<ServidorBroker> {\n\tconst token = opciones.token?.trim() ?? \"\";\n\tif (token === \"\") {\n\t\tthrow new Error(\n\t\t\t\"El broker no arranca sin un bearer configurado (ADA_BROKER_TOKEN). \" +\n\t\t\t\t\"Escuchar sin auth expondría las credenciales de todo el equipo a quien alcance el puerto.\",\n\t\t);\n\t}\n\n\tconst { pool, libro } = opciones;\n\tconst [host, puertoTexto] = (opciones.bind ?? DEFAULT_BROKER_BIND).split(\":\");\n\tconst puertoPedido = Number(puertoTexto);\n\n\t// El bearer viaja en texto plano: HTTP, no HTTPS. En loopback eso es\n\t// inofensivo (no sale de la máquina). En cuanto el bind apunta a una interfaz\n\t// real —que es justo lo que hace falta para que el equipo lo alcance desde\n\t// otro portátil, el caso de uso que motiva este módulo— el bearer y las\n\t// credenciales que reparte cruzan la red sin cifrar: quien esnife ese\n\t// segmento se lleva el token y, con él, cualquier credencial.\n\t//\n\t// Aquí SE FALLA CERRADO, y no es lo mismo que avisar. Un aviso por stderr\n\t// compite con la señal de éxito («broker escuchando en 0.0.0.0:8765») y\n\t// pierde: el operador lee que arrancó y sigue. Es un fallo que se lee como\n\t// éxito, la familia de defectos que más nos ha costado en este repositorio.\n\t//\n\t// El despliegue legítimo —un proxy TLS terminando por delante de este mismo\n\t// bind— sigue siendo posible: escribe `inseguroSinTls` una vez y queda en su\n\t// fichero de configuración, que es auditable. Un aviso no queda en ninguna\n\t// parte, y «te avisamos por stderr» no se sostiene delante de un auditor.\n\tif (!esLoopback(host) && opciones.inseguroSinTls !== true) {\n\t\tthrow new Error(\n\t\t\t`El broker no arranca en ${host}: fuera de loopback el bearer y todas las credenciales que ` +\n\t\t\t\t\"reparte viajarían en HTTP sin cifrar, y cualquiera en esa red podría esnifarlos.\\n\\n\" +\n\t\t\t\t\" · Recomendado: déjalo en 127.0.0.1 y llega a él por un túnel (SSH, WireGuard) o por un\\n\" +\n\t\t\t\t\" proxy TLS que termine delante.\\n\" +\n\t\t\t\t\" · Si YA tienes ese proxy TLS delante de este mismo bind, pasa `inseguroSinTls: true`\\n\" +\n\t\t\t\t\" (CLI: --inseguro-sin-tls) para confirmarlo de forma explícita.\",\n\t\t);\n\t}\n\tif (!esLoopback(host)) {\n\t\t// Llegar aquí es haberlo pedido a conciencia. Se deja constancia igualmente:\n\t\t// el que lo escribió no es siempre el que lee los registros seis meses después.\n\t\tconsole.error(\n\t\t\t`AVISO: el broker escucha en ${host} sin TLS propio, por --inseguro-sin-tls. Solo es seguro si ` +\n\t\t\t\t\"hay un proxy TLS terminando delante de este bind.\",\n\t\t);\n\t}\n\n\tconst manejar = async (req: IncomingMessage, res: ServerResponse): Promise<void> => {\n\t\tconst url = new URL(req.url ?? \"/\", \"http://localhost\");\n\n\t\tif (req.method === \"GET\" && url.pathname === \"/v1/health\") {\n\t\t\tenviarJson(res, 200, { ok: true });\n\t\t\treturn;\n\t\t}\n\n\t\tif (!bearerValido(req.headers.authorization, token)) {\n\t\t\tenviarJson(res, 401, { error: \"bearer-invalido\" });\n\t\t\treturn;\n\t\t}\n\n\t\tif (req.method === \"GET\" && url.pathname === \"/v1/snapshot\") {\n\t\t\tenviarJson(res, 200, { credenciales: pool.snapshot() });\n\t\t\treturn;\n\t\t}\n\n\t\tif (req.method === \"POST\" && url.pathname === \"/v1/credential\") {\n\t\t\tlet cuerpo: { proveedor?: string; promptCacheKey?: string; cliente?: string };\n\t\t\ttry {\n\t\t\t\tcuerpo = JSON.parse(await leerCuerpo(req));\n\t\t\t} catch {\n\t\t\t\tenviarJson(res, 400, { error: \"cuerpo-invalido\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst proveedor = cuerpo.proveedor;\n\t\t\tif (!proveedor) {\n\t\t\t\tenviarJson(res, 400, { error: \"falta-proveedor\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst elegida = pool.elegir(proveedor, cuerpo.promptCacheKey);\n\t\t\tawait libro.anotar({\n\t\t\t\ttipo: \"credencial\",\n\t\t\t\taccion: \"resuelta\",\n\t\t\t\tproveedor,\n\t\t\t\tcredencialId: elegida?.id ?? null,\n\t\t\t\tresultado: elegida ? \"ok\" : \"sin-credencial-activa\",\n\t\t\t\tcliente: cuerpo.cliente,\n\t\t\t});\n\t\t\tif (!elegida) {\n\t\t\t\t// \"No hay nada\" (todas bloqueadas o proveedor desconocido), no \"no he\n\t\t\t\t// podido\": por eso 404 con un motivo, no un 500.\n\t\t\t\tenviarJson(res, 404, { error: \"sin-credencial-activa\", proveedor });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tenviarJson(res, 200, elegida);\n\t\t\treturn;\n\t\t}\n\n\t\tif (req.method === \"POST\" && url.pathname === \"/v1/usage\") {\n\t\t\tlet cuerpo: { id?: string; ok?: boolean; estadoHttp?: number; mensaje?: string; proveedor?: string };\n\t\t\ttry {\n\t\t\t\tcuerpo = JSON.parse(await leerCuerpo(req));\n\t\t\t} catch {\n\t\t\t\tenviarJson(res, 400, { error: \"cuerpo-invalido\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!cuerpo.id) {\n\t\t\t\tenviarJson(res, 400, { error: \"falta-id\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst resultado =\n\t\t\t\tcuerpo.ok === true\n\t\t\t\t\t? ({ ok: true } as const)\n\t\t\t\t\t: ({ ok: false, estadoHttp: cuerpo.estadoHttp, mensaje: cuerpo.mensaje ?? \"\" } as const);\n\t\t\tconst efecto = pool.marcarUso(cuerpo.id, resultado);\n\t\t\tif (!efecto) {\n\t\t\t\tenviarJson(res, 404, { error: \"credencial-desconocida\", id: cuerpo.id });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait libro.anotar({\n\t\t\t\ttipo: \"credencial\",\n\t\t\t\taccion: \"uso\",\n\t\t\t\tproveedor: cuerpo.proveedor ?? \"desconocido\",\n\t\t\t\tcredencialId: cuerpo.id,\n\t\t\t\tresultado: efecto.clase,\n\t\t\t});\n\t\t\tenviarJson(res, 200, efecto);\n\t\t\treturn;\n\t\t}\n\n\t\tenviarJson(res, 404, { error: \"ruta-desconocida\" });\n\t};\n\n\tconst server: Server = createServer((req, res) => {\n\t\tmanejar(req, res).catch((error) => {\n\t\t\tenviarJson(res, 500, {\n\t\t\t\terror: \"fallo-interno\",\n\t\t\t\tmensaje: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t});\n\t});\n\n\tawait new Promise<void>((resolve, reject) => {\n\t\tserver.once(\"error\", reject);\n\t\tserver.listen(puertoPedido, host, () => resolve());\n\t});\n\n\tconst direccion = server.address();\n\tconst puerto = typeof direccion === \"object\" && direccion ? direccion.port : puertoPedido;\n\n\treturn {\n\t\turl: `http://${host}:${puerto}`,\n\t\tpuerto,\n\t\tcerrar: () => new Promise<void>((resolve) => server.close(() => resolve())),\n\t};\n}\n"]}
@@ -1,3 +1,4 @@
1
1
  import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
2
2
  export declare const DEFAULT_THINKING_LEVEL: ThinkingLevel;
3
+ export declare const THINKING_LEVEL_OPTIONS: readonly ThinkingLevel[];
3
4
  //# sourceMappingURL=defaults.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/core/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,eAAO,MAAM,sBAAsB,EAAE,aAAwB,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\n\nexport const DEFAULT_THINKING_LEVEL: ThinkingLevel = \"medium\";\n"]}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/core/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,eAAO,MAAM,sBAAsB,EAAE,aAAwB,CAAC;AAC9D,eAAO,MAAM,sBAAsB,EAAE,SAAS,aAAa,EAQ1D,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\n\nexport const DEFAULT_THINKING_LEVEL: ThinkingLevel = \"medium\";\nexport const THINKING_LEVEL_OPTIONS: readonly ThinkingLevel[] = [\n\t\"off\",\n\t\"minimal\",\n\t\"low\",\n\t\"medium\",\n\t\"high\",\n\t\"xhigh\",\n\t\"max\",\n];\n"]}
@@ -1,2 +1,11 @@
1
1
  export const DEFAULT_THINKING_LEVEL = "medium";
2
+ export const THINKING_LEVEL_OPTIONS = [
3
+ "off",
4
+ "minimal",
5
+ "low",
6
+ "medium",
7
+ "high",
8
+ "xhigh",
9
+ "max",
10
+ ];
2
11
  //# sourceMappingURL=defaults.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/core/defaults.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAkB,QAAQ,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\n\nexport const DEFAULT_THINKING_LEVEL: ThinkingLevel = \"medium\";\n"]}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/core/defaults.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAkB,QAAQ,CAAC;AAC9D,MAAM,CAAC,MAAM,sBAAsB,GAA6B;IAC/D,KAAK;IACL,SAAS;IACT,KAAK;IACL,QAAQ;IACR,MAAM;IACN,OAAO;IACP,KAAK;CACL,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\n\nexport const DEFAULT_THINKING_LEVEL: ThinkingLevel = \"medium\";\nexport const THINKING_LEVEL_OPTIONS: readonly ThinkingLevel[] = [\n\t\"off\",\n\t\"minimal\",\n\t\"low\",\n\t\"medium\",\n\t\"high\",\n\t\"xhigh\",\n\t\"max\",\n];\n"]}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Comandos de barra que Claude Code ya tiene definidos en el proyecto:
3
+ * `.claude/commands/*.md`.
4
+ *
5
+ * Solo se listan — a diferencia de las skills, que sí se pasan a la sesión
6
+ * (ver `skills.ts`), un comando de barra ajeno no tiene un sitio propio en el
7
+ * sistema de comandos de Ada (`core/slash-commands.ts` es de upstream y su
8
+ * formato de prompt-templates no es el mismo). Listarlo con su origen ya
9
+ * ahorra la media hora de "¿qué comandos tenía este proyecto?" al cambiar de
10
+ * herramienta.
11
+ */
12
+ export interface ComandoDescubierto {
13
+ origen: string;
14
+ /** Ruta relativa al proyecto. */
15
+ ruta: string;
16
+ /** Con `:` como separador de namespace, igual que hace Claude Code. */
17
+ nombre: string;
18
+ descripcion?: string;
19
+ }
20
+ export interface ResultadoDescubrimientoComandos {
21
+ comandos: ComandoDescubierto[];
22
+ /** Directorios mirados, existan o no. */
23
+ directoriosMirados: string[];
24
+ errores: Array<{
25
+ ruta: string;
26
+ motivo: string;
27
+ }>;
28
+ }
29
+ export declare function descubrirComandos(cwd: string): ResultadoDescubrimientoComandos;
30
+ //# sourceMappingURL=comandos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comandos.d.ts","sourceRoot":"","sources":["../../../src/core/descubrimiento/comandos.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,MAAM,WAAW,kBAAkB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,yCAAyC;IACzC,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AA+BD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,+BAA+B,CAoC9E","sourcesContent":["/**\n * Comandos de barra que Claude Code ya tiene definidos en el proyecto:\n * `.claude/commands/*.md`.\n *\n * Solo se listan — a diferencia de las skills, que sí se pasan a la sesión\n * (ver `skills.ts`), un comando de barra ajeno no tiene un sitio propio en el\n * sistema de comandos de Ada (`core/slash-commands.ts` es de upstream y su\n * formato de prompt-templates no es el mismo). Listarlo con su origen ya\n * ahorra la media hora de \"¿qué comandos tenía este proyecto?\" al cambiar de\n * herramienta.\n */\n\nimport { readdirSync, readFileSync } from \"node:fs\";\nimport { join, relative, sep } from \"node:path\";\nimport { parseFrontmatter } from \"../../utils/frontmatter.ts\";\n\nexport interface ComandoDescubierto {\n\torigen: string;\n\t/** Ruta relativa al proyecto. */\n\truta: string;\n\t/** Con `:` como separador de namespace, igual que hace Claude Code. */\n\tnombre: string;\n\tdescripcion?: string;\n}\n\nexport interface ResultadoDescubrimientoComandos {\n\tcomandos: ComandoDescubierto[];\n\t/** Directorios mirados, existan o no. */\n\tdirectoriosMirados: string[];\n\terrores: Array<{ ruta: string; motivo: string }>;\n}\n\nconst ORIGEN = \"Claude Code\";\nconst DIRECTORIO = \".claude/commands\";\n\n/** Los .md de un directorio, recursivo, en orden estable. */\nfunction ficherosMd(dir: string, salida: string[]): void {\n\tlet entradas: import(\"node:fs\").Dirent[];\n\ttry {\n\t\tentradas = readdirSync(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn; // no existe o no se puede listar: \"no hay\", no es un fallo\n\t}\n\tfor (const entrada of [...entradas].sort((a, b) => a.name.localeCompare(b.name))) {\n\t\tconst completa = join(dir, entrada.name);\n\t\tif (entrada.isDirectory()) {\n\t\t\tficherosMd(completa, salida);\n\t\t} else if (entrada.isFile() && entrada.name.endsWith(\".md\")) {\n\t\t\tsalida.push(completa);\n\t\t}\n\t}\n}\n\nfunction primeraLinea(cuerpo: string): string | undefined {\n\tconst linea = cuerpo\n\t\t.split(\"\\n\")\n\t\t.map((l) => l.trim())\n\t\t.find((l) => l.length > 0);\n\treturn linea ? linea.slice(0, 100) : undefined;\n}\n\nexport function descubrirComandos(cwd: string): ResultadoDescubrimientoComandos {\n\tconst comandos: ComandoDescubierto[] = [];\n\tconst errores: Array<{ ruta: string; motivo: string }> = [];\n\tconst dir = join(cwd, DIRECTORIO);\n\n\tconst rutas: string[] = [];\n\tficherosMd(dir, rutas);\n\n\tfor (const ruta of rutas) {\n\t\tconst relativa = relative(cwd, ruta).split(sep).join(\"/\");\n\n\t\tlet contenido: string;\n\t\ttry {\n\t\t\tcontenido = readFileSync(ruta, \"utf-8\");\n\t\t} catch (error) {\n\t\t\terrores.push({ ruta: relativa, motivo: error instanceof Error ? error.message : \"no se pudo leer\" });\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet descripcion: string | undefined;\n\t\ttry {\n\t\t\tconst { frontmatter, body } = parseFrontmatter<{ description?: unknown }>(contenido);\n\t\t\tdescripcion = typeof frontmatter.description === \"string\" ? frontmatter.description : primeraLinea(body);\n\t\t} catch (error) {\n\t\t\terrores.push({\n\t\t\t\truta: relativa,\n\t\t\t\tmotivo: `frontmatter inválido: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t});\n\t\t\tdescripcion = primeraLinea(contenido);\n\t\t}\n\n\t\tconst nombre = relative(dir, ruta).replace(/\\.md$/, \"\").split(sep).join(\":\");\n\t\tcomandos.push({ origen: ORIGEN, ruta: relativa, nombre, descripcion });\n\t}\n\n\treturn { comandos, directoriosMirados: [DIRECTORIO], errores };\n}\n"]}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Comandos de barra que Claude Code ya tiene definidos en el proyecto:
3
+ * `.claude/commands/*.md`.
4
+ *
5
+ * Solo se listan — a diferencia de las skills, que sí se pasan a la sesión
6
+ * (ver `skills.ts`), un comando de barra ajeno no tiene un sitio propio en el
7
+ * sistema de comandos de Ada (`core/slash-commands.ts` es de upstream y su
8
+ * formato de prompt-templates no es el mismo). Listarlo con su origen ya
9
+ * ahorra la media hora de "¿qué comandos tenía este proyecto?" al cambiar de
10
+ * herramienta.
11
+ */
12
+ import { readdirSync, readFileSync } from "node:fs";
13
+ import { join, relative, sep } from "node:path";
14
+ import { parseFrontmatter } from "../../utils/frontmatter.js";
15
+ const ORIGEN = "Claude Code";
16
+ const DIRECTORIO = ".claude/commands";
17
+ /** Los .md de un directorio, recursivo, en orden estable. */
18
+ function ficherosMd(dir, salida) {
19
+ let entradas;
20
+ try {
21
+ entradas = readdirSync(dir, { withFileTypes: true });
22
+ }
23
+ catch {
24
+ return; // no existe o no se puede listar: "no hay", no es un fallo
25
+ }
26
+ for (const entrada of [...entradas].sort((a, b) => a.name.localeCompare(b.name))) {
27
+ const completa = join(dir, entrada.name);
28
+ if (entrada.isDirectory()) {
29
+ ficherosMd(completa, salida);
30
+ }
31
+ else if (entrada.isFile() && entrada.name.endsWith(".md")) {
32
+ salida.push(completa);
33
+ }
34
+ }
35
+ }
36
+ function primeraLinea(cuerpo) {
37
+ const linea = cuerpo
38
+ .split("\n")
39
+ .map((l) => l.trim())
40
+ .find((l) => l.length > 0);
41
+ return linea ? linea.slice(0, 100) : undefined;
42
+ }
43
+ export function descubrirComandos(cwd) {
44
+ const comandos = [];
45
+ const errores = [];
46
+ const dir = join(cwd, DIRECTORIO);
47
+ const rutas = [];
48
+ ficherosMd(dir, rutas);
49
+ for (const ruta of rutas) {
50
+ const relativa = relative(cwd, ruta).split(sep).join("/");
51
+ let contenido;
52
+ try {
53
+ contenido = readFileSync(ruta, "utf-8");
54
+ }
55
+ catch (error) {
56
+ errores.push({ ruta: relativa, motivo: error instanceof Error ? error.message : "no se pudo leer" });
57
+ continue;
58
+ }
59
+ let descripcion;
60
+ try {
61
+ const { frontmatter, body } = parseFrontmatter(contenido);
62
+ descripcion = typeof frontmatter.description === "string" ? frontmatter.description : primeraLinea(body);
63
+ }
64
+ catch (error) {
65
+ errores.push({
66
+ ruta: relativa,
67
+ motivo: `frontmatter inválido: ${error instanceof Error ? error.message : String(error)}`,
68
+ });
69
+ descripcion = primeraLinea(contenido);
70
+ }
71
+ const nombre = relative(dir, ruta).replace(/\.md$/, "").split(sep).join(":");
72
+ comandos.push({ origen: ORIGEN, ruta: relativa, nombre, descripcion });
73
+ }
74
+ return { comandos, directoriosMirados: [DIRECTORIO], errores };
75
+ }
76
+ //# sourceMappingURL=comandos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comandos.js","sourceRoot":"","sources":["../../../src/core/descubrimiento/comandos.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Comandos de barra que Claude Code ya tiene definidos en el proyecto:\n * `.claude/commands/*.md`.\n *\n * Solo se listan — a diferencia de las skills, que sí se pasan a la sesión\n * (ver `skills.ts`), un comando de barra ajeno no tiene un sitio propio en el\n * sistema de comandos de Ada (`core/slash-commands.ts` es de upstream y su\n * formato de prompt-templates no es el mismo). Listarlo con su origen ya\n * ahorra la media hora de \"¿qué comandos tenía este proyecto?\" al cambiar de\n * herramienta.\n */\n\nimport { readdirSync, readFileSync } from \"node:fs\";\nimport { join, relative, sep } from \"node:path\";\nimport { parseFrontmatter } from \"../../utils/frontmatter.ts\";\n\nexport interface ComandoDescubierto {\n\torigen: string;\n\t/** Ruta relativa al proyecto. */\n\truta: string;\n\t/** Con `:` como separador de namespace, igual que hace Claude Code. */\n\tnombre: string;\n\tdescripcion?: string;\n}\n\nexport interface ResultadoDescubrimientoComandos {\n\tcomandos: ComandoDescubierto[];\n\t/** Directorios mirados, existan o no. */\n\tdirectoriosMirados: string[];\n\terrores: Array<{ ruta: string; motivo: string }>;\n}\n\nconst ORIGEN = \"Claude Code\";\nconst DIRECTORIO = \".claude/commands\";\n\n/** Los .md de un directorio, recursivo, en orden estable. */\nfunction ficherosMd(dir: string, salida: string[]): void {\n\tlet entradas: import(\"node:fs\").Dirent[];\n\ttry {\n\t\tentradas = readdirSync(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn; // no existe o no se puede listar: \"no hay\", no es un fallo\n\t}\n\tfor (const entrada of [...entradas].sort((a, b) => a.name.localeCompare(b.name))) {\n\t\tconst completa = join(dir, entrada.name);\n\t\tif (entrada.isDirectory()) {\n\t\t\tficherosMd(completa, salida);\n\t\t} else if (entrada.isFile() && entrada.name.endsWith(\".md\")) {\n\t\t\tsalida.push(completa);\n\t\t}\n\t}\n}\n\nfunction primeraLinea(cuerpo: string): string | undefined {\n\tconst linea = cuerpo\n\t\t.split(\"\\n\")\n\t\t.map((l) => l.trim())\n\t\t.find((l) => l.length > 0);\n\treturn linea ? linea.slice(0, 100) : undefined;\n}\n\nexport function descubrirComandos(cwd: string): ResultadoDescubrimientoComandos {\n\tconst comandos: ComandoDescubierto[] = [];\n\tconst errores: Array<{ ruta: string; motivo: string }> = [];\n\tconst dir = join(cwd, DIRECTORIO);\n\n\tconst rutas: string[] = [];\n\tficherosMd(dir, rutas);\n\n\tfor (const ruta of rutas) {\n\t\tconst relativa = relative(cwd, ruta).split(sep).join(\"/\");\n\n\t\tlet contenido: string;\n\t\ttry {\n\t\t\tcontenido = readFileSync(ruta, \"utf-8\");\n\t\t} catch (error) {\n\t\t\terrores.push({ ruta: relativa, motivo: error instanceof Error ? error.message : \"no se pudo leer\" });\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet descripcion: string | undefined;\n\t\ttry {\n\t\t\tconst { frontmatter, body } = parseFrontmatter<{ description?: unknown }>(contenido);\n\t\t\tdescripcion = typeof frontmatter.description === \"string\" ? frontmatter.description : primeraLinea(body);\n\t\t} catch (error) {\n\t\t\terrores.push({\n\t\t\t\truta: relativa,\n\t\t\t\tmotivo: `frontmatter inválido: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t});\n\t\t\tdescripcion = primeraLinea(contenido);\n\t\t}\n\n\t\tconst nombre = relative(dir, ruta).replace(/\\.md$/, \"\").split(sep).join(\":\");\n\t\tcomandos.push({ origen: ORIGEN, ruta: relativa, nombre, descripcion });\n\t}\n\n\treturn { comandos, directoriosMirados: [DIRECTORIO], errores };\n}\n"]}