agent-afk 5.208.4 → 5.209.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 (321) hide show
  1. package/dist/agent/session-ledger-project.d.ts +3 -0
  2. package/dist/agent/types/session-types.d.ts +3 -0
  3. package/dist/cli.mjs +4 -4
  4. package/dist/index.mjs +3 -3
  5. package/dist/telegram.mjs +3 -3
  6. package/dist/web-server/shared/ledger-adapter.d.ts +3 -0
  7. package/dist/web-ui-assets/assets/abap-BdImnpbu.js +1 -0
  8. package/dist/web-ui-assets/assets/actionscript-3-B3316cI-.js +1 -0
  9. package/dist/web-ui-assets/assets/ada-bCR0ucgS.js +1 -0
  10. package/dist/web-ui-assets/assets/ahk-CsyLZFj1.js +1 -0
  11. package/dist/web-ui-assets/assets/ahk2-8Zs4aa1G.js +1 -0
  12. package/dist/web-ui-assets/assets/andromeeda-C4gqWexZ.js +1 -0
  13. package/dist/web-ui-assets/assets/angular-html-DA-rfuFy.js +1 -0
  14. package/dist/web-ui-assets/assets/angular-ts-BrjP3tb8.js +1 -0
  15. package/dist/web-ui-assets/assets/apache-Pmp26Uib.js +1 -0
  16. package/dist/web-ui-assets/assets/apex-DhZFqWV2.js +1 -0
  17. package/dist/web-ui-assets/assets/apl-CORt7UWP.js +1 -0
  18. package/dist/web-ui-assets/assets/applescript-Co6uUVPk.js +1 -0
  19. package/dist/web-ui-assets/assets/ara-BRHolxvo.js +1 -0
  20. package/dist/web-ui-assets/assets/asciidoc-CSVQ5wI8.js +1 -0
  21. package/dist/web-ui-assets/assets/asm-D_Q5rh1f.js +1 -0
  22. package/dist/web-ui-assets/assets/astro-HNnZUWAn.js +1 -0
  23. package/dist/web-ui-assets/assets/aurora-x-D-2ljcwZ.js +1 -0
  24. package/dist/web-ui-assets/assets/awk-DMzUqQB5.js +1 -0
  25. package/dist/web-ui-assets/assets/ayu-dark-DYE7WIF3.js +1 -0
  26. package/dist/web-ui-assets/assets/ayu-light-BA47KaF1.js +1 -0
  27. package/dist/web-ui-assets/assets/ayu-mirage-32ctXXKs.js +1 -0
  28. package/dist/web-ui-assets/assets/ballerina-BFfxhgS-.js +1 -0
  29. package/dist/web-ui-assets/assets/bat-CickPsom.js +1 -0
  30. package/dist/web-ui-assets/assets/beancount-k_qm7-4y.js +1 -0
  31. package/dist/web-ui-assets/assets/berry-uYugtg8r.js +1 -0
  32. package/dist/web-ui-assets/assets/bibtex-CHM0blh-.js +1 -0
  33. package/dist/web-ui-assets/assets/bicep-Bmn6On1c.js +1 -0
  34. package/dist/web-ui-assets/assets/bird2-Bx8U0n9b.js +1 -0
  35. package/dist/web-ui-assets/assets/blade-2xfisSek.js +1 -0
  36. package/dist/web-ui-assets/assets/bsl-DlhNcFeZ.js +1 -0
  37. package/dist/web-ui-assets/assets/c-BIGW1oBm.js +1 -0
  38. package/dist/web-ui-assets/assets/c3-Dp5svz6Z.js +1 -0
  39. package/dist/web-ui-assets/assets/cadence-Bv_4Rxtq.js +1 -0
  40. package/dist/web-ui-assets/assets/cairo-KRGpt6FW.js +1 -0
  41. package/dist/web-ui-assets/assets/catppuccin-frappe-CZL1YF0i.js +1 -0
  42. package/dist/web-ui-assets/assets/catppuccin-latte-DH-8KZSZ.js +1 -0
  43. package/dist/web-ui-assets/assets/catppuccin-macchiato-B7yYVSCf.js +1 -0
  44. package/dist/web-ui-assets/assets/catppuccin-mocha-Ct7hS0mc.js +1 -0
  45. package/dist/web-ui-assets/assets/chapel-DTp_pixX.js +1 -0
  46. package/dist/web-ui-assets/assets/clarity-Dn5IMItf.js +1 -0
  47. package/dist/web-ui-assets/assets/clojure-P80f7IUj.js +1 -0
  48. package/dist/web-ui-assets/assets/cmake-D1j8_8rp.js +1 -0
  49. package/dist/web-ui-assets/assets/cobol-nBiQ_Alo.js +1 -0
  50. package/dist/web-ui-assets/assets/codeowners-Bp6g37R7.js +1 -0
  51. package/dist/web-ui-assets/assets/codeql-DsOJ9woJ.js +1 -0
  52. package/dist/web-ui-assets/assets/coffee-Ch7k5sss.js +1 -0
  53. package/dist/web-ui-assets/assets/common-lisp-Cg-RD9OK.js +1 -0
  54. package/dist/web-ui-assets/assets/coq-C7JzOVbR.js +1 -0
  55. package/dist/web-ui-assets/assets/cpp-BMRokrvK.js +1 -0
  56. package/dist/web-ui-assets/assets/crystal-DGywbUpC.js +1 -0
  57. package/dist/web-ui-assets/assets/csharp-DSvCPggb.js +1 -0
  58. package/dist/web-ui-assets/assets/css-CLj8gQPS.js +1 -0
  59. package/dist/web-ui-assets/assets/csv-fuZLfV_i.js +1 -0
  60. package/dist/web-ui-assets/assets/cue-D82EKSYY.js +1 -0
  61. package/dist/web-ui-assets/assets/cypher-COkxafJQ.js +1 -0
  62. package/dist/web-ui-assets/assets/d-85-TOEBH.js +1 -0
  63. package/dist/web-ui-assets/assets/dark-plus-C3mMm8J8.js +1 -0
  64. package/dist/web-ui-assets/assets/dart-bE4Kk8sk.js +1 -0
  65. package/dist/web-ui-assets/assets/dax-CEL-wOlO.js +1 -0
  66. package/dist/web-ui-assets/assets/desktop-BmXAJ9_W.js +1 -0
  67. package/dist/web-ui-assets/assets/diff-D97Zzqfu.js +1 -0
  68. package/dist/web-ui-assets/assets/docker-BcOcwvcX.js +1 -0
  69. package/dist/web-ui-assets/assets/dotenv-Da5cRb03.js +1 -0
  70. package/dist/web-ui-assets/assets/dracula-BzJJZx-M.js +1 -0
  71. package/dist/web-ui-assets/assets/dracula-soft-BXkSAIEj.js +1 -0
  72. package/dist/web-ui-assets/assets/dream-maker-BtqSS_iP.js +1 -0
  73. package/dist/web-ui-assets/assets/edge-FbVlp4U3.js +1 -0
  74. package/dist/web-ui-assets/assets/elixir-CkH2-t6x.js +1 -0
  75. package/dist/web-ui-assets/assets/elm-DbKCFpqz.js +1 -0
  76. package/dist/web-ui-assets/assets/emacs-lisp-C_m_b--Z.js +1 -0
  77. package/dist/web-ui-assets/assets/erb-DXfck5VN.js +1 -0
  78. package/dist/web-ui-assets/assets/erlang-DsQrWhSR.js +1 -0
  79. package/dist/web-ui-assets/assets/everforest-dark-BgDCqdQA.js +1 -0
  80. package/dist/web-ui-assets/assets/everforest-light-C8M2exoo.js +1 -0
  81. package/dist/web-ui-assets/assets/fennel-BYunw83y.js +1 -0
  82. package/dist/web-ui-assets/assets/fish-BvzEVeQv.js +1 -0
  83. package/dist/web-ui-assets/assets/fluent-C4IJs8-o.js +1 -0
  84. package/dist/web-ui-assets/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  85. package/dist/web-ui-assets/assets/fortran-free-form-BxgE0vQu.js +1 -0
  86. package/dist/web-ui-assets/assets/fsharp-CXgrBDvD.js +1 -0
  87. package/dist/web-ui-assets/assets/gdresource-TyuKm33G.js +1 -0
  88. package/dist/web-ui-assets/assets/gdscript-DqcFQ5yU.js +1 -0
  89. package/dist/web-ui-assets/assets/gdshader-DkwncUOv.js +1 -0
  90. package/dist/web-ui-assets/assets/genie-D0YGMca9.js +1 -0
  91. package/dist/web-ui-assets/assets/gherkin-DyxjwDmM.js +1 -0
  92. package/dist/web-ui-assets/assets/git-commit-F4YmCXRG.js +1 -0
  93. package/dist/web-ui-assets/assets/git-rebase-r7XF79zn.js +1 -0
  94. package/dist/web-ui-assets/assets/github-dark-DHJKELXO.js +1 -0
  95. package/dist/web-ui-assets/assets/github-dark-default-Cuk6v7N8.js +1 -0
  96. package/dist/web-ui-assets/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  97. package/dist/web-ui-assets/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  98. package/dist/web-ui-assets/assets/github-light-DAi9KRSo.js +1 -0
  99. package/dist/web-ui-assets/assets/github-light-default-D7oLnXFd.js +1 -0
  100. package/dist/web-ui-assets/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  101. package/dist/web-ui-assets/assets/gleam-BspZqrRM.js +1 -0
  102. package/dist/web-ui-assets/assets/glimmer-js-ByusRIyA.js +1 -0
  103. package/dist/web-ui-assets/assets/glimmer-ts-BfAWNZQY.js +1 -0
  104. package/dist/web-ui-assets/assets/glsl-DplSGwfg.js +1 -0
  105. package/dist/web-ui-assets/assets/gn-n2N0HUVH.js +1 -0
  106. package/dist/web-ui-assets/assets/gnuplot-DdkO51Og.js +1 -0
  107. package/dist/web-ui-assets/assets/go-C27-OAKa.js +1 -0
  108. package/dist/web-ui-assets/assets/graphql-ChdNCCLP.js +1 -0
  109. package/dist/web-ui-assets/assets/groovy-gcz8RCvz.js +1 -0
  110. package/dist/web-ui-assets/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  111. package/dist/web-ui-assets/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  112. package/dist/web-ui-assets/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  113. package/dist/web-ui-assets/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  114. package/dist/web-ui-assets/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  115. package/dist/web-ui-assets/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  116. package/dist/web-ui-assets/assets/hack-BWmVpMyf.js +1 -0
  117. package/dist/web-ui-assets/assets/haml-D5jkg6IW.js +1 -0
  118. package/dist/web-ui-assets/assets/handlebars-BpdQsYii.js +1 -0
  119. package/dist/web-ui-assets/assets/haskell-Df6bDoY_.js +1 -0
  120. package/dist/web-ui-assets/assets/haxe-CfZj7gIn.js +1 -0
  121. package/dist/web-ui-assets/assets/hcl-BWvSN4gD.js +1 -0
  122. package/dist/web-ui-assets/assets/hjson-D5-asLiD.js +1 -0
  123. package/dist/web-ui-assets/assets/hlsl-D3lLCCz7.js +1 -0
  124. package/dist/web-ui-assets/assets/horizon-BUw7H-hv.js +1 -0
  125. package/dist/web-ui-assets/assets/horizon-bright-CUuTKBJd.js +1 -0
  126. package/dist/web-ui-assets/assets/houston-DnULxvSX.js +1 -0
  127. package/dist/web-ui-assets/assets/html-derivative-DlHx6ybY.js +1 -0
  128. package/dist/web-ui-assets/assets/html-pp8916En.js +1 -0
  129. package/dist/web-ui-assets/assets/http-jrhK8wxY.js +1 -0
  130. package/dist/web-ui-assets/assets/hurl-irOxFIW8.js +1 -0
  131. package/dist/web-ui-assets/assets/hxml-2-FPmUDs.js +1 -0
  132. package/dist/web-ui-assets/assets/hy-DFXneXwc.js +1 -0
  133. package/dist/web-ui-assets/assets/imba-DGztddWO.js +1 -0
  134. package/dist/web-ui-assets/assets/index-B2zr9aOB.js +13 -0
  135. package/dist/web-ui-assets/assets/index-DThJH7ut.js +380 -0
  136. package/dist/web-ui-assets/assets/index-DoWw28qv.css +1 -0
  137. package/dist/web-ui-assets/assets/ini-BEwlwnbL.js +1 -0
  138. package/dist/web-ui-assets/assets/java-CylS5w8V.js +1 -0
  139. package/dist/web-ui-assets/assets/javascript-wDzz0qaB.js +1 -0
  140. package/dist/web-ui-assets/assets/jinja-f2NsQr07.js +1 -0
  141. package/dist/web-ui-assets/assets/jison-wvAkD_A8.js +1 -0
  142. package/dist/web-ui-assets/assets/json-Cp-IABpG.js +1 -0
  143. package/dist/web-ui-assets/assets/json5-C9tS-k6U.js +1 -0
  144. package/dist/web-ui-assets/assets/jsonc-Des-eS-w.js +1 -0
  145. package/dist/web-ui-assets/assets/jsonl-DcaNXYhu.js +1 -0
  146. package/dist/web-ui-assets/assets/jsonnet-DFQXde-d.js +1 -0
  147. package/dist/web-ui-assets/assets/jssm-C2t-YnRu.js +1 -0
  148. package/dist/web-ui-assets/assets/jsx-g9-lgVsj.js +1 -0
  149. package/dist/web-ui-assets/assets/julia-5Bft2YPA.js +1 -0
  150. package/dist/web-ui-assets/assets/just-Cwhn7H3k.js +1 -0
  151. package/dist/web-ui-assets/assets/kanagawa-dragon-BuwD2xS4.js +1 -0
  152. package/dist/web-ui-assets/assets/kanagawa-lotus-C3DzagqV.js +1 -0
  153. package/dist/web-ui-assets/assets/kanagawa-wave-DFGoQZhC.js +1 -0
  154. package/dist/web-ui-assets/assets/kdl-DV7GczEv.js +1 -0
  155. package/dist/web-ui-assets/assets/kotlin-BdnUsdx6.js +1 -0
  156. package/dist/web-ui-assets/assets/kusto-wEQ09or8.js +1 -0
  157. package/dist/web-ui-assets/assets/laserwave-DUszq2jm.js +1 -0
  158. package/dist/web-ui-assets/assets/latex-D5pSuvFb.js +1 -0
  159. package/dist/web-ui-assets/assets/lean-BZvkOJ9d.js +1 -0
  160. package/dist/web-ui-assets/assets/less-B1dDrJ26.js +1 -0
  161. package/dist/web-ui-assets/assets/light-plus-B7mTdjB0.js +1 -0
  162. package/dist/web-ui-assets/assets/liquid-C0sCDyMI.js +1 -0
  163. package/dist/web-ui-assets/assets/llvm-BZoOZj88.js +1 -0
  164. package/dist/web-ui-assets/assets/log-2UxHyX5q.js +1 -0
  165. package/dist/web-ui-assets/assets/logo-BtOb2qkB.js +1 -0
  166. package/dist/web-ui-assets/assets/lua-BaeVxFsk.js +1 -0
  167. package/dist/web-ui-assets/assets/luau-BnpPk5vE.js +1 -0
  168. package/dist/web-ui-assets/assets/make-CHLpvVh8.js +1 -0
  169. package/dist/web-ui-assets/assets/markdown-Cvjx9yec.js +1 -0
  170. package/dist/web-ui-assets/assets/marko-DjSrsDqO.js +1 -0
  171. package/dist/web-ui-assets/assets/material-theme-D5KoaKCx.js +1 -0
  172. package/dist/web-ui-assets/assets/material-theme-darker-BfHTSMKl.js +1 -0
  173. package/dist/web-ui-assets/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  174. package/dist/web-ui-assets/assets/material-theme-ocean-CyktbL80.js +1 -0
  175. package/dist/web-ui-assets/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  176. package/dist/web-ui-assets/assets/matlab-D7o27uSR.js +1 -0
  177. package/dist/web-ui-assets/assets/mdc-D1_yUvq7.js +1 -0
  178. package/dist/web-ui-assets/assets/mdx-Cmh6b_Ma.js +1 -0
  179. package/dist/web-ui-assets/assets/mermaid-CQcHuHx7.js +1 -0
  180. package/dist/web-ui-assets/assets/min-dark-CafNBF8u.js +1 -0
  181. package/dist/web-ui-assets/assets/min-light-CTRr51gU.js +1 -0
  182. package/dist/web-ui-assets/assets/mipsasm-CKIfxQSi.js +1 -0
  183. package/dist/web-ui-assets/assets/mojo-DJz3ZmWd.js +1 -0
  184. package/dist/web-ui-assets/assets/monokai-BRVnQi9A.js +1 -0
  185. package/dist/web-ui-assets/assets/moonbit-CHtswR0a.js +1 -0
  186. package/dist/web-ui-assets/assets/move-el3G9tDJ.js +1 -0
  187. package/dist/web-ui-assets/assets/narrat-DRg8JJMk.js +1 -0
  188. package/dist/web-ui-assets/assets/nextflow-C-mBbutL.js +1 -0
  189. package/dist/web-ui-assets/assets/nextflow-groovy-vE_lwT2v.js +1 -0
  190. package/dist/web-ui-assets/assets/nginx-BpAMiNFr.js +1 -0
  191. package/dist/web-ui-assets/assets/night-owl-C39BiMTA.js +1 -0
  192. package/dist/web-ui-assets/assets/night-owl-light-CMTm3GFP.js +1 -0
  193. package/dist/web-ui-assets/assets/nim-BIad80T-.js +1 -0
  194. package/dist/web-ui-assets/assets/nix-CwoSXNpI.js +1 -0
  195. package/dist/web-ui-assets/assets/nord-Ddv68eIx.js +1 -0
  196. package/dist/web-ui-assets/assets/nsis-BlV79W_Q.js +1 -0
  197. package/dist/web-ui-assets/assets/nushell-D3jzshHO.js +1 -0
  198. package/dist/web-ui-assets/assets/objective-c-DXmwc3jG.js +1 -0
  199. package/dist/web-ui-assets/assets/objective-cpp-CLxacb5B.js +1 -0
  200. package/dist/web-ui-assets/assets/ocaml-C0hk2d4L.js +1 -0
  201. package/dist/web-ui-assets/assets/odin-BBf5iR-q.js +1 -0
  202. package/dist/web-ui-assets/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  203. package/dist/web-ui-assets/assets/one-light-C3Wv6jpd.js +1 -0
  204. package/dist/web-ui-assets/assets/openscad-C4EeE6gA.js +1 -0
  205. package/dist/web-ui-assets/assets/org-DM6o9KBp.js +1 -0
  206. package/dist/web-ui-assets/assets/pascal-D93ZcfNL.js +1 -0
  207. package/dist/web-ui-assets/assets/perl-B9cMNwum.js +1 -0
  208. package/dist/web-ui-assets/assets/php-Csjmro_R.js +1 -0
  209. package/dist/web-ui-assets/assets/pkl-u5AG7uiY.js +1 -0
  210. package/dist/web-ui-assets/assets/plastic-3e1v2bzS.js +1 -0
  211. package/dist/web-ui-assets/assets/plsql-ChMvpjG-.js +1 -0
  212. package/dist/web-ui-assets/assets/po-BTJTHyun.js +1 -0
  213. package/dist/web-ui-assets/assets/poimandres-CS3Unz2-.js +1 -0
  214. package/dist/web-ui-assets/assets/polar-C0HS_06l.js +1 -0
  215. package/dist/web-ui-assets/assets/postcss-CXtECtnM.js +1 -0
  216. package/dist/web-ui-assets/assets/powerquery-CEu0bR-o.js +1 -0
  217. package/dist/web-ui-assets/assets/powershell-BmBUJMz7.js +1 -0
  218. package/dist/web-ui-assets/assets/prisma-Vru482bI.js +1 -0
  219. package/dist/web-ui-assets/assets/prolog-CbFg5uaA.js +1 -0
  220. package/dist/web-ui-assets/assets/proto-C7zT0LnQ.js +1 -0
  221. package/dist/web-ui-assets/assets/pug-DKIMFp6K.js +1 -0
  222. package/dist/web-ui-assets/assets/puppet-BMWR74SV.js +1 -0
  223. package/dist/web-ui-assets/assets/purescript-CklMAg4u.js +1 -0
  224. package/dist/web-ui-assets/assets/python-B6aJPvgy.js +1 -0
  225. package/dist/web-ui-assets/assets/qml-3beO22l8.js +1 -0
  226. package/dist/web-ui-assets/assets/qmldir-C8lEn-DE.js +1 -0
  227. package/dist/web-ui-assets/assets/qss-IeuSbFQv.js +1 -0
  228. package/dist/web-ui-assets/assets/r-Cf5RLm7j.js +1 -0
  229. package/dist/web-ui-assets/assets/racket-BqYA7rlc.js +1 -0
  230. package/dist/web-ui-assets/assets/raku-DXvB9xmW.js +1 -0
  231. package/dist/web-ui-assets/assets/razor-BjBPvh-w.js +1 -0
  232. package/dist/web-ui-assets/assets/rbs-CpoqiR4B.js +1 -0
  233. package/dist/web-ui-assets/assets/red-hvxz__6c.js +1 -0
  234. package/dist/web-ui-assets/assets/reg-C-SQnVFl.js +1 -0
  235. package/dist/web-ui-assets/assets/regexp-CDVJQ6XC.js +1 -0
  236. package/dist/web-ui-assets/assets/rel-C3B-1QV4.js +1 -0
  237. package/dist/web-ui-assets/assets/riscv-BM1_JUlF.js +1 -0
  238. package/dist/web-ui-assets/assets/ron-D8l8udqQ.js +1 -0
  239. package/dist/web-ui-assets/assets/rose-pine-5qJOZa0Y.js +1 -0
  240. package/dist/web-ui-assets/assets/rose-pine-dawn-zx0QlTCp.js +1 -0
  241. package/dist/web-ui-assets/assets/rose-pine-moon-C9pEdX9L.js +1 -0
  242. package/dist/web-ui-assets/assets/rosmsg-BJDFO7_C.js +1 -0
  243. package/dist/web-ui-assets/assets/rst-bs7f0vWN.js +1 -0
  244. package/dist/web-ui-assets/assets/ruby-C0TQ7zu5.js +1 -0
  245. package/dist/web-ui-assets/assets/rust-B1yitclQ.js +1 -0
  246. package/dist/web-ui-assets/assets/sas-DEy46yEz.js +1 -0
  247. package/dist/web-ui-assets/assets/sass-Cj5Yp3dK.js +1 -0
  248. package/dist/web-ui-assets/assets/scala-CqE71os6.js +1 -0
  249. package/dist/web-ui-assets/assets/scheme-C98Dy4si.js +1 -0
  250. package/dist/web-ui-assets/assets/scss-D5BDwBP9.js +1 -0
  251. package/dist/web-ui-assets/assets/sdbl-DVxCFoDh.js +1 -0
  252. package/dist/web-ui-assets/assets/shaderlab-Dg9Lc6iA.js +1 -0
  253. package/dist/web-ui-assets/assets/shellscript-Yzrsuije.js +1 -0
  254. package/dist/web-ui-assets/assets/shellsession-BADoaaVG.js +1 -0
  255. package/dist/web-ui-assets/assets/slack-dark-BthQWCQV.js +1 -0
  256. package/dist/web-ui-assets/assets/slack-ochin-DqwNpetd.js +1 -0
  257. package/dist/web-ui-assets/assets/smalltalk-BOQMe2GC.js +1 -0
  258. package/dist/web-ui-assets/assets/smithy-cds9vsN8.js +1 -0
  259. package/dist/web-ui-assets/assets/snazzy-light-Bw305WKR.js +1 -0
  260. package/dist/web-ui-assets/assets/solarized-dark-CpvCGNkr.js +1 -0
  261. package/dist/web-ui-assets/assets/solarized-light-Dlz6yCKv.js +1 -0
  262. package/dist/web-ui-assets/assets/solidity-DijEV5ha.js +1 -0
  263. package/dist/web-ui-assets/assets/soy-8wufbnw4.js +1 -0
  264. package/dist/web-ui-assets/assets/sparql-rVzFXLq3.js +1 -0
  265. package/dist/web-ui-assets/assets/splunk-BtCnVYZw.js +1 -0
  266. package/dist/web-ui-assets/assets/sql-CRqJ_cUM.js +1 -0
  267. package/dist/web-ui-assets/assets/ssh-config-_ykCGR6B.js +1 -0
  268. package/dist/web-ui-assets/assets/stata-DI20mbqo.js +1 -0
  269. package/dist/web-ui-assets/assets/stylus-BEDo0Tqx.js +1 -0
  270. package/dist/web-ui-assets/assets/surrealql-Cjom0U5J.js +1 -0
  271. package/dist/web-ui-assets/assets/svelte-Cy7k_4gC.js +1 -0
  272. package/dist/web-ui-assets/assets/swift-C2oV4EkX.js +1 -0
  273. package/dist/web-ui-assets/assets/synthwave-84-CbfX1IO0.js +1 -0
  274. package/dist/web-ui-assets/assets/system-verilog-0hqHdDBg.js +1 -0
  275. package/dist/web-ui-assets/assets/systemd-4A_iFExJ.js +1 -0
  276. package/dist/web-ui-assets/assets/talonscript-CkByrt1z.js +1 -0
  277. package/dist/web-ui-assets/assets/tasl-QIJgUcNo.js +1 -0
  278. package/dist/web-ui-assets/assets/tcl-dwOrl1Do.js +1 -0
  279. package/dist/web-ui-assets/assets/templ-DhtptRzy.js +1 -0
  280. package/dist/web-ui-assets/assets/terraform-BETggiCN.js +1 -0
  281. package/dist/web-ui-assets/assets/tex-D96PA37w.js +1 -0
  282. package/dist/web-ui-assets/assets/tokyo-night-hegEt444.js +1 -0
  283. package/dist/web-ui-assets/assets/toml-vGWfd6FD.js +1 -0
  284. package/dist/web-ui-assets/assets/ts-tags-D351s5mN.js +1 -0
  285. package/dist/web-ui-assets/assets/tsv-B_m7g4N7.js +1 -0
  286. package/dist/web-ui-assets/assets/tsx-COt5Ahok.js +1 -0
  287. package/dist/web-ui-assets/assets/turtle-BsS91CYL.js +1 -0
  288. package/dist/web-ui-assets/assets/twig-27uCiNez.js +1 -0
  289. package/dist/web-ui-assets/assets/typescript-BPQ3VLAy.js +1 -0
  290. package/dist/web-ui-assets/assets/typespec-CAFt9gP4.js +1 -0
  291. package/dist/web-ui-assets/assets/typst-BUadGCkm.js +1 -0
  292. package/dist/web-ui-assets/assets/v-BGw2Nkan.js +1 -0
  293. package/dist/web-ui-assets/assets/vala-CsfeWuGM.js +1 -0
  294. package/dist/web-ui-assets/assets/vb-Cu-pLBUe.js +1 -0
  295. package/dist/web-ui-assets/assets/verilog-nZwndyjY.js +1 -0
  296. package/dist/web-ui-assets/assets/vesper-DRje8inN.js +1 -0
  297. package/dist/web-ui-assets/assets/vhdl-CeAyd5Ju.js +1 -0
  298. package/dist/web-ui-assets/assets/viml-CJc9bBzg.js +1 -0
  299. package/dist/web-ui-assets/assets/vitesse-black-Bkuqu6BP.js +1 -0
  300. package/dist/web-ui-assets/assets/vitesse-dark-D0r3Knsf.js +1 -0
  301. package/dist/web-ui-assets/assets/vitesse-light-CVO1_9PV.js +1 -0
  302. package/dist/web-ui-assets/assets/vue-BqiEGhQt.js +1 -0
  303. package/dist/web-ui-assets/assets/vue-html-AaS7Mt5G.js +1 -0
  304. package/dist/web-ui-assets/assets/vue-vine-BoDAl6tE.js +1 -0
  305. package/dist/web-ui-assets/assets/vyper-CDx5xZoG.js +1 -0
  306. package/dist/web-ui-assets/assets/wasm-CG6Dc4jp.js +1 -0
  307. package/dist/web-ui-assets/assets/wasm-MzD3tlZU.js +1 -0
  308. package/dist/web-ui-assets/assets/wenyan-BV7otONQ.js +1 -0
  309. package/dist/web-ui-assets/assets/wgsl-Dx-B1_4e.js +1 -0
  310. package/dist/web-ui-assets/assets/wikitext-BhOHFoWU.js +1 -0
  311. package/dist/web-ui-assets/assets/wit-5i3qLPDT.js +1 -0
  312. package/dist/web-ui-assets/assets/wolfram-lXgVvXCa.js +1 -0
  313. package/dist/web-ui-assets/assets/xml-sdJ4AIDG.js +1 -0
  314. package/dist/web-ui-assets/assets/xsl-CtQFsRM5.js +1 -0
  315. package/dist/web-ui-assets/assets/yaml-Buea-lGh.js +1 -0
  316. package/dist/web-ui-assets/assets/zenscript-DVFEvuxE.js +1 -0
  317. package/dist/web-ui-assets/assets/zig-VOosw3JB.js +1 -0
  318. package/dist/web-ui-assets/index.html +2 -2
  319. package/package.json +1 -1
  320. package/dist/web-ui-assets/assets/index-3YQ3Lxgf.css +0 -1
  321. package/dist/web-ui-assets/assets/index-BRR0nDvU.js +0 -303
@@ -73,6 +73,9 @@ export type LedgerPayload = {
73
73
  errorClass?: string;
74
74
  errorMessage?: string;
75
75
  promptHead?: string;
76
+ turnCount?: number;
77
+ stopReason?: string;
78
+ parentToolUseId?: string;
76
79
  } | {
77
80
  kind: 'background_job';
78
81
  jobId: string;
@@ -98,6 +98,9 @@ export type OutputEvent = {
98
98
  errorClass?: string;
99
99
  errorMessage?: string;
100
100
  promptHead?: string;
101
+ turnCount?: number;
102
+ stopReason?: string;
103
+ parentToolUseId?: string;
101
104
  } | {
102
105
  type: 'background_job';
103
106
  jobId: string;
package/dist/cli.mjs CHANGED
@@ -436,7 +436,7 @@ ${o}`,paths:[t,n]}:o!==null?i={content:o,paths:[n]}:r!==null?i={content:r,paths:
436
436
 
437
437
  ${t}`}var iEe,FP=y(()=>{"use strict";iEe=new Set(["script","style","noscript","template","svg"])});function lEe(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(i),r(t?.reason??new Error("aborted"))},i=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function mG(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function cEe(e,t){let n=e.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,t)}async function fG(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??lEe,l=n.signal??void 0,c;for(let u=0;u<=o;u++){if(l?.aborted)throw l.reason??new Error("aborted");try{let d=await e(t,n);if(!aEe.has(d.status)||u===o)return d;let p=cEe(d,s)??mG(u,i,s);B("[web/retryFetch] retrying",{url:t,attempt:u,status:d.status,waitMs:p}),await d.body?.cancel().catch(()=>{}),await a(p,l)}catch(d){if(l?.aborted||(c=d,u===o))throw d;let p=mG(u,i,s);B("[web/retryFetch] retrying after error",{url:t,attempt:u,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var aEe,gG=y(()=>{"use strict";fe();aEe=new Set([429,502,503,504])});import{BlockList as uEe,isIP as BP}from"node:net";import{lookup as dEe}from"node:dns/promises";import{Agent as pEe}from"undici";function yG(){let e=k.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function hEe(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function NP(e){let t=BP(e);return t===0?!1:gEe.check(e,t===4?"ipv4":"ipv6")}async function bG(e){return dEe(e,{all:!0,verbatim:!0})}async function Va(e,t={}){if(t.allowPrivateHosts??yG())return{allowed:!0};let n;try{n=new URL(e)}catch{return{allowed:!1,reason:`"${e}" is not a valid absolute URL`}}if(n.protocol!=="http:"&&n.protocol!=="https:")return{allowed:!1,reason:`protocol "${n.protocol}" not supported (http/https only)`};let r=hEe(n.hostname),o=(a,l)=>`refusing to fetch ${l} \u2014 internal/private address ${a} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`;if(BP(r)!==0)return NP(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??bG,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(NP(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function _f(e,t={}){let n=await Va(e,t);if(!n.allowed)throw new en(n.reason)}async function ns(e,t,n={},r={}){let o={...r.lookupFn!==void 0?{lookupFn:r.lookupFn}:{},...r.allowPrivateHosts!==void 0?{allowPrivateHosts:r.allowPrivateHosts}:{}},i=t;for(let s=0;s<=hG;s++){await _f(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??yG())?{dispatcher:yEe}:{}},l=await fG(e,i,a,r.retry??{});if(!bEe.has(l.status))return l;let c=l.headers.get("location");if(c===null||c.trim()==="")return l;let u;try{u=new URL(c,l.url||i).toString()}catch{return l}await l.body?.cancel().catch(()=>{}),i=u}throw new en(`too many redirects (>${hG}) starting from ${t}`)}var mEe,fEe,gEe,en,yEe,hG,bEe,Ja=y(()=>{"use strict";F();gG();mEe=[["0.0.0.0",8],["10.0.0.0",8],["100.64.0.0",10],["127.0.0.0",8],["169.254.0.0",16],["172.16.0.0",12],["192.168.0.0",16]],fEe=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],gEe=(()=>{let e=new uEe;for(let[t,n]of mEe)e.addSubnet(t,n,"ipv4");for(let[t,n]of fEe)e.addSubnet(t,n,"ipv6");return e})(),en=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};yEe=new pEe({connect:{lookup(e,t,n){bG(e).then(r=>{let o=r.find(s=>NP(s.address));if(o!==void 0){n(new en(`refusing to connect to ${e} (resolved) \u2014 internal/private address ${o.address} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`),"",0);return}let i=r[0];if(i===void 0){n(new Error(`DNS lookup returned no addresses for ${e}`),"",0);return}n(null,i.address,BP(i.address))},r=>n(r,"",0))}}});hG=20,bEe=new Set([301,302,303,307,308])});var jP={};lt(jP,{enforceDomainPolicy:()=>Fr,loadBrowserConfig:()=>UP});import{readFileSync as wEe}from"node:fs";import{join as SEe}from"path";function vEe(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function wG(e,t){return vEe(t).test(e)}function EEe(e,t){if(e!==void 0){let n=e.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(t!==void 0){if(kEe.has(t))return!0;if(TEe.has(t))return!1}return!1}function SG(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function xEe(e){if(e===void 0||e==="")return"auto";if(e==="playwright"||e==="agent-browser"||e==="auto")return e;throw new Error(`AFK_BROWSER_BACKEND: must be "playwright", "agent-browser", or "auto", got: ${e}`)}function vG(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Lc(t),t}function REe(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function AEe(e){try{return wEe(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function CEe(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright"||t.backend==="agent-browser"||t.backend==="auto")n.backend=t.backend;else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: must be "playwright", "agent-browser", or "auto", got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=vG(t.defaultProfile)),n}function UP(e){let t=e?.env??k,n=e?.readFileSync??AEe,r=e?.surface??t.AGENT_SURFACE,o=EEe(t.AFK_BROWSER_HEADLESS,r),i=SG(t.AFK_BROWSER_ALLOWED_DOMAINS),s=SG(t.AFK_BROWSER_BLOCKED_DOMAINS),a=REe(t.AFK_BROWSER_DOM_SNAPSHOTS),l=xEe(t.AFK_BROWSER_BACKEND),c=vG(t.AFK_BROWSER_DEFAULT_PROFILE),u={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},d=t.AFK_BROWSER_CONFIG,p=d!==void 0&&d.trim()!==""?d.trim():SEe(wn(),"browser.json"),f=n(p);if(f===void 0)return u;let g;try{g=JSON.parse(f)}catch(b){throw new Error(`Failed to parse browser config at ${p}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=CEe(u,g);return h.configPath=p,h}function Fr(e,t){let n;try{n=new URL(e).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${e}`}}for(let r of t.blockedDomains)if(wG(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>wG(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var kEe,TEe,rs=y(()=>{"use strict";F();U();kEe=new Set(["daemon","subagent","telegram","afk"]),TEe=new Set(["repl","interactive","cli"])});import{readFileSync as _Ee}from"node:fs";import{join as PEe}from"node:path";import{homedir as IEe}from"node:os";function OEe(e){let t=e??MEe,n;try{n=_Ee(t,"utf8")}catch{return null}let r;try{r=JSON.parse(n)}catch{return null}if(typeof r!="object"||r===null||Array.isArray(r))return null;let o=r;if(typeof o.url!="string"||typeof o.token!="string"||typeof o.pid!="number")return null;let i;try{i=new URL(o.url)}catch{return null}let{hostname:s,protocol:a}=i;if(!(s==="127.0.0.1"||s==="localhost"||s==="::1")||a!=="http:")throw new Error(`Agent Browser connection file contains an untrusted URL: ${o.url}. Only http://127.0.0.1 or http://localhost is permitted.`);return{url:o.url,token:o.token,pid:o.pid,version:typeof o.version=="string"?o.version:"unknown"}}function $Ee(e){try{return process.kill(e,0),!0}catch{return!1}}async function DEe(e,t,n=2e3){try{let r=new AbortController,o=setTimeout(()=>r.abort(),n),i=await fetch(`${e}/health`,{method:"GET",headers:{Authorization:`Bearer ${t}`,Host:"127.0.0.1:8833"},signal:r.signal});return clearTimeout(o),i.ok}catch{return!1}}async function HP(e){let t=OEe(e);return t===null?{available:!1,connection:null,reason:"connection file missing or invalid"}:$Ee(t.pid)?await DEe(t.url,t.token)?{available:!0,connection:t,reason:null}:{available:!1,connection:t,reason:`health probe failed at ${t.url}`}:{available:!1,connection:t,reason:`stale connection file: PID ${t.pid} not alive`}}var MEe,kG=y(()=>{"use strict";MEe=PEe(IEe(),".config","agent-browser","connection.json")});async function TG(e){let{config:t,surface:n}=e;if(t.backend==="playwright")return{backend:"playwright",reason:"explicit config: backend=playwright",probeMs:0,availability:null};if(t.backend==="agent-browser"){let s=Date.now(),a=await HP(),l=Date.now()-s;if(!a.available)throw new Error(`AFK_BROWSER_BACKEND=agent-browser but Agent Browser is not available: ${a.reason}`);return{backend:"agent-browser",reason:"explicit config: backend=agent-browser",probeMs:l,availability:a}}if(n&&LEe.has(n))return{backend:"playwright",reason:`auto: surface "${n}" excluded from Agent Browser`,probeMs:0,availability:null};if(t.headless)return{backend:"playwright",reason:"auto: headless mode requires Playwright",probeMs:0,availability:null};let r=Date.now(),o=await HP(),i=Date.now()-r;return o.available?{backend:"agent-browser",reason:"auto: Agent Browser available and preferred",probeMs:i,availability:o}:{backend:"playwright",reason:`auto: Agent Browser unavailable (${o.reason})`,probeMs:i,availability:o}}var LEe,EG=y(()=>{"use strict";kG();LEe=new Set(["daemon","subagent"])});import{createHash as FEe}from"crypto";function xG(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&NEe.test(e.label))}function RG(e){return FEe("sha256").update(e,"utf8").digest("hex").slice(0,8)}function AG(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var NEe,Zw=y(()=>{"use strict";NEe=/password|secret|token|api[_-]?key|otp|2fa/i});import{randomBytes as BEe}from"crypto";import{mkdir as UEe,stat as jEe,writeFile as HEe}from"fs/promises";import{join as WP}from"path";import{gzip as WEe}from"zlib";import{promisify as KEe}from"util";function GEe(e){return WP(Xt(e),"browser")}function qEe(e){return WP(GEe(e),"screenshots")}function zEe(){return new Date().toISOString().replace(/[:.]/g,"-")}function VEe(){return BEe(3).toString("hex")}async function Au(e,t,n){if(t.length>CG)throw new Error(`writeScreenshotSidecar: buffer exceeds ${CG} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=qEe(e);await UEe(r,{recursive:!0});let o=`${zEe()}-${VEe()}-${n}.png`,i=WP(r,o);await HEe(i,t);let{size:s}=await jEe(i);return{path:i,bytes:s}}var pct,CG,KP=y(()=>{"use strict";U();Zw();pct=KEe(WEe);CG=5*1024*1024});var eS,_G=y(()=>{"use strict";fe();eS=class{baseUrl;token;constructor(t){this.baseUrl=t.url,this.token=t.token}async call(t,n,r=3e4){let o={version:1,method:t,params:n},i=new AbortController,s=setTimeout(()=>i.abort(),r);try{let a=await fetch(`${this.baseUrl}/agent`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.token}`,Host:new URL(this.baseUrl).host},body:JSON.stringify(o),signal:i.signal});if(!a.ok){let c=await a.text().catch(()=>"");throw new Error(`Agent Browser ${t} failed (HTTP ${a.status}): ${c}`)}let l=await a.json();if(l.ok===!1){let c=l.error,u=c?.code??"UNKNOWN",d=c?.message??JSON.stringify(l);throw new Error(`Agent Browser ${t} failed: [${String(u)}] ${String(d)}`)}return l.result}finally{clearTimeout(s)}}async listTabs(){return this.call("tabs.list",null)}async openTab(t){return{tabId:(await this.call("tabs.open",{url:t},6e4)).id}}async closeTab(t){await this.call("page.eval",{id:t,script:"window.close()"}).catch(n=>{B("[browser/agent-browser] closeTab window.close() failed (tab leak expected)",{tabId:t,err:n})})}async read(t,n){return this.call("page.read",{id:t,mode:n?.mode??"main",...n?.query?{query:n.query}:{},...n?.budget?{budget:n.budget}:{}})}async inspect(t,n){return this.call("page.inspect",{id:t,mode:n?.mode??"interactive",...n?.query?{query:n.query}:{},...n?.limit?{limit:n.limit}:{}})}async click(t,n){await this.call("page.click",{id:t,elementId:n})}async fill(t,n,r){await this.call("page.fill",{id:t,elementId:n,value:r})}async press(t,n,r){await this.call("page.press",{id:t,key:n,...r?{elementId:r}:{}})}async select(t,n,r){await this.call("page.select",{id:t,elementId:n,value:r})}async waitFor(t,n,r){await this.call("page.wait",{id:t,condition:n,...r?.value?{value:r.value}:{},...r?.timeout?{timeout:r.timeout}:{}},(r?.timeout??3e4)+5e3)}async evalScript(t,n){return this.call("page.eval",{id:t,script:n})}async screenshot(t){return this.call("page.screenshot",{id:t})}}});function GP(e){return{id:e.id,role:e.role,label:e.label,kind:e.kind,value:e.value,state:{disabled:e.disabled,...e.checked!==void 0?{checked:e.checked}:{},...e.selected!==void 0?{selected:e.selected}:{},...e.expanded!==void 0?{expanded:e.expanded}:{}},bbox:e.bbox,...e.selector?{selector:e.selector}:{}}}function PG(e,t){switch(t.kind){case"element_id":if(e.has(t.elementId))return t.elementId;throw new Error(`Element ${t.elementId} not found in current observation. Call browser_observe to refresh.`);case"selector":return null;case"semantic":return null}}async function qP(e,t,n,r,o,i){switch(n){case"click":await e.click(t,r);break;case"fill":if(o===void 0)throw new Error("fill requires a value");await e.fill(t,r,o);break;case"press":if(o===void 0)throw new Error("press requires a value (key combo)");await e.press(t,o,r);break;case"select":if(o===void 0)throw new Error("select requires a value");await e.select(t,r,o);break;case"hover":throw new Error("hover is not supported by Agent Browser; use element_id from a prior observation to target clicks instead");case"scroll_to":{let s=r.replace(/\\/g,"\\\\").replace(/"/g,'\\"');await e.evalScript(t,`document.querySelector('[data-element-id="${s}"]')?.scrollIntoView({behavior:'smooth',block:'center'})`);break}case"wait_for":await e.waitFor(t,"element",{value:r,timeout:i??1e4});break;default:throw new Error(`Unknown action: ${n}`)}}async function IG(e,t){if(t.target.kind!=="semantic")throw new Error("resolveSemanticAndAct called with non-semantic target");let{elements:n}=await e.client.inspect(e.tabId,{mode:"interactive",query:t.target.text,limit:10}),r=n;if(t.target.role){let l=t.target.role.toLowerCase();r=n.filter(c=>c.role.toLowerCase()===l)}if(r.length===0)throw new Error(`No element found matching semantic target: text="${t.target.text}"`+(t.target.role?`, role="${t.target.role}"`:""));if(r.length>1)return{outcome:"ambiguous_target",query:{text:t.target.text,...t.target.role?{role:t.target.role}:{}},candidates:r.slice(0,5).map(GP)};let i=r[0].id;await qP(e.client,e.tabId,t.action,i,t.value,t.timeoutMs);let s=await e.client.read(e.tabId,{mode:"main"}),a=Fr(s.url,e.config);return a.allowed?{elementId:i}:{outcome:"blocked_by_policy",url:s.url,reason:`action navigated to blocked domain: ${a.reason}`}}var MG=y(()=>{"use strict";rs()});var OG={};lt(OG,{AgentBrowserProvider:()=>zP});var zP,$G=y(()=>{"use strict";rs();KP();_G();MG();zP=class{name="agent-browser";config;client;sessions=new Map;constructor(t,n){this.config=t,this.client=new eS(n)}async open(t){let n=Fr(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let r=this.sessions.get(t.sessionId);if(r)await this.client.evalScript(r.tabId,`window.location.href = ${JSON.stringify(t.url)}`),await this.client.waitFor(r.tabId,"load",{timeout:t.timeoutMs??3e4});else{let{tabId:s}=await this.client.openTab(t.url);await this.client.waitFor(s,"load",{timeout:t.timeoutMs??3e4}),r={tabId:s,observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null},this.sessions.set(t.sessionId,r)}let o=await this.client.read(r.tabId,{mode:"main"}),i=Fr(o.url,this.config);return i.allowed?this.buildObservation(r,t.sessionId,t.screenshot,void 0,"browser_open"):(await this.client.evalScript(r.tabId,"window.location.href = 'about:blank'").catch(()=>{}),{outcome:"blocked_by_policy",url:o.url,reason:`redirected to blocked domain: ${i.reason}`})}async observe(t){let n=this.sessions.get(t.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${t.sessionId}. Call browser_open first.`);return this.buildObservation(n,t.sessionId,t.screenshot,t.maxElements,"browser_observe")}async act(t){let n=this.sessions.get(t.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${t.sessionId}. Call browser_open first.`);let r=PG(n.knownElements,t.target);if(r===null){if(t.target.kind==="semantic"){let s=await IG({client:this.client,config:this.config,tabId:n.tabId},t);return"outcome"in s?s:(n.lastAction=`browser_act:${t.action}`,n.lastActionAt=new Date().toISOString(),this.buildObservation(n,t.sessionId,t.screenshot,void 0,"browser_act"))}throw t.target.kind==="selector"?new Error("selector targets are not supported by Agent Browser; use element_id or semantic targets"):new Error(`Cannot resolve target: ${JSON.stringify(t.target)}`)}await qP(this.client,n.tabId,t.action,r,t.value,t.timeoutMs),n.lastAction=`browser_act:${t.action}`,n.lastActionAt=new Date().toISOString();let o=await this.client.read(n.tabId,{mode:"main"}),i=Fr(o.url,this.config);return i.allowed?this.buildObservation(n,t.sessionId,t.screenshot,void 0,"browser_act"):(await this.client.evalScript(n.tabId,"window.location.href = 'about:blank'").catch(()=>{}),{outcome:"blocked_by_policy",url:o.url,reason:`action navigated to blocked domain: ${i.reason}`})}async render(t){throw new Error("AgentBrowserProvider does not support render(). Use PlaywrightProvider for one-shot content fetches.")}async screenshot(t){let n=this.sessions.get(t.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${t.sessionId}. Call browser_open first.`);if(t.target!==void 0||t.fullPage)throw new Error("Agent Browser does not support element or full-page screenshots; omit target and fullPage.");let r=await this.client.screenshot(n.tabId),o=Buffer.from(r.data,"base64"),i=o.length>=24?o.readUInt32BE(16):0,s=o.length>=24?o.readUInt32BE(20):0;return{path:(await Au(t.sessionId,o,"browser_screenshot")).path,bytes:o.length,width:i,height:s,dataBase64:r.data,mediaType:"image/png"}}async extract(t){throw new Error("AgentBrowserProvider does not support extract() yet.")}async close(t){let n=this.sessions.get(t.sessionId);if(n){try{await this.client.closeTab(n.tabId)}catch{}this.sessions.delete(t.sessionId)}}describe(t){let n=this.sessions.get(t);return n?{active:!0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:1}:null}async shutdown(){let t=Array.from(this.sessions.entries()).map(async([,n])=>{try{await this.client.closeTab(n.tabId)}catch{}});await Promise.all(t),this.sessions.clear()}async buildObservation(t,n,r,o,i="browser_open"){let[s,a]=await Promise.all([this.client.read(t.tabId,{mode:"main",budget:4e3}),this.client.inspect(t.tabId,{mode:"interactive",limit:o??80})]),l=a.elements.map(GP),c=o??80,u=l.slice(0,c);t.observationCounter+=1,t.knownElements=new Map(u.map(h=>[h.id,h])),t.currentUrl=s.url,t.currentTitle=s.title;let d=[];l.length>c&&d.push(`page has ${l.length} interactive elements; showing first ${c}`);let p=null;if(r)try{let h=await this.client.screenshot(t.tabId),b=Buffer.from(h.data,"base64");p=(await Au(n,b,i)).path}catch{d.push("screenshot capture failed")}let f=`obs_${t.observationCounter.toString(36)}`,g={httpStatus:null,loadingState:"idle",hasDialog:!1,consoleErrors:0};return{observationId:f,url:s.url,title:s.title,textSummary:s.content.slice(0,4e3),interactive:u,status:g,warnings:d,screenshotPath:p,capturedAt:new Date().toISOString()}}}});import{existsSync as JEe,readFileSync as YEe}from"node:fs";import{createRequire as XEe}from"node:module";import{dirname as QEe,join as ZEe}from"node:path";function FG(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<txe&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function xn(e){let t=FG(e);return LG.some(n=>t.includes(n))}function nxe(){try{let t=XEe(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(YEe(t,"utf8"));if(typeof n!="object"||n===null)return;let r=n.bin,o=typeof r=="string"?r:typeof r=="object"&&r!==null?r.playwright:void 0;if(typeof o!="string"||o.length===0)return;let i=ZEe(QEe(t),o);return JEe(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function Pf(){return DG??=nxe()??exe,DG}function VP(e){return e.includes("install chromium")}function lr(e,t){let n=FG(e),r=t?.latched===!0?` ${rxe}`:"";if(n.includes("Executable doesn't exist")){let o="";return t?.headless===!0?o=" This launch was headless, which needs the `chromium_headless_shell-*` build.":t?.headless===!1&&(o=" This launch was headed, which needs the full `chromium-*` build \u2014 the headless shell alone does not satisfy it."),`browser tools require the Playwright chromium binary. Install via: ${Pf()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Pf()}). Or pick a different tool.${r}`}function Cu(e,t,n=!1){if(!xn(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
438
438
 
439
- ${lr(e,{headless:t,latched:n})}`,{cause:e})}var LG,exe,txe,DG,rxe,tS=y(()=>{"use strict";LG=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],exe="pnpm exec playwright install chromium",txe=4;rxe="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import Ya from"node:fs";import nS from"node:path";import{randomBytes as oxe}from"node:crypto";function ixe(){try{return"5.208.4"}catch{}try{let e=nS.resolve(import.meta.dirname,"../../../package.json"),t=Ya.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var sxe,rS,NG=y(()=>{"use strict";tS();U();fe();sxe=ixe(),rS=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=(async()=>{let t;try{({chromium:t}=await import("playwright"))}catch(n){let r=Cu(n,this.config.headless,!0);throw this.latchLaunchFailure(r),this.launchPromise=void 0,r}try{let n=await t.launch({headless:this.config.headless});return this.browser=n,this.clearLaunchFailure(),n}catch(n){let r=Cu(n,this.config.headless,!0);throw this.latchLaunchFailure(r),r}finally{this.launchPromise=void 0}})(),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${sxe}`}}loadStorageState(t){let n=Fc(t);try{if(!Ya.existsSync(n))return;let r=JSON.parse(Ya.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Fc(t);if(!Ya.existsSync(r))return;let o=await n.storageState(),i=nS.join(nS.dirname(r),`.${nS.basename(r)}.${process.pid}.${oxe(4).toString("hex")}.tmp`);Ya.writeFileSync(i,JSON.stringify(o),{mode:384}),Ya.chmodSync(i,384),Ya.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as axe}from"node:crypto";function lxe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function cxe(e,t,n){return`el_${axe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function uxe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function BG(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function jG(e,t){let n=e.role??"",r=e.name??"";UG.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])jG(i,t)}async function dxe(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let u=window.getComputedStyle(s);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},HG).catch(()=>[])}async function pxe(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},HG).catch(()=>[])}function mxe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function oS(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=mxe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=dxe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,w=!1;d!==null?(b=[],jG(d,b)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,b=(await pxe(e)).filter(M=>UG.has(M.role??"")));let S=new Map;for(let _ of p){let M=BG(_.name),N=S.get(M);(!N||N.bbox.w===0&&_.bbox.w>0)&&S.set(M,_)}let v=b.map(_=>({ax:_,dom:S.get(BG(_.name??""))})),E=r?v:v.filter(_=>_.dom?_.dom.bbox.w>0||_.dom.bbox.h>0:!0);E.sort((_,M)=>{let N=_.dom?.bbox.y??0,O=M.dom?.bbox.y??0;if(N!==O)return N-O;let j=_.dom?.bbox.x??0,q=M.dom?.bbox.x??0;return j-q}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let x=E.slice(0,n).map((_,M)=>{let N=_.ax.role??"generic",O=_.ax.name??"",j=cxe(N,O,M),q=_.dom?.bbox??{x:0,y:0,w:0,h:0},H=_.dom?.type??null,W=null;_.ax.value!==void 0&&_.ax.value!==null&&(W=String(_.ax.value)),_.ax.checked!==void 0&&(W=String(_.ax.checked)),xG({role:N,kind:H})&&(W="[redacted]");let X={disabled:_.ax.disabled??!1};_.ax.checked!==void 0&&(X.checked=_.ax.checked===!0||_.ax.checked==="mixed"),_.ax.selected!==void 0&&(X.selected=_.ax.selected),_.ax.expanded!==void 0&&(X.expanded=_.ax.expanded);let D;_.dom?.testId?D=`[data-testid="${_.dom.testId}"]`:_.dom?.id&&(D=`#${_.dom.id}`);let G={id:j,role:N,label:lxe(O),kind:H,value:W,state:X,bbox:q};return D!==void 0&&(G.selector=D),G}),C="idle";try{let _=await e.evaluate(()=>document.readyState);_==="loading"?C="loading":_==="interactive"?C="navigating":C="idle"}catch{C="navigating"}C!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let I=uxe(f),A=`obs_${t.observationCounter.toString(36)}`,P=new Date().toISOString();return{observationId:A,url:g,title:h,textSummary:I,interactive:x,status:{httpStatus:t.httpStatus??null,loadingState:C,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:P}}var UG,HG,WG=y(()=>{"use strict";Zw();UG=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);HG="a[href], button, input, select, textarea, [role], [tabindex], label"});async function KG(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function JP(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>KG(e,i)))).filter(o=>o!==null)}async function fxe(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function YP(e,t,n){switch(t.kind){case"element_id":return gxe(e,t,n);case"selector":return hxe(e,t);case"semantic":return yxe(e,t)}}async function gxe(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await JP(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function hxe(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await JP(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function yxe(e,t){return t.role!==void 0?bxe(e,t.text,t.role):wxe(e,t.text,t)}async function bxe(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await JP(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function wxe(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let u=[];s>0&&u.push({loc:r,count:s}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:i,count:l});let d=await fxe(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let w=await KG(b.locator,b.index);if(w!==null){let S=`${w.role}:${w.label}:${h}`,v=0;for(let E=0;E<S.length;E++)v=v*31+S.charCodeAt(E)>>>0;f.push({...w,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var GG=y(()=>{"use strict"});async function XP(e,t,n,r){let o=e.url();if(o===n)return null;let i=Fr(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var qG=y(()=>{"use strict";rs()});var ZP={};lt(ZP,{PlaywrightProvider:()=>QP});function zG(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var QP,eI=y(()=>{"use strict";NG();WG();GG();rs();qG();KP();QP=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new rS(t)}async open(t){let n=Fr(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(d){a=d}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let d=await XP(o,this.config,t.url,()=>this.close({sessionId:r}));if(d!==null)return d}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let u=await oS(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,u.interactive,u.url,u.title,"browser_open"),a!==null)throw a;return u}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await oS(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await YP(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${zG(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":await l.fill(t.value??"");break;case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=await XP(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await oS(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let u=await YP(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${zG(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await u.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await Au(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await Au(n,o,r);return i}catch{return null}}}});var Qa={};lt(Qa,{__resetBrowserRegistryForTests:()=>xxe,browserProviderActive:()=>kxe,closeBrowserProvider:()=>nI,getBrowserProvider:()=>vxe,getLastRoutingDecision:()=>Exe,peekBrowserProvider:()=>Txe});function VG(){Promise.resolve(nI()).then(()=>{process.exit(130)})}function JG(){Promise.resolve(nI()).then(()=>{process.exit(143)})}function YG(){Ro=null}function Sxe(){iS||(process.on("SIGINT",VG),process.on("SIGTERM",JG),process.on("exit",YG),iS=!0)}function XG(){iS&&(process.removeListener("SIGINT",VG),process.removeListener("SIGTERM",JG),process.removeListener("exit",YG),iS=!1)}async function vxe(e){return Ro!==null?Ro:(Xa!==null||(Xa=(async()=>{let t=UP(e),n=e?.surface??(e?.env??{}).AGENT_SURFACE??k.AGENT_SURFACE,r=await TG({config:t,surface:n});tI=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:i}=await Promise.resolve().then(()=>($G(),OG)),s=r.availability.connection;o=new i(t,s)}else{let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(eI(),ZP));o=new i(t)}return Sxe(),Ro=o,Xa=null,o})()),Xa)}async function nI(){if(Ro===null)return;let e=Ro;Ro=null,Xa=null,XG(),await e.shutdown()}function kxe(){return Ro!==null}function Txe(){return Ro}function Exe(){return tI}function xxe(){Ro=null,Xa=null,tI=null,XG()}var Ro,Xa,iS,tI,Za=y(()=>{"use strict";rs();EG();F();Ro=null,Xa=null,iS=!1,tI=null});async function QG(e,t){try{return await uG(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Ixe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Za(),Qa)),r=await n();try{return await r.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}catch(o){if(r.name==="agent-browser"){let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(eI(),ZP)),{loadBrowserConfig:s}=await Promise.resolve().then(()=>(rs(),jP)),a=s(),l=new i(a);try{return await l.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}finally{await l.shutdown()}}throw o}}async function ZG(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Ixe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await ns(n,e,{headers:Pxe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(_xe.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(Cxe.test(p)&&!Axe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await QG(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof en||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=LP({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await _f(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>_f(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await _f(d.finalUrl,o);let p=await QG(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=LP({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof en)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var Axe,Cxe,_xe,Pxe,e2=y(()=>{"use strict";dG();FP();Ja();fe();Axe=/(text\/html|application\/xhtml\+xml)/i,Cxe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,_xe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Pxe={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/web_scrape",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});function $xe(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Mxe,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),Oxe),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=se(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function t2(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?$xe({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function n2(e,t){if(t.length===0)return`# Search results for "${e}"
439
+ ${lr(e,{headless:t,latched:n})}`,{cause:e})}var LG,exe,txe,DG,rxe,tS=y(()=>{"use strict";LG=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],exe="pnpm exec playwright install chromium",txe=4;rxe="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import Ya from"node:fs";import nS from"node:path";import{randomBytes as oxe}from"node:crypto";function ixe(){try{return"5.209.0"}catch{}try{let e=nS.resolve(import.meta.dirname,"../../../package.json"),t=Ya.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var sxe,rS,NG=y(()=>{"use strict";tS();U();fe();sxe=ixe(),rS=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=(async()=>{let t;try{({chromium:t}=await import("playwright"))}catch(n){let r=Cu(n,this.config.headless,!0);throw this.latchLaunchFailure(r),this.launchPromise=void 0,r}try{let n=await t.launch({headless:this.config.headless});return this.browser=n,this.clearLaunchFailure(),n}catch(n){let r=Cu(n,this.config.headless,!0);throw this.latchLaunchFailure(r),r}finally{this.launchPromise=void 0}})(),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${sxe}`}}loadStorageState(t){let n=Fc(t);try{if(!Ya.existsSync(n))return;let r=JSON.parse(Ya.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Fc(t);if(!Ya.existsSync(r))return;let o=await n.storageState(),i=nS.join(nS.dirname(r),`.${nS.basename(r)}.${process.pid}.${oxe(4).toString("hex")}.tmp`);Ya.writeFileSync(i,JSON.stringify(o),{mode:384}),Ya.chmodSync(i,384),Ya.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as axe}from"node:crypto";function lxe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function cxe(e,t,n){return`el_${axe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function uxe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function BG(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function jG(e,t){let n=e.role??"",r=e.name??"";UG.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])jG(i,t)}async function dxe(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let u=window.getComputedStyle(s);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},HG).catch(()=>[])}async function pxe(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},HG).catch(()=>[])}function mxe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function oS(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=mxe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=dxe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,w=!1;d!==null?(b=[],jG(d,b)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,b=(await pxe(e)).filter(M=>UG.has(M.role??"")));let S=new Map;for(let _ of p){let M=BG(_.name),N=S.get(M);(!N||N.bbox.w===0&&_.bbox.w>0)&&S.set(M,_)}let v=b.map(_=>({ax:_,dom:S.get(BG(_.name??""))})),E=r?v:v.filter(_=>_.dom?_.dom.bbox.w>0||_.dom.bbox.h>0:!0);E.sort((_,M)=>{let N=_.dom?.bbox.y??0,O=M.dom?.bbox.y??0;if(N!==O)return N-O;let j=_.dom?.bbox.x??0,q=M.dom?.bbox.x??0;return j-q}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let x=E.slice(0,n).map((_,M)=>{let N=_.ax.role??"generic",O=_.ax.name??"",j=cxe(N,O,M),q=_.dom?.bbox??{x:0,y:0,w:0,h:0},H=_.dom?.type??null,W=null;_.ax.value!==void 0&&_.ax.value!==null&&(W=String(_.ax.value)),_.ax.checked!==void 0&&(W=String(_.ax.checked)),xG({role:N,kind:H})&&(W="[redacted]");let X={disabled:_.ax.disabled??!1};_.ax.checked!==void 0&&(X.checked=_.ax.checked===!0||_.ax.checked==="mixed"),_.ax.selected!==void 0&&(X.selected=_.ax.selected),_.ax.expanded!==void 0&&(X.expanded=_.ax.expanded);let D;_.dom?.testId?D=`[data-testid="${_.dom.testId}"]`:_.dom?.id&&(D=`#${_.dom.id}`);let G={id:j,role:N,label:lxe(O),kind:H,value:W,state:X,bbox:q};return D!==void 0&&(G.selector=D),G}),C="idle";try{let _=await e.evaluate(()=>document.readyState);_==="loading"?C="loading":_==="interactive"?C="navigating":C="idle"}catch{C="navigating"}C!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let I=uxe(f),A=`obs_${t.observationCounter.toString(36)}`,P=new Date().toISOString();return{observationId:A,url:g,title:h,textSummary:I,interactive:x,status:{httpStatus:t.httpStatus??null,loadingState:C,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:P}}var UG,HG,WG=y(()=>{"use strict";Zw();UG=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);HG="a[href], button, input, select, textarea, [role], [tabindex], label"});async function KG(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function JP(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>KG(e,i)))).filter(o=>o!==null)}async function fxe(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function YP(e,t,n){switch(t.kind){case"element_id":return gxe(e,t,n);case"selector":return hxe(e,t);case"semantic":return yxe(e,t)}}async function gxe(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await JP(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function hxe(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await JP(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function yxe(e,t){return t.role!==void 0?bxe(e,t.text,t.role):wxe(e,t.text,t)}async function bxe(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await JP(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function wxe(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let u=[];s>0&&u.push({loc:r,count:s}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:i,count:l});let d=await fxe(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let w=await KG(b.locator,b.index);if(w!==null){let S=`${w.role}:${w.label}:${h}`,v=0;for(let E=0;E<S.length;E++)v=v*31+S.charCodeAt(E)>>>0;f.push({...w,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var GG=y(()=>{"use strict"});async function XP(e,t,n,r){let o=e.url();if(o===n)return null;let i=Fr(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var qG=y(()=>{"use strict";rs()});var ZP={};lt(ZP,{PlaywrightProvider:()=>QP});function zG(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var QP,eI=y(()=>{"use strict";NG();WG();GG();rs();qG();KP();QP=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new rS(t)}async open(t){let n=Fr(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(d){a=d}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let d=await XP(o,this.config,t.url,()=>this.close({sessionId:r}));if(d!==null)return d}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let u=await oS(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,u.interactive,u.url,u.title,"browser_open"),a!==null)throw a;return u}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await oS(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await YP(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${zG(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":await l.fill(t.value??"");break;case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=await XP(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await oS(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let u=await YP(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${zG(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await u.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await Au(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await Au(n,o,r);return i}catch{return null}}}});var Qa={};lt(Qa,{__resetBrowserRegistryForTests:()=>xxe,browserProviderActive:()=>kxe,closeBrowserProvider:()=>nI,getBrowserProvider:()=>vxe,getLastRoutingDecision:()=>Exe,peekBrowserProvider:()=>Txe});function VG(){Promise.resolve(nI()).then(()=>{process.exit(130)})}function JG(){Promise.resolve(nI()).then(()=>{process.exit(143)})}function YG(){Ro=null}function Sxe(){iS||(process.on("SIGINT",VG),process.on("SIGTERM",JG),process.on("exit",YG),iS=!0)}function XG(){iS&&(process.removeListener("SIGINT",VG),process.removeListener("SIGTERM",JG),process.removeListener("exit",YG),iS=!1)}async function vxe(e){return Ro!==null?Ro:(Xa!==null||(Xa=(async()=>{let t=UP(e),n=e?.surface??(e?.env??{}).AGENT_SURFACE??k.AGENT_SURFACE,r=await TG({config:t,surface:n});tI=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:i}=await Promise.resolve().then(()=>($G(),OG)),s=r.availability.connection;o=new i(t,s)}else{let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(eI(),ZP));o=new i(t)}return Sxe(),Ro=o,Xa=null,o})()),Xa)}async function nI(){if(Ro===null)return;let e=Ro;Ro=null,Xa=null,XG(),await e.shutdown()}function kxe(){return Ro!==null}function Txe(){return Ro}function Exe(){return tI}function xxe(){Ro=null,Xa=null,tI=null,XG()}var Ro,Xa,iS,tI,Za=y(()=>{"use strict";rs();EG();F();Ro=null,Xa=null,iS=!1,tI=null});async function QG(e,t){try{return await uG(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Ixe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Za(),Qa)),r=await n();try{return await r.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}catch(o){if(r.name==="agent-browser"){let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(eI(),ZP)),{loadBrowserConfig:s}=await Promise.resolve().then(()=>(rs(),jP)),a=s(),l=new i(a);try{return await l.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}finally{await l.shutdown()}}throw o}}async function ZG(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Ixe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await ns(n,e,{headers:Pxe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(_xe.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(Cxe.test(p)&&!Axe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await QG(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof en||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=LP({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await _f(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>_f(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await _f(d.finalUrl,o);let p=await QG(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=LP({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof en)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var Axe,Cxe,_xe,Pxe,e2=y(()=>{"use strict";dG();FP();Ja();fe();Axe=/(text\/html|application\/xhtml\+xml)/i,Cxe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,_xe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Pxe={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/web_scrape",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});function $xe(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Mxe,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),Oxe),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=se(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function t2(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?$xe({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function n2(e,t){if(t.length===0)return`# Search results for "${e}"
440
440
 
441
441
  (no results)`;let n=[`# Search results for "${e}"`,""];return t.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
442
442
  `).trimEnd()}var Mxe,Oxe,r2=y(()=>{"use strict";Fe();Mxe="https://api.exa.ai/search",Oxe=10});function sS(e){if(e instanceof Error&&e.name==="TimeoutError")return"timeout";let t=e instanceof Error?e.message:String(e);return/Timeout\s+\d+\s*ms exceeded/i.test(t)?"timeout":void 0}var el=y(()=>{"use strict";tS()});function Uxe(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e,n=t.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,i;if(r==="search"){if(typeof t.query!="string"||t.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};i=t.query}else{if(typeof t.url!="string"||t.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let s=Dxe;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};s=Math.min(t.timeout_ms,Lxe)}let a=Fxe;if(t.max_bytes!==void 0){if(typeof t.max_bytes!="number"||!Number.isFinite(t.max_bytes)||t.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(t.max_bytes,Nxe)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function rI(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:$r(e,t),truncated:!0}}function jxe(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env,r=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{};return async(o,i)=>{if(typeof t!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=Uxe(o);if("error"in s)return{content:s.error,isError:!0};if(i.aborted){let d=i.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let a=new AbortController,l=()=>{a.abort(i.reason)},c,u=()=>{let d=a.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(i.addEventListener("abort",l,{once:!0}),c=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.url!==void 0){let p=await Va(s.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(!p.allowed)return{content:`web_scrape blocked: ${p.reason}`,isError:!0}}if(s.mode==="raw"){let p;try{let h={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await ns(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:h instanceof en?{content:`web_scrape blocked: ${h.message}`,isError:!0}:{content:`web_scrape network error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let f;try{f=await p.text()}catch(h){return{content:`web_scrape read error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}let g=rI(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await ZG(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:a.signal,...e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{}});if(p.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0};let f=rI(pG(p.markdown,p.advisory),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(p instanceof en)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=xn(p)&&!VP(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Pf()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=t2({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let p=await d.search(s.query,{limit:Bxe,timeoutMs:s.timeoutMs,signal:a.signal}),f=rI(n2(s.query,p),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${p instanceof Error?p.message:String(p)}`,isError:!0}}}finally{c!==void 0&&clearTimeout(c),i.removeEventListener("abort",l)}}}var Dxe,Lxe,Fxe,Nxe,Bxe,o2,i2=y(()=>{"use strict";e2();r2();Ja();ho();FP();el();Dxe=3e4,Lxe=12e4,Fxe=1e5,Nxe=1e6,Bxe=10;o2=jxe()});function Kxe(e){return Hxe.has(e)?"low":e==="DELETE"?"high":"medium"}function Gxe(e){return Wxe.has(e)}function Vxe(e){let t={};return e.forEach((n,r)=>{let o=r.toLowerCase();zxe.has(o)||qxe.some(i=>o.startsWith(i))||(t[r]=n)}),t}function Jxe(e,t){if(e==null)return{serialized:void 0,inferredContentType:void 0};let n=Object.keys(t).some(o=>o.toLowerCase()==="content-type");return typeof e=="string"?{serialized:e,inferredContentType:n?void 0:"text/plain"}:{serialized:JSON.stringify(e),inferredContentType:n?void 0:"application/json"}}function Yxe(e,t,n){let r=Buffer.byteLength(e,"utf8"),o=e,i=!1;if(r>n&&(o=$r(e,n),i=!0),!i&&/application\/json/i.test(t))try{return{body:JSON.parse(o),truncated:!1}}catch{}return{body:o,truncated:i}}async function l2(e){let{url:t,method:n,signal:r,domainCheck:o,recordEffect:i}=e,s=Math.min(e.maxResponseBytes??oI,iI),a={...e.headers},l=e.fetchFn??globalThis.fetch,c=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},u=Kxe(n);if(o!==void 0){let A=o(t);if(!A.allowed)throw Object.assign(new Error(`web_request blocked by domain policy: ${A.reason}`),{name:"DomainPolicyError"})}let d=await Va(t,c);if(!d.allowed)throw new en(d.reason);let{serialized:p,inferredContentType:f}=Jxe(e.body,a);f!==void 0&&(a["content-type"]=f);let g={method:n,headers:Object.keys(a).length>0?a:void 0,body:p,signal:r},b=Gxe(n)?{retries:2,baseDelayMs:300,maxDelayMs:5e3}:{retries:0},w=Date.now(),S;try{S=await ns(l,t,g,{...c,retry:b})}catch(A){throw A instanceof en,A}let v=Date.now()-w,E=S.headers.get("content-type")??"",T;try{let A=S.body?.getReader();if(!A)T="";else{let P=[],_=0,M=s*2;for(;;){let{done:N,value:O}=await A.read();if(N||!O)break;if(P.push(O),_+=O.byteLength,_>=M){await A.cancel();break}}T=new TextDecoder().decode(Buffer.concat(P,_))}}catch{T=""}let{body:x,truncated:C}=Yxe(T,E,s),I=Vxe(S.headers);return i!==void 0&&Promise.resolve(i({url:t,method:n,status:S.status,risk:u,timing_ms:v})).catch(()=>{}),{status:S.status,headers:I,body:x,truncated:C,timing_ms:v,risk:u}}function c2(e){if(typeof e!="string"||e.trim().length===0)return{error:"method must be a non-empty string (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS)"};let t=e.trim().toUpperCase(),n=["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"];return n.includes(t)?t:{error:`method "${e}" is not supported \u2014 must be one of: ${n.join(", ")}`}}var s2,a2,oI,iI,Hxe,Wxe,qxe,zxe,u2=y(()=>{"use strict";Ja();ho();s2=3e4,a2=12e4,oI=1e5,iI=1e6,Hxe=new Set(["GET","HEAD","OPTIONS"]),Wxe=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]);qxe=["set-cookie","x-"],zxe=new Set(["server","via","age","vary","authorization","www-authenticate"])});function Xxe(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e;if(typeof t.url!="string"||t.url.length===0)return{error:'Invalid input: "url" must be a non-empty string'};let n;try{n=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(n.protocol!=="http:"&&n.protocol!=="https:")return{error:`Invalid input: protocol "${n.protocol}" not supported (http/https only)`};n.username="",n.password="";let r=n.toString(),o=c2(t.method);if(typeof o=="object"&&"error"in o)return{error:`Invalid input: ${o.error}`};let i=o,s;if(t.body!==void 0&&t.body!==null){if(typeof t.body!="string"&&typeof t.body!="object")return{error:'Invalid input: "body" must be a string, object, or array'};s=t.body}let a={};if(t.headers!==void 0){if(typeof t.headers!="object"||t.headers===null||Array.isArray(t.headers))return{error:'Invalid input: "headers" must be a string-keyed object'};let d=t.headers;for(let[p,f]of Object.entries(d)){if(typeof f!="string")return{error:`Invalid input: header value for "${p}" must be a string`};a[p]=f}}let l=s2;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:'Invalid input: "timeout_ms" must be a positive finite number'};l=Math.min(t.timeout_ms,a2)}let c=oI;if(t.max_response_bytes!==void 0){if(typeof t.max_response_bytes!="number"||!Number.isFinite(t.max_response_bytes)||t.max_response_bytes<=0)return{error:'Invalid input: "max_response_bytes" must be a positive finite number'};c=Math.min(t.max_response_bytes,iI)}let u;if(t.credential!==void 0){if(typeof t.credential!="string"||t.credential.length===0)return{error:'Invalid input: "credential" must be a non-empty string (an env var name)'};u=t.credential}return{url:r,method:i,body:s,headers:a,timeoutMs:l,maxResponseBytes:c,credential:u}}function Qxe(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env;async function r(){if(e.domainCheck!==void 0)return e.domainCheck;try{let{loadBrowserConfig:o,enforceDomainPolicy:i}=await Promise.resolve().then(()=>(rs(),jP)),s=o();return a=>i(a,s)}catch{return}}return async(o,i)=>{if(typeof t!="function")return{content:"web_request unavailable: global fetch() is not present (agent-afk requires Node 20+).",isError:!0};let s=Xxe(o);if("error"in s)return{content:s.error,isError:!0};if(i.aborted){let p=i.reason;return{content:`web_request aborted: ${p instanceof Error?p.message:String(p??"aborted")}`,isError:!0}}let a={...s.headers};if(s.credential!==void 0){let p=n[s.credential];if(p===void 0||p.trim().length===0)return{content:`web_request credential error: environment variable "${s.credential}" is not set. Set it in afk.env or export it in the shell before starting AFK.`,isError:!0};if(Object.keys(a).some(g=>g.toLowerCase()==="authorization"))return{content:'web_request credential error: both "credential" and an explicit Authorization header were provided. Use one or the other.',isError:!0};a.Authorization=`Bearer ${p}`}let l=new AbortController,c=()=>l.abort(i.reason),u,d=()=>{let p=l.signal.reason;return p instanceof Error?p.message:String(p??"aborted")};try{i.addEventListener("abort",c,{once:!0}),u=setTimeout(()=>{l.abort(new Error(`web_request timeout after ${s.timeoutMs}ms`))},s.timeoutMs);let p=await r(),f={url:s.url,method:s.method,body:s.body,headers:a,maxResponseBytes:s.maxResponseBytes,signal:l.signal,fetchFn:t,lookupFn:e.lookupFn,domainCheck:p,recordEffect:e.recordEffect},g;try{g=await l2(f)}catch(S){if(l.signal.aborted)return{content:`web_request aborted: ${d()}`,isError:!0};if(S instanceof en)return{content:`web_request blocked: ${S.message}`,isError:!0};let v=S instanceof Error&&S.name==="DomainPolicyError"?"blocked":"network error",E=S instanceof Error?S.message:String(S);return{content:`web_request ${v}: ${E}`,isError:!0}}if(l.signal.aborted)return{content:`web_request aborted: ${d()}`,isError:!0};let h=g.body;if(typeof h=="string")h=mt(h);else if(typeof h=="object"&&h!==null){let S=mt(JSON.stringify(h));try{h=JSON.parse(S)}catch{h=S}}let b={status:g.status,headers:g.headers,body:h,timing_ms:g.timing_ms,...g.truncated?{truncated:!0}:{}};return{content:JSON.stringify(b,null,2),...g.truncated?{truncated:!0}:{}}}finally{u!==void 0&&clearTimeout(u),i.removeEventListener("abort",c)}}}var d2,p2=y(()=>{"use strict";u2();Ja();Pr();d2=Qxe()});import{existsSync as f2,mkdirSync as Zxe,readFileSync as eRe,renameSync as tRe,unlinkSync as nRe,writeFileSync as rRe}from"node:fs";import{dirname as m2,join as oRe}from"node:path";import{randomBytes as iRe}from"node:crypto";function Kt(e){let t=e??Zy();if(!f2(t))return[];try{let n=eRe(t,"utf-8");return JSON.parse(n)}catch(n){let r=n instanceof Error?n.message:String(n);return console.error(`[schedule-store] failed to parse ${t}: ${r}`),[]}}function Nr(e,t){let n=t??Zy();Zxe(m2(n),{recursive:!0});let r=oRe(m2(n),`.schedules.json.${process.pid}.${iRe(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{rRe(r,o,"utf-8"),tRe(r,n)}catch(i){try{f2(r)&&nRe(r)}catch{}throw i}}function _u(e,t){let n=Kt(t),r=n.map(l=>l.id),o=sRe(e.name),i=aRe(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),Nr(n,t),a}function Pu(e,t){let n=Kt(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(Nr(o,t),!0)}function tl(e,t){return Kt(t).find(n=>n.id===e)}function sRe(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function aRe(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function os(e){return{taskId:e.id,command:e.command,trigger:e.trigger??"cron",...e.cron!==void 0?{cronExpression:e.cron}:{},...e.notifyOn!==void 0?{notifyOn:e.notifyOn}:{},...e.notifyChat!==void 0?{notifyChat:e.notifyChat}:{}}}var If=y(()=>{"use strict";U()});import{existsSync as lRe,readFileSync as cRe}from"node:fs";import{join as uRe}from"node:path";async function ft(e,t,n){let r,o;try{let i=uRe(ba("default"),"port");if(!lRe(i))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=cRe(i,"utf-8").trim(),a=sI(s);if(!a)return{synced:!1,detail:"daemon-not-detected (invalid port file)"};({host:r,port:o}=a)}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let i=r.includes(":")?`[${r}]`:r,s=await fetch(`http://${i}:${o}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return s.ok?{synced:!0,detail:"synced"}:e==="POST"&&s.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&s.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${s.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}function sI(e){let t=parseInt(e,10);if(String(t)===e&&!Number.isNaN(t))return t<1||t>65535?null:{host:"localhost",port:t};let n=e.lastIndexOf(":");if(n<1)return null;let r=e.slice(0,n),o=e.slice(n+1);if(!/^\d+$/.test(o))return null;let i=parseInt(o,10);return Number.isNaN(i)||i<1||i>65535||/^:+$/.test(r)?null:{host:r.startsWith("[")&&r.endsWith("]")?r.slice(1,-1):r,port:i}}var Hn,aS=y(()=>{"use strict";U();Hn="Change saved to schedules.json, but a running daemon (if any) did not pick it up \u2014 it will apply on the next daemon (re)start."});import{existsSync as dRe}from"node:fs";import{readFile as pRe}from"node:fs/promises";var g2,h2,y2,b2,w2=y(()=>{"use strict";If();U();aS();g2=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=n.notifyChat;if(o!==void 0&&typeof o!="number"&&typeof o!="string")return{content:"Invalid input: notifyChat must be a number (chat id) or string (chat id or alias name)",isError:!0};let i=_u({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),s=i.enabled?await ft("POST","/tasks",{taskId:i.id,command:i.command,cron:i.cron,trigger:i.trigger,notifyOn:i.notifyOn,...i.notifyChat!==void 0?{notifyChat:i.notifyChat}:{}}):await ft("DELETE",`/tasks/${i.id}`);return{content:JSON.stringify({id:i.id,name:i.name,cron:i.cron,enabled:i.enabled,daemonSynced:s.synced,syncDetail:s.detail,...s.synced?{}:{syncNote:Hn}})}},h2=async(e,t)=>{let n=Kt();return{content:JSON.stringify(n.map(r=>({id:r.id,name:r.name,cron:r.cron,trigger:r.trigger,enabled:r.enabled,notifyOn:r.notifyOn})))}},y2=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=typeof n.limit=="number"?Math.min(Math.max(1,n.limit),50):10,i=Fn();if(!dRe(i))return{content:JSON.stringify([])};let s;try{let c=await pRe(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
@@ -454,7 +454,7 @@ ${lr(e,{headless:t,latched:n})}`,{cause:e})}var LG,exe,txe,DG,rxe,tS=y(()=>{"use
454
454
  ?`,"m");if(!r.test(n))return!1;let o=n.replace(r,"");return Tt(e,o,384),!0}function W2(e,t){if(!Df(e))return;let r=hS(e,"utf-8").match(new RegExp(`^${Ao(t)}=(.*)$`,"m"));return r?r[1]:void 0}function K2(e){let t={};if(!Df(e))return t;let n=hS(e,"utf-8");for(let r of n.split(`
455
455
  `)){let o=r.trim();if(!o||o.startsWith("#"))continue;let i=o.indexOf("=");if(i<=0)continue;let s=o.slice(0,i).trim(),a=o.slice(i+1);t[s]=a}return t}var Co=y(()=>{"use strict";$f()});function Mu(e){let t=ma(e);return t?uAe.has(e)?"non-config":t.secret?"secret":dAe.has(e)||e.endsWith("_BASE_URL")?"protected":"settable":"unknown"}function G2(e,t=pAe,n=mAe){let r=e.trim().toLowerCase();if(t.includes(r))return!0;if(n.includes(r))return!1}function q2(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:void 0}function z2(e,t){if(t.includes(`
456
456
  `))return{ok:!1,error:`value for ${e.name} must not contain newlines`};switch(e.type){case"number":return q2(t)===void 0?{ok:!1,error:`${e.name} expects a number, got ${JSON.stringify(t)}`}:{ok:!0,value:t.trim()};case"boolean":{let n=t.trim().toLowerCase();return G2(n)===void 0?{ok:!1,error:`${e.name} expects a boolean (true/false/1/0/yes/no/on/off), got ${JSON.stringify(t)}`}:{ok:!0,value:n}}case"json":{try{JSON.parse(t)}catch{return{ok:!1,error:`${e.name} expects valid JSON`}}return{ok:!0,value:t}}default:return{ok:!0,value:t}}}function yS(e){return V2.get(e)}function TI(e){let t=V2.get(e);return t?t.tier:"unknown"}function bS(e,t){switch(e.type){case"boolean":{if(typeof t=="boolean")return{ok:!0,value:t};if(typeof t=="string"){let n=G2(t);if(n!==void 0)return{ok:!0,value:n}}return{ok:!1,error:`${e.path} expects a boolean`}}case"number":{let n=typeof t=="number"||typeof t=="string"?q2(t):void 0;return n===void 0?{ok:!1,error:`${e.path} expects a number`}:e.clamp?e.clamp.integer&&!Number.isInteger(n)?{ok:!1,error:`${e.path} expects an integer`}:{ok:!0,value:Math.min(e.clamp.max,Math.max(e.clamp.min,n))}:{ok:!0,value:n}}case"enum":return typeof t=="string"&&e.enumValues?.includes(t)?{ok:!0,value:t}:{ok:!1,error:`${e.path} expects one of: ${e.enumValues?.join(", ")}`};case"number-array":{let n;if(Array.isArray(t))n=t;else if(typeof t=="string")n=t.split(",").map(o=>o.trim()).filter(o=>o.length>0).map(o=>Number(o));else return{ok:!1,error:`${e.path} expects an array of numbers`};let r=[];for(let o of n){let i=typeof o=="number"?o:Number(o);if(!Number.isFinite(i))return{ok:!1,error:`${e.path} contains a non-number`};r.push(i)}return{ok:!0,value:r}}case"model-slot":{if(typeof t=="string")return t.trim().length===0?{ok:!1,error:`${e.path} must not be empty`}:{ok:!0,value:t.trim()};let n=u1(t);return n.ok?{ok:!0,value:n.value}:{ok:!1,error:`${e.path}: ${n.error}`}}default:return typeof t!="string"?{ok:!1,error:`${e.path} expects a string`}:t.trim().length===0?{ok:!1,error:`${e.path} must not be empty`}:{ok:!0,value:t}}}function Lf(e,t){let n=e;for(let r of t.split(".")){if(n===null||typeof n!="object")return;n=n[r]}return n}function J2(e,t,n){let r=t.split("."),o=e;for(let i=0;i<r.length-1;i++){let s=r[i],a=o[s];(a===null||typeof a!="object"||Array.isArray(a))&&(o[s]={}),o=o[s]}o[r[r.length-1]]=n}function Y2(e,t){let n=t.split("."),r=[e],o=e;for(let s=0;s<n.length-1;s++){let a=n[s],l=o[a];if(l===null||typeof l!="object"||Array.isArray(l))return!1;o=l,r.push(o)}let i=n[n.length-1];if(!(i in o))return!1;delete o[i];for(let s=r.length-1;s>=1;s--){let a=r[s];if(Object.keys(a).length===0){let l=n[s-1];delete r[s-1][l]}else break}return!0}var uAe,dAe,pAe,mAe,kI,V2,rl=y(()=>{"use strict";F();It();uAe=new Set(["HOME","PATH","SHELL","PAGER","NODE_ENV","CI","VITEST","DEBUG","FORCE_COLOR","NO_COLOR","AGENT_SURFACE","AFK_SESSION_ID","NO_UPDATE_NOTIFIER","SCRIPT","ASCIINEMA_REC"]),dAe=new Set(["AFK_MODEL_SMALL_BASE_URL","AFK_MODEL_MEDIUM_BASE_URL","AFK_MODEL_LARGE_BASE_URL","AFK_LOCAL_BASE_URL","AFK_OPENAI_BASE_URL","AFK_SYSTEM_PROMPT","AFK_DAEMON_TASK","AFK_DAEMON_TASK_ID","AFK_DAEMON_CWD","AFK_DAEMON_HOST","AFK_BROWSER_ALLOWED_DOMAINS","AFK_BROWSER_BLOCKED_DOMAINS","AFK_BROWSER_CONFIG","AFK_ALLOW_PROJECT_MCP","AFK_INTERNAL","AFK_WORKTREE_BASE","AFK_WORKTREE_BRANCH_PREFIX","AFK_WORKTREE_ON_EXIT","AFK_TELEGRAM_ALLOWED_CHAT_IDS","AFK_TELEGRAM_TAG_ONLY_CHAT_IDS","AFK_TELEGRAM_NOTIFY_MODE","AFK_TELEGRAM_PRIMARY_CHAT_ID","AFK_HOME","AFK_STATE_DIR","AFK_FRAMEWORK_DIR","TELEGRAM_DATA_DIR","AFK_TELEGRAM_CWD"]);pAe=["true","1","yes","on"],mAe=["false","0","no","off"];kI=[{path:"model",tier:"agent",type:"string",description:"Default model id / alias."},{path:"models.local",tier:"agent",type:"model-slot",description:"Local-tier model id (OpenAI-compatible shim: Ollama, LM Studio, vLLM, MLX). Accepts a bare id string or a { id, provider, name } object (provider: anthropic | openai | chatgpt-oauth | xai | xai-oauth \u2014 chatgpt is accepted shorthand; baseUrl/apiKey are human-gated: set them via the AFK_MODEL_<TIER>_BASE_URL / _API_KEY env vars, not here)."},{path:"models.small",tier:"agent",type:"model-slot",description:"Small-tier model id. Accepts a bare id string or a { id, provider, name } object (provider: anthropic | openai | chatgpt-oauth | xai | xai-oauth \u2014 chatgpt is accepted shorthand; baseUrl/apiKey are human-gated: set them via the AFK_MODEL_<TIER>_BASE_URL / _API_KEY env vars, not here)."},{path:"models.medium",tier:"agent",type:"model-slot",description:"Medium-tier model id. Accepts a bare id string or a { id, provider, name } object (provider: anthropic | openai | chatgpt-oauth | xai | xai-oauth \u2014 chatgpt is accepted shorthand; baseUrl/apiKey are human-gated: set them via the AFK_MODEL_<TIER>_BASE_URL / _API_KEY env vars, not here)."},{path:"models.large",tier:"agent",type:"model-slot",description:"Large-tier model id. Accepts a bare id string or a { id, provider, name } object (provider: anthropic | openai | chatgpt-oauth | xai | xai-oauth \u2014 chatgpt is accepted shorthand; baseUrl/apiKey are human-gated: set them via the AFK_MODEL_<TIER>_BASE_URL / _API_KEY env vars, not here)."},{path:"maxTokens",tier:"agent",type:"number",clamp:{min:1,max:1e6,integer:!0},description:"Deprecated and inert: not read by the generation path. Use AFK_MAX_OUTPUT_TOKENS or --max-output-tokens to cap per-response output."},{path:"temperature",tier:"agent",type:"number",clamp:{min:0,max:2},description:"Sampling temperature."},{path:"autoRouting.interactive",tier:"agent",type:"boolean",description:"Auto-route model in the REPL."},{path:"autoRouting.chat",tier:"agent",type:"boolean",description:"Auto-route model for chat."},{path:"autoRouting.telegram",tier:"agent",type:"boolean",description:"Auto-route model for Telegram."},{path:"autoRouting.daemon",tier:"agent",type:"boolean",description:"Auto-route model for the daemon."},{path:"telegram.notify.mode",tier:"human",type:"enum",enumValues:["primary","broadcast","custom"],description:"Telegram notify routing mode (human-tier: notification-redirect vector)."},{path:"telegram.notify.primaryChatId",tier:"human",type:"number",clamp:{min:-1e15,max:1e15,integer:!0},description:"Primary Telegram chat id (human-tier: notification-redirect vector)."},{path:"telegram.notify.targets",tier:"human",type:"number-array",description:"Custom Telegram target chat ids (human-tier: notification-redirect vector)."},{path:"telegram.tagOnlyChats",tier:"human",type:"number-array",description:"Chat ids where the bot answers only when addressed (reply to the bot, @mention, or text_mention resolving to the bot). Human-tier: it governs which chats the bot will respond in \u2014 a message-routing / who-can-drive-the-bot control, same class as the allowlist and telegram.notify.*. Requires Telegram privacy mode OFF for the bot to matter in groups."},{path:"telegram.verifyDone",tier:"human",type:"boolean",description:`Opt-in AFK "Done" verification gate (human-tier: a self-honesty check on the agent's own completion reporting \u2014 the agent must not be able to disable it on its own config, same rationale as enableShellHooks/permissionMode).`},{path:"enforceDoneEvidence",tier:"human",type:"boolean",description:'Opt-in AFK terminal-state enforcement gate: in autonomous mode a turn that self-certifies "Done" with no corroborating evidence (a successful file write/edit or executed command) gets a framework correction injected into the next turn, which must substantiate or downgrade the claim (issue #237). Human-tier: a self-honesty check the agent must not be able to disable on its own config, same rationale as telegram.verifyDone. Sibling of telegram.verifyDone (which only relabels the Telegram push; this one bounces the turn).'},{path:"interactive.worktreeAutoname",tier:"agent",type:"boolean",description:"Auto-name worktrees."},{path:"interactive.suggestGhost",tier:"agent",type:"boolean",description:"Ghost-text suggestions in the REPL."},{path:"interactive.thinkingUi",tier:"agent",type:"enum",enumValues:["summary","live","digest","off"],description:"Default REPL thinking-display mode."},{path:"theme",tier:"agent",type:"enum",enumValues:["dark","light","umber","auto"],description:"TUI color palette (dark | light | umber | auto). Display-only; auto detects a light/dark background from the terminal and falls back to dark. umber matches the Umber terminal and is dark-only, so auto never selects it."},{path:"updatePolicy",tier:"human",type:"enum",enumValues:["notify","auto","off"],description:"Self-update policy (human-tier: auto self-update is scope-widening)."},{path:"autoResumeOnUsageLimit",tier:"agent",type:"boolean",description:"Auto-resume after a usage-limit pause."},{path:"bgSummaries",tier:"agent",type:"boolean",description:"Background summarisation."},{path:"maxSummaryCallsPerSession",tier:"agent",type:"number",clamp:{min:1,max:500,integer:!0},description:"Cap on summary calls per session."},{path:"systemPrompt",tier:"human",type:"string",description:"Operator system-prompt overlay."},{path:"permissionMode",tier:"human",type:"enum",enumValues:["default","plan","autonomous","bypassPermissions"],description:"Session permission mode for afk chat/interactive (human-tier: privilege-escalation vector). Unset \u2192 bypassPermissions (new-install default); set `default` to re-enable path containment + the approval prompt."},{path:"enableShellHooks",tier:"human",type:"boolean",description:"Enable shell hooks (trust gate)."},{path:"enablePluginHooks",tier:"human",type:"boolean",description:"Enable Claude Code plugin-contributed hooks (trust gate for third-party plugin hooks.json; independent of enableShellHooks)."},{path:"interactive.worktreeBranchPrefix",tier:"human",type:"string",description:"Worktree branch prefix (git-flag sensitive)."},{path:"interactive.worktreeBase",tier:"human",type:"string",description:"Worktree base ref (git-flag sensitive)."},{path:"interactive.worktreeOnExit",tier:"human",type:"enum",enumValues:["ask","keep","remove"],description:"Clean-worktree quit policy (ask | keep | remove)."},{path:"daemon.task",tier:"human",type:"string",description:"Daemon task prompt."},{path:"daemon.taskId",tier:"human",type:"string",description:"Daemon task id."},{path:"daemon.verifyDone",tier:"human",type:"boolean",description:`Opt-in daemon-surface "Done" verification gate: a cron-tick completion push whose response self-certifies "Done" with no corroborating evidence (a successful file write/edit or executed command) is relabelled "\u26A0\uFE0F Done (unverified)" with a caveat line. The daemon analog of telegram.verifyDone (which is REPL-only); the daemon is single-turn-per-tick, so the only honest enforcement is relabelling the outgoing push rather than bouncing a next turn. Human-tier: a self-honesty check on the agent's own completion reporting \u2014 the agent must not be able to disable it on its own config, same rationale as telegram.verifyDone.`}],V2=new Map(kI.map(e=>[e.path,e]))});import{existsSync as X2,readFileSync as fAe,copyFileSync as gAe,chmodSync as hAe}from"fs";function Nf(e){return e===void 0||e.length===0?"<unset>":e.length<=4?"set (****)":`set (****${e.slice(-4)})`}function vS(e){return e?.filePath??Qt()}function Q2(e,t,n){let r=Mu(e);if(r==="unknown")throw new Ff(e);if(r==="non-config")throw new EI(e);if(r==="secret"&&!t)throw new xI(e);if(r==="protected"&&!n)throw new RI(e);return r}function kS(e,t,n){let r=Q2(e,n?.allowSecret,n?.allowProtected),o=ma(e),i=z2(o,t);if(!i.ok)throw new wS(i.error);let s=vS(n);return Br(s,e,i.value),{key:e,class:r,persistedTo:s,display:r==="secret"?Nf(i.value):i.value}}function TS(e,t){let n=Q2(e,t?.allowSecret,t?.allowProtected),r=vS(t),o=H2(r,e);return{key:e,class:n,removed:o,persistedTo:r}}function ES(e,t){let n=Mu(e);if(n==="unknown")throw new Ff(e);let r=vS(t),o=W2(r,e),i=Cc(e),s=n==="secret"?o!==void 0?Nf(o):void 0:o;return{key:e,class:n,persisted:s,activeInProcess:i}}function xS(e){let t=vS(e),n=K2(t),r=[];for(let o of _c){let i=o.name,s=Mu(i),a=n[i],l=Cc(i);if(!e?.all&&a===void 0&&!l)continue;let c=s==="secret"?a!==void 0?Nf(a):void 0:a;r.push({key:i,class:s,persisted:c,activeInProcess:l})}return r}function RS(e){return e?.filePath??Sn()}function AS(e){if(!X2(e))return{};let t;try{t=JSON.parse(fAe(e,"utf-8"))}catch{throw new SS(e)}if(t===null||typeof t!="object"||Array.isArray(t))throw new SS(e);return t}function Z2(e,t){if(X2(e))try{gAe(e,`${e}.bak`),hAe(`${e}.bak`,384)}catch{}Tt(e,JSON.stringify(t,null,2)+`
457
- `,384)}function eq(e,t){let n=TI(e);if(n==="unknown")throw new Ff(e);if(n==="human"&&!t)throw new AI(e);return n}function is(e,t,n){let r=eq(e,n?.allowHumanOnly),o=yS(e),i=bS(o,t);if(!i.ok)throw new wS(i.error);let s=RS(n),a=AS(s);return J2(a,e,i.value),Z2(s,a),{path:e,class:r,value:i.value,persistedTo:s}}function CS(e,t){let n=eq(e,t?.allowHumanOnly),r=RS(t),o=AS(r),i=Y2(o,e);return i&&Z2(r,o),{path:e,class:n,removed:i,persistedTo:r}}function Ou(e,t){let n=TI(e),r=RS(t),o=AS(r);return{path:e,class:n,value:Lf(o,e)}}function _S(e){return AS(RS(e))}var dr,Ff,EI,xI,RI,AI,wS,SS,$u=y(()=>{"use strict";U();F();Co();rl();dr="effective on the next session/daemon restart; the current session is unchanged",Ff=class extends Error{constructor(t){super(`unknown config key: ${t}`),this.name="UnknownKeyError"}},EI=class extends Error{constructor(t){super(`${t} is a process/inherited env var and is not afk-configurable`),this.name="NonConfigKeyError"}},xI=class extends Error{constructor(t){super(`${t} holds a credential; the agent cannot set it. A human must run \`afk config env set ${t}\` (the value is entered masked and never enters the model context).`),this.name="SecretWriteRefused"}},RI=class extends Error{constructor(t){super(`${t} controls identity, safety, capability, autonomous runs, request routing, or where AFK's own state lives; the agent cannot set it. A human must run \`afk config env set ${t}\`.`),this.name="ProtectedEnvKeyRefused"}},AI=class extends Error{constructor(t){super(`${t} is human-gated (prompt/hooks/identity); the agent cannot set it. A human must run \`afk config set ${t}\`.`),this.name="HumanOnlyKeyRefused"}},wS=class extends Error{constructor(t){super(t),this.name="ConfigValidationError"}},SS=class extends Error{constructor(t){super(`refusing to write: existing ${t} is not valid JSON (fix or remove it by hand first)`),this.name="MalformedConfigError"}}});function tq(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function nq(e){return e==="env"||e==="config"?e:void 0}function ri(e){return{content:e,isError:!0}}var rq,oq,iq=y(()=>{"use strict";$u();rq=async e=>{let t=tq(e);if(!t)return ri("config_get: expected an object input");let n=nq(t.target);if(!n)return ri("config_get: `target` must be 'env' or 'config'");let r=typeof t.key=="string"?t.key:void 0,o=t.all===!0;try{if(n==="env"){if(r){let i=ES(r);return{content:JSON.stringify(i,null,2)}}return{content:JSON.stringify(xS({all:o}),null,2)}}if(r){let i=Ou(r);return{content:JSON.stringify(i,null,2)}}return{content:JSON.stringify(_S(),null,2)}}catch(i){return ri(`config_get: ${i.message}`)}},oq=async e=>{let t=tq(e);if(!t)return ri("config_set: expected an object input");let n=nq(t.target);if(!n)return ri("config_set: `target` must be 'env' or 'config'");let r=typeof t.key=="string"?t.key:void 0;if(!r)return ri("config_set: `key` is required");let o=t.action==="unset"?"unset":"set",i=t.value;try{if(o==="unset"){if(n==="env"){let l=TS(r);return{content:l.removed?`Removed ${l.key} from afk.env (${l.persistedTo}). ${dr}.`:`${l.key} was not set in afk.env; nothing to remove.`}}let a=CS(r);return{content:a.removed?`Removed ${a.path} from afk.config.json (${a.persistedTo}). ${dr}.`:`${a.path} was not set in afk.config.json; nothing to remove.`}}if(i==null)return ri(`config_set: \`value\` is required to set ${r}`);if(n==="env"){if(typeof i!="string"&&typeof i!="number"&&typeof i!="boolean")return ri("config_set: env values must be a string, number, or boolean");let a=kS(r,String(i));return{content:`Set ${a.key} = ${a.display} in afk.env (${a.persistedTo}). ${dr}.`}}let s=is(r,i);return{content:`Set ${s.path} = ${JSON.stringify(s.value)} in afk.config.json (${s.persistedTo}). ${dr}.`}}catch(s){return ri(`config_set: ${s.message}`)}}});function ol(e,t){return e.length>t?`${e.slice(0,t)}\u2026 [truncated]`:e}function CI(e){switch(e.type){case"message":return e.message.role!=="assistant"||!e.message.content?null:{kind:"assistant",text:ol(e.message.content,8e3)};case"chunk":{let t=e.chunk;return t.type==="tool_use_detail"?t.pending?null:{kind:"tool",toolName:t.toolName,toolUseId:t.toolUseId,input:ol(t.toolInput,400)}:t.type==="tool_result"?t.isError===!0?{kind:"tool_error",content:ol(t.content,400),...t.metadata?.toolName!==void 0?{toolName:String(t.metadata.toolName)}:{}}:{kind:"tool_result",toolUseId:t.toolUseId,content:ol(t.content,400),...typeof t.durationMs=="number"?{durationMs:t.durationMs}:{},...t.metadata?.toolName!==void 0?{toolName:String(t.metadata.toolName)}:{}}:t.type==="thinking"?{kind:"thinking",text:ol(t.content,8e3)}:null}case"done":{let t=e.metadata,n=t?.totalCostUsd,r=t?.durationMs,o=t?.usage,i=typeof o?.input_tokens=="number"?o.input_tokens:void 0,s=typeof o?.output_tokens=="number"?o.output_tokens:void 0,a=typeof o?.cache_read_input_tokens=="number"?o.cache_read_input_tokens:void 0,l=typeof t?.stopReason=="string"?t.stopReason:void 0;return{kind:"done",...typeof n=="number"?{costUsd:n}:{},...typeof r=="number"?{durationMs:r}:{},...i!==void 0?{inputTokens:i}:{},...s!==void 0?{outputTokens:s}:{},...a!==void 0?{cacheReadTokens:a}:{},...l!==void 0?{stopReason:l}:{}}}case"error":return{kind:"error",message:e.error.message};case"paused":return{kind:"paused",...e.resetsAt?{resetsAt:e.resetsAt.toISOString()}:{}};case"resumed":return{kind:"resumed"};case"notice":return null;case"tool-activity":return{kind:"tool_activity",activeCount:e.activeCount,activeToolUseIds:e.activeToolUseIds};case"rate_limit":return{kind:"rate_limit",...typeof e.retryAfterMs=="number"?{retryAfterMs:e.retryAfterMs}:{}};case"progress":return{kind:"progress",message:e.progress.summary??e.progress.description};case"subagent_lifecycle":return{kind:"subagent_lifecycle",subagentId:e.subagentId,status:e.status,...e.model!==void 0?{model:e.model}:{},...e.agentType!==void 0?{agentType:e.agentType}:{},...e.durationMs!==void 0?{durationMs:e.durationMs}:{},...e.totalCostUsd!==void 0?{totalCostUsd:e.totalCostUsd}:{},...e.outputBytes!==void 0?{outputBytes:e.outputBytes}:{},...e.errorClass!==void 0?{errorClass:e.errorClass}:{},...e.errorMessage!==void 0?{errorMessage:e.errorMessage}:{},...e.promptHead!==void 0?{promptHead:e.promptHead}:{}};case"background_job":return{kind:"background_job",jobId:e.jobId,status:e.status,...e.label!==void 0?{label:e.label}:{}};case"plan_mode":return{kind:"plan_mode",mode:e.mode};default:return null}}var _I=y(()=>{"use strict"});import*as sq from"node:fs";import*as Du from"node:fs/promises";import*as aq from"node:readline";function lq(e){let t=e.trim();if(!t)return null;try{let n=JSON.parse(t);return n.v!==1||typeof n.ts!="number"||typeof n.kind!="string"?null:n}catch{return null}}async function*oi(e){if(!Cr(e))return;let t;try{t=await Du.open(Fi(e),"r")}catch(n){if(n.code==="ENOENT")return;throw n}try{let n=aq.createInterface({input:t.createReadStream({encoding:"utf8"}),crlfDelay:1/0});for await(let r of n){let o=lq(r);o&&(yield o)}}finally{await t.close()}}async function*Lu(e,t){if(!Cr(e))return;let n=Fi(e),r=wa(e),{fromStart:o=!1,signal:i}=t??{},s=0,a="",l=!1;async function*c(){let f=null;try{f=await Du.open(n,"r");let g=await f.stat();if(g.size<=s)return;let h=g.size-s,b=Buffer.allocUnsafe(h),{bytesRead:w}=await f.read(b,0,h,s);if(w===0)return;s+=w,a+=b.toString("utf8",0,w);let S=a.split(`
457
+ `,384)}function eq(e,t){let n=TI(e);if(n==="unknown")throw new Ff(e);if(n==="human"&&!t)throw new AI(e);return n}function is(e,t,n){let r=eq(e,n?.allowHumanOnly),o=yS(e),i=bS(o,t);if(!i.ok)throw new wS(i.error);let s=RS(n),a=AS(s);return J2(a,e,i.value),Z2(s,a),{path:e,class:r,value:i.value,persistedTo:s}}function CS(e,t){let n=eq(e,t?.allowHumanOnly),r=RS(t),o=AS(r),i=Y2(o,e);return i&&Z2(r,o),{path:e,class:n,removed:i,persistedTo:r}}function Ou(e,t){let n=TI(e),r=RS(t),o=AS(r);return{path:e,class:n,value:Lf(o,e)}}function _S(e){return AS(RS(e))}var dr,Ff,EI,xI,RI,AI,wS,SS,$u=y(()=>{"use strict";U();F();Co();rl();dr="effective on the next session/daemon restart; the current session is unchanged",Ff=class extends Error{constructor(t){super(`unknown config key: ${t}`),this.name="UnknownKeyError"}},EI=class extends Error{constructor(t){super(`${t} is a process/inherited env var and is not afk-configurable`),this.name="NonConfigKeyError"}},xI=class extends Error{constructor(t){super(`${t} holds a credential; the agent cannot set it. A human must run \`afk config env set ${t}\` (the value is entered masked and never enters the model context).`),this.name="SecretWriteRefused"}},RI=class extends Error{constructor(t){super(`${t} controls identity, safety, capability, autonomous runs, request routing, or where AFK's own state lives; the agent cannot set it. A human must run \`afk config env set ${t}\`.`),this.name="ProtectedEnvKeyRefused"}},AI=class extends Error{constructor(t){super(`${t} is human-gated (prompt/hooks/identity); the agent cannot set it. A human must run \`afk config set ${t}\`.`),this.name="HumanOnlyKeyRefused"}},wS=class extends Error{constructor(t){super(t),this.name="ConfigValidationError"}},SS=class extends Error{constructor(t){super(`refusing to write: existing ${t} is not valid JSON (fix or remove it by hand first)`),this.name="MalformedConfigError"}}});function tq(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function nq(e){return e==="env"||e==="config"?e:void 0}function ri(e){return{content:e,isError:!0}}var rq,oq,iq=y(()=>{"use strict";$u();rq=async e=>{let t=tq(e);if(!t)return ri("config_get: expected an object input");let n=nq(t.target);if(!n)return ri("config_get: `target` must be 'env' or 'config'");let r=typeof t.key=="string"?t.key:void 0,o=t.all===!0;try{if(n==="env"){if(r){let i=ES(r);return{content:JSON.stringify(i,null,2)}}return{content:JSON.stringify(xS({all:o}),null,2)}}if(r){let i=Ou(r);return{content:JSON.stringify(i,null,2)}}return{content:JSON.stringify(_S(),null,2)}}catch(i){return ri(`config_get: ${i.message}`)}},oq=async e=>{let t=tq(e);if(!t)return ri("config_set: expected an object input");let n=nq(t.target);if(!n)return ri("config_set: `target` must be 'env' or 'config'");let r=typeof t.key=="string"?t.key:void 0;if(!r)return ri("config_set: `key` is required");let o=t.action==="unset"?"unset":"set",i=t.value;try{if(o==="unset"){if(n==="env"){let l=TS(r);return{content:l.removed?`Removed ${l.key} from afk.env (${l.persistedTo}). ${dr}.`:`${l.key} was not set in afk.env; nothing to remove.`}}let a=CS(r);return{content:a.removed?`Removed ${a.path} from afk.config.json (${a.persistedTo}). ${dr}.`:`${a.path} was not set in afk.config.json; nothing to remove.`}}if(i==null)return ri(`config_set: \`value\` is required to set ${r}`);if(n==="env"){if(typeof i!="string"&&typeof i!="number"&&typeof i!="boolean")return ri("config_set: env values must be a string, number, or boolean");let a=kS(r,String(i));return{content:`Set ${a.key} = ${a.display} in afk.env (${a.persistedTo}). ${dr}.`}}let s=is(r,i);return{content:`Set ${s.path} = ${JSON.stringify(s.value)} in afk.config.json (${s.persistedTo}). ${dr}.`}}catch(s){return ri(`config_set: ${s.message}`)}}});function ol(e,t){return e.length>t?`${e.slice(0,t)}\u2026 [truncated]`:e}function CI(e){switch(e.type){case"message":return e.message.role!=="assistant"||!e.message.content?null:{kind:"assistant",text:ol(e.message.content,8e3)};case"chunk":{let t=e.chunk;return t.type==="tool_use_detail"?t.pending?null:{kind:"tool",toolName:t.toolName,toolUseId:t.toolUseId,input:ol(t.toolInput,400)}:t.type==="tool_result"?t.isError===!0?{kind:"tool_error",content:ol(t.content,400),...t.metadata?.toolName!==void 0?{toolName:String(t.metadata.toolName)}:{}}:{kind:"tool_result",toolUseId:t.toolUseId,content:ol(t.content,400),...typeof t.durationMs=="number"?{durationMs:t.durationMs}:{},...t.metadata?.toolName!==void 0?{toolName:String(t.metadata.toolName)}:{}}:t.type==="thinking"?{kind:"thinking",text:ol(t.content,8e3)}:null}case"done":{let t=e.metadata,n=t?.totalCostUsd,r=t?.durationMs,o=t?.usage,i=typeof o?.input_tokens=="number"?o.input_tokens:void 0,s=typeof o?.output_tokens=="number"?o.output_tokens:void 0,a=typeof o?.cache_read_input_tokens=="number"?o.cache_read_input_tokens:void 0,l=typeof t?.stopReason=="string"?t.stopReason:void 0;return{kind:"done",...typeof n=="number"?{costUsd:n}:{},...typeof r=="number"?{durationMs:r}:{},...i!==void 0?{inputTokens:i}:{},...s!==void 0?{outputTokens:s}:{},...a!==void 0?{cacheReadTokens:a}:{},...l!==void 0?{stopReason:l}:{}}}case"error":return{kind:"error",message:e.error.message};case"paused":return{kind:"paused",...e.resetsAt?{resetsAt:e.resetsAt.toISOString()}:{}};case"resumed":return{kind:"resumed"};case"notice":return null;case"tool-activity":return{kind:"tool_activity",activeCount:e.activeCount,activeToolUseIds:e.activeToolUseIds};case"rate_limit":return{kind:"rate_limit",...typeof e.retryAfterMs=="number"?{retryAfterMs:e.retryAfterMs}:{}};case"progress":return{kind:"progress",message:e.progress.summary??e.progress.description};case"subagent_lifecycle":return{kind:"subagent_lifecycle",subagentId:e.subagentId,status:e.status,...e.model!==void 0?{model:e.model}:{},...e.agentType!==void 0?{agentType:e.agentType}:{},...e.durationMs!==void 0?{durationMs:e.durationMs}:{},...e.totalCostUsd!==void 0?{totalCostUsd:e.totalCostUsd}:{},...e.outputBytes!==void 0?{outputBytes:e.outputBytes}:{},...e.errorClass!==void 0?{errorClass:e.errorClass}:{},...e.errorMessage!==void 0?{errorMessage:e.errorMessage}:{},...e.promptHead!==void 0?{promptHead:e.promptHead}:{},...e.turnCount!=null?{turnCount:e.turnCount}:{},...e.stopReason?{stopReason:e.stopReason}:{},...e.parentToolUseId?{parentToolUseId:e.parentToolUseId}:{}};case"background_job":return{kind:"background_job",jobId:e.jobId,status:e.status,...e.label!==void 0?{label:e.label}:{}};case"plan_mode":return{kind:"plan_mode",mode:e.mode};default:return null}}var _I=y(()=>{"use strict"});import*as sq from"node:fs";import*as Du from"node:fs/promises";import*as aq from"node:readline";function lq(e){let t=e.trim();if(!t)return null;try{let n=JSON.parse(t);return n.v!==1||typeof n.ts!="number"||typeof n.kind!="string"?null:n}catch{return null}}async function*oi(e){if(!Cr(e))return;let t;try{t=await Du.open(Fi(e),"r")}catch(n){if(n.code==="ENOENT")return;throw n}try{let n=aq.createInterface({input:t.createReadStream({encoding:"utf8"}),crlfDelay:1/0});for await(let r of n){let o=lq(r);o&&(yield o)}}finally{await t.close()}}async function*Lu(e,t){if(!Cr(e))return;let n=Fi(e),r=wa(e),{fromStart:o=!1,signal:i}=t??{},s=0,a="",l=!1;async function*c(){let f=null;try{f=await Du.open(n,"r");let g=await f.stat();if(g.size<=s)return;let h=g.size-s,b=Buffer.allocUnsafe(h),{bytesRead:w}=await f.read(b,0,h,s);if(w===0)return;s+=w,a+=b.toString("utf8",0,w);let S=a.split(`
458
458
  `);a=S.pop()??"";for(let v of S){let E=lq(v);if(E&&(E.kind==="closed"&&(l=!0),yield E,l))return}}catch(g){g.code!=="ENOENT"&&process.stderr.write(`[afk] session-ledger: tail read error for ${e}: ${String(g)}
459
459
  `)}finally{f&&await f.close().catch(()=>{})}}if(o){if(yield*c(),l)return}else try{s=(await Du.stat(n)).size}catch{}let u=null,d=null,p=()=>new Promise(f=>{let g=setTimeout(()=>{d=null,f()},yAe);d=()=>{clearTimeout(g),d=null,f()},i?.addEventListener("abort",()=>{clearTimeout(g),d=null,f()},{once:!0})});try{u=sq.watch(r,{persistent:!1},()=>{d?.()})}catch{}try{for(;!i?.aborted&&!l&&(await p(),!i?.aborted);)yield*c()}finally{u?.close()}}var yAe,cq=y(()=>{"use strict";U();yAe=250});import*as IS from"node:fs";var PS,il=y(()=>{"use strict";U();_I();_I();cq();PS=class{sessionId;ledgerPath;stream=null;errored=!1;closed=!1;streamReady=!1;pendingLines=[];readyPromise=null;readyResolve=null;constructor(t){if(this.sessionId=t,!Cr(t)){this.errored=!0,this.ledgerPath="";return}this.ledgerPath=Fi(t);try{IS.mkdirSync(wa(t),{recursive:!0})}catch(n){process.stderr.write(`[afk] session-ledger: mkdir failed for ${t}: ${String(n)}
460
460
  `),this.errored=!0}}get active(){return!this.errored&&!this.closed}record(t){if(this.errored||this.closed)return;let n={v:1,ts:Date.now(),...t},r=JSON.stringify(n)+`
@@ -1375,7 +1375,7 @@ ${n}`:n}}}return{...e,systemPrompt:n}}var GY=y(()=>{"use strict"});function kg()
1375
1375
 
1376
1376
  `+n:t??n}}}});function dX(e){return Sv(po(e))}function pX(e,t){return e===void 0||!dX(e)||ae(e)!=="openai-compatible"?{model:e}:t===void 0||dX(t)||ae(t)!=="openai-compatible"?{model:e}:{model:t,coercedFrom:e}}var mX=y(()=>{"use strict";Ue();vv();It()});function fX(e){let{options:t,counter:n,managerHookRegistry:r,parentTraceWriter:o,parentModel:i}=e,a=`${(t.idPrefix??"subagent").replace(/[^A-Za-z0-9_-]/g,"-")}-${Date.now()}-${n}`,l=t.parent.sessionId,c=t.config.hookRegistry??r??t.parent.hookRegistry,u=t.config.traceWriter??o,d=pX(t.config.model,i),p=d.model??t.config.model,f=t.config.timeoutMs??kg();return{id:a,resume:l,registry:c,effectiveTraceWriter:u,effectiveChildModel:p,coercedFrom:d.coercedFrom,effectiveTimeoutMs:f}}var gX=y(()=>{"use strict";mX();bd()});var Mk,hX=y(()=>{"use strict";Mk=class{entries=new Map;capacity;constructor(t=30){this.capacity=Math.max(1,t)}add(t,n,r){this.entries.delete(t),this.entries.set(t,{handle:n,result:r,completedAt:Date.now()}),this.evictIfNeeded()}recordHandle(t,n,r,o,i){let s=r==="succeeded"?{id:t,status:r,trace:o,...i!==void 0&&{stopReason:i}}:{id:t,status:r,error:new Error(`subagent terminated with status: ${r}`),trace:o,...i!==void 0&&{stopReason:i}};this.add(t,n,s)}get(t){return this.entries.get(t)}list(){return[...this.entries.values()].reverse()}get size(){return this.entries.size}delete(t){return this.entries.delete(t)}clear(){this.entries.clear()}evictIfNeeded(){for(;this.entries.size>this.capacity;){let t=this.entries.keys().next().value;if(t!==void 0)this.entries.delete(t);else break}}}});import*as As from"node:fs";import*as wX from"node:readline";var yX,bX,Eg,xl,Ok=y(()=>{"use strict";F();U();yX=1048576,bX=new Set,Eg=class{constructor(t,n){this.sessionLabel=t;this.subagentId=n;this.logPath=sb(t,n);let r=km(t);if(!bX.has(r))try{As.mkdirSync(r,{recursive:!0}),bX.add(r)}catch{this.errored=!0}}sessionLabel;subagentId;logPath;stream=null;errored=!1;closed=!1;streamReady=!1;pendingLines=[];readyPromise=null;readyResolve=null;bytesWritten=0;static isEnabled(){return k.AFK_SUBAGENT_LOG==="1"}write(t){if(this.errored||this.closed||this.bytesWritten>=yX)return;let n=JSON.stringify(t)+`
1377
1377
  `;if(!this.stream){this.pendingLines.push(n),this.openStream();return}if(!this.streamReady){this.pendingLines.push(n);return}this.writeLine(n)}async close(){if(!this.closed)return this.closed=!0,this.readyPromise&&await this.readyPromise,new Promise(t=>{if(!this.stream||this.errored){t();return}this.stream.end(()=>t())})}openStream(){if(!this.stream){this.readyPromise=new Promise(t=>{this.readyResolve=t});try{let t=As.createWriteStream(this.logPath,{flags:"a",encoding:"utf8",mode:384});this.stream=t,t.once("open",()=>{this.streamReady=!0;for(let n of this.pendingLines)this.writeLine(n);this.pendingLines=[],this.readyResolve?.(),this.readyResolve=null}),t.once("error",()=>{this.errored=!0,this.pendingLines=[],this.readyResolve?.(),this.readyResolve=null})}catch{this.errored=!0,this.readyResolve?.(),this.readyResolve=null}}}writeLine(t){this.errored||!this.stream||this.bytesWritten>=yX||(this.bytesWritten+=Buffer.byteLength(t,"utf8"),this.stream.write(t))}},xl=class{static async*readEvents(t,n){let r=sb(t,n),o;try{o=As.createReadStream(r,{encoding:"utf8"})}catch{return}let i=wX.createInterface({input:o,crlfDelay:1/0});try{for await(let s of i){let a=s.trim();if(a)try{yield JSON.parse(a)}catch{}}}catch{}finally{i.close(),o.destroy()}}static async list(t){let n=km(t);try{return(await As.promises.readdir(n)).filter(o=>o.endsWith(".jsonl")).map(o=>o.slice(0,-6))}catch{return[]}}}});import{z as gOe}from"zod";function SX(e,t,n,r){let i={...gOe.toJSONSchema(n,{target:"openapi-3.0"}),type:"object"};return{schema:{name:e,description:t,input_schema:i},handler:async(l,c,u)=>{let d=n.safeParse(l);if(!d.success){let p=d.error.issues.map(f=>`${f.path.join(".")||"<root>"}: ${f.message}`).join("; ");return{isError:!0,content:`Tool input validation failed for "${e}": ${p}`}}return r(d.data,c,u)}}}var vX=y(()=>{"use strict"});function hOe(e,t){let n=new Date().toISOString(),r=e.phase!==void 0?` phase="${TX(e.phase)}"`:"";return`<child-progress subagentId="${TX(t)}"${r} timestamp="${n}">`+yOe(e.message)+"</child-progress>"}function TX(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;")}function yOe(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function xX(e,t,n){return async r=>{if(n?.aborted)return{content:JSON.stringify({delivered:!1,reason:"parent_aborted"})};if(typeof r!="object"||r===null)return{content:"emit_progress: input must be an object.",isError:!0};let o=r,i=o.message;if(typeof i!="string"||i.trim().length===0)return{content:'emit_progress: "message" must be a non-empty string.',isError:!0};let s=i;Buffer.byteLength(s,"utf8")>$k&&(s=EX(s,$k));let a=typeof o.phase=="string"&&o.phase.trim().length>0?o.phase.trim():void 0;a!==void 0&&Buffer.byteLength(a,"utf8")>256&&(a=EX(a,256));let l=typeof o.metadata=="object"&&o.metadata!==null&&!Array.isArray(o.metadata)?o.metadata:void 0,c={message:s,...a!==void 0?{phase:a}:{},...l!==void 0?{metadata:l}:{}};e.emitProgress(c);try{let u=hOe(c,e.id);t(u)}catch{return{content:JSON.stringify({delivered:!1,reason:"queue_error"})}}return{content:JSON.stringify({delivered:!0})}}}function EX(e,t){let n=Buffer.from(e,"utf8");if(n.byteLength<=t)return e;let r=Math.min(t,n.byteLength);for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.subarray(0,r).toString("utf8")}var $k,RX=y(()=>{"use strict";rO();$k=2048});import{z as wd}from"zod";function AX(e,t,n,r){return t?bOe(e,n,r):()=>{}}function bOe(e,t,n){let r={current:void 0},o,i=SX("emit_progress",`Emit a structured progress event to the parent agent. The event is delivered to the parent at its next user-turn boundary, wrapped in a <child-progress> envelope. Use to report phase transitions, intermediate findings, or status updates so the parent stays informed without waiting for the full result. The "message" field is required (max ${$k} bytes). "phase" and "metadata" are optional. Note: this tool call counts as a tool-use round.`,wd.object({message:wd.string().describe("Progress message to deliver to the parent (required)."),phase:wd.string().optional().describe('Optional phase label (e.g. "research", "planning", "done").'),metadata:wd.record(wd.string(),wd.unknown()).optional().describe("Optional structured metadata for machine consumers.")}),async(s,a)=>r.current===void 0?{content:"emit_progress: handle not yet initialized.",isError:!0}:(o===void 0&&(o=xX(r.current,l=>{t?.queueFrameworkContext?t.queueFrameworkContext(l):t&&t.pushUserMessage(l)},n)),o(s,a)));return e.customTools=[...e.customTools??[],i],s=>{r.current=s,o=void 0}}var CX=y(()=>{"use strict";vX();RX()});function _X(e,t,n,r){if(e===void 0)return{subscribeHandler:async()=>({content:"workspace_subscribe: no store available.",isError:!0}),bindHandle:()=>{}};let o={current:void 0},i=async s=>{if(o.current===void 0)return{content:"workspace_subscribe: handle not yet initialized.",isError:!0};let a=s!=null&&typeof s=="object"?s:{},l=typeof a.subject=="string"&&a.subject.length>0?a.subject:void 0,c=a.type,d=typeof c=="string"&&new Set(["finding","evidence","hypothesis","decision","artifact","status"]).has(c)?c:void 0,p=s_();return e.subscribe({id:p,agentId:t,subject:l,type:d,lastDeliveredSeq:0,deliveryFn:f=>{let g=o.current;if(g===void 0)return;let h=0;g._pendingWorkspaceEntries.length>=10&&(g._pendingWorkspaceEntries.shift(),h=1,g._workspaceDroppedSinceDrain++),g._pendingWorkspaceEntries.push(f),oe(n,{phase:"workspace_delivery",metadata:{subscriptionId:p,agentId:t,entryId:String(f.id),droppedCount:h}})}}),oe(n,{phase:"workspace_subscribed",metadata:{subscriptionId:p,agentId:t,...l!==void 0&&{query:l},...d!==void 0&&{type:d}}}),{content:JSON.stringify({subscriptionId:p,active:!0})}};return r?.setSubscribeHandler!==void 0&&r.setSubscribeHandler(i),{subscribeHandler:i,bindHandle:s=>{o.current=s,s._workspaceStore=e}}}var PX=y(()=>{"use strict";Jb();Um();me()});var Te,Et=y(()=>{"use strict";kV();Sd();Yb();ci();vM();RV();_V();Ue();IV();JY();QY();uX();gX();hX();Ok();CX();PX();bd();bd();Te=class{active=new Map;completed=new Mk;parentCanUseTool;hookRegistry;progressSink;parentApiKey;parentBaseUrl;parentProvider;parentModel;parentCwd;parentReadRoots;worktreeMainRootCache=new Map;parentTraceWriter;parentSurface;parentAbortSignal;workspaceStore;sessionLabel;abortGraph;rootId;rootController;counter=0;onSubagentSucceededCb;outputEventSink;constructor(t={}){if(this.parentCanUseTool=t.canUseTool,this.hookRegistry=t.hookRegistry,this.progressSink=t.progressSink,this.parentApiKey=t.apiKey,this.parentBaseUrl=t.baseUrl,this.parentProvider=t.parentModel!==void 0?ae(t.parentModel):void 0,this.parentModel=t.parentModel,this.parentCwd=t.cwd,this.parentReadRoots=t.parentReadRoots,this.parentTraceWriter=t.traceWriter,this.parentSurface=t.surface,this.parentAbortSignal=t.parentAbortSignal,this.onSubagentSucceededCb=t.onSubagentSucceeded,this.outputEventSink=t.outputEventSink,this.workspaceStore=t.workspaceStore,this.sessionLabel=t.sessionLabel,this.abortGraph=new cv(t.traceWriter),this.rootId=`manager-root-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,this.rootController=new AbortController,this.abortGraph.register(this.rootId,this.rootController),t.parentAbortSignal){let n=t.parentAbortSignal;n.aborted?this.rootController.abort(n.reason):n.addEventListener("abort",()=>{this.rootController.signal.aborted||this.rootController.abort(n.reason)},{once:!0})}}list(){return[...this.active.values()].map(t=>({id:t.id,status:t.status}))}get(t){return this.active.get(t)??this.completed.get(t)?.handle}onChildAborted(t){return this.abortGraph.onChildAborted(this.rootId,t)}setOnSubagentSucceeded(t){this.onSubagentSucceededCb=t}setOutputEventSink(t){this.outputEventSink=t}setCwd(t){this.parentCwd=t,this.worktreeMainRootCache.delete(t)}setTraceWriter(t){this.parentTraceWriter=t,this.abortGraph.setTraceWriter(t)}getReadScopeInputs(){return{parentReadRoots:this.parentReadRoots,parentCwd:this.parentCwd}}async resolveMainRootForCwd(t){if(this.worktreeMainRootCache.has(t))return this.worktreeMainRootCache.get(t);let n=await xV(t);return this.worktreeMainRootCache.set(t,n),n}abortAll(t,n="user_signal"){this.abortGraph.abort(this.rootId,t,n)}async forkSubagent(t){PV(t);let{id:n,resume:r,registry:o,effectiveTraceWriter:i,effectiveChildModel:s,coercedFrom:a,effectiveTimeoutMs:l}=fX({options:t,counter:++this.counter,managerHookRegistry:this.hookRegistry,parentTraceWriter:this.parentTraceWriter,parentModel:this.parentModel});o&&await N1(o,{event:"SubagentStart",subagentId:n,parentSessionId:t.parent.sessionId},{signal:this.rootController.signal,...i?{traceWriter:i}:{}}),a!==void 0&&process.stderr.write(`[afk] subagent: child model "${a}" cannot run on this session's OpenAI/ChatGPT backend \u2014 running it as "${s??""}" instead (set AFK_DEFAULT_SUBAGENT_MODEL to choose a different one).
1378
- `);let c=new AbortController;this.abortGraph.register(n,c),this.abortGraph.linkChild(this.rootId,n);let u=t.config.cwd??this.parentCwd,d=await AV({parentReadRoots:this.parentReadRoots,parentCwd:this.parentCwd,effectiveChildCwd:u,callerReadRoots:t.config.readRoots,callerExtraReadRoots:t.config.extraReadRoots,resolveMainRoot:x=>this.resolveMainRootForCwd(x)}),p=CV(t.config.writeRoots,u),f=VY({options:t,id:n,resume:r,registry:o,effectiveChildModel:s,effectiveTimeoutMs:l,inheritedReadRoots:d,composedWriteRoots:p,childController:c,parentCwd:this.parentCwd,parentApiKey:this.parentApiKey,parentBaseUrl:this.parentBaseUrl,parentProvider:this.parentProvider,parentTraceWriter:this.parentTraceWriter,parentSurface:this.parentSurface,parentCanUseTool:this.parentCanUseTool,workspaceStore:this.workspaceStore}),g=()=>{};f.cwd!==void 0&&(SM(f.cwd),g=EV(f.cwd));let h=AX(f,t.progressEvents,t.parent.getInputStreamRef?.(),t.parent.abortSignal),b=_X(this.workspaceStore,n,i,f.provider),w,S,v,E;try{w=new qt(f);let x=t.parent.getInputStreamRef?.(),C=t.parent.abortSignal,I=this.progressSink??Hr();v=t.agentType?.trim()||void 0,E=t.resolvedAgentType?.trim()||void 0;let A=t.parentId?.trim()||void 0,P=this.sessionLabel??t.parent.sessionId,_=Eg.isEnabled()&&P?new Eg(P,n):void 0;S=new Ik(n,w,c,this.abortGraph,t.outputSchema,l,o,()=>{g();let M=S._currentStatus,N=M==="succeeded"||M==="failed"||M==="cancelled"?M:"succeeded";this.outputEventSink?.({type:"subagent_lifecycle",subagentId:n,status:N,...S._lastDurationMs!==void 0?{durationMs:S._lastDurationMs}:{}}),this.completed.add(n,S,{id:n,status:N}),this.active.delete(n),this.abortGraph.dispose(n),_?.close(),this.completed.recordHandle(n,S,S._currentStatus,S._currentTrace,S._lastStopReason)},x,C,v??t.idPrefix,I,A??t.parent.sessionId,i,this.onSubagentSucceededCb,t.config.idleTimeoutMs??qY()),_&&(S._logWriter=_),h(S),b.bindHandle(S),this.active.set(n,S)}catch(x){throw g(),this.abortGraph.dispose(n),x}let T=YY({effectiveTraceWriter:i,id:n,parentSessionId:t.parent.sessionId,rootId:this.rootId,effectiveChildModel:s,childConfig:f,promptHead:t.promptHead,effectiveAgentType:v,effectiveResolvedAgentType:E});return await XY({modelString:T,id:n,idPrefix:t.idPrefix,parentSessionId:t.parent.sessionId,effectiveResolvedAgentType:E}),this.outputEventSink?.({type:"subagent_lifecycle",subagentId:n,status:"started",...s!==void 0?{model:String(s)}:{},...v!==void 0?{agentType:v}:{},...t.promptHead!==void 0?{promptHead:t.promptHead}:{}}),S}async kill(t){let n=this.active.get(t);return n?(await n.cancel(),!0):!1}async killAll(){await Promise.allSettled([...this.active.values()].map(t=>t.cancel()))}async abortAllAndDrain(t,n="user_signal",r=zY,o=!1){let i=[...this.active.values()];if(i.length===0)return o&&this.rootController.signal.aborted&&this.rearmRoot(),{drained:0,timedOut:!1};this.abortGraph.abort(this.rootId,t,n);let s=!1,a=new Promise(l=>setTimeout(()=>{s=!0,l()},r).unref());return await Promise.race([Promise.allSettled(i.map(l=>l.cancel())),a]),s&&console.warn(`[SubagentManager] abortAllAndDrain: ${i.length} child(ren) did not settle within ${r}ms \u2014 sealing anyway; their terminal rows may be missing`),o&&this.rearmRoot(),{drained:i.length,timedOut:s}}rearmRoot(){this.rootController=new AbortController,this.abortGraph.rearm(this.rootId,this.rootController),this.parentAbortSignal?.aborted&&this.rootController.abort(this.parentAbortSignal.reason)}async teardownAll(){await Promise.allSettled([...this.active.values()].map(t=>t.teardown()))}}});async function IX(e,t={}){let{failFast:n=!0,teardown:r=!0,maxConcurrency:o=Gm()}=t;if(e.length===0)return[];let i=new Array(e.length),s=new Set(e.map((l,c)=>c)),a=!1;return await uu(e.map((l,c)=>c),o,async l=>{let c=e[l];n&&a&&await c.handle.cancel().catch(()=>{});let u=await c.handle.runToResult(c.prompt);if(i[l]=u,s.delete(l),n&&u.status!=="succeeded"){a=!0;for(let d of s){let p=e[d];p&&p.handle.status==="running"&&p.handle.cancel().catch(()=>{})}}}),r&&await Promise.allSettled(e.map(l=>l.handle.teardown())),i}var MX=y(()=>{"use strict";kw()});function OX(e){let t=new Set;for(let n of e){let r=yg(n,wOe);r!==void 0&&t.add(r)}return t}var wOe,$X=y(()=>{"use strict";id();Un();hw();wOe=new Set([...vn,...Ot,"memory_search","agent","skill"])});import{existsSync as Cs,readdirSync as SOe,readFileSync as vOe}from"fs";import{join as pi}from"path";function LX(e=ye()){let t=[],n=pi(e,"skills");if(Cs(n))for(let r of Dk(n)){let o=pi(n,r,"SKILL.md");Cs(o)&&t.push({path:o,type:"skill",source:"user"})}for(let r of DX){let o=pi(e,`${r}s`);if(Cs(o))for(let i of Dk(o))i.endsWith(".md")&&t.push({path:pi(o,i),type:r,source:"user"})}return t}function FX(e=Ze()){if(!Cs(e))return[];let t=[],n=qr(e);for(let r of n){let i=m0(e,r.path)?.key,s=pi(r.path,"skills");if(Cs(s))for(let a of Dk(s)){let l=pi(s,a,"SKILL.md");if(!Cs(l))continue;let c={path:l,type:"skill",source:"plugin"};i&&(c.plugin_key=i),t.push(c)}for(let a of DX){let l=pi(r.path,`${a}s`);if(Cs(l))for(let c of Dk(l)){if(!c.endsWith(".md"))continue;let u={path:pi(l,c),type:a,source:"plugin"};i&&(u.plugin_key=i),t.push(u)}}}return t}function NX(e=pi(ye(),"settings.json")){if(!Cs(e))return[];try{let t=vOe(e,"utf8"),r=JSON.parse(t).hooks;if(!r||typeof r!="object")return[];let o=[];for(let[i,s]of Object.entries(r))if(Array.isArray(s))for(let a=0;a<s.length;a++)o.push({event:i,index:a,raw:s[a]});return o}catch{return[]}}function Dk(e){try{return SOe(e).filter(t=>!t.startsWith("."))}catch{return[]}}var DX,BX=y(()=>{"use strict";U();zr();DX=["command","agent"]});import{z as Qe}from"zod";import{mkdir as UX,appendFile as jX}from"fs/promises";import{join as sO}from"path";function EOe(e){return{runUserDiscovery:e!=="plugin",runPluginDiscovery:e!=="user",runHookInspector:e!=="plugin"}}function xOe(e){let t=()=>{let i={};for(let s of KX)i[s]={correct:0,misfit:0,outlier:0};return i},n={user:t(),plugin:t()};for(let i of e)n[i.source][i.type][i.verdict]+=1;let r={high:0,med:1,low:2},o=e.filter(i=>i.verdict==="misfit").slice().sort((i,s)=>r[i.confidence]-r[s.confidence]);return{inventory:n,misfits:o}}function ROe(e){return e.verdict==="misfit"&&e.confidence==="high"&&e.source==="user"}function AOe(e){let t=e.filter(o=>o.source==="user"),n=e.filter(o=>o.source==="plugin"),r=["","## Discovered artifacts (audit only these)",""];if(r.push('### User-scope artifacts (set `"source": "user"`, omit `plugin_key`)'),t.length===0)r.push("(none discovered)");else for(let o of t)r.push(`- ${o.path}`);if(r.push(""),r.push('### Plugin-scope artifacts (set `"source": "plugin"`, copy `plugin_key` from each entry)'),n.length===0)r.push("(none discovered)");else for(let o of n){let i=o.plugin_key??"<unknown>";r.push(`- ${o.path} (plugin_key: ${i})`)}return r.join(`
1378
+ `);let c=new AbortController;this.abortGraph.register(n,c),this.abortGraph.linkChild(this.rootId,n);let u=t.config.cwd??this.parentCwd,d=await AV({parentReadRoots:this.parentReadRoots,parentCwd:this.parentCwd,effectiveChildCwd:u,callerReadRoots:t.config.readRoots,callerExtraReadRoots:t.config.extraReadRoots,resolveMainRoot:x=>this.resolveMainRootForCwd(x)}),p=CV(t.config.writeRoots,u),f=VY({options:t,id:n,resume:r,registry:o,effectiveChildModel:s,effectiveTimeoutMs:l,inheritedReadRoots:d,composedWriteRoots:p,childController:c,parentCwd:this.parentCwd,parentApiKey:this.parentApiKey,parentBaseUrl:this.parentBaseUrl,parentProvider:this.parentProvider,parentTraceWriter:this.parentTraceWriter,parentSurface:this.parentSurface,parentCanUseTool:this.parentCanUseTool,workspaceStore:this.workspaceStore}),g=()=>{};f.cwd!==void 0&&(SM(f.cwd),g=EV(f.cwd));let h=AX(f,t.progressEvents,t.parent.getInputStreamRef?.(),t.parent.abortSignal),b=_X(this.workspaceStore,n,i,f.provider),w,S,v,E;try{w=new qt(f);let x=t.parent.getInputStreamRef?.(),C=t.parent.abortSignal,I=this.progressSink??Hr();v=t.agentType?.trim()||void 0,E=t.resolvedAgentType?.trim()||void 0;let A=t.parentId?.trim()||void 0,P=this.sessionLabel??t.parent.sessionId,_=Eg.isEnabled()&&P?new Eg(P,n):void 0;S=new Ik(n,w,c,this.abortGraph,t.outputSchema,l,o,()=>{g();let M=S._currentStatus,N=M==="succeeded"||M==="failed"||M==="cancelled"?M:"succeeded";this.outputEventSink?.({type:"subagent_lifecycle",subagentId:n,status:N,...S._lastDurationMs!==void 0?{durationMs:S._lastDurationMs}:{},...S._currentTrace.turnCount>0?{turnCount:S._currentTrace.turnCount}:{},...S._lastStopReason!==void 0?{stopReason:S._lastStopReason}:{}}),this.completed.add(n,S,{id:n,status:N}),this.active.delete(n),this.abortGraph.dispose(n),_?.close(),this.completed.recordHandle(n,S,S._currentStatus,S._currentTrace,S._lastStopReason)},x,C,v??t.idPrefix,I,A??t.parent.sessionId,i,this.onSubagentSucceededCb,t.config.idleTimeoutMs??qY()),_&&(S._logWriter=_),h(S),b.bindHandle(S),this.active.set(n,S)}catch(x){throw g(),this.abortGraph.dispose(n),x}let T=YY({effectiveTraceWriter:i,id:n,parentSessionId:t.parent.sessionId,rootId:this.rootId,effectiveChildModel:s,childConfig:f,promptHead:t.promptHead,effectiveAgentType:v,effectiveResolvedAgentType:E});return await XY({modelString:T,id:n,idPrefix:t.idPrefix,parentSessionId:t.parent.sessionId,effectiveResolvedAgentType:E}),this.outputEventSink?.({type:"subagent_lifecycle",subagentId:n,status:"started",...s!==void 0?{model:String(s)}:{},...v!==void 0?{agentType:v}:{},...t.promptHead!==void 0?{promptHead:t.promptHead}:{},...t.parentId?{parentToolUseId:t.parentId}:{}}),S}async kill(t){let n=this.active.get(t);return n?(await n.cancel(),!0):!1}async killAll(){await Promise.allSettled([...this.active.values()].map(t=>t.cancel()))}async abortAllAndDrain(t,n="user_signal",r=zY,o=!1){let i=[...this.active.values()];if(i.length===0)return o&&this.rootController.signal.aborted&&this.rearmRoot(),{drained:0,timedOut:!1};this.abortGraph.abort(this.rootId,t,n);let s=!1,a=new Promise(l=>setTimeout(()=>{s=!0,l()},r).unref());return await Promise.race([Promise.allSettled(i.map(l=>l.cancel())),a]),s&&console.warn(`[SubagentManager] abortAllAndDrain: ${i.length} child(ren) did not settle within ${r}ms \u2014 sealing anyway; their terminal rows may be missing`),o&&this.rearmRoot(),{drained:i.length,timedOut:s}}rearmRoot(){this.rootController=new AbortController,this.abortGraph.rearm(this.rootId,this.rootController),this.parentAbortSignal?.aborted&&this.rootController.abort(this.parentAbortSignal.reason)}async teardownAll(){await Promise.allSettled([...this.active.values()].map(t=>t.teardown()))}}});async function IX(e,t={}){let{failFast:n=!0,teardown:r=!0,maxConcurrency:o=Gm()}=t;if(e.length===0)return[];let i=new Array(e.length),s=new Set(e.map((l,c)=>c)),a=!1;return await uu(e.map((l,c)=>c),o,async l=>{let c=e[l];n&&a&&await c.handle.cancel().catch(()=>{});let u=await c.handle.runToResult(c.prompt);if(i[l]=u,s.delete(l),n&&u.status!=="succeeded"){a=!0;for(let d of s){let p=e[d];p&&p.handle.status==="running"&&p.handle.cancel().catch(()=>{})}}}),r&&await Promise.allSettled(e.map(l=>l.handle.teardown())),i}var MX=y(()=>{"use strict";kw()});function OX(e){let t=new Set;for(let n of e){let r=yg(n,wOe);r!==void 0&&t.add(r)}return t}var wOe,$X=y(()=>{"use strict";id();Un();hw();wOe=new Set([...vn,...Ot,"memory_search","agent","skill"])});import{existsSync as Cs,readdirSync as SOe,readFileSync as vOe}from"fs";import{join as pi}from"path";function LX(e=ye()){let t=[],n=pi(e,"skills");if(Cs(n))for(let r of Dk(n)){let o=pi(n,r,"SKILL.md");Cs(o)&&t.push({path:o,type:"skill",source:"user"})}for(let r of DX){let o=pi(e,`${r}s`);if(Cs(o))for(let i of Dk(o))i.endsWith(".md")&&t.push({path:pi(o,i),type:r,source:"user"})}return t}function FX(e=Ze()){if(!Cs(e))return[];let t=[],n=qr(e);for(let r of n){let i=m0(e,r.path)?.key,s=pi(r.path,"skills");if(Cs(s))for(let a of Dk(s)){let l=pi(s,a,"SKILL.md");if(!Cs(l))continue;let c={path:l,type:"skill",source:"plugin"};i&&(c.plugin_key=i),t.push(c)}for(let a of DX){let l=pi(r.path,`${a}s`);if(Cs(l))for(let c of Dk(l)){if(!c.endsWith(".md"))continue;let u={path:pi(l,c),type:a,source:"plugin"};i&&(u.plugin_key=i),t.push(u)}}}return t}function NX(e=pi(ye(),"settings.json")){if(!Cs(e))return[];try{let t=vOe(e,"utf8"),r=JSON.parse(t).hooks;if(!r||typeof r!="object")return[];let o=[];for(let[i,s]of Object.entries(r))if(Array.isArray(s))for(let a=0;a<s.length;a++)o.push({event:i,index:a,raw:s[a]});return o}catch{return[]}}function Dk(e){try{return SOe(e).filter(t=>!t.startsWith("."))}catch{return[]}}var DX,BX=y(()=>{"use strict";U();zr();DX=["command","agent"]});import{z as Qe}from"zod";import{mkdir as UX,appendFile as jX}from"fs/promises";import{join as sO}from"path";function EOe(e){return{runUserDiscovery:e!=="plugin",runPluginDiscovery:e!=="user",runHookInspector:e!=="plugin"}}function xOe(e){let t=()=>{let i={};for(let s of KX)i[s]={correct:0,misfit:0,outlier:0};return i},n={user:t(),plugin:t()};for(let i of e)n[i.source][i.type][i.verdict]+=1;let r={high:0,med:1,low:2},o=e.filter(i=>i.verdict==="misfit").slice().sort((i,s)=>r[i.confidence]-r[s.confidence]);return{inventory:n,misfits:o}}function ROe(e){return e.verdict==="misfit"&&e.confidence==="high"&&e.source==="user"}function AOe(e){let t=e.filter(o=>o.source==="user"),n=e.filter(o=>o.source==="plugin"),r=["","## Discovered artifacts (audit only these)",""];if(r.push('### User-scope artifacts (set `"source": "user"`, omit `plugin_key`)'),t.length===0)r.push("(none discovered)");else for(let o of t)r.push(`- ${o.path}`);if(r.push(""),r.push('### Plugin-scope artifacts (set `"source": "plugin"`, copy `plugin_key` from each entry)'),n.length===0)r.push("(none discovered)");else for(let o of n){let i=o.plugin_key??"<unknown>";r.push(`- ${o.path} (plugin_key: ${i})`)}return r.join(`
1379
1379
  `)}function COe(e,t){let n=["","## Discovered hooks (audit only these)",""];if(n.push(`Settings file (use this absolute path verbatim in each verdict's \`path\` field): \`${e}\``),n.push(""),t.length===0)return n.push("(no hooks discovered)"),n.join(`
1380
1380
  `);for(let r of t){let o=`${r.event}-${r.index}`;n.push(`### Hook \`${o}\``),n.push(""),n.push("```json"),n.push(JSON.stringify(r.raw,null,2)),n.push("```"),n.push("")}return n.join(`
1381
1381
  `)}function _Oe(e,t){if(!t)return{kind:"failure",message:`${e}: no result`};if(t.schemaError)return{kind:"failure",message:`${e}: schema mismatch \u2014 ${t.schemaError.message}`};if(t.status!=="succeeded"){let n=t.error?` \u2014 ${t.error.message}`:"";return{kind:"failure",message:`${e}: ${t.status}${n}`}}return t.output?{kind:"success",output:t.output}:{kind:"failure",message:`${e}: no output`}}async function POe(e,t,n){let r=n?.apiKey,o=An({defaultSubagentModel:n?.defaultSubagentModel,defaultModel:n?.defaultModel}),i=n?.callId,s=typeof e=="object"&&e!==null?e:{},a=kOe.parse(s),l=a.writeBriefs??!0,c=a.scope??"all",u=EOe(c);if(!t?.sessionId)throw new Error("audit-fit requires a parent session with sessionId");let d=t.sessionId,p=it("audit-fit"),f={skill:p["01-skill-inspector.md"],command:p["02-command-inspector.md"],agent:p["03-agent-inspector.md"],hook:p["04-hook-inspector.md"]};for(let O of KX)if(!f[O])throw new Error(`audit-fit skill missing inspector prompt for ${O}`);let g=u.runUserDiscovery?LX():[],h=u.runPluginDiscovery?FX():[],b={skill:[],command:[],agent:[]};for(let O of[...g,...h])b[O.type].push(O);let w=new Te({apiKey:r,...n?.defaultModel!==void 0?{parentModel:n.defaultModel}:{},...n?.traceWriter!==void 0?{traceWriter:n.traceWriter}:{},...n?.workspaceStore!==void 0?{workspaceStore:n.workspaceStore}:{}}),S=OX(Mo.allowedTools),v=()=>async O=>S.has(O)?{behavior:"allow"}:{behavior:"deny",message:`Tool ${O} not allowed for audit-fit inspectors. Allowed tools: ${[...S].join(", ")}`},E=[];for(let O of TOe){let j=b[O];if(j.length===0)continue;let q=f[O];q&&E.push({type:O,prompt:`${q}
@@ -2180,7 +2180,7 @@ ${E}
2180
2180
  ${T}`})}return{fileBlocks:l,warnings:c}}function Mle(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function Ole(e,t,n){let r=t?.peekQueuedText(),o=r!==void 0?{text:r.text,claimed:!1}:void 0;r!==void 0&&t?.reserveQueued?.(r);let i;try{i=await e.promoteActiveForeground(o)}catch(s){throw r!==void 0&&t?.releaseQueued?.(r),s}if(o?.claimed===!0&&t!==null&&r!==void 0){try{await n?.(o.text)}catch{}return t.dropQueued(r),{jobs:i,flushedText:o.text,flushedPreview:r.preview}}return r!==void 0&&t?.releaseQueued?.(r),{jobs:i}}F();L();F();nt();L();Ml();function $le(){return{toolStartTimes:new Map,subagentStartTimes:new Map,subagentLabels:new Map}}function Dle(e,t){He()&&(t.pending||e.toolStartTimes.has(t.toolUseId)||e.toolStartTimes.set(t.toolUseId,Date.now()))}function Lle(e,t,n,r){if(!He())return;let o=e.toolStartTimes.get(t.toolUseId),i=o!==void 0?Date.now()-o:void 0;e.toolStartTimes.delete(t.toolUseId);let s=$e(n??"tool"),a=t.isError?m.error("err"):m.success("ok"),l=i!==void 0?` \xB7 ${be(i)}`:"";r.fn(m.dim(` \u25E6 ${s}${l} \xB7 `)+a)}function Fle(e,t,n,r){if(!He())return;let{subagentId:o,agentType:i}=n,s=$e(i??o);if(e.subagentStartTimes.has(o)||(e.subagentStartTimes.set(o,Date.now()),e.subagentLabels.set(o,s),r.fn(m.dim(` \u25E6 worker ${s} started`))),t.type==="done"||t.type==="error"){let l=e.subagentStartTimes.get(o),c=l!==void 0?Date.now()-l:void 0;e.subagentStartTimes.delete(o),e.subagentLabels.delete(o);let u=c!==void 0?` \xB7 ${be(c)}`:"",d=t.type==="error"?m.error("failed"):m.success("done");r.fn(m.dim(` \u25E6 worker ${s}${u} \xB7 `)+d)}}var VR=class{state;writer;ttfb;constructor(t,n){this.state=$le(),this.writer=t,this.ttfb=n}onToolStart(t){Dle(this.state,t)}onToolResult(t,n){Lle(this.state,t,n,this.writer)}onSubagentEvent(t,n){Fle(this.state,t,n,this.writer)}onFirstContent(t){this.ttfb.waitingLineEmitted&&(this.ttfb.waitingLineEmitted=!1,t.write("\r\x1B[2K"))}};function Nle(e){return{startedAt:e,received:!1,waitingLineEmitted:!1}}function Ble(e){return e.received?{}:{turnStartedAt:e.startedAt}}function Ule(e,t,n){let r=t.type==="chunk"&&t.chunk.type==="content"&&!n;return r&&(e.received=!0),r}function jle(e,t=process.stdout,n){if(!He()||!t.isTTY)return;(e?.fn??console.log)(m.dim(" \u25E6 waiting for response\u2026")),n&&(n.waitingLineEmitted=!0,e&&(n.plainHooks=new VR(e,n)))}fe();L();var CVe=3e3;async function Hle(e,t){if(!e)return t;let n=Date.now();if(n-t<CVe)return t;try{let r=e();r instanceof Promise&&await r}catch(r){qe()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),r)}return n}L();fe();wt();Qs();var _Ve="Keep waiting \u2014 auto-resume in progress",Wle="Switch model / provider (type /model after)",PVe="Stop waiting";async function Kle(e){let{event:t,session:n,borrowedCompositor:r,pickerRef:o,completionWriter:i,disposeRendererOnce:s,setPausedState:a,onPauseInterrupt:l}=e;if(a?.(!0),await s(),r&&t.autoResume===!0){let c=new AbortController;o.abort=c;let u=t.resetsAt?t.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,d=u?`Keep waiting \u2014 auto-resumes at ${u}`:_Ve,p=[m.warning(" \u23F3 Usage limit reached.")+(u?m.dim(` Auto-resumes at ${u}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];Mn(r,{header:p,options:[d,Wle,PVe],signal:c.signal,initialIndex:0}).then(f=>{if(o.abort=null,!f)return;let g=f[0];g===void 0||g===d||(l(),g===Wle&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),n.interrupt().catch(h=>{qe()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),h)}))}).catch(f=>{qe()&&console.error(" "+m.error("picker promise rejected:"),f)})}else(i??{fn:console.log}).fn(aj({reason:t.reason,...t.resetsAt!==void 0?{resetsAt:t.resetsAt}:{},...t.accountId!==void 0?{accountId:t.accountId}:{},...t.autoResume!==void 0?{autoResume:t.autoResume}:{}}))}JE();async function Gle(e,t,n,r,o="summary",i,s){let a=Yee(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l=Date.now(),c=Nle(l);jle(i,process.stdout,c),ep(process.stdout,ph(process.cwd(),!0));let u="",d=0,p=!1,f=!1,g=!1,h=!1,b=!1,w,S=!1,v=!1,E={abort:null},T=0,x=[],C=new Map,I=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,A=()=>{let j=r.subagentControl;j?.hasPromotableForeground()&&Ole(j,P,r.onQueuedUserMessage).then(({jobs:q,flushedText:H,flushedPreview:W})=>{let X=(i??{fn:console.log}).fn;for(let D of q)X(m.dim(` \u2192 subagent backgrounded as ${D.jobId}: ${D.label}`));q.some(D=>D.sharesWorktree)&&X(m.warning("\u26A0 Background child is writing to your worktree \u2014 edits may conflict until it finishes")),H!==void 0&&X(m.dim(` \u2192 queued message sent to this turn: ${Mle(W??H)}`))}).catch(()=>{})},P=r.getCompositor?r.getCompositor():null,_=()=>new Ep({out:Rp(i),thinkingMode:o,...I?{activeSkillName:I}:{},onCancel:()=>{t.interrupt().catch(j=>{qe()&&console.error(" "+m.error("session.interrupt() failed:"),j)})},...r.subagentControl?{onBackground:A}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...P?{compositor:P}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{},...Ble(c),...r.addPreviewDiffRef?{addPreviewDiffRef:r.addPreviewDiffRef}:{}}),M=_();r.bashTailSetter&&(r.bashTailSetter.current=(j,q)=>M.setBashOutputTail(j,q));let N=async()=>{if(!h){h=!0,r.bashTailSetter&&(r.bashTailSetter.current=void 0);try{await M.dispose()}catch{}}},O=async()=>{await M.arm();let j=M.getCompositor();if(i&&j){let q=j;i.fn=H=>q.commitAbove(H),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(j),r.setInterruptNotifier?.(q=>M.setInterrupting(q)),r.rearmStatus?.()};try{P?P.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{S=!0,M.setSoftStopping(!0),t.interrupt().catch(Z=>{qe()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),Z)});let K=r.subagentControl;K?.hasActiveForeground()&&K.cancelActiveForeground().catch(Z=>{qe()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),Z)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{v=!0,t.interrupt().catch(K=>{qe()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),K)})}),await O(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(A),r.setTaskViewHandler?.(Rle(r));let{fileBlocks:j,warnings:q}=Ile(e.text,{rootDir:process.cwd()});for(let K of q)(i??{fn:console.log}).fn(m.dim(` @-file: ${K}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let H=j.length>0||e.attachments.length>0?await Ple(e.text,e.attachments,void 0,j,t.sessionId):e.text,W=t.sendMessageStream(H);await Hu((K,Z)=>{M.process(K,Z),Z&&c.plainHooks?.onSubagentEvent(K,Z)},async()=>{for await(let K of W){if(S||v)break;let Z=Ule(c,K,f);if(K.type==="chunk"&&K.chunk.type==="content"?(u=p?Ele(u,K.chunk.content):u+K.chunk.content,p=!1,f=!0):K.type==="message"&&!f&&(u=K.message.content),K.type==="stream_retry"&&(u=u.slice(0,d),p=u.length>0),K.type==="chunk"&&K.chunk.type==="tool_use_detail"){let ce=K.chunk,ne={toolName:ce.toolName,toolUseId:ce.toolUseId,input:ce.toolInput,...ce.toolInputRaw!==void 0&&{inputRaw:ce.toolInputRaw}};C.set(ce.toolUseId,ne),x.push(ne),c.plainHooks?.onToolStart(ce)}else if(K.type==="chunk"&&K.chunk.type==="tool_result"){let ce=K.chunk;d=u.length,p=!0;let ne=C.get(ce.toolUseId);ne&&(ne.result=ce.content,ne.isError=ce.isError,C.delete(ce.toolUseId)),c.plainHooks?.onToolResult(ce,ne?.toolName),T=await Hle(r.onContextProgress,T)}if(K.type==="paused"){await Kle({event:K,session:t,borrowedCompositor:P,pickerRef:E,completionWriter:i,disposeRendererOnce:N,setPausedState:r.setPausedState,onPauseInterrupt:()=>{v=!0}});continue}if(K.type==="resumed"){r.setPausedState?.(!1),E.abort?.abort(),E.abort=null;let ce=K.hotSwapped&&K.accountId?`\u25B6 Resumed on ${K.accountId}`:"\u25B6 Resumed";u="",d=0,p=!1,f=!1,x.length=0,C.clear(),b=!1,w=void 0,g=!1,M=_(),h=!1,await O(),(i??{fn:console.log}).fn(m.success(ce));continue}if(K.type==="error"){await N(),Yc(jc(K.error)),g=!0;continue}M.process(K),Z&&(c.plainHooks?.onFirstContent(process.stdout),M.notifyFirstContent()),K.type==="done"&&(b=!0,w=K.metadata)}});let D=!1;if(b&&!S&&!v){let K=kle(M.getPendingBuffer());K>=0?M.stripPendingTerminalState(K):cy(u)!==null&&(D=!0)}await N();let G=i?i.fn:console.log;if(S){let K=P?P.getPendingCount():0,Z=K>0?` \xB7 ${K} queued`:"";G(m.warning(`\u23F8 Stopped${Z} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),G("")}if(v&&(G(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),G("")),b&&!S&&!v){Nl(n,a,u,w,x),await r.onTurnComplete?.(a,u).catch(()=>{}),Zd(process.stdout),oZ(process.stdout,"afk: turn complete");let K=ce=>{i?i.fn(ce):console.log(ce)},Z=cy(u);if(Z&&!D){K(xle(Z,{durationMs:w?.durationMs,totalCostUsd:w?.totalCostUsd,toolCount:x.length})),K("");let ce=CF(x),ne=Toe(x);if(r.onTerminalState)try{r.onTerminalState(Z,{doneHasCorroboratingEvidence:ne,doneEvidenceClassification:ce})}catch{}if(n.permissionMode==="autonomous"){let Ie=Z.kind==="done"&&Rf().verifyDone===!0&&!ne;xoe(Z,void 0,{unverified:Ie})}}if(MN(w,n,K),ON(K,process.stdout),r.onAfterTurn){let ce=r.onAfterTurn();ce instanceof Promise&&await ce.catch(()=>{})}}}catch(j){await N(),g||Yc(jc(j))}finally{await N(),ep(process.stdout,ph(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setTaskViewHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),E.abort?.abort(),E.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}js();Rm();var IVe=5e3,MVe=3,OVe="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function $Ve(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(m.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function qle(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,mascotBar:u,healthRail:d,verdictLedger:p,shellPassthrough:f,bgResultNotifier:g}=s,h=null,b=[];e.session.current.waitForInitialization().then(async _=>{qe()&&(h=Xx(_)),await Hh(e.session.current),qe()&&(b=YL())}).catch(()=>{});let w=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,S,v=!1,E=!1,T;e.clearPendingStopInjection=()=>{T=void 0};let x,C,I,A=(()=>{let _=parseInt(e.options.maxTurns,10);return _>0?_:void 0})(),P=0;for(g.onInjectable=()=>{P>=MVe||!o.isAwaitingInput()||!o.bufferIsEmpty()||(P++,Zd(process.stdout),w={text:OVe,attachments:[]},o.abortPendingRead())};;){if(P=0,h&&(e.replRenderer.writeLine(h),e.replRenderer.writeLine(""),h=null),b.length>0){for(let D of b)e.replRenderer.writeLine(D);e.replRenderer.writeLine(""),b=[]}let _=f.drainNotifications();for(let{job:D,result:G}of _){let K=G.errorReason===void 0?"\u2713":"\u2717",Z=G.errorReason==="abort"?"killed":G.errorReason==="timeout"?"timed out":G.errorReason==="signal-killed"?"killed by signal":`exit ${G.exitCode??0}`,ce=Math.max(0,Math.round(G.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${K} [${D.id}] ${Z} \xB7 ${ce}s \xB7 `)+D.command)}let M=g.drainNotifications();for(let{job:D}of M){let G=D.status==="completed"?"\u2713":D.status==="failed"?"\u2717":"\u2298",K=D.endedAt!==void 0?Math.max(0,Math.round((D.endedAt-D.startedAt)/100)/10):0,Z=ee(D.label,60);e.replRenderer.writeLine(m.dim(` ${G} [${D.jobId}] subagent ${D.status} \xB7 ${K}s \xB7 `)+Z)}let N=l.renderIfChanged(e.stats.sessionId);if(N.length>0){for(let D of N)e.replRenderer.writeLine(D);e.replRenderer.writeLine("")}let O,j;if(w===void 0){let D=await e.session.current.takePendingPlanExitSeed();D!==void 0&&(e.stats.permissionMode=D.mode,w={text:D.message,attachments:[]})}if(w!==void 0){let D=w;w=void 0;let G=Dp(e.stats.permissionMode),K=Kl({buffer:D.text,promptText:G,isTTY:!!process.stdout.isTTY,attachmentSummary:up([...D.attachments])});e.replRenderer.writeLine(K),O=D.text.trim(),j=D.attachments}else{let D=S;S=void 0;let G=await o.readLine({promptFn:()=>Dp(e.stats.permissionMode),...D!==void 0?{initialBuffer:D}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{jR(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});O=G.text.trim(),j=G.attachments}if(!O&&j.length===0)continue;if(O.startsWith("!")){let D=/^(0|false|off|no)$/i.test(k.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!D&&(v||(v=!0,e.replRenderer.writeLine(m.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await f.dispatch(O))){e.statusLine.rearm();continue}}let q=!1;if(O.startsWith("/")){let D=await yD(O,e.slashCtx,j);if(D.handled){if(D.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((O==="/clear"||O.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),p.reset(),T=void 0),D.result!==null&&typeof D.result=="object"&&"kind"in D.result&&D.result.kind==="submit"){w={text:D.result.message,attachments:j??[]},e.statusLine.rearm();continue}if(D.result!==null&&typeof D.result=="object"&&"kind"in D.result&&D.result.kind==="prefill"){S=D.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}q=!0}a.push(O),await $Ve(e,O);let H=O;if(q){let D=bE(O);if(D){let G=D.name.replace(/^\//,"").split(":").pop()??"";if(G&&Tx(G)){let K={skillName:G,rawArgs:D.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},Z=e.session.current.sessionId,ce=Ys(Z),ne=Date.now();B(`[afk trace] preflight.start commandName=${G}`);let Ie=!1,ze=await Js(K,{cwd:e.stats.cwd??process.cwd(),artifactDir:ce},eo=>{qe()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${G}) failed: `)+(eo instanceof Error?eo.message:String(eo)))});Ie=ze!==null,B(`[afk trace] preflight.end commandName=${G} durationMs=${Date.now()-ne} success=${Ie}`),H=Ex(ze?.manifestBlock,O)}}}let W=f.drainInjections();W.length>0&&(H=W+H);let X=g.drainInjections();if(X.length>0&&(H=X+H),T!==void 0&&(H=T+`
2181
2181
 
2182
2182
  `+H,T=void 0),e.hookRegistry)try{let D={event:"UserPromptSubmit",prompt:H,sessionId:e.stats.sessionId},G=await e.hookRegistry.dispatch(D);G.injectContext&&(H=G.injectContext+H)}catch(D){if(D instanceof Ce){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(D.reason?m.dim(`: ${se(D.reason)}`):"")),e.statusLine.rearm();continue}if(D instanceof fo){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${D.timeoutMs}ms`)),e.statusLine.rearm();continue}throw D}if(x=C=I=void 0,fj(),bj(),await Gle({text:H,attachments:j},e.session.current,e.stats,{setInFlight(D){n.turnInFlight=D},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(D){await t.appendUser(D)},async onQueuedUserMessage(D){await t.appendQueuedUser(D)},async onTurnComplete(D,G){if(await t.appendTurn(D,G),e.stats.sessionId)try{Us(e.stats)}catch(K){E||(E=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(K instanceof Error?K.message:String(K))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.repaint(vr(e.stats,e.contextSampler,e.gitStatusSampler,A)),e.statusLine.rearm(),c?.repaint("observing"),d?.update(e.stats)},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(D,G)=>{p?.push(D),x=D.kind,C=G?.doneHasCorroboratingEvidence,I=G?.doneEvidenceClassification},setActiveCompositor:D=>{n.activeCompositor=D,D===null&&n.interruptPickerAbort&&(n.interruptPickerAbort.abort(),n.interruptPickerAbort=null)},setInterruptNotifier:D=>{n.notifyInterrupting=D},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:D=>o.setBackgroundHandler(D),setTaskViewHandler:D=>o.setTaskViewHandler(D),setSoftStopHandler:i,setPausedState:D=>o.setPausedState(D),setPauseInterruptHandler:D=>o.setPauseInterruptHandler(D),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(vr(e.stats,e.contextSampler,e.gitStatusSampler,A)),d?.update(e.stats,e.contextSampler.getRatio())},...c?{onStageChange:(D,G)=>{c.repaint(D),u?.onStage(D,G)}}:{},...e.addPreviewDiffRef?{addPreviewDiffRef:e.addPreviewDiffRef}:{},bashTailSetter:e.bashTailSetter},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Dp(e.stats.permissionMode))),e.hookRegistry)try{let D=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...x!==void 0?{terminalState:x}:{},...C!==void 0?{doneHasCorroboratingEvidence:C}:{},...I!==void 0?{doneEvidenceClassification:I}:{}},void 0,IVe);D.injectContext&&D.injectContext.trim().length>0&&(T=D.injectContext)}catch(D){if(D instanceof Ut)throw D;D instanceof fo?(B("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):D instanceof Ce?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${se(D.reason??"no reason given")}`)):B("[stop hook] unexpected error: "+String(D))}}}function DVe(e,t){if(e!==void 0){let n=e.toLowerCase();return!(n==="0"||n==="false"||n==="off"||n==="no")}return typeof t=="boolean"?t:!0}async function zle(e,t,n,r){let o=await Lae(),i=new UR({rl:e.rl,history:o,statusLine:e.statusLine}),s=DVe(k.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await ole(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=vle(e,n);let c=a;e.slashCtx.suspendFooter=()=>{c.bgStatusBar.stop(),c.mascotBar.stop(),c.healthRail.stop(),e.statusLine.stop()},e.slashCtx.resumeFooter=()=>{e.statusLine.start(),c.healthRail.start(),c.mascotBar.start(),c.bgStatusBar.start(),c.bgStatusBar.redraw()},await qle(e,t,n,r,i,l,a,o),await e.resolveWorktreeDisposition?.(!0)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.healthRail.stop(),a?.loopStageBar.stop(),a?.mascotBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}bf();Iu();import{execFile as LVe}from"node:child_process";import{dirname as FVe,isAbsolute as NVe,resolve as BVe}from"node:path";import{promisify as UVe}from"node:util";var Vle=UVe(LVe),jVe=3e3,HVe=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function WVe(){let t=(await Vle("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=NVe(t)?t:BVe(process.cwd(),t);return FVe(n)}async function Jle(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await WVe()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),jVe)});try{let o=ur({execFile:Vle,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),i=await Promise.race([o,r]);if(i==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let s=i;return s.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:s.candidates.filter(c=>HVe.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Lb();bf();import{promises as KVe}from"node:fs";import{dirname as GVe,join as Qle}from"node:path";import{randomBytes as qVe}from"node:crypto";var zVe=["Generate a 2-4 word kebab-case slug describing this work request.","Rules:","- ASCII lowercase letters and digits only, separated by single hyphens","- 2 to 4 hyphen-separated words","- Maximum 30 characters total","- No prefix, no quotes, no punctuation other than hyphens","- Output ONLY the slug \u2014 no explanation, no preamble","Examples: fix-cleanup-race, add-telegram-allowlist, refactor-prompt-loader, debug-flaky-test"].join(`
2183
- `),Yle=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,DN=30,VVe=1024,JVe=8e3,YVe="haiku";async function XVe(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=tJe(n,VVe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??JVe),s=t.signal?nJe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await eu({token:t.token,model:t.model??YVe,system:zVe,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=QVe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=GVe(t.worktreePath);return await ZVe(l,c)}function QVe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(Yle.test(t)&&t.length<=DN)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>DN)break;o=s}return Yle.test(o)?o:null}async function ZVe(e,t){if(!await eJe(Qle(t,e)))return e;let n=qVe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,DN-5)}-${n}`}async function eJe(e){try{return await KVe.access(e),!0}catch{return!1}}function tJe(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function nJe(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function Zle(e){let t,n,r=Qle(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await XVe(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Gw(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return Xle(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return Xle(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function Xle(e,t){e&&e.setCwd(t),rJe(t)}function rJe(e){try{process.chdir(e)}catch{}}yt();kt();Bc();jo();U();import{spawn as tce}from"child_process";import{existsSync as nce,mkdirSync as lJe,readFileSync as rce,unlinkSync as ece,writeFileSync as oce}from"fs";import{get as cJe}from"https";import{join as ice}from"path";import{readFileSync as oJe}from"fs";import{dirname as iJe,join as sJe}from"path";import{fileURLToPath as aJe}from"url";function Tr(){try{return"5.208.4"}catch{}try{let e=iJe(aJe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(oJe(sJe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}L();F();var uJe=64*1024,dJe=10800*1e3,pJe=800,mJe=3600*1e3,fJe="update-check.json",gJe="pending-update.json";function LN(){return ice(ya(),fJe)}function uy(){return ice(ya(),gJe)}function FN(){let e=ya();nce(e)||lJe(e,{recursive:!0})}function sce(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function ace(){try{let e=rce(LN(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function lce(){try{FN();let e=`
2183
+ `),Yle=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,DN=30,VVe=1024,JVe=8e3,YVe="haiku";async function XVe(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=tJe(n,VVe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??JVe),s=t.signal?nJe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await eu({token:t.token,model:t.model??YVe,system:zVe,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=QVe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=GVe(t.worktreePath);return await ZVe(l,c)}function QVe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(Yle.test(t)&&t.length<=DN)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>DN)break;o=s}return Yle.test(o)?o:null}async function ZVe(e,t){if(!await eJe(Qle(t,e)))return e;let n=qVe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,DN-5)}-${n}`}async function eJe(e){try{return await KVe.access(e),!0}catch{return!1}}function tJe(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function nJe(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function Zle(e){let t,n,r=Qle(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await XVe(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Gw(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return Xle(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return Xle(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function Xle(e,t){e&&e.setCwd(t),rJe(t)}function rJe(e){try{process.chdir(e)}catch{}}yt();kt();Bc();jo();U();import{spawn as tce}from"child_process";import{existsSync as nce,mkdirSync as lJe,readFileSync as rce,unlinkSync as ece,writeFileSync as oce}from"fs";import{get as cJe}from"https";import{join as ice}from"path";import{readFileSync as oJe}from"fs";import{dirname as iJe,join as sJe}from"path";import{fileURLToPath as aJe}from"url";function Tr(){try{return"5.209.0"}catch{}try{let e=iJe(aJe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(oJe(sJe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}L();F();var uJe=64*1024,dJe=10800*1e3,pJe=800,mJe=3600*1e3,fJe="update-check.json",gJe="pending-update.json";function LN(){return ice(ya(),fJe)}function uy(){return ice(ya(),gJe)}function FN(){let e=ya();nce(e)||lJe(e,{recursive:!0})}function sce(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function ace(){try{let e=rce(LN(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function lce(){try{FN();let e=`
2184
2184
  const https = require('https');
2185
2185
  const fs = require('fs');
2186
2186
  const url = 'https://registry.npmjs.org/agent-afk/latest';