@hoilab/ada-cli 0.84.21 → 0.85.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1337) hide show
  1. package/CHANGELOG.md +49 -2
  2. package/README.es.md +174 -0
  3. package/README.md +203 -658
  4. package/dist/ada-publico.d.ts +35 -0
  5. package/dist/ada-publico.d.ts.map +1 -0
  6. package/dist/ada-publico.js +40 -0
  7. package/dist/ada-publico.js.map +1 -0
  8. package/dist/cli/args.d.ts +3 -0
  9. package/dist/cli/args.d.ts.map +1 -1
  10. package/dist/cli/args.js +11 -0
  11. package/dist/cli/args.js.map +1 -1
  12. package/dist/cli/audit-command.d.ts +15 -0
  13. package/dist/cli/audit-command.d.ts.map +1 -0
  14. package/dist/cli/audit-command.js +280 -0
  15. package/dist/cli/audit-command.js.map +1 -0
  16. package/dist/cli/banco-command.d.ts +15 -0
  17. package/dist/cli/banco-command.d.ts.map +1 -0
  18. package/dist/cli/banco-command.js +213 -0
  19. package/dist/cli/banco-command.js.map +1 -0
  20. package/dist/cli/cleanse-command.d.ts +11 -0
  21. package/dist/cli/cleanse-command.d.ts.map +1 -0
  22. package/dist/cli/cleanse-command.js +101 -0
  23. package/dist/cli/cleanse-command.js.map +1 -0
  24. package/dist/cli/commit-command.d.ts +31 -0
  25. package/dist/cli/commit-command.d.ts.map +1 -0
  26. package/dist/cli/commit-command.js +158 -0
  27. package/dist/cli/commit-command.js.map +1 -0
  28. package/dist/cli/computer-command.d.ts +12 -0
  29. package/dist/cli/computer-command.d.ts.map +1 -0
  30. package/dist/cli/computer-command.js +141 -0
  31. package/dist/cli/computer-command.js.map +1 -0
  32. package/dist/cli/discover-command.d.ts +18 -0
  33. package/dist/cli/discover-command.d.ts.map +1 -0
  34. package/dist/cli/discover-command.js +108 -0
  35. package/dist/cli/discover-command.js.map +1 -0
  36. package/dist/cli/file-processor.d.ts.map +1 -1
  37. package/dist/cli/file-processor.js +2 -1
  38. package/dist/cli/file-processor.js.map +1 -1
  39. package/dist/cli/hashline-command.d.ts +11 -0
  40. package/dist/cli/hashline-command.d.ts.map +1 -0
  41. package/dist/cli/hashline-command.js +106 -0
  42. package/dist/cli/hashline-command.js.map +1 -0
  43. package/dist/cli/home-screen.d.ts.map +1 -1
  44. package/dist/cli/home-screen.js +2 -2
  45. package/dist/cli/home-screen.js.map +1 -1
  46. package/dist/cli/import-command.d.ts +35 -0
  47. package/dist/cli/import-command.d.ts.map +1 -0
  48. package/dist/cli/import-command.js +164 -0
  49. package/dist/cli/import-command.js.map +1 -0
  50. package/dist/cli/politica-command.d.ts +20 -0
  51. package/dist/cli/politica-command.d.ts.map +1 -0
  52. package/dist/cli/politica-command.js +93 -0
  53. package/dist/cli/politica-command.js.map +1 -0
  54. package/dist/cli/refine-command.d.ts +18 -0
  55. package/dist/cli/refine-command.d.ts.map +1 -0
  56. package/dist/cli/refine-command.js +101 -0
  57. package/dist/cli/refine-command.js.map +1 -0
  58. package/dist/cli/review-command.d.ts +24 -0
  59. package/dist/cli/review-command.d.ts.map +1 -0
  60. package/dist/cli/review-command.js +168 -0
  61. package/dist/cli/review-command.js.map +1 -0
  62. package/dist/cli/schedule-command.d.ts +17 -0
  63. package/dist/cli/schedule-command.d.ts.map +1 -0
  64. package/dist/cli/schedule-command.js +117 -0
  65. package/dist/cli/schedule-command.js.map +1 -0
  66. package/dist/cli/serve-command.d.ts +72 -0
  67. package/dist/cli/serve-command.d.ts.map +1 -0
  68. package/dist/cli/serve-command.js +568 -0
  69. package/dist/cli/serve-command.js.map +1 -0
  70. package/dist/cli/startup-ui.d.ts.map +1 -1
  71. package/dist/cli/startup-ui.js +9 -3
  72. package/dist/cli/startup-ui.js.map +1 -1
  73. package/dist/cli/telegram-command.d.ts +18 -0
  74. package/dist/cli/telegram-command.d.ts.map +1 -0
  75. package/dist/cli/telegram-command.js +137 -0
  76. package/dist/cli/telegram-command.js.map +1 -0
  77. package/dist/cli/telemetria-command.d.ts +22 -0
  78. package/dist/cli/telemetria-command.d.ts.map +1 -0
  79. package/dist/cli/telemetria-command.js +127 -0
  80. package/dist/cli/telemetria-command.js.map +1 -0
  81. package/dist/cli/undo-command.d.ts +9 -0
  82. package/dist/cli/undo-command.d.ts.map +1 -0
  83. package/dist/cli/undo-command.js +56 -0
  84. package/dist/cli/undo-command.js.map +1 -0
  85. package/dist/cli/usage-command.d.ts +10 -0
  86. package/dist/cli/usage-command.d.ts.map +1 -0
  87. package/dist/cli/usage-command.js +209 -0
  88. package/dist/cli/usage-command.js.map +1 -0
  89. package/dist/cli/wiki-command.d.ts +9 -0
  90. package/dist/cli/wiki-command.d.ts.map +1 -0
  91. package/dist/cli/wiki-command.js +76 -0
  92. package/dist/cli/wiki-command.js.map +1 -0
  93. package/dist/cli.d.ts +6 -0
  94. package/dist/cli.d.ts.map +1 -1
  95. package/dist/cli.js +10 -11
  96. package/dist/cli.js.map +1 -1
  97. package/dist/config.d.ts +1 -1
  98. package/dist/config.d.ts.map +1 -1
  99. package/dist/config.js +3 -2
  100. package/dist/config.js.map +1 -1
  101. package/dist/core/ada.d.ts +58 -0
  102. package/dist/core/ada.d.ts.map +1 -0
  103. package/dist/core/ada.js +61 -0
  104. package/dist/core/ada.js.map +1 -0
  105. package/dist/core/advisor/guarda.d.ts +66 -0
  106. package/dist/core/advisor/guarda.d.ts.map +1 -0
  107. package/dist/core/advisor/guarda.js +191 -0
  108. package/dist/core/advisor/guarda.js.map +1 -0
  109. package/dist/core/advisor/runtime.d.ts +66 -0
  110. package/dist/core/advisor/runtime.d.ts.map +1 -0
  111. package/dist/core/advisor/runtime.js +121 -0
  112. package/dist/core/advisor/runtime.js.map +1 -0
  113. package/dist/core/advisor/sesion.d.ts +109 -0
  114. package/dist/core/advisor/sesion.d.ts.map +1 -0
  115. package/dist/core/advisor/sesion.js +139 -0
  116. package/dist/core/advisor/sesion.js.map +1 -0
  117. package/dist/core/agent-session.d.ts +85 -7
  118. package/dist/core/agent-session.d.ts.map +1 -1
  119. package/dist/core/agent-session.js +862 -78
  120. package/dist/core/agent-session.js.map +1 -1
  121. package/dist/core/agents/loader.d.ts +77 -0
  122. package/dist/core/agents/loader.d.ts.map +1 -0
  123. package/dist/core/agents/loader.js +154 -0
  124. package/dist/core/agents/loader.js.map +1 -0
  125. package/dist/core/aprobacion/generados.d.ts +37 -0
  126. package/dist/core/aprobacion/generados.d.ts.map +1 -0
  127. package/dist/core/aprobacion/generados.js +85 -0
  128. package/dist/core/aprobacion/generados.js.map +1 -0
  129. package/dist/core/aprobacion/politica-de-maquina.d.ts +90 -0
  130. package/dist/core/aprobacion/politica-de-maquina.d.ts.map +1 -0
  131. package/dist/core/aprobacion/politica-de-maquina.js +212 -0
  132. package/dist/core/aprobacion/politica-de-maquina.js.map +1 -0
  133. package/dist/core/aprobacion/politica.d.ts +90 -0
  134. package/dist/core/aprobacion/politica.d.ts.map +1 -0
  135. package/dist/core/aprobacion/politica.js +375 -0
  136. package/dist/core/aprobacion/politica.js.map +1 -0
  137. package/dist/core/arranque/atajos.d.ts +46 -0
  138. package/dist/core/arranque/atajos.d.ts.map +1 -0
  139. package/dist/core/arranque/atajos.js +113 -0
  140. package/dist/core/arranque/atajos.js.map +1 -0
  141. package/dist/core/audit/exportacion.d.ts +54 -0
  142. package/dist/core/audit/exportacion.d.ts.map +1 -0
  143. package/dist/core/audit/exportacion.js +265 -0
  144. package/dist/core/audit/exportacion.js.map +1 -0
  145. package/dist/core/audit/libro.d.ts +318 -0
  146. package/dist/core/audit/libro.d.ts.map +1 -0
  147. package/dist/core/audit/libro.js +508 -0
  148. package/dist/core/audit/libro.js.map +1 -0
  149. package/dist/core/audit/registro-sesion.d.ts +78 -0
  150. package/dist/core/audit/registro-sesion.d.ts.map +1 -0
  151. package/dist/core/audit/registro-sesion.js +202 -0
  152. package/dist/core/audit/registro-sesion.js.map +1 -0
  153. package/dist/core/audit/retencion.d.ts +82 -0
  154. package/dist/core/audit/retencion.d.ts.map +1 -0
  155. package/dist/core/audit/retencion.js +152 -0
  156. package/dist/core/audit/retencion.js.map +1 -0
  157. package/dist/core/audit/rutas.d.ts +23 -0
  158. package/dist/core/audit/rutas.d.ts.map +1 -0
  159. package/dist/core/audit/rutas.js +23 -0
  160. package/dist/core/audit/rutas.js.map +1 -0
  161. package/dist/core/auth-storage.d.ts +0 -3
  162. package/dist/core/auth-storage.d.ts.map +1 -1
  163. package/dist/core/auth-storage.js +21 -8
  164. package/dist/core/auth-storage.js.map +1 -1
  165. package/dist/core/banco/almacenamiento.d.ts +18 -0
  166. package/dist/core/banco/almacenamiento.d.ts.map +1 -0
  167. package/dist/core/banco/almacenamiento.js +50 -0
  168. package/dist/core/banco/almacenamiento.js.map +1 -0
  169. package/dist/core/banco/analisis.d.ts +37 -0
  170. package/dist/core/banco/analisis.d.ts.map +1 -0
  171. package/dist/core/banco/analisis.js +164 -0
  172. package/dist/core/banco/analisis.js.map +1 -0
  173. package/dist/core/banco/bloques.d.ts +39 -0
  174. package/dist/core/banco/bloques.d.ts.map +1 -0
  175. package/dist/core/banco/bloques.js +84 -0
  176. package/dist/core/banco/bloques.js.map +1 -0
  177. package/dist/core/banco/cargas.d.ts +84 -0
  178. package/dist/core/banco/cargas.d.ts.map +1 -0
  179. package/dist/core/banco/cargas.js +520 -0
  180. package/dist/core/banco/cargas.js.map +1 -0
  181. package/dist/core/banco/comparar.d.ts +29 -0
  182. package/dist/core/banco/comparar.d.ts.map +1 -0
  183. package/dist/core/banco/comparar.js +28 -0
  184. package/dist/core/banco/comparar.js.map +1 -0
  185. package/dist/core/banco/ejecutar.d.ts +44 -0
  186. package/dist/core/banco/ejecutar.d.ts.map +1 -0
  187. package/dist/core/banco/ejecutar.js +183 -0
  188. package/dist/core/banco/ejecutar.js.map +1 -0
  189. package/dist/core/banco/generar.d.ts +24 -0
  190. package/dist/core/banco/generar.d.ts.map +1 -0
  191. package/dist/core/banco/generar.js +159 -0
  192. package/dist/core/banco/generar.js.map +1 -0
  193. package/dist/core/banco/mutaciones.d.ts +25 -0
  194. package/dist/core/banco/mutaciones.d.ts.map +1 -0
  195. package/dist/core/banco/mutaciones.js +215 -0
  196. package/dist/core/banco/mutaciones.js.map +1 -0
  197. package/dist/core/banco/tipos.d.ts +121 -0
  198. package/dist/core/banco/tipos.d.ts.map +1 -0
  199. package/dist/core/banco/tipos.js +16 -0
  200. package/dist/core/banco/tipos.js.map +1 -0
  201. package/dist/core/blobs/almacen.d.ts +81 -0
  202. package/dist/core/blobs/almacen.d.ts.map +1 -0
  203. package/dist/core/blobs/almacen.js +198 -0
  204. package/dist/core/blobs/almacen.js.map +1 -0
  205. package/dist/core/blobs/broker.d.ts +103 -0
  206. package/dist/core/blobs/broker.d.ts.map +1 -0
  207. package/dist/core/blobs/broker.js +204 -0
  208. package/dist/core/blobs/broker.js.map +1 -0
  209. package/dist/core/blobs/index.d.ts +70 -0
  210. package/dist/core/blobs/index.d.ts.map +1 -0
  211. package/dist/core/blobs/index.js +232 -0
  212. package/dist/core/blobs/index.js.map +1 -0
  213. package/dist/core/blobs/payload.d.ts +55 -0
  214. package/dist/core/blobs/payload.d.ts.map +1 -0
  215. package/dist/core/blobs/payload.js +255 -0
  216. package/dist/core/blobs/payload.js.map +1 -0
  217. package/dist/core/blobs/proveedor.d.ts +85 -0
  218. package/dist/core/blobs/proveedor.d.ts.map +1 -0
  219. package/dist/core/blobs/proveedor.js +196 -0
  220. package/dist/core/blobs/proveedor.js.map +1 -0
  221. package/dist/core/browser/cdp.d.ts +41 -0
  222. package/dist/core/browser/cdp.d.ts.map +1 -0
  223. package/dist/core/browser/cdp.js +119 -0
  224. package/dist/core/browser/cdp.js.map +1 -0
  225. package/dist/core/browser/politica.d.ts +51 -0
  226. package/dist/core/browser/politica.d.ts.map +1 -0
  227. package/dist/core/browser/politica.js +123 -0
  228. package/dist/core/browser/politica.js.map +1 -0
  229. package/dist/core/browser/sesion.d.ts +52 -0
  230. package/dist/core/browser/sesion.d.ts.map +1 -0
  231. package/dist/core/browser/sesion.js +176 -0
  232. package/dist/core/browser/sesion.js.map +1 -0
  233. package/dist/core/browser/tools.d.ts +16 -0
  234. package/dist/core/browser/tools.d.ts.map +1 -0
  235. package/dist/core/browser/tools.js +279 -0
  236. package/dist/core/browser/tools.js.map +1 -0
  237. package/dist/core/commit/diff.d.ts +56 -0
  238. package/dist/core/commit/diff.d.ts.map +1 -0
  239. package/dist/core/commit/diff.js +145 -0
  240. package/dist/core/commit/diff.js.map +1 -0
  241. package/dist/core/commit/mensaje.d.ts +80 -0
  242. package/dist/core/commit/mensaje.d.ts.map +1 -0
  243. package/dist/core/commit/mensaje.js +207 -0
  244. package/dist/core/commit/mensaje.js.map +1 -0
  245. package/dist/core/compactar/index.d.ts +52 -0
  246. package/dist/core/compactar/index.d.ts.map +1 -0
  247. package/dist/core/compactar/index.js +91 -0
  248. package/dist/core/compactar/index.js.map +1 -0
  249. package/dist/core/compactar/registro-denso.d.ts +160 -0
  250. package/dist/core/compactar/registro-denso.d.ts.map +1 -0
  251. package/dist/core/compactar/registro-denso.js +620 -0
  252. package/dist/core/compactar/registro-denso.js.map +1 -0
  253. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  254. package/dist/core/compaction/branch-summarization.js +3 -0
  255. package/dist/core/compaction/branch-summarization.js.map +1 -1
  256. package/dist/core/compaction/compaction.d.ts +4 -3
  257. package/dist/core/compaction/compaction.d.ts.map +1 -1
  258. package/dist/core/compaction/compaction.js +41 -32
  259. package/dist/core/compaction/compaction.js.map +1 -1
  260. package/dist/core/computer/captura.d.ts +35 -0
  261. package/dist/core/computer/captura.d.ts.map +1 -0
  262. package/dist/core/computer/captura.js +140 -0
  263. package/dist/core/computer/captura.js.map +1 -0
  264. package/dist/core/computer/driver.d.ts +130 -0
  265. package/dist/core/computer/driver.d.ts.map +1 -0
  266. package/dist/core/computer/driver.js +206 -0
  267. package/dist/core/computer/driver.js.map +1 -0
  268. package/dist/core/computer/motor/actions.d.ts +109 -0
  269. package/dist/core/computer/motor/actions.d.ts.map +1 -0
  270. package/dist/core/computer/motor/actions.js +157 -0
  271. package/dist/core/computer/motor/actions.js.map +1 -0
  272. package/dist/core/computer/motor/bridge.d.ts +232 -0
  273. package/dist/core/computer/motor/bridge.d.ts.map +1 -0
  274. package/dist/core/computer/motor/bridge.js +2335 -0
  275. package/dist/core/computer/motor/bridge.js.map +1 -0
  276. package/dist/core/computer/motor/cdp.d.ts +107 -0
  277. package/dist/core/computer/motor/cdp.d.ts.map +1 -0
  278. package/dist/core/computer/motor/cdp.js +659 -0
  279. package/dist/core/computer/motor/cdp.js.map +1 -0
  280. package/dist/core/computer/motor/config.d.ts +23 -0
  281. package/dist/core/computer/motor/config.d.ts.map +1 -0
  282. package/dist/core/computer/motor/config.js +100 -0
  283. package/dist/core/computer/motor/config.js.map +1 -0
  284. package/dist/core/computer/motor/contract.d.ts +81 -0
  285. package/dist/core/computer/motor/contract.d.ts.map +1 -0
  286. package/dist/core/computer/motor/contract.js +14 -0
  287. package/dist/core/computer/motor/contract.js.map +1 -0
  288. package/dist/core/computer/motor/note.d.ts +37 -0
  289. package/dist/core/computer/motor/note.d.ts.map +1 -0
  290. package/dist/core/computer/motor/note.js +162 -0
  291. package/dist/core/computer/motor/note.js.map +1 -0
  292. package/dist/core/computer/motor/outline.d.ts +155 -0
  293. package/dist/core/computer/motor/outline.d.ts.map +1 -0
  294. package/dist/core/computer/motor/outline.js +590 -0
  295. package/dist/core/computer/motor/outline.js.map +1 -0
  296. package/dist/core/computer/motor/output.d.ts +18 -0
  297. package/dist/core/computer/motor/output.d.ts.map +1 -0
  298. package/dist/core/computer/motor/output.js +148 -0
  299. package/dist/core/computer/motor/output.js.map +1 -0
  300. package/dist/core/computer/motor/permissions.d.ts +41 -0
  301. package/dist/core/computer/motor/permissions.d.ts.map +1 -0
  302. package/dist/core/computer/motor/permissions.js +51 -0
  303. package/dist/core/computer/motor/permissions.js.map +1 -0
  304. package/dist/core/computer/motor/platform/architecture.d.ts +5 -0
  305. package/dist/core/computer/motor/platform/architecture.d.ts.map +1 -0
  306. package/dist/core/computer/motor/platform/architecture.js +21 -0
  307. package/dist/core/computer/motor/platform/architecture.js.map +1 -0
  308. package/dist/core/computer/motor/platform/coerce.d.ts +4 -0
  309. package/dist/core/computer/motor/platform/coerce.d.ts.map +1 -0
  310. package/dist/core/computer/motor/platform/coerce.js +17 -0
  311. package/dist/core/computer/motor/platform/coerce.js.map +1 -0
  312. package/dist/core/computer/motor/platform/index.d.ts +4 -0
  313. package/dist/core/computer/motor/platform/index.d.ts.map +1 -0
  314. package/dist/core/computer/motor/platform/index.js +79 -0
  315. package/dist/core/computer/motor/platform/index.js.map +1 -0
  316. package/dist/core/computer/motor/platform/linux/backend.d.ts +3 -0
  317. package/dist/core/computer/motor/platform/linux/backend.d.ts.map +1 -0
  318. package/dist/core/computer/motor/platform/linux/backend.js +173 -0
  319. package/dist/core/computer/motor/platform/linux/backend.js.map +1 -0
  320. package/dist/core/computer/motor/platform/linux/helper.d.ts +29 -0
  321. package/dist/core/computer/motor/platform/linux/helper.d.ts.map +1 -0
  322. package/dist/core/computer/motor/platform/linux/helper.js +261 -0
  323. package/dist/core/computer/motor/platform/linux/helper.js.map +1 -0
  324. package/dist/core/computer/motor/platform/macos/backend.d.ts +3 -0
  325. package/dist/core/computer/motor/platform/macos/backend.d.ts.map +1 -0
  326. package/dist/core/computer/motor/platform/macos/backend.js +124 -0
  327. package/dist/core/computer/motor/platform/macos/backend.js.map +1 -0
  328. package/dist/core/computer/motor/platform/macos/browser.d.ts +7 -0
  329. package/dist/core/computer/motor/platform/macos/browser.d.ts.map +1 -0
  330. package/dist/core/computer/motor/platform/macos/browser.js +101 -0
  331. package/dist/core/computer/motor/platform/macos/browser.js.map +1 -0
  332. package/dist/core/computer/motor/platform/macos/helper-path.mjs +34 -0
  333. package/dist/core/computer/motor/platform/macos/helper.d.ts +32 -0
  334. package/dist/core/computer/motor/platform/macos/helper.d.ts.map +1 -0
  335. package/dist/core/computer/motor/platform/macos/helper.js +277 -0
  336. package/dist/core/computer/motor/platform/macos/helper.js.map +1 -0
  337. package/dist/core/computer/motor/platform/macos/permissions.d.ts +4 -0
  338. package/dist/core/computer/motor/platform/macos/permissions.d.ts.map +1 -0
  339. package/dist/core/computer/motor/platform/macos/permissions.js +118 -0
  340. package/dist/core/computer/motor/platform/macos/permissions.js.map +1 -0
  341. package/dist/core/computer/motor/platform/types.d.ts +263 -0
  342. package/dist/core/computer/motor/platform/types.d.ts.map +1 -0
  343. package/dist/core/computer/motor/platform/types.js +2 -0
  344. package/dist/core/computer/motor/platform/types.js.map +1 -0
  345. package/dist/core/computer/motor/platform/windows/backend.d.ts +3 -0
  346. package/dist/core/computer/motor/platform/windows/backend.d.ts.map +1 -0
  347. package/dist/core/computer/motor/platform/windows/backend.js +163 -0
  348. package/dist/core/computer/motor/platform/windows/backend.js.map +1 -0
  349. package/dist/core/computer/motor/platform/windows/helper.d.ts +18 -0
  350. package/dist/core/computer/motor/platform/windows/helper.d.ts.map +1 -0
  351. package/dist/core/computer/motor/platform/windows/helper.js +174 -0
  352. package/dist/core/computer/motor/platform/windows/helper.js.map +1 -0
  353. package/dist/core/computer/motor/root-selection.d.ts +6 -0
  354. package/dist/core/computer/motor/root-selection.d.ts.map +1 -0
  355. package/dist/core/computer/motor/root-selection.js +28 -0
  356. package/dist/core/computer/motor/root-selection.js.map +1 -0
  357. package/dist/core/computer/motor/runtime.d.ts +50 -0
  358. package/dist/core/computer/motor/runtime.d.ts.map +1 -0
  359. package/dist/core/computer/motor/runtime.js +119 -0
  360. package/dist/core/computer/motor/runtime.js.map +1 -0
  361. package/dist/core/computer/motor/state.d.ts +68 -0
  362. package/dist/core/computer/motor/state.d.ts.map +1 -0
  363. package/dist/core/computer/motor/state.js +100 -0
  364. package/dist/core/computer/motor/state.js.map +1 -0
  365. package/dist/core/computer/motor/view.d.ts +6 -0
  366. package/dist/core/computer/motor/view.d.ts.map +1 -0
  367. package/dist/core/computer/motor/view.js +185 -0
  368. package/dist/core/computer/motor/view.js.map +1 -0
  369. package/dist/core/computer/motor-ada.d.ts +159 -0
  370. package/dist/core/computer/motor-ada.d.ts.map +1 -0
  371. package/dist/core/computer/motor-ada.js +412 -0
  372. package/dist/core/computer/motor-ada.js.map +1 -0
  373. package/dist/core/computer/politica.d.ts +56 -0
  374. package/dist/core/computer/politica.d.ts.map +1 -0
  375. package/dist/core/computer/politica.js +163 -0
  376. package/dist/core/computer/politica.js.map +1 -0
  377. package/dist/core/computer/tools.d.ts +26 -0
  378. package/dist/core/computer/tools.d.ts.map +1 -0
  379. package/dist/core/computer/tools.js +399 -0
  380. package/dist/core/computer/tools.js.map +1 -0
  381. package/dist/core/context-breakdown.d.ts +80 -0
  382. package/dist/core/context-breakdown.d.ts.map +1 -0
  383. package/dist/core/context-breakdown.js +87 -0
  384. package/dist/core/context-breakdown.js.map +1 -0
  385. package/dist/core/credenciales/cliente.d.ts +60 -0
  386. package/dist/core/credenciales/cliente.d.ts.map +1 -0
  387. package/dist/core/credenciales/cliente.js +81 -0
  388. package/dist/core/credenciales/cliente.js.map +1 -0
  389. package/dist/core/credenciales/pool.d.ts +96 -0
  390. package/dist/core/credenciales/pool.d.ts.map +1 -0
  391. package/dist/core/credenciales/pool.js +128 -0
  392. package/dist/core/credenciales/pool.js.map +1 -0
  393. package/dist/core/credenciales/reposo.d.ts +93 -0
  394. package/dist/core/credenciales/reposo.d.ts.map +1 -0
  395. package/dist/core/credenciales/reposo.js +489 -0
  396. package/dist/core/credenciales/reposo.js.map +1 -0
  397. package/dist/core/credenciales/servidor.d.ts +55 -0
  398. package/dist/core/credenciales/servidor.d.ts.map +1 -0
  399. package/dist/core/credenciales/servidor.js +205 -0
  400. package/dist/core/credenciales/servidor.js.map +1 -0
  401. package/dist/core/defaults.d.ts +1 -0
  402. package/dist/core/defaults.d.ts.map +1 -1
  403. package/dist/core/defaults.js +9 -0
  404. package/dist/core/defaults.js.map +1 -1
  405. package/dist/core/descubrimiento/comandos.d.ts +30 -0
  406. package/dist/core/descubrimiento/comandos.d.ts.map +1 -0
  407. package/dist/core/descubrimiento/comandos.js +76 -0
  408. package/dist/core/descubrimiento/comandos.js.map +1 -0
  409. package/dist/core/descubrimiento/mcp.d.ts +42 -0
  410. package/dist/core/descubrimiento/mcp.d.ts.map +1 -0
  411. package/dist/core/descubrimiento/mcp.js +130 -0
  412. package/dist/core/descubrimiento/mcp.js.map +1 -0
  413. package/dist/core/descubrimiento/reglas.d.ts +61 -0
  414. package/dist/core/descubrimiento/reglas.d.ts.map +1 -0
  415. package/dist/core/descubrimiento/reglas.js +134 -0
  416. package/dist/core/descubrimiento/reglas.js.map +1 -0
  417. package/dist/core/descubrimiento/skills.d.ts +57 -0
  418. package/dist/core/descubrimiento/skills.d.ts.map +1 -0
  419. package/dist/core/descubrimiento/skills.js +113 -0
  420. package/dist/core/descubrimiento/skills.js.map +1 -0
  421. package/dist/core/dificultad/clasificador.d.ts +133 -0
  422. package/dist/core/dificultad/clasificador.d.ts.map +1 -0
  423. package/dist/core/dificultad/clasificador.js +288 -0
  424. package/dist/core/dificultad/clasificador.js.map +1 -0
  425. package/dist/core/edicion/diario.d.ts +37 -0
  426. package/dist/core/edicion/diario.d.ts.map +1 -0
  427. package/dist/core/edicion/diario.js +51 -0
  428. package/dist/core/edicion/diario.js.map +1 -0
  429. package/dist/core/edicion/hashline.d.ts +71 -0
  430. package/dist/core/edicion/hashline.d.ts.map +1 -0
  431. package/dist/core/edicion/hashline.js +111 -0
  432. package/dist/core/edicion/hashline.js.map +1 -0
  433. package/dist/core/edicion/hueco.d.ts +64 -0
  434. package/dist/core/edicion/hueco.d.ts.map +1 -0
  435. package/dist/core/edicion/hueco.js +162 -0
  436. package/dist/core/edicion/hueco.js.map +1 -0
  437. package/dist/core/edicion/limpiar-carga.d.ts +39 -0
  438. package/dist/core/edicion/limpiar-carga.d.ts.map +1 -0
  439. package/dist/core/edicion/limpiar-carga.js +121 -0
  440. package/dist/core/edicion/limpiar-carga.js.map +1 -0
  441. package/dist/core/edicion/observador.d.ts +80 -0
  442. package/dist/core/edicion/observador.d.ts.map +1 -0
  443. package/dist/core/edicion/observador.js +183 -0
  444. package/dist/core/edicion/observador.js.map +1 -0
  445. package/dist/core/edicion/parecido.d.ts +53 -0
  446. package/dist/core/edicion/parecido.d.ts.map +1 -0
  447. package/dist/core/edicion/parecido.js +145 -0
  448. package/dist/core/edicion/parecido.js.map +1 -0
  449. package/dist/core/edicion/parseo.d.ts +58 -0
  450. package/dist/core/edicion/parseo.d.ts.map +1 -0
  451. package/dist/core/edicion/parseo.js +124 -0
  452. package/dist/core/edicion/parseo.js.map +1 -0
  453. package/dist/core/edicion/reparacion.d.ts +67 -0
  454. package/dist/core/edicion/reparacion.d.ts.map +1 -0
  455. package/dist/core/edicion/reparacion.js +202 -0
  456. package/dist/core/edicion/reparacion.js.map +1 -0
  457. package/dist/core/edicion/sangria.d.ts +121 -0
  458. package/dist/core/edicion/sangria.d.ts.map +1 -0
  459. package/dist/core/edicion/sangria.js +341 -0
  460. package/dist/core/edicion/sangria.js.map +1 -0
  461. package/dist/core/edicion/tipos.d.ts +58 -0
  462. package/dist/core/edicion/tipos.d.ts.map +1 -0
  463. package/dist/core/edicion/tipos.js +160 -0
  464. package/dist/core/edicion/tipos.js.map +1 -0
  465. package/dist/core/engine-personality.d.ts +12 -0
  466. package/dist/core/engine-personality.d.ts.map +1 -0
  467. package/dist/core/engine-personality.js +53 -0
  468. package/dist/core/engine-personality.js.map +1 -0
  469. package/dist/core/errores/proveedor.d.ts +53 -0
  470. package/dist/core/errores/proveedor.d.ts.map +1 -0
  471. package/dist/core/errores/proveedor.js +191 -0
  472. package/dist/core/errores/proveedor.js.map +1 -0
  473. package/dist/core/estructural/buscar.d.ts +61 -0
  474. package/dist/core/estructural/buscar.d.ts.map +1 -0
  475. package/dist/core/estructural/buscar.js +261 -0
  476. package/dist/core/estructural/buscar.js.map +1 -0
  477. package/dist/core/estructural/editar.d.ts +36 -0
  478. package/dist/core/estructural/editar.d.ts.map +1 -0
  479. package/dist/core/estructural/editar.js +123 -0
  480. package/dist/core/estructural/editar.js.map +1 -0
  481. package/dist/core/estructural/tools.d.ts +11 -0
  482. package/dist/core/estructural/tools.d.ts.map +1 -0
  483. package/dist/core/estructural/tools.js +100 -0
  484. package/dist/core/estructural/tools.js.map +1 -0
  485. package/dist/core/experimental.d.ts.map +1 -1
  486. package/dist/core/experimental.js +10 -1
  487. package/dist/core/experimental.js.map +1 -1
  488. package/dist/core/extensiones/suplantacion.d.ts +49 -0
  489. package/dist/core/extensiones/suplantacion.d.ts.map +1 -0
  490. package/dist/core/extensiones/suplantacion.js +61 -0
  491. package/dist/core/extensiones/suplantacion.js.map +1 -0
  492. package/dist/core/extensiones/vigilancia.d.ts +54 -0
  493. package/dist/core/extensiones/vigilancia.d.ts.map +1 -0
  494. package/dist/core/extensiones/vigilancia.js +217 -0
  495. package/dist/core/extensiones/vigilancia.js.map +1 -0
  496. package/dist/core/extensions/index.d.ts +1 -1
  497. package/dist/core/extensions/index.d.ts.map +1 -1
  498. package/dist/core/extensions/index.js.map +1 -1
  499. package/dist/core/extensions/loader.d.ts.map +1 -1
  500. package/dist/core/extensions/loader.js +21 -6
  501. package/dist/core/extensions/loader.js.map +1 -1
  502. package/dist/core/extensions/types.d.ts +23 -4
  503. package/dist/core/extensions/types.d.ts.map +1 -1
  504. package/dist/core/extensions/types.js.map +1 -1
  505. package/dist/core/harness/fuentes-de-contexto.d.ts +29 -0
  506. package/dist/core/harness/fuentes-de-contexto.d.ts.map +1 -0
  507. package/dist/core/harness/fuentes-de-contexto.js +44 -0
  508. package/dist/core/harness/fuentes-de-contexto.js.map +1 -0
  509. package/dist/core/harness/refine.d.ts +40 -0
  510. package/dist/core/harness/refine.d.ts.map +1 -0
  511. package/dist/core/harness/refine.js +109 -0
  512. package/dist/core/harness/refine.js.map +1 -0
  513. package/dist/core/harness/store.d.ts +75 -0
  514. package/dist/core/harness/store.d.ts.map +1 -0
  515. package/dist/core/harness/store.js +149 -0
  516. package/dist/core/harness/store.js.map +1 -0
  517. package/dist/core/hooks/contract.d.ts +85 -0
  518. package/dist/core/hooks/contract.d.ts.map +1 -0
  519. package/dist/core/hooks/contract.js +140 -0
  520. package/dist/core/hooks/contract.js.map +1 -0
  521. package/dist/core/hooks/runner.d.ts +42 -0
  522. package/dist/core/hooks/runner.d.ts.map +1 -0
  523. package/dist/core/hooks/runner.js +85 -0
  524. package/dist/core/hooks/runner.js.map +1 -0
  525. package/dist/core/hooks/session-hooks.d.ts +62 -0
  526. package/dist/core/hooks/session-hooks.d.ts.map +1 -0
  527. package/dist/core/hooks/session-hooks.js +84 -0
  528. package/dist/core/hooks/session-hooks.js.map +1 -0
  529. package/dist/core/importar/formatos.d.ts +69 -0
  530. package/dist/core/importar/formatos.d.ts.map +1 -0
  531. package/dist/core/importar/formatos.js +235 -0
  532. package/dist/core/importar/formatos.js.map +1 -0
  533. package/dist/core/interactivo/deteccion.d.ts +44 -0
  534. package/dist/core/interactivo/deteccion.d.ts.map +1 -0
  535. package/dist/core/interactivo/deteccion.js +82 -0
  536. package/dist/core/interactivo/deteccion.js.map +1 -0
  537. package/dist/core/interactivo/sesion.d.ts +50 -0
  538. package/dist/core/interactivo/sesion.d.ts.map +1 -0
  539. package/dist/core/interactivo/sesion.js +156 -0
  540. package/dist/core/interactivo/sesion.js.map +1 -0
  541. package/dist/core/interactivo/tools.d.ts +21 -0
  542. package/dist/core/interactivo/tools.d.ts.map +1 -0
  543. package/dist/core/interactivo/tools.js +122 -0
  544. package/dist/core/interactivo/tools.js.map +1 -0
  545. package/dist/core/keybindings.d.ts.map +1 -1
  546. package/dist/core/keybindings.js +2 -1
  547. package/dist/core/keybindings.js.map +1 -1
  548. package/dist/core/lectura/mapa.d.ts +70 -0
  549. package/dist/core/lectura/mapa.d.ts.map +1 -0
  550. package/dist/core/lectura/mapa.js +177 -0
  551. package/dist/core/lectura/mapa.js.map +1 -0
  552. package/dist/core/lectura/pdf.d.ts +49 -0
  553. package/dist/core/lectura/pdf.d.ts.map +1 -0
  554. package/dist/core/lectura/pdf.js +337 -0
  555. package/dist/core/lectura/pdf.js.map +1 -0
  556. package/dist/core/limpieza/comprobadores.d.ts +28 -0
  557. package/dist/core/limpieza/comprobadores.d.ts.map +1 -0
  558. package/dist/core/limpieza/comprobadores.js +311 -0
  559. package/dist/core/limpieza/comprobadores.js.map +1 -0
  560. package/dist/core/limpieza/parseo.d.ts +19 -0
  561. package/dist/core/limpieza/parseo.d.ts.map +1 -0
  562. package/dist/core/limpieza/parseo.js +124 -0
  563. package/dist/core/limpieza/parseo.js.map +1 -0
  564. package/dist/core/limpieza/reparacion.d.ts +77 -0
  565. package/dist/core/limpieza/reparacion.d.ts.map +1 -0
  566. package/dist/core/limpieza/reparacion.js +254 -0
  567. package/dist/core/limpieza/reparacion.js.map +1 -0
  568. package/dist/core/limpieza/tipos.d.ts +56 -0
  569. package/dist/core/limpieza/tipos.d.ts.map +1 -0
  570. package/dist/core/limpieza/tipos.js +9 -0
  571. package/dist/core/limpieza/tipos.js.map +1 -0
  572. package/dist/core/lsp/cliente.d.ts +52 -0
  573. package/dist/core/lsp/cliente.d.ts.map +1 -0
  574. package/dist/core/lsp/cliente.js +232 -0
  575. package/dist/core/lsp/cliente.js.map +1 -0
  576. package/dist/core/lsp/descubrimiento.d.ts +62 -0
  577. package/dist/core/lsp/descubrimiento.d.ts.map +1 -0
  578. package/dist/core/lsp/descubrimiento.js +152 -0
  579. package/dist/core/lsp/descubrimiento.js.map +1 -0
  580. package/dist/core/lsp/ediciones.d.ts +59 -0
  581. package/dist/core/lsp/ediciones.d.ts.map +1 -0
  582. package/dist/core/lsp/ediciones.js +89 -0
  583. package/dist/core/lsp/ediciones.js.map +1 -0
  584. package/dist/core/lsp/extension.d.ts +28 -0
  585. package/dist/core/lsp/extension.d.ts.map +1 -0
  586. package/dist/core/lsp/extension.js +34 -0
  587. package/dist/core/lsp/extension.js.map +1 -0
  588. package/dist/core/lsp/tools.d.ts +45 -0
  589. package/dist/core/lsp/tools.d.ts.map +1 -0
  590. package/dist/core/lsp/tools.js +265 -0
  591. package/dist/core/lsp/tools.js.map +1 -0
  592. package/dist/core/mcp/client.d.ts +60 -0
  593. package/dist/core/mcp/client.d.ts.map +1 -0
  594. package/dist/core/mcp/client.js +139 -0
  595. package/dist/core/mcp/client.js.map +1 -0
  596. package/dist/core/mcp/manager.d.ts +86 -0
  597. package/dist/core/mcp/manager.d.ts.map +1 -0
  598. package/dist/core/mcp/manager.js +124 -0
  599. package/dist/core/mcp/manager.js.map +1 -0
  600. package/dist/core/mcp/tools.d.ts +15 -0
  601. package/dist/core/mcp/tools.d.ts.map +1 -0
  602. package/dist/core/mcp/tools.js +84 -0
  603. package/dist/core/mcp/tools.js.map +1 -0
  604. package/dist/core/memory-engine/audit-export.d.ts +56 -0
  605. package/dist/core/memory-engine/audit-export.d.ts.map +1 -0
  606. package/dist/core/memory-engine/audit-export.js +100 -0
  607. package/dist/core/memory-engine/audit-export.js.map +1 -0
  608. package/dist/core/memory-engine/audit-indice.d.ts +153 -0
  609. package/dist/core/memory-engine/audit-indice.d.ts.map +1 -0
  610. package/dist/core/memory-engine/audit-indice.js +271 -0
  611. package/dist/core/memory-engine/audit-indice.js.map +1 -0
  612. package/dist/core/memory-engine/audit.d.ts +18 -6
  613. package/dist/core/memory-engine/audit.d.ts.map +1 -1
  614. package/dist/core/memory-engine/audit.js +32 -50
  615. package/dist/core/memory-engine/audit.js.map +1 -1
  616. package/dist/core/memory-engine/engine.d.ts +21 -4
  617. package/dist/core/memory-engine/engine.d.ts.map +1 -1
  618. package/dist/core/memory-engine/engine.js +219 -55
  619. package/dist/core/memory-engine/engine.js.map +1 -1
  620. package/dist/core/memory-engine/inverted-index.d.ts.map +1 -1
  621. package/dist/core/memory-engine/inverted-index.js +67 -10
  622. package/dist/core/memory-engine/inverted-index.js.map +1 -1
  623. package/dist/core/memory-engine/keychain.d.ts.map +1 -1
  624. package/dist/core/memory-engine/keychain.js +1 -6
  625. package/dist/core/memory-engine/keychain.js.map +1 -1
  626. package/dist/core/memory-engine/observation-store.d.ts +0 -1
  627. package/dist/core/memory-engine/observation-store.d.ts.map +1 -1
  628. package/dist/core/memory-engine/observation-store.js +40 -12
  629. package/dist/core/memory-engine/observation-store.js.map +1 -1
  630. package/dist/core/memory-engine/refinements.d.ts +51 -0
  631. package/dist/core/memory-engine/refinements.d.ts.map +1 -0
  632. package/dist/core/memory-engine/refinements.js +99 -0
  633. package/dist/core/memory-engine/refinements.js.map +1 -0
  634. package/dist/core/memory-engine/scanner.d.ts.map +1 -1
  635. package/dist/core/memory-engine/scanner.js +25 -5
  636. package/dist/core/memory-engine/scanner.js.map +1 -1
  637. package/dist/core/memory-engine/security.d.ts.map +1 -1
  638. package/dist/core/memory-engine/security.js +131 -23
  639. package/dist/core/memory-engine/security.js.map +1 -1
  640. package/dist/core/memory-engine/session-indexer.d.ts.map +1 -1
  641. package/dist/core/memory-engine/session-indexer.js +8 -2
  642. package/dist/core/memory-engine/session-indexer.js.map +1 -1
  643. package/dist/core/memory-engine/tools.d.ts +2 -2
  644. package/dist/core/memory-engine/tools.d.ts.map +1 -1
  645. package/dist/core/memory-engine/tools.js +41 -8
  646. package/dist/core/memory-engine/tools.js.map +1 -1
  647. package/dist/core/memory-engine/types.d.ts +2 -0
  648. package/dist/core/memory-engine/types.d.ts.map +1 -1
  649. package/dist/core/memory-engine/types.js.map +1 -1
  650. package/dist/core/memory-engine/vault.d.ts.map +1 -1
  651. package/dist/core/memory-engine/vault.js +2 -2
  652. package/dist/core/memory-engine/vault.js.map +1 -1
  653. package/dist/core/model-config.d.ts.map +1 -1
  654. package/dist/core/model-config.js +2 -1
  655. package/dist/core/model-config.js.map +1 -1
  656. package/dist/core/model-resolver.d.ts +1 -0
  657. package/dist/core/model-resolver.d.ts.map +1 -1
  658. package/dist/core/model-resolver.js +19 -7
  659. package/dist/core/model-resolver.js.map +1 -1
  660. package/dist/core/models-store.d.ts.map +1 -1
  661. package/dist/core/models-store.js +2 -1
  662. package/dist/core/models-store.js.map +1 -1
  663. package/dist/core/muestreo-restringido.d.ts +49 -0
  664. package/dist/core/muestreo-restringido.d.ts.map +1 -0
  665. package/dist/core/muestreo-restringido.js +65 -0
  666. package/dist/core/muestreo-restringido.js.map +1 -0
  667. package/dist/core/orphan-process-journal.d.ts +48 -0
  668. package/dist/core/orphan-process-journal.d.ts.map +1 -0
  669. package/dist/core/orphan-process-journal.js +116 -0
  670. package/dist/core/orphan-process-journal.js.map +1 -0
  671. package/dist/core/package-manager.d.ts.map +1 -1
  672. package/dist/core/package-manager.js +11 -6
  673. package/dist/core/package-manager.js.map +1 -1
  674. package/dist/core/pi-manifest.d.ts.map +1 -1
  675. package/dist/core/pi-manifest.js +2 -1
  676. package/dist/core/pi-manifest.js.map +1 -1
  677. package/dist/core/privacidad/categorias-especiales.d.ts +186 -0
  678. package/dist/core/privacidad/categorias-especiales.d.ts.map +1 -0
  679. package/dist/core/privacidad/categorias-especiales.js +745 -0
  680. package/dist/core/privacidad/categorias-especiales.js.map +1 -0
  681. package/dist/core/privacidad/tapar.d.ts +48 -0
  682. package/dist/core/privacidad/tapar.d.ts.map +1 -0
  683. package/dist/core/privacidad/tapar.js +66 -0
  684. package/dist/core/privacidad/tapar.js.map +1 -0
  685. package/dist/core/prompt-cache/diagnostics.d.ts +33 -0
  686. package/dist/core/prompt-cache/diagnostics.d.ts.map +1 -0
  687. package/dist/core/prompt-cache/diagnostics.js +100 -0
  688. package/dist/core/prompt-cache/diagnostics.js.map +1 -0
  689. package/dist/core/prompt-cache/index.d.ts +33 -0
  690. package/dist/core/prompt-cache/index.d.ts.map +1 -0
  691. package/dist/core/prompt-cache/index.js +189 -0
  692. package/dist/core/prompt-cache/index.js.map +1 -0
  693. package/dist/core/prompt-cache/payload.d.ts +58 -0
  694. package/dist/core/prompt-cache/payload.d.ts.map +1 -0
  695. package/dist/core/prompt-cache/payload.js +122 -0
  696. package/dist/core/prompt-cache/payload.js.map +1 -0
  697. package/dist/core/prompt-cache/stabilize.d.ts +65 -0
  698. package/dist/core/prompt-cache/stabilize.d.ts.map +1 -0
  699. package/dist/core/prompt-cache/stabilize.js +137 -0
  700. package/dist/core/prompt-cache/stabilize.js.map +1 -0
  701. package/dist/core/prompt-cache/stats.d.ts +55 -0
  702. package/dist/core/prompt-cache/stats.d.ts.map +1 -0
  703. package/dist/core/prompt-cache/stats.js +158 -0
  704. package/dist/core/prompt-cache/stats.js.map +1 -0
  705. package/dist/core/prompt-eleccion.d.ts +38 -0
  706. package/dist/core/prompt-eleccion.d.ts.map +1 -0
  707. package/dist/core/prompt-eleccion.js +46 -0
  708. package/dist/core/prompt-eleccion.js.map +1 -0
  709. package/dist/core/prompt-optimizer.d.ts +53 -0
  710. package/dist/core/prompt-optimizer.d.ts.map +1 -0
  711. package/dist/core/prompt-optimizer.js +138 -0
  712. package/dist/core/prompt-optimizer.js.map +1 -0
  713. package/dist/core/prompts/montar.d.ts +75 -0
  714. package/dist/core/prompts/montar.d.ts.map +1 -0
  715. package/dist/core/prompts/montar.js +146 -0
  716. package/dist/core/prompts/montar.js.map +1 -0
  717. package/dist/core/prompts/plantilla.d.ts +54 -0
  718. package/dist/core/prompts/plantilla.d.ts.map +1 -0
  719. package/dist/core/prompts/plantilla.js +153 -0
  720. package/dist/core/prompts/plantilla.js.map +1 -0
  721. package/dist/core/prompts/sistema.md +134 -0
  722. package/dist/core/provider-attribution.d.ts +24 -2
  723. package/dist/core/provider-attribution.d.ts.map +1 -1
  724. package/dist/core/provider-attribution.js +24 -42
  725. package/dist/core/provider-attribution.js.map +1 -1
  726. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  727. package/dist/core/remote-catalog-provider.js +2 -1
  728. package/dist/core/remote-catalog-provider.js.map +1 -1
  729. package/dist/core/remoto/destino.d.ts +38 -0
  730. package/dist/core/remoto/destino.d.ts.map +1 -0
  731. package/dist/core/remoto/destino.js +105 -0
  732. package/dist/core/remoto/destino.js.map +1 -0
  733. package/dist/core/remoto/ejecutor.d.ts +59 -0
  734. package/dist/core/remoto/ejecutor.d.ts.map +1 -0
  735. package/dist/core/remoto/ejecutor.js +225 -0
  736. package/dist/core/remoto/ejecutor.js.map +1 -0
  737. package/dist/core/remoto/ficheros.d.ts +29 -0
  738. package/dist/core/remoto/ficheros.d.ts.map +1 -0
  739. package/dist/core/remoto/ficheros.js +90 -0
  740. package/dist/core/remoto/ficheros.js.map +1 -0
  741. package/dist/core/remoto/registro-extension.d.ts +15 -0
  742. package/dist/core/remoto/registro-extension.d.ts.map +1 -0
  743. package/dist/core/remoto/registro-extension.js +17 -0
  744. package/dist/core/remoto/registro-extension.js.map +1 -0
  745. package/dist/core/remoto/tools.d.ts +28 -0
  746. package/dist/core/remoto/tools.d.ts.map +1 -0
  747. package/dist/core/remoto/tools.js +31 -0
  748. package/dist/core/remoto/tools.js.map +1 -0
  749. package/dist/core/resource-loader.d.ts +58 -0
  750. package/dist/core/resource-loader.d.ts.map +1 -1
  751. package/dist/core/resource-loader.js +326 -8
  752. package/dist/core/resource-loader.js.map +1 -1
  753. package/dist/core/revision/hallazgo.d.ts +51 -0
  754. package/dist/core/revision/hallazgo.d.ts.map +1 -0
  755. package/dist/core/revision/hallazgo.js +73 -0
  756. package/dist/core/revision/hallazgo.js.map +1 -0
  757. package/dist/core/revision/revisor.d.ts +81 -0
  758. package/dist/core/revision/revisor.d.ts.map +1 -0
  759. package/dist/core/revision/revisor.js +132 -0
  760. package/dist/core/revision/revisor.js.map +1 -0
  761. package/dist/core/revision/sarif.d.ts +30 -0
  762. package/dist/core/revision/sarif.d.ts.map +1 -0
  763. package/dist/core/revision/sarif.js +83 -0
  764. package/dist/core/revision/sarif.js.map +1 -0
  765. package/dist/core/scheduler/scheduler.d.ts +87 -0
  766. package/dist/core/scheduler/scheduler.d.ts.map +1 -0
  767. package/dist/core/scheduler/scheduler.js +178 -0
  768. package/dist/core/scheduler/scheduler.js.map +1 -0
  769. package/dist/core/sdk.d.ts +8 -0
  770. package/dist/core/sdk.d.ts.map +1 -1
  771. package/dist/core/sdk.js +11 -1
  772. package/dist/core/sdk.js.map +1 -1
  773. package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts +49 -0
  774. package/dist/core/sesion/cerrar-llamadas-abiertas.d.ts.map +1 -0
  775. package/dist/core/sesion/cerrar-llamadas-abiertas.js +77 -0
  776. package/dist/core/sesion/cerrar-llamadas-abiertas.js.map +1 -0
  777. package/dist/core/session-manager.d.ts.map +1 -1
  778. package/dist/core/session-manager.js +2 -1
  779. package/dist/core/session-manager.js.map +1 -1
  780. package/dist/core/settings-diagnostics.d.ts +9 -0
  781. package/dist/core/settings-diagnostics.d.ts.map +1 -0
  782. package/dist/core/settings-diagnostics.js +21 -0
  783. package/dist/core/settings-diagnostics.js.map +1 -0
  784. package/dist/core/settings-manager.d.ts +156 -0
  785. package/dist/core/settings-manager.d.ts.map +1 -1
  786. package/dist/core/settings-manager.js +255 -10
  787. package/dist/core/settings-manager.js.map +1 -1
  788. package/dist/core/skills.d.ts.map +1 -1
  789. package/dist/core/skills.js +51 -33
  790. package/dist/core/skills.js.map +1 -1
  791. package/dist/core/slash-commands.d.ts.map +1 -1
  792. package/dist/core/slash-commands.js +2 -1
  793. package/dist/core/slash-commands.js.map +1 -1
  794. package/dist/core/system-prompt.d.ts +17 -0
  795. package/dist/core/system-prompt.d.ts.map +1 -1
  796. package/dist/core/system-prompt.js +13 -5
  797. package/dist/core/system-prompt.js.map +1 -1
  798. package/dist/core/telemetria/otlp.d.ts +122 -0
  799. package/dist/core/telemetria/otlp.d.ts.map +1 -0
  800. package/dist/core/telemetria/otlp.js +373 -0
  801. package/dist/core/telemetria/otlp.js.map +1 -0
  802. package/dist/core/tools/coercion-argumentos.d.ts +48 -0
  803. package/dist/core/tools/coercion-argumentos.d.ts.map +1 -0
  804. package/dist/core/tools/coercion-argumentos.js +99 -0
  805. package/dist/core/tools/coercion-argumentos.js.map +1 -0
  806. package/dist/core/tools/edit-diff.d.ts +0 -12
  807. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  808. package/dist/core/tools/edit-diff.js +234 -12
  809. package/dist/core/tools/edit-diff.js.map +1 -1
  810. package/dist/core/tools/edit.d.ts.map +1 -1
  811. package/dist/core/tools/edit.js +28 -5
  812. package/dist/core/tools/edit.js.map +1 -1
  813. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  814. package/dist/core/tools/file-mutation-queue.js +5 -0
  815. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  816. package/dist/core/tools/index.d.ts.map +1 -1
  817. package/dist/core/tools/index.js +2 -2
  818. package/dist/core/tools/index.js.map +1 -1
  819. package/dist/core/tools/json-tolerante.d.ts +30 -0
  820. package/dist/core/tools/json-tolerante.d.ts.map +1 -0
  821. package/dist/core/tools/json-tolerante.js +70 -0
  822. package/dist/core/tools/json-tolerante.js.map +1 -0
  823. package/dist/core/tools/project-memory-tool.d.ts.map +1 -1
  824. package/dist/core/tools/project-memory-tool.js +4 -1
  825. package/dist/core/tools/project-memory-tool.js.map +1 -1
  826. package/dist/core/tools/read.d.ts.map +1 -1
  827. package/dist/core/tools/read.js +17 -0
  828. package/dist/core/tools/read.js.map +1 -1
  829. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -1
  830. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  831. package/dist/core/tools/tool-definition-wrapper.js +17 -1
  832. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  833. package/dist/core/trust-manager.d.ts.map +1 -1
  834. package/dist/core/trust-manager.js +2 -1
  835. package/dist/core/trust-manager.js.map +1 -1
  836. package/dist/core/turno-vacio/detectar.d.ts +38 -0
  837. package/dist/core/turno-vacio/detectar.d.ts.map +1 -0
  838. package/dist/core/turno-vacio/detectar.js +66 -0
  839. package/dist/core/turno-vacio/detectar.js.map +1 -0
  840. package/dist/core/undo/journal.d.ts +57 -0
  841. package/dist/core/undo/journal.d.ts.map +1 -0
  842. package/dist/core/undo/journal.js +178 -0
  843. package/dist/core/undo/journal.js.map +1 -0
  844. package/dist/core/urls-internas/auditoria.d.ts +10 -0
  845. package/dist/core/urls-internas/auditoria.d.ts.map +1 -0
  846. package/dist/core/urls-internas/auditoria.js +42 -0
  847. package/dist/core/urls-internas/auditoria.js.map +1 -0
  848. package/dist/core/urls-internas/boveda.d.ts +13 -0
  849. package/dist/core/urls-internas/boveda.d.ts.map +1 -0
  850. package/dist/core/urls-internas/boveda.js +40 -0
  851. package/dist/core/urls-internas/boveda.js.map +1 -0
  852. package/dist/core/urls-internas/lector.d.ts +30 -0
  853. package/dist/core/urls-internas/lector.d.ts.map +1 -0
  854. package/dist/core/urls-internas/lector.js +56 -0
  855. package/dist/core/urls-internas/lector.js.map +1 -0
  856. package/dist/core/urls-internas/memoria.d.ts +11 -0
  857. package/dist/core/urls-internas/memoria.d.ts.map +1 -0
  858. package/dist/core/urls-internas/memoria.js +25 -0
  859. package/dist/core/urls-internas/memoria.js.map +1 -0
  860. package/dist/core/urls-internas/parse.d.ts +28 -0
  861. package/dist/core/urls-internas/parse.d.ts.map +1 -0
  862. package/dist/core/urls-internas/parse.js +32 -0
  863. package/dist/core/urls-internas/parse.js.map +1 -0
  864. package/dist/core/urls-internas/reglas.d.ts +10 -0
  865. package/dist/core/urls-internas/reglas.d.ts.map +1 -0
  866. package/dist/core/urls-internas/reglas.js +31 -0
  867. package/dist/core/urls-internas/reglas.js.map +1 -0
  868. package/dist/core/usage/aggregate.d.ts +68 -0
  869. package/dist/core/usage/aggregate.d.ts.map +1 -0
  870. package/dist/core/usage/aggregate.js +93 -0
  871. package/dist/core/usage/aggregate.js.map +1 -0
  872. package/dist/core/usage/cuota/anthropic.d.ts +10 -0
  873. package/dist/core/usage/cuota/anthropic.d.ts.map +1 -0
  874. package/dist/core/usage/cuota/anthropic.js +63 -0
  875. package/dist/core/usage/cuota/anthropic.js.map +1 -0
  876. package/dist/core/usage/cuota/cache.d.ts +20 -0
  877. package/dist/core/usage/cuota/cache.d.ts.map +1 -0
  878. package/dist/core/usage/cuota/cache.js +36 -0
  879. package/dist/core/usage/cuota/cache.js.map +1 -0
  880. package/dist/core/usage/cuota/github-copilot.d.ts +9 -0
  881. package/dist/core/usage/cuota/github-copilot.d.ts.map +1 -0
  882. package/dist/core/usage/cuota/github-copilot.js +67 -0
  883. package/dist/core/usage/cuota/github-copilot.js.map +1 -0
  884. package/dist/core/usage/cuota/google-gemini.d.ts +9 -0
  885. package/dist/core/usage/cuota/google-gemini.d.ts.map +1 -0
  886. package/dist/core/usage/cuota/google-gemini.js +72 -0
  887. package/dist/core/usage/cuota/google-gemini.js.map +1 -0
  888. package/dist/core/usage/cuota/index.d.ts +25 -0
  889. package/dist/core/usage/cuota/index.d.ts.map +1 -0
  890. package/dist/core/usage/cuota/index.js +50 -0
  891. package/dist/core/usage/cuota/index.js.map +1 -0
  892. package/dist/core/usage/cuota/openai-codex.d.ts +9 -0
  893. package/dist/core/usage/cuota/openai-codex.d.ts.map +1 -0
  894. package/dist/core/usage/cuota/openai-codex.js +59 -0
  895. package/dist/core/usage/cuota/openai-codex.js.map +1 -0
  896. package/dist/core/usage/cuota/openrouter.d.ts +10 -0
  897. package/dist/core/usage/cuota/openrouter.d.ts.map +1 -0
  898. package/dist/core/usage/cuota/openrouter.js +47 -0
  899. package/dist/core/usage/cuota/openrouter.js.map +1 -0
  900. package/dist/core/usage/cuota/tipos.d.ts +50 -0
  901. package/dist/core/usage/cuota/tipos.d.ts.map +1 -0
  902. package/dist/core/usage/cuota/tipos.js +25 -0
  903. package/dist/core/usage/cuota/tipos.js.map +1 -0
  904. package/dist/core/web/busqueda-nativa.d.ts +82 -0
  905. package/dist/core/web/busqueda-nativa.d.ts.map +1 -0
  906. package/dist/core/web/busqueda-nativa.js +163 -0
  907. package/dist/core/web/busqueda-nativa.js.map +1 -0
  908. package/dist/core/web/destino.d.ts +58 -0
  909. package/dist/core/web/destino.d.ts.map +1 -0
  910. package/dist/core/web/destino.js +127 -0
  911. package/dist/core/web/destino.js.map +1 -0
  912. package/dist/core/web/proveedores/brave.d.ts +6 -0
  913. package/dist/core/web/proveedores/brave.d.ts.map +1 -0
  914. package/dist/core/web/proveedores/brave.js +20 -0
  915. package/dist/core/web/proveedores/brave.js.map +1 -0
  916. package/dist/core/web/proveedores/claves.d.ts +19 -0
  917. package/dist/core/web/proveedores/claves.d.ts.map +1 -0
  918. package/dist/core/web/proveedores/claves.js +36 -0
  919. package/dist/core/web/proveedores/claves.js.map +1 -0
  920. package/dist/core/web/proveedores/duckduckgo.d.ts +3 -0
  921. package/dist/core/web/proveedores/duckduckgo.d.ts.map +1 -0
  922. package/dist/core/web/proveedores/duckduckgo.js +109 -0
  923. package/dist/core/web/proveedores/duckduckgo.js.map +1 -0
  924. package/dist/core/web/proveedores/ecosia.d.ts +3 -0
  925. package/dist/core/web/proveedores/ecosia.d.ts.map +1 -0
  926. package/dist/core/web/proveedores/ecosia.js +72 -0
  927. package/dist/core/web/proveedores/ecosia.js.map +1 -0
  928. package/dist/core/web/proveedores/exa.d.ts +6 -0
  929. package/dist/core/web/proveedores/exa.d.ts.map +1 -0
  930. package/dist/core/web/proveedores/exa.js +24 -0
  931. package/dist/core/web/proveedores/exa.js.map +1 -0
  932. package/dist/core/web/proveedores/mojeek.d.ts +3 -0
  933. package/dist/core/web/proveedores/mojeek.d.ts.map +1 -0
  934. package/dist/core/web/proveedores/mojeek.js +65 -0
  935. package/dist/core/web/proveedores/mojeek.js.map +1 -0
  936. package/dist/core/web/proveedores/navegador.d.ts +10 -0
  937. package/dist/core/web/proveedores/navegador.d.ts.map +1 -0
  938. package/dist/core/web/proveedores/navegador.js +13 -0
  939. package/dist/core/web/proveedores/navegador.js.map +1 -0
  940. package/dist/core/web/proveedores/registro.d.ts +43 -0
  941. package/dist/core/web/proveedores/registro.d.ts.map +1 -0
  942. package/dist/core/web/proveedores/registro.js +49 -0
  943. package/dist/core/web/proveedores/registro.js.map +1 -0
  944. package/dist/core/web/proveedores/searxng.d.ts +9 -0
  945. package/dist/core/web/proveedores/searxng.d.ts.map +1 -0
  946. package/dist/core/web/proveedores/searxng.js +17 -0
  947. package/dist/core/web/proveedores/searxng.js.map +1 -0
  948. package/dist/core/web/proveedores/serper.d.ts +9 -0
  949. package/dist/core/web/proveedores/serper.d.ts.map +1 -0
  950. package/dist/core/web/proveedores/serper.js +19 -0
  951. package/dist/core/web/proveedores/serper.js.map +1 -0
  952. package/dist/core/web/proveedores/tavily.d.ts +6 -0
  953. package/dist/core/web/proveedores/tavily.d.ts.map +1 -0
  954. package/dist/core/web/proveedores/tavily.js +19 -0
  955. package/dist/core/web/proveedores/tavily.js.map +1 -0
  956. package/dist/core/web/proveedores/tipos.d.ts +36 -0
  957. package/dist/core/web/proveedores/tipos.d.ts.map +1 -0
  958. package/dist/core/web/proveedores/tipos.js +10 -0
  959. package/dist/core/web/proveedores/tipos.js.map +1 -0
  960. package/dist/core/web/registro-red.d.ts +43 -0
  961. package/dist/core/web/registro-red.d.ts.map +1 -0
  962. package/dist/core/web/registro-red.js +86 -0
  963. package/dist/core/web/registro-red.js.map +1 -0
  964. package/dist/core/web/scrapers/cisa-kev.d.ts +10 -0
  965. package/dist/core/web/scrapers/cisa-kev.d.ts.map +1 -0
  966. package/dist/core/web/scrapers/cisa-kev.js +38 -0
  967. package/dist/core/web/scrapers/cisa-kev.js.map +1 -0
  968. package/dist/core/web/scrapers/crates-io.d.ts +11 -0
  969. package/dist/core/web/scrapers/crates-io.d.ts.map +1 -0
  970. package/dist/core/web/scrapers/crates-io.js +29 -0
  971. package/dist/core/web/scrapers/crates-io.js.map +1 -0
  972. package/dist/core/web/scrapers/docs-rs.d.ts +10 -0
  973. package/dist/core/web/scrapers/docs-rs.d.ts.map +1 -0
  974. package/dist/core/web/scrapers/docs-rs.js +35 -0
  975. package/dist/core/web/scrapers/docs-rs.js.map +1 -0
  976. package/dist/core/web/scrapers/github.d.ts +3 -0
  977. package/dist/core/web/scrapers/github.d.ts.map +1 -0
  978. package/dist/core/web/scrapers/github.js +72 -0
  979. package/dist/core/web/scrapers/github.js.map +1 -0
  980. package/dist/core/web/scrapers/go-pkg.d.ts +7 -0
  981. package/dist/core/web/scrapers/go-pkg.d.ts.map +1 -0
  982. package/dist/core/web/scrapers/go-pkg.js +30 -0
  983. package/dist/core/web/scrapers/go-pkg.js.map +1 -0
  984. package/dist/core/web/scrapers/hex.d.ts +6 -0
  985. package/dist/core/web/scrapers/hex.d.ts.map +1 -0
  986. package/dist/core/web/scrapers/hex.js +27 -0
  987. package/dist/core/web/scrapers/hex.js.map +1 -0
  988. package/dist/core/web/scrapers/maven.d.ts +8 -0
  989. package/dist/core/web/scrapers/maven.d.ts.map +1 -0
  990. package/dist/core/web/scrapers/maven.js +41 -0
  991. package/dist/core/web/scrapers/maven.js.map +1 -0
  992. package/dist/core/web/scrapers/mdn.d.ts +6 -0
  993. package/dist/core/web/scrapers/mdn.d.ts.map +1 -0
  994. package/dist/core/web/scrapers/mdn.js +28 -0
  995. package/dist/core/web/scrapers/mdn.js.map +1 -0
  996. package/dist/core/web/scrapers/npm.d.ts +11 -0
  997. package/dist/core/web/scrapers/npm.d.ts.map +1 -0
  998. package/dist/core/web/scrapers/npm.js +57 -0
  999. package/dist/core/web/scrapers/npm.js.map +1 -0
  1000. package/dist/core/web/scrapers/nuget.d.ts +8 -0
  1001. package/dist/core/web/scrapers/nuget.d.ts.map +1 -0
  1002. package/dist/core/web/scrapers/nuget.js +22 -0
  1003. package/dist/core/web/scrapers/nuget.js.map +1 -0
  1004. package/dist/core/web/scrapers/nvd.d.ts +7 -0
  1005. package/dist/core/web/scrapers/nvd.d.ts.map +1 -0
  1006. package/dist/core/web/scrapers/nvd.js +37 -0
  1007. package/dist/core/web/scrapers/nvd.js.map +1 -0
  1008. package/dist/core/web/scrapers/pypi.d.ts +6 -0
  1009. package/dist/core/web/scrapers/pypi.d.ts.map +1 -0
  1010. package/dist/core/web/scrapers/pypi.js +31 -0
  1011. package/dist/core/web/scrapers/pypi.js.map +1 -0
  1012. package/dist/core/web/scrapers/registro.d.ts +13 -0
  1013. package/dist/core/web/scrapers/registro.d.ts.map +1 -0
  1014. package/dist/core/web/scrapers/registro.js +65 -0
  1015. package/dist/core/web/scrapers/registro.js.map +1 -0
  1016. package/dist/core/web/scrapers/rubygems.d.ts +6 -0
  1017. package/dist/core/web/scrapers/rubygems.d.ts.map +1 -0
  1018. package/dist/core/web/scrapers/rubygems.js +23 -0
  1019. package/dist/core/web/scrapers/rubygems.js.map +1 -0
  1020. package/dist/core/web/scrapers/stackoverflow.d.ts +3 -0
  1021. package/dist/core/web/scrapers/stackoverflow.d.ts.map +1 -0
  1022. package/dist/core/web/scrapers/stackoverflow.js +46 -0
  1023. package/dist/core/web/scrapers/stackoverflow.js.map +1 -0
  1024. package/dist/core/web/scrapers/tipos.d.ts +42 -0
  1025. package/dist/core/web/scrapers/tipos.d.ts.map +1 -0
  1026. package/dist/core/web/scrapers/tipos.js +23 -0
  1027. package/dist/core/web/scrapers/tipos.js.map +1 -0
  1028. package/dist/core/web/texto.d.ts +10 -0
  1029. package/dist/core/web/texto.d.ts.map +1 -0
  1030. package/dist/core/web/texto.js +26 -0
  1031. package/dist/core/web/texto.js.map +1 -0
  1032. package/dist/core/web/tools.d.ts +91 -0
  1033. package/dist/core/web/tools.d.ts.map +1 -0
  1034. package/dist/core/web/tools.js +304 -0
  1035. package/dist/core/web/tools.js.map +1 -0
  1036. package/dist/core/wiki/almacen.d.ts +33 -0
  1037. package/dist/core/wiki/almacen.d.ts.map +1 -0
  1038. package/dist/core/wiki/almacen.js +93 -0
  1039. package/dist/core/wiki/almacen.js.map +1 -0
  1040. package/dist/core/wiki/citas.d.ts +111 -0
  1041. package/dist/core/wiki/citas.d.ts.map +1 -0
  1042. package/dist/core/wiki/citas.js +146 -0
  1043. package/dist/core/wiki/citas.js.map +1 -0
  1044. package/dist/core/workflows/agent-runner.d.ts +88 -0
  1045. package/dist/core/workflows/agent-runner.d.ts.map +1 -0
  1046. package/dist/core/workflows/agent-runner.js +312 -0
  1047. package/dist/core/workflows/agent-runner.js.map +1 -0
  1048. package/dist/core/workflows/builtins.d.ts +41 -0
  1049. package/dist/core/workflows/builtins.d.ts.map +1 -0
  1050. package/dist/core/workflows/builtins.js +283 -0
  1051. package/dist/core/workflows/builtins.js.map +1 -0
  1052. package/dist/core/workflows/contrato/esquema.d.ts +32 -0
  1053. package/dist/core/workflows/contrato/esquema.d.ts.map +1 -0
  1054. package/dist/core/workflows/contrato/esquema.js +25 -0
  1055. package/dist/core/workflows/contrato/esquema.js.map +1 -0
  1056. package/dist/core/workflows/contrato/reparar-argumentos.d.ts +69 -0
  1057. package/dist/core/workflows/contrato/reparar-argumentos.d.ts.map +1 -0
  1058. package/dist/core/workflows/contrato/reparar-argumentos.js +117 -0
  1059. package/dist/core/workflows/contrato/reparar-argumentos.js.map +1 -0
  1060. package/dist/core/workflows/contrato/validador.d.ts +30 -0
  1061. package/dist/core/workflows/contrato/validador.d.ts.map +1 -0
  1062. package/dist/core/workflows/contrato/validador.js +56 -0
  1063. package/dist/core/workflows/contrato/validador.js.map +1 -0
  1064. package/dist/core/workflows/contrato/yield.d.ts +65 -0
  1065. package/dist/core/workflows/contrato/yield.d.ts.map +1 -0
  1066. package/dist/core/workflows/contrato/yield.js +80 -0
  1067. package/dist/core/workflows/contrato/yield.js.map +1 -0
  1068. package/dist/core/workflows/goal-engine/engine.d.ts +151 -0
  1069. package/dist/core/workflows/goal-engine/engine.d.ts.map +1 -0
  1070. package/dist/core/workflows/goal-engine/engine.js +503 -0
  1071. package/dist/core/workflows/goal-engine/engine.js.map +1 -0
  1072. package/dist/core/workflows/goal-engine/errors.d.ts +7 -0
  1073. package/dist/core/workflows/goal-engine/errors.d.ts.map +1 -0
  1074. package/dist/core/workflows/goal-engine/errors.js +9 -0
  1075. package/dist/core/workflows/goal-engine/errors.js.map +1 -0
  1076. package/dist/core/workflows/goal-engine/index.d.ts +13 -0
  1077. package/dist/core/workflows/goal-engine/index.d.ts.map +1 -0
  1078. package/dist/core/workflows/goal-engine/index.js +8 -0
  1079. package/dist/core/workflows/goal-engine/index.js.map +1 -0
  1080. package/dist/core/workflows/goal-engine/persistence.d.ts +31 -0
  1081. package/dist/core/workflows/goal-engine/persistence.d.ts.map +1 -0
  1082. package/dist/core/workflows/goal-engine/persistence.js +145 -0
  1083. package/dist/core/workflows/goal-engine/persistence.js.map +1 -0
  1084. package/dist/core/workflows/goal-engine/prompts.d.ts +37 -0
  1085. package/dist/core/workflows/goal-engine/prompts.d.ts.map +1 -0
  1086. package/dist/core/workflows/goal-engine/prompts.js +131 -0
  1087. package/dist/core/workflows/goal-engine/prompts.js.map +1 -0
  1088. package/dist/core/workflows/goal-engine/state.d.ts +41 -0
  1089. package/dist/core/workflows/goal-engine/state.d.ts.map +1 -0
  1090. package/dist/core/workflows/goal-engine/state.js +397 -0
  1091. package/dist/core/workflows/goal-engine/state.js.map +1 -0
  1092. package/dist/core/workflows/goal-engine/tools.d.ts +31 -0
  1093. package/dist/core/workflows/goal-engine/tools.d.ts.map +1 -0
  1094. package/dist/core/workflows/goal-engine/tools.js +211 -0
  1095. package/dist/core/workflows/goal-engine/tools.js.map +1 -0
  1096. package/dist/core/workflows/goal-engine/types.d.ts +286 -0
  1097. package/dist/core/workflows/goal-engine/types.d.ts.map +1 -0
  1098. package/dist/core/workflows/goal-engine/types.js +17 -0
  1099. package/dist/core/workflows/goal-engine/types.js.map +1 -0
  1100. package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts +23 -0
  1101. package/dist/core/workflows/goal-engine/worktree-fingerprint.d.ts.map +1 -0
  1102. package/dist/core/workflows/goal-engine/worktree-fingerprint.js +72 -0
  1103. package/dist/core/workflows/goal-engine/worktree-fingerprint.js.map +1 -0
  1104. package/dist/core/workflows/graph-sync.d.ts +67 -0
  1105. package/dist/core/workflows/graph-sync.d.ts.map +1 -0
  1106. package/dist/core/workflows/graph-sync.js +188 -0
  1107. package/dist/core/workflows/graph-sync.js.map +1 -0
  1108. package/dist/core/workflows/graph.d.ts +143 -0
  1109. package/dist/core/workflows/graph.d.ts.map +1 -0
  1110. package/dist/core/workflows/graph.js +319 -0
  1111. package/dist/core/workflows/graph.js.map +1 -0
  1112. package/dist/core/workflows/index.d.ts +26 -0
  1113. package/dist/core/workflows/index.d.ts.map +1 -0
  1114. package/dist/core/workflows/index.js +18 -0
  1115. package/dist/core/workflows/index.js.map +1 -0
  1116. package/dist/core/workflows/journal.d.ts +68 -0
  1117. package/dist/core/workflows/journal.d.ts.map +1 -0
  1118. package/dist/core/workflows/journal.js +83 -0
  1119. package/dist/core/workflows/journal.js.map +1 -0
  1120. package/dist/core/workflows/manager.d.ts +122 -0
  1121. package/dist/core/workflows/manager.d.ts.map +1 -0
  1122. package/dist/core/workflows/manager.js +351 -0
  1123. package/dist/core/workflows/manager.js.map +1 -0
  1124. package/dist/core/workflows/resolve-script.d.ts +35 -0
  1125. package/dist/core/workflows/resolve-script.d.ts.map +1 -0
  1126. package/dist/core/workflows/resolve-script.js +66 -0
  1127. package/dist/core/workflows/resolve-script.js.map +1 -0
  1128. package/dist/core/workflows/runtime.d.ts +62 -0
  1129. package/dist/core/workflows/runtime.d.ts.map +1 -0
  1130. package/dist/core/workflows/runtime.js +380 -0
  1131. package/dist/core/workflows/runtime.js.map +1 -0
  1132. package/dist/core/workflows/save-as-skill.d.ts +27 -0
  1133. package/dist/core/workflows/save-as-skill.d.ts.map +1 -0
  1134. package/dist/core/workflows/save-as-skill.js +54 -0
  1135. package/dist/core/workflows/save-as-skill.js.map +1 -0
  1136. package/dist/core/workflows/shared-store.d.ts +31 -0
  1137. package/dist/core/workflows/shared-store.d.ts.map +1 -0
  1138. package/dist/core/workflows/shared-store.js +80 -0
  1139. package/dist/core/workflows/shared-store.js.map +1 -0
  1140. package/dist/core/workflows/subagent-host.d.ts +50 -0
  1141. package/dist/core/workflows/subagent-host.d.ts.map +1 -0
  1142. package/dist/core/workflows/subagent-host.js +225 -0
  1143. package/dist/core/workflows/subagent-host.js.map +1 -0
  1144. package/dist/core/workflows/tool-workflow.d.ts +22 -0
  1145. package/dist/core/workflows/tool-workflow.d.ts.map +1 -0
  1146. package/dist/core/workflows/tool-workflow.js +120 -0
  1147. package/dist/core/workflows/tool-workflow.js.map +1 -0
  1148. package/dist/core/workflows/types.d.ts +191 -0
  1149. package/dist/core/workflows/types.d.ts.map +1 -0
  1150. package/dist/core/workflows/types.js +26 -0
  1151. package/dist/core/workflows/types.js.map +1 -0
  1152. package/dist/core/workflows/worktree.d.ts +42 -0
  1153. package/dist/core/workflows/worktree.d.ts.map +1 -0
  1154. package/dist/core/workflows/worktree.js +107 -0
  1155. package/dist/core/workflows/worktree.js.map +1 -0
  1156. package/dist/extensions/llama/index.d.ts.map +1 -1
  1157. package/dist/extensions/llama/index.js +2 -0
  1158. package/dist/extensions/llama/index.js.map +1 -1
  1159. package/dist/extensions/llama/provider.d.ts.map +1 -1
  1160. package/dist/extensions/llama/provider.js +6 -2
  1161. package/dist/extensions/llama/provider.js.map +1 -1
  1162. package/dist/extensions/remoto/index.d.ts +22 -0
  1163. package/dist/extensions/remoto/index.d.ts.map +1 -0
  1164. package/dist/extensions/remoto/index.js +54 -0
  1165. package/dist/extensions/remoto/index.js.map +1 -0
  1166. package/dist/index.d.ts +1 -13
  1167. package/dist/index.d.ts.map +1 -1
  1168. package/dist/index.js +7 -13
  1169. package/dist/index.js.map +1 -1
  1170. package/dist/main.d.ts +4 -0
  1171. package/dist/main.d.ts.map +1 -1
  1172. package/dist/main.js +26 -15
  1173. package/dist/main.js.map +1 -1
  1174. package/dist/migrations.d.ts.map +1 -1
  1175. package/dist/migrations.js +4 -3
  1176. package/dist/migrations.js.map +1 -1
  1177. package/dist/modes/acp/acp-mode.d.ts +42 -0
  1178. package/dist/modes/acp/acp-mode.d.ts.map +1 -0
  1179. package/dist/modes/acp/acp-mode.js +190 -0
  1180. package/dist/modes/acp/acp-mode.js.map +1 -0
  1181. package/dist/modes/acp/events.d.ts +74 -0
  1182. package/dist/modes/acp/events.d.ts.map +1 -0
  1183. package/dist/modes/acp/events.js +116 -0
  1184. package/dist/modes/acp/events.js.map +1 -0
  1185. package/dist/modes/interactive/components/home-screen.d.ts.map +1 -1
  1186. package/dist/modes/interactive/components/home-screen.js +2 -2
  1187. package/dist/modes/interactive/components/home-screen.js.map +1 -1
  1188. package/dist/modes/interactive/components/model-selector.d.ts +9 -3
  1189. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  1190. package/dist/modes/interactive/components/model-selector.js +56 -12
  1191. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  1192. package/dist/modes/interactive/components/prompt-optimization.d.ts +16 -0
  1193. package/dist/modes/interactive/components/prompt-optimization.d.ts.map +1 -0
  1194. package/dist/modes/interactive/components/prompt-optimization.js +46 -0
  1195. package/dist/modes/interactive/components/prompt-optimization.js.map +1 -0
  1196. package/dist/modes/interactive/components/settings-selector.d.ts +19 -2
  1197. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  1198. package/dist/modes/interactive/components/settings-selector.js +180 -56
  1199. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  1200. package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
  1201. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
  1202. package/dist/modes/interactive/components/settings-submenu.js +165 -0
  1203. package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
  1204. package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
  1205. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  1206. package/dist/modes/interactive/components/thinking-selector.js +74 -17
  1207. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  1208. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  1209. package/dist/modes/interactive/external-editor.js +2 -1
  1210. package/dist/modes/interactive/external-editor.js.map +1 -1
  1211. package/dist/modes/interactive/interactive-mode.d.ts +21 -1
  1212. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  1213. package/dist/modes/interactive/interactive-mode.js +709 -75
  1214. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  1215. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  1216. package/dist/modes/interactive/theme/theme.js +4 -3
  1217. package/dist/modes/interactive/theme/theme.js.map +1 -1
  1218. package/dist/modes/json-event.d.ts +16 -13
  1219. package/dist/modes/json-event.d.ts.map +1 -1
  1220. package/dist/modes/json-event.js +20 -6
  1221. package/dist/modes/json-event.js.map +1 -1
  1222. package/dist/modes/print-mode.d.ts.map +1 -1
  1223. package/dist/modes/print-mode.js +11 -0
  1224. package/dist/modes/print-mode.js.map +1 -1
  1225. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  1226. package/dist/modes/rpc/rpc-mode.js +173 -0
  1227. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  1228. package/dist/modes/rpc/rpc-types.d.ts +29 -0
  1229. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  1230. package/dist/modes/rpc/rpc-types.js.map +1 -1
  1231. package/dist/package-manager-cli.d.ts.map +1 -1
  1232. package/dist/package-manager-cli.js +27 -5
  1233. package/dist/package-manager-cli.js.map +1 -1
  1234. package/dist/server/attach.d.ts +56 -0
  1235. package/dist/server/attach.d.ts.map +1 -0
  1236. package/dist/server/attach.js +130 -0
  1237. package/dist/server/attach.js.map +1 -0
  1238. package/dist/server/extension-ops.d.ts +40 -0
  1239. package/dist/server/extension-ops.d.ts.map +1 -0
  1240. package/dist/server/extension-ops.js +146 -0
  1241. package/dist/server/extension-ops.js.map +1 -0
  1242. package/dist/server/pi-server-service.d.ts +85 -0
  1243. package/dist/server/pi-server-service.d.ts.map +1 -0
  1244. package/dist/server/pi-server-service.js +213 -0
  1245. package/dist/server/pi-server-service.js.map +1 -0
  1246. package/dist/server/scheduler-tick.d.ts +32 -0
  1247. package/dist/server/scheduler-tick.d.ts.map +1 -0
  1248. package/dist/server/scheduler-tick.js +47 -0
  1249. package/dist/server/scheduler-tick.js.map +1 -0
  1250. package/dist/server/serve.d.ts +25 -0
  1251. package/dist/server/serve.d.ts.map +1 -0
  1252. package/dist/server/serve.js +83 -0
  1253. package/dist/server/serve.js.map +1 -0
  1254. package/dist/server/transcript.d.ts +38 -0
  1255. package/dist/server/transcript.d.ts.map +1 -0
  1256. package/dist/server/transcript.js +176 -0
  1257. package/dist/server/transcript.js.map +1 -0
  1258. package/dist/skills/ada-engine/SKILL.md +153 -0
  1259. package/dist/skills/skill-creator/SKILL.md +90 -0
  1260. package/dist/telegram/api.d.ts +75 -0
  1261. package/dist/telegram/api.d.ts.map +1 -0
  1262. package/dist/telegram/api.js +104 -0
  1263. package/dist/telegram/api.js.map +1 -0
  1264. package/dist/telegram/bridge.d.ts +85 -0
  1265. package/dist/telegram/bridge.d.ts.map +1 -0
  1266. package/dist/telegram/bridge.js +182 -0
  1267. package/dist/telegram/bridge.js.map +1 -0
  1268. package/dist/telegram/journal.d.ts +67 -0
  1269. package/dist/telegram/journal.d.ts.map +1 -0
  1270. package/dist/telegram/journal.js +119 -0
  1271. package/dist/telegram/journal.js.map +1 -0
  1272. package/dist/telegram/servidor.d.ts +15 -0
  1273. package/dist/telegram/servidor.d.ts.map +1 -0
  1274. package/dist/telegram/servidor.js +74 -0
  1275. package/dist/telegram/servidor.js.map +1 -0
  1276. package/dist/utils/frontmatter.d.ts.map +1 -1
  1277. package/dist/utils/frontmatter.js +2 -1
  1278. package/dist/utils/frontmatter.js.map +1 -1
  1279. package/dist/utils/management-http.d.ts +5 -3
  1280. package/dist/utils/management-http.d.ts.map +1 -1
  1281. package/dist/utils/management-http.js +14 -10
  1282. package/dist/utils/management-http.js.map +1 -1
  1283. package/dist/utils/shell.d.ts +11 -0
  1284. package/dist/utils/shell.d.ts.map +1 -1
  1285. package/dist/utils/shell.js +11 -0
  1286. package/dist/utils/shell.js.map +1 -1
  1287. package/dist/utils/text.d.ts +8 -0
  1288. package/dist/utils/text.d.ts.map +1 -0
  1289. package/dist/utils/text.js +9 -0
  1290. package/dist/utils/text.js.map +1 -0
  1291. package/dist/utils/version-check.d.ts.map +1 -1
  1292. package/dist/utils/version-check.js +29 -1
  1293. package/dist/utils/version-check.js.map +1 -1
  1294. package/docs/compaction.md +25 -10
  1295. package/docs/compliance.md +241 -0
  1296. package/docs/containerization.md +24 -24
  1297. package/docs/custom-provider.md +15 -12
  1298. package/docs/development.md +47 -10
  1299. package/docs/docs.json +14 -2
  1300. package/docs/environment-variables.md +20 -17
  1301. package/docs/extensions.md +62 -51
  1302. package/docs/index.md +15 -21
  1303. package/docs/json.md +10 -5
  1304. package/docs/keybindings.md +5 -5
  1305. package/docs/llama-cpp.md +9 -7
  1306. package/docs/models.md +18 -12
  1307. package/docs/packages.md +45 -45
  1308. package/docs/prompt-templates.md +5 -5
  1309. package/docs/providers.md +12 -12
  1310. package/docs/quickstart.md +39 -39
  1311. package/docs/rpc.md +21 -15
  1312. package/docs/sdk.md +38 -38
  1313. package/docs/security.md +26 -21
  1314. package/docs/session-format.md +7 -7
  1315. package/docs/sessions.md +14 -14
  1316. package/docs/settings.md +47 -22
  1317. package/docs/shell-aliases.md +2 -2
  1318. package/docs/skills.md +14 -13
  1319. package/docs/terminal-setup.md +14 -14
  1320. package/docs/termux.md +7 -7
  1321. package/docs/themes.md +11 -11
  1322. package/docs/tmux.md +4 -4
  1323. package/docs/tui.md +3 -3
  1324. package/docs/usage.md +54 -54
  1325. package/docs/windows.md +2 -2
  1326. package/examples/extensions/border-status-editor.ts +1 -1
  1327. package/examples/extensions/git-checkpoint.ts +2 -2
  1328. package/examples/extensions/notify.ts +3 -1
  1329. package/examples/extensions/subagent/README.md +1 -1
  1330. package/examples/extensions/subagent/index.ts +6 -1
  1331. package/examples/extensions/titlebar-spinner.ts +1 -1
  1332. package/examples/rpc-extension-ui.ts +1 -1
  1333. package/examples/sdk/06-extensions.ts +1 -1
  1334. package/examples/sdk/12-full-control.ts +9 -0
  1335. package/examples/sdk/README.md +1 -1
  1336. package/npm-shrinkwrap.json +35 -261
  1337. package/package.json +9 -3
@@ -1,6 +1,19 @@
1
1
  import type { AgentTool } from "@earendil-works/pi-agent-core";
2
2
  import type { ExtensionContext, ToolDefinition } from "../extensions/types.ts";
3
- /** Wrap a ToolDefinition into an AgentTool for the core runtime. */
3
+ /**
4
+ * Wrap a ToolDefinition into an AgentTool for the core runtime.
5
+ *
6
+ * AQUÍ va la coerción de argumentos, y no en `createTool`, porque ESTE es el
7
+ * punto por el que pasan todas: `createReadTool`, `createBashTool`,
8
+ * `createEditTool`… todas terminan llamando a esta función, y por tanto también
9
+ * `createCodingTools`, que es lo que usa el SDK.
10
+ *
11
+ * Lo puse antes en `createTool`/`createToolDefinition` creyendo que eran los
12
+ * embudos, y me equivoqué: `createCodingToolDefinitions` llama a cada fábrica
13
+ * directamente y se los saltaba. Lo enseñó ejecutar la copia INSTALADA contra
14
+ * un modelo de verdad — el rechazo seguía saliendo idéntico con la prueba en
15
+ * verde, porque la prueba usaba `createTool`, que sí estaba cubierto.
16
+ */
4
17
  export declare function wrapToolDefinition<TDetails = unknown>(definition: ToolDefinition<any, TDetails>, ctxFactory?: () => ExtensionContext): AgentTool<any, TDetails>;
5
18
  /** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */
6
19
  export declare function wrapToolDefinitions(definitions: ToolDefinition<any, any>[], ctxFactory?: () => ExtensionContext): AgentTool<any>[];
@@ -1 +1 @@
1
- {"version":3,"file":"tool-definition-wrapper.d.ts","sourceRoot":"","sources":["../../../src/core/tools/tool-definition-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE/E,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,QAAQ,GAAG,OAAO,EACpD,UAAU,EAAE,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,EACzC,UAAU,CAAC,EAAE,MAAM,gBAAgB,GACjC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAY1B;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAClC,WAAW,EAAE,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EACvC,UAAU,CAAC,EAAE,MAAM,gBAAgB,GACjC,SAAS,CAAC,GAAG,CAAC,EAAE,CAElB;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAWpG","sourcesContent":["import type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.ts\";\n\n/** Wrap a ToolDefinition into an AgentTool for the core runtime. */\nexport function wrapToolDefinition<TDetails = unknown>(\n\tdefinition: ToolDefinition<any, TDetails>,\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any, TDetails> {\n\treturn {\n\t\tname: definition.name,\n\t\tlabel: definition.label,\n\t\tdescription: definition.description,\n\t\tparameters: definition.parameters,\n\t\tconstrainedSampling: definition.constrainedSampling,\n\t\tprepareArguments: definition.prepareArguments,\n\t\texecutionMode: definition.executionMode,\n\t\texecute: (toolCallId, params, signal, onUpdate, ctx?: ExtensionContext) =>\n\t\t\tdefinition.execute(toolCallId, params, signal, onUpdate, ctx ?? (ctxFactory?.() as ExtensionContext)),\n\t};\n}\n\n/** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */\nexport function wrapToolDefinitions(\n\tdefinitions: ToolDefinition<any, any>[],\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any>[] {\n\treturn definitions.map((definition) => wrapToolDefinition(definition, ctxFactory));\n}\n\n/**\n * Synthesize a minimal ToolDefinition from an AgentTool.\n *\n * This keeps AgentSession's internal registry definition-first even when a caller\n * provides plain AgentTool overrides that do not include prompt metadata or renderers.\n */\nexport function createToolDefinitionFromAgentTool(tool: AgentTool<any>): ToolDefinition<any, unknown> {\n\treturn {\n\t\tname: tool.name,\n\t\tlabel: tool.label,\n\t\tdescription: tool.description,\n\t\tparameters: tool.parameters as any,\n\t\tconstrainedSampling: tool.constrainedSampling,\n\t\tprepareArguments: tool.prepareArguments,\n\t\texecutionMode: tool.executionMode,\n\t\texecute: async (toolCallId, params, signal, onUpdate) => tool.execute(toolCallId, params, signal, onUpdate),\n\t};\n}\n"]}
1
+ {"version":3,"file":"tool-definition-wrapper.d.ts","sourceRoot":"","sources":["../../../src/core/tools/tool-definition-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG/E;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,GAAG,OAAO,EACpD,UAAU,EAAE,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,EACzC,UAAU,CAAC,EAAE,MAAM,gBAAgB,GACjC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAgB1B;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAClC,WAAW,EAAE,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EACvC,UAAU,CAAC,EAAE,MAAM,gBAAgB,GACjC,SAAS,CAAC,GAAG,CAAC,EAAE,CAElB;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAWpG","sourcesContent":["import type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.ts\";\nimport { conCoercionDeArgumentos } from \"./coercion-argumentos.ts\";\n\n/**\n * Wrap a ToolDefinition into an AgentTool for the core runtime.\n *\n * AQUÍ va la coerción de argumentos, y no en `createTool`, porque ESTE es el\n * punto por el que pasan todas: `createReadTool`, `createBashTool`,\n * `createEditTool`… todas terminan llamando a esta función, y por tanto también\n * `createCodingTools`, que es lo que usa el SDK.\n *\n * Lo puse antes en `createTool`/`createToolDefinition` creyendo que eran los\n * embudos, y me equivoqué: `createCodingToolDefinitions` llama a cada fábrica\n * directamente y se los saltaba. Lo enseñó ejecutar la copia INSTALADA contra\n * un modelo de verdad — el rechazo seguía saliendo idéntico con la prueba en\n * verde, porque la prueba usaba `createTool`, que sí estaba cubierto.\n */\nexport function wrapToolDefinition<TDetails = unknown>(\n\tdefinition: ToolDefinition<any, TDetails>,\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any, TDetails> {\n\tconst conCoercion = conCoercionDeArgumentos(\n\t\tdefinition as { parameters?: unknown; prepareArguments?: (x: unknown) => unknown },\n\t);\n\tdefinition = conCoercion as typeof definition;\n\treturn {\n\t\tname: definition.name,\n\t\tlabel: definition.label,\n\t\tdescription: definition.description,\n\t\tparameters: definition.parameters,\n\t\tconstrainedSampling: definition.constrainedSampling,\n\t\tprepareArguments: definition.prepareArguments,\n\t\texecutionMode: definition.executionMode,\n\t\texecute: (toolCallId, params, signal, onUpdate, ctx?: ExtensionContext) =>\n\t\t\tdefinition.execute(toolCallId, params, signal, onUpdate, ctx ?? (ctxFactory?.() as ExtensionContext)),\n\t};\n}\n\n/** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */\nexport function wrapToolDefinitions(\n\tdefinitions: ToolDefinition<any, any>[],\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any>[] {\n\treturn definitions.map((definition) => wrapToolDefinition(definition, ctxFactory));\n}\n\n/**\n * Synthesize a minimal ToolDefinition from an AgentTool.\n *\n * This keeps AgentSession's internal registry definition-first even when a caller\n * provides plain AgentTool overrides that do not include prompt metadata or renderers.\n */\nexport function createToolDefinitionFromAgentTool(tool: AgentTool<any>): ToolDefinition<any, unknown> {\n\treturn {\n\t\tname: tool.name,\n\t\tlabel: tool.label,\n\t\tdescription: tool.description,\n\t\tparameters: tool.parameters as any,\n\t\tconstrainedSampling: tool.constrainedSampling,\n\t\tprepareArguments: tool.prepareArguments,\n\t\texecutionMode: tool.executionMode,\n\t\texecute: async (toolCallId, params, signal, onUpdate) => tool.execute(toolCallId, params, signal, onUpdate),\n\t};\n}\n"]}
@@ -1,5 +1,21 @@
1
- /** Wrap a ToolDefinition into an AgentTool for the core runtime. */
1
+ import { conCoercionDeArgumentos } from "./coercion-argumentos.js";
2
+ /**
3
+ * Wrap a ToolDefinition into an AgentTool for the core runtime.
4
+ *
5
+ * AQUÍ va la coerción de argumentos, y no en `createTool`, porque ESTE es el
6
+ * punto por el que pasan todas: `createReadTool`, `createBashTool`,
7
+ * `createEditTool`… todas terminan llamando a esta función, y por tanto también
8
+ * `createCodingTools`, que es lo que usa el SDK.
9
+ *
10
+ * Lo puse antes en `createTool`/`createToolDefinition` creyendo que eran los
11
+ * embudos, y me equivoqué: `createCodingToolDefinitions` llama a cada fábrica
12
+ * directamente y se los saltaba. Lo enseñó ejecutar la copia INSTALADA contra
13
+ * un modelo de verdad — el rechazo seguía saliendo idéntico con la prueba en
14
+ * verde, porque la prueba usaba `createTool`, que sí estaba cubierto.
15
+ */
2
16
  export function wrapToolDefinition(definition, ctxFactory) {
17
+ const conCoercion = conCoercionDeArgumentos(definition);
18
+ definition = conCoercion;
3
19
  return {
4
20
  name: definition.name,
5
21
  label: definition.label,
@@ -1 +1 @@
1
- {"version":3,"file":"tool-definition-wrapper.js","sourceRoot":"","sources":["../../../src/core/tools/tool-definition-wrapper.ts"],"names":[],"mappings":"AAGA,oEAAoE;AACpE,MAAM,UAAU,kBAAkB,CACjC,UAAyC,EACzC,UAAmC,EACR;IAC3B,OAAO;QACN,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,mBAAmB,EAAE,UAAU,CAAC,mBAAmB;QACnD,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;QAC7C,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAsB,EAAE,EAAE,CACzE,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAK,UAAU,EAAE,EAAuB,CAAC;KACtG,CAAC;AAAA,CACF;AAED,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB,CAClC,WAAuC,EACvC,UAAmC,EAChB;IACnB,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AAAA,CACnF;AAED;;;;;GAKG;AACH,MAAM,UAAU,iCAAiC,CAAC,IAAoB,EAAgC;IACrG,OAAO;QACN,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAiB;QAClC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;QAC7C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;KAC3G,CAAC;AAAA,CACF","sourcesContent":["import type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.ts\";\n\n/** Wrap a ToolDefinition into an AgentTool for the core runtime. */\nexport function wrapToolDefinition<TDetails = unknown>(\n\tdefinition: ToolDefinition<any, TDetails>,\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any, TDetails> {\n\treturn {\n\t\tname: definition.name,\n\t\tlabel: definition.label,\n\t\tdescription: definition.description,\n\t\tparameters: definition.parameters,\n\t\tconstrainedSampling: definition.constrainedSampling,\n\t\tprepareArguments: definition.prepareArguments,\n\t\texecutionMode: definition.executionMode,\n\t\texecute: (toolCallId, params, signal, onUpdate, ctx?: ExtensionContext) =>\n\t\t\tdefinition.execute(toolCallId, params, signal, onUpdate, ctx ?? (ctxFactory?.() as ExtensionContext)),\n\t};\n}\n\n/** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */\nexport function wrapToolDefinitions(\n\tdefinitions: ToolDefinition<any, any>[],\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any>[] {\n\treturn definitions.map((definition) => wrapToolDefinition(definition, ctxFactory));\n}\n\n/**\n * Synthesize a minimal ToolDefinition from an AgentTool.\n *\n * This keeps AgentSession's internal registry definition-first even when a caller\n * provides plain AgentTool overrides that do not include prompt metadata or renderers.\n */\nexport function createToolDefinitionFromAgentTool(tool: AgentTool<any>): ToolDefinition<any, unknown> {\n\treturn {\n\t\tname: tool.name,\n\t\tlabel: tool.label,\n\t\tdescription: tool.description,\n\t\tparameters: tool.parameters as any,\n\t\tconstrainedSampling: tool.constrainedSampling,\n\t\tprepareArguments: tool.prepareArguments,\n\t\texecutionMode: tool.executionMode,\n\t\texecute: async (toolCallId, params, signal, onUpdate) => tool.execute(toolCallId, params, signal, onUpdate),\n\t};\n}\n"]}
1
+ {"version":3,"file":"tool-definition-wrapper.js","sourceRoot":"","sources":["../../../src/core/tools/tool-definition-wrapper.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAEnE;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CACjC,UAAyC,EACzC,UAAmC,EACR;IAC3B,MAAM,WAAW,GAAG,uBAAuB,CAC1C,UAAkF,CAClF,CAAC;IACF,UAAU,GAAG,WAAgC,CAAC;IAC9C,OAAO;QACN,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,mBAAmB,EAAE,UAAU,CAAC,mBAAmB;QACnD,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;QAC7C,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAsB,EAAE,EAAE,CACzE,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAK,UAAU,EAAE,EAAuB,CAAC;KACtG,CAAC;AAAA,CACF;AAED,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB,CAClC,WAAuC,EACvC,UAAmC,EAChB;IACnB,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AAAA,CACnF;AAED;;;;;GAKG;AACH,MAAM,UAAU,iCAAiC,CAAC,IAAoB,EAAgC;IACrG,OAAO;QACN,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAiB;QAClC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;QAC7C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;KAC3G,CAAC;AAAA,CACF","sourcesContent":["import type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.ts\";\nimport { conCoercionDeArgumentos } from \"./coercion-argumentos.ts\";\n\n/**\n * Wrap a ToolDefinition into an AgentTool for the core runtime.\n *\n * AQUÍ va la coerción de argumentos, y no en `createTool`, porque ESTE es el\n * punto por el que pasan todas: `createReadTool`, `createBashTool`,\n * `createEditTool`… todas terminan llamando a esta función, y por tanto también\n * `createCodingTools`, que es lo que usa el SDK.\n *\n * Lo puse antes en `createTool`/`createToolDefinition` creyendo que eran los\n * embudos, y me equivoqué: `createCodingToolDefinitions` llama a cada fábrica\n * directamente y se los saltaba. Lo enseñó ejecutar la copia INSTALADA contra\n * un modelo de verdad — el rechazo seguía saliendo idéntico con la prueba en\n * verde, porque la prueba usaba `createTool`, que sí estaba cubierto.\n */\nexport function wrapToolDefinition<TDetails = unknown>(\n\tdefinition: ToolDefinition<any, TDetails>,\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any, TDetails> {\n\tconst conCoercion = conCoercionDeArgumentos(\n\t\tdefinition as { parameters?: unknown; prepareArguments?: (x: unknown) => unknown },\n\t);\n\tdefinition = conCoercion as typeof definition;\n\treturn {\n\t\tname: definition.name,\n\t\tlabel: definition.label,\n\t\tdescription: definition.description,\n\t\tparameters: definition.parameters,\n\t\tconstrainedSampling: definition.constrainedSampling,\n\t\tprepareArguments: definition.prepareArguments,\n\t\texecutionMode: definition.executionMode,\n\t\texecute: (toolCallId, params, signal, onUpdate, ctx?: ExtensionContext) =>\n\t\t\tdefinition.execute(toolCallId, params, signal, onUpdate, ctx ?? (ctxFactory?.() as ExtensionContext)),\n\t};\n}\n\n/** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */\nexport function wrapToolDefinitions(\n\tdefinitions: ToolDefinition<any, any>[],\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any>[] {\n\treturn definitions.map((definition) => wrapToolDefinition(definition, ctxFactory));\n}\n\n/**\n * Synthesize a minimal ToolDefinition from an AgentTool.\n *\n * This keeps AgentSession's internal registry definition-first even when a caller\n * provides plain AgentTool overrides that do not include prompt metadata or renderers.\n */\nexport function createToolDefinitionFromAgentTool(tool: AgentTool<any>): ToolDefinition<any, unknown> {\n\treturn {\n\t\tname: tool.name,\n\t\tlabel: tool.label,\n\t\tdescription: tool.description,\n\t\tparameters: tool.parameters as any,\n\t\tconstrainedSampling: tool.constrainedSampling,\n\t\tprepareArguments: tool.prepareArguments,\n\t\texecutionMode: tool.executionMode,\n\t\texecute: async (toolCallId, params, signal, onUpdate) => tool.execute(toolCallId, params, signal, onUpdate),\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"trust-manager.d.ts","sourceRoot":"","sources":["../../src/core/trust-manager.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,IAAI,CAAC;AAElD,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,oBAAoB,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAkCD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIzE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,kBAAkB,EAAE,CA8BpH;AAkFD;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAsBtE;AAED,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,SAAS,CAAS;IAE1B,YAAY,QAAQ,EAAE,MAAM,EAE3B;IAED,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAErC;IAED,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI,CAKnD;IAED,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAErD;IAED,OAAO,CAAC,SAAS,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAa7C;CACD","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport lockfile from \"proper-lockfile\";\nimport { CONFIG_DIR_NAME } from \"../config.ts\";\nimport { canonicalizePath, resolvePath } from \"../utils/paths.ts\";\n\nexport type ProjectTrustDecision = boolean | null;\n\nexport interface ProjectTrustStoreEntry {\n\tpath: string;\n\tdecision: boolean;\n}\n\nexport interface ProjectTrustUpdate {\n\tpath: string;\n\tdecision: ProjectTrustDecision;\n}\n\nexport interface ProjectTrustOption {\n\tlabel: string;\n\ttrusted: boolean;\n\tupdates: ProjectTrustUpdate[];\n\tsavedPath?: string;\n}\n\ntype TrustFile = Record<string, boolean | null | undefined>;\n\nconst TRUST_REQUIRING_PROJECT_CONFIG_RESOURCES = [\n\t\"settings.json\",\n\t\"extensions\",\n\t\"skills\",\n\t\"prompts\",\n\t\"themes\",\n\t\"SYSTEM.md\",\n\t\"APPEND_SYSTEM.md\",\n] as const;\n\nfunction normalizeCwd(cwd: string): string {\n\treturn canonicalizePath(resolvePath(cwd));\n}\n\nfunction findNearestTrustEntry(data: TrustFile, cwd: string): ProjectTrustStoreEntry | null {\n\tlet currentDir = normalizeCwd(cwd);\n\twhile (true) {\n\t\tconst value = data[currentDir];\n\t\tif (value === true || value === false) {\n\t\t\treturn { path: currentDir, decision: value };\n\t\t}\n\n\t\tconst parentDir = dirname(currentDir);\n\t\tif (parentDir === currentDir) {\n\t\t\treturn null;\n\t\t}\n\t\tcurrentDir = parentDir;\n\t}\n}\n\nexport function getProjectTrustParentPath(cwd: string): string | undefined {\n\tconst trustPath = normalizeCwd(cwd);\n\tconst parentDir = dirname(trustPath);\n\treturn parentDir === trustPath ? undefined : parentDir;\n}\n\nexport function getProjectTrustOptions(cwd: string, options?: { includeSessionOnly?: boolean }): ProjectTrustOption[] {\n\tconst trustPath = normalizeCwd(cwd);\n\tconst trustOptions: ProjectTrustOption[] = [\n\t\t{ label: \"Trust\", trusted: true, updates: [{ path: trustPath, decision: true }], savedPath: trustPath },\n\t];\n\tconst parentPath = getProjectTrustParentPath(cwd);\n\tif (parentPath !== undefined) {\n\t\ttrustOptions.push({\n\t\t\tlabel: `Trust parent folder (${parentPath})`,\n\t\t\ttrusted: true,\n\t\t\tupdates: [\n\t\t\t\t{ path: parentPath, decision: true },\n\t\t\t\t{ path: trustPath, decision: null },\n\t\t\t],\n\t\t\tsavedPath: parentPath,\n\t\t});\n\t}\n\tif (options?.includeSessionOnly) {\n\t\ttrustOptions.push({ label: \"Trust (this session only)\", trusted: true, updates: [] });\n\t}\n\ttrustOptions.push({\n\t\tlabel: \"Do not trust\",\n\t\ttrusted: false,\n\t\tupdates: [{ path: trustPath, decision: false }],\n\t\tsavedPath: trustPath,\n\t});\n\tif (options?.includeSessionOnly) {\n\t\ttrustOptions.push({ label: \"Do not trust (this session only)\", trusted: false, updates: [] });\n\t}\n\treturn trustOptions;\n}\n\nfunction readTrustFile(path: string): TrustFile {\n\tif (!existsSync(path)) {\n\t\treturn {};\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(readFileSync(path, \"utf-8\"));\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`Failed to read trust store ${path}: ${message}`);\n\t}\n\n\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n\t\tthrow new Error(`Invalid trust store ${path}: expected an object`);\n\t}\n\n\tconst data: TrustFile = {};\n\tfor (const [key, value] of Object.entries(parsed)) {\n\t\tif (value !== true && value !== false && value !== null) {\n\t\t\tthrow new Error(`Invalid trust store ${path}: value for ${JSON.stringify(key)} must be true, false, or null`);\n\t\t}\n\t\tdata[key] = value;\n\t}\n\treturn data;\n}\n\nfunction writeTrustFile(path: string, data: TrustFile): void {\n\tconst sorted: TrustFile = {};\n\tfor (const key of Object.keys(data).sort()) {\n\t\tconst value = data[key];\n\t\tif (value === true || value === false || value === null) {\n\t\t\tsorted[key] = value;\n\t\t}\n\t}\n\tmkdirSync(dirname(path), { recursive: true });\n\twriteFileSync(path, `${JSON.stringify(sorted, null, 2)}\\n`, \"utf-8\");\n}\n\nfunction acquireTrustLockSync(path: string): () => void {\n\tconst trustDir = dirname(path);\n\tmkdirSync(trustDir, { recursive: true });\n\tconst maxAttempts = 10;\n\tconst delayMs = 20;\n\tlet lastError: unknown;\n\n\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\ttry {\n\t\t\treturn lockfile.lockSync(trustDir, { realpath: false, lockfilePath: `${path}.lock` });\n\t\t} catch (error) {\n\t\t\tconst code =\n\t\t\t\ttypeof error === \"object\" && error !== null && \"code\" in error\n\t\t\t\t\t? String((error as { code?: unknown }).code)\n\t\t\t\t\t: undefined;\n\t\t\tif (code !== \"ELOCKED\" || attempt === maxAttempts) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tlastError = error;\n\t\t\tconst start = Date.now();\n\t\t\twhile (Date.now() - start < delayMs) {\n\t\t\t\t// Sleep synchronously to avoid changing trust store callers to async.\n\t\t\t}\n\t\t}\n\t}\n\n\tif (lastError instanceof Error) {\n\t\tthrow lastError;\n\t}\n\tthrow new Error(\"Failed to acquire trust store lock\");\n}\n\nfunction withTrustFileLock<T>(path: string, fn: () => T): T {\n\tconst release = acquireTrustLockSync(path);\n\ttry {\n\t\treturn fn();\n\t} finally {\n\t\trelease();\n\t}\n}\n\n/**\n * Returns true when cwd has project-local resources that must be gated by\n * project trust: trust-requiring entries under cwd/.pi, or .agents/skills in\n * cwd or one of its ancestors. Returns false when no such project resources\n * exist. The user/global ~/.agents/skills directory is always treated as a\n * trusted user resource and is ignored here, even when cwd is $HOME.\n */\nexport function hasTrustRequiringProjectResources(cwd: string): boolean {\n\tconst homeDir = canonicalizePath(resolvePath(process.env.HOME || homedir()));\n\tconst userAgentsSkillsDir = join(homeDir, \".agents\", \"skills\");\n\tlet currentDir = canonicalizePath(resolvePath(cwd));\n\n\tconst configDir = join(currentDir, CONFIG_DIR_NAME);\n\tif (TRUST_REQUIRING_PROJECT_CONFIG_RESOURCES.some((entry) => existsSync(join(configDir, entry)))) {\n\t\treturn true;\n\t}\n\n\twhile (true) {\n\t\tconst agentsSkillsDir = join(currentDir, \".agents\", \"skills\");\n\t\tif (agentsSkillsDir !== userAgentsSkillsDir && existsSync(agentsSkillsDir)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst parentDir = dirname(currentDir);\n\t\tif (parentDir === currentDir) {\n\t\t\treturn false;\n\t\t}\n\t\tcurrentDir = parentDir;\n\t}\n}\n\nexport class ProjectTrustStore {\n\tprivate trustPath: string;\n\n\tconstructor(agentDir: string) {\n\t\tthis.trustPath = join(resolvePath(agentDir), \"trust.json\");\n\t}\n\n\tget(cwd: string): ProjectTrustDecision {\n\t\treturn this.getEntry(cwd)?.decision ?? null;\n\t}\n\n\tgetEntry(cwd: string): ProjectTrustStoreEntry | null {\n\t\treturn withTrustFileLock(this.trustPath, () => {\n\t\t\tconst data = readTrustFile(this.trustPath);\n\t\t\treturn findNearestTrustEntry(data, cwd);\n\t\t});\n\t}\n\n\tset(cwd: string, decision: ProjectTrustDecision): void {\n\t\tthis.setMany([{ path: cwd, decision }]);\n\t}\n\n\tsetMany(decisions: ProjectTrustUpdate[]): void {\n\t\twithTrustFileLock(this.trustPath, () => {\n\t\t\tconst data = readTrustFile(this.trustPath);\n\t\t\tfor (const { path, decision } of decisions) {\n\t\t\t\tconst key = normalizeCwd(path);\n\t\t\t\tif (decision === null) {\n\t\t\t\t\tdelete data[key];\n\t\t\t\t} else {\n\t\t\t\t\tdata[key] = decision;\n\t\t\t\t}\n\t\t\t}\n\t\t\twriteTrustFile(this.trustPath, data);\n\t\t});\n\t}\n}\n"]}
1
+ {"version":3,"file":"trust-manager.d.ts","sourceRoot":"","sources":["../../src/core/trust-manager.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,IAAI,CAAC;AAElD,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,oBAAoB,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAkCD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIzE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,kBAAkB,EAAE,CA8BpH;AAkFD;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAsBtE;AAED,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,SAAS,CAAS;IAE1B,YAAY,QAAQ,EAAE,MAAM,EAE3B;IAED,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAErC;IAED,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI,CAKnD;IAED,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAErD;IAED,OAAO,CAAC,SAAS,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAa7C;CACD","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport lockfile from \"proper-lockfile\";\nimport { CONFIG_DIR_NAME } from \"../config.ts\";\nimport { canonicalizePath, resolvePath } from \"../utils/paths.ts\";\nimport { stripBom } from \"../utils/text.ts\";\n\nexport type ProjectTrustDecision = boolean | null;\n\nexport interface ProjectTrustStoreEntry {\n\tpath: string;\n\tdecision: boolean;\n}\n\nexport interface ProjectTrustUpdate {\n\tpath: string;\n\tdecision: ProjectTrustDecision;\n}\n\nexport interface ProjectTrustOption {\n\tlabel: string;\n\ttrusted: boolean;\n\tupdates: ProjectTrustUpdate[];\n\tsavedPath?: string;\n}\n\ntype TrustFile = Record<string, boolean | null | undefined>;\n\nconst TRUST_REQUIRING_PROJECT_CONFIG_RESOURCES = [\n\t\"settings.json\",\n\t\"extensions\",\n\t\"skills\",\n\t\"prompts\",\n\t\"themes\",\n\t\"SYSTEM.md\",\n\t\"APPEND_SYSTEM.md\",\n] as const;\n\nfunction normalizeCwd(cwd: string): string {\n\treturn canonicalizePath(resolvePath(cwd));\n}\n\nfunction findNearestTrustEntry(data: TrustFile, cwd: string): ProjectTrustStoreEntry | null {\n\tlet currentDir = normalizeCwd(cwd);\n\twhile (true) {\n\t\tconst value = data[currentDir];\n\t\tif (value === true || value === false) {\n\t\t\treturn { path: currentDir, decision: value };\n\t\t}\n\n\t\tconst parentDir = dirname(currentDir);\n\t\tif (parentDir === currentDir) {\n\t\t\treturn null;\n\t\t}\n\t\tcurrentDir = parentDir;\n\t}\n}\n\nexport function getProjectTrustParentPath(cwd: string): string | undefined {\n\tconst trustPath = normalizeCwd(cwd);\n\tconst parentDir = dirname(trustPath);\n\treturn parentDir === trustPath ? undefined : parentDir;\n}\n\nexport function getProjectTrustOptions(cwd: string, options?: { includeSessionOnly?: boolean }): ProjectTrustOption[] {\n\tconst trustPath = normalizeCwd(cwd);\n\tconst trustOptions: ProjectTrustOption[] = [\n\t\t{ label: \"Trust\", trusted: true, updates: [{ path: trustPath, decision: true }], savedPath: trustPath },\n\t];\n\tconst parentPath = getProjectTrustParentPath(cwd);\n\tif (parentPath !== undefined) {\n\t\ttrustOptions.push({\n\t\t\tlabel: `Trust parent folder (${parentPath})`,\n\t\t\ttrusted: true,\n\t\t\tupdates: [\n\t\t\t\t{ path: parentPath, decision: true },\n\t\t\t\t{ path: trustPath, decision: null },\n\t\t\t],\n\t\t\tsavedPath: parentPath,\n\t\t});\n\t}\n\tif (options?.includeSessionOnly) {\n\t\ttrustOptions.push({ label: \"Trust (this session only)\", trusted: true, updates: [] });\n\t}\n\ttrustOptions.push({\n\t\tlabel: \"Do not trust\",\n\t\ttrusted: false,\n\t\tupdates: [{ path: trustPath, decision: false }],\n\t\tsavedPath: trustPath,\n\t});\n\tif (options?.includeSessionOnly) {\n\t\ttrustOptions.push({ label: \"Do not trust (this session only)\", trusted: false, updates: [] });\n\t}\n\treturn trustOptions;\n}\n\nfunction readTrustFile(path: string): TrustFile {\n\tif (!existsSync(path)) {\n\t\treturn {};\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(stripBom(readFileSync(path, \"utf-8\")));\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`Failed to read trust store ${path}: ${message}`);\n\t}\n\n\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n\t\tthrow new Error(`Invalid trust store ${path}: expected an object`);\n\t}\n\n\tconst data: TrustFile = {};\n\tfor (const [key, value] of Object.entries(parsed)) {\n\t\tif (value !== true && value !== false && value !== null) {\n\t\t\tthrow new Error(`Invalid trust store ${path}: value for ${JSON.stringify(key)} must be true, false, or null`);\n\t\t}\n\t\tdata[key] = value;\n\t}\n\treturn data;\n}\n\nfunction writeTrustFile(path: string, data: TrustFile): void {\n\tconst sorted: TrustFile = {};\n\tfor (const key of Object.keys(data).sort()) {\n\t\tconst value = data[key];\n\t\tif (value === true || value === false || value === null) {\n\t\t\tsorted[key] = value;\n\t\t}\n\t}\n\tmkdirSync(dirname(path), { recursive: true });\n\twriteFileSync(path, `${JSON.stringify(sorted, null, 2)}\\n`, \"utf-8\");\n}\n\nfunction acquireTrustLockSync(path: string): () => void {\n\tconst trustDir = dirname(path);\n\tmkdirSync(trustDir, { recursive: true });\n\tconst maxAttempts = 10;\n\tconst delayMs = 20;\n\tlet lastError: unknown;\n\n\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\ttry {\n\t\t\treturn lockfile.lockSync(trustDir, { realpath: false, lockfilePath: `${path}.lock` });\n\t\t} catch (error) {\n\t\t\tconst code =\n\t\t\t\ttypeof error === \"object\" && error !== null && \"code\" in error\n\t\t\t\t\t? String((error as { code?: unknown }).code)\n\t\t\t\t\t: undefined;\n\t\t\tif (code !== \"ELOCKED\" || attempt === maxAttempts) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tlastError = error;\n\t\t\tconst start = Date.now();\n\t\t\twhile (Date.now() - start < delayMs) {\n\t\t\t\t// Sleep synchronously to avoid changing trust store callers to async.\n\t\t\t}\n\t\t}\n\t}\n\n\tif (lastError instanceof Error) {\n\t\tthrow lastError;\n\t}\n\tthrow new Error(\"Failed to acquire trust store lock\");\n}\n\nfunction withTrustFileLock<T>(path: string, fn: () => T): T {\n\tconst release = acquireTrustLockSync(path);\n\ttry {\n\t\treturn fn();\n\t} finally {\n\t\trelease();\n\t}\n}\n\n/**\n * Returns true when cwd has project-local resources that must be gated by\n * project trust: trust-requiring entries under cwd/.pi, or .agents/skills in\n * cwd or one of its ancestors. Returns false when no such project resources\n * exist. The user/global ~/.agents/skills directory is always treated as a\n * trusted user resource and is ignored here, even when cwd is $HOME.\n */\nexport function hasTrustRequiringProjectResources(cwd: string): boolean {\n\tconst homeDir = canonicalizePath(resolvePath(process.env.HOME || homedir()));\n\tconst userAgentsSkillsDir = join(homeDir, \".agents\", \"skills\");\n\tlet currentDir = canonicalizePath(resolvePath(cwd));\n\n\tconst configDir = join(currentDir, CONFIG_DIR_NAME);\n\tif (TRUST_REQUIRING_PROJECT_CONFIG_RESOURCES.some((entry) => existsSync(join(configDir, entry)))) {\n\t\treturn true;\n\t}\n\n\twhile (true) {\n\t\tconst agentsSkillsDir = join(currentDir, \".agents\", \"skills\");\n\t\tif (agentsSkillsDir !== userAgentsSkillsDir && existsSync(agentsSkillsDir)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst parentDir = dirname(currentDir);\n\t\tif (parentDir === currentDir) {\n\t\t\treturn false;\n\t\t}\n\t\tcurrentDir = parentDir;\n\t}\n}\n\nexport class ProjectTrustStore {\n\tprivate trustPath: string;\n\n\tconstructor(agentDir: string) {\n\t\tthis.trustPath = join(resolvePath(agentDir), \"trust.json\");\n\t}\n\n\tget(cwd: string): ProjectTrustDecision {\n\t\treturn this.getEntry(cwd)?.decision ?? null;\n\t}\n\n\tgetEntry(cwd: string): ProjectTrustStoreEntry | null {\n\t\treturn withTrustFileLock(this.trustPath, () => {\n\t\t\tconst data = readTrustFile(this.trustPath);\n\t\t\treturn findNearestTrustEntry(data, cwd);\n\t\t});\n\t}\n\n\tset(cwd: string, decision: ProjectTrustDecision): void {\n\t\tthis.setMany([{ path: cwd, decision }]);\n\t}\n\n\tsetMany(decisions: ProjectTrustUpdate[]): void {\n\t\twithTrustFileLock(this.trustPath, () => {\n\t\t\tconst data = readTrustFile(this.trustPath);\n\t\t\tfor (const { path, decision } of decisions) {\n\t\t\t\tconst key = normalizeCwd(path);\n\t\t\t\tif (decision === null) {\n\t\t\t\t\tdelete data[key];\n\t\t\t\t} else {\n\t\t\t\t\tdata[key] = decision;\n\t\t\t\t}\n\t\t\t}\n\t\t\twriteTrustFile(this.trustPath, data);\n\t\t});\n\t}\n}\n"]}
@@ -4,6 +4,7 @@ import { dirname, join } from "node:path";
4
4
  import lockfile from "proper-lockfile";
5
5
  import { CONFIG_DIR_NAME } from "../config.js";
6
6
  import { canonicalizePath, resolvePath } from "../utils/paths.js";
7
+ import { stripBom } from "../utils/text.js";
7
8
  const TRUST_REQUIRING_PROJECT_CONFIG_RESOURCES = [
8
9
  "settings.json",
9
10
  "extensions",
@@ -72,7 +73,7 @@ function readTrustFile(path) {
72
73
  }
73
74
  let parsed;
74
75
  try {
75
- parsed = JSON.parse(readFileSync(path, "utf-8"));
76
+ parsed = JSON.parse(stripBom(readFileSync(path, "utf-8")));
76
77
  }
77
78
  catch (error) {
78
79
  const message = error instanceof Error ? error.message : String(error);
@@ -1 +1 @@
1
- {"version":3,"file":"trust-manager.js","sourceRoot":"","sources":["../../src/core/trust-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport lockfile from \"proper-lockfile\";\nimport { CONFIG_DIR_NAME } from \"../config.ts\";\nimport { canonicalizePath, resolvePath } from \"../utils/paths.ts\";\n\nexport type ProjectTrustDecision = boolean | null;\n\nexport interface ProjectTrustStoreEntry {\n\tpath: string;\n\tdecision: boolean;\n}\n\nexport interface ProjectTrustUpdate {\n\tpath: string;\n\tdecision: ProjectTrustDecision;\n}\n\nexport interface ProjectTrustOption {\n\tlabel: string;\n\ttrusted: boolean;\n\tupdates: ProjectTrustUpdate[];\n\tsavedPath?: string;\n}\n\ntype TrustFile = Record<string, boolean | null | undefined>;\n\nconst TRUST_REQUIRING_PROJECT_CONFIG_RESOURCES = [\n\t\"settings.json\",\n\t\"extensions\",\n\t\"skills\",\n\t\"prompts\",\n\t\"themes\",\n\t\"SYSTEM.md\",\n\t\"APPEND_SYSTEM.md\",\n] as const;\n\nfunction normalizeCwd(cwd: string): string {\n\treturn canonicalizePath(resolvePath(cwd));\n}\n\nfunction findNearestTrustEntry(data: TrustFile, cwd: string): ProjectTrustStoreEntry | null {\n\tlet currentDir = normalizeCwd(cwd);\n\twhile (true) {\n\t\tconst value = data[currentDir];\n\t\tif (value === true || value === false) {\n\t\t\treturn { path: currentDir, decision: value };\n\t\t}\n\n\t\tconst parentDir = dirname(currentDir);\n\t\tif (parentDir === currentDir) {\n\t\t\treturn null;\n\t\t}\n\t\tcurrentDir = parentDir;\n\t}\n}\n\nexport function getProjectTrustParentPath(cwd: string): string | undefined {\n\tconst trustPath = normalizeCwd(cwd);\n\tconst parentDir = dirname(trustPath);\n\treturn parentDir === trustPath ? undefined : parentDir;\n}\n\nexport function getProjectTrustOptions(cwd: string, options?: { includeSessionOnly?: boolean }): ProjectTrustOption[] {\n\tconst trustPath = normalizeCwd(cwd);\n\tconst trustOptions: ProjectTrustOption[] = [\n\t\t{ label: \"Trust\", trusted: true, updates: [{ path: trustPath, decision: true }], savedPath: trustPath },\n\t];\n\tconst parentPath = getProjectTrustParentPath(cwd);\n\tif (parentPath !== undefined) {\n\t\ttrustOptions.push({\n\t\t\tlabel: `Trust parent folder (${parentPath})`,\n\t\t\ttrusted: true,\n\t\t\tupdates: [\n\t\t\t\t{ path: parentPath, decision: true },\n\t\t\t\t{ path: trustPath, decision: null },\n\t\t\t],\n\t\t\tsavedPath: parentPath,\n\t\t});\n\t}\n\tif (options?.includeSessionOnly) {\n\t\ttrustOptions.push({ label: \"Trust (this session only)\", trusted: true, updates: [] });\n\t}\n\ttrustOptions.push({\n\t\tlabel: \"Do not trust\",\n\t\ttrusted: false,\n\t\tupdates: [{ path: trustPath, decision: false }],\n\t\tsavedPath: trustPath,\n\t});\n\tif (options?.includeSessionOnly) {\n\t\ttrustOptions.push({ label: \"Do not trust (this session only)\", trusted: false, updates: [] });\n\t}\n\treturn trustOptions;\n}\n\nfunction readTrustFile(path: string): TrustFile {\n\tif (!existsSync(path)) {\n\t\treturn {};\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(readFileSync(path, \"utf-8\"));\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`Failed to read trust store ${path}: ${message}`);\n\t}\n\n\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n\t\tthrow new Error(`Invalid trust store ${path}: expected an object`);\n\t}\n\n\tconst data: TrustFile = {};\n\tfor (const [key, value] of Object.entries(parsed)) {\n\t\tif (value !== true && value !== false && value !== null) {\n\t\t\tthrow new Error(`Invalid trust store ${path}: value for ${JSON.stringify(key)} must be true, false, or null`);\n\t\t}\n\t\tdata[key] = value;\n\t}\n\treturn data;\n}\n\nfunction writeTrustFile(path: string, data: TrustFile): void {\n\tconst sorted: TrustFile = {};\n\tfor (const key of Object.keys(data).sort()) {\n\t\tconst value = data[key];\n\t\tif (value === true || value === false || value === null) {\n\t\t\tsorted[key] = value;\n\t\t}\n\t}\n\tmkdirSync(dirname(path), { recursive: true });\n\twriteFileSync(path, `${JSON.stringify(sorted, null, 2)}\\n`, \"utf-8\");\n}\n\nfunction acquireTrustLockSync(path: string): () => void {\n\tconst trustDir = dirname(path);\n\tmkdirSync(trustDir, { recursive: true });\n\tconst maxAttempts = 10;\n\tconst delayMs = 20;\n\tlet lastError: unknown;\n\n\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\ttry {\n\t\t\treturn lockfile.lockSync(trustDir, { realpath: false, lockfilePath: `${path}.lock` });\n\t\t} catch (error) {\n\t\t\tconst code =\n\t\t\t\ttypeof error === \"object\" && error !== null && \"code\" in error\n\t\t\t\t\t? String((error as { code?: unknown }).code)\n\t\t\t\t\t: undefined;\n\t\t\tif (code !== \"ELOCKED\" || attempt === maxAttempts) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tlastError = error;\n\t\t\tconst start = Date.now();\n\t\t\twhile (Date.now() - start < delayMs) {\n\t\t\t\t// Sleep synchronously to avoid changing trust store callers to async.\n\t\t\t}\n\t\t}\n\t}\n\n\tif (lastError instanceof Error) {\n\t\tthrow lastError;\n\t}\n\tthrow new Error(\"Failed to acquire trust store lock\");\n}\n\nfunction withTrustFileLock<T>(path: string, fn: () => T): T {\n\tconst release = acquireTrustLockSync(path);\n\ttry {\n\t\treturn fn();\n\t} finally {\n\t\trelease();\n\t}\n}\n\n/**\n * Returns true when cwd has project-local resources that must be gated by\n * project trust: trust-requiring entries under cwd/.pi, or .agents/skills in\n * cwd or one of its ancestors. Returns false when no such project resources\n * exist. The user/global ~/.agents/skills directory is always treated as a\n * trusted user resource and is ignored here, even when cwd is $HOME.\n */\nexport function hasTrustRequiringProjectResources(cwd: string): boolean {\n\tconst homeDir = canonicalizePath(resolvePath(process.env.HOME || homedir()));\n\tconst userAgentsSkillsDir = join(homeDir, \".agents\", \"skills\");\n\tlet currentDir = canonicalizePath(resolvePath(cwd));\n\n\tconst configDir = join(currentDir, CONFIG_DIR_NAME);\n\tif (TRUST_REQUIRING_PROJECT_CONFIG_RESOURCES.some((entry) => existsSync(join(configDir, entry)))) {\n\t\treturn true;\n\t}\n\n\twhile (true) {\n\t\tconst agentsSkillsDir = join(currentDir, \".agents\", \"skills\");\n\t\tif (agentsSkillsDir !== userAgentsSkillsDir && existsSync(agentsSkillsDir)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst parentDir = dirname(currentDir);\n\t\tif (parentDir === currentDir) {\n\t\t\treturn false;\n\t\t}\n\t\tcurrentDir = parentDir;\n\t}\n}\n\nexport class ProjectTrustStore {\n\tprivate trustPath: string;\n\n\tconstructor(agentDir: string) {\n\t\tthis.trustPath = join(resolvePath(agentDir), \"trust.json\");\n\t}\n\n\tget(cwd: string): ProjectTrustDecision {\n\t\treturn this.getEntry(cwd)?.decision ?? null;\n\t}\n\n\tgetEntry(cwd: string): ProjectTrustStoreEntry | null {\n\t\treturn withTrustFileLock(this.trustPath, () => {\n\t\t\tconst data = readTrustFile(this.trustPath);\n\t\t\treturn findNearestTrustEntry(data, cwd);\n\t\t});\n\t}\n\n\tset(cwd: string, decision: ProjectTrustDecision): void {\n\t\tthis.setMany([{ path: cwd, decision }]);\n\t}\n\n\tsetMany(decisions: ProjectTrustUpdate[]): void {\n\t\twithTrustFileLock(this.trustPath, () => {\n\t\t\tconst data = readTrustFile(this.trustPath);\n\t\t\tfor (const { path, decision } of decisions) {\n\t\t\t\tconst key = normalizeCwd(path);\n\t\t\t\tif (decision === null) {\n\t\t\t\t\tdelete data[key];\n\t\t\t\t} else {\n\t\t\t\t\tdata[key] = decision;\n\t\t\t\t}\n\t\t\t}\n\t\t\twriteTrustFile(this.trustPath, data);\n\t\t});\n\t}\n}\n"]}
1
+ {"version":3,"file":"trust-manager.js","sourceRoot":"","sources":["../../src/core/trust-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport lockfile from \"proper-lockfile\";\nimport { CONFIG_DIR_NAME } from \"../config.ts\";\nimport { canonicalizePath, resolvePath } from \"../utils/paths.ts\";\nimport { stripBom } from \"../utils/text.ts\";\n\nexport type ProjectTrustDecision = boolean | null;\n\nexport interface ProjectTrustStoreEntry {\n\tpath: string;\n\tdecision: boolean;\n}\n\nexport interface ProjectTrustUpdate {\n\tpath: string;\n\tdecision: ProjectTrustDecision;\n}\n\nexport interface ProjectTrustOption {\n\tlabel: string;\n\ttrusted: boolean;\n\tupdates: ProjectTrustUpdate[];\n\tsavedPath?: string;\n}\n\ntype TrustFile = Record<string, boolean | null | undefined>;\n\nconst TRUST_REQUIRING_PROJECT_CONFIG_RESOURCES = [\n\t\"settings.json\",\n\t\"extensions\",\n\t\"skills\",\n\t\"prompts\",\n\t\"themes\",\n\t\"SYSTEM.md\",\n\t\"APPEND_SYSTEM.md\",\n] as const;\n\nfunction normalizeCwd(cwd: string): string {\n\treturn canonicalizePath(resolvePath(cwd));\n}\n\nfunction findNearestTrustEntry(data: TrustFile, cwd: string): ProjectTrustStoreEntry | null {\n\tlet currentDir = normalizeCwd(cwd);\n\twhile (true) {\n\t\tconst value = data[currentDir];\n\t\tif (value === true || value === false) {\n\t\t\treturn { path: currentDir, decision: value };\n\t\t}\n\n\t\tconst parentDir = dirname(currentDir);\n\t\tif (parentDir === currentDir) {\n\t\t\treturn null;\n\t\t}\n\t\tcurrentDir = parentDir;\n\t}\n}\n\nexport function getProjectTrustParentPath(cwd: string): string | undefined {\n\tconst trustPath = normalizeCwd(cwd);\n\tconst parentDir = dirname(trustPath);\n\treturn parentDir === trustPath ? undefined : parentDir;\n}\n\nexport function getProjectTrustOptions(cwd: string, options?: { includeSessionOnly?: boolean }): ProjectTrustOption[] {\n\tconst trustPath = normalizeCwd(cwd);\n\tconst trustOptions: ProjectTrustOption[] = [\n\t\t{ label: \"Trust\", trusted: true, updates: [{ path: trustPath, decision: true }], savedPath: trustPath },\n\t];\n\tconst parentPath = getProjectTrustParentPath(cwd);\n\tif (parentPath !== undefined) {\n\t\ttrustOptions.push({\n\t\t\tlabel: `Trust parent folder (${parentPath})`,\n\t\t\ttrusted: true,\n\t\t\tupdates: [\n\t\t\t\t{ path: parentPath, decision: true },\n\t\t\t\t{ path: trustPath, decision: null },\n\t\t\t],\n\t\t\tsavedPath: parentPath,\n\t\t});\n\t}\n\tif (options?.includeSessionOnly) {\n\t\ttrustOptions.push({ label: \"Trust (this session only)\", trusted: true, updates: [] });\n\t}\n\ttrustOptions.push({\n\t\tlabel: \"Do not trust\",\n\t\ttrusted: false,\n\t\tupdates: [{ path: trustPath, decision: false }],\n\t\tsavedPath: trustPath,\n\t});\n\tif (options?.includeSessionOnly) {\n\t\ttrustOptions.push({ label: \"Do not trust (this session only)\", trusted: false, updates: [] });\n\t}\n\treturn trustOptions;\n}\n\nfunction readTrustFile(path: string): TrustFile {\n\tif (!existsSync(path)) {\n\t\treturn {};\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(stripBom(readFileSync(path, \"utf-8\")));\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`Failed to read trust store ${path}: ${message}`);\n\t}\n\n\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n\t\tthrow new Error(`Invalid trust store ${path}: expected an object`);\n\t}\n\n\tconst data: TrustFile = {};\n\tfor (const [key, value] of Object.entries(parsed)) {\n\t\tif (value !== true && value !== false && value !== null) {\n\t\t\tthrow new Error(`Invalid trust store ${path}: value for ${JSON.stringify(key)} must be true, false, or null`);\n\t\t}\n\t\tdata[key] = value;\n\t}\n\treturn data;\n}\n\nfunction writeTrustFile(path: string, data: TrustFile): void {\n\tconst sorted: TrustFile = {};\n\tfor (const key of Object.keys(data).sort()) {\n\t\tconst value = data[key];\n\t\tif (value === true || value === false || value === null) {\n\t\t\tsorted[key] = value;\n\t\t}\n\t}\n\tmkdirSync(dirname(path), { recursive: true });\n\twriteFileSync(path, `${JSON.stringify(sorted, null, 2)}\\n`, \"utf-8\");\n}\n\nfunction acquireTrustLockSync(path: string): () => void {\n\tconst trustDir = dirname(path);\n\tmkdirSync(trustDir, { recursive: true });\n\tconst maxAttempts = 10;\n\tconst delayMs = 20;\n\tlet lastError: unknown;\n\n\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\ttry {\n\t\t\treturn lockfile.lockSync(trustDir, { realpath: false, lockfilePath: `${path}.lock` });\n\t\t} catch (error) {\n\t\t\tconst code =\n\t\t\t\ttypeof error === \"object\" && error !== null && \"code\" in error\n\t\t\t\t\t? String((error as { code?: unknown }).code)\n\t\t\t\t\t: undefined;\n\t\t\tif (code !== \"ELOCKED\" || attempt === maxAttempts) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tlastError = error;\n\t\t\tconst start = Date.now();\n\t\t\twhile (Date.now() - start < delayMs) {\n\t\t\t\t// Sleep synchronously to avoid changing trust store callers to async.\n\t\t\t}\n\t\t}\n\t}\n\n\tif (lastError instanceof Error) {\n\t\tthrow lastError;\n\t}\n\tthrow new Error(\"Failed to acquire trust store lock\");\n}\n\nfunction withTrustFileLock<T>(path: string, fn: () => T): T {\n\tconst release = acquireTrustLockSync(path);\n\ttry {\n\t\treturn fn();\n\t} finally {\n\t\trelease();\n\t}\n}\n\n/**\n * Returns true when cwd has project-local resources that must be gated by\n * project trust: trust-requiring entries under cwd/.pi, or .agents/skills in\n * cwd or one of its ancestors. Returns false when no such project resources\n * exist. The user/global ~/.agents/skills directory is always treated as a\n * trusted user resource and is ignored here, even when cwd is $HOME.\n */\nexport function hasTrustRequiringProjectResources(cwd: string): boolean {\n\tconst homeDir = canonicalizePath(resolvePath(process.env.HOME || homedir()));\n\tconst userAgentsSkillsDir = join(homeDir, \".agents\", \"skills\");\n\tlet currentDir = canonicalizePath(resolvePath(cwd));\n\n\tconst configDir = join(currentDir, CONFIG_DIR_NAME);\n\tif (TRUST_REQUIRING_PROJECT_CONFIG_RESOURCES.some((entry) => existsSync(join(configDir, entry)))) {\n\t\treturn true;\n\t}\n\n\twhile (true) {\n\t\tconst agentsSkillsDir = join(currentDir, \".agents\", \"skills\");\n\t\tif (agentsSkillsDir !== userAgentsSkillsDir && existsSync(agentsSkillsDir)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst parentDir = dirname(currentDir);\n\t\tif (parentDir === currentDir) {\n\t\t\treturn false;\n\t\t}\n\t\tcurrentDir = parentDir;\n\t}\n}\n\nexport class ProjectTrustStore {\n\tprivate trustPath: string;\n\n\tconstructor(agentDir: string) {\n\t\tthis.trustPath = join(resolvePath(agentDir), \"trust.json\");\n\t}\n\n\tget(cwd: string): ProjectTrustDecision {\n\t\treturn this.getEntry(cwd)?.decision ?? null;\n\t}\n\n\tgetEntry(cwd: string): ProjectTrustStoreEntry | null {\n\t\treturn withTrustFileLock(this.trustPath, () => {\n\t\t\tconst data = readTrustFile(this.trustPath);\n\t\t\treturn findNearestTrustEntry(data, cwd);\n\t\t});\n\t}\n\n\tset(cwd: string, decision: ProjectTrustDecision): void {\n\t\tthis.setMany([{ path: cwd, decision }]);\n\t}\n\n\tsetMany(decisions: ProjectTrustUpdate[]): void {\n\t\twithTrustFileLock(this.trustPath, () => {\n\t\t\tconst data = readTrustFile(this.trustPath);\n\t\t\tfor (const { path, decision } of decisions) {\n\t\t\t\tconst key = normalizeCwd(path);\n\t\t\t\tif (decision === null) {\n\t\t\t\t\tdelete data[key];\n\t\t\t\t} else {\n\t\t\t\t\tdata[key] = decision;\n\t\t\t\t}\n\t\t\t}\n\t\t\twriteTrustFile(this.trustPath, data);\n\t\t});\n\t}\n}\n"]}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Distingue las TRES cosas distintas que puede ser un turno del modelo, porque
3
+ * confundir dos de ellas es un fallo que se lee como éxito:
4
+ *
5
+ * - `contesto`: trae texto, razonamiento o llamadas a herramienta.
6
+ * - `vacio`: el turno TERMINÓ bien y no trae NADA. El modelo no contestó.
7
+ * - `no-pudo`: error o abortado. No se sabe si habría contestado.
8
+ *
9
+ * El caso que lo motiva es real y de hoy: el modelo `x-preview-f-free`
10
+ * devolvía respuestas vacías y el banco las contaba como «el modelo decidió
11
+ * no editar» (un `fantasma`). Son cosas opuestas: una habla del modelo, la
12
+ * otra de que no hubo respuesta que medir. En la sesión interactiva el mismo
13
+ * turno se veía como silencio, indistinguible de un turno terminado.
14
+ *
15
+ * Un detector que grita siempre no vale, así que aquí se calla ante todo lo
16
+ * que no sea con certeza «nada»: un bloque de tipo desconocido cuenta como
17
+ * contenido, y un turno con razonamiento (aunque no haya texto) también.
18
+ */
19
+ /** Los tres estados. Nunca dos, nunca un booleano. */
20
+ export type EstadoDeTurno = "contesto" | "vacio" | "no-pudo";
21
+ /**
22
+ * Forma mínima de un mensaje de asistente. Se acepta laxa a propósito: por
23
+ * aquí pasan mensajes de disco (sesiones viejas) y de proveedores que mandan
24
+ * `content: null`.
25
+ */
26
+ export interface TurnoDelModelo {
27
+ content?: unknown;
28
+ stopReason?: string | null;
29
+ model?: string;
30
+ }
31
+ /**
32
+ * `stopReason` llega como `null` desde algunos proveedores y como `undefined`
33
+ * de sesiones antiguas; los dos significan «no lo sé», no «terminó bien».
34
+ */
35
+ export declare function estadoDelTurno(turno: TurnoDelModelo): EstadoDeTurno;
36
+ /** El texto que ve el usuario. Dice qué pasó y qué NO pasó. */
37
+ export declare function mensajeDeTurnoVacio(turno: TurnoDelModelo): string;
38
+ //# sourceMappingURL=detectar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectar.d.ts","sourceRoot":"","sources":["../../../src/core/turno-vacio/detectar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,sDAAsD;AACtD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAE7D;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAuBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,aAAa,CAMnE;AAED,mEAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CASjE","sourcesContent":["/**\n * Distingue las TRES cosas distintas que puede ser un turno del modelo, porque\n * confundir dos de ellas es un fallo que se lee como éxito:\n *\n * - `contesto`: trae texto, razonamiento o llamadas a herramienta.\n * - `vacio`: el turno TERMINÓ bien y no trae NADA. El modelo no contestó.\n * - `no-pudo`: error o abortado. No se sabe si habría contestado.\n *\n * El caso que lo motiva es real y de hoy: el modelo `x-preview-f-free`\n * devolvía respuestas vacías y el banco las contaba como «el modelo decidió\n * no editar» (un `fantasma`). Son cosas opuestas: una habla del modelo, la\n * otra de que no hubo respuesta que medir. En la sesión interactiva el mismo\n * turno se veía como silencio, indistinguible de un turno terminado.\n *\n * Un detector que grita siempre no vale, así que aquí se calla ante todo lo\n * que no sea con certeza «nada»: un bloque de tipo desconocido cuenta como\n * contenido, y un turno con razonamiento (aunque no haya texto) también.\n */\n\n/** Los tres estados. Nunca dos, nunca un booleano. */\nexport type EstadoDeTurno = \"contesto\" | \"vacio\" | \"no-pudo\";\n\n/**\n * Forma mínima de un mensaje de asistente. Se acepta laxa a propósito: por\n * aquí pasan mensajes de disco (sesiones viejas) y de proveedores que mandan\n * `content: null`.\n */\nexport interface TurnoDelModelo {\n\tcontent?: unknown;\n\tstopReason?: string | null;\n\tmodel?: string;\n}\n\nfunction tieneContenido(bloques: unknown): boolean {\n\tif (!Array.isArray(bloques)) return false;\n\tfor (const bloque of bloques) {\n\t\tif (bloque === null || typeof bloque !== \"object\") continue;\n\t\tconst b = bloque as { type?: unknown; text?: unknown; thinking?: unknown };\n\t\tif (b.type === \"toolCall\") return true;\n\t\tif (b.type === \"text\") {\n\t\t\tif (typeof b.text === \"string\" && b.text.trim() !== \"\") return true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (b.type === \"thinking\") {\n\t\t\tif (typeof b.thinking === \"string\" && b.thinking.trim() !== \"\") return true;\n\t\t\tcontinue;\n\t\t}\n\t\t// Tipo que este módulo no conoce: cuenta como contenido. Preferimos\n\t\t// callarnos antes que acusar de vacío un turno que sí trajo algo.\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * `stopReason` llega como `null` desde algunos proveedores y como `undefined`\n * de sesiones antiguas; los dos significan «no lo sé», no «terminó bien».\n */\nexport function estadoDelTurno(turno: TurnoDelModelo): EstadoDeTurno {\n\tconst parada = turno.stopReason ?? undefined;\n\tif (parada === undefined || parada === \"error\" || parada === \"aborted\" || parada === \"pending\") {\n\t\treturn \"no-pudo\";\n\t}\n\treturn tieneContenido(turno.content) ? \"contesto\" : \"vacio\";\n}\n\n/** El texto que ve el usuario. Dice qué pasó y qué NO pasó. */\nexport function mensajeDeTurnoVacio(turno: TurnoDelModelo): string {\n\tconst detalles: string[] = [];\n\tif (turno.model) detalles.push(`modelo ${turno.model}`);\n\tif (turno.stopReason) detalles.push(`parada «${turno.stopReason}»`);\n\tconst cola = detalles.length > 0 ? ` (${detalles.join(\", \")})` : \"\";\n\treturn (\n\t\t`El modelo no ha contestado: turno sin texto, sin razonamiento y sin llamadas a herramienta${cola}. ` +\n\t\t\"No es que haya decidido no hacer nada: no ha devuelto nada.\"\n\t);\n}\n"]}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Distingue las TRES cosas distintas que puede ser un turno del modelo, porque
3
+ * confundir dos de ellas es un fallo que se lee como éxito:
4
+ *
5
+ * - `contesto`: trae texto, razonamiento o llamadas a herramienta.
6
+ * - `vacio`: el turno TERMINÓ bien y no trae NADA. El modelo no contestó.
7
+ * - `no-pudo`: error o abortado. No se sabe si habría contestado.
8
+ *
9
+ * El caso que lo motiva es real y de hoy: el modelo `x-preview-f-free`
10
+ * devolvía respuestas vacías y el banco las contaba como «el modelo decidió
11
+ * no editar» (un `fantasma`). Son cosas opuestas: una habla del modelo, la
12
+ * otra de que no hubo respuesta que medir. En la sesión interactiva el mismo
13
+ * turno se veía como silencio, indistinguible de un turno terminado.
14
+ *
15
+ * Un detector que grita siempre no vale, así que aquí se calla ante todo lo
16
+ * que no sea con certeza «nada»: un bloque de tipo desconocido cuenta como
17
+ * contenido, y un turno con razonamiento (aunque no haya texto) también.
18
+ */
19
+ function tieneContenido(bloques) {
20
+ if (!Array.isArray(bloques))
21
+ return false;
22
+ for (const bloque of bloques) {
23
+ if (bloque === null || typeof bloque !== "object")
24
+ continue;
25
+ const b = bloque;
26
+ if (b.type === "toolCall")
27
+ return true;
28
+ if (b.type === "text") {
29
+ if (typeof b.text === "string" && b.text.trim() !== "")
30
+ return true;
31
+ continue;
32
+ }
33
+ if (b.type === "thinking") {
34
+ if (typeof b.thinking === "string" && b.thinking.trim() !== "")
35
+ return true;
36
+ continue;
37
+ }
38
+ // Tipo que este módulo no conoce: cuenta como contenido. Preferimos
39
+ // callarnos antes que acusar de vacío un turno que sí trajo algo.
40
+ return true;
41
+ }
42
+ return false;
43
+ }
44
+ /**
45
+ * `stopReason` llega como `null` desde algunos proveedores y como `undefined`
46
+ * de sesiones antiguas; los dos significan «no lo sé», no «terminó bien».
47
+ */
48
+ export function estadoDelTurno(turno) {
49
+ const parada = turno.stopReason ?? undefined;
50
+ if (parada === undefined || parada === "error" || parada === "aborted" || parada === "pending") {
51
+ return "no-pudo";
52
+ }
53
+ return tieneContenido(turno.content) ? "contesto" : "vacio";
54
+ }
55
+ /** El texto que ve el usuario. Dice qué pasó y qué NO pasó. */
56
+ export function mensajeDeTurnoVacio(turno) {
57
+ const detalles = [];
58
+ if (turno.model)
59
+ detalles.push(`modelo ${turno.model}`);
60
+ if (turno.stopReason)
61
+ detalles.push(`parada «${turno.stopReason}»`);
62
+ const cola = detalles.length > 0 ? ` (${detalles.join(", ")})` : "";
63
+ return (`El modelo no ha contestado: turno sin texto, sin razonamiento y sin llamadas a herramienta${cola}. ` +
64
+ "No es que haya decidido no hacer nada: no ha devuelto nada.");
65
+ }
66
+ //# sourceMappingURL=detectar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectar.js","sourceRoot":"","sources":["../../../src/core/turno-vacio/detectar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAgBH,SAAS,cAAc,CAAC,OAAgB,EAAW;IAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,SAAS;QAC5D,MAAM,CAAC,GAAG,MAAgE,CAAC;QAC3E,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC;QACvC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACvB,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;gBAAE,OAAO,IAAI,CAAC;YACpE,SAAS;QACV,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC3B,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE;gBAAE,OAAO,IAAI,CAAC;YAC5E,SAAS;QACV,CAAC;QACD,qEAAoE;QACpE,oEAAkE;QAClE,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CACb;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAqB,EAAiB;IACpE,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC;IAC7C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAChG,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;AAAA,CAC5D;AAED,mEAA+D;AAC/D,MAAM,UAAU,mBAAmB,CAAC,KAAqB,EAAU;IAClE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,KAAK,CAAC,KAAK;QAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,UAAU;QAAE,QAAQ,CAAC,IAAI,CAAC,YAAW,KAAK,CAAC,UAAU,IAAG,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,CACN,6FAA6F,IAAI,IAAI;QACrG,6DAA6D,CAC7D,CAAC;AAAA,CACF","sourcesContent":["/**\n * Distingue las TRES cosas distintas que puede ser un turno del modelo, porque\n * confundir dos de ellas es un fallo que se lee como éxito:\n *\n * - `contesto`: trae texto, razonamiento o llamadas a herramienta.\n * - `vacio`: el turno TERMINÓ bien y no trae NADA. El modelo no contestó.\n * - `no-pudo`: error o abortado. No se sabe si habría contestado.\n *\n * El caso que lo motiva es real y de hoy: el modelo `x-preview-f-free`\n * devolvía respuestas vacías y el banco las contaba como «el modelo decidió\n * no editar» (un `fantasma`). Son cosas opuestas: una habla del modelo, la\n * otra de que no hubo respuesta que medir. En la sesión interactiva el mismo\n * turno se veía como silencio, indistinguible de un turno terminado.\n *\n * Un detector que grita siempre no vale, así que aquí se calla ante todo lo\n * que no sea con certeza «nada»: un bloque de tipo desconocido cuenta como\n * contenido, y un turno con razonamiento (aunque no haya texto) también.\n */\n\n/** Los tres estados. Nunca dos, nunca un booleano. */\nexport type EstadoDeTurno = \"contesto\" | \"vacio\" | \"no-pudo\";\n\n/**\n * Forma mínima de un mensaje de asistente. Se acepta laxa a propósito: por\n * aquí pasan mensajes de disco (sesiones viejas) y de proveedores que mandan\n * `content: null`.\n */\nexport interface TurnoDelModelo {\n\tcontent?: unknown;\n\tstopReason?: string | null;\n\tmodel?: string;\n}\n\nfunction tieneContenido(bloques: unknown): boolean {\n\tif (!Array.isArray(bloques)) return false;\n\tfor (const bloque of bloques) {\n\t\tif (bloque === null || typeof bloque !== \"object\") continue;\n\t\tconst b = bloque as { type?: unknown; text?: unknown; thinking?: unknown };\n\t\tif (b.type === \"toolCall\") return true;\n\t\tif (b.type === \"text\") {\n\t\t\tif (typeof b.text === \"string\" && b.text.trim() !== \"\") return true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (b.type === \"thinking\") {\n\t\t\tif (typeof b.thinking === \"string\" && b.thinking.trim() !== \"\") return true;\n\t\t\tcontinue;\n\t\t}\n\t\t// Tipo que este módulo no conoce: cuenta como contenido. Preferimos\n\t\t// callarnos antes que acusar de vacío un turno que sí trajo algo.\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * `stopReason` llega como `null` desde algunos proveedores y como `undefined`\n * de sesiones antiguas; los dos significan «no lo sé», no «terminó bien».\n */\nexport function estadoDelTurno(turno: TurnoDelModelo): EstadoDeTurno {\n\tconst parada = turno.stopReason ?? undefined;\n\tif (parada === undefined || parada === \"error\" || parada === \"aborted\" || parada === \"pending\") {\n\t\treturn \"no-pudo\";\n\t}\n\treturn tieneContenido(turno.content) ? \"contesto\" : \"vacio\";\n}\n\n/** El texto que ve el usuario. Dice qué pasó y qué NO pasó. */\nexport function mensajeDeTurnoVacio(turno: TurnoDelModelo): string {\n\tconst detalles: string[] = [];\n\tif (turno.model) detalles.push(`modelo ${turno.model}`);\n\tif (turno.stopReason) detalles.push(`parada «${turno.stopReason}»`);\n\tconst cola = detalles.length > 0 ? ` (${detalles.join(\", \")})` : \"\";\n\treturn (\n\t\t`El modelo no ha contestado: turno sin texto, sin razonamiento y sin llamadas a herramienta${cola}. ` +\n\t\t\"No es que haya decidido no hacer nada: no ha devuelto nada.\"\n\t);\n}\n"]}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Diario para deshacer los cambios de ficheros de un turno.
3
+ *
4
+ * Guarda el estado ANTERIOR de cada fichero justo antes de tocarlo, agrupado
5
+ * por turno. `deshacer()` devuelve todos los ficheros del último turno a la vez,
6
+ * o ninguno: revertir la mitad de un cambio deja el repositorio en un estado que
7
+ * el agente no produjo nunca y que nadie ha revisado.
8
+ *
9
+ * El punto de captura es `withFileMutationQueue`, por donde pasan tanto `edit`
10
+ * como `write`. Engancharse ahí cubre las dos herramientas con un solo sitio, y
11
+ * cualquier herramienta futura que escriba ficheros entra gratis.
12
+ */
13
+ export interface EntradaDiario {
14
+ turno: number;
15
+ path: string;
16
+ /** Contenido anterior; `null` si el fichero no existía (lo creó el turno). */
17
+ previo: string | null;
18
+ /** `true` si era demasiado grande para fotografiar. */
19
+ omitido?: boolean;
20
+ ts: number;
21
+ }
22
+ /**
23
+ * Abre un turno nuevo. Todo lo que se escriba a partir de aquí se agrupa junto.
24
+ *
25
+ * El número de turno sale del diario, no de un contador en memoria: si el
26
+ * proceso se reinicia a mitad de sesión, el turno siguiente no puede reutilizar
27
+ * un número y mezclarse con cambios viejos.
28
+ */
29
+ export declare function abrirTurno(agentDir: string, cwd: string, ahora: number): number;
30
+ export declare function cerrarTurno(): void;
31
+ /**
32
+ * Fotografía un fichero antes de que lo toquen.
33
+ *
34
+ * Solo la PRIMERA vez dentro del turno: si el agente edita el mismo fichero
35
+ * cinco veces, deshacer debe devolverlo a como estaba antes de las cinco, no
36
+ * antes de la última.
37
+ */
38
+ export declare function registrarPrevio(rutaFichero: string): void;
39
+ export interface ResultadoDeshacer {
40
+ turno: number | null;
41
+ restaurados: string[];
42
+ borrados: string[];
43
+ omitidos: string[];
44
+ error?: string;
45
+ }
46
+ /**
47
+ * Deshace el último turno con cambios. Todo o nada.
48
+ *
49
+ * Antes de escribir nada se fotografía el estado actual de cada objetivo; si
50
+ * una escritura falla a mitad, se devuelven todas atrás. Sin eso, un fallo de
51
+ * permisos en el tercer fichero dejaría dos revertidos y tres no — un estado
52
+ * que nadie escribió ni revisó.
53
+ */
54
+ export declare function deshacer(agentDir: string, cwd: string): ResultadoDeshacer;
55
+ /** Qué haría un `undo` sin llegar a hacerlo. */
56
+ export declare function previsualizar(agentDir: string, cwd: string): EntradaDiario[];
57
+ //# sourceMappingURL=journal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../../../src/core/undo/journal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAcH,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,gFAA8E;IAC9E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,uDAAuD;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACX;AAgBD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAO/E;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CA6BzD;AAgBD,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAyDzE;AAED,kDAAgD;AAChD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,EAAE,CAI5E","sourcesContent":["/**\n * Diario para deshacer los cambios de ficheros de un turno.\n *\n * Guarda el estado ANTERIOR de cada fichero justo antes de tocarlo, agrupado\n * por turno. `deshacer()` devuelve todos los ficheros del último turno a la vez,\n * o ninguno: revertir la mitad de un cambio deja el repositorio en un estado que\n * el agente no produjo nunca y que nadie ha revisado.\n *\n * El punto de captura es `withFileMutationQueue`, por donde pasan tanto `edit`\n * como `write`. Engancharse ahí cubre las dos herramientas con un solo sitio, y\n * cualquier herramienta futura que escriba ficheros entra gratis.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { appendFileSync, existsSync, mkdirSync, readFileSync, statSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\n/**\n * Un fichero más grande que esto no se fotografía.\n *\n * Se registra igualmente, marcado, para poder DECIRLO al deshacer. Callarlo\n * sería peor: el usuario creería que revirtió todo cuando faltó un fichero.\n */\nconst MAX_FOTO_BYTES = 4 * 1024 * 1024;\n\nexport interface EntradaDiario {\n\tturno: number;\n\tpath: string;\n\t/** Contenido anterior; `null` si el fichero no existía (lo creó el turno). */\n\tprevio: string | null;\n\t/** `true` si era demasiado grande para fotografiar. */\n\tomitido?: boolean;\n\tts: number;\n}\n\ninterface TurnoActivo {\n\trutaDiario: string;\n\tturno: number;\n\tvistos: Set<string>;\n}\n\n/** El turno abierto ahora mismo. La cola de mutaciones no conoce la sesión. */\nlet activo: TurnoActivo | null = null;\n\nfunction rutaDelDiario(agentDir: string, cwd: string): string {\n\tconst clave = createHash(\"sha256\").update(cwd).digest(\"hex\").slice(0, 16);\n\treturn join(agentDir, \"undo\", `${clave}.jsonl`);\n}\n\n/**\n * Abre un turno nuevo. Todo lo que se escriba a partir de aquí se agrupa junto.\n *\n * El número de turno sale del diario, no de un contador en memoria: si el\n * proceso se reinicia a mitad de sesión, el turno siguiente no puede reutilizar\n * un número y mezclarse con cambios viejos.\n */\nexport function abrirTurno(agentDir: string, cwd: string, ahora: number): number {\n\tconst rutaDiario = rutaDelDiario(agentDir, cwd);\n\tmkdirSync(dirname(rutaDiario), { recursive: true, mode: 0o700 });\n\tconst turno = (leerEntradas(rutaDiario).at(-1)?.turno ?? 0) + 1;\n\tactivo = { rutaDiario, turno, vistos: new Set() };\n\tvoid ahora;\n\treturn turno;\n}\n\nexport function cerrarTurno(): void {\n\tactivo = null;\n}\n\n/**\n * Fotografía un fichero antes de que lo toquen.\n *\n * Solo la PRIMERA vez dentro del turno: si el agente edita el mismo fichero\n * cinco veces, deshacer debe devolverlo a como estaba antes de las cinco, no\n * antes de la última.\n */\nexport function registrarPrevio(rutaFichero: string): void {\n\tif (!activo || activo.vistos.has(rutaFichero)) return;\n\tactivo.vistos.add(rutaFichero);\n\n\tlet entrada: EntradaDiario;\n\ttry {\n\t\tif (!existsSync(rutaFichero)) {\n\t\t\tentrada = { turno: activo.turno, path: rutaFichero, previo: null, ts: Date.now() };\n\t\t} else if (statSync(rutaFichero).size > MAX_FOTO_BYTES) {\n\t\t\tentrada = { turno: activo.turno, path: rutaFichero, previo: null, omitido: true, ts: Date.now() };\n\t\t} else {\n\t\t\tentrada = {\n\t\t\t\tturno: activo.turno,\n\t\t\t\tpath: rutaFichero,\n\t\t\t\tprevio: readFileSync(rutaFichero, \"utf8\"),\n\t\t\t\tts: Date.now(),\n\t\t\t};\n\t\t}\n\t} catch {\n\t\t// Un fichero ilegible no puede impedir la edición; se marca omitido para\n\t\t// que deshacer lo diga en vez de fingir que lo revirtió.\n\t\tentrada = { turno: activo.turno, path: rutaFichero, previo: null, omitido: true, ts: Date.now() };\n\t}\n\ttry {\n\t\tappendFileSync(activo.rutaDiario, `${JSON.stringify(entrada)}\\n`, { mode: 0o600 });\n\t} catch {\n\t\t// El diario es una comodidad, no una garantía: si no se puede escribir,\n\t\t// la edición sigue adelante.\n\t}\n}\n\nfunction leerEntradas(rutaDiario: string): EntradaDiario[] {\n\tif (!existsSync(rutaDiario)) return [];\n\tconst entradas: EntradaDiario[] = [];\n\tfor (const linea of readFileSync(rutaDiario, \"utf8\").split(\"\\n\")) {\n\t\tif (!linea.trim()) continue;\n\t\ttry {\n\t\t\tentradas.push(JSON.parse(linea) as EntradaDiario);\n\t\t} catch {\n\t\t\t// Una línea corrupta no invalida el resto del diario.\n\t\t}\n\t}\n\treturn entradas;\n}\n\nexport interface ResultadoDeshacer {\n\tturno: number | null;\n\trestaurados: string[];\n\tborrados: string[];\n\tomitidos: string[];\n\terror?: string;\n}\n\n/**\n * Deshace el último turno con cambios. Todo o nada.\n *\n * Antes de escribir nada se fotografía el estado actual de cada objetivo; si\n * una escritura falla a mitad, se devuelven todas atrás. Sin eso, un fallo de\n * permisos en el tercer fichero dejaría dos revertidos y tres no — un estado\n * que nadie escribió ni revisó.\n */\nexport function deshacer(agentDir: string, cwd: string): ResultadoDeshacer {\n\tconst rutaDiario = rutaDelDiario(agentDir, cwd);\n\tconst entradas = leerEntradas(rutaDiario);\n\tconst ultimo = entradas.at(-1)?.turno;\n\tif (ultimo === undefined) return { turno: null, restaurados: [], borrados: [], omitidos: [] };\n\n\tconst delTurno = entradas.filter((e) => e.turno === ultimo);\n\tconst aplicables = delTurno.filter((e) => !e.omitido);\n\tconst omitidos = delTurno.filter((e) => e.omitido).map((e) => e.path);\n\n\t// Foto de seguridad para poder retroceder si algo peta a mitad.\n\tconst seguro = new Map<string, string | null>();\n\tfor (const e of aplicables) {\n\t\tseguro.set(e.path, existsSync(e.path) ? readFileSync(e.path, \"utf8\") : null);\n\t}\n\n\tconst restaurados: string[] = [];\n\tconst borrados: string[] = [];\n\ttry {\n\t\tfor (const e of aplicables) {\n\t\t\tif (e.previo === null) {\n\t\t\t\t// El turno creó el fichero: deshacer es borrarlo.\n\t\t\t\tif (existsSync(e.path)) unlinkSync(e.path);\n\t\t\t\tborrados.push(e.path);\n\t\t\t} else {\n\t\t\t\tmkdirSync(dirname(e.path), { recursive: true });\n\t\t\t\twriteFileSync(e.path, e.previo, \"utf8\");\n\t\t\t\trestaurados.push(e.path);\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tfor (const [ruta, contenido] of seguro) {\n\t\t\ttry {\n\t\t\t\tif (contenido === null) {\n\t\t\t\t\tif (existsSync(ruta)) unlinkSync(ruta);\n\t\t\t\t} else {\n\t\t\t\t\twriteFileSync(ruta, contenido, \"utf8\");\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Poco más se puede hacer; el mensaje de error lo dirá.\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tturno: ultimo,\n\t\t\trestaurados: [],\n\t\t\tborrados: [],\n\t\t\tomitidos,\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t};\n\t}\n\n\t// El turno deshecho sale del diario: deshacer dos veces debe ir al anterior,\n\t// no repetir el mismo.\n\tconst restantes = entradas.filter((e) => e.turno !== ultimo);\n\twriteFileSync(rutaDiario, restantes.map((e) => `${JSON.stringify(e)}\\n`).join(\"\"), { mode: 0o600 });\n\n\treturn { turno: ultimo, restaurados, borrados, omitidos };\n}\n\n/** Qué haría un `undo` sin llegar a hacerlo. */\nexport function previsualizar(agentDir: string, cwd: string): EntradaDiario[] {\n\tconst entradas = leerEntradas(rutaDelDiario(agentDir, cwd));\n\tconst ultimo = entradas.at(-1)?.turno;\n\treturn ultimo === undefined ? [] : entradas.filter((e) => e.turno === ultimo);\n}\n"]}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Diario para deshacer los cambios de ficheros de un turno.
3
+ *
4
+ * Guarda el estado ANTERIOR de cada fichero justo antes de tocarlo, agrupado
5
+ * por turno. `deshacer()` devuelve todos los ficheros del último turno a la vez,
6
+ * o ninguno: revertir la mitad de un cambio deja el repositorio en un estado que
7
+ * el agente no produjo nunca y que nadie ha revisado.
8
+ *
9
+ * El punto de captura es `withFileMutationQueue`, por donde pasan tanto `edit`
10
+ * como `write`. Engancharse ahí cubre las dos herramientas con un solo sitio, y
11
+ * cualquier herramienta futura que escriba ficheros entra gratis.
12
+ */
13
+ import { createHash } from "node:crypto";
14
+ import { appendFileSync, existsSync, mkdirSync, readFileSync, statSync, unlinkSync, writeFileSync } from "node:fs";
15
+ import { dirname, join } from "node:path";
16
+ /**
17
+ * Un fichero más grande que esto no se fotografía.
18
+ *
19
+ * Se registra igualmente, marcado, para poder DECIRLO al deshacer. Callarlo
20
+ * sería peor: el usuario creería que revirtió todo cuando faltó un fichero.
21
+ */
22
+ const MAX_FOTO_BYTES = 4 * 1024 * 1024;
23
+ /** El turno abierto ahora mismo. La cola de mutaciones no conoce la sesión. */
24
+ let activo = null;
25
+ function rutaDelDiario(agentDir, cwd) {
26
+ const clave = createHash("sha256").update(cwd).digest("hex").slice(0, 16);
27
+ return join(agentDir, "undo", `${clave}.jsonl`);
28
+ }
29
+ /**
30
+ * Abre un turno nuevo. Todo lo que se escriba a partir de aquí se agrupa junto.
31
+ *
32
+ * El número de turno sale del diario, no de un contador en memoria: si el
33
+ * proceso se reinicia a mitad de sesión, el turno siguiente no puede reutilizar
34
+ * un número y mezclarse con cambios viejos.
35
+ */
36
+ export function abrirTurno(agentDir, cwd, ahora) {
37
+ const rutaDiario = rutaDelDiario(agentDir, cwd);
38
+ mkdirSync(dirname(rutaDiario), { recursive: true, mode: 0o700 });
39
+ const turno = (leerEntradas(rutaDiario).at(-1)?.turno ?? 0) + 1;
40
+ activo = { rutaDiario, turno, vistos: new Set() };
41
+ void ahora;
42
+ return turno;
43
+ }
44
+ export function cerrarTurno() {
45
+ activo = null;
46
+ }
47
+ /**
48
+ * Fotografía un fichero antes de que lo toquen.
49
+ *
50
+ * Solo la PRIMERA vez dentro del turno: si el agente edita el mismo fichero
51
+ * cinco veces, deshacer debe devolverlo a como estaba antes de las cinco, no
52
+ * antes de la última.
53
+ */
54
+ export function registrarPrevio(rutaFichero) {
55
+ if (!activo || activo.vistos.has(rutaFichero))
56
+ return;
57
+ activo.vistos.add(rutaFichero);
58
+ let entrada;
59
+ try {
60
+ if (!existsSync(rutaFichero)) {
61
+ entrada = { turno: activo.turno, path: rutaFichero, previo: null, ts: Date.now() };
62
+ }
63
+ else if (statSync(rutaFichero).size > MAX_FOTO_BYTES) {
64
+ entrada = { turno: activo.turno, path: rutaFichero, previo: null, omitido: true, ts: Date.now() };
65
+ }
66
+ else {
67
+ entrada = {
68
+ turno: activo.turno,
69
+ path: rutaFichero,
70
+ previo: readFileSync(rutaFichero, "utf8"),
71
+ ts: Date.now(),
72
+ };
73
+ }
74
+ }
75
+ catch {
76
+ // Un fichero ilegible no puede impedir la edición; se marca omitido para
77
+ // que deshacer lo diga en vez de fingir que lo revirtió.
78
+ entrada = { turno: activo.turno, path: rutaFichero, previo: null, omitido: true, ts: Date.now() };
79
+ }
80
+ try {
81
+ appendFileSync(activo.rutaDiario, `${JSON.stringify(entrada)}\n`, { mode: 0o600 });
82
+ }
83
+ catch {
84
+ // El diario es una comodidad, no una garantía: si no se puede escribir,
85
+ // la edición sigue adelante.
86
+ }
87
+ }
88
+ function leerEntradas(rutaDiario) {
89
+ if (!existsSync(rutaDiario))
90
+ return [];
91
+ const entradas = [];
92
+ for (const linea of readFileSync(rutaDiario, "utf8").split("\n")) {
93
+ if (!linea.trim())
94
+ continue;
95
+ try {
96
+ entradas.push(JSON.parse(linea));
97
+ }
98
+ catch {
99
+ // Una línea corrupta no invalida el resto del diario.
100
+ }
101
+ }
102
+ return entradas;
103
+ }
104
+ /**
105
+ * Deshace el último turno con cambios. Todo o nada.
106
+ *
107
+ * Antes de escribir nada se fotografía el estado actual de cada objetivo; si
108
+ * una escritura falla a mitad, se devuelven todas atrás. Sin eso, un fallo de
109
+ * permisos en el tercer fichero dejaría dos revertidos y tres no — un estado
110
+ * que nadie escribió ni revisó.
111
+ */
112
+ export function deshacer(agentDir, cwd) {
113
+ const rutaDiario = rutaDelDiario(agentDir, cwd);
114
+ const entradas = leerEntradas(rutaDiario);
115
+ const ultimo = entradas.at(-1)?.turno;
116
+ if (ultimo === undefined)
117
+ return { turno: null, restaurados: [], borrados: [], omitidos: [] };
118
+ const delTurno = entradas.filter((e) => e.turno === ultimo);
119
+ const aplicables = delTurno.filter((e) => !e.omitido);
120
+ const omitidos = delTurno.filter((e) => e.omitido).map((e) => e.path);
121
+ // Foto de seguridad para poder retroceder si algo peta a mitad.
122
+ const seguro = new Map();
123
+ for (const e of aplicables) {
124
+ seguro.set(e.path, existsSync(e.path) ? readFileSync(e.path, "utf8") : null);
125
+ }
126
+ const restaurados = [];
127
+ const borrados = [];
128
+ try {
129
+ for (const e of aplicables) {
130
+ if (e.previo === null) {
131
+ // El turno creó el fichero: deshacer es borrarlo.
132
+ if (existsSync(e.path))
133
+ unlinkSync(e.path);
134
+ borrados.push(e.path);
135
+ }
136
+ else {
137
+ mkdirSync(dirname(e.path), { recursive: true });
138
+ writeFileSync(e.path, e.previo, "utf8");
139
+ restaurados.push(e.path);
140
+ }
141
+ }
142
+ }
143
+ catch (error) {
144
+ for (const [ruta, contenido] of seguro) {
145
+ try {
146
+ if (contenido === null) {
147
+ if (existsSync(ruta))
148
+ unlinkSync(ruta);
149
+ }
150
+ else {
151
+ writeFileSync(ruta, contenido, "utf8");
152
+ }
153
+ }
154
+ catch {
155
+ // Poco más se puede hacer; el mensaje de error lo dirá.
156
+ }
157
+ }
158
+ return {
159
+ turno: ultimo,
160
+ restaurados: [],
161
+ borrados: [],
162
+ omitidos,
163
+ error: error instanceof Error ? error.message : String(error),
164
+ };
165
+ }
166
+ // El turno deshecho sale del diario: deshacer dos veces debe ir al anterior,
167
+ // no repetir el mismo.
168
+ const restantes = entradas.filter((e) => e.turno !== ultimo);
169
+ writeFileSync(rutaDiario, restantes.map((e) => `${JSON.stringify(e)}\n`).join(""), { mode: 0o600 });
170
+ return { turno: ultimo, restaurados, borrados, omitidos };
171
+ }
172
+ /** Qué haría un `undo` sin llegar a hacerlo. */
173
+ export function previsualizar(agentDir, cwd) {
174
+ const entradas = leerEntradas(rutaDelDiario(agentDir, cwd));
175
+ const ultimo = entradas.at(-1)?.turno;
176
+ return ultimo === undefined ? [] : entradas.filter((e) => e.turno === ultimo);
177
+ }
178
+ //# sourceMappingURL=journal.js.map