@hoilab/ada-cli 0.84.22 → 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 (1114) hide show
  1. package/CHANGELOG.md +29 -2
  2. package/README.es.md +17 -6
  3. package/README.md +109 -11
  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/audit-command.d.ts +15 -0
  9. package/dist/cli/audit-command.d.ts.map +1 -0
  10. package/dist/cli/audit-command.js +280 -0
  11. package/dist/cli/audit-command.js.map +1 -0
  12. package/dist/cli/banco-command.d.ts +15 -0
  13. package/dist/cli/banco-command.d.ts.map +1 -0
  14. package/dist/cli/banco-command.js +213 -0
  15. package/dist/cli/banco-command.js.map +1 -0
  16. package/dist/cli/cleanse-command.d.ts +11 -0
  17. package/dist/cli/cleanse-command.d.ts.map +1 -0
  18. package/dist/cli/cleanse-command.js +101 -0
  19. package/dist/cli/cleanse-command.js.map +1 -0
  20. package/dist/cli/commit-command.d.ts +31 -0
  21. package/dist/cli/commit-command.d.ts.map +1 -0
  22. package/dist/cli/commit-command.js +158 -0
  23. package/dist/cli/commit-command.js.map +1 -0
  24. package/dist/cli/computer-command.d.ts +12 -0
  25. package/dist/cli/computer-command.d.ts.map +1 -0
  26. package/dist/cli/computer-command.js +141 -0
  27. package/dist/cli/computer-command.js.map +1 -0
  28. package/dist/cli/discover-command.d.ts +18 -0
  29. package/dist/cli/discover-command.d.ts.map +1 -0
  30. package/dist/cli/discover-command.js +108 -0
  31. package/dist/cli/discover-command.js.map +1 -0
  32. package/dist/cli/hashline-command.d.ts +11 -0
  33. package/dist/cli/hashline-command.d.ts.map +1 -0
  34. package/dist/cli/hashline-command.js +106 -0
  35. package/dist/cli/hashline-command.js.map +1 -0
  36. package/dist/cli/import-command.d.ts +35 -0
  37. package/dist/cli/import-command.d.ts.map +1 -0
  38. package/dist/cli/import-command.js +164 -0
  39. package/dist/cli/import-command.js.map +1 -0
  40. package/dist/cli/politica-command.d.ts +20 -0
  41. package/dist/cli/politica-command.d.ts.map +1 -0
  42. package/dist/cli/politica-command.js +93 -0
  43. package/dist/cli/politica-command.js.map +1 -0
  44. package/dist/cli/refine-command.d.ts +18 -0
  45. package/dist/cli/refine-command.d.ts.map +1 -0
  46. package/dist/cli/refine-command.js +101 -0
  47. package/dist/cli/refine-command.js.map +1 -0
  48. package/dist/cli/review-command.d.ts +24 -0
  49. package/dist/cli/review-command.d.ts.map +1 -0
  50. package/dist/cli/review-command.js +168 -0
  51. package/dist/cli/review-command.js.map +1 -0
  52. package/dist/cli/schedule-command.d.ts +17 -0
  53. package/dist/cli/schedule-command.d.ts.map +1 -0
  54. package/dist/cli/schedule-command.js +117 -0
  55. package/dist/cli/schedule-command.js.map +1 -0
  56. package/dist/cli/serve-command.d.ts +72 -0
  57. package/dist/cli/serve-command.d.ts.map +1 -0
  58. package/dist/cli/serve-command.js +568 -0
  59. package/dist/cli/serve-command.js.map +1 -0
  60. package/dist/cli/telegram-command.d.ts +18 -0
  61. package/dist/cli/telegram-command.d.ts.map +1 -0
  62. package/dist/cli/telegram-command.js +137 -0
  63. package/dist/cli/telegram-command.js.map +1 -0
  64. package/dist/cli/telemetria-command.d.ts +22 -0
  65. package/dist/cli/telemetria-command.d.ts.map +1 -0
  66. package/dist/cli/telemetria-command.js +127 -0
  67. package/dist/cli/telemetria-command.js.map +1 -0
  68. package/dist/cli/undo-command.d.ts +9 -0
  69. package/dist/cli/undo-command.d.ts.map +1 -0
  70. package/dist/cli/undo-command.js +56 -0
  71. package/dist/cli/undo-command.js.map +1 -0
  72. package/dist/cli/usage-command.d.ts +10 -0
  73. package/dist/cli/usage-command.d.ts.map +1 -0
  74. package/dist/cli/usage-command.js +209 -0
  75. package/dist/cli/usage-command.js.map +1 -0
  76. package/dist/cli/wiki-command.d.ts +9 -0
  77. package/dist/cli/wiki-command.d.ts.map +1 -0
  78. package/dist/cli/wiki-command.js +76 -0
  79. package/dist/cli/wiki-command.js.map +1 -0
  80. package/dist/cli.d.ts +6 -0
  81. package/dist/cli.d.ts.map +1 -1
  82. package/dist/cli.js +10 -11
  83. package/dist/cli.js.map +1 -1
  84. package/dist/config.d.ts +1 -1
  85. package/dist/config.d.ts.map +1 -1
  86. package/dist/config.js +1 -1
  87. package/dist/config.js.map +1 -1
  88. package/dist/core/ada.d.ts +58 -0
  89. package/dist/core/ada.d.ts.map +1 -0
  90. package/dist/core/ada.js +61 -0
  91. package/dist/core/ada.js.map +1 -0
  92. package/dist/core/advisor/guarda.d.ts +66 -0
  93. package/dist/core/advisor/guarda.d.ts.map +1 -0
  94. package/dist/core/advisor/guarda.js +191 -0
  95. package/dist/core/advisor/guarda.js.map +1 -0
  96. package/dist/core/advisor/runtime.d.ts +66 -0
  97. package/dist/core/advisor/runtime.d.ts.map +1 -0
  98. package/dist/core/advisor/runtime.js +121 -0
  99. package/dist/core/advisor/runtime.js.map +1 -0
  100. package/dist/core/advisor/sesion.d.ts +109 -0
  101. package/dist/core/advisor/sesion.d.ts.map +1 -0
  102. package/dist/core/advisor/sesion.js +139 -0
  103. package/dist/core/advisor/sesion.js.map +1 -0
  104. package/dist/core/agent-session.d.ts +30 -2
  105. package/dist/core/agent-session.d.ts.map +1 -1
  106. package/dist/core/agent-session.js +430 -22
  107. package/dist/core/agent-session.js.map +1 -1
  108. package/dist/core/agents/loader.d.ts +77 -0
  109. package/dist/core/agents/loader.d.ts.map +1 -0
  110. package/dist/core/agents/loader.js +154 -0
  111. package/dist/core/agents/loader.js.map +1 -0
  112. package/dist/core/aprobacion/generados.d.ts +37 -0
  113. package/dist/core/aprobacion/generados.d.ts.map +1 -0
  114. package/dist/core/aprobacion/generados.js +85 -0
  115. package/dist/core/aprobacion/generados.js.map +1 -0
  116. package/dist/core/aprobacion/politica-de-maquina.d.ts +90 -0
  117. package/dist/core/aprobacion/politica-de-maquina.d.ts.map +1 -0
  118. package/dist/core/aprobacion/politica-de-maquina.js +212 -0
  119. package/dist/core/aprobacion/politica-de-maquina.js.map +1 -0
  120. package/dist/core/aprobacion/politica.d.ts +90 -0
  121. package/dist/core/aprobacion/politica.d.ts.map +1 -0
  122. package/dist/core/aprobacion/politica.js +375 -0
  123. package/dist/core/aprobacion/politica.js.map +1 -0
  124. package/dist/core/arranque/atajos.d.ts +46 -0
  125. package/dist/core/arranque/atajos.d.ts.map +1 -0
  126. package/dist/core/arranque/atajos.js +113 -0
  127. package/dist/core/arranque/atajos.js.map +1 -0
  128. package/dist/core/audit/exportacion.d.ts +54 -0
  129. package/dist/core/audit/exportacion.d.ts.map +1 -0
  130. package/dist/core/audit/exportacion.js +265 -0
  131. package/dist/core/audit/exportacion.js.map +1 -0
  132. package/dist/core/audit/libro.d.ts +318 -0
  133. package/dist/core/audit/libro.d.ts.map +1 -0
  134. package/dist/core/audit/libro.js +508 -0
  135. package/dist/core/audit/libro.js.map +1 -0
  136. package/dist/core/audit/registro-sesion.d.ts +78 -0
  137. package/dist/core/audit/registro-sesion.d.ts.map +1 -0
  138. package/dist/core/audit/registro-sesion.js +202 -0
  139. package/dist/core/audit/registro-sesion.js.map +1 -0
  140. package/dist/core/audit/retencion.d.ts +82 -0
  141. package/dist/core/audit/retencion.d.ts.map +1 -0
  142. package/dist/core/audit/retencion.js +152 -0
  143. package/dist/core/audit/retencion.js.map +1 -0
  144. package/dist/core/audit/rutas.d.ts +23 -0
  145. package/dist/core/audit/rutas.d.ts.map +1 -0
  146. package/dist/core/audit/rutas.js +23 -0
  147. package/dist/core/audit/rutas.js.map +1 -0
  148. package/dist/core/auth-storage.d.ts +0 -3
  149. package/dist/core/auth-storage.d.ts.map +1 -1
  150. package/dist/core/auth-storage.js +17 -5
  151. package/dist/core/auth-storage.js.map +1 -1
  152. package/dist/core/banco/almacenamiento.d.ts +18 -0
  153. package/dist/core/banco/almacenamiento.d.ts.map +1 -0
  154. package/dist/core/banco/almacenamiento.js +50 -0
  155. package/dist/core/banco/almacenamiento.js.map +1 -0
  156. package/dist/core/banco/analisis.d.ts +37 -0
  157. package/dist/core/banco/analisis.d.ts.map +1 -0
  158. package/dist/core/banco/analisis.js +164 -0
  159. package/dist/core/banco/analisis.js.map +1 -0
  160. package/dist/core/banco/bloques.d.ts +39 -0
  161. package/dist/core/banco/bloques.d.ts.map +1 -0
  162. package/dist/core/banco/bloques.js +84 -0
  163. package/dist/core/banco/bloques.js.map +1 -0
  164. package/dist/core/banco/cargas.d.ts +84 -0
  165. package/dist/core/banco/cargas.d.ts.map +1 -0
  166. package/dist/core/banco/cargas.js +520 -0
  167. package/dist/core/banco/cargas.js.map +1 -0
  168. package/dist/core/banco/comparar.d.ts +29 -0
  169. package/dist/core/banco/comparar.d.ts.map +1 -0
  170. package/dist/core/banco/comparar.js +28 -0
  171. package/dist/core/banco/comparar.js.map +1 -0
  172. package/dist/core/banco/ejecutar.d.ts +44 -0
  173. package/dist/core/banco/ejecutar.d.ts.map +1 -0
  174. package/dist/core/banco/ejecutar.js +183 -0
  175. package/dist/core/banco/ejecutar.js.map +1 -0
  176. package/dist/core/banco/generar.d.ts +24 -0
  177. package/dist/core/banco/generar.d.ts.map +1 -0
  178. package/dist/core/banco/generar.js +159 -0
  179. package/dist/core/banco/generar.js.map +1 -0
  180. package/dist/core/banco/mutaciones.d.ts +25 -0
  181. package/dist/core/banco/mutaciones.d.ts.map +1 -0
  182. package/dist/core/banco/mutaciones.js +215 -0
  183. package/dist/core/banco/mutaciones.js.map +1 -0
  184. package/dist/core/banco/tipos.d.ts +121 -0
  185. package/dist/core/banco/tipos.d.ts.map +1 -0
  186. package/dist/core/banco/tipos.js +16 -0
  187. package/dist/core/banco/tipos.js.map +1 -0
  188. package/dist/core/blobs/almacen.d.ts +81 -0
  189. package/dist/core/blobs/almacen.d.ts.map +1 -0
  190. package/dist/core/blobs/almacen.js +198 -0
  191. package/dist/core/blobs/almacen.js.map +1 -0
  192. package/dist/core/blobs/broker.d.ts +103 -0
  193. package/dist/core/blobs/broker.d.ts.map +1 -0
  194. package/dist/core/blobs/broker.js +204 -0
  195. package/dist/core/blobs/broker.js.map +1 -0
  196. package/dist/core/blobs/index.d.ts +70 -0
  197. package/dist/core/blobs/index.d.ts.map +1 -0
  198. package/dist/core/blobs/index.js +232 -0
  199. package/dist/core/blobs/index.js.map +1 -0
  200. package/dist/core/blobs/payload.d.ts +55 -0
  201. package/dist/core/blobs/payload.d.ts.map +1 -0
  202. package/dist/core/blobs/payload.js +255 -0
  203. package/dist/core/blobs/payload.js.map +1 -0
  204. package/dist/core/blobs/proveedor.d.ts +85 -0
  205. package/dist/core/blobs/proveedor.d.ts.map +1 -0
  206. package/dist/core/blobs/proveedor.js +196 -0
  207. package/dist/core/blobs/proveedor.js.map +1 -0
  208. package/dist/core/browser/cdp.d.ts +41 -0
  209. package/dist/core/browser/cdp.d.ts.map +1 -0
  210. package/dist/core/browser/cdp.js +119 -0
  211. package/dist/core/browser/cdp.js.map +1 -0
  212. package/dist/core/browser/politica.d.ts +51 -0
  213. package/dist/core/browser/politica.d.ts.map +1 -0
  214. package/dist/core/browser/politica.js +123 -0
  215. package/dist/core/browser/politica.js.map +1 -0
  216. package/dist/core/browser/sesion.d.ts +52 -0
  217. package/dist/core/browser/sesion.d.ts.map +1 -0
  218. package/dist/core/browser/sesion.js +176 -0
  219. package/dist/core/browser/sesion.js.map +1 -0
  220. package/dist/core/browser/tools.d.ts +16 -0
  221. package/dist/core/browser/tools.d.ts.map +1 -0
  222. package/dist/core/browser/tools.js +279 -0
  223. package/dist/core/browser/tools.js.map +1 -0
  224. package/dist/core/commit/diff.d.ts +56 -0
  225. package/dist/core/commit/diff.d.ts.map +1 -0
  226. package/dist/core/commit/diff.js +145 -0
  227. package/dist/core/commit/diff.js.map +1 -0
  228. package/dist/core/commit/mensaje.d.ts +80 -0
  229. package/dist/core/commit/mensaje.d.ts.map +1 -0
  230. package/dist/core/commit/mensaje.js +207 -0
  231. package/dist/core/commit/mensaje.js.map +1 -0
  232. package/dist/core/compactar/index.d.ts +52 -0
  233. package/dist/core/compactar/index.d.ts.map +1 -0
  234. package/dist/core/compactar/index.js +91 -0
  235. package/dist/core/compactar/index.js.map +1 -0
  236. package/dist/core/compactar/registro-denso.d.ts +160 -0
  237. package/dist/core/compactar/registro-denso.d.ts.map +1 -0
  238. package/dist/core/compactar/registro-denso.js +620 -0
  239. package/dist/core/compactar/registro-denso.js.map +1 -0
  240. package/dist/core/computer/captura.d.ts +35 -0
  241. package/dist/core/computer/captura.d.ts.map +1 -0
  242. package/dist/core/computer/captura.js +140 -0
  243. package/dist/core/computer/captura.js.map +1 -0
  244. package/dist/core/computer/driver.d.ts +130 -0
  245. package/dist/core/computer/driver.d.ts.map +1 -0
  246. package/dist/core/computer/driver.js +206 -0
  247. package/dist/core/computer/driver.js.map +1 -0
  248. package/dist/core/computer/motor/actions.d.ts +109 -0
  249. package/dist/core/computer/motor/actions.d.ts.map +1 -0
  250. package/dist/core/computer/motor/actions.js +157 -0
  251. package/dist/core/computer/motor/actions.js.map +1 -0
  252. package/dist/core/computer/motor/bridge.d.ts +232 -0
  253. package/dist/core/computer/motor/bridge.d.ts.map +1 -0
  254. package/dist/core/computer/motor/bridge.js +2335 -0
  255. package/dist/core/computer/motor/bridge.js.map +1 -0
  256. package/dist/core/computer/motor/cdp.d.ts +107 -0
  257. package/dist/core/computer/motor/cdp.d.ts.map +1 -0
  258. package/dist/core/computer/motor/cdp.js +659 -0
  259. package/dist/core/computer/motor/cdp.js.map +1 -0
  260. package/dist/core/computer/motor/config.d.ts +23 -0
  261. package/dist/core/computer/motor/config.d.ts.map +1 -0
  262. package/dist/core/computer/motor/config.js +100 -0
  263. package/dist/core/computer/motor/config.js.map +1 -0
  264. package/dist/core/computer/motor/contract.d.ts +81 -0
  265. package/dist/core/computer/motor/contract.d.ts.map +1 -0
  266. package/dist/core/computer/motor/contract.js +14 -0
  267. package/dist/core/computer/motor/contract.js.map +1 -0
  268. package/dist/core/computer/motor/note.d.ts +37 -0
  269. package/dist/core/computer/motor/note.d.ts.map +1 -0
  270. package/dist/core/computer/motor/note.js +162 -0
  271. package/dist/core/computer/motor/note.js.map +1 -0
  272. package/dist/core/computer/motor/outline.d.ts +155 -0
  273. package/dist/core/computer/motor/outline.d.ts.map +1 -0
  274. package/dist/core/computer/motor/outline.js +590 -0
  275. package/dist/core/computer/motor/outline.js.map +1 -0
  276. package/dist/core/computer/motor/output.d.ts +18 -0
  277. package/dist/core/computer/motor/output.d.ts.map +1 -0
  278. package/dist/core/computer/motor/output.js +148 -0
  279. package/dist/core/computer/motor/output.js.map +1 -0
  280. package/dist/core/computer/motor/permissions.d.ts +41 -0
  281. package/dist/core/computer/motor/permissions.d.ts.map +1 -0
  282. package/dist/core/computer/motor/permissions.js +51 -0
  283. package/dist/core/computer/motor/permissions.js.map +1 -0
  284. package/dist/core/computer/motor/platform/architecture.d.ts +5 -0
  285. package/dist/core/computer/motor/platform/architecture.d.ts.map +1 -0
  286. package/dist/core/computer/motor/platform/architecture.js +21 -0
  287. package/dist/core/computer/motor/platform/architecture.js.map +1 -0
  288. package/dist/core/computer/motor/platform/coerce.d.ts +4 -0
  289. package/dist/core/computer/motor/platform/coerce.d.ts.map +1 -0
  290. package/dist/core/computer/motor/platform/coerce.js +17 -0
  291. package/dist/core/computer/motor/platform/coerce.js.map +1 -0
  292. package/dist/core/computer/motor/platform/index.d.ts +4 -0
  293. package/dist/core/computer/motor/platform/index.d.ts.map +1 -0
  294. package/dist/core/computer/motor/platform/index.js +79 -0
  295. package/dist/core/computer/motor/platform/index.js.map +1 -0
  296. package/dist/core/computer/motor/platform/linux/backend.d.ts +3 -0
  297. package/dist/core/computer/motor/platform/linux/backend.d.ts.map +1 -0
  298. package/dist/core/computer/motor/platform/linux/backend.js +173 -0
  299. package/dist/core/computer/motor/platform/linux/backend.js.map +1 -0
  300. package/dist/core/computer/motor/platform/linux/helper.d.ts +29 -0
  301. package/dist/core/computer/motor/platform/linux/helper.d.ts.map +1 -0
  302. package/dist/core/computer/motor/platform/linux/helper.js +261 -0
  303. package/dist/core/computer/motor/platform/linux/helper.js.map +1 -0
  304. package/dist/core/computer/motor/platform/macos/backend.d.ts +3 -0
  305. package/dist/core/computer/motor/platform/macos/backend.d.ts.map +1 -0
  306. package/dist/core/computer/motor/platform/macos/backend.js +124 -0
  307. package/dist/core/computer/motor/platform/macos/backend.js.map +1 -0
  308. package/dist/core/computer/motor/platform/macos/browser.d.ts +7 -0
  309. package/dist/core/computer/motor/platform/macos/browser.d.ts.map +1 -0
  310. package/dist/core/computer/motor/platform/macos/browser.js +101 -0
  311. package/dist/core/computer/motor/platform/macos/browser.js.map +1 -0
  312. package/dist/core/computer/motor/platform/macos/helper-path.mjs +34 -0
  313. package/dist/core/computer/motor/platform/macos/helper.d.ts +32 -0
  314. package/dist/core/computer/motor/platform/macos/helper.d.ts.map +1 -0
  315. package/dist/core/computer/motor/platform/macos/helper.js +277 -0
  316. package/dist/core/computer/motor/platform/macos/helper.js.map +1 -0
  317. package/dist/core/computer/motor/platform/macos/permissions.d.ts +4 -0
  318. package/dist/core/computer/motor/platform/macos/permissions.d.ts.map +1 -0
  319. package/dist/core/computer/motor/platform/macos/permissions.js +118 -0
  320. package/dist/core/computer/motor/platform/macos/permissions.js.map +1 -0
  321. package/dist/core/computer/motor/platform/types.d.ts +263 -0
  322. package/dist/core/computer/motor/platform/types.d.ts.map +1 -0
  323. package/dist/core/computer/motor/platform/types.js +2 -0
  324. package/dist/core/computer/motor/platform/types.js.map +1 -0
  325. package/dist/core/computer/motor/platform/windows/backend.d.ts +3 -0
  326. package/dist/core/computer/motor/platform/windows/backend.d.ts.map +1 -0
  327. package/dist/core/computer/motor/platform/windows/backend.js +163 -0
  328. package/dist/core/computer/motor/platform/windows/backend.js.map +1 -0
  329. package/dist/core/computer/motor/platform/windows/helper.d.ts +18 -0
  330. package/dist/core/computer/motor/platform/windows/helper.d.ts.map +1 -0
  331. package/dist/core/computer/motor/platform/windows/helper.js +174 -0
  332. package/dist/core/computer/motor/platform/windows/helper.js.map +1 -0
  333. package/dist/core/computer/motor/root-selection.d.ts +6 -0
  334. package/dist/core/computer/motor/root-selection.d.ts.map +1 -0
  335. package/dist/core/computer/motor/root-selection.js +28 -0
  336. package/dist/core/computer/motor/root-selection.js.map +1 -0
  337. package/dist/core/computer/motor/runtime.d.ts +50 -0
  338. package/dist/core/computer/motor/runtime.d.ts.map +1 -0
  339. package/dist/core/computer/motor/runtime.js +119 -0
  340. package/dist/core/computer/motor/runtime.js.map +1 -0
  341. package/dist/core/computer/motor/state.d.ts +68 -0
  342. package/dist/core/computer/motor/state.d.ts.map +1 -0
  343. package/dist/core/computer/motor/state.js +100 -0
  344. package/dist/core/computer/motor/state.js.map +1 -0
  345. package/dist/core/computer/motor/view.d.ts +6 -0
  346. package/dist/core/computer/motor/view.d.ts.map +1 -0
  347. package/dist/core/computer/motor/view.js +185 -0
  348. package/dist/core/computer/motor/view.js.map +1 -0
  349. package/dist/core/computer/motor-ada.d.ts +159 -0
  350. package/dist/core/computer/motor-ada.d.ts.map +1 -0
  351. package/dist/core/computer/motor-ada.js +412 -0
  352. package/dist/core/computer/motor-ada.js.map +1 -0
  353. package/dist/core/computer/politica.d.ts +56 -0
  354. package/dist/core/computer/politica.d.ts.map +1 -0
  355. package/dist/core/computer/politica.js +163 -0
  356. package/dist/core/computer/politica.js.map +1 -0
  357. package/dist/core/computer/tools.d.ts +26 -0
  358. package/dist/core/computer/tools.d.ts.map +1 -0
  359. package/dist/core/computer/tools.js +399 -0
  360. package/dist/core/computer/tools.js.map +1 -0
  361. package/dist/core/context-breakdown.d.ts +80 -0
  362. package/dist/core/context-breakdown.d.ts.map +1 -0
  363. package/dist/core/context-breakdown.js +87 -0
  364. package/dist/core/context-breakdown.js.map +1 -0
  365. package/dist/core/credenciales/cliente.d.ts +60 -0
  366. package/dist/core/credenciales/cliente.d.ts.map +1 -0
  367. package/dist/core/credenciales/cliente.js +81 -0
  368. package/dist/core/credenciales/cliente.js.map +1 -0
  369. package/dist/core/credenciales/pool.d.ts +96 -0
  370. package/dist/core/credenciales/pool.d.ts.map +1 -0
  371. package/dist/core/credenciales/pool.js +128 -0
  372. package/dist/core/credenciales/pool.js.map +1 -0
  373. package/dist/core/credenciales/reposo.d.ts +93 -0
  374. package/dist/core/credenciales/reposo.d.ts.map +1 -0
  375. package/dist/core/credenciales/reposo.js +489 -0
  376. package/dist/core/credenciales/reposo.js.map +1 -0
  377. package/dist/core/credenciales/servidor.d.ts +55 -0
  378. package/dist/core/credenciales/servidor.d.ts.map +1 -0
  379. package/dist/core/credenciales/servidor.js +205 -0
  380. package/dist/core/credenciales/servidor.js.map +1 -0
  381. package/dist/core/descubrimiento/comandos.d.ts +30 -0
  382. package/dist/core/descubrimiento/comandos.d.ts.map +1 -0
  383. package/dist/core/descubrimiento/comandos.js +76 -0
  384. package/dist/core/descubrimiento/comandos.js.map +1 -0
  385. package/dist/core/descubrimiento/mcp.d.ts +42 -0
  386. package/dist/core/descubrimiento/mcp.d.ts.map +1 -0
  387. package/dist/core/descubrimiento/mcp.js +130 -0
  388. package/dist/core/descubrimiento/mcp.js.map +1 -0
  389. package/dist/core/descubrimiento/reglas.d.ts +61 -0
  390. package/dist/core/descubrimiento/reglas.d.ts.map +1 -0
  391. package/dist/core/descubrimiento/reglas.js +134 -0
  392. package/dist/core/descubrimiento/reglas.js.map +1 -0
  393. package/dist/core/descubrimiento/skills.d.ts +57 -0
  394. package/dist/core/descubrimiento/skills.d.ts.map +1 -0
  395. package/dist/core/descubrimiento/skills.js +113 -0
  396. package/dist/core/descubrimiento/skills.js.map +1 -0
  397. package/dist/core/dificultad/clasificador.d.ts +133 -0
  398. package/dist/core/dificultad/clasificador.d.ts.map +1 -0
  399. package/dist/core/dificultad/clasificador.js +288 -0
  400. package/dist/core/dificultad/clasificador.js.map +1 -0
  401. package/dist/core/edicion/diario.d.ts +37 -0
  402. package/dist/core/edicion/diario.d.ts.map +1 -0
  403. package/dist/core/edicion/diario.js +51 -0
  404. package/dist/core/edicion/diario.js.map +1 -0
  405. package/dist/core/edicion/hashline.d.ts +71 -0
  406. package/dist/core/edicion/hashline.d.ts.map +1 -0
  407. package/dist/core/edicion/hashline.js +111 -0
  408. package/dist/core/edicion/hashline.js.map +1 -0
  409. package/dist/core/edicion/hueco.d.ts +64 -0
  410. package/dist/core/edicion/hueco.d.ts.map +1 -0
  411. package/dist/core/edicion/hueco.js +162 -0
  412. package/dist/core/edicion/hueco.js.map +1 -0
  413. package/dist/core/edicion/limpiar-carga.d.ts +39 -0
  414. package/dist/core/edicion/limpiar-carga.d.ts.map +1 -0
  415. package/dist/core/edicion/limpiar-carga.js +121 -0
  416. package/dist/core/edicion/limpiar-carga.js.map +1 -0
  417. package/dist/core/edicion/observador.d.ts +80 -0
  418. package/dist/core/edicion/observador.d.ts.map +1 -0
  419. package/dist/core/edicion/observador.js +183 -0
  420. package/dist/core/edicion/observador.js.map +1 -0
  421. package/dist/core/edicion/parecido.d.ts +53 -0
  422. package/dist/core/edicion/parecido.d.ts.map +1 -0
  423. package/dist/core/edicion/parecido.js +145 -0
  424. package/dist/core/edicion/parecido.js.map +1 -0
  425. package/dist/core/edicion/parseo.d.ts +58 -0
  426. package/dist/core/edicion/parseo.d.ts.map +1 -0
  427. package/dist/core/edicion/parseo.js +124 -0
  428. package/dist/core/edicion/parseo.js.map +1 -0
  429. package/dist/core/edicion/reparacion.d.ts +67 -0
  430. package/dist/core/edicion/reparacion.d.ts.map +1 -0
  431. package/dist/core/edicion/reparacion.js +202 -0
  432. package/dist/core/edicion/reparacion.js.map +1 -0
  433. package/dist/core/edicion/sangria.d.ts +121 -0
  434. package/dist/core/edicion/sangria.d.ts.map +1 -0
  435. package/dist/core/edicion/sangria.js +341 -0
  436. package/dist/core/edicion/sangria.js.map +1 -0
  437. package/dist/core/edicion/tipos.d.ts +58 -0
  438. package/dist/core/edicion/tipos.d.ts.map +1 -0
  439. package/dist/core/edicion/tipos.js +160 -0
  440. package/dist/core/edicion/tipos.js.map +1 -0
  441. package/dist/core/errores/proveedor.d.ts +53 -0
  442. package/dist/core/errores/proveedor.d.ts.map +1 -0
  443. package/dist/core/errores/proveedor.js +191 -0
  444. package/dist/core/errores/proveedor.js.map +1 -0
  445. package/dist/core/estructural/buscar.d.ts +61 -0
  446. package/dist/core/estructural/buscar.d.ts.map +1 -0
  447. package/dist/core/estructural/buscar.js +261 -0
  448. package/dist/core/estructural/buscar.js.map +1 -0
  449. package/dist/core/estructural/editar.d.ts +36 -0
  450. package/dist/core/estructural/editar.d.ts.map +1 -0
  451. package/dist/core/estructural/editar.js +123 -0
  452. package/dist/core/estructural/editar.js.map +1 -0
  453. package/dist/core/estructural/tools.d.ts +11 -0
  454. package/dist/core/estructural/tools.d.ts.map +1 -0
  455. package/dist/core/estructural/tools.js +100 -0
  456. package/dist/core/estructural/tools.js.map +1 -0
  457. package/dist/core/experimental.d.ts.map +1 -1
  458. package/dist/core/experimental.js +10 -1
  459. package/dist/core/experimental.js.map +1 -1
  460. package/dist/core/extensiones/suplantacion.d.ts +49 -0
  461. package/dist/core/extensiones/suplantacion.d.ts.map +1 -0
  462. package/dist/core/extensiones/suplantacion.js +61 -0
  463. package/dist/core/extensiones/suplantacion.js.map +1 -0
  464. package/dist/core/extensiones/vigilancia.d.ts +54 -0
  465. package/dist/core/extensiones/vigilancia.d.ts.map +1 -0
  466. package/dist/core/extensiones/vigilancia.js +217 -0
  467. package/dist/core/extensiones/vigilancia.js.map +1 -0
  468. package/dist/core/extensions/loader.d.ts.map +1 -1
  469. package/dist/core/extensions/loader.js +11 -1
  470. package/dist/core/extensions/loader.js.map +1 -1
  471. package/dist/core/harness/fuentes-de-contexto.d.ts +29 -0
  472. package/dist/core/harness/fuentes-de-contexto.d.ts.map +1 -0
  473. package/dist/core/harness/fuentes-de-contexto.js +44 -0
  474. package/dist/core/harness/fuentes-de-contexto.js.map +1 -0
  475. package/dist/core/harness/refine.d.ts +40 -0
  476. package/dist/core/harness/refine.d.ts.map +1 -0
  477. package/dist/core/harness/refine.js +109 -0
  478. package/dist/core/harness/refine.js.map +1 -0
  479. package/dist/core/harness/store.d.ts +75 -0
  480. package/dist/core/harness/store.d.ts.map +1 -0
  481. package/dist/core/harness/store.js +149 -0
  482. package/dist/core/harness/store.js.map +1 -0
  483. package/dist/core/hooks/contract.d.ts +85 -0
  484. package/dist/core/hooks/contract.d.ts.map +1 -0
  485. package/dist/core/hooks/contract.js +140 -0
  486. package/dist/core/hooks/contract.js.map +1 -0
  487. package/dist/core/hooks/runner.d.ts +42 -0
  488. package/dist/core/hooks/runner.d.ts.map +1 -0
  489. package/dist/core/hooks/runner.js +85 -0
  490. package/dist/core/hooks/runner.js.map +1 -0
  491. package/dist/core/hooks/session-hooks.d.ts +62 -0
  492. package/dist/core/hooks/session-hooks.d.ts.map +1 -0
  493. package/dist/core/hooks/session-hooks.js +84 -0
  494. package/dist/core/hooks/session-hooks.js.map +1 -0
  495. package/dist/core/importar/formatos.d.ts +69 -0
  496. package/dist/core/importar/formatos.d.ts.map +1 -0
  497. package/dist/core/importar/formatos.js +235 -0
  498. package/dist/core/importar/formatos.js.map +1 -0
  499. package/dist/core/interactivo/deteccion.d.ts +44 -0
  500. package/dist/core/interactivo/deteccion.d.ts.map +1 -0
  501. package/dist/core/interactivo/deteccion.js +82 -0
  502. package/dist/core/interactivo/deteccion.js.map +1 -0
  503. package/dist/core/interactivo/sesion.d.ts +50 -0
  504. package/dist/core/interactivo/sesion.d.ts.map +1 -0
  505. package/dist/core/interactivo/sesion.js +156 -0
  506. package/dist/core/interactivo/sesion.js.map +1 -0
  507. package/dist/core/interactivo/tools.d.ts +21 -0
  508. package/dist/core/interactivo/tools.d.ts.map +1 -0
  509. package/dist/core/interactivo/tools.js +122 -0
  510. package/dist/core/interactivo/tools.js.map +1 -0
  511. package/dist/core/lectura/mapa.d.ts +70 -0
  512. package/dist/core/lectura/mapa.d.ts.map +1 -0
  513. package/dist/core/lectura/mapa.js +177 -0
  514. package/dist/core/lectura/mapa.js.map +1 -0
  515. package/dist/core/lectura/pdf.d.ts +49 -0
  516. package/dist/core/lectura/pdf.d.ts.map +1 -0
  517. package/dist/core/lectura/pdf.js +337 -0
  518. package/dist/core/lectura/pdf.js.map +1 -0
  519. package/dist/core/limpieza/comprobadores.d.ts +28 -0
  520. package/dist/core/limpieza/comprobadores.d.ts.map +1 -0
  521. package/dist/core/limpieza/comprobadores.js +311 -0
  522. package/dist/core/limpieza/comprobadores.js.map +1 -0
  523. package/dist/core/limpieza/parseo.d.ts +19 -0
  524. package/dist/core/limpieza/parseo.d.ts.map +1 -0
  525. package/dist/core/limpieza/parseo.js +124 -0
  526. package/dist/core/limpieza/parseo.js.map +1 -0
  527. package/dist/core/limpieza/reparacion.d.ts +77 -0
  528. package/dist/core/limpieza/reparacion.d.ts.map +1 -0
  529. package/dist/core/limpieza/reparacion.js +254 -0
  530. package/dist/core/limpieza/reparacion.js.map +1 -0
  531. package/dist/core/limpieza/tipos.d.ts +56 -0
  532. package/dist/core/limpieza/tipos.d.ts.map +1 -0
  533. package/dist/core/limpieza/tipos.js +9 -0
  534. package/dist/core/limpieza/tipos.js.map +1 -0
  535. package/dist/core/lsp/cliente.d.ts +52 -0
  536. package/dist/core/lsp/cliente.d.ts.map +1 -0
  537. package/dist/core/lsp/cliente.js +232 -0
  538. package/dist/core/lsp/cliente.js.map +1 -0
  539. package/dist/core/lsp/descubrimiento.d.ts +62 -0
  540. package/dist/core/lsp/descubrimiento.d.ts.map +1 -0
  541. package/dist/core/lsp/descubrimiento.js +152 -0
  542. package/dist/core/lsp/descubrimiento.js.map +1 -0
  543. package/dist/core/lsp/ediciones.d.ts +59 -0
  544. package/dist/core/lsp/ediciones.d.ts.map +1 -0
  545. package/dist/core/lsp/ediciones.js +89 -0
  546. package/dist/core/lsp/ediciones.js.map +1 -0
  547. package/dist/core/lsp/extension.d.ts +28 -0
  548. package/dist/core/lsp/extension.d.ts.map +1 -0
  549. package/dist/core/lsp/extension.js +34 -0
  550. package/dist/core/lsp/extension.js.map +1 -0
  551. package/dist/core/lsp/tools.d.ts +45 -0
  552. package/dist/core/lsp/tools.d.ts.map +1 -0
  553. package/dist/core/lsp/tools.js +265 -0
  554. package/dist/core/lsp/tools.js.map +1 -0
  555. package/dist/core/mcp/client.d.ts +60 -0
  556. package/dist/core/mcp/client.d.ts.map +1 -0
  557. package/dist/core/mcp/client.js +139 -0
  558. package/dist/core/mcp/client.js.map +1 -0
  559. package/dist/core/mcp/manager.d.ts +86 -0
  560. package/dist/core/mcp/manager.d.ts.map +1 -0
  561. package/dist/core/mcp/manager.js +124 -0
  562. package/dist/core/mcp/manager.js.map +1 -0
  563. package/dist/core/mcp/tools.d.ts +15 -0
  564. package/dist/core/mcp/tools.d.ts.map +1 -0
  565. package/dist/core/mcp/tools.js +84 -0
  566. package/dist/core/mcp/tools.js.map +1 -0
  567. package/dist/core/memory-engine/audit-export.d.ts +12 -10
  568. package/dist/core/memory-engine/audit-export.d.ts.map +1 -1
  569. package/dist/core/memory-engine/audit-export.js +15 -0
  570. package/dist/core/memory-engine/audit-export.js.map +1 -1
  571. package/dist/core/memory-engine/audit-indice.d.ts +153 -0
  572. package/dist/core/memory-engine/audit-indice.d.ts.map +1 -0
  573. package/dist/core/memory-engine/audit-indice.js +271 -0
  574. package/dist/core/memory-engine/audit-indice.js.map +1 -0
  575. package/dist/core/memory-engine/audit.d.ts +18 -6
  576. package/dist/core/memory-engine/audit.d.ts.map +1 -1
  577. package/dist/core/memory-engine/audit.js +25 -42
  578. package/dist/core/memory-engine/audit.js.map +1 -1
  579. package/dist/core/memory-engine/engine.d.ts +19 -1
  580. package/dist/core/memory-engine/engine.d.ts.map +1 -1
  581. package/dist/core/memory-engine/engine.js +71 -5
  582. package/dist/core/memory-engine/engine.js.map +1 -1
  583. package/dist/core/memory-engine/observation-store.d.ts +0 -2
  584. package/dist/core/memory-engine/observation-store.d.ts.map +1 -1
  585. package/dist/core/memory-engine/observation-store.js +4 -5
  586. package/dist/core/memory-engine/observation-store.js.map +1 -1
  587. package/dist/core/memory-engine/refinements.d.ts +51 -0
  588. package/dist/core/memory-engine/refinements.d.ts.map +1 -0
  589. package/dist/core/memory-engine/refinements.js +99 -0
  590. package/dist/core/memory-engine/refinements.js.map +1 -0
  591. package/dist/core/memory-engine/tools.d.ts.map +1 -1
  592. package/dist/core/memory-engine/tools.js +27 -1
  593. package/dist/core/memory-engine/tools.js.map +1 -1
  594. package/dist/core/memory-engine/types.d.ts +2 -0
  595. package/dist/core/memory-engine/types.d.ts.map +1 -1
  596. package/dist/core/memory-engine/types.js.map +1 -1
  597. package/dist/core/model-resolver.d.ts.map +1 -1
  598. package/dist/core/model-resolver.js +7 -1
  599. package/dist/core/model-resolver.js.map +1 -1
  600. package/dist/core/muestreo-restringido.d.ts +49 -0
  601. package/dist/core/muestreo-restringido.d.ts.map +1 -0
  602. package/dist/core/muestreo-restringido.js +65 -0
  603. package/dist/core/muestreo-restringido.js.map +1 -0
  604. package/dist/core/orphan-process-journal.d.ts +48 -0
  605. package/dist/core/orphan-process-journal.d.ts.map +1 -0
  606. package/dist/core/orphan-process-journal.js +116 -0
  607. package/dist/core/orphan-process-journal.js.map +1 -0
  608. package/dist/core/privacidad/categorias-especiales.d.ts +186 -0
  609. package/dist/core/privacidad/categorias-especiales.d.ts.map +1 -0
  610. package/dist/core/privacidad/categorias-especiales.js +745 -0
  611. package/dist/core/privacidad/categorias-especiales.js.map +1 -0
  612. package/dist/core/privacidad/tapar.d.ts +48 -0
  613. package/dist/core/privacidad/tapar.d.ts.map +1 -0
  614. package/dist/core/privacidad/tapar.js +66 -0
  615. package/dist/core/privacidad/tapar.js.map +1 -0
  616. package/dist/core/prompt-cache/diagnostics.d.ts +33 -0
  617. package/dist/core/prompt-cache/diagnostics.d.ts.map +1 -0
  618. package/dist/core/prompt-cache/diagnostics.js +100 -0
  619. package/dist/core/prompt-cache/diagnostics.js.map +1 -0
  620. package/dist/core/prompt-cache/index.d.ts +33 -0
  621. package/dist/core/prompt-cache/index.d.ts.map +1 -0
  622. package/dist/core/prompt-cache/index.js +189 -0
  623. package/dist/core/prompt-cache/index.js.map +1 -0
  624. package/dist/core/prompt-cache/payload.d.ts +58 -0
  625. package/dist/core/prompt-cache/payload.d.ts.map +1 -0
  626. package/dist/core/prompt-cache/payload.js +122 -0
  627. package/dist/core/prompt-cache/payload.js.map +1 -0
  628. package/dist/core/prompt-cache/stabilize.d.ts +65 -0
  629. package/dist/core/prompt-cache/stabilize.d.ts.map +1 -0
  630. package/dist/core/prompt-cache/stabilize.js +137 -0
  631. package/dist/core/prompt-cache/stabilize.js.map +1 -0
  632. package/dist/core/prompt-cache/stats.d.ts +55 -0
  633. package/dist/core/prompt-cache/stats.d.ts.map +1 -0
  634. package/dist/core/prompt-cache/stats.js +158 -0
  635. package/dist/core/prompt-cache/stats.js.map +1 -0
  636. package/dist/core/prompt-eleccion.d.ts +38 -0
  637. package/dist/core/prompt-eleccion.d.ts.map +1 -0
  638. package/dist/core/prompt-eleccion.js +46 -0
  639. package/dist/core/prompt-eleccion.js.map +1 -0
  640. package/dist/core/prompts/montar.d.ts +75 -0
  641. package/dist/core/prompts/montar.d.ts.map +1 -0
  642. package/dist/core/prompts/montar.js +146 -0
  643. package/dist/core/prompts/montar.js.map +1 -0
  644. package/dist/core/prompts/plantilla.d.ts +54 -0
  645. package/dist/core/prompts/plantilla.d.ts.map +1 -0
  646. package/dist/core/prompts/plantilla.js +153 -0
  647. package/dist/core/prompts/plantilla.js.map +1 -0
  648. package/dist/core/prompts/sistema.md +134 -0
  649. package/dist/core/provider-attribution.d.ts +24 -2
  650. package/dist/core/provider-attribution.d.ts.map +1 -1
  651. package/dist/core/provider-attribution.js +24 -42
  652. package/dist/core/provider-attribution.js.map +1 -1
  653. package/dist/core/remoto/destino.d.ts +38 -0
  654. package/dist/core/remoto/destino.d.ts.map +1 -0
  655. package/dist/core/remoto/destino.js +105 -0
  656. package/dist/core/remoto/destino.js.map +1 -0
  657. package/dist/core/remoto/ejecutor.d.ts +59 -0
  658. package/dist/core/remoto/ejecutor.d.ts.map +1 -0
  659. package/dist/core/remoto/ejecutor.js +225 -0
  660. package/dist/core/remoto/ejecutor.js.map +1 -0
  661. package/dist/core/remoto/ficheros.d.ts +29 -0
  662. package/dist/core/remoto/ficheros.d.ts.map +1 -0
  663. package/dist/core/remoto/ficheros.js +90 -0
  664. package/dist/core/remoto/ficheros.js.map +1 -0
  665. package/dist/core/remoto/registro-extension.d.ts +15 -0
  666. package/dist/core/remoto/registro-extension.d.ts.map +1 -0
  667. package/dist/core/remoto/registro-extension.js +17 -0
  668. package/dist/core/remoto/registro-extension.js.map +1 -0
  669. package/dist/core/remoto/tools.d.ts +28 -0
  670. package/dist/core/remoto/tools.d.ts.map +1 -0
  671. package/dist/core/remoto/tools.js +31 -0
  672. package/dist/core/remoto/tools.js.map +1 -0
  673. package/dist/core/resource-loader.d.ts +8 -0
  674. package/dist/core/resource-loader.d.ts.map +1 -1
  675. package/dist/core/resource-loader.js +93 -1
  676. package/dist/core/resource-loader.js.map +1 -1
  677. package/dist/core/revision/hallazgo.d.ts +51 -0
  678. package/dist/core/revision/hallazgo.d.ts.map +1 -0
  679. package/dist/core/revision/hallazgo.js +73 -0
  680. package/dist/core/revision/hallazgo.js.map +1 -0
  681. package/dist/core/revision/revisor.d.ts +81 -0
  682. package/dist/core/revision/revisor.d.ts.map +1 -0
  683. package/dist/core/revision/revisor.js +132 -0
  684. package/dist/core/revision/revisor.js.map +1 -0
  685. package/dist/core/revision/sarif.d.ts +30 -0
  686. package/dist/core/revision/sarif.d.ts.map +1 -0
  687. package/dist/core/revision/sarif.js +83 -0
  688. package/dist/core/revision/sarif.js.map +1 -0
  689. package/dist/core/scheduler/scheduler.d.ts +87 -0
  690. package/dist/core/scheduler/scheduler.d.ts.map +1 -0
  691. package/dist/core/scheduler/scheduler.js +178 -0
  692. package/dist/core/scheduler/scheduler.js.map +1 -0
  693. package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts +49 -0
  694. package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts.map +1 -0
  695. package/dist/core/sesion/cerrar-llamadas-abiertas.js +77 -0
  696. package/dist/core/sesion/cerrar-llamadas-abiertas.js.map +1 -0
  697. package/dist/core/settings-manager.d.ts +110 -6
  698. package/dist/core/settings-manager.d.ts.map +1 -1
  699. package/dist/core/settings-manager.js +53 -2
  700. package/dist/core/settings-manager.js.map +1 -1
  701. package/dist/core/slash-commands.d.ts.map +1 -1
  702. package/dist/core/slash-commands.js +3 -3
  703. package/dist/core/slash-commands.js.map +1 -1
  704. package/dist/core/system-prompt.d.ts +17 -0
  705. package/dist/core/system-prompt.d.ts.map +1 -1
  706. package/dist/core/system-prompt.js +13 -5
  707. package/dist/core/system-prompt.js.map +1 -1
  708. package/dist/core/telemetria/otlp.d.ts +122 -0
  709. package/dist/core/telemetria/otlp.d.ts.map +1 -0
  710. package/dist/core/telemetria/otlp.js +373 -0
  711. package/dist/core/telemetria/otlp.js.map +1 -0
  712. package/dist/core/tools/coercion-argumentos.d.ts +48 -0
  713. package/dist/core/tools/coercion-argumentos.d.ts.map +1 -0
  714. package/dist/core/tools/coercion-argumentos.js +99 -0
  715. package/dist/core/tools/coercion-argumentos.js.map +1 -0
  716. package/dist/core/tools/edit-diff.d.ts +0 -7
  717. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  718. package/dist/core/tools/edit-diff.js +232 -7
  719. package/dist/core/tools/edit-diff.js.map +1 -1
  720. package/dist/core/tools/edit.d.ts.map +1 -1
  721. package/dist/core/tools/edit.js +8 -1
  722. package/dist/core/tools/edit.js.map +1 -1
  723. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  724. package/dist/core/tools/file-mutation-queue.js +5 -0
  725. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  726. package/dist/core/tools/json-tolerante.d.ts +30 -0
  727. package/dist/core/tools/json-tolerante.d.ts.map +1 -0
  728. package/dist/core/tools/json-tolerante.js +70 -0
  729. package/dist/core/tools/json-tolerante.js.map +1 -0
  730. package/dist/core/tools/read.d.ts.map +1 -1
  731. package/dist/core/tools/read.js +17 -0
  732. package/dist/core/tools/read.js.map +1 -1
  733. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -1
  734. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  735. package/dist/core/tools/tool-definition-wrapper.js +17 -1
  736. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  737. package/dist/core/turno-vacio/detectar.d.ts +38 -0
  738. package/dist/core/turno-vacio/detectar.d.ts.map +1 -0
  739. package/dist/core/turno-vacio/detectar.js +66 -0
  740. package/dist/core/turno-vacio/detectar.js.map +1 -0
  741. package/dist/core/undo/journal.d.ts +57 -0
  742. package/dist/core/undo/journal.d.ts.map +1 -0
  743. package/dist/core/undo/journal.js +178 -0
  744. package/dist/core/undo/journal.js.map +1 -0
  745. package/dist/core/urls-internas/auditoria.d.ts +10 -0
  746. package/dist/core/urls-internas/auditoria.d.ts.map +1 -0
  747. package/dist/core/urls-internas/auditoria.js +42 -0
  748. package/dist/core/urls-internas/auditoria.js.map +1 -0
  749. package/dist/core/urls-internas/boveda.d.ts +13 -0
  750. package/dist/core/urls-internas/boveda.d.ts.map +1 -0
  751. package/dist/core/urls-internas/boveda.js +40 -0
  752. package/dist/core/urls-internas/boveda.js.map +1 -0
  753. package/dist/core/urls-internas/lector.d.ts +30 -0
  754. package/dist/core/urls-internas/lector.d.ts.map +1 -0
  755. package/dist/core/urls-internas/lector.js +56 -0
  756. package/dist/core/urls-internas/lector.js.map +1 -0
  757. package/dist/core/urls-internas/memoria.d.ts +11 -0
  758. package/dist/core/urls-internas/memoria.d.ts.map +1 -0
  759. package/dist/core/urls-internas/memoria.js +25 -0
  760. package/dist/core/urls-internas/memoria.js.map +1 -0
  761. package/dist/core/urls-internas/parse.d.ts +28 -0
  762. package/dist/core/urls-internas/parse.d.ts.map +1 -0
  763. package/dist/core/urls-internas/parse.js +32 -0
  764. package/dist/core/urls-internas/parse.js.map +1 -0
  765. package/dist/core/urls-internas/reglas.d.ts +10 -0
  766. package/dist/core/urls-internas/reglas.d.ts.map +1 -0
  767. package/dist/core/urls-internas/reglas.js +31 -0
  768. package/dist/core/urls-internas/reglas.js.map +1 -0
  769. package/dist/core/usage/aggregate.d.ts +68 -0
  770. package/dist/core/usage/aggregate.d.ts.map +1 -0
  771. package/dist/core/usage/aggregate.js +93 -0
  772. package/dist/core/usage/aggregate.js.map +1 -0
  773. package/dist/core/usage/cuota/anthropic.d.ts +10 -0
  774. package/dist/core/usage/cuota/anthropic.d.ts.map +1 -0
  775. package/dist/core/usage/cuota/anthropic.js +63 -0
  776. package/dist/core/usage/cuota/anthropic.js.map +1 -0
  777. package/dist/core/usage/cuota/cache.d.ts +20 -0
  778. package/dist/core/usage/cuota/cache.d.ts.map +1 -0
  779. package/dist/core/usage/cuota/cache.js +36 -0
  780. package/dist/core/usage/cuota/cache.js.map +1 -0
  781. package/dist/core/usage/cuota/github-copilot.d.ts +9 -0
  782. package/dist/core/usage/cuota/github-copilot.d.ts.map +1 -0
  783. package/dist/core/usage/cuota/github-copilot.js +67 -0
  784. package/dist/core/usage/cuota/github-copilot.js.map +1 -0
  785. package/dist/core/usage/cuota/google-gemini.d.ts +9 -0
  786. package/dist/core/usage/cuota/google-gemini.d.ts.map +1 -0
  787. package/dist/core/usage/cuota/google-gemini.js +72 -0
  788. package/dist/core/usage/cuota/google-gemini.js.map +1 -0
  789. package/dist/core/usage/cuota/index.d.ts +25 -0
  790. package/dist/core/usage/cuota/index.d.ts.map +1 -0
  791. package/dist/core/usage/cuota/index.js +50 -0
  792. package/dist/core/usage/cuota/index.js.map +1 -0
  793. package/dist/core/usage/cuota/openai-codex.d.ts +9 -0
  794. package/dist/core/usage/cuota/openai-codex.d.ts.map +1 -0
  795. package/dist/core/usage/cuota/openai-codex.js +59 -0
  796. package/dist/core/usage/cuota/openai-codex.js.map +1 -0
  797. package/dist/core/usage/cuota/openrouter.d.ts +10 -0
  798. package/dist/core/usage/cuota/openrouter.d.ts.map +1 -0
  799. package/dist/core/usage/cuota/openrouter.js +47 -0
  800. package/dist/core/usage/cuota/openrouter.js.map +1 -0
  801. package/dist/core/usage/cuota/tipos.d.ts +50 -0
  802. package/dist/core/usage/cuota/tipos.d.ts.map +1 -0
  803. package/dist/core/usage/cuota/tipos.js +25 -0
  804. package/dist/core/usage/cuota/tipos.js.map +1 -0
  805. package/dist/core/web/busqueda-nativa.d.ts +82 -0
  806. package/dist/core/web/busqueda-nativa.d.ts.map +1 -0
  807. package/dist/core/web/busqueda-nativa.js +163 -0
  808. package/dist/core/web/busqueda-nativa.js.map +1 -0
  809. package/dist/core/web/destino.d.ts +58 -0
  810. package/dist/core/web/destino.d.ts.map +1 -0
  811. package/dist/core/web/destino.js +127 -0
  812. package/dist/core/web/destino.js.map +1 -0
  813. package/dist/core/web/proveedores/brave.d.ts +6 -0
  814. package/dist/core/web/proveedores/brave.d.ts.map +1 -0
  815. package/dist/core/web/proveedores/brave.js +20 -0
  816. package/dist/core/web/proveedores/brave.js.map +1 -0
  817. package/dist/core/web/proveedores/claves.d.ts +19 -0
  818. package/dist/core/web/proveedores/claves.d.ts.map +1 -0
  819. package/dist/core/web/proveedores/claves.js +36 -0
  820. package/dist/core/web/proveedores/claves.js.map +1 -0
  821. package/dist/core/web/proveedores/duckduckgo.d.ts +3 -0
  822. package/dist/core/web/proveedores/duckduckgo.d.ts.map +1 -0
  823. package/dist/core/web/proveedores/duckduckgo.js +109 -0
  824. package/dist/core/web/proveedores/duckduckgo.js.map +1 -0
  825. package/dist/core/web/proveedores/ecosia.d.ts +3 -0
  826. package/dist/core/web/proveedores/ecosia.d.ts.map +1 -0
  827. package/dist/core/web/proveedores/ecosia.js +72 -0
  828. package/dist/core/web/proveedores/ecosia.js.map +1 -0
  829. package/dist/core/web/proveedores/exa.d.ts +6 -0
  830. package/dist/core/web/proveedores/exa.d.ts.map +1 -0
  831. package/dist/core/web/proveedores/exa.js +24 -0
  832. package/dist/core/web/proveedores/exa.js.map +1 -0
  833. package/dist/core/web/proveedores/mojeek.d.ts +3 -0
  834. package/dist/core/web/proveedores/mojeek.d.ts.map +1 -0
  835. package/dist/core/web/proveedores/mojeek.js +65 -0
  836. package/dist/core/web/proveedores/mojeek.js.map +1 -0
  837. package/dist/core/web/proveedores/navegador.d.ts +10 -0
  838. package/dist/core/web/proveedores/navegador.d.ts.map +1 -0
  839. package/dist/core/web/proveedores/navegador.js +13 -0
  840. package/dist/core/web/proveedores/navegador.js.map +1 -0
  841. package/dist/core/web/proveedores/registro.d.ts +43 -0
  842. package/dist/core/web/proveedores/registro.d.ts.map +1 -0
  843. package/dist/core/web/proveedores/registro.js +49 -0
  844. package/dist/core/web/proveedores/registro.js.map +1 -0
  845. package/dist/core/web/proveedores/searxng.d.ts +9 -0
  846. package/dist/core/web/proveedores/searxng.d.ts.map +1 -0
  847. package/dist/core/web/proveedores/searxng.js +17 -0
  848. package/dist/core/web/proveedores/searxng.js.map +1 -0
  849. package/dist/core/web/proveedores/serper.d.ts +9 -0
  850. package/dist/core/web/proveedores/serper.d.ts.map +1 -0
  851. package/dist/core/web/proveedores/serper.js +19 -0
  852. package/dist/core/web/proveedores/serper.js.map +1 -0
  853. package/dist/core/web/proveedores/tavily.d.ts +6 -0
  854. package/dist/core/web/proveedores/tavily.d.ts.map +1 -0
  855. package/dist/core/web/proveedores/tavily.js +19 -0
  856. package/dist/core/web/proveedores/tavily.js.map +1 -0
  857. package/dist/core/web/proveedores/tipos.d.ts +36 -0
  858. package/dist/core/web/proveedores/tipos.d.ts.map +1 -0
  859. package/dist/core/web/proveedores/tipos.js +10 -0
  860. package/dist/core/web/proveedores/tipos.js.map +1 -0
  861. package/dist/core/web/registro-red.d.ts +43 -0
  862. package/dist/core/web/registro-red.d.ts.map +1 -0
  863. package/dist/core/web/registro-red.js +86 -0
  864. package/dist/core/web/registro-red.js.map +1 -0
  865. package/dist/core/web/scrapers/cisa-kev.d.ts +10 -0
  866. package/dist/core/web/scrapers/cisa-kev.d.ts.map +1 -0
  867. package/dist/core/web/scrapers/cisa-kev.js +38 -0
  868. package/dist/core/web/scrapers/cisa-kev.js.map +1 -0
  869. package/dist/core/web/scrapers/crates-io.d.ts +11 -0
  870. package/dist/core/web/scrapers/crates-io.d.ts.map +1 -0
  871. package/dist/core/web/scrapers/crates-io.js +29 -0
  872. package/dist/core/web/scrapers/crates-io.js.map +1 -0
  873. package/dist/core/web/scrapers/docs-rs.d.ts +10 -0
  874. package/dist/core/web/scrapers/docs-rs.d.ts.map +1 -0
  875. package/dist/core/web/scrapers/docs-rs.js +35 -0
  876. package/dist/core/web/scrapers/docs-rs.js.map +1 -0
  877. package/dist/core/web/scrapers/github.d.ts +3 -0
  878. package/dist/core/web/scrapers/github.d.ts.map +1 -0
  879. package/dist/core/web/scrapers/github.js +72 -0
  880. package/dist/core/web/scrapers/github.js.map +1 -0
  881. package/dist/core/web/scrapers/go-pkg.d.ts +7 -0
  882. package/dist/core/web/scrapers/go-pkg.d.ts.map +1 -0
  883. package/dist/core/web/scrapers/go-pkg.js +30 -0
  884. package/dist/core/web/scrapers/go-pkg.js.map +1 -0
  885. package/dist/core/web/scrapers/hex.d.ts +6 -0
  886. package/dist/core/web/scrapers/hex.d.ts.map +1 -0
  887. package/dist/core/web/scrapers/hex.js +27 -0
  888. package/dist/core/web/scrapers/hex.js.map +1 -0
  889. package/dist/core/web/scrapers/maven.d.ts +8 -0
  890. package/dist/core/web/scrapers/maven.d.ts.map +1 -0
  891. package/dist/core/web/scrapers/maven.js +41 -0
  892. package/dist/core/web/scrapers/maven.js.map +1 -0
  893. package/dist/core/web/scrapers/mdn.d.ts +6 -0
  894. package/dist/core/web/scrapers/mdn.d.ts.map +1 -0
  895. package/dist/core/web/scrapers/mdn.js +28 -0
  896. package/dist/core/web/scrapers/mdn.js.map +1 -0
  897. package/dist/core/web/scrapers/npm.d.ts +11 -0
  898. package/dist/core/web/scrapers/npm.d.ts.map +1 -0
  899. package/dist/core/web/scrapers/npm.js +57 -0
  900. package/dist/core/web/scrapers/npm.js.map +1 -0
  901. package/dist/core/web/scrapers/nuget.d.ts +8 -0
  902. package/dist/core/web/scrapers/nuget.d.ts.map +1 -0
  903. package/dist/core/web/scrapers/nuget.js +22 -0
  904. package/dist/core/web/scrapers/nuget.js.map +1 -0
  905. package/dist/core/web/scrapers/nvd.d.ts +7 -0
  906. package/dist/core/web/scrapers/nvd.d.ts.map +1 -0
  907. package/dist/core/web/scrapers/nvd.js +37 -0
  908. package/dist/core/web/scrapers/nvd.js.map +1 -0
  909. package/dist/core/web/scrapers/pypi.d.ts +6 -0
  910. package/dist/core/web/scrapers/pypi.d.ts.map +1 -0
  911. package/dist/core/web/scrapers/pypi.js +31 -0
  912. package/dist/core/web/scrapers/pypi.js.map +1 -0
  913. package/dist/core/web/scrapers/registro.d.ts +13 -0
  914. package/dist/core/web/scrapers/registro.d.ts.map +1 -0
  915. package/dist/core/web/scrapers/registro.js +65 -0
  916. package/dist/core/web/scrapers/registro.js.map +1 -0
  917. package/dist/core/web/scrapers/rubygems.d.ts +6 -0
  918. package/dist/core/web/scrapers/rubygems.d.ts.map +1 -0
  919. package/dist/core/web/scrapers/rubygems.js +23 -0
  920. package/dist/core/web/scrapers/rubygems.js.map +1 -0
  921. package/dist/core/web/scrapers/stackoverflow.d.ts +3 -0
  922. package/dist/core/web/scrapers/stackoverflow.d.ts.map +1 -0
  923. package/dist/core/web/scrapers/stackoverflow.js +46 -0
  924. package/dist/core/web/scrapers/stackoverflow.js.map +1 -0
  925. package/dist/core/web/scrapers/tipos.d.ts +42 -0
  926. package/dist/core/web/scrapers/tipos.d.ts.map +1 -0
  927. package/dist/core/web/scrapers/tipos.js +23 -0
  928. package/dist/core/web/scrapers/tipos.js.map +1 -0
  929. package/dist/core/web/texto.d.ts +10 -0
  930. package/dist/core/web/texto.d.ts.map +1 -0
  931. package/dist/core/web/texto.js +26 -0
  932. package/dist/core/web/texto.js.map +1 -0
  933. package/dist/core/web/tools.d.ts +91 -0
  934. package/dist/core/web/tools.d.ts.map +1 -0
  935. package/dist/core/web/tools.js +304 -0
  936. package/dist/core/web/tools.js.map +1 -0
  937. package/dist/core/wiki/almacen.d.ts +33 -0
  938. package/dist/core/wiki/almacen.d.ts.map +1 -0
  939. package/dist/core/wiki/almacen.js +93 -0
  940. package/dist/core/wiki/almacen.js.map +1 -0
  941. package/dist/core/wiki/citas.d.ts +111 -0
  942. package/dist/core/wiki/citas.d.ts.map +1 -0
  943. package/dist/core/wiki/citas.js +146 -0
  944. package/dist/core/wiki/citas.js.map +1 -0
  945. package/dist/core/workflows/agent-runner.d.ts +2 -0
  946. package/dist/core/workflows/agent-runner.d.ts.map +1 -1
  947. package/dist/core/workflows/agent-runner.js +131 -44
  948. package/dist/core/workflows/agent-runner.js.map +1 -1
  949. package/dist/core/workflows/builtins.d.ts.map +1 -1
  950. package/dist/core/workflows/builtins.js +1 -0
  951. package/dist/core/workflows/builtins.js.map +1 -1
  952. package/dist/core/workflows/contrato/esquema.d.ts +32 -0
  953. package/dist/core/workflows/contrato/esquema.d.ts.map +1 -0
  954. package/dist/core/workflows/contrato/esquema.js +25 -0
  955. package/dist/core/workflows/contrato/esquema.js.map +1 -0
  956. package/dist/core/workflows/contrato/reparar-argumentos.d.ts +69 -0
  957. package/dist/core/workflows/contrato/reparar-argumentos.d.ts.map +1 -0
  958. package/dist/core/workflows/contrato/reparar-argumentos.js +117 -0
  959. package/dist/core/workflows/contrato/reparar-argumentos.js.map +1 -0
  960. package/dist/core/workflows/contrato/validador.d.ts +30 -0
  961. package/dist/core/workflows/contrato/validador.d.ts.map +1 -0
  962. package/dist/core/workflows/contrato/validador.js +56 -0
  963. package/dist/core/workflows/contrato/validador.js.map +1 -0
  964. package/dist/core/workflows/contrato/yield.d.ts +65 -0
  965. package/dist/core/workflows/contrato/yield.d.ts.map +1 -0
  966. package/dist/core/workflows/contrato/yield.js +80 -0
  967. package/dist/core/workflows/contrato/yield.js.map +1 -0
  968. package/dist/core/workflows/goal-engine/engine.d.ts +17 -0
  969. package/dist/core/workflows/goal-engine/engine.d.ts.map +1 -1
  970. package/dist/core/workflows/goal-engine/engine.js +41 -0
  971. package/dist/core/workflows/goal-engine/engine.js.map +1 -1
  972. package/dist/core/workflows/index.d.ts +8 -0
  973. package/dist/core/workflows/index.d.ts.map +1 -1
  974. package/dist/core/workflows/index.js +4 -0
  975. package/dist/core/workflows/index.js.map +1 -1
  976. package/dist/core/workflows/manager.d.ts +10 -0
  977. package/dist/core/workflows/manager.d.ts.map +1 -1
  978. package/dist/core/workflows/manager.js +35 -11
  979. package/dist/core/workflows/manager.js.map +1 -1
  980. package/dist/core/workflows/runtime.d.ts +13 -0
  981. package/dist/core/workflows/runtime.d.ts.map +1 -1
  982. package/dist/core/workflows/runtime.js +80 -1
  983. package/dist/core/workflows/runtime.js.map +1 -1
  984. package/dist/core/workflows/save-as-skill.d.ts +27 -0
  985. package/dist/core/workflows/save-as-skill.d.ts.map +1 -0
  986. package/dist/core/workflows/save-as-skill.js +54 -0
  987. package/dist/core/workflows/save-as-skill.js.map +1 -0
  988. package/dist/core/workflows/types.d.ts +49 -0
  989. package/dist/core/workflows/types.d.ts.map +1 -1
  990. package/dist/core/workflows/types.js.map +1 -1
  991. package/dist/extensions/remoto/index.d.ts +22 -0
  992. package/dist/extensions/remoto/index.d.ts.map +1 -0
  993. package/dist/extensions/remoto/index.js +54 -0
  994. package/dist/extensions/remoto/index.js.map +1 -0
  995. package/dist/index.d.ts +1 -17
  996. package/dist/index.d.ts.map +1 -1
  997. package/dist/index.js +7 -16
  998. package/dist/index.js.map +1 -1
  999. package/dist/main.d.ts.map +1 -1
  1000. package/dist/main.js +6 -0
  1001. package/dist/main.js.map +1 -1
  1002. package/dist/modes/acp/acp-mode.d.ts +42 -0
  1003. package/dist/modes/acp/acp-mode.d.ts.map +1 -0
  1004. package/dist/modes/acp/acp-mode.js +190 -0
  1005. package/dist/modes/acp/acp-mode.js.map +1 -0
  1006. package/dist/modes/acp/events.d.ts +74 -0
  1007. package/dist/modes/acp/events.d.ts.map +1 -0
  1008. package/dist/modes/acp/events.js +116 -0
  1009. package/dist/modes/acp/events.js.map +1 -0
  1010. package/dist/modes/interactive/components/model-selector.d.ts +8 -1
  1011. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  1012. package/dist/modes/interactive/components/model-selector.js +41 -7
  1013. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  1014. package/dist/modes/interactive/components/settings-selector.d.ts +1 -2
  1015. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  1016. package/dist/modes/interactive/components/settings-selector.js +9 -86
  1017. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  1018. package/dist/modes/interactive/components/thinking-selector.d.ts +8 -1
  1019. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  1020. package/dist/modes/interactive/components/thinking-selector.js +48 -17
  1021. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  1022. package/dist/modes/interactive/interactive-mode.d.ts +3 -7
  1023. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  1024. package/dist/modes/interactive/interactive-mode.js +137 -146
  1025. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  1026. package/dist/modes/print-mode.d.ts.map +1 -1
  1027. package/dist/modes/print-mode.js +11 -0
  1028. package/dist/modes/print-mode.js.map +1 -1
  1029. package/dist/package-manager-cli.d.ts.map +1 -1
  1030. package/dist/package-manager-cli.js +27 -5
  1031. package/dist/package-manager-cli.js.map +1 -1
  1032. package/dist/server/attach.d.ts +56 -0
  1033. package/dist/server/attach.d.ts.map +1 -0
  1034. package/dist/server/attach.js +130 -0
  1035. package/dist/server/attach.js.map +1 -0
  1036. package/dist/server/extension-ops.d.ts +40 -0
  1037. package/dist/server/extension-ops.d.ts.map +1 -0
  1038. package/dist/server/extension-ops.js +146 -0
  1039. package/dist/server/extension-ops.js.map +1 -0
  1040. package/dist/server/pi-server-service.d.ts +85 -0
  1041. package/dist/server/pi-server-service.d.ts.map +1 -0
  1042. package/dist/server/pi-server-service.js +213 -0
  1043. package/dist/server/pi-server-service.js.map +1 -0
  1044. package/dist/server/scheduler-tick.d.ts +32 -0
  1045. package/dist/server/scheduler-tick.d.ts.map +1 -0
  1046. package/dist/server/scheduler-tick.js +47 -0
  1047. package/dist/server/scheduler-tick.js.map +1 -0
  1048. package/dist/server/serve.d.ts +25 -0
  1049. package/dist/server/serve.d.ts.map +1 -0
  1050. package/dist/server/serve.js +83 -0
  1051. package/dist/server/serve.js.map +1 -0
  1052. package/dist/server/transcript.d.ts +38 -0
  1053. package/dist/server/transcript.d.ts.map +1 -0
  1054. package/dist/server/transcript.js +176 -0
  1055. package/dist/server/transcript.js.map +1 -0
  1056. package/dist/skills/skill-creator/SKILL.md +90 -0
  1057. package/dist/telegram/api.d.ts +75 -0
  1058. package/dist/telegram/api.d.ts.map +1 -0
  1059. package/dist/telegram/api.js +104 -0
  1060. package/dist/telegram/api.js.map +1 -0
  1061. package/dist/telegram/bridge.d.ts +85 -0
  1062. package/dist/telegram/bridge.d.ts.map +1 -0
  1063. package/dist/telegram/bridge.js +182 -0
  1064. package/dist/telegram/bridge.js.map +1 -0
  1065. package/dist/telegram/journal.d.ts +67 -0
  1066. package/dist/telegram/journal.d.ts.map +1 -0
  1067. package/dist/telegram/journal.js +119 -0
  1068. package/dist/telegram/journal.js.map +1 -0
  1069. package/dist/telegram/servidor.d.ts +15 -0
  1070. package/dist/telegram/servidor.d.ts.map +1 -0
  1071. package/dist/telegram/servidor.js +74 -0
  1072. package/dist/telegram/servidor.js.map +1 -0
  1073. package/dist/utils/shell.d.ts +11 -0
  1074. package/dist/utils/shell.d.ts.map +1 -1
  1075. package/dist/utils/shell.js +11 -0
  1076. package/dist/utils/shell.js.map +1 -1
  1077. package/dist/utils/version-check.d.ts.map +1 -1
  1078. package/dist/utils/version-check.js +29 -1
  1079. package/dist/utils/version-check.js.map +1 -1
  1080. package/docs/compaction.md +10 -10
  1081. package/docs/compliance.md +241 -0
  1082. package/docs/containerization.md +24 -24
  1083. package/docs/custom-provider.md +10 -10
  1084. package/docs/development.md +47 -10
  1085. package/docs/docs.json +14 -2
  1086. package/docs/environment-variables.md +20 -17
  1087. package/docs/extensions.md +51 -49
  1088. package/docs/index.md +15 -21
  1089. package/docs/json.md +3 -3
  1090. package/docs/keybindings.md +5 -5
  1091. package/docs/llama-cpp.md +7 -7
  1092. package/docs/models.md +12 -12
  1093. package/docs/packages.md +45 -45
  1094. package/docs/prompt-templates.md +5 -5
  1095. package/docs/providers.md +12 -12
  1096. package/docs/quickstart.md +39 -39
  1097. package/docs/rpc.md +12 -12
  1098. package/docs/sdk.md +38 -38
  1099. package/docs/security.md +26 -21
  1100. package/docs/session-format.md +7 -7
  1101. package/docs/sessions.md +14 -14
  1102. package/docs/settings.md +45 -20
  1103. package/docs/shell-aliases.md +2 -2
  1104. package/docs/skills.md +11 -11
  1105. package/docs/terminal-setup.md +14 -14
  1106. package/docs/termux.md +7 -7
  1107. package/docs/themes.md +11 -11
  1108. package/docs/tmux.md +4 -4
  1109. package/docs/tui.md +3 -3
  1110. package/docs/usage.md +54 -54
  1111. package/docs/windows.md +2 -2
  1112. package/examples/sdk/12-full-control.ts +9 -0
  1113. package/npm-shrinkwrap.json +35 -251
  1114. package/package.json +10 -4
@@ -0,0 +1,176 @@
1
+ /**
2
+ * El navegador del agente.
3
+ *
4
+ * Arranca Chrome con un **perfil propio y vacío** (`--user-data-dir` dentro de
5
+ * `<agentDir>/browser`). Eso no es un detalle de limpieza: convierte la regla
6
+ * de "solo se conducen las pestañas del agente" en algo estructural en vez de
7
+ * una promesa. En ese perfil no hay cookies, ni sesiones iniciadas, ni el
8
+ * correo del usuario — aunque el agente se equivoque, no hay nada que filtrar.
9
+ *
10
+ * El precio es que no puede usar sitios donde el usuario ya está identificado.
11
+ * Es el precio correcto: la alternativa es un agente con acceso al banco.
12
+ */
13
+ import { spawn } from "node:child_process";
14
+ import { existsSync, mkdirSync } from "node:fs";
15
+ import { join } from "node:path";
16
+ import { ClienteCdp } from "./cdp.js";
17
+ import { exigirPestañaPropia } from "./politica.js";
18
+ const CANDIDATOS_CHROME = [
19
+ "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
20
+ "/Applications/Chromium.app/Contents/MacOS/Chromium",
21
+ "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge",
22
+ "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",
23
+ "/usr/bin/google-chrome",
24
+ "/usr/bin/chromium",
25
+ "/usr/bin/chromium-browser",
26
+ "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
27
+ "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
28
+ ];
29
+ export function buscarNavegador(candidatos = CANDIDATOS_CHROME) {
30
+ return candidatos.find((ruta) => existsSync(ruta)) ?? null;
31
+ }
32
+ export class NavegadorAgente {
33
+ proceso = null;
34
+ cliente = null;
35
+ pestañas = new Map();
36
+ sesionesPorTarget = new Map();
37
+ // Campo normal y no propiedad de constructor: el repo compila con
38
+ // `erasableSyntaxOnly`, que prohíbe la forma corta.
39
+ viewport;
40
+ constructor(proceso, cliente, viewport) {
41
+ this.proceso = proceso;
42
+ this.cliente = cliente;
43
+ this.viewport = viewport;
44
+ }
45
+ static async abrir(opciones) {
46
+ const ejecutable = opciones.ejecutable ?? buscarNavegador();
47
+ if (!ejecutable) {
48
+ throw new Error("No se encontró Chrome, Chromium, Edge ni Brave. Instala uno o pasa la ruta en la configuración.");
49
+ }
50
+ const perfil = join(opciones.agentDir, "browser", "perfil");
51
+ mkdirSync(perfil, { recursive: true, mode: 0o700 });
52
+ const viewport = opciones.viewport ?? { width: 1280, height: 800 };
53
+ const puerto = opciones.puerto ?? 0;
54
+ const proceso = spawn(ejecutable, [
55
+ `--remote-debugging-port=${puerto}`,
56
+ // Perfil propio y vacío: ver la cabecera del fichero.
57
+ `--user-data-dir=${perfil}`,
58
+ "--no-first-run",
59
+ "--no-default-browser-check",
60
+ // Sin esto, Chrome puede reutilizar una instancia ya abierta del
61
+ // usuario y acabaríamos conduciendo SU navegador.
62
+ "--disable-features=ChromeWhatsNewUI",
63
+ `--window-size=${viewport.width},${viewport.height}`,
64
+ ...(opciones.headless ? ["--headless=new"] : []),
65
+ "about:blank",
66
+ ], { stdio: ["ignore", "ignore", "pipe"] });
67
+ const urlWs = await leerUrlDevTools(proceso);
68
+ const cliente = await ClienteCdp.conectar(urlWs);
69
+ return new NavegadorAgente(proceso, cliente, viewport);
70
+ }
71
+ exigirCliente() {
72
+ if (!this.cliente)
73
+ throw new Error("el navegador está cerrado");
74
+ return this.cliente;
75
+ }
76
+ /** Abre una pestaña NUEVA. Es la única forma de que el agente tenga una. */
77
+ async abrirPestaña(url) {
78
+ const cliente = this.exigirCliente();
79
+ const { targetId } = await cliente.enviar("Target.createTarget", { url });
80
+ const { sessionId } = await cliente.enviar("Target.attachToTarget", {
81
+ targetId,
82
+ flatten: true,
83
+ });
84
+ this.sesionesPorTarget.set(targetId, sessionId);
85
+ const pestaña = { targetId, url, propia: true };
86
+ this.pestañas.set(targetId, pestaña);
87
+ await cliente.enviar("Page.enable", {}, sessionId);
88
+ await cliente.enviar("Runtime.enable", {}, sessionId);
89
+ return pestaña;
90
+ }
91
+ sesionDe(targetId) {
92
+ exigirPestañaPropia(this.pestañas, targetId);
93
+ const sessionId = this.sesionesPorTarget.get(targetId);
94
+ if (!sessionId)
95
+ throw new Error(`la pestaña ${targetId} no está conectada`);
96
+ return sessionId;
97
+ }
98
+ async navegar(targetId, url) {
99
+ const sessionId = this.sesionDe(targetId);
100
+ await this.exigirCliente().enviar("Page.navigate", { url }, sessionId);
101
+ const pestaña = this.pestañas.get(targetId);
102
+ if (pestaña)
103
+ pestaña.url = url;
104
+ }
105
+ /** Evalúa JavaScript en la pestaña y devuelve el valor serializado. */
106
+ async evaluar(targetId, expresion) {
107
+ const sessionId = this.sesionDe(targetId);
108
+ const respuesta = await this.exigirCliente().enviar("Runtime.evaluate", { expression: expresion, returnByValue: true, awaitPromise: true }, sessionId);
109
+ if (respuesta.exceptionDetails) {
110
+ throw new Error(respuesta.exceptionDetails.exception?.description ??
111
+ respuesta.exceptionDetails.text ??
112
+ "error en la página");
113
+ }
114
+ return respuesta.result?.value;
115
+ }
116
+ async capturar(targetId) {
117
+ const sessionId = this.sesionDe(targetId);
118
+ const { data } = await this.exigirCliente().enviar("Page.captureScreenshot", { format: "png" }, sessionId);
119
+ return data;
120
+ }
121
+ async cambiarViewport(targetId, width, height, movil = false) {
122
+ const sessionId = this.sesionDe(targetId);
123
+ await this.exigirCliente().enviar("Emulation.setDeviceMetricsOverride", { width, height, deviceScaleFactor: 1, mobile: movil }, sessionId);
124
+ this.viewport = { width, height };
125
+ }
126
+ get viewportActual() {
127
+ return { ...this.viewport };
128
+ }
129
+ async cerrarPestaña(targetId) {
130
+ this.sesionDe(targetId);
131
+ await this.exigirCliente().enviar("Target.closeTarget", { targetId });
132
+ this.pestañas.delete(targetId);
133
+ this.sesionesPorTarget.delete(targetId);
134
+ }
135
+ listarPestañas() {
136
+ return [...this.pestañas.values()];
137
+ }
138
+ cerrar() {
139
+ this.cliente?.cerrar();
140
+ this.cliente = null;
141
+ this.proceso?.kill();
142
+ this.proceso = null;
143
+ this.pestañas.clear();
144
+ this.sesionesPorTarget.clear();
145
+ }
146
+ }
147
+ /**
148
+ * Lee la URL de DevTools que Chrome escribe en stderr al arrancar.
149
+ *
150
+ * Se lee del proceso en vez de sondear `http://localhost:<puerto>/json/version`
151
+ * porque con `--remote-debugging-port=0` el puerto lo elige el sistema y no lo
152
+ * sabemos de antemano. Sondear un puerto fijo, además, podría acertar con una
153
+ * instancia de Chrome que ya tuviera el usuario abierta — y acabaríamos
154
+ * conduciendo su navegador con sus sesiones.
155
+ */
156
+ function leerUrlDevTools(proceso, timeoutMs = 15_000) {
157
+ return new Promise((resolve, reject) => {
158
+ let acumulado = "";
159
+ const temporizador = setTimeout(() => {
160
+ reject(new Error(`el navegador no anunció su puerto de depuración en ${timeoutMs} ms`));
161
+ }, timeoutMs);
162
+ const terminar = (fn) => {
163
+ clearTimeout(temporizador);
164
+ fn();
165
+ };
166
+ proceso.stderr?.on("data", (trozo) => {
167
+ acumulado += trozo.toString("utf8");
168
+ const encontrado = acumulado.match(/ws:\/\/[^\s]+/);
169
+ if (encontrado)
170
+ terminar(() => resolve(encontrado[0]));
171
+ });
172
+ proceso.on("error", (error) => terminar(() => reject(error)));
173
+ proceso.on("exit", (codigo) => terminar(() => reject(new Error(`el navegador se cerró con código ${codigo} antes de arrancar`))));
174
+ });
175
+ }
176
+ //# sourceMappingURL=sesion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sesion.js","sourceRoot":"","sources":["../../../src/core/browser/sesion.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * El navegador del agente.\n *\n * Arranca Chrome con un **perfil propio y vacío** (`--user-data-dir` dentro de\n * `<agentDir>/browser`). Eso no es un detalle de limpieza: convierte la regla\n * de \"solo se conducen las pestañas del agente\" en algo estructural en vez de\n * una promesa. En ese perfil no hay cookies, ni sesiones iniciadas, ni el\n * correo del usuario — aunque el agente se equivoque, no hay nada que filtrar.\n *\n * El precio es que no puede usar sitios donde el usuario ya está identificado.\n * Es el precio correcto: la alternativa es un agente con acceso al banco.\n */\n\nimport { type ChildProcess, spawn } from \"node:child_process\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { ClienteCdp } from \"./cdp.ts\";\nimport { exigirPestañaPropia, type Pestaña } from \"./politica.ts\";\n\nconst CANDIDATOS_CHROME = [\n\t\"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n\t\"/Applications/Chromium.app/Contents/MacOS/Chromium\",\n\t\"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge\",\n\t\"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser\",\n\t\"/usr/bin/google-chrome\",\n\t\"/usr/bin/chromium\",\n\t\"/usr/bin/chromium-browser\",\n\t\"C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe\",\n\t\"C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe\",\n];\n\nexport function buscarNavegador(candidatos: string[] = CANDIDATOS_CHROME): string | null {\n\treturn candidatos.find((ruta) => existsSync(ruta)) ?? null;\n}\n\nexport interface OpcionesNavegador {\n\tagentDir: string;\n\t/** 0 = que el sistema elija uno libre, que es lo que queremos. */\n\tpuerto?: number;\n\theadless?: boolean;\n\tejecutable?: string;\n\t/** Ancho y alto iniciales; `browser_viewport` los cambia después. */\n\tviewport?: { width: number; height: number };\n}\n\nexport class NavegadorAgente {\n\tprivate proceso: ChildProcess | null = null;\n\tprivate cliente: ClienteCdp | null = null;\n\tprivate pestañas = new Map<string, Pestaña>();\n\tprivate sesionesPorTarget = new Map<string, string>();\n\n\t// Campo normal y no propiedad de constructor: el repo compila con\n\t// `erasableSyntaxOnly`, que prohíbe la forma corta.\n\tprivate viewport: { width: number; height: number };\n\n\tprivate constructor(proceso: ChildProcess, cliente: ClienteCdp, viewport: { width: number; height: number }) {\n\t\tthis.proceso = proceso;\n\t\tthis.cliente = cliente;\n\t\tthis.viewport = viewport;\n\t}\n\n\tstatic async abrir(opciones: OpcionesNavegador): Promise<NavegadorAgente> {\n\t\tconst ejecutable = opciones.ejecutable ?? buscarNavegador();\n\t\tif (!ejecutable) {\n\t\t\tthrow new Error(\n\t\t\t\t\"No se encontró Chrome, Chromium, Edge ni Brave. Instala uno o pasa la ruta en la configuración.\",\n\t\t\t);\n\t\t}\n\t\tconst perfil = join(opciones.agentDir, \"browser\", \"perfil\");\n\t\tmkdirSync(perfil, { recursive: true, mode: 0o700 });\n\t\tconst viewport = opciones.viewport ?? { width: 1280, height: 800 };\n\n\t\tconst puerto = opciones.puerto ?? 0;\n\t\tconst proceso = spawn(\n\t\t\tejecutable,\n\t\t\t[\n\t\t\t\t`--remote-debugging-port=${puerto}`,\n\t\t\t\t// Perfil propio y vacío: ver la cabecera del fichero.\n\t\t\t\t`--user-data-dir=${perfil}`,\n\t\t\t\t\"--no-first-run\",\n\t\t\t\t\"--no-default-browser-check\",\n\t\t\t\t// Sin esto, Chrome puede reutilizar una instancia ya abierta del\n\t\t\t\t// usuario y acabaríamos conduciendo SU navegador.\n\t\t\t\t\"--disable-features=ChromeWhatsNewUI\",\n\t\t\t\t`--window-size=${viewport.width},${viewport.height}`,\n\t\t\t\t...(opciones.headless ? [\"--headless=new\"] : []),\n\t\t\t\t\"about:blank\",\n\t\t\t],\n\t\t\t{ stdio: [\"ignore\", \"ignore\", \"pipe\"] },\n\t\t);\n\n\t\tconst urlWs = await leerUrlDevTools(proceso);\n\t\tconst cliente = await ClienteCdp.conectar(urlWs);\n\t\treturn new NavegadorAgente(proceso, cliente, viewport);\n\t}\n\n\tprivate exigirCliente(): ClienteCdp {\n\t\tif (!this.cliente) throw new Error(\"el navegador está cerrado\");\n\t\treturn this.cliente;\n\t}\n\n\t/** Abre una pestaña NUEVA. Es la única forma de que el agente tenga una. */\n\tasync abrirPestaña(url: string): Promise<Pestaña> {\n\t\tconst cliente = this.exigirCliente();\n\t\tconst { targetId } = await cliente.enviar<{ targetId: string }>(\"Target.createTarget\", { url });\n\t\tconst { sessionId } = await cliente.enviar<{ sessionId: string }>(\"Target.attachToTarget\", {\n\t\t\ttargetId,\n\t\t\tflatten: true,\n\t\t});\n\t\tthis.sesionesPorTarget.set(targetId, sessionId);\n\t\tconst pestaña: Pestaña = { targetId, url, propia: true };\n\t\tthis.pestañas.set(targetId, pestaña);\n\t\tawait cliente.enviar(\"Page.enable\", {}, sessionId);\n\t\tawait cliente.enviar(\"Runtime.enable\", {}, sessionId);\n\t\treturn pestaña;\n\t}\n\n\tprivate sesionDe(targetId: string): string {\n\t\texigirPestañaPropia(this.pestañas, targetId);\n\t\tconst sessionId = this.sesionesPorTarget.get(targetId);\n\t\tif (!sessionId) throw new Error(`la pestaña ${targetId} no está conectada`);\n\t\treturn sessionId;\n\t}\n\n\tasync navegar(targetId: string, url: string): Promise<void> {\n\t\tconst sessionId = this.sesionDe(targetId);\n\t\tawait this.exigirCliente().enviar(\"Page.navigate\", { url }, sessionId);\n\t\tconst pestaña = this.pestañas.get(targetId);\n\t\tif (pestaña) pestaña.url = url;\n\t}\n\n\t/** Evalúa JavaScript en la pestaña y devuelve el valor serializado. */\n\tasync evaluar<T = unknown>(targetId: string, expresion: string): Promise<T> {\n\t\tconst sessionId = this.sesionDe(targetId);\n\t\tconst respuesta = await this.exigirCliente().enviar<{\n\t\t\tresult?: { value?: T };\n\t\t\texceptionDetails?: { text?: string; exception?: { description?: string } };\n\t\t}>(\"Runtime.evaluate\", { expression: expresion, returnByValue: true, awaitPromise: true }, sessionId);\n\t\tif (respuesta.exceptionDetails) {\n\t\t\tthrow new Error(\n\t\t\t\trespuesta.exceptionDetails.exception?.description ??\n\t\t\t\t\trespuesta.exceptionDetails.text ??\n\t\t\t\t\t\"error en la página\",\n\t\t\t);\n\t\t}\n\t\treturn respuesta.result?.value as T;\n\t}\n\n\tasync capturar(targetId: string): Promise<string> {\n\t\tconst sessionId = this.sesionDe(targetId);\n\t\tconst { data } = await this.exigirCliente().enviar<{ data: string }>(\n\t\t\t\"Page.captureScreenshot\",\n\t\t\t{ format: \"png\" },\n\t\t\tsessionId,\n\t\t);\n\t\treturn data;\n\t}\n\n\tasync cambiarViewport(targetId: string, width: number, height: number, movil = false): Promise<void> {\n\t\tconst sessionId = this.sesionDe(targetId);\n\t\tawait this.exigirCliente().enviar(\n\t\t\t\"Emulation.setDeviceMetricsOverride\",\n\t\t\t{ width, height, deviceScaleFactor: 1, mobile: movil },\n\t\t\tsessionId,\n\t\t);\n\t\tthis.viewport = { width, height };\n\t}\n\n\tget viewportActual(): { width: number; height: number } {\n\t\treturn { ...this.viewport };\n\t}\n\n\tasync cerrarPestaña(targetId: string): Promise<void> {\n\t\tthis.sesionDe(targetId);\n\t\tawait this.exigirCliente().enviar(\"Target.closeTarget\", { targetId });\n\t\tthis.pestañas.delete(targetId);\n\t\tthis.sesionesPorTarget.delete(targetId);\n\t}\n\n\tlistarPestañas(): Pestaña[] {\n\t\treturn [...this.pestañas.values()];\n\t}\n\n\tcerrar(): void {\n\t\tthis.cliente?.cerrar();\n\t\tthis.cliente = null;\n\t\tthis.proceso?.kill();\n\t\tthis.proceso = null;\n\t\tthis.pestañas.clear();\n\t\tthis.sesionesPorTarget.clear();\n\t}\n}\n\n/**\n * Lee la URL de DevTools que Chrome escribe en stderr al arrancar.\n *\n * Se lee del proceso en vez de sondear `http://localhost:<puerto>/json/version`\n * porque con `--remote-debugging-port=0` el puerto lo elige el sistema y no lo\n * sabemos de antemano. Sondear un puerto fijo, además, podría acertar con una\n * instancia de Chrome que ya tuviera el usuario abierta — y acabaríamos\n * conduciendo su navegador con sus sesiones.\n */\nfunction leerUrlDevTools(proceso: ChildProcess, timeoutMs = 15_000): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tlet acumulado = \"\";\n\t\tconst temporizador = setTimeout(() => {\n\t\t\treject(new Error(`el navegador no anunció su puerto de depuración en ${timeoutMs} ms`));\n\t\t}, timeoutMs);\n\n\t\tconst terminar = (fn: () => void) => {\n\t\t\tclearTimeout(temporizador);\n\t\t\tfn();\n\t\t};\n\n\t\tproceso.stderr?.on(\"data\", (trozo: Buffer) => {\n\t\t\tacumulado += trozo.toString(\"utf8\");\n\t\t\tconst encontrado = acumulado.match(/ws:\\/\\/[^\\s]+/);\n\t\t\tif (encontrado) terminar(() => resolve(encontrado[0]));\n\t\t});\n\t\tproceso.on(\"error\", (error) => terminar(() => reject(error)));\n\t\tproceso.on(\"exit\", (codigo) =>\n\t\t\tterminar(() => reject(new Error(`el navegador se cerró con código ${codigo} antes de arrancar`))),\n\t\t);\n\t});\n}\n"]}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Tools de navegador para el agente.
3
+ *
4
+ * El navegador arranca perezosamente: la primera tool que lo necesita lo abre.
5
+ * Nadie paga un proceso de Chrome por tener las tools registradas.
6
+ *
7
+ * Las tres reglas viven en `politica.ts` y aquí solo se aplican. La que más se
8
+ * nota en el uso: el agente **solo conduce las pestañas que abrió él**, y
9
+ * además lo hace en un perfil vacío sin ninguna sesión del usuario.
10
+ */
11
+ import type { ToolDefinition } from "../extensions/types.ts";
12
+ import { type OpcionesNavegador } from "./sesion.ts";
13
+ export declare function crearBrowserTools(opciones: OpcionesNavegador & {
14
+ ordenador?: boolean;
15
+ }): Record<string, ToolDefinition>;
16
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/core/browser/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG9E,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA4EtE,wBAAgB,iBAAiB,CAChC,QAAQ,EAAE,iBAAiB,GAAG;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GACnD,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAwOhC","sourcesContent":["/**\n * Tools de navegador para el agente.\n *\n * El navegador arranca perezosamente: la primera tool que lo necesita lo abre.\n * Nadie paga un proceso de Chrome por tener las tools registradas.\n *\n * Las tres reglas viven en `politica.ts` y aquí solo se aplican. La que más se\n * nota en el uso: el agente **solo conduce las pestañas que abrió él**, y\n * además lo hace en un perfil vacío sin ninguna sesión del usuario.\n */\n\nimport { Type } from \"typebox\";\nimport type { AgentToolResult, ToolDefinition } from \"../extensions/types.ts\";\nimport { reglaDeEleccion } from \"../prompt-eleccion.ts\";\nimport { CampoSecretoError, esCampoSecreto, pareceIrreversible, urlNavegable } from \"./politica.ts\";\nimport { NavegadorAgente, type OpcionesNavegador } from \"./sesion.ts\";\n\n/**\n * Cómo usar el navegador, no solo que existe.\n *\n * Sin esto el modelo intentaría conducir pestañas que no abrió (y que fallan\n * con un error que no entiende), o pulsaría \"Comprar\" sin preguntar.\n */\nfunction guiaNavegador(ordenador: boolean): string[] {\n\treturn [\n\t\treglaDeEleccion({ navegador: true, ordenador }),\n\t\t\"Abre las páginas con browser_open: no puedes conducir las pestañas del usuario, solo las que abras tú.\",\n\t\t\"Usa browser_read antes de pulsar o escribir, y actúa por la referencia que devuelve; vuelve a leer después de navegar.\",\n\t\t\"Si un control envía, compra, publica, borra o acepta condiciones, pregunta al usuario ANTES de pulsarlo.\",\n\t\t\"El navegador del agente usa un perfil vacío: no hay sesiones iniciadas, así que no cuentes con estar identificado en ningún sitio.\",\n\t];\n}\n\nfunction texto(t: string): AgentToolResult<unknown> {\n\treturn { content: [{ type: \"text\" as const, text: t }], details: undefined };\n}\n\nfunction fallo(error: unknown): AgentToolResult<unknown> {\n\treturn texto(`Error: ${error instanceof Error ? error.message : String(error)}`);\n}\n\n/**\n * Script que se inyecta para leer la página.\n *\n * Devuelve el texto y los elementos con los que se puede interactuar, cada uno\n * con una referencia estable dentro de la lectura. Se marcan los campos que\n * piden credenciales y los botones que parecen irreversibles, para que el\n * agente lo sepa ANTES de tocarlos, no después.\n */\nconst LEER_PAGINA = `(() => {\n const interactivos = [...document.querySelectorAll('a[href],button,input,select,textarea,[role=button],[role=link],[onclick]')];\n window.__adaRefs = interactivos;\n const visible = (el) => { const r = el.getBoundingClientRect(); return r.width > 0 && r.height > 0; };\n return {\n url: location.href,\n titulo: document.title,\n texto: (document.body?.innerText ?? '').slice(0, 20000),\n elementos: interactivos.map((el, i) => ({\n ref: i,\n etiqueta: el.tagName.toLowerCase(),\n type: el.getAttribute('type') ?? undefined,\n name: el.getAttribute('name') ?? undefined,\n id: el.id || undefined,\n autocomplete: el.getAttribute('autocomplete') ?? undefined,\n placeholder: el.getAttribute('placeholder') ?? undefined,\n ariaLabel: el.getAttribute('aria-label') ?? undefined,\n texto: (el.innerText || el.value || '').trim().slice(0, 120),\n visible: visible(el),\n })).filter((e) => e.visible).slice(0, 200),\n };\n})()`;\n\ninterface ElementoLeido {\n\tref: number;\n\tetiqueta: string;\n\ttype?: string;\n\tname?: string;\n\tid?: string;\n\tautocomplete?: string;\n\tplaceholder?: string;\n\tariaLabel?: string;\n\ttexto: string;\n}\n\ninterface PaginaLeida {\n\turl: string;\n\ttitulo: string;\n\ttexto: string;\n\telementos: ElementoLeido[];\n}\n\nexport function crearBrowserTools(\n\topciones: OpcionesNavegador & { ordenador?: boolean },\n): Record<string, ToolDefinition> {\n\t// La regla de elección solo puede nombrar `computer_*` si esas tools existen.\n\tconst guia = guiaNavegador(opciones.ordenador === true);\n\tlet navegador: NavegadorAgente | null = null;\n\n\tconst exigirNavegador = async (): Promise<NavegadorAgente> => {\n\t\tif (!navegador) navegador = await NavegadorAgente.abrir(opciones);\n\t\treturn navegador;\n\t};\n\n\tconst abrir: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"browser_open\",\n\t\tlabel: \"Abrir pestaña\",\n\t\tpromptGuidelines: guia,\n\t\tdescription:\n\t\t\t\"Abre una pestaña NUEVA en el navegador del agente y devuelve su id. \" +\n\t\t\t\"Es la única forma de tener una pestaña: las del usuario no se pueden conducir. \" +\n\t\t\t\"El navegador usa un perfil vacío, así que no hay sesiones iniciadas.\",\n\t\tpromptSnippet: \"abrir una página web para interactuar con ella\",\n\t\tparameters: Type.Object({ url: Type.String({ description: \"URL http(s) a abrir\" }) }),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\ttry {\n\t\t\t\tconst url = urlNavegable(String(input.url ?? \"\"));\n\t\t\t\tconst nav = await exigirNavegador();\n\t\t\t\tconst pestaña = await nav.abrirPestaña(url.toString());\n\t\t\t\treturn texto(`Pestaña abierta: ${pestaña.targetId}\\nURL: ${pestaña.url}`);\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst navegar: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"browser_navigate\",\n\t\tlabel: \"Navegar\",\n\t\tdescription: \"Lleva una pestaña del agente a otra URL.\",\n\t\tpromptSnippet: \"cambiar de página en una pestaña ya abierta\",\n\t\tparameters: Type.Object({ tabId: Type.String(), url: Type.String() }),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\ttry {\n\t\t\t\tconst url = urlNavegable(String(input.url ?? \"\"));\n\t\t\t\tconst nav = await exigirNavegador();\n\t\t\t\tawait nav.navegar(String(input.tabId), url.toString());\n\t\t\t\treturn texto(`Navegado a ${url}`);\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst leer: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"browser_read\",\n\t\tlabel: \"Leer página\",\n\t\tdescription:\n\t\t\t\"Devuelve el texto de la página y sus elementos interactivos con una referencia cada uno. \" +\n\t\t\t\"Usa esas referencias en browser_click y browser_type. Hay que volver a leer tras navegar.\",\n\t\tpromptSnippet: \"leer el contenido y los controles de una página\",\n\t\tparameters: Type.Object({ tabId: Type.String() }),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\ttry {\n\t\t\t\tconst nav = await exigirNavegador();\n\t\t\t\tconst pagina = await nav.evaluar<PaginaLeida>(String(input.tabId), LEER_PAGINA);\n\t\t\t\tconst lineas = pagina.elementos.map((e) => {\n\t\t\t\t\tconst marcas = [\n\t\t\t\t\t\tesCampoSecreto(e) ? \"CREDENCIAL — el agente no escribe aquí\" : \"\",\n\t\t\t\t\t\tpareceIrreversible(e.texto) ? \"parece irreversible: pregunta antes\" : \"\",\n\t\t\t\t\t].filter(Boolean);\n\t\t\t\t\tconst desc = e.texto || e.placeholder || e.ariaLabel || e.name || e.id || \"(sin texto)\";\n\t\t\t\t\treturn ` [${e.ref}] <${e.etiqueta}${e.type ? ` type=${e.type}` : \"\"}> ${desc}${marcas.length ? ` ⚠ ${marcas.join(\"; \")}` : \"\"}`;\n\t\t\t\t});\n\t\t\t\treturn texto(\n\t\t\t\t\t`${pagina.titulo}\\n${pagina.url}\\n\\n${pagina.texto}\\n\\nElementos interactivos:\\n${lineas.join(\"\\n\") || \" (ninguno)\"}`,\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst pulsar: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"browser_click\",\n\t\tlabel: \"Pulsar\",\n\t\tpromptGuidelines: guia,\n\t\tdescription:\n\t\t\t\"Pulsa un elemento por su referencia de browser_read. \" +\n\t\t\t\"Si el botón parece irreversible (enviar, comprar, publicar, borrar), pregunta al usuario antes.\",\n\t\tpromptSnippet: \"pulsar un botón o enlace de la página\",\n\t\tparameters: Type.Object({ tabId: Type.String(), ref: Type.Number() }),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\ttry {\n\t\t\t\tconst nav = await exigirNavegador();\n\t\t\t\tconst r = await nav.evaluar<{ ok: boolean; texto?: string; motivo?: string }>(\n\t\t\t\t\tString(input.tabId),\n\t\t\t\t\t`(() => {\n\t\t\t\t\t const el = (window.__adaRefs || [])[${Number(input.ref)}];\n\t\t\t\t\t if (!el) return { ok: false, motivo: 'referencia desconocida; vuelve a leer la página' };\n\t\t\t\t\t const t = (el.innerText || el.value || '').trim();\n\t\t\t\t\t el.click();\n\t\t\t\t\t return { ok: true, texto: t };\n\t\t\t\t\t})()`,\n\t\t\t\t);\n\t\t\t\tif (!r.ok) return texto(`No se pudo pulsar: ${r.motivo}`);\n\t\t\t\treturn texto(`Pulsado: ${r.texto || \"(sin texto)\"}`);\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst escribir: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"browser_type\",\n\t\tlabel: \"Escribir\",\n\t\tpromptGuidelines: guia,\n\t\tdescription:\n\t\t\t\"Escribe texto en un campo por su referencia. \" +\n\t\t\t\"Nunca escribe en campos de contraseña, token o tarjeta: eso lo hace el usuario.\",\n\t\tpromptSnippet: \"rellenar un campo de un formulario\",\n\t\tparameters: Type.Object({ tabId: Type.String(), ref: Type.Number(), texto: Type.String() }),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\ttry {\n\t\t\t\tconst nav = await exigirNavegador();\n\t\t\t\tconst tabId = String(input.tabId);\n\t\t\t\t// Se comprueba en el momento, no con lo leído antes: la página pudo\n\t\t\t\t// cambiar el campo entre la lectura y ahora.\n\t\t\t\tconst campo = await nav.evaluar<ElementoLeido | null>(\n\t\t\t\t\ttabId,\n\t\t\t\t\t`(() => {\n\t\t\t\t\t const el = (window.__adaRefs || [])[${Number(input.ref)}];\n\t\t\t\t\t if (!el) return null;\n\t\t\t\t\t return { ref: ${Number(input.ref)}, etiqueta: el.tagName.toLowerCase(), type: el.getAttribute('type') ?? undefined,\n\t\t\t\t\t name: el.getAttribute('name') ?? undefined, id: el.id || undefined,\n\t\t\t\t\t autocomplete: el.getAttribute('autocomplete') ?? undefined,\n\t\t\t\t\t placeholder: el.getAttribute('placeholder') ?? undefined,\n\t\t\t\t\t ariaLabel: el.getAttribute('aria-label') ?? undefined, texto: '' };\n\t\t\t\t\t})()`,\n\t\t\t\t);\n\t\t\t\tif (!campo) return texto(\"No se pudo escribir: referencia desconocida; vuelve a leer la página.\");\n\t\t\t\tif (esCampoSecreto(campo)) return fallo(new CampoSecretoError());\n\n\t\t\t\tawait nav.evaluar(\n\t\t\t\t\ttabId,\n\t\t\t\t\t`(() => {\n\t\t\t\t\t const el = window.__adaRefs[${Number(input.ref)}];\n\t\t\t\t\t const setter = Object.getOwnPropertyDescriptor(el.constructor.prototype, 'value')?.set;\n\t\t\t\t\t // El setter del prototipo, no el de la instancia: React sobrescribe\n\t\t\t\t\t // el de la instancia y su onChange no se enteraría del cambio.\n\t\t\t\t\t if (setter) setter.call(el, ${JSON.stringify(String(input.texto ?? \"\"))});\n\t\t\t\t\t else el.value = ${JSON.stringify(String(input.texto ?? \"\"))};\n\t\t\t\t\t el.dispatchEvent(new Event('input', { bubbles: true }));\n\t\t\t\t\t el.dispatchEvent(new Event('change', { bubbles: true }));\n\t\t\t\t\t})()`,\n\t\t\t\t);\n\t\t\t\treturn texto(`Escrito en [${Number(input.ref)}].`);\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst capturar: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"browser_screenshot\",\n\t\tlabel: \"Captura\",\n\t\tdescription: \"Captura la pestaña y devuelve la imagen.\",\n\t\tpromptSnippet: \"ver cómo se ve la página\",\n\t\tparameters: Type.Object({ tabId: Type.String() }),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\ttry {\n\t\t\t\tconst nav = await exigirNavegador();\n\t\t\t\tconst data = await nav.capturar(String(input.tabId));\n\t\t\t\treturn { content: [{ type: \"image\" as const, data, mimeType: \"image/png\" }], details: undefined };\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst viewport: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"browser_viewport\",\n\t\tlabel: \"Cambiar viewport\",\n\t\tdescription:\n\t\t\t\"Cambia el tamaño de la ventana emulada. Con movil=true, una página SIN <meta name=viewport> \" +\n\t\t\t\"usará el viewport heredado de 980 px: es lo que hace un teléfono de verdad, no un fallo.\",\n\t\tpromptSnippet: \"probar la página en otro tamaño de pantalla\",\n\t\tparameters: Type.Object({\n\t\t\ttabId: Type.String(),\n\t\t\twidth: Type.Number(),\n\t\t\theight: Type.Number(),\n\t\t\tmovil: Type.Optional(Type.Boolean()),\n\t\t}),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\ttry {\n\t\t\t\tconst nav = await exigirNavegador();\n\t\t\t\tawait nav.cambiarViewport(\n\t\t\t\t\tString(input.tabId),\n\t\t\t\t\tNumber(input.width),\n\t\t\t\t\tNumber(input.height),\n\t\t\t\t\tinput.movil === true,\n\t\t\t\t);\n\t\t\t\treturn texto(`Viewport: ${Number(input.width)}x${Number(input.height)}${input.movil ? \" (móvil)\" : \"\"}`);\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst cerrar: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"browser_close\",\n\t\tlabel: \"Cerrar pestaña\",\n\t\tdescription: \"Cierra una pestaña del agente.\",\n\t\tpromptSnippet: \"cerrar una pestaña que ya no hace falta\",\n\t\tparameters: Type.Object({ tabId: Type.String() }),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\ttry {\n\t\t\t\tconst nav = await exigirNavegador();\n\t\t\t\tawait nav.cerrarPestaña(String(input.tabId));\n\t\t\t\treturn texto(\"Pestaña cerrada.\");\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\treturn {\n\t\tbrowser_open: abrir as ToolDefinition,\n\t\tbrowser_navigate: navegar as ToolDefinition,\n\t\tbrowser_read: leer as ToolDefinition,\n\t\tbrowser_click: pulsar as ToolDefinition,\n\t\tbrowser_type: escribir as ToolDefinition,\n\t\tbrowser_screenshot: capturar as ToolDefinition,\n\t\tbrowser_viewport: viewport as ToolDefinition,\n\t\tbrowser_close: cerrar as ToolDefinition,\n\t};\n}\n"]}
@@ -0,0 +1,279 @@
1
+ /**
2
+ * Tools de navegador para el agente.
3
+ *
4
+ * El navegador arranca perezosamente: la primera tool que lo necesita lo abre.
5
+ * Nadie paga un proceso de Chrome por tener las tools registradas.
6
+ *
7
+ * Las tres reglas viven en `politica.ts` y aquí solo se aplican. La que más se
8
+ * nota en el uso: el agente **solo conduce las pestañas que abrió él**, y
9
+ * además lo hace en un perfil vacío sin ninguna sesión del usuario.
10
+ */
11
+ import { Type } from "typebox";
12
+ import { reglaDeEleccion } from "../prompt-eleccion.js";
13
+ import { CampoSecretoError, esCampoSecreto, pareceIrreversible, urlNavegable } from "./politica.js";
14
+ import { NavegadorAgente } from "./sesion.js";
15
+ /**
16
+ * Cómo usar el navegador, no solo que existe.
17
+ *
18
+ * Sin esto el modelo intentaría conducir pestañas que no abrió (y que fallan
19
+ * con un error que no entiende), o pulsaría "Comprar" sin preguntar.
20
+ */
21
+ function guiaNavegador(ordenador) {
22
+ return [
23
+ reglaDeEleccion({ navegador: true, ordenador }),
24
+ "Abre las páginas con browser_open: no puedes conducir las pestañas del usuario, solo las que abras tú.",
25
+ "Usa browser_read antes de pulsar o escribir, y actúa por la referencia que devuelve; vuelve a leer después de navegar.",
26
+ "Si un control envía, compra, publica, borra o acepta condiciones, pregunta al usuario ANTES de pulsarlo.",
27
+ "El navegador del agente usa un perfil vacío: no hay sesiones iniciadas, así que no cuentes con estar identificado en ningún sitio.",
28
+ ];
29
+ }
30
+ function texto(t) {
31
+ return { content: [{ type: "text", text: t }], details: undefined };
32
+ }
33
+ function fallo(error) {
34
+ return texto(`Error: ${error instanceof Error ? error.message : String(error)}`);
35
+ }
36
+ /**
37
+ * Script que se inyecta para leer la página.
38
+ *
39
+ * Devuelve el texto y los elementos con los que se puede interactuar, cada uno
40
+ * con una referencia estable dentro de la lectura. Se marcan los campos que
41
+ * piden credenciales y los botones que parecen irreversibles, para que el
42
+ * agente lo sepa ANTES de tocarlos, no después.
43
+ */
44
+ const LEER_PAGINA = `(() => {
45
+ const interactivos = [...document.querySelectorAll('a[href],button,input,select,textarea,[role=button],[role=link],[onclick]')];
46
+ window.__adaRefs = interactivos;
47
+ const visible = (el) => { const r = el.getBoundingClientRect(); return r.width > 0 && r.height > 0; };
48
+ return {
49
+ url: location.href,
50
+ titulo: document.title,
51
+ texto: (document.body?.innerText ?? '').slice(0, 20000),
52
+ elementos: interactivos.map((el, i) => ({
53
+ ref: i,
54
+ etiqueta: el.tagName.toLowerCase(),
55
+ type: el.getAttribute('type') ?? undefined,
56
+ name: el.getAttribute('name') ?? undefined,
57
+ id: el.id || undefined,
58
+ autocomplete: el.getAttribute('autocomplete') ?? undefined,
59
+ placeholder: el.getAttribute('placeholder') ?? undefined,
60
+ ariaLabel: el.getAttribute('aria-label') ?? undefined,
61
+ texto: (el.innerText || el.value || '').trim().slice(0, 120),
62
+ visible: visible(el),
63
+ })).filter((e) => e.visible).slice(0, 200),
64
+ };
65
+ })()`;
66
+ export function crearBrowserTools(opciones) {
67
+ // La regla de elección solo puede nombrar `computer_*` si esas tools existen.
68
+ const guia = guiaNavegador(opciones.ordenador === true);
69
+ let navegador = null;
70
+ const exigirNavegador = async () => {
71
+ if (!navegador)
72
+ navegador = await NavegadorAgente.abrir(opciones);
73
+ return navegador;
74
+ };
75
+ const abrir = {
76
+ name: "browser_open",
77
+ label: "Abrir pestaña",
78
+ promptGuidelines: guia,
79
+ description: "Abre una pestaña NUEVA en el navegador del agente y devuelve su id. " +
80
+ "Es la única forma de tener una pestaña: las del usuario no se pueden conducir. " +
81
+ "El navegador usa un perfil vacío, así que no hay sesiones iniciadas.",
82
+ promptSnippet: "abrir una página web para interactuar con ella",
83
+ parameters: Type.Object({ url: Type.String({ description: "URL http(s) a abrir" }) }),
84
+ async execute(_id, input) {
85
+ try {
86
+ const url = urlNavegable(String(input.url ?? ""));
87
+ const nav = await exigirNavegador();
88
+ const pestaña = await nav.abrirPestaña(url.toString());
89
+ return texto(`Pestaña abierta: ${pestaña.targetId}\nURL: ${pestaña.url}`);
90
+ }
91
+ catch (error) {
92
+ return fallo(error);
93
+ }
94
+ },
95
+ };
96
+ const navegar = {
97
+ name: "browser_navigate",
98
+ label: "Navegar",
99
+ description: "Lleva una pestaña del agente a otra URL.",
100
+ promptSnippet: "cambiar de página en una pestaña ya abierta",
101
+ parameters: Type.Object({ tabId: Type.String(), url: Type.String() }),
102
+ async execute(_id, input) {
103
+ try {
104
+ const url = urlNavegable(String(input.url ?? ""));
105
+ const nav = await exigirNavegador();
106
+ await nav.navegar(String(input.tabId), url.toString());
107
+ return texto(`Navegado a ${url}`);
108
+ }
109
+ catch (error) {
110
+ return fallo(error);
111
+ }
112
+ },
113
+ };
114
+ const leer = {
115
+ name: "browser_read",
116
+ label: "Leer página",
117
+ description: "Devuelve el texto de la página y sus elementos interactivos con una referencia cada uno. " +
118
+ "Usa esas referencias en browser_click y browser_type. Hay que volver a leer tras navegar.",
119
+ promptSnippet: "leer el contenido y los controles de una página",
120
+ parameters: Type.Object({ tabId: Type.String() }),
121
+ async execute(_id, input) {
122
+ try {
123
+ const nav = await exigirNavegador();
124
+ const pagina = await nav.evaluar(String(input.tabId), LEER_PAGINA);
125
+ const lineas = pagina.elementos.map((e) => {
126
+ const marcas = [
127
+ esCampoSecreto(e) ? "CREDENCIAL — el agente no escribe aquí" : "",
128
+ pareceIrreversible(e.texto) ? "parece irreversible: pregunta antes" : "",
129
+ ].filter(Boolean);
130
+ const desc = e.texto || e.placeholder || e.ariaLabel || e.name || e.id || "(sin texto)";
131
+ return ` [${e.ref}] <${e.etiqueta}${e.type ? ` type=${e.type}` : ""}> ${desc}${marcas.length ? ` ⚠ ${marcas.join("; ")}` : ""}`;
132
+ });
133
+ return texto(`${pagina.titulo}\n${pagina.url}\n\n${pagina.texto}\n\nElementos interactivos:\n${lineas.join("\n") || " (ninguno)"}`);
134
+ }
135
+ catch (error) {
136
+ return fallo(error);
137
+ }
138
+ },
139
+ };
140
+ const pulsar = {
141
+ name: "browser_click",
142
+ label: "Pulsar",
143
+ promptGuidelines: guia,
144
+ description: "Pulsa un elemento por su referencia de browser_read. " +
145
+ "Si el botón parece irreversible (enviar, comprar, publicar, borrar), pregunta al usuario antes.",
146
+ promptSnippet: "pulsar un botón o enlace de la página",
147
+ parameters: Type.Object({ tabId: Type.String(), ref: Type.Number() }),
148
+ async execute(_id, input) {
149
+ try {
150
+ const nav = await exigirNavegador();
151
+ const r = await nav.evaluar(String(input.tabId), `(() => {
152
+ const el = (window.__adaRefs || [])[${Number(input.ref)}];
153
+ if (!el) return { ok: false, motivo: 'referencia desconocida; vuelve a leer la página' };
154
+ const t = (el.innerText || el.value || '').trim();
155
+ el.click();
156
+ return { ok: true, texto: t };
157
+ })()`);
158
+ if (!r.ok)
159
+ return texto(`No se pudo pulsar: ${r.motivo}`);
160
+ return texto(`Pulsado: ${r.texto || "(sin texto)"}`);
161
+ }
162
+ catch (error) {
163
+ return fallo(error);
164
+ }
165
+ },
166
+ };
167
+ const escribir = {
168
+ name: "browser_type",
169
+ label: "Escribir",
170
+ promptGuidelines: guia,
171
+ description: "Escribe texto en un campo por su referencia. " +
172
+ "Nunca escribe en campos de contraseña, token o tarjeta: eso lo hace el usuario.",
173
+ promptSnippet: "rellenar un campo de un formulario",
174
+ parameters: Type.Object({ tabId: Type.String(), ref: Type.Number(), texto: Type.String() }),
175
+ async execute(_id, input) {
176
+ try {
177
+ const nav = await exigirNavegador();
178
+ const tabId = String(input.tabId);
179
+ // Se comprueba en el momento, no con lo leído antes: la página pudo
180
+ // cambiar el campo entre la lectura y ahora.
181
+ const campo = await nav.evaluar(tabId, `(() => {
182
+ const el = (window.__adaRefs || [])[${Number(input.ref)}];
183
+ if (!el) return null;
184
+ return { ref: ${Number(input.ref)}, etiqueta: el.tagName.toLowerCase(), type: el.getAttribute('type') ?? undefined,
185
+ name: el.getAttribute('name') ?? undefined, id: el.id || undefined,
186
+ autocomplete: el.getAttribute('autocomplete') ?? undefined,
187
+ placeholder: el.getAttribute('placeholder') ?? undefined,
188
+ ariaLabel: el.getAttribute('aria-label') ?? undefined, texto: '' };
189
+ })()`);
190
+ if (!campo)
191
+ return texto("No se pudo escribir: referencia desconocida; vuelve a leer la página.");
192
+ if (esCampoSecreto(campo))
193
+ return fallo(new CampoSecretoError());
194
+ await nav.evaluar(tabId, `(() => {
195
+ const el = window.__adaRefs[${Number(input.ref)}];
196
+ const setter = Object.getOwnPropertyDescriptor(el.constructor.prototype, 'value')?.set;
197
+ // El setter del prototipo, no el de la instancia: React sobrescribe
198
+ // el de la instancia y su onChange no se enteraría del cambio.
199
+ if (setter) setter.call(el, ${JSON.stringify(String(input.texto ?? ""))});
200
+ else el.value = ${JSON.stringify(String(input.texto ?? ""))};
201
+ el.dispatchEvent(new Event('input', { bubbles: true }));
202
+ el.dispatchEvent(new Event('change', { bubbles: true }));
203
+ })()`);
204
+ return texto(`Escrito en [${Number(input.ref)}].`);
205
+ }
206
+ catch (error) {
207
+ return fallo(error);
208
+ }
209
+ },
210
+ };
211
+ const capturar = {
212
+ name: "browser_screenshot",
213
+ label: "Captura",
214
+ description: "Captura la pestaña y devuelve la imagen.",
215
+ promptSnippet: "ver cómo se ve la página",
216
+ parameters: Type.Object({ tabId: Type.String() }),
217
+ async execute(_id, input) {
218
+ try {
219
+ const nav = await exigirNavegador();
220
+ const data = await nav.capturar(String(input.tabId));
221
+ return { content: [{ type: "image", data, mimeType: "image/png" }], details: undefined };
222
+ }
223
+ catch (error) {
224
+ return fallo(error);
225
+ }
226
+ },
227
+ };
228
+ const viewport = {
229
+ name: "browser_viewport",
230
+ label: "Cambiar viewport",
231
+ description: "Cambia el tamaño de la ventana emulada. Con movil=true, una página SIN <meta name=viewport> " +
232
+ "usará el viewport heredado de 980 px: es lo que hace un teléfono de verdad, no un fallo.",
233
+ promptSnippet: "probar la página en otro tamaño de pantalla",
234
+ parameters: Type.Object({
235
+ tabId: Type.String(),
236
+ width: Type.Number(),
237
+ height: Type.Number(),
238
+ movil: Type.Optional(Type.Boolean()),
239
+ }),
240
+ async execute(_id, input) {
241
+ try {
242
+ const nav = await exigirNavegador();
243
+ await nav.cambiarViewport(String(input.tabId), Number(input.width), Number(input.height), input.movil === true);
244
+ return texto(`Viewport: ${Number(input.width)}x${Number(input.height)}${input.movil ? " (móvil)" : ""}`);
245
+ }
246
+ catch (error) {
247
+ return fallo(error);
248
+ }
249
+ },
250
+ };
251
+ const cerrar = {
252
+ name: "browser_close",
253
+ label: "Cerrar pestaña",
254
+ description: "Cierra una pestaña del agente.",
255
+ promptSnippet: "cerrar una pestaña que ya no hace falta",
256
+ parameters: Type.Object({ tabId: Type.String() }),
257
+ async execute(_id, input) {
258
+ try {
259
+ const nav = await exigirNavegador();
260
+ await nav.cerrarPestaña(String(input.tabId));
261
+ return texto("Pestaña cerrada.");
262
+ }
263
+ catch (error) {
264
+ return fallo(error);
265
+ }
266
+ },
267
+ };
268
+ return {
269
+ browser_open: abrir,
270
+ browser_navigate: navegar,
271
+ browser_read: leer,
272
+ browser_click: pulsar,
273
+ browser_type: escribir,
274
+ browser_screenshot: capturar,
275
+ browser_viewport: viewport,
276
+ browser_close: cerrar,
277
+ };
278
+ }
279
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/core/browser/tools.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tools de navegador para el agente.\n *\n * El navegador arranca perezosamente: la primera tool que lo necesita lo abre.\n * Nadie paga un proceso de Chrome por tener las tools registradas.\n *\n * Las tres reglas viven en `politica.ts` y aquí solo se aplican. La que más se\n * nota en el uso: el agente **solo conduce las pestañas que abrió él**, y\n * además lo hace en un perfil vacío sin ninguna sesión del usuario.\n */\n\nimport { Type } from \"typebox\";\nimport type { AgentToolResult, ToolDefinition } from \"../extensions/types.ts\";\nimport { reglaDeEleccion } from \"../prompt-eleccion.ts\";\nimport { CampoSecretoError, esCampoSecreto, pareceIrreversible, urlNavegable } from \"./politica.ts\";\nimport { NavegadorAgente, type OpcionesNavegador } from \"./sesion.ts\";\n\n/**\n * Cómo usar el navegador, no solo que existe.\n *\n * Sin esto el modelo intentaría conducir pestañas que no abrió (y que fallan\n * con un error que no entiende), o pulsaría \"Comprar\" sin preguntar.\n */\nfunction guiaNavegador(ordenador: boolean): string[] {\n\treturn [\n\t\treglaDeEleccion({ navegador: true, ordenador }),\n\t\t\"Abre las páginas con browser_open: no puedes conducir las pestañas del usuario, solo las que abras tú.\",\n\t\t\"Usa browser_read antes de pulsar o escribir, y actúa por la referencia que devuelve; vuelve a leer después de navegar.\",\n\t\t\"Si un control envía, compra, publica, borra o acepta condiciones, pregunta al usuario ANTES de pulsarlo.\",\n\t\t\"El navegador del agente usa un perfil vacío: no hay sesiones iniciadas, así que no cuentes con estar identificado en ningún sitio.\",\n\t];\n}\n\nfunction texto(t: string): AgentToolResult<unknown> {\n\treturn { content: [{ type: \"text\" as const, text: t }], details: undefined };\n}\n\nfunction fallo(error: unknown): AgentToolResult<unknown> {\n\treturn texto(`Error: ${error instanceof Error ? error.message : String(error)}`);\n}\n\n/**\n * Script que se inyecta para leer la página.\n *\n * Devuelve el texto y los elementos con los que se puede interactuar, cada uno\n * con una referencia estable dentro de la lectura. Se marcan los campos que\n * piden credenciales y los botones que parecen irreversibles, para que el\n * agente lo sepa ANTES de tocarlos, no después.\n */\nconst LEER_PAGINA = `(() => {\n const interactivos = [...document.querySelectorAll('a[href],button,input,select,textarea,[role=button],[role=link],[onclick]')];\n window.__adaRefs = interactivos;\n const visible = (el) => { const r = el.getBoundingClientRect(); return r.width > 0 && r.height > 0; };\n return {\n url: location.href,\n titulo: document.title,\n texto: (document.body?.innerText ?? '').slice(0, 20000),\n elementos: interactivos.map((el, i) => ({\n ref: i,\n etiqueta: el.tagName.toLowerCase(),\n type: el.getAttribute('type') ?? undefined,\n name: el.getAttribute('name') ?? undefined,\n id: el.id || undefined,\n autocomplete: el.getAttribute('autocomplete') ?? undefined,\n placeholder: el.getAttribute('placeholder') ?? undefined,\n ariaLabel: el.getAttribute('aria-label') ?? undefined,\n texto: (el.innerText || el.value || '').trim().slice(0, 120),\n visible: visible(el),\n })).filter((e) => e.visible).slice(0, 200),\n };\n})()`;\n\ninterface ElementoLeido {\n\tref: number;\n\tetiqueta: string;\n\ttype?: string;\n\tname?: string;\n\tid?: string;\n\tautocomplete?: string;\n\tplaceholder?: string;\n\tariaLabel?: string;\n\ttexto: string;\n}\n\ninterface PaginaLeida {\n\turl: string;\n\ttitulo: string;\n\ttexto: string;\n\telementos: ElementoLeido[];\n}\n\nexport function crearBrowserTools(\n\topciones: OpcionesNavegador & { ordenador?: boolean },\n): Record<string, ToolDefinition> {\n\t// La regla de elección solo puede nombrar `computer_*` si esas tools existen.\n\tconst guia = guiaNavegador(opciones.ordenador === true);\n\tlet navegador: NavegadorAgente | null = null;\n\n\tconst exigirNavegador = async (): Promise<NavegadorAgente> => {\n\t\tif (!navegador) navegador = await NavegadorAgente.abrir(opciones);\n\t\treturn navegador;\n\t};\n\n\tconst abrir: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"browser_open\",\n\t\tlabel: \"Abrir pestaña\",\n\t\tpromptGuidelines: guia,\n\t\tdescription:\n\t\t\t\"Abre una pestaña NUEVA en el navegador del agente y devuelve su id. \" +\n\t\t\t\"Es la única forma de tener una pestaña: las del usuario no se pueden conducir. \" +\n\t\t\t\"El navegador usa un perfil vacío, así que no hay sesiones iniciadas.\",\n\t\tpromptSnippet: \"abrir una página web para interactuar con ella\",\n\t\tparameters: Type.Object({ url: Type.String({ description: \"URL http(s) a abrir\" }) }),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\ttry {\n\t\t\t\tconst url = urlNavegable(String(input.url ?? \"\"));\n\t\t\t\tconst nav = await exigirNavegador();\n\t\t\t\tconst pestaña = await nav.abrirPestaña(url.toString());\n\t\t\t\treturn texto(`Pestaña abierta: ${pestaña.targetId}\\nURL: ${pestaña.url}`);\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst navegar: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"browser_navigate\",\n\t\tlabel: \"Navegar\",\n\t\tdescription: \"Lleva una pestaña del agente a otra URL.\",\n\t\tpromptSnippet: \"cambiar de página en una pestaña ya abierta\",\n\t\tparameters: Type.Object({ tabId: Type.String(), url: Type.String() }),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\ttry {\n\t\t\t\tconst url = urlNavegable(String(input.url ?? \"\"));\n\t\t\t\tconst nav = await exigirNavegador();\n\t\t\t\tawait nav.navegar(String(input.tabId), url.toString());\n\t\t\t\treturn texto(`Navegado a ${url}`);\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst leer: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"browser_read\",\n\t\tlabel: \"Leer página\",\n\t\tdescription:\n\t\t\t\"Devuelve el texto de la página y sus elementos interactivos con una referencia cada uno. \" +\n\t\t\t\"Usa esas referencias en browser_click y browser_type. Hay que volver a leer tras navegar.\",\n\t\tpromptSnippet: \"leer el contenido y los controles de una página\",\n\t\tparameters: Type.Object({ tabId: Type.String() }),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\ttry {\n\t\t\t\tconst nav = await exigirNavegador();\n\t\t\t\tconst pagina = await nav.evaluar<PaginaLeida>(String(input.tabId), LEER_PAGINA);\n\t\t\t\tconst lineas = pagina.elementos.map((e) => {\n\t\t\t\t\tconst marcas = [\n\t\t\t\t\t\tesCampoSecreto(e) ? \"CREDENCIAL — el agente no escribe aquí\" : \"\",\n\t\t\t\t\t\tpareceIrreversible(e.texto) ? \"parece irreversible: pregunta antes\" : \"\",\n\t\t\t\t\t].filter(Boolean);\n\t\t\t\t\tconst desc = e.texto || e.placeholder || e.ariaLabel || e.name || e.id || \"(sin texto)\";\n\t\t\t\t\treturn ` [${e.ref}] <${e.etiqueta}${e.type ? ` type=${e.type}` : \"\"}> ${desc}${marcas.length ? ` ⚠ ${marcas.join(\"; \")}` : \"\"}`;\n\t\t\t\t});\n\t\t\t\treturn texto(\n\t\t\t\t\t`${pagina.titulo}\\n${pagina.url}\\n\\n${pagina.texto}\\n\\nElementos interactivos:\\n${lineas.join(\"\\n\") || \" (ninguno)\"}`,\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst pulsar: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"browser_click\",\n\t\tlabel: \"Pulsar\",\n\t\tpromptGuidelines: guia,\n\t\tdescription:\n\t\t\t\"Pulsa un elemento por su referencia de browser_read. \" +\n\t\t\t\"Si el botón parece irreversible (enviar, comprar, publicar, borrar), pregunta al usuario antes.\",\n\t\tpromptSnippet: \"pulsar un botón o enlace de la página\",\n\t\tparameters: Type.Object({ tabId: Type.String(), ref: Type.Number() }),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\ttry {\n\t\t\t\tconst nav = await exigirNavegador();\n\t\t\t\tconst r = await nav.evaluar<{ ok: boolean; texto?: string; motivo?: string }>(\n\t\t\t\t\tString(input.tabId),\n\t\t\t\t\t`(() => {\n\t\t\t\t\t const el = (window.__adaRefs || [])[${Number(input.ref)}];\n\t\t\t\t\t if (!el) return { ok: false, motivo: 'referencia desconocida; vuelve a leer la página' };\n\t\t\t\t\t const t = (el.innerText || el.value || '').trim();\n\t\t\t\t\t el.click();\n\t\t\t\t\t return { ok: true, texto: t };\n\t\t\t\t\t})()`,\n\t\t\t\t);\n\t\t\t\tif (!r.ok) return texto(`No se pudo pulsar: ${r.motivo}`);\n\t\t\t\treturn texto(`Pulsado: ${r.texto || \"(sin texto)\"}`);\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst escribir: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"browser_type\",\n\t\tlabel: \"Escribir\",\n\t\tpromptGuidelines: guia,\n\t\tdescription:\n\t\t\t\"Escribe texto en un campo por su referencia. \" +\n\t\t\t\"Nunca escribe en campos de contraseña, token o tarjeta: eso lo hace el usuario.\",\n\t\tpromptSnippet: \"rellenar un campo de un formulario\",\n\t\tparameters: Type.Object({ tabId: Type.String(), ref: Type.Number(), texto: Type.String() }),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\ttry {\n\t\t\t\tconst nav = await exigirNavegador();\n\t\t\t\tconst tabId = String(input.tabId);\n\t\t\t\t// Se comprueba en el momento, no con lo leído antes: la página pudo\n\t\t\t\t// cambiar el campo entre la lectura y ahora.\n\t\t\t\tconst campo = await nav.evaluar<ElementoLeido | null>(\n\t\t\t\t\ttabId,\n\t\t\t\t\t`(() => {\n\t\t\t\t\t const el = (window.__adaRefs || [])[${Number(input.ref)}];\n\t\t\t\t\t if (!el) return null;\n\t\t\t\t\t return { ref: ${Number(input.ref)}, etiqueta: el.tagName.toLowerCase(), type: el.getAttribute('type') ?? undefined,\n\t\t\t\t\t name: el.getAttribute('name') ?? undefined, id: el.id || undefined,\n\t\t\t\t\t autocomplete: el.getAttribute('autocomplete') ?? undefined,\n\t\t\t\t\t placeholder: el.getAttribute('placeholder') ?? undefined,\n\t\t\t\t\t ariaLabel: el.getAttribute('aria-label') ?? undefined, texto: '' };\n\t\t\t\t\t})()`,\n\t\t\t\t);\n\t\t\t\tif (!campo) return texto(\"No se pudo escribir: referencia desconocida; vuelve a leer la página.\");\n\t\t\t\tif (esCampoSecreto(campo)) return fallo(new CampoSecretoError());\n\n\t\t\t\tawait nav.evaluar(\n\t\t\t\t\ttabId,\n\t\t\t\t\t`(() => {\n\t\t\t\t\t const el = window.__adaRefs[${Number(input.ref)}];\n\t\t\t\t\t const setter = Object.getOwnPropertyDescriptor(el.constructor.prototype, 'value')?.set;\n\t\t\t\t\t // El setter del prototipo, no el de la instancia: React sobrescribe\n\t\t\t\t\t // el de la instancia y su onChange no se enteraría del cambio.\n\t\t\t\t\t if (setter) setter.call(el, ${JSON.stringify(String(input.texto ?? \"\"))});\n\t\t\t\t\t else el.value = ${JSON.stringify(String(input.texto ?? \"\"))};\n\t\t\t\t\t el.dispatchEvent(new Event('input', { bubbles: true }));\n\t\t\t\t\t el.dispatchEvent(new Event('change', { bubbles: true }));\n\t\t\t\t\t})()`,\n\t\t\t\t);\n\t\t\t\treturn texto(`Escrito en [${Number(input.ref)}].`);\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst capturar: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"browser_screenshot\",\n\t\tlabel: \"Captura\",\n\t\tdescription: \"Captura la pestaña y devuelve la imagen.\",\n\t\tpromptSnippet: \"ver cómo se ve la página\",\n\t\tparameters: Type.Object({ tabId: Type.String() }),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\ttry {\n\t\t\t\tconst nav = await exigirNavegador();\n\t\t\t\tconst data = await nav.capturar(String(input.tabId));\n\t\t\t\treturn { content: [{ type: \"image\" as const, data, mimeType: \"image/png\" }], details: undefined };\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst viewport: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"browser_viewport\",\n\t\tlabel: \"Cambiar viewport\",\n\t\tdescription:\n\t\t\t\"Cambia el tamaño de la ventana emulada. Con movil=true, una página SIN <meta name=viewport> \" +\n\t\t\t\"usará el viewport heredado de 980 px: es lo que hace un teléfono de verdad, no un fallo.\",\n\t\tpromptSnippet: \"probar la página en otro tamaño de pantalla\",\n\t\tparameters: Type.Object({\n\t\t\ttabId: Type.String(),\n\t\t\twidth: Type.Number(),\n\t\t\theight: Type.Number(),\n\t\t\tmovil: Type.Optional(Type.Boolean()),\n\t\t}),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\ttry {\n\t\t\t\tconst nav = await exigirNavegador();\n\t\t\t\tawait nav.cambiarViewport(\n\t\t\t\t\tString(input.tabId),\n\t\t\t\t\tNumber(input.width),\n\t\t\t\t\tNumber(input.height),\n\t\t\t\t\tinput.movil === true,\n\t\t\t\t);\n\t\t\t\treturn texto(`Viewport: ${Number(input.width)}x${Number(input.height)}${input.movil ? \" (móvil)\" : \"\"}`);\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst cerrar: ToolDefinition<ReturnType<typeof Type.Object>> = {\n\t\tname: \"browser_close\",\n\t\tlabel: \"Cerrar pestaña\",\n\t\tdescription: \"Cierra una pestaña del agente.\",\n\t\tpromptSnippet: \"cerrar una pestaña que ya no hace falta\",\n\t\tparameters: Type.Object({ tabId: Type.String() }),\n\t\tasync execute(_id, input): Promise<AgentToolResult<unknown>> {\n\t\t\ttry {\n\t\t\t\tconst nav = await exigirNavegador();\n\t\t\t\tawait nav.cerrarPestaña(String(input.tabId));\n\t\t\t\treturn texto(\"Pestaña cerrada.\");\n\t\t\t} catch (error) {\n\t\t\t\treturn fallo(error);\n\t\t\t}\n\t\t},\n\t};\n\n\treturn {\n\t\tbrowser_open: abrir as ToolDefinition,\n\t\tbrowser_navigate: navegar as ToolDefinition,\n\t\tbrowser_read: leer as ToolDefinition,\n\t\tbrowser_click: pulsar as ToolDefinition,\n\t\tbrowser_type: escribir as ToolDefinition,\n\t\tbrowser_screenshot: capturar as ToolDefinition,\n\t\tbrowser_viewport: viewport as ToolDefinition,\n\t\tbrowser_close: cerrar as ToolDefinition,\n\t};\n}\n"]}