@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,87 @@
1
+ /**
2
+ * Desglose de qué está llenando la ventana de contexto.
3
+ *
4
+ * POR QUÉ IMPORTA AQUÍ MÁS QUE EN OTROS PRODUCTOS: con caché por prefijo, el
5
+ * coste de un cambio depende de su POSICIÓN, no de su tamaño. Saber que las
6
+ * definiciones de tools ocupan 11 K y van delante te dice que tocarlas invalida
7
+ * todo lo que viene detrás. Sin este desglose, optimizar la caché es a ciegas.
8
+ *
9
+ * HONESTIDAD DEL DATO — la parte que las referencias no resuelven:
10
+ *
11
+ * El único número REAL es el total, que lo da el proveedor en el `usage` de la
12
+ * última respuesta. Los trozos se estiman con `chars/4`, que es una heurística.
13
+ * Presentar estimaciones como si fueran medidas sería mentir con precisión
14
+ * falsa, así que:
15
+ *
16
+ * - Si hay total real, se REPARTE ese total según las proporciones estimadas.
17
+ * El total cuadra siempre y el reparto se marca como estimado.
18
+ * - Si no lo hay (recién compactado, antes de la primera respuesta), se
19
+ * devuelve la suma de estimaciones y se dice que TODO es estimado.
20
+ */
21
+ /**
22
+ * Estimación de tokens de un texto.
23
+ *
24
+ * `chars/4` es la misma heurística que ya usa la compactación
25
+ * (`compaction.ts:estimateTokens`). Se mantiene idéntica a propósito: dos
26
+ * estimadores distintos darían cifras que no cuadran entre la barra de contexto
27
+ * y el momento en que salta la compactación, y el usuario no tendría forma de
28
+ * saber cuál creer.
29
+ */
30
+ export function estimarTokensTexto(texto) {
31
+ return Math.ceil(texto.length / 4);
32
+ }
33
+ function sumar(textos) {
34
+ let total = 0;
35
+ for (const t of textos)
36
+ total += estimarTokensTexto(t);
37
+ return total;
38
+ }
39
+ /**
40
+ * Construye el desglose.
41
+ *
42
+ * Las categorías con cero tokens se omiten: una lista con seis ceros no informa
43
+ * de nada y esconde las dos que sí pesan.
44
+ */
45
+ export function construirDesglose(entrada) {
46
+ const crudos = [
47
+ ["systemPrompt", estimarTokensTexto(entrada.systemPrompt)],
48
+ ["toolDefinitions", sumar(entrada.toolDefinitions)],
49
+ ["skills", sumar(entrada.skills)],
50
+ ["mcpTools", sumar(entrada.mcpTools)],
51
+ ["contextFiles", sumar(entrada.contextFiles)],
52
+ ["memory", sumar(entrada.memory)],
53
+ ["conversation", Math.max(0, entrada.conversationTokens)],
54
+ ];
55
+ const sumaEstimada = crudos.reduce((s, [, n]) => s + n, 0);
56
+ const totalExacto = entrada.tokensReales !== null && entrada.tokensReales > 0;
57
+ const total = totalExacto ? entrada.tokensReales : sumaEstimada;
58
+ // Reparto proporcional sobre el total real. Si la suma estimada es cero no se
59
+ // puede repartir nada: se devuelven las piezas a cero en vez de dividir por
60
+ // cero y producir NaN, que en la interfaz se vería como "—" o como 0 aleatorio.
61
+ const escala = totalExacto && sumaEstimada > 0 ? entrada.tokensReales / sumaEstimada : 1;
62
+ const piezas = crudos
63
+ .filter(([, n]) => n > 0)
64
+ .map(([categoria, n]) => {
65
+ const tokens = Math.round(n * escala);
66
+ return { categoria, tokens, fraccion: total > 0 ? tokens / total : 0 };
67
+ })
68
+ .sort((a, b) => b.tokens - a.tokens);
69
+ return {
70
+ total,
71
+ contextWindow: entrada.contextWindow,
72
+ ocupacion: entrada.contextWindow > 0 ? Math.min(1, total / entrada.contextWindow) : 0,
73
+ totalExacto,
74
+ piezas,
75
+ };
76
+ }
77
+ /** Etiquetas legibles. La interfaz traduce; esto es el orden y el nombre canónico. */
78
+ export const ETIQUETAS_CONTEXTO = {
79
+ systemPrompt: "System prompt",
80
+ toolDefinitions: "Tool definitions",
81
+ skills: "Skills",
82
+ mcpTools: "MCP tools",
83
+ contextFiles: "Context files",
84
+ memory: "Memory",
85
+ conversation: "Conversation",
86
+ };
87
+ //# sourceMappingURL=context-breakdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-breakdown.js","sourceRoot":"","sources":["../../src/core/context-breakdown.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Desglose de qué está llenando la ventana de contexto.\n *\n * POR QUÉ IMPORTA AQUÍ MÁS QUE EN OTROS PRODUCTOS: con caché por prefijo, el\n * coste de un cambio depende de su POSICIÓN, no de su tamaño. Saber que las\n * definiciones de tools ocupan 11 K y van delante te dice que tocarlas invalida\n * todo lo que viene detrás. Sin este desglose, optimizar la caché es a ciegas.\n *\n * HONESTIDAD DEL DATO — la parte que las referencias no resuelven:\n *\n * El único número REAL es el total, que lo da el proveedor en el `usage` de la\n * última respuesta. Los trozos se estiman con `chars/4`, que es una heurística.\n * Presentar estimaciones como si fueran medidas sería mentir con precisión\n * falsa, así que:\n *\n * - Si hay total real, se REPARTE ese total según las proporciones estimadas.\n * El total cuadra siempre y el reparto se marca como estimado.\n * - Si no lo hay (recién compactado, antes de la primera respuesta), se\n * devuelve la suma de estimaciones y se dice que TODO es estimado.\n */\n\n/** Categorías. El orden es el del prompt: lo estable primero. */\nexport type CategoriaContexto =\n\t| \"systemPrompt\"\n\t| \"toolDefinitions\"\n\t| \"skills\"\n\t| \"mcpTools\"\n\t| \"contextFiles\"\n\t| \"memory\"\n\t| \"conversation\";\n\nexport interface PiezaContexto {\n\tcategoria: CategoriaContexto;\n\t/** Tokens atribuidos. Estimados salvo que `exacto` sea true. */\n\ttokens: number;\n\t/** Fracción del total, entre 0 y 1. */\n\tfraccion: number;\n}\n\nexport interface DesgloseContexto {\n\t/** Total de tokens en contexto. Exacto si vino del proveedor. */\n\ttotal: number;\n\tcontextWindow: number;\n\t/** Fracción de la ventana ocupada, entre 0 y 1. */\n\tocupacion: number;\n\t/**\n\t * True cuando `total` viene del `usage` del proveedor. False significa que\n\t * todo el desglose, total incluido, es una estimación.\n\t */\n\ttotalExacto: boolean;\n\tpiezas: PiezaContexto[];\n}\n\n/**\n * Estimación de tokens de un texto.\n *\n * `chars/4` es la misma heurística que ya usa la compactación\n * (`compaction.ts:estimateTokens`). Se mantiene idéntica a propósito: dos\n * estimadores distintos darían cifras que no cuadran entre la barra de contexto\n * y el momento en que salta la compactación, y el usuario no tendría forma de\n * saber cuál creer.\n */\nexport function estimarTokensTexto(texto: string): number {\n\treturn Math.ceil(texto.length / 4);\n}\n\nexport interface EntradaDesglose {\n\tcontextWindow: number;\n\t/** Tokens reales del proveedor. `null` = desconocido (p. ej. tras compactar). */\n\ttokensReales: number | null;\n\tsystemPrompt: string;\n\t/** Nombre + descripción + esquema serializado de cada tool. */\n\ttoolDefinitions: string[];\n\t/** Nombre + descripción de cada skill visible para el modelo. */\n\tskills: string[];\n\t/** Definiciones de tools MCP, aparte porque son las que más se disparan. */\n\tmcpTools: string[];\n\t/** Ficheros de contexto inyectados (AGENTS.md y compañía). */\n\tcontextFiles: string[];\n\t/** Bloques de memoria inyectados. */\n\tmemory: string[];\n\t/** Tokens de la conversación, ya estimados por el llamante. */\n\tconversationTokens: number;\n}\n\nfunction sumar(textos: string[]): number {\n\tlet total = 0;\n\tfor (const t of textos) total += estimarTokensTexto(t);\n\treturn total;\n}\n\n/**\n * Construye el desglose.\n *\n * Las categorías con cero tokens se omiten: una lista con seis ceros no informa\n * de nada y esconde las dos que sí pesan.\n */\nexport function construirDesglose(entrada: EntradaDesglose): DesgloseContexto {\n\tconst crudos: Array<[CategoriaContexto, number]> = [\n\t\t[\"systemPrompt\", estimarTokensTexto(entrada.systemPrompt)],\n\t\t[\"toolDefinitions\", sumar(entrada.toolDefinitions)],\n\t\t[\"skills\", sumar(entrada.skills)],\n\t\t[\"mcpTools\", sumar(entrada.mcpTools)],\n\t\t[\"contextFiles\", sumar(entrada.contextFiles)],\n\t\t[\"memory\", sumar(entrada.memory)],\n\t\t[\"conversation\", Math.max(0, entrada.conversationTokens)],\n\t];\n\n\tconst sumaEstimada = crudos.reduce((s, [, n]) => s + n, 0);\n\tconst totalExacto = entrada.tokensReales !== null && entrada.tokensReales > 0;\n\tconst total = totalExacto ? (entrada.tokensReales as number) : sumaEstimada;\n\n\t// Reparto proporcional sobre el total real. Si la suma estimada es cero no se\n\t// puede repartir nada: se devuelven las piezas a cero en vez de dividir por\n\t// cero y producir NaN, que en la interfaz se vería como \"—\" o como 0 aleatorio.\n\tconst escala = totalExacto && sumaEstimada > 0 ? (entrada.tokensReales as number) / sumaEstimada : 1;\n\n\tconst piezas: PiezaContexto[] = crudos\n\t\t.filter(([, n]) => n > 0)\n\t\t.map(([categoria, n]) => {\n\t\t\tconst tokens = Math.round(n * escala);\n\t\t\treturn { categoria, tokens, fraccion: total > 0 ? tokens / total : 0 };\n\t\t})\n\t\t.sort((a, b) => b.tokens - a.tokens);\n\n\treturn {\n\t\ttotal,\n\t\tcontextWindow: entrada.contextWindow,\n\t\tocupacion: entrada.contextWindow > 0 ? Math.min(1, total / entrada.contextWindow) : 0,\n\t\ttotalExacto,\n\t\tpiezas,\n\t};\n}\n\n/** Etiquetas legibles. La interfaz traduce; esto es el orden y el nombre canónico. */\nexport const ETIQUETAS_CONTEXTO: Record<CategoriaContexto, string> = {\n\tsystemPrompt: \"System prompt\",\n\ttoolDefinitions: \"Tool definitions\",\n\tskills: \"Skills\",\n\tmcpTools: \"MCP tools\",\n\tcontextFiles: \"Context files\",\n\tmemory: \"Memory\",\n\tconversation: \"Conversation\",\n};\n"]}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Cliente del broker de credenciales.
3
+ *
4
+ * Regla de diseño, y es la que hace verificable "el cliente no tiene el token
5
+ * en su proceso": el secreto que devuelve `resolverCredencial` NUNCA se asigna
6
+ * a un campo de esta clase. Sale de la función, el llamador decide qué hacer
7
+ * con él, y esta instancia no guarda nada más que la URL y el bearer del
8
+ * broker (que no son el secreto de ningún proveedor). Ningún método escribe a
9
+ * disco — la credencial vive, como mucho, en la pila de quien la usó para una
10
+ * sola petición.
11
+ */
12
+ export interface OpcionesClienteBroker {
13
+ url: string;
14
+ token: string;
15
+ /** Nombre identificador de este cliente, para que el libro de sesión diga quién pidió qué. */
16
+ cliente?: string;
17
+ }
18
+ export interface CredencialResuelta {
19
+ id: string;
20
+ valor: string;
21
+ }
22
+ export type ResultadoDeUso = {
23
+ ok: true;
24
+ } | {
25
+ ok: false;
26
+ estadoHttp?: number;
27
+ mensaje: string;
28
+ };
29
+ export interface EfectoDeUso {
30
+ clase: string;
31
+ estado: "activa" | "bloqueada";
32
+ }
33
+ export interface FilaSnapshot {
34
+ id: string;
35
+ proveedor: string;
36
+ estado: "activa" | "bloqueada";
37
+ motivoBloqueo?: string;
38
+ }
39
+ export declare class ClienteBroker {
40
+ private readonly url;
41
+ private readonly token;
42
+ private readonly nombreCliente?;
43
+ constructor(opciones: OpcionesClienteBroker);
44
+ private cabeceras;
45
+ /**
46
+ * Pide una credencial al broker y la devuelve para uso inmediato.
47
+ *
48
+ * `null` = el broker no tiene ninguna credencial activa para ese proveedor
49
+ * (todas bloqueadas, o proveedor sin dar de alta) — "no hay nada", que se
50
+ * distingue de una excepción, que es "no he podido hablar con el broker".
51
+ */
52
+ resolverCredencial(proveedor: string, promptCacheKey?: string): Promise<CredencialResuelta | null>;
53
+ /** Reporta cómo fue usar una credencial ya entregada. El broker distingue 401 de 429 con esto. */
54
+ reportarUso(id: string, resultado: ResultadoDeUso): Promise<EfectoDeUso | null>;
55
+ /** Vista del pool sin secretos: qué credenciales hay y en qué estado. */
56
+ snapshot(): Promise<FilaSnapshot[]>;
57
+ /** Liveness sin bearer. `false` en cualquier fallo de red, no lanza. */
58
+ salud(): Promise<boolean>;
59
+ }
60
+ //# sourceMappingURL=cliente.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliente.d.ts","sourceRoot":"","sources":["../../../src/core/credenciales/cliente.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,qBAAqB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,kGAA8F;IAC9F,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,cAAc,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhG,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,QAAQ,GAAG,WAAW,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,aAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAS;IAExC,YAAY,QAAQ,EAAE,qBAAqB,EAI1C;IAED,OAAO,CAAC,SAAS;IAIjB;;;;;;OAMG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAcvG;IAED,mGAAkG;IAC5F,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAWpF;IAED,2EAAyE;IACnE,QAAQ,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAOxC;IAED,wEAAwE;IAClE,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAO9B;CACD","sourcesContent":["/**\n * Cliente del broker de credenciales.\n *\n * Regla de diseño, y es la que hace verificable \"el cliente no tiene el token\n * en su proceso\": el secreto que devuelve `resolverCredencial` NUNCA se asigna\n * a un campo de esta clase. Sale de la función, el llamador decide qué hacer\n * con él, y esta instancia no guarda nada más que la URL y el bearer del\n * broker (que no son el secreto de ningún proveedor). Ningún método escribe a\n * disco — la credencial vive, como mucho, en la pila de quien la usó para una\n * sola petición.\n */\n\nexport interface OpcionesClienteBroker {\n\turl: string;\n\ttoken: string;\n\t/** Nombre identificador de este cliente, para que el libro de sesión diga quién pidió qué. */\n\tcliente?: string;\n}\n\nexport interface CredencialResuelta {\n\tid: string;\n\tvalor: string;\n}\n\nexport type ResultadoDeUso = { ok: true } | { ok: false; estadoHttp?: number; mensaje: string };\n\nexport interface EfectoDeUso {\n\tclase: string;\n\testado: \"activa\" | \"bloqueada\";\n}\n\nexport interface FilaSnapshot {\n\tid: string;\n\tproveedor: string;\n\testado: \"activa\" | \"bloqueada\";\n\tmotivoBloqueo?: string;\n}\n\nexport class ClienteBroker {\n\tprivate readonly url: string;\n\tprivate readonly token: string;\n\tprivate readonly nombreCliente?: string;\n\n\tconstructor(opciones: OpcionesClienteBroker) {\n\t\tthis.url = opciones.url.replace(/\\/$/, \"\");\n\t\tthis.token = opciones.token;\n\t\tthis.nombreCliente = opciones.cliente;\n\t}\n\n\tprivate cabeceras(): Record<string, string> {\n\t\treturn { \"content-type\": \"application/json\", authorization: `Bearer ${this.token}` };\n\t}\n\n\t/**\n\t * Pide una credencial al broker y la devuelve para uso inmediato.\n\t *\n\t * `null` = el broker no tiene ninguna credencial activa para ese proveedor\n\t * (todas bloqueadas, o proveedor sin dar de alta) — \"no hay nada\", que se\n\t * distingue de una excepción, que es \"no he podido hablar con el broker\".\n\t */\n\tasync resolverCredencial(proveedor: string, promptCacheKey?: string): Promise<CredencialResuelta | null> {\n\t\tconst respuesta = await fetch(`${this.url}/v1/credential`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: this.cabeceras(),\n\t\t\tbody: JSON.stringify({ proveedor, promptCacheKey, cliente: this.nombreCliente }),\n\t\t});\n\t\tif (respuesta.status === 404) return null;\n\t\tif (!respuesta.ok) {\n\t\t\tthrow new Error(`broker /v1/credential: ${respuesta.status} ${await respuesta.text()}`);\n\t\t}\n\t\tconst datos = (await respuesta.json()) as { id: string; valor: string };\n\t\t// Deliberado: no `this.ultimaCredencial = datos` ni nada parecido. El\n\t\t// valor cruza esta función y desaparece de aquí.\n\t\treturn { id: datos.id, valor: datos.valor };\n\t}\n\n\t/** Reporta cómo fue usar una credencial ya entregada. El broker distingue 401 de 429 con esto. */\n\tasync reportarUso(id: string, resultado: ResultadoDeUso): Promise<EfectoDeUso | null> {\n\t\tconst respuesta = await fetch(`${this.url}/v1/usage`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: this.cabeceras(),\n\t\t\tbody: JSON.stringify({ id, ...resultado }),\n\t\t});\n\t\tif (respuesta.status === 404) return null;\n\t\tif (!respuesta.ok) {\n\t\t\tthrow new Error(`broker /v1/usage: ${respuesta.status} ${await respuesta.text()}`);\n\t\t}\n\t\treturn (await respuesta.json()) as EfectoDeUso;\n\t}\n\n\t/** Vista del pool sin secretos: qué credenciales hay y en qué estado. */\n\tasync snapshot(): Promise<FilaSnapshot[]> {\n\t\tconst respuesta = await fetch(`${this.url}/v1/snapshot`, { headers: this.cabeceras() });\n\t\tif (!respuesta.ok) {\n\t\t\tthrow new Error(`broker /v1/snapshot: ${respuesta.status} ${await respuesta.text()}`);\n\t\t}\n\t\tconst datos = (await respuesta.json()) as { credenciales: FilaSnapshot[] };\n\t\treturn datos.credenciales;\n\t}\n\n\t/** Liveness sin bearer. `false` en cualquier fallo de red, no lanza. */\n\tasync salud(): Promise<boolean> {\n\t\ttry {\n\t\t\tconst respuesta = await fetch(`${this.url}/v1/health`);\n\t\t\treturn respuesta.ok;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Cliente del broker de credenciales.
3
+ *
4
+ * Regla de diseño, y es la que hace verificable "el cliente no tiene el token
5
+ * en su proceso": el secreto que devuelve `resolverCredencial` NUNCA se asigna
6
+ * a un campo de esta clase. Sale de la función, el llamador decide qué hacer
7
+ * con él, y esta instancia no guarda nada más que la URL y el bearer del
8
+ * broker (que no son el secreto de ningún proveedor). Ningún método escribe a
9
+ * disco — la credencial vive, como mucho, en la pila de quien la usó para una
10
+ * sola petición.
11
+ */
12
+ export class ClienteBroker {
13
+ url;
14
+ token;
15
+ nombreCliente;
16
+ constructor(opciones) {
17
+ this.url = opciones.url.replace(/\/$/, "");
18
+ this.token = opciones.token;
19
+ this.nombreCliente = opciones.cliente;
20
+ }
21
+ cabeceras() {
22
+ return { "content-type": "application/json", authorization: `Bearer ${this.token}` };
23
+ }
24
+ /**
25
+ * Pide una credencial al broker y la devuelve para uso inmediato.
26
+ *
27
+ * `null` = el broker no tiene ninguna credencial activa para ese proveedor
28
+ * (todas bloqueadas, o proveedor sin dar de alta) — "no hay nada", que se
29
+ * distingue de una excepción, que es "no he podido hablar con el broker".
30
+ */
31
+ async resolverCredencial(proveedor, promptCacheKey) {
32
+ const respuesta = await fetch(`${this.url}/v1/credential`, {
33
+ method: "POST",
34
+ headers: this.cabeceras(),
35
+ body: JSON.stringify({ proveedor, promptCacheKey, cliente: this.nombreCliente }),
36
+ });
37
+ if (respuesta.status === 404)
38
+ return null;
39
+ if (!respuesta.ok) {
40
+ throw new Error(`broker /v1/credential: ${respuesta.status} ${await respuesta.text()}`);
41
+ }
42
+ const datos = (await respuesta.json());
43
+ // Deliberado: no `this.ultimaCredencial = datos` ni nada parecido. El
44
+ // valor cruza esta función y desaparece de aquí.
45
+ return { id: datos.id, valor: datos.valor };
46
+ }
47
+ /** Reporta cómo fue usar una credencial ya entregada. El broker distingue 401 de 429 con esto. */
48
+ async reportarUso(id, resultado) {
49
+ const respuesta = await fetch(`${this.url}/v1/usage`, {
50
+ method: "POST",
51
+ headers: this.cabeceras(),
52
+ body: JSON.stringify({ id, ...resultado }),
53
+ });
54
+ if (respuesta.status === 404)
55
+ return null;
56
+ if (!respuesta.ok) {
57
+ throw new Error(`broker /v1/usage: ${respuesta.status} ${await respuesta.text()}`);
58
+ }
59
+ return (await respuesta.json());
60
+ }
61
+ /** Vista del pool sin secretos: qué credenciales hay y en qué estado. */
62
+ async snapshot() {
63
+ const respuesta = await fetch(`${this.url}/v1/snapshot`, { headers: this.cabeceras() });
64
+ if (!respuesta.ok) {
65
+ throw new Error(`broker /v1/snapshot: ${respuesta.status} ${await respuesta.text()}`);
66
+ }
67
+ const datos = (await respuesta.json());
68
+ return datos.credenciales;
69
+ }
70
+ /** Liveness sin bearer. `false` en cualquier fallo de red, no lanza. */
71
+ async salud() {
72
+ try {
73
+ const respuesta = await fetch(`${this.url}/v1/health`);
74
+ return respuesta.ok;
75
+ }
76
+ catch {
77
+ return false;
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=cliente.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliente.js","sourceRoot":"","sources":["../../../src/core/credenciales/cliente.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cliente del broker de credenciales.\n *\n * Regla de diseño, y es la que hace verificable \"el cliente no tiene el token\n * en su proceso\": el secreto que devuelve `resolverCredencial` NUNCA se asigna\n * a un campo de esta clase. Sale de la función, el llamador decide qué hacer\n * con él, y esta instancia no guarda nada más que la URL y el bearer del\n * broker (que no son el secreto de ningún proveedor). Ningún método escribe a\n * disco — la credencial vive, como mucho, en la pila de quien la usó para una\n * sola petición.\n */\n\nexport interface OpcionesClienteBroker {\n\turl: string;\n\ttoken: string;\n\t/** Nombre identificador de este cliente, para que el libro de sesión diga quién pidió qué. */\n\tcliente?: string;\n}\n\nexport interface CredencialResuelta {\n\tid: string;\n\tvalor: string;\n}\n\nexport type ResultadoDeUso = { ok: true } | { ok: false; estadoHttp?: number; mensaje: string };\n\nexport interface EfectoDeUso {\n\tclase: string;\n\testado: \"activa\" | \"bloqueada\";\n}\n\nexport interface FilaSnapshot {\n\tid: string;\n\tproveedor: string;\n\testado: \"activa\" | \"bloqueada\";\n\tmotivoBloqueo?: string;\n}\n\nexport class ClienteBroker {\n\tprivate readonly url: string;\n\tprivate readonly token: string;\n\tprivate readonly nombreCliente?: string;\n\n\tconstructor(opciones: OpcionesClienteBroker) {\n\t\tthis.url = opciones.url.replace(/\\/$/, \"\");\n\t\tthis.token = opciones.token;\n\t\tthis.nombreCliente = opciones.cliente;\n\t}\n\n\tprivate cabeceras(): Record<string, string> {\n\t\treturn { \"content-type\": \"application/json\", authorization: `Bearer ${this.token}` };\n\t}\n\n\t/**\n\t * Pide una credencial al broker y la devuelve para uso inmediato.\n\t *\n\t * `null` = el broker no tiene ninguna credencial activa para ese proveedor\n\t * (todas bloqueadas, o proveedor sin dar de alta) — \"no hay nada\", que se\n\t * distingue de una excepción, que es \"no he podido hablar con el broker\".\n\t */\n\tasync resolverCredencial(proveedor: string, promptCacheKey?: string): Promise<CredencialResuelta | null> {\n\t\tconst respuesta = await fetch(`${this.url}/v1/credential`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: this.cabeceras(),\n\t\t\tbody: JSON.stringify({ proveedor, promptCacheKey, cliente: this.nombreCliente }),\n\t\t});\n\t\tif (respuesta.status === 404) return null;\n\t\tif (!respuesta.ok) {\n\t\t\tthrow new Error(`broker /v1/credential: ${respuesta.status} ${await respuesta.text()}`);\n\t\t}\n\t\tconst datos = (await respuesta.json()) as { id: string; valor: string };\n\t\t// Deliberado: no `this.ultimaCredencial = datos` ni nada parecido. El\n\t\t// valor cruza esta función y desaparece de aquí.\n\t\treturn { id: datos.id, valor: datos.valor };\n\t}\n\n\t/** Reporta cómo fue usar una credencial ya entregada. El broker distingue 401 de 429 con esto. */\n\tasync reportarUso(id: string, resultado: ResultadoDeUso): Promise<EfectoDeUso | null> {\n\t\tconst respuesta = await fetch(`${this.url}/v1/usage`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: this.cabeceras(),\n\t\t\tbody: JSON.stringify({ id, ...resultado }),\n\t\t});\n\t\tif (respuesta.status === 404) return null;\n\t\tif (!respuesta.ok) {\n\t\t\tthrow new Error(`broker /v1/usage: ${respuesta.status} ${await respuesta.text()}`);\n\t\t}\n\t\treturn (await respuesta.json()) as EfectoDeUso;\n\t}\n\n\t/** Vista del pool sin secretos: qué credenciales hay y en qué estado. */\n\tasync snapshot(): Promise<FilaSnapshot[]> {\n\t\tconst respuesta = await fetch(`${this.url}/v1/snapshot`, { headers: this.cabeceras() });\n\t\tif (!respuesta.ok) {\n\t\t\tthrow new Error(`broker /v1/snapshot: ${respuesta.status} ${await respuesta.text()}`);\n\t\t}\n\t\tconst datos = (await respuesta.json()) as { credenciales: FilaSnapshot[] };\n\t\treturn datos.credenciales;\n\t}\n\n\t/** Liveness sin bearer. `false` en cualquier fallo de red, no lanza. */\n\tasync salud(): Promise<boolean> {\n\t\ttry {\n\t\t\tconst respuesta = await fetch(`${this.url}/v1/health`);\n\t\t\treturn respuesta.ok;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Piscina de credenciales por proveedor.
3
+ *
4
+ * El hueco que esto tapa: hoy cada desarrollador tiene sus claves en su propio
5
+ * portátil. `oh-my-pi` (packages/ai/src/auth-broker de ese repo) resuelve esto
6
+ * con un servidor que guarda las credenciales y las reparte; lo que se copia
7
+ * aquí de su diseño son dos decisiones concretas, no el código:
8
+ *
9
+ * 1. **Conmutación a una hermana cuando una cuenta falla de verdad.** Un 401
10
+ * (`credencial-invalida` o `sin-credencial` en la taxonomía de
11
+ * `../errores/proveedor.ts`) saca la credencial del pool: la siguiente
12
+ * petición usa otra. Un 429 (`limite-de-tasa`) NO la saca — la cuenta sigue
13
+ * siendo buena, solo está ocupada un rato. Confundir los dos es el fallo
14
+ * que quema cuentas sanas: se ha visto documentado en el propio
15
+ * `errores/proveedor.ts` como el error más caro de mezclar.
16
+ * 2. **Pegajosidad por sesión vía `prompt_cache_key`.** Sin esto, repartir
17
+ * entre cuentas rompería el caché de prompts del proveedor en cada turno —
18
+ * cada petición de la misma conversación pagaría el prefijo entero de
19
+ * nuevo. Una `prompt_cache_key` se queda pegada a la misma credencial
20
+ * mientras esa credencial siga activa; solo se realoja cuando la que tenía
21
+ * pegada se bloquea.
22
+ *
23
+ * Lo que NO se copia: el pool vive en memoria del proceso `ada-cli serve
24
+ * --broker`, no en SQLite. Reiniciar el broker olvida qué estaba bloqueado y
25
+ * la pegajosidad — aceptable para el alcance de hoy (equipos pequeños, un
26
+ * broker por equipo); si hace falta sobrevivir a reinicios, el punto de
27
+ * extensión es cargar/guardar `estado()` a un fichero en `iniciar`/`cerrar`.
28
+ */
29
+ /** Una credencial tal como la da quien configura el pool: sin estado todavía. */
30
+ export interface CredencialDelPool {
31
+ id: string;
32
+ proveedor: string;
33
+ valor: string;
34
+ }
35
+ export type EstadoCredencial = "activa" | "bloqueada";
36
+ /** Lo que se le enseña a un cliente que pide credencial: el secreto, para usarlo. */
37
+ export interface CredencialElegida {
38
+ id: string;
39
+ proveedor: string;
40
+ valor: string;
41
+ }
42
+ /** Lo que reporta el cliente tras usar una credencial. */
43
+ export type ResultadoDeUso = {
44
+ ok: true;
45
+ } | {
46
+ ok: false;
47
+ estadoHttp?: number;
48
+ mensaje: string;
49
+ };
50
+ /** Lo que devuelve `marcarUso`: la clase de error (o "ok") y el estado resultante. */
51
+ export interface EfectoDeUso {
52
+ clase: string;
53
+ estado: EstadoCredencial;
54
+ }
55
+ /** Fila sin el secreto — lo que se puede enseñar por `/v1/snapshot` sin filtrar nada. */
56
+ export interface FilaPublica {
57
+ id: string;
58
+ proveedor: string;
59
+ estado: EstadoCredencial;
60
+ motivoBloqueo?: string;
61
+ }
62
+ export declare class CredencialPool {
63
+ private readonly porId;
64
+ private readonly porProveedor;
65
+ /** `proveedor\0promptCacheKey` -> id de la credencial pegada a esa sesión. */
66
+ private readonly pegajosidad;
67
+ /** Cursor de reparto round-robin por proveedor, para las peticiones sin pegajosidad. */
68
+ private readonly cursores;
69
+ constructor(credenciales: Record<string, CredencialDelPool[]>);
70
+ private clavePegajosidad;
71
+ private siguiente;
72
+ /**
73
+ * Elige una credencial activa para `proveedor`.
74
+ *
75
+ * Sin `promptCacheKey`: reparto round-robin entre las activas. Con
76
+ * `promptCacheKey`: si la sesión ya tenía una credencial pegada y sigue
77
+ * activa, se reutiliza (no rompe el caché de prompts); si no, se elige una
78
+ * nueva y se fija para las próximas llamadas con la misma clave.
79
+ *
80
+ * `null` = no hay ninguna credencial activa para ese proveedor. Es "no hay
81
+ * nada", no "no he podido" — todas las filas existen, todas están
82
+ * bloqueadas, y decirlo así es lo que distingue esto de un fallo del pool.
83
+ */
84
+ elegir(proveedor: string, promptCacheKey?: string): CredencialElegida | null;
85
+ /**
86
+ * Registra el resultado de usar una credencial ya entregada.
87
+ *
88
+ * `null` = id desconocido (no hay tal credencial en el pool) — se distingue
89
+ * de "la marcó y sigue activa" para que quien llama pueda contestar 404 en
90
+ * vez de fingir un 200.
91
+ */
92
+ marcarUso(id: string, resultado: ResultadoDeUso): EfectoDeUso | null;
93
+ /** Vista pública del pool: sin secretos, para `/v1/snapshot`. */
94
+ snapshot(): FilaPublica[];
95
+ }
96
+ //# sourceMappingURL=pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../../src/core/credenciales/pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH,kFAAiF;AACjF,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,WAAW,CAAC;AAQtD,sFAAqF;AACrF,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,0DAA0D;AAC1D,MAAM,MAAM,cAAc,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhG,sFAAsF;AACtF,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;CACzB;AAED,4FAAyF;AACzF,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,gBAAgB,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IAC1D,+EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,wFAAwF;IACxF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAEtD,YAAY,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,EAM5D;IAED,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,SAAS;IAMjB;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAqB3E;IAED;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,WAAW,GAAG,IAAI,CAyBnE;IAED,kEAAiE;IACjE,QAAQ,IAAI,WAAW,EAAE,CAOxB;CACD","sourcesContent":["/**\n * Piscina de credenciales por proveedor.\n *\n * El hueco que esto tapa: hoy cada desarrollador tiene sus claves en su propio\n * portátil. `oh-my-pi` (packages/ai/src/auth-broker de ese repo) resuelve esto\n * con un servidor que guarda las credenciales y las reparte; lo que se copia\n * aquí de su diseño son dos decisiones concretas, no el código:\n *\n * 1. **Conmutación a una hermana cuando una cuenta falla de verdad.** Un 401\n * (`credencial-invalida` o `sin-credencial` en la taxonomía de\n * `../errores/proveedor.ts`) saca la credencial del pool: la siguiente\n * petición usa otra. Un 429 (`limite-de-tasa`) NO la saca — la cuenta sigue\n * siendo buena, solo está ocupada un rato. Confundir los dos es el fallo\n * que quema cuentas sanas: se ha visto documentado en el propio\n * `errores/proveedor.ts` como el error más caro de mezclar.\n * 2. **Pegajosidad por sesión vía `prompt_cache_key`.** Sin esto, repartir\n * entre cuentas rompería el caché de prompts del proveedor en cada turno —\n * cada petición de la misma conversación pagaría el prefijo entero de\n * nuevo. Una `prompt_cache_key` se queda pegada a la misma credencial\n * mientras esa credencial siga activa; solo se realoja cuando la que tenía\n * pegada se bloquea.\n *\n * Lo que NO se copia: el pool vive en memoria del proceso `ada-cli serve\n * --broker`, no en SQLite. Reiniciar el broker olvida qué estaba bloqueado y\n * la pegajosidad — aceptable para el alcance de hoy (equipos pequeños, un\n * broker por equipo); si hace falta sobrevivir a reinicios, el punto de\n * extensión es cargar/guardar `estado()` a un fichero en `iniciar`/`cerrar`.\n */\n\nimport { clasificarError } from \"../errores/proveedor.ts\";\n\n/** Una credencial tal como la da quien configura el pool: sin estado todavía. */\nexport interface CredencialDelPool {\n\tid: string;\n\tproveedor: string;\n\tvalor: string;\n}\n\nexport type EstadoCredencial = \"activa\" | \"bloqueada\";\n\ninterface Fila extends CredencialDelPool {\n\testado: EstadoCredencial;\n\tmotivoBloqueo?: string;\n\tbloqueadaEn?: number;\n}\n\n/** Lo que se le enseña a un cliente que pide credencial: el secreto, para usarlo. */\nexport interface CredencialElegida {\n\tid: string;\n\tproveedor: string;\n\tvalor: string;\n}\n\n/** Lo que reporta el cliente tras usar una credencial. */\nexport type ResultadoDeUso = { ok: true } | { ok: false; estadoHttp?: number; mensaje: string };\n\n/** Lo que devuelve `marcarUso`: la clase de error (o \"ok\") y el estado resultante. */\nexport interface EfectoDeUso {\n\tclase: string;\n\testado: EstadoCredencial;\n}\n\n/** Fila sin el secreto — lo que se puede enseñar por `/v1/snapshot` sin filtrar nada. */\nexport interface FilaPublica {\n\tid: string;\n\tproveedor: string;\n\testado: EstadoCredencial;\n\tmotivoBloqueo?: string;\n}\n\nexport class CredencialPool {\n\tprivate readonly porId = new Map<string, Fila>();\n\tprivate readonly porProveedor = new Map<string, Fila[]>();\n\t/** `proveedor\\0promptCacheKey` -> id de la credencial pegada a esa sesión. */\n\tprivate readonly pegajosidad = new Map<string, string>();\n\t/** Cursor de reparto round-robin por proveedor, para las peticiones sin pegajosidad. */\n\tprivate readonly cursores = new Map<string, number>();\n\n\tconstructor(credenciales: Record<string, CredencialDelPool[]>) {\n\t\tfor (const [proveedor, lista] of Object.entries(credenciales)) {\n\t\t\tconst filas = lista.map((c): Fila => ({ ...c, proveedor, estado: \"activa\" }));\n\t\t\tthis.porProveedor.set(proveedor, filas);\n\t\t\tfor (const fila of filas) this.porId.set(fila.id, fila);\n\t\t}\n\t}\n\n\tprivate clavePegajosidad(proveedor: string, promptCacheKey: string): string {\n\t\treturn `${proveedor} ${promptCacheKey}`;\n\t}\n\n\tprivate siguiente(proveedor: string, activas: Fila[]): Fila {\n\t\tconst cursor = this.cursores.get(proveedor) ?? 0;\n\t\tthis.cursores.set(proveedor, cursor + 1);\n\t\treturn activas[cursor % activas.length];\n\t}\n\n\t/**\n\t * Elige una credencial activa para `proveedor`.\n\t *\n\t * Sin `promptCacheKey`: reparto round-robin entre las activas. Con\n\t * `promptCacheKey`: si la sesión ya tenía una credencial pegada y sigue\n\t * activa, se reutiliza (no rompe el caché de prompts); si no, se elige una\n\t * nueva y se fija para las próximas llamadas con la misma clave.\n\t *\n\t * `null` = no hay ninguna credencial activa para ese proveedor. Es \"no hay\n\t * nada\", no \"no he podido\" — todas las filas existen, todas están\n\t * bloqueadas, y decirlo así es lo que distingue esto de un fallo del pool.\n\t */\n\telegir(proveedor: string, promptCacheKey?: string): CredencialElegida | null {\n\t\tconst filas = this.porProveedor.get(proveedor) ?? [];\n\t\tconst activas = filas.filter((f) => f.estado === \"activa\");\n\t\tif (activas.length === 0) return null;\n\n\t\tif (promptCacheKey) {\n\t\t\tconst clave = this.clavePegajosidad(proveedor, promptCacheKey);\n\t\t\tconst idPegado = this.pegajosidad.get(clave);\n\t\t\tconst fila = idPegado ? this.porId.get(idPegado) : undefined;\n\t\t\tif (fila && fila.estado === \"activa\") {\n\t\t\t\treturn { id: fila.id, proveedor, valor: fila.valor };\n\t\t\t}\n\t\t\t// Sin pegajosidad válida (primera vez, o la que tenía pegada se bloqueó):\n\t\t\t// elige una hermana y la fija para las próximas peticiones de esta sesión.\n\t\t\tconst elegida = this.siguiente(proveedor, activas);\n\t\t\tthis.pegajosidad.set(clave, elegida.id);\n\t\t\treturn { id: elegida.id, proveedor, valor: elegida.valor };\n\t\t}\n\n\t\tconst elegida = this.siguiente(proveedor, activas);\n\t\treturn { id: elegida.id, proveedor, valor: elegida.valor };\n\t}\n\n\t/**\n\t * Registra el resultado de usar una credencial ya entregada.\n\t *\n\t * `null` = id desconocido (no hay tal credencial en el pool) — se distingue\n\t * de \"la marcó y sigue activa\" para que quien llama pueda contestar 404 en\n\t * vez de fingir un 200.\n\t */\n\tmarcarUso(id: string, resultado: ResultadoDeUso): EfectoDeUso | null {\n\t\tconst fila = this.porId.get(id);\n\t\tif (!fila) return null;\n\n\t\tif (resultado.ok) return { clase: \"ok\", estado: fila.estado };\n\n\t\tconst clasificado = clasificarError({ mensaje: resultado.mensaje, estado: resultado.estadoHttp });\n\n\t\t// Solo un 401/403 de credencial mala saca la fila del pool. Un 429\n\t\t// (`limite-de-tasa`) deja `fila.estado` intacto a propósito: es la\n\t\t// distinción que pide la tarea, y confundirla quema cuentas que solo\n\t\t// estaban ocupadas.\n\t\tif (clasificado.clase === \"credencial-invalida\" || clasificado.clase === \"sin-credencial\") {\n\t\t\tfila.estado = \"bloqueada\";\n\t\t\tfila.motivoBloqueo = clasificado.clase;\n\t\t\tfila.bloqueadaEn = Date.now();\n\t\t\t// Toda sesión pegada a esta credencial se suelta: la próxima `elegir`\n\t\t\t// con la misma prompt_cache_key tiene que caer en una hermana, no\n\t\t\t// seguir devolviendo la que ya sabemos que está mala.\n\t\t\tfor (const [clave, idPegado] of this.pegajosidad) {\n\t\t\t\tif (idPegado === id) this.pegajosidad.delete(clave);\n\t\t\t}\n\t\t}\n\n\t\treturn { clase: clasificado.clase, estado: fila.estado };\n\t}\n\n\t/** Vista pública del pool: sin secretos, para `/v1/snapshot`. */\n\tsnapshot(): FilaPublica[] {\n\t\treturn [...this.porId.values()].map((f) => ({\n\t\t\tid: f.id,\n\t\t\tproveedor: f.proveedor,\n\t\t\testado: f.estado,\n\t\t\tmotivoBloqueo: f.motivoBloqueo,\n\t\t}));\n\t}\n}\n"]}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Piscina de credenciales por proveedor.
3
+ *
4
+ * El hueco que esto tapa: hoy cada desarrollador tiene sus claves en su propio
5
+ * portátil. `oh-my-pi` (packages/ai/src/auth-broker de ese repo) resuelve esto
6
+ * con un servidor que guarda las credenciales y las reparte; lo que se copia
7
+ * aquí de su diseño son dos decisiones concretas, no el código:
8
+ *
9
+ * 1. **Conmutación a una hermana cuando una cuenta falla de verdad.** Un 401
10
+ * (`credencial-invalida` o `sin-credencial` en la taxonomía de
11
+ * `../errores/proveedor.ts`) saca la credencial del pool: la siguiente
12
+ * petición usa otra. Un 429 (`limite-de-tasa`) NO la saca — la cuenta sigue
13
+ * siendo buena, solo está ocupada un rato. Confundir los dos es el fallo
14
+ * que quema cuentas sanas: se ha visto documentado en el propio
15
+ * `errores/proveedor.ts` como el error más caro de mezclar.
16
+ * 2. **Pegajosidad por sesión vía `prompt_cache_key`.** Sin esto, repartir
17
+ * entre cuentas rompería el caché de prompts del proveedor en cada turno —
18
+ * cada petición de la misma conversación pagaría el prefijo entero de
19
+ * nuevo. Una `prompt_cache_key` se queda pegada a la misma credencial
20
+ * mientras esa credencial siga activa; solo se realoja cuando la que tenía
21
+ * pegada se bloquea.
22
+ *
23
+ * Lo que NO se copia: el pool vive en memoria del proceso `ada-cli serve
24
+ * --broker`, no en SQLite. Reiniciar el broker olvida qué estaba bloqueado y
25
+ * la pegajosidad — aceptable para el alcance de hoy (equipos pequeños, un
26
+ * broker por equipo); si hace falta sobrevivir a reinicios, el punto de
27
+ * extensión es cargar/guardar `estado()` a un fichero en `iniciar`/`cerrar`.
28
+ */
29
+ import { clasificarError } from "../errores/proveedor.js";
30
+ export class CredencialPool {
31
+ porId = new Map();
32
+ porProveedor = new Map();
33
+ /** `proveedor\0promptCacheKey` -> id de la credencial pegada a esa sesión. */
34
+ pegajosidad = new Map();
35
+ /** Cursor de reparto round-robin por proveedor, para las peticiones sin pegajosidad. */
36
+ cursores = new Map();
37
+ constructor(credenciales) {
38
+ for (const [proveedor, lista] of Object.entries(credenciales)) {
39
+ const filas = lista.map((c) => ({ ...c, proveedor, estado: "activa" }));
40
+ this.porProveedor.set(proveedor, filas);
41
+ for (const fila of filas)
42
+ this.porId.set(fila.id, fila);
43
+ }
44
+ }
45
+ clavePegajosidad(proveedor, promptCacheKey) {
46
+ return `${proveedor} ${promptCacheKey}`;
47
+ }
48
+ siguiente(proveedor, activas) {
49
+ const cursor = this.cursores.get(proveedor) ?? 0;
50
+ this.cursores.set(proveedor, cursor + 1);
51
+ return activas[cursor % activas.length];
52
+ }
53
+ /**
54
+ * Elige una credencial activa para `proveedor`.
55
+ *
56
+ * Sin `promptCacheKey`: reparto round-robin entre las activas. Con
57
+ * `promptCacheKey`: si la sesión ya tenía una credencial pegada y sigue
58
+ * activa, se reutiliza (no rompe el caché de prompts); si no, se elige una
59
+ * nueva y se fija para las próximas llamadas con la misma clave.
60
+ *
61
+ * `null` = no hay ninguna credencial activa para ese proveedor. Es "no hay
62
+ * nada", no "no he podido" — todas las filas existen, todas están
63
+ * bloqueadas, y decirlo así es lo que distingue esto de un fallo del pool.
64
+ */
65
+ elegir(proveedor, promptCacheKey) {
66
+ const filas = this.porProveedor.get(proveedor) ?? [];
67
+ const activas = filas.filter((f) => f.estado === "activa");
68
+ if (activas.length === 0)
69
+ return null;
70
+ if (promptCacheKey) {
71
+ const clave = this.clavePegajosidad(proveedor, promptCacheKey);
72
+ const idPegado = this.pegajosidad.get(clave);
73
+ const fila = idPegado ? this.porId.get(idPegado) : undefined;
74
+ if (fila && fila.estado === "activa") {
75
+ return { id: fila.id, proveedor, valor: fila.valor };
76
+ }
77
+ // Sin pegajosidad válida (primera vez, o la que tenía pegada se bloqueó):
78
+ // elige una hermana y la fija para las próximas peticiones de esta sesión.
79
+ const elegida = this.siguiente(proveedor, activas);
80
+ this.pegajosidad.set(clave, elegida.id);
81
+ return { id: elegida.id, proveedor, valor: elegida.valor };
82
+ }
83
+ const elegida = this.siguiente(proveedor, activas);
84
+ return { id: elegida.id, proveedor, valor: elegida.valor };
85
+ }
86
+ /**
87
+ * Registra el resultado de usar una credencial ya entregada.
88
+ *
89
+ * `null` = id desconocido (no hay tal credencial en el pool) — se distingue
90
+ * de "la marcó y sigue activa" para que quien llama pueda contestar 404 en
91
+ * vez de fingir un 200.
92
+ */
93
+ marcarUso(id, resultado) {
94
+ const fila = this.porId.get(id);
95
+ if (!fila)
96
+ return null;
97
+ if (resultado.ok)
98
+ return { clase: "ok", estado: fila.estado };
99
+ const clasificado = clasificarError({ mensaje: resultado.mensaje, estado: resultado.estadoHttp });
100
+ // Solo un 401/403 de credencial mala saca la fila del pool. Un 429
101
+ // (`limite-de-tasa`) deja `fila.estado` intacto a propósito: es la
102
+ // distinción que pide la tarea, y confundirla quema cuentas que solo
103
+ // estaban ocupadas.
104
+ if (clasificado.clase === "credencial-invalida" || clasificado.clase === "sin-credencial") {
105
+ fila.estado = "bloqueada";
106
+ fila.motivoBloqueo = clasificado.clase;
107
+ fila.bloqueadaEn = Date.now();
108
+ // Toda sesión pegada a esta credencial se suelta: la próxima `elegir`
109
+ // con la misma prompt_cache_key tiene que caer en una hermana, no
110
+ // seguir devolviendo la que ya sabemos que está mala.
111
+ for (const [clave, idPegado] of this.pegajosidad) {
112
+ if (idPegado === id)
113
+ this.pegajosidad.delete(clave);
114
+ }
115
+ }
116
+ return { clase: clasificado.clase, estado: fila.estado };
117
+ }
118
+ /** Vista pública del pool: sin secretos, para `/v1/snapshot`. */
119
+ snapshot() {
120
+ return [...this.porId.values()].map((f) => ({
121
+ id: f.id,
122
+ proveedor: f.proveedor,
123
+ estado: f.estado,
124
+ motivoBloqueo: f.motivoBloqueo,
125
+ }));
126
+ }
127
+ }
128
+ //# sourceMappingURL=pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.js","sourceRoot":"","sources":["../../../src/core/credenciales/pool.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Piscina de credenciales por proveedor.\n *\n * El hueco que esto tapa: hoy cada desarrollador tiene sus claves en su propio\n * portátil. `oh-my-pi` (packages/ai/src/auth-broker de ese repo) resuelve esto\n * con un servidor que guarda las credenciales y las reparte; lo que se copia\n * aquí de su diseño son dos decisiones concretas, no el código:\n *\n * 1. **Conmutación a una hermana cuando una cuenta falla de verdad.** Un 401\n * (`credencial-invalida` o `sin-credencial` en la taxonomía de\n * `../errores/proveedor.ts`) saca la credencial del pool: la siguiente\n * petición usa otra. Un 429 (`limite-de-tasa`) NO la saca — la cuenta sigue\n * siendo buena, solo está ocupada un rato. Confundir los dos es el fallo\n * que quema cuentas sanas: se ha visto documentado en el propio\n * `errores/proveedor.ts` como el error más caro de mezclar.\n * 2. **Pegajosidad por sesión vía `prompt_cache_key`.** Sin esto, repartir\n * entre cuentas rompería el caché de prompts del proveedor en cada turno —\n * cada petición de la misma conversación pagaría el prefijo entero de\n * nuevo. Una `prompt_cache_key` se queda pegada a la misma credencial\n * mientras esa credencial siga activa; solo se realoja cuando la que tenía\n * pegada se bloquea.\n *\n * Lo que NO se copia: el pool vive en memoria del proceso `ada-cli serve\n * --broker`, no en SQLite. Reiniciar el broker olvida qué estaba bloqueado y\n * la pegajosidad — aceptable para el alcance de hoy (equipos pequeños, un\n * broker por equipo); si hace falta sobrevivir a reinicios, el punto de\n * extensión es cargar/guardar `estado()` a un fichero en `iniciar`/`cerrar`.\n */\n\nimport { clasificarError } from \"../errores/proveedor.ts\";\n\n/** Una credencial tal como la da quien configura el pool: sin estado todavía. */\nexport interface CredencialDelPool {\n\tid: string;\n\tproveedor: string;\n\tvalor: string;\n}\n\nexport type EstadoCredencial = \"activa\" | \"bloqueada\";\n\ninterface Fila extends CredencialDelPool {\n\testado: EstadoCredencial;\n\tmotivoBloqueo?: string;\n\tbloqueadaEn?: number;\n}\n\n/** Lo que se le enseña a un cliente que pide credencial: el secreto, para usarlo. */\nexport interface CredencialElegida {\n\tid: string;\n\tproveedor: string;\n\tvalor: string;\n}\n\n/** Lo que reporta el cliente tras usar una credencial. */\nexport type ResultadoDeUso = { ok: true } | { ok: false; estadoHttp?: number; mensaje: string };\n\n/** Lo que devuelve `marcarUso`: la clase de error (o \"ok\") y el estado resultante. */\nexport interface EfectoDeUso {\n\tclase: string;\n\testado: EstadoCredencial;\n}\n\n/** Fila sin el secreto — lo que se puede enseñar por `/v1/snapshot` sin filtrar nada. */\nexport interface FilaPublica {\n\tid: string;\n\tproveedor: string;\n\testado: EstadoCredencial;\n\tmotivoBloqueo?: string;\n}\n\nexport class CredencialPool {\n\tprivate readonly porId = new Map<string, Fila>();\n\tprivate readonly porProveedor = new Map<string, Fila[]>();\n\t/** `proveedor\\0promptCacheKey` -> id de la credencial pegada a esa sesión. */\n\tprivate readonly pegajosidad = new Map<string, string>();\n\t/** Cursor de reparto round-robin por proveedor, para las peticiones sin pegajosidad. */\n\tprivate readonly cursores = new Map<string, number>();\n\n\tconstructor(credenciales: Record<string, CredencialDelPool[]>) {\n\t\tfor (const [proveedor, lista] of Object.entries(credenciales)) {\n\t\t\tconst filas = lista.map((c): Fila => ({ ...c, proveedor, estado: \"activa\" }));\n\t\t\tthis.porProveedor.set(proveedor, filas);\n\t\t\tfor (const fila of filas) this.porId.set(fila.id, fila);\n\t\t}\n\t}\n\n\tprivate clavePegajosidad(proveedor: string, promptCacheKey: string): string {\n\t\treturn `${proveedor} ${promptCacheKey}`;\n\t}\n\n\tprivate siguiente(proveedor: string, activas: Fila[]): Fila {\n\t\tconst cursor = this.cursores.get(proveedor) ?? 0;\n\t\tthis.cursores.set(proveedor, cursor + 1);\n\t\treturn activas[cursor % activas.length];\n\t}\n\n\t/**\n\t * Elige una credencial activa para `proveedor`.\n\t *\n\t * Sin `promptCacheKey`: reparto round-robin entre las activas. Con\n\t * `promptCacheKey`: si la sesión ya tenía una credencial pegada y sigue\n\t * activa, se reutiliza (no rompe el caché de prompts); si no, se elige una\n\t * nueva y se fija para las próximas llamadas con la misma clave.\n\t *\n\t * `null` = no hay ninguna credencial activa para ese proveedor. Es \"no hay\n\t * nada\", no \"no he podido\" — todas las filas existen, todas están\n\t * bloqueadas, y decirlo así es lo que distingue esto de un fallo del pool.\n\t */\n\telegir(proveedor: string, promptCacheKey?: string): CredencialElegida | null {\n\t\tconst filas = this.porProveedor.get(proveedor) ?? [];\n\t\tconst activas = filas.filter((f) => f.estado === \"activa\");\n\t\tif (activas.length === 0) return null;\n\n\t\tif (promptCacheKey) {\n\t\t\tconst clave = this.clavePegajosidad(proveedor, promptCacheKey);\n\t\t\tconst idPegado = this.pegajosidad.get(clave);\n\t\t\tconst fila = idPegado ? this.porId.get(idPegado) : undefined;\n\t\t\tif (fila && fila.estado === \"activa\") {\n\t\t\t\treturn { id: fila.id, proveedor, valor: fila.valor };\n\t\t\t}\n\t\t\t// Sin pegajosidad válida (primera vez, o la que tenía pegada se bloqueó):\n\t\t\t// elige una hermana y la fija para las próximas peticiones de esta sesión.\n\t\t\tconst elegida = this.siguiente(proveedor, activas);\n\t\t\tthis.pegajosidad.set(clave, elegida.id);\n\t\t\treturn { id: elegida.id, proveedor, valor: elegida.valor };\n\t\t}\n\n\t\tconst elegida = this.siguiente(proveedor, activas);\n\t\treturn { id: elegida.id, proveedor, valor: elegida.valor };\n\t}\n\n\t/**\n\t * Registra el resultado de usar una credencial ya entregada.\n\t *\n\t * `null` = id desconocido (no hay tal credencial en el pool) — se distingue\n\t * de \"la marcó y sigue activa\" para que quien llama pueda contestar 404 en\n\t * vez de fingir un 200.\n\t */\n\tmarcarUso(id: string, resultado: ResultadoDeUso): EfectoDeUso | null {\n\t\tconst fila = this.porId.get(id);\n\t\tif (!fila) return null;\n\n\t\tif (resultado.ok) return { clase: \"ok\", estado: fila.estado };\n\n\t\tconst clasificado = clasificarError({ mensaje: resultado.mensaje, estado: resultado.estadoHttp });\n\n\t\t// Solo un 401/403 de credencial mala saca la fila del pool. Un 429\n\t\t// (`limite-de-tasa`) deja `fila.estado` intacto a propósito: es la\n\t\t// distinción que pide la tarea, y confundirla quema cuentas que solo\n\t\t// estaban ocupadas.\n\t\tif (clasificado.clase === \"credencial-invalida\" || clasificado.clase === \"sin-credencial\") {\n\t\t\tfila.estado = \"bloqueada\";\n\t\t\tfila.motivoBloqueo = clasificado.clase;\n\t\t\tfila.bloqueadaEn = Date.now();\n\t\t\t// Toda sesión pegada a esta credencial se suelta: la próxima `elegir`\n\t\t\t// con la misma prompt_cache_key tiene que caer en una hermana, no\n\t\t\t// seguir devolviendo la que ya sabemos que está mala.\n\t\t\tfor (const [clave, idPegado] of this.pegajosidad) {\n\t\t\t\tif (idPegado === id) this.pegajosidad.delete(clave);\n\t\t\t}\n\t\t}\n\n\t\treturn { clase: clasificado.clase, estado: fila.estado };\n\t}\n\n\t/** Vista pública del pool: sin secretos, para `/v1/snapshot`. */\n\tsnapshot(): FilaPublica[] {\n\t\treturn [...this.porId.values()].map((f) => ({\n\t\t\tid: f.id,\n\t\t\tproveedor: f.proveedor,\n\t\t\testado: f.estado,\n\t\t\tmotivoBloqueo: f.motivoBloqueo,\n\t\t}));\n\t}\n}\n"]}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Cifrado en reposo de `<agentDir>/auth.json`.
3
+ *
4
+ * EL HUECO: vendemos "vault cifrado con clasificación y auditoría"
5
+ * (memory-engine/vault.ts) mientras las claves de API y los tokens OAuth de
6
+ * los proveedores viven en auth.json EN CLARO, con permisos 0600 pero
7
+ * legibles por cualquier proceso del usuario. La política de aprobación
8
+ * (aprobacion/politica.ts) ya le impide leerlo a NUESTRO agente; esto le
9
+ * cierra la puerta a cualquier OTRO proceso.
10
+ *
11
+ * DISEÑO — envolver, no sustituir:
12
+ * `auth-storage.ts` es de upstream y el presupuesto de fork está agotado
13
+ * (ver scripts/sync-ada.sh --check). No podemos reescribir su lectura/
14
+ * escritura de fichero ni su bloqueo entre procesos (proper-lockfile) sin
15
+ * pagar hunks que no tenemos. En vez de eso, ENVOLVEMOS su
16
+ * `AuthStorageBackend`: el interior (`FileAuthStorageBackend`) sigue
17
+ * poseyendo el candado y el `ensureFileExists`/`ensureParentDir`; nosotros
18
+ * solo transformamos el CONTENIDO que entra y sale del candado. Todo el
19
+ * cifrado ocurre DENTRO de la sección crítica del candado que ya existía,
20
+ * así que la seguridad frente a otros procesos de Ada no cambia.
21
+ *
22
+ * CLAVE: un secreto aleatorio de 256 bits en el LLAVERO del sistema (no una
23
+ * passphrase memorizable — nadie va a teclear una contraseña para que el
24
+ * CLI arranque). Se deriva de nada: se genera con randomBytes y se guarda
25
+ * en Keychain la primera vez que hace falta. Sin llavero disponible (CI,
26
+ * contenedor, Linux sin secret-service) NO SE CIFRA: una clave que vive en
27
+ * el mismo disco que el fichero que protege es ofuscación, no cifrado, y
28
+ * llamarlo cifrado sería mentir en la única parte del producto donde no se
29
+ * puede mentir. Se avisa una vez, con una línea clara, y se sigue
30
+ * funcionando en claro (mismo comportamiento que hoy).
31
+ *
32
+ * FORMATO: una cabecera literal al principio del fichero distingue claro de
33
+ * cifrado — nunca adivinamos intentando JSON.parse (un fichero cifrado
34
+ * corrupto a medias podría parsear igual como JSON basura y confundirse con
35
+ * "en claro", perdiendo credenciales calladamente).
36
+ *
37
+ * MIGRACIÓN: en cada lectura, si el contenido está en claro se devuelve tal
38
+ * cual (nunca bloquea al llamador) y se agenda un recifrado en segundo
39
+ * plano con `setImmediate` — nunca DENTRO del candado que la propia lectura
40
+ * mantiene abierto, porque volver a pedirlo desde dentro se autobloquearía.
41
+ * En cada escritura (a través del wrapper) se cifra antes de tocar disco,
42
+ * con copia de seguridad y escritura atómica (fichero temporal + rename):
43
+ * si esto corrompe auth.json, el usuario pierde el acceso a TODOS sus
44
+ * proveedores, así que no se sustituye el fichero real hasta que el
45
+ * temporal esté completo en disco.
46
+ */
47
+ import type { Credential } from "@earendil-works/pi-ai";
48
+ import type { AuthStorageBackend } from "../auth-storage.ts";
49
+ /**
50
+ * True cuando hay un llavero de sistema utilizable en esta máquina.
51
+ *
52
+ * `ADA_SIN_LLAVERO=1` fuerza "no disponible" aunque estemos en macOS — es la
53
+ * única forma de probar de verdad la rama "sin llavero" (headless/CI) sin
54
+ * necesitar una máquina Linux, y también sirve de escape manual para quien
55
+ * quiera desactivar el uso del Keychain explícitamente.
56
+ */
57
+ export declare function hayLlaveroDisponible(): boolean;
58
+ /**
59
+ * auth.json cifrado que no se puede leer: auth tag inválido, JSON del sobre
60
+ * truncado, o llavero sin la clave que lo cifró (p.ej. copiado desde otra
61
+ * máquina). "no he podido leerlo" y "no hay credenciales" son cosas
62
+ * distintas: esto SIEMPRE es lo primero, nunca se confunde con un auth.json
63
+ * vacío legítimo.
64
+ */
65
+ export declare class AuthJsonCorruptoError extends Error {
66
+ constructor(authPath: string, causa: unknown);
67
+ }
68
+ /**
69
+ * Envuelve un `AuthStorageBackend` (normalmente un `FileAuthStorageBackend`
70
+ * ya construido, que sigue poseyendo el candado entre procesos) para que
71
+ * cifre/descifre en reposo de forma transparente para quien lo use.
72
+ */
73
+ export declare function envolverBackendCifrado(interno: AuthStorageBackend, authPath: string): AuthStorageBackend;
74
+ /**
75
+ * Lectura síncrona de UNA credencial ya guardada, descifrando si hace falta.
76
+ *
77
+ * Sustituye a `readStoredCredential` (upstream, `auth-storage.ts`), exportada
78
+ * en `index.ts` como parte de la API pública del SDK (`@hoilab/ada-cli`) para
79
+ * lecturas puntuales sin instanciar `AuthStorage`. Esa función hace su propio
80
+ * `readFileSync` + `JSON.parse` sin pasar por este módulo: con auth.json ya
81
+ * migrado a cifrado, la cabecera `ADA-AUTHJSON-CIFRADO-V1\n` delante del JSON
82
+ * hace que `JSON.parse` lance un `SyntaxError` que su `catch { return
83
+ * undefined; }` convierte en "no hay credencial" — indistinguible de un
84
+ * proveedor sin configurar, para CUALQUIER consumidor de esta función
85
+ * pública, presente o futuro. Mismo nombre y misma firma (con el mismo valor
86
+ * por defecto de `authPath`) para seguir siendo un reemplazo directo.
87
+ */
88
+ export declare function leerCredencialGuardada(providerId: string, authPath?: string): Credential | undefined;
89
+ /** Solo para pruebas: limpia el estado en memoria del módulo entre casos. */
90
+ export declare function __resetEstadoParaPruebas(): void;
91
+ /** Solo para pruebas: borra la clave maestra del llavero real de esta máquina. */
92
+ export declare function __eliminarClaveDeLlaveroParaPruebas(): void;
93
+ //# sourceMappingURL=reposo.d.ts.map