abtars 0.3.4-alpha.0 → 0.3.4-alpha.2

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 (392) hide show
  1. package/bundle/{_registry.generated-7DRCE4V6.js → _registry.generated-RC6PEH6Z.js} +16 -15
  2. package/bundle/{_registry.generated-7DRCE4V6.js.map → _registry.generated-RC6PEH6Z.js.map} +1 -1
  3. package/bundle/abtars-browser.js +6 -5
  4. package/bundle/abtars-browser.js.map +1 -1
  5. package/bundle/abtars-cli.js +73 -46
  6. package/bundle/abtars-cli.js.map +3 -3
  7. package/bundle/abtars-restart.js +7 -7
  8. package/bundle/abtars-rss.js +2 -1
  9. package/bundle/abtars-rss.js.map +2 -2
  10. package/bundle/abtars-task.js +6 -5
  11. package/bundle/abtars-task.js.map +1 -1
  12. package/bundle/abtars-todo.js +2 -1
  13. package/bundle/abtars-todo.js.map +1 -1
  14. package/bundle/abtars.js +307 -212
  15. package/bundle/abtars.js.map +4 -4
  16. package/bundle/{acp-raw-client-AZJCEB6S.js → acp-raw-client-E6FM45NC.js} +4 -3
  17. package/bundle/{acp-raw-client-AZJCEB6S.js.map → acp-raw-client-E6FM45NC.js.map} +1 -1
  18. package/bundle/{action-gate-QYJL57IX.js → action-gate-G2V47NHW.js} +4 -3
  19. package/bundle/{action-gate-QYJL57IX.js.map → action-gate-G2V47NHW.js.map} +1 -1
  20. package/bundle/{agent-api-adapter-PYMNQXHE.js → agent-api-adapter-PTJYZKQK.js} +5 -4
  21. package/bundle/{agent-api-adapter-PYMNQXHE.js.map → agent-api-adapter-PTJYZKQK.js.map} +1 -1
  22. package/bundle/{agent-api-rate-limit-4GEZ4YN5.js → agent-api-rate-limit-WCFXJMGY.js} +6 -5
  23. package/bundle/{agent-registry-563P4EUJ.js → agent-registry-GU7ABOK5.js} +9 -8
  24. package/bundle/bootstrap-POWWTU6I.js +63 -0
  25. package/bundle/bootstrap-POWWTU6I.js.map +7 -0
  26. package/bundle/{bridge-lock-transport-LXCF2IVN.js → bridge-lock-transport-4ZH7QTJP.js} +6 -5
  27. package/bundle/{browser-2VZOGOGX.js → browser-EJNS35NT.js} +8 -7
  28. package/bundle/{budget-PPA7WY3D.js → budget-45QOBDWA.js} +5 -4
  29. package/bundle/{budget-PPA7WY3D.js.map → budget-45QOBDWA.js.map} +1 -1
  30. package/bundle/{capability-WXEA2WFK.js → capability-JFWX3IQF.js} +7 -6
  31. package/bundle/{chunk-CB6S3ZRF.js → chunk-2FAZIA37.js} +3 -3
  32. package/bundle/{chunk-VJATH7AN.js → chunk-2KC5G3EA.js} +9 -8
  33. package/bundle/chunk-2KC5G3EA.js.map +7 -0
  34. package/bundle/{chunk-OY2HAK33.js → chunk-36ZEYDKZ.js} +1 -1
  35. package/bundle/chunk-36ZEYDKZ.js.map +7 -0
  36. package/bundle/{chunk-2FZJDMAF.js → chunk-3CACHBDI.js} +10 -10
  37. package/bundle/{chunk-O4GKI3Q3.js → chunk-4S554KLW.js} +4 -4
  38. package/bundle/{chunk-3QW2K53E.js → chunk-5GCLBUBS.js} +11 -19
  39. package/bundle/chunk-5GCLBUBS.js.map +7 -0
  40. package/bundle/{chunk-RJX45XIC.js → chunk-5HDSQFT6.js} +9 -4
  41. package/bundle/chunk-5HDSQFT6.js.map +7 -0
  42. package/bundle/{chunk-EDZGF6BC.js → chunk-5NY2YULC.js} +11 -4
  43. package/bundle/chunk-5NY2YULC.js.map +7 -0
  44. package/bundle/{chunk-LE23VPN3.js → chunk-63A7ZRIH.js} +4 -4
  45. package/bundle/{chunk-LE23VPN3.js.map → chunk-63A7ZRIH.js.map} +1 -1
  46. package/bundle/{chunk-SSCGWDIC.js → chunk-65VCEC32.js} +2 -2
  47. package/bundle/{chunk-V2QIAXWZ.js → chunk-7BSQ5UQO.js} +3 -3
  48. package/bundle/{chunk-E7MV7WFT.js → chunk-7Z3HBPRY.js} +6 -6
  49. package/bundle/{chunk-TY26WMQY.js → chunk-AFREM7FX.js} +2 -2
  50. package/bundle/{chunk-GCFIK6OB.js → chunk-AO32N2VB.js} +92 -20
  51. package/bundle/chunk-AO32N2VB.js.map +7 -0
  52. package/bundle/{chunk-N5VROZ7A.js → chunk-B6ZN6COK.js} +5 -5
  53. package/bundle/{chunk-M6Q3IQ4H.js → chunk-BFDBGESM.js} +259 -122
  54. package/bundle/chunk-BFDBGESM.js.map +7 -0
  55. package/bundle/{chunk-YEOZN5IE.js → chunk-DYBW4XXL.js} +2 -2
  56. package/bundle/{chunk-56D3Y44D.js → chunk-EFJVUJBE.js} +10 -10
  57. package/bundle/{chunk-S6HEHCCG.js → chunk-EQSG2CRM.js} +83 -46
  58. package/bundle/chunk-EQSG2CRM.js.map +7 -0
  59. package/bundle/{chunk-FIAVVKGN.js → chunk-EUZDKV3C.js} +3 -3
  60. package/bundle/{chunk-2LKQV2ND.js → chunk-FRKW6LWB.js} +3 -3
  61. package/bundle/{chunk-H2K23MOF.js → chunk-GALQBVKO.js} +21 -5
  62. package/bundle/chunk-GALQBVKO.js.map +7 -0
  63. package/bundle/{chunk-DNDYD5SL.js → chunk-GP4XUKI5.js} +3 -3
  64. package/bundle/{chunk-SXNY6HC4.js → chunk-GPZNXY2U.js} +6 -6
  65. package/bundle/chunk-GPZNXY2U.js.map +7 -0
  66. package/bundle/{chunk-W726UGI6.js → chunk-GRVWZO4C.js} +3 -3
  67. package/bundle/{chunk-IXKQ4JMX.js → chunk-GVM5YU5I.js} +33 -17
  68. package/bundle/chunk-GVM5YU5I.js.map +7 -0
  69. package/bundle/{chunk-OOKNHOCB.js → chunk-GWILHZPT.js} +2 -2
  70. package/bundle/{chunk-3LQOJVTB.js → chunk-HFOCNYEO.js} +1842 -1220
  71. package/bundle/{chunk-3LQOJVTB.js.map → chunk-HFOCNYEO.js.map} +4 -4
  72. package/bundle/{chunk-NP72ZB7P.js → chunk-HMKVL7AX.js} +53 -47
  73. package/bundle/chunk-HMKVL7AX.js.map +7 -0
  74. package/bundle/{chunk-BNBC4T45.js → chunk-HT2BPTZY.js} +3 -3
  75. package/bundle/{chunk-BU7LTI2W.js → chunk-HZDLFLRP.js} +6 -7
  76. package/bundle/chunk-HZDLFLRP.js.map +7 -0
  77. package/bundle/{chunk-FVUL44T4.js → chunk-IJT4KWXT.js} +2 -2
  78. package/bundle/{chunk-IK4R3RBZ.js → chunk-JNIHEDKF.js} +3 -3
  79. package/bundle/{chunk-J5NOL4DB.js → chunk-JQDJPUHM.js} +16 -6
  80. package/bundle/chunk-JQDJPUHM.js.map +7 -0
  81. package/bundle/{chunk-SESM4GBM.js → chunk-KTYGKPYM.js} +52 -25
  82. package/bundle/chunk-KTYGKPYM.js.map +7 -0
  83. package/bundle/chunk-LME23AA2.js +37 -0
  84. package/bundle/chunk-LME23AA2.js.map +7 -0
  85. package/bundle/{chunk-4PIVWXUJ.js → chunk-LUNA6PM5.js} +2 -2
  86. package/bundle/{chunk-37EX63K4.js → chunk-LUW62WGO.js} +6998 -3621
  87. package/bundle/chunk-LUW62WGO.js.map +7 -0
  88. package/bundle/{chunk-MV5KOWOR.js → chunk-NDCRWEEJ.js} +7 -7
  89. package/bundle/{chunk-7WHXTCVD.js → chunk-NRUSRJXR.js} +8 -3
  90. package/bundle/chunk-NRUSRJXR.js.map +7 -0
  91. package/bundle/{chunk-C3EYYJN3.js → chunk-O7KQG6ME.js} +17 -5
  92. package/bundle/chunk-O7KQG6ME.js.map +7 -0
  93. package/bundle/{chunk-ZOCEBV62.js → chunk-OKAQICWY.js} +3 -3
  94. package/bundle/{chunk-TCI6FZTP.js → chunk-OLAURO5G.js} +9 -9
  95. package/bundle/{chunk-YME7NRGP.js → chunk-OXTSWQCX.js} +2 -2
  96. package/bundle/{chunk-HDOFJVFS.js → chunk-PEDX56EL.js} +3 -3
  97. package/bundle/{chunk-7RAGSHSH.js → chunk-PROPYS3P.js} +12 -10
  98. package/bundle/chunk-PROPYS3P.js.map +7 -0
  99. package/bundle/{chunk-ASYX43OU.js → chunk-Q32H6VPU.js} +26 -26
  100. package/bundle/{chunk-P5O6QZDC.js → chunk-QROWBWLL.js} +10 -6
  101. package/bundle/chunk-QROWBWLL.js.map +7 -0
  102. package/bundle/{chunk-S7ZIGIR5.js → chunk-R76K6L6H.js} +27 -27
  103. package/bundle/{chunk-S7ZIGIR5.js.map → chunk-R76K6L6H.js.map} +1 -1
  104. package/bundle/{chunk-MQJG7OJX.js → chunk-RIHQ37U5.js} +38 -36
  105. package/bundle/chunk-RIHQ37U5.js.map +7 -0
  106. package/bundle/{chunk-IQKADER4.js → chunk-RWRRGE4U.js} +2 -2
  107. package/bundle/{chunk-72T2Q7IG.js → chunk-S5GD5EJ5.js} +271 -282
  108. package/bundle/chunk-S5GD5EJ5.js.map +7 -0
  109. package/bundle/{chunk-ULO2PX3T.js → chunk-TEFZ4JA4.js} +3 -3
  110. package/bundle/{chunk-2RGR3LSV.js → chunk-TMUYFERL.js} +2 -2
  111. package/bundle/{chunk-KBPVJGD7.js → chunk-URQPDCK5.js} +3 -3
  112. package/bundle/chunk-UUIHL65U.js +77 -0
  113. package/bundle/chunk-UUIHL65U.js.map +7 -0
  114. package/bundle/{chunk-FJF42RZY.js → chunk-VUIX5AGB.js} +3 -3
  115. package/bundle/{chunk-5V4VHKEA.js → chunk-WBTJ2E62.js} +5 -4
  116. package/bundle/chunk-WBTJ2E62.js.map +7 -0
  117. package/bundle/{chunk-ZY6DH2S4.js → chunk-WTIGZO3N.js} +80 -70
  118. package/bundle/chunk-WTIGZO3N.js.map +7 -0
  119. package/bundle/{chunk-4HNCOQSK.js → chunk-WYHGNI56.js} +7 -7
  120. package/bundle/{chunk-24V4A6RP.js → chunk-XX6BGTPO.js} +4 -4
  121. package/bundle/{chunk-T7TAWGBX.js → chunk-Y76VUJSF.js} +2 -2
  122. package/bundle/{chunk-TVSPVZTX.js → chunk-YDY6QVWJ.js} +3 -3
  123. package/bundle/{chunk-V6CV3QPH.js → chunk-YRSMGJFP.js} +2 -2
  124. package/bundle/{chunk-WP7FZHMI.js → chunk-YSKCQH6E.js} +2 -2
  125. package/bundle/{chunk-NGZVJ52F.js → chunk-ZKJOFASV.js} +7 -7
  126. package/bundle/{chunk-WGWM4IZM.js → chunk-ZT5ZBGWS.js} +4 -4
  127. package/bundle/{chunk-WGWM4IZM.js.map → chunk-ZT5ZBGWS.js.map} +1 -1
  128. package/bundle/{chunk-43DKPXTP.js → chunk-ZV4IWKDJ.js} +4 -4
  129. package/bundle/{commands-XXFU2ZF7.js → commands-EWA4HNCM.js} +20 -20
  130. package/bundle/{config-EWDZ234X.js → config-M3P5IOAI.js} +8 -7
  131. package/bundle/{config-show-6J33O4TE.js → config-show-3DHPP26D.js} +5 -5
  132. package/bundle/{context-OCS7HLJP.js → context-5P7IYYU2.js} +5 -2
  133. package/bundle/{context-OCS7HLJP.js.map → context-5P7IYYU2.js.map} +1 -1
  134. package/bundle/{daemon-LTDAXNA2.js → daemon-TB23FFWY.js} +7 -7
  135. package/bundle/{delegation-tools-YDTWQMZD.js → delegation-tools-P2SCNL23.js} +14 -11
  136. package/bundle/{registry-client-VN2MM2HI.js → deploy-YYUCGGP3.js} +10 -6
  137. package/bundle/{deploy-lib-import-RGZJ3CGC.js → deploy-lib-import-T3UP4G6G.js} +5 -3
  138. package/bundle/{deps-PHSLIA77.js → deps-WVK553KF.js} +21 -19
  139. package/bundle/deps-WVK553KF.js.map +7 -0
  140. package/bundle/{direct-api-transport-OAKYQBJR.js → direct-api-transport-WQ6HA5OX.js} +30 -28
  141. package/bundle/direct-api-transport-WQ6HA5OX.js.map +7 -0
  142. package/bundle/{discord-adapter-WUNYPTDE.js → discord-adapter-4TTETYDI.js} +26 -26
  143. package/bundle/{dist-7HEHHQI2.js → dist-KMK7TZGN.js} +376 -348
  144. package/bundle/dist-KMK7TZGN.js.map +7 -0
  145. package/bundle/{dns-wakeup-F55ALHXJ.js → dns-wakeup-IDOJIXBX.js} +4 -3
  146. package/bundle/{dns-wakeup-F55ALHXJ.js.map → dns-wakeup-IDOJIXBX.js.map} +1 -1
  147. package/bundle/{doctor-probes-3SLIUGKS.js → doctor-probes-VDWFJKUB.js} +4 -3
  148. package/bundle/{env-schema-MSDP2YBO.js → env-schema-4JXQUOH4.js} +5 -4
  149. package/bundle/{gossip-CS3G3447.js → gossip-3C3BSNPN.js} +7 -6
  150. package/bundle/{guardrails-24XK2COI.js → guardrails-DL7ZSWVN.js} +6 -5
  151. package/bundle/{health-check-FRUNRVNQ.js → health-check-YKWFD2LZ.js} +5 -6
  152. package/bundle/{health-check-FRUNRVNQ.js.map → health-check-YKWFD2LZ.js.map} +2 -2
  153. package/bundle/{heartbeat-system-G4IFQXT6.js → heartbeat-system-TDDIOVTC.js} +7 -6
  154. package/bundle/{heartbeat-tier3-3ZO3EVXP.js → heartbeat-tier3-55T2HUNE.js} +45 -44
  155. package/bundle/heartbeat-tier3-55T2HUNE.js.map +7 -0
  156. package/bundle/{hook-system-X6INNJGV.js → hook-system-M3POLUIB.js} +5 -4
  157. package/bundle/{hotskills-6FQYTJIO.js → hotskills-FWX4QI7V.js} +7 -6
  158. package/bundle/{install-ZAHTZ5M5.js → install-4MXBYIUG.js} +23 -20
  159. package/bundle/install-4MXBYIUG.js.map +7 -0
  160. package/bundle/{install-manifest-QX7KVDCA.js → install-manifest-5PPWMD2W.js} +4 -3
  161. package/bundle/{install-manifest-QX7KVDCA.js.map → install-manifest-5PPWMD2W.js.map} +1 -1
  162. package/bundle/{irc-adapter-IEJQKKJF.js → irc-adapter-PTTZD32W.js} +5 -4
  163. package/bundle/{irc-adapter-IEJQKKJF.js.map → irc-adapter-PTTZD32W.js.map} +1 -1
  164. package/bundle/{irc-config-TTWNYFLH.js → irc-config-CP7ZMUOX.js} +6 -5
  165. package/bundle/{irc-config-TTWNYFLH.js.map → irc-config-CP7ZMUOX.js.map} +1 -1
  166. package/bundle/{kanban-board-J6RO3ZU7.js → kanban-board-M326B2XJ.js} +7 -5
  167. package/bundle/{kanban-channel-5EIXBFSA.js → kanban-channel-IJ52OMNA.js} +8 -6
  168. package/bundle/{lazy-require-V6EFUATC.js → lazy-require-KCRVT4SI.js} +11 -6
  169. package/bundle/{logger-Y3VILPRH.js → logger-OWCSNYCA.js} +4 -3
  170. package/bundle/{logs-YS3GDURO.js → logs-FXS4SCEM.js} +5 -5
  171. package/bundle/{main-chat-YLZDNQPO.js → main-chat-ZNUZCTNS.js} +6 -5
  172. package/bundle/{master-user-Z4M7KCJE.js → master-user-HSKM4ZFN.js} +7 -6
  173. package/bundle/{media-utils-P6RZ2K3U.js → media-utils-3ZYOD7SK.js} +44 -43
  174. package/bundle/{media-utils-P6RZ2K3U.js.map → media-utils-3ZYOD7SK.js.map} +2 -2
  175. package/bundle/{message-pipeline-MHEBDJLH.js → message-pipeline-KSONH4MT.js} +20 -20
  176. package/bundle/meta.json +9327 -8582
  177. package/bundle/{migrate-layout-RJJQLVGR.js → migrate-layout-IJIEJY3A.js} +8 -4
  178. package/bundle/migrate-layout-IJIEJY3A.js.map +7 -0
  179. package/bundle/{nerve-VZNMFDGY.js → nerve-IGSXBKZZ.js} +5 -4
  180. package/bundle/{notification-VV2OR6NW.js → notification-BFSIEECG.js} +8 -7
  181. package/bundle/{openrouter-credits-LXC7P4G6.js → openrouter-credits-NTVZDRYM.js} +5 -4
  182. package/bundle/{openrouter-credits-LXC7P4G6.js.map → openrouter-credits-NTVZDRYM.js.map} +1 -1
  183. package/bundle/{orc-KC4USP55.js → orc-EIGVTHAV.js} +4 -4
  184. package/bundle/{orc-tools-CHRSXSAS.js → orc-tools-A3G7WCSJ.js} +5 -4
  185. package/bundle/{paths-EDK6KWHG.js → paths-3ZVW3NFL.js} +6 -2
  186. package/bundle/{paths-RZF6WDMG.js → paths-X4LRYUI6.js} +3 -2
  187. package/bundle/{peer-auth-SRONOLNG.js → peer-auth-QC4EF2PM.js} +9 -8
  188. package/bundle/{peer-client-VOF77T6C.js → peer-client-RGEU5HOK.js} +9 -8
  189. package/bundle/{peer-client-VOF77T6C.js.map → peer-client-RGEU5HOK.js.map} +1 -1
  190. package/bundle/{peer-config-FRWLEYQ5.js → peer-config-TN55LFDC.js} +6 -5
  191. package/bundle/{peer-jwt-XY3XRIA2.js → peer-jwt-NCCPXJRX.js} +6 -5
  192. package/bundle/{peer-transport-UBBXTDRP.js → peer-transport-I6JPLFZ2.js} +8 -7
  193. package/bundle/{phase-transport-4NQHZX75.js → phase-transport-2BRWACDF.js} +18 -16
  194. package/bundle/public/css/dashboard.css +542 -0
  195. package/bundle/public/index.html +180 -0
  196. package/bundle/public/js/app.js +437 -0
  197. package/bundle/public/memory-universe.js +384 -0
  198. package/bundle/{reconcile-2EUXJ6W5.js → reconcile-CTFCLQRN.js} +5 -4
  199. package/bundle/{reconciler-FFQGV4DO.js → reconciler-FHESO6OC.js} +14 -11
  200. package/bundle/{reconciler-FFQGV4DO.js.map → reconciler-FHESO6OC.js.map} +1 -1
  201. package/bundle/{restore-NFDE2RG6.js → restore-IFHPI7I7.js} +13 -9
  202. package/bundle/{restore-NFDE2RG6.js.map → restore-IFHPI7I7.js.map} +3 -3
  203. package/bundle/{rollback-MVZ53XS4.js → rollback-ANRI3T5Z.js} +5 -5
  204. package/bundle/{chunk-SKY6656M.js → sandbox-runtime-QROWHDCS.js} +11 -28
  205. package/bundle/{chunk-SKY6656M.js.map → sandbox-runtime-QROWHDCS.js.map} +1 -1
  206. package/bundle/{self-healer-utils-KD6LV63S.js → self-healer-utils-IFAYOQO2.js} +5 -4
  207. package/bundle/{self-healer-utils-KD6LV63S.js.map → self-healer-utils-IFAYOQO2.js.map} +1 -1
  208. package/bundle/{sha-tracker-2DB4R2TW.js → sha-tracker-ZWBP6CIJ.js} +5 -4
  209. package/bundle/{skill-session-BPDVA6ZG.js → skill-session-AXBDQSLQ.js} +5 -4
  210. package/bundle/{skill-session-BPDVA6ZG.js.map → skill-session-AXBDQSLQ.js.map} +1 -1
  211. package/bundle/{skill-stats-TPD2NROA.js → skill-stats-JORH5DGM.js} +6 -5
  212. package/bundle/{skill-watcher-D7QYYYON.js → skill-watcher-E4MGLKLS.js} +6 -5
  213. package/bundle/{sleep-GH6DLBJJ.js → sleep-SRCSXY6T.js} +10 -9
  214. package/bundle/{soul-bundle-GXLMDBCC.js → soul-bundle-VWAVHCZ6.js} +10 -9
  215. package/bundle/{spin-4DBYHS3E.js → spin-IMW2MZOH.js} +13 -10
  216. package/bundle/{spin-notifications-IKYJPER5.js → spin-notifications-SE2HVZI7.js} +7 -5
  217. package/bundle/{spin-notifications-IKYJPER5.js.map → spin-notifications-SE2HVZI7.js.map} +1 -1
  218. package/bundle/{spin-types-PLJH3SIK.js → spin-types-BLPYAETA.js} +5 -4
  219. package/bundle/{src-SUFZ27S5.js → src-6BTCMOD3.js} +4 -4
  220. package/bundle/{sse-parser-anthropic-U7ILHOY5.js → sse-parser-anthropic-A6R4Z2TB.js} +5 -4
  221. package/bundle/{sse-parser-anthropic-U7ILHOY5.js.map → sse-parser-anthropic-A6R4Z2TB.js.map} +1 -1
  222. package/bundle/{sse-parser-responses-OI73R3AH.js → sse-parser-responses-HSZY3QGJ.js} +5 -4
  223. package/bundle/{sse-parser-responses-OI73R3AH.js.map → sse-parser-responses-HSZY3QGJ.js.map} +1 -1
  224. package/bundle/{ssrf-guard-6GP4QYVA.js → ssrf-guard-O6SHIK6Q.js} +5 -4
  225. package/bundle/{ssrf-guard-6GP4QYVA.js.map → ssrf-guard-O6SHIK6Q.js.map} +1 -1
  226. package/bundle/{start-JT2BPMSW.js → start-7QZIWO3S.js} +5 -5
  227. package/bundle/start-7QZIWO3S.js.map +7 -0
  228. package/bundle/{stt-KD3AABKG.js → stt-LGVPXMVR.js} +6 -5
  229. package/bundle/{subagent-runtime-LVECAUPV.js → subagent-runtime-3UJB4HUB.js} +6 -5
  230. package/bundle/system-status-ATGKRRQI.js +349 -0
  231. package/bundle/system-status-ATGKRRQI.js.map +7 -0
  232. package/bundle/{task-store-2XRDM3AW.js → task-store-W5BFIAIH.js} +6 -5
  233. package/bundle/{telegram-adapter-UJ3RYYV6.js → telegram-adapter-7G773NII.js} +35 -35
  234. package/bundle/{tool-registry-YU6WBXPA.js → tool-registry-J6TE3I2T.js} +25 -23
  235. package/bundle/{tool-sandbox-RNNPDR5M.js → tool-sandbox-4UC6GAKA.js} +6 -5
  236. package/bundle/{transport-config-OK3MZPJK.js → transport-config-KBF5W2DP.js} +9 -8
  237. package/bundle/{update-ENNPRW7Y.js → update-424ZZQQ6.js} +6 -6
  238. package/bundle/{update-check-SJB6GV3A.js → update-check-7UWKBJOP.js} +3 -2
  239. package/bundle/{update-check-SJB6GV3A.js.map → update-check-7UWKBJOP.js.map} +1 -1
  240. package/bundle/{usage-tracker-HRSGC7QC.js → usage-tracker-NXD364VX.js} +2 -2
  241. package/bundle/{user-registry-6PUJJ5J2.js → user-registry-35BW4XKM.js} +6 -5
  242. package/bundle/{wrapper-WLHLG4MI.js → wrapper-W66YICNZ.js} +3 -3
  243. package/bundle/{ws-peer-client-WHW3RJTD.js → ws-peer-client-AIXCXF7V.js} +15 -14
  244. package/bundle/{ws-peer-client-WHW3RJTD.js.map → ws-peer-client-AIXCXF7V.js.map} +2 -2
  245. package/package.json +4 -8
  246. package/scripts/emergency-deploy.sh +11 -8
  247. package/scripts/emergency-update.sh +156 -23
  248. package/templates/config/.env +1 -1
  249. package/templates/config/models.json +13 -0
  250. package/bundle/chunk-37EX63K4.js.map +0 -7
  251. package/bundle/chunk-3QW2K53E.js.map +0 -7
  252. package/bundle/chunk-5V4VHKEA.js.map +0 -7
  253. package/bundle/chunk-72T2Q7IG.js.map +0 -7
  254. package/bundle/chunk-7RAGSHSH.js.map +0 -7
  255. package/bundle/chunk-7WHXTCVD.js.map +0 -7
  256. package/bundle/chunk-BU7LTI2W.js.map +0 -7
  257. package/bundle/chunk-C3EYYJN3.js.map +0 -7
  258. package/bundle/chunk-CAOIIVFP.js +0 -110
  259. package/bundle/chunk-CAOIIVFP.js.map +0 -7
  260. package/bundle/chunk-EDZGF6BC.js.map +0 -7
  261. package/bundle/chunk-GCFIK6OB.js.map +0 -7
  262. package/bundle/chunk-H2K23MOF.js.map +0 -7
  263. package/bundle/chunk-HAZHNBBY.js +0 -156
  264. package/bundle/chunk-HAZHNBBY.js.map +0 -7
  265. package/bundle/chunk-IXKQ4JMX.js.map +0 -7
  266. package/bundle/chunk-J5NOL4DB.js.map +0 -7
  267. package/bundle/chunk-JAJ3DUQ2.js +0 -30
  268. package/bundle/chunk-JAJ3DUQ2.js.map +0 -7
  269. package/bundle/chunk-KMFR5AVY.js +0 -45
  270. package/bundle/chunk-KMFR5AVY.js.map +0 -7
  271. package/bundle/chunk-M6Q3IQ4H.js.map +0 -7
  272. package/bundle/chunk-MQJG7OJX.js.map +0 -7
  273. package/bundle/chunk-NP72ZB7P.js.map +0 -7
  274. package/bundle/chunk-OY2HAK33.js.map +0 -7
  275. package/bundle/chunk-P5O6QZDC.js.map +0 -7
  276. package/bundle/chunk-RJX45XIC.js.map +0 -7
  277. package/bundle/chunk-S6HEHCCG.js.map +0 -7
  278. package/bundle/chunk-SESM4GBM.js.map +0 -7
  279. package/bundle/chunk-SXNY6HC4.js.map +0 -7
  280. package/bundle/chunk-VJATH7AN.js.map +0 -7
  281. package/bundle/chunk-ZY6DH2S4.js.map +0 -7
  282. package/bundle/deps-PHSLIA77.js.map +0 -7
  283. package/bundle/direct-api-transport-OAKYQBJR.js.map +0 -7
  284. package/bundle/dist-7HEHHQI2.js.map +0 -7
  285. package/bundle/heartbeat-tier3-3ZO3EVXP.js.map +0 -7
  286. package/bundle/install-ZAHTZ5M5.js.map +0 -7
  287. package/bundle/migrate-layout-RJJQLVGR.js.map +0 -7
  288. package/bundle/phase-config-V4XETN5F.js +0 -18
  289. package/bundle/sandbox-runtime-WHACQLLN.js +0 -22
  290. package/bundle/start-JT2BPMSW.js.map +0 -7
  291. package/bundle/system-status-XXJWTVJN.js +0 -243
  292. package/bundle/system-status-XXJWTVJN.js.map +0 -7
  293. package/bundle/user-registry-6PUJJ5J2.js.map +0 -7
  294. package/bundle/wrapper-WLHLG4MI.js.map +0 -7
  295. /package/bundle/{agent-api-rate-limit-4GEZ4YN5.js.map → agent-api-rate-limit-WCFXJMGY.js.map} +0 -0
  296. /package/bundle/{agent-registry-563P4EUJ.js.map → agent-registry-GU7ABOK5.js.map} +0 -0
  297. /package/bundle/{bridge-lock-transport-LXCF2IVN.js.map → bridge-lock-transport-4ZH7QTJP.js.map} +0 -0
  298. /package/bundle/{browser-2VZOGOGX.js.map → browser-EJNS35NT.js.map} +0 -0
  299. /package/bundle/{capability-WXEA2WFK.js.map → capability-JFWX3IQF.js.map} +0 -0
  300. /package/bundle/{chunk-CB6S3ZRF.js.map → chunk-2FAZIA37.js.map} +0 -0
  301. /package/bundle/{chunk-2FZJDMAF.js.map → chunk-3CACHBDI.js.map} +0 -0
  302. /package/bundle/{chunk-O4GKI3Q3.js.map → chunk-4S554KLW.js.map} +0 -0
  303. /package/bundle/{chunk-SSCGWDIC.js.map → chunk-65VCEC32.js.map} +0 -0
  304. /package/bundle/{chunk-V2QIAXWZ.js.map → chunk-7BSQ5UQO.js.map} +0 -0
  305. /package/bundle/{chunk-E7MV7WFT.js.map → chunk-7Z3HBPRY.js.map} +0 -0
  306. /package/bundle/{chunk-TY26WMQY.js.map → chunk-AFREM7FX.js.map} +0 -0
  307. /package/bundle/{chunk-N5VROZ7A.js.map → chunk-B6ZN6COK.js.map} +0 -0
  308. /package/bundle/{chunk-YEOZN5IE.js.map → chunk-DYBW4XXL.js.map} +0 -0
  309. /package/bundle/{chunk-56D3Y44D.js.map → chunk-EFJVUJBE.js.map} +0 -0
  310. /package/bundle/{chunk-FIAVVKGN.js.map → chunk-EUZDKV3C.js.map} +0 -0
  311. /package/bundle/{chunk-2LKQV2ND.js.map → chunk-FRKW6LWB.js.map} +0 -0
  312. /package/bundle/{chunk-DNDYD5SL.js.map → chunk-GP4XUKI5.js.map} +0 -0
  313. /package/bundle/{chunk-W726UGI6.js.map → chunk-GRVWZO4C.js.map} +0 -0
  314. /package/bundle/{chunk-OOKNHOCB.js.map → chunk-GWILHZPT.js.map} +0 -0
  315. /package/bundle/{chunk-BNBC4T45.js.map → chunk-HT2BPTZY.js.map} +0 -0
  316. /package/bundle/{chunk-FVUL44T4.js.map → chunk-IJT4KWXT.js.map} +0 -0
  317. /package/bundle/{chunk-IK4R3RBZ.js.map → chunk-JNIHEDKF.js.map} +0 -0
  318. /package/bundle/{chunk-4PIVWXUJ.js.map → chunk-LUNA6PM5.js.map} +0 -0
  319. /package/bundle/{chunk-MV5KOWOR.js.map → chunk-NDCRWEEJ.js.map} +0 -0
  320. /package/bundle/{chunk-ZOCEBV62.js.map → chunk-OKAQICWY.js.map} +0 -0
  321. /package/bundle/{chunk-TCI6FZTP.js.map → chunk-OLAURO5G.js.map} +0 -0
  322. /package/bundle/{chunk-YME7NRGP.js.map → chunk-OXTSWQCX.js.map} +0 -0
  323. /package/bundle/{chunk-HDOFJVFS.js.map → chunk-PEDX56EL.js.map} +0 -0
  324. /package/bundle/{chunk-ASYX43OU.js.map → chunk-Q32H6VPU.js.map} +0 -0
  325. /package/bundle/{chunk-IQKADER4.js.map → chunk-RWRRGE4U.js.map} +0 -0
  326. /package/bundle/{chunk-ULO2PX3T.js.map → chunk-TEFZ4JA4.js.map} +0 -0
  327. /package/bundle/{chunk-2RGR3LSV.js.map → chunk-TMUYFERL.js.map} +0 -0
  328. /package/bundle/{chunk-KBPVJGD7.js.map → chunk-URQPDCK5.js.map} +0 -0
  329. /package/bundle/{chunk-FJF42RZY.js.map → chunk-VUIX5AGB.js.map} +0 -0
  330. /package/bundle/{chunk-4HNCOQSK.js.map → chunk-WYHGNI56.js.map} +0 -0
  331. /package/bundle/{chunk-24V4A6RP.js.map → chunk-XX6BGTPO.js.map} +0 -0
  332. /package/bundle/{chunk-T7TAWGBX.js.map → chunk-Y76VUJSF.js.map} +0 -0
  333. /package/bundle/{chunk-TVSPVZTX.js.map → chunk-YDY6QVWJ.js.map} +0 -0
  334. /package/bundle/{chunk-V6CV3QPH.js.map → chunk-YRSMGJFP.js.map} +0 -0
  335. /package/bundle/{chunk-WP7FZHMI.js.map → chunk-YSKCQH6E.js.map} +0 -0
  336. /package/bundle/{chunk-NGZVJ52F.js.map → chunk-ZKJOFASV.js.map} +0 -0
  337. /package/bundle/{chunk-43DKPXTP.js.map → chunk-ZV4IWKDJ.js.map} +0 -0
  338. /package/bundle/{commands-XXFU2ZF7.js.map → commands-EWA4HNCM.js.map} +0 -0
  339. /package/bundle/{config-EWDZ234X.js.map → config-M3P5IOAI.js.map} +0 -0
  340. /package/bundle/{config-show-6J33O4TE.js.map → config-show-3DHPP26D.js.map} +0 -0
  341. /package/bundle/{daemon-LTDAXNA2.js.map → daemon-TB23FFWY.js.map} +0 -0
  342. /package/bundle/{delegation-tools-YDTWQMZD.js.map → delegation-tools-P2SCNL23.js.map} +0 -0
  343. /package/bundle/{deploy-lib-import-RGZJ3CGC.js.map → deploy-YYUCGGP3.js.map} +0 -0
  344. /package/bundle/{doctor-probes-3SLIUGKS.js.map → deploy-lib-import-T3UP4G6G.js.map} +0 -0
  345. /package/bundle/{discord-adapter-WUNYPTDE.js.map → discord-adapter-4TTETYDI.js.map} +0 -0
  346. /package/bundle/{env-schema-MSDP2YBO.js.map → doctor-probes-VDWFJKUB.js.map} +0 -0
  347. /package/bundle/{gossip-CS3G3447.js.map → env-schema-4JXQUOH4.js.map} +0 -0
  348. /package/bundle/{guardrails-24XK2COI.js.map → gossip-3C3BSNPN.js.map} +0 -0
  349. /package/bundle/{heartbeat-system-G4IFQXT6.js.map → guardrails-DL7ZSWVN.js.map} +0 -0
  350. /package/bundle/{hook-system-X6INNJGV.js.map → heartbeat-system-TDDIOVTC.js.map} +0 -0
  351. /package/bundle/{hotskills-6FQYTJIO.js.map → hook-system-M3POLUIB.js.map} +0 -0
  352. /package/bundle/{kanban-board-J6RO3ZU7.js.map → hotskills-FWX4QI7V.js.map} +0 -0
  353. /package/bundle/{kanban-channel-5EIXBFSA.js.map → kanban-board-M326B2XJ.js.map} +0 -0
  354. /package/bundle/{lazy-require-V6EFUATC.js.map → kanban-channel-IJ52OMNA.js.map} +0 -0
  355. /package/bundle/{logger-Y3VILPRH.js.map → lazy-require-KCRVT4SI.js.map} +0 -0
  356. /package/bundle/{main-chat-YLZDNQPO.js.map → logger-OWCSNYCA.js.map} +0 -0
  357. /package/bundle/{logs-YS3GDURO.js.map → logs-FXS4SCEM.js.map} +0 -0
  358. /package/bundle/{master-user-Z4M7KCJE.js.map → main-chat-ZNUZCTNS.js.map} +0 -0
  359. /package/bundle/{message-pipeline-MHEBDJLH.js.map → master-user-HSKM4ZFN.js.map} +0 -0
  360. /package/bundle/{nerve-VZNMFDGY.js.map → message-pipeline-KSONH4MT.js.map} +0 -0
  361. /package/bundle/{notification-VV2OR6NW.js.map → nerve-IGSXBKZZ.js.map} +0 -0
  362. /package/bundle/{orc-tools-CHRSXSAS.js.map → notification-BFSIEECG.js.map} +0 -0
  363. /package/bundle/{orc-KC4USP55.js.map → orc-EIGVTHAV.js.map} +0 -0
  364. /package/bundle/{paths-EDK6KWHG.js.map → orc-tools-A3G7WCSJ.js.map} +0 -0
  365. /package/bundle/{paths-RZF6WDMG.js.map → paths-3ZVW3NFL.js.map} +0 -0
  366. /package/bundle/{peer-auth-SRONOLNG.js.map → paths-X4LRYUI6.js.map} +0 -0
  367. /package/bundle/{peer-config-FRWLEYQ5.js.map → peer-auth-QC4EF2PM.js.map} +0 -0
  368. /package/bundle/{peer-jwt-XY3XRIA2.js.map → peer-config-TN55LFDC.js.map} +0 -0
  369. /package/bundle/{peer-transport-UBBXTDRP.js.map → peer-jwt-NCCPXJRX.js.map} +0 -0
  370. /package/bundle/{phase-config-V4XETN5F.js.map → peer-transport-I6JPLFZ2.js.map} +0 -0
  371. /package/bundle/{phase-transport-4NQHZX75.js.map → phase-transport-2BRWACDF.js.map} +0 -0
  372. /package/bundle/{reconcile-2EUXJ6W5.js.map → reconcile-CTFCLQRN.js.map} +0 -0
  373. /package/bundle/{registry-client-VN2MM2HI.js.map → rollback-ANRI3T5Z.js.map} +0 -0
  374. /package/bundle/{rollback-MVZ53XS4.js.map → sha-tracker-ZWBP6CIJ.js.map} +0 -0
  375. /package/bundle/{sandbox-runtime-WHACQLLN.js.map → skill-stats-JORH5DGM.js.map} +0 -0
  376. /package/bundle/{sha-tracker-2DB4R2TW.js.map → skill-watcher-E4MGLKLS.js.map} +0 -0
  377. /package/bundle/{skill-stats-TPD2NROA.js.map → sleep-SRCSXY6T.js.map} +0 -0
  378. /package/bundle/{skill-watcher-D7QYYYON.js.map → soul-bundle-VWAVHCZ6.js.map} +0 -0
  379. /package/bundle/{sleep-GH6DLBJJ.js.map → spin-IMW2MZOH.js.map} +0 -0
  380. /package/bundle/{soul-bundle-GXLMDBCC.js.map → spin-types-BLPYAETA.js.map} +0 -0
  381. /package/bundle/{spin-4DBYHS3E.js.map → src-6BTCMOD3.js.map} +0 -0
  382. /package/bundle/{spin-types-PLJH3SIK.js.map → stt-LGVPXMVR.js.map} +0 -0
  383. /package/bundle/{src-SUFZ27S5.js.map → subagent-runtime-3UJB4HUB.js.map} +0 -0
  384. /package/bundle/{stt-KD3AABKG.js.map → task-store-W5BFIAIH.js.map} +0 -0
  385. /package/bundle/{telegram-adapter-UJ3RYYV6.js.map → telegram-adapter-7G773NII.js.map} +0 -0
  386. /package/bundle/{subagent-runtime-LVECAUPV.js.map → tool-registry-J6TE3I2T.js.map} +0 -0
  387. /package/bundle/{task-store-2XRDM3AW.js.map → tool-sandbox-4UC6GAKA.js.map} +0 -0
  388. /package/bundle/{tool-registry-YU6WBXPA.js.map → transport-config-KBF5W2DP.js.map} +0 -0
  389. /package/bundle/{tool-sandbox-RNNPDR5M.js.map → update-424ZZQQ6.js.map} +0 -0
  390. /package/bundle/{transport-config-OK3MZPJK.js.map → usage-tracker-NXD364VX.js.map} +0 -0
  391. /package/bundle/{update-ENNPRW7Y.js.map → user-registry-35BW4XKM.js.map} +0 -0
  392. /package/bundle/{usage-tracker-HRSGC7QC.js.map → wrapper-W66YICNZ.js.map} +0 -0
@@ -4,8 +4,9 @@ import {
4
4
  init_logger,
5
5
  logDebug,
6
6
  logWarn
7
- } from "./chunk-OOKNHOCB.js";
8
- import "./chunk-H2K23MOF.js";
7
+ } from "./chunk-GWILHZPT.js";
8
+ import "./chunk-GALQBVKO.js";
9
+ import "./chunk-O7KQG6ME.js";
9
10
  import "./chunk-7K2YZTLD.js";
10
11
 
11
12
  // src/components/transport/acp-raw-client.ts
@@ -114,4 +115,4 @@ var AcpRawClient = class {
114
115
  export {
115
116
  AcpRawClient
116
117
  };
117
- //# sourceMappingURL=acp-raw-client-AZJCEB6S.js.map
118
+ //# sourceMappingURL=acp-raw-client-E6FM45NC.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/components/transport/acp-raw-client.ts"],
4
4
  "sourcesContent": ["/**\n * ACP Raw Client \u2014 fallback JSON-RPC over raw stdin/stdout (#924).\n * Used when the SDK's ndJsonStream/Web Streams layer breaks (kiro-cli #7554).\n */\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { logDebug, logWarn } from \"../logger.js\";\n\nconst TAG = \"acp-raw\";\n\ntype NotificationHandler = (method: string, params: Record<string, unknown>) => void;\n\nexport class AcpRawClient {\n private child: ChildProcess | null = null;\n private pending = new Map<number, { resolve: (v: any) => void; reject: (e: Error) => void }>();\n private nextId = 1;\n private buf = \"\";\n private onNotification: NotificationHandler;\n private onExit: ((code: number | null, signal: string | null) => void) | null = null;\n\n constructor(\n private cliPath: string,\n private args: string[],\n private env: NodeJS.ProcessEnv,\n private cwd: string,\n onNotification: NotificationHandler,\n ) {\n this.onNotification = onNotification;\n }\n\n spawn(): void {\n this.child = spawn(this.cliPath, this.args, {\n cwd: this.cwd,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: this.env,\n });\n\n this.child.stdout!.on(\"data\", (d: Buffer) => {\n this.buf += d.toString();\n const lines = this.buf.split(\"\\n\");\n this.buf = lines.pop()!;\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const msg = JSON.parse(line);\n if (msg.id && this.pending.has(msg.id)) {\n const p = this.pending.get(msg.id)!;\n this.pending.delete(msg.id);\n if (msg.error) p.reject(new Error(msg.error.message ?? JSON.stringify(msg.error)));\n else p.resolve(msg.result);\n } else if (msg.method) {\n this.onNotification(msg.method, msg.params ?? {});\n }\n } catch { /* malformed line */ }\n }\n });\n\n this.child.stderr!.on(\"data\", (d: Buffer) => {\n logDebug(TAG, `[stderr] ${d.toString().trim()}`);\n });\n\n this.child.on(\"exit\", (code, signal) => {\n logWarn(TAG, `CLI exited (code=${code}, signal=${signal})`);\n // Reject all pending\n for (const [, p] of this.pending) p.reject(new Error(`CLI exited (code=${code})`));\n this.pending.clear();\n this.child = null;\n this.onExit?.(code, signal);\n });\n }\n\n setOnExit(handler: (code: number | null, signal: string | null) => void): void {\n this.onExit = handler;\n }\n\n private request<T = unknown>(method: string, params: Record<string, unknown>): Promise<T> {\n if (!this.child?.stdin?.writable) return Promise.reject(new Error(\"CLI not running\"));\n const id = this.nextId++;\n const payload = JSON.stringify({ jsonrpc: \"2.0\", method, params, id });\n logDebug(TAG, `\u2192 ${method} (id=${id}, ${payload.length} bytes)`);\n return new Promise((resolve, reject) => {\n this.pending.set(id, { resolve, reject });\n this.child!.stdin!.write(payload + \"\\n\");\n });\n }\n\n async initialize(): Promise<{ agentInfo: { name: string; version: string } }> {\n return this.request(\"initialize\", {\n protocolVersion: \"2025-11-16\",\n capabilities: {},\n clientInfo: { name: \"abtars\", version: \"0.2.3\" },\n });\n }\n\n async newSession(params: { cwd: string; mcpServers: unknown[] }): Promise<{ sessionId: string }> {\n return this.request(\"session/new\", params);\n }\n\n async prompt(params: { sessionId: string; prompt: Array<{ type: string; text: string }> }): Promise<{ stopReason: string }> {\n return this.request(\"session/prompt\", params);\n }\n\n get pid(): number | undefined { return this.child?.pid; }\n get alive(): boolean { return this.child !== null; }\n\n destroy(): void {\n if (this.child) {\n const pid = this.child.pid;\n this.child.kill(\"SIGTERM\");\n this.child = null;\n if (pid) setTimeout(() => { try { process.kill(pid, \"SIGKILL\"); } catch {} }, 2000).unref();\n }\n for (const [, p] of this.pending) p.reject(new Error(\"destroyed\"));\n this.pending.clear();\n }\n}\n"],
5
- "mappings": "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",
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -5,8 +5,9 @@ import {
5
5
  logError,
6
6
  logInfo,
7
7
  logWarn
8
- } from "./chunk-OOKNHOCB.js";
9
- import "./chunk-H2K23MOF.js";
8
+ } from "./chunk-GWILHZPT.js";
9
+ import "./chunk-GALQBVKO.js";
10
+ import "./chunk-O7KQG6ME.js";
10
11
  import "./chunk-7K2YZTLD.js";
11
12
 
12
13
  // src/components/action-gate.ts
@@ -188,4 +189,4 @@ Authorize?`;
188
189
  export {
189
190
  ActionGate
190
191
  };
191
- //# sourceMappingURL=action-gate-QYJL57IX.js.map
192
+ //# sourceMappingURL=action-gate-G2V47NHW.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/components/action-gate.ts"],
4
4
  "sourcesContent": ["/**\n * action-gate.ts \u2014 Out-of-band authorization for privileged actions.\n * Agent requests a privileged action \u2192 Telegram inline keyboard to master \u2192 proceed/deny.\n */\n\nimport { randomBytes } from \"node:crypto\";\nimport { readFileSync, writeFileSync, mkdirSync, appendFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { logInfo, logWarn, logError } from \"./logger.js\";\n\nconst TAG = \"action-gate\";\n\nexport interface AuthToken {\n id: string;\n category: string;\n pattern: string;\n expiresAt: number;\n consumed: boolean;\n}\n\nexport interface AuthRule {\n category: string;\n pattern: string;\n action: \"allow\" | \"deny\";\n createdAt: string;\n}\n\nexport interface AuthRequest {\n id: string;\n category: string;\n detail: string;\n resolve: (granted: boolean) => void;\n timer: ReturnType<typeof setTimeout>;\n reminderSent: boolean;\n}\n\nexport type NotifyFn = (text: string, buttons: Array<{ text: string; data: string }>) => Promise<void>;\n\nexport class ActionGate {\n private tokens = new Map<string, AuthToken>();\n private pending = new Map<string, AuthRequest>();\n private rules: AuthRule[] = [];\n private rulesPath: string;\n private auditPath: string;\n private notify: NotifyFn | null = null;\n\n constructor(authDir: string) {\n this.rulesPath = join(authDir, \"rules.json\");\n this.auditPath = join(authDir, \"audit.jsonl\");\n mkdirSync(authDir, { recursive: true });\n this.loadRules();\n }\n\n setNotify(fn: NotifyFn): void {\n this.notify = fn;\n }\n\n /** Check if a rule already allows/denies this action. */\n checkRules(category: string, pattern: string): \"allow\" | \"deny\" | null {\n for (const rule of this.rules) {\n if (rule.category !== category) continue;\n if (rule.pattern === \"*\" || rule.pattern === pattern) {\n return rule.action;\n }\n }\n return null;\n }\n\n /**\n * Request authorization for a privileged action.\n * Returns true if granted, false if denied/timed out.\n */\n async requestAuth(category: string, detail: string): Promise<boolean> {\n // Check persistent rules first\n const rule = this.checkRules(category, detail);\n if (rule === \"allow\") {\n this.audit(category, detail, \"allowed-by-rule\");\n return true;\n }\n if (rule === \"deny\") {\n this.audit(category, detail, \"denied-by-rule\");\n return false;\n }\n\n // No rule \u2014 ask master via Telegram\n if (!this.notify) {\n logWarn(TAG, `No notify function \u2014 auto-denying ${category}: ${detail.slice(0, 80)}`);\n this.audit(category, detail, \"denied-no-notify\");\n return false;\n }\n\n const requestId = randomBytes(8).toString(\"hex\");\n const message = this.formatMessage(category, detail);\n\n return new Promise<boolean>((resolve) => {\n const timer = setTimeout(() => {\n this.pending.delete(requestId);\n logWarn(TAG, `Auth request timed out: ${category} ${detail.slice(0, 60)}`);\n this.audit(category, detail, \"denied-timeout\");\n resolve(false);\n }, 120_000);\n\n // 60s reminder\n const reminderTimer = setTimeout(() => {\n const req = this.pending.get(requestId);\n if (req && !req.reminderSent) {\n req.reminderSent = true;\n this.notify?.(\"\u23F3 Still waiting for authorization...\", []).catch(() => {});\n }\n }, 60_000);\n\n this.pending.set(requestId, { id: requestId, category, detail, resolve: (granted) => {\n clearTimeout(timer);\n clearTimeout(reminderTimer);\n this.pending.delete(requestId);\n resolve(granted);\n }, timer, reminderSent: false });\n\n this.notify!(message, [\n { text: \"\u2713 Allow once\", data: `auth:${requestId}:once` },\n { text: \"\uD83D\uDD13 Always allow\", data: `auth:${requestId}:always` },\n { text: \"\u274C Deny\", data: `auth:${requestId}:deny` },\n ]).catch((err) => {\n logError(TAG, `Failed to send auth request: ${err}`);\n clearTimeout(timer);\n clearTimeout(reminderTimer);\n this.pending.delete(requestId);\n this.audit(category, detail, \"denied-send-failed\");\n resolve(false);\n });\n });\n }\n\n /** Handle callback from Telegram button press. */\n handleCallback(data: string): boolean {\n const match = data.match(/^auth:([a-f0-9]+):(once|always|deny)$/);\n if (!match) return false;\n\n const [, requestId, action] = match;\n const req = this.pending.get(requestId!);\n if (!req) return false;\n\n if (action === \"once\") {\n this.audit(req.category, req.detail, \"allowed-once\");\n req.resolve(true);\n } else if (action === \"always\") {\n this.storeRule(req.category, req.detail, \"allow\");\n this.audit(req.category, req.detail, \"allowed-always\");\n req.resolve(true);\n } else {\n this.audit(req.category, req.detail, \"denied\");\n req.resolve(false);\n }\n return true;\n }\n\n /** Generate a one-use token for external CLI callers. */\n generateToken(category: string, pattern: string): string {\n const id = randomBytes(16).toString(\"hex\");\n this.tokens.set(id, {\n id,\n category,\n pattern,\n expiresAt: Date.now() + 120_000,\n consumed: false,\n });\n return id;\n }\n\n /** Validate and consume a token. */\n validateToken(tokenId: string): boolean {\n const token = this.tokens.get(tokenId);\n if (!token) return false;\n if (token.consumed || Date.now() > token.expiresAt) {\n this.tokens.delete(tokenId);\n return false;\n }\n token.consumed = true;\n this.tokens.delete(tokenId);\n return true;\n }\n\n private storeRule(category: string, pattern: string, action: \"allow\" | \"deny\"): void {\n this.rules.push({ category, pattern, action, createdAt: new Date().toISOString() });\n writeFileSync(this.rulesPath, JSON.stringify({ rules: this.rules }, null, 2) + \"\\n\");\n logInfo(TAG, `Stored rule: ${action} ${category}:${pattern}`);\n }\n\n private loadRules(): void {\n if (!existsSync(this.rulesPath)) { this.rules = []; return; }\n try {\n const data = JSON.parse(readFileSync(this.rulesPath, \"utf-8\"));\n this.rules = data.rules ?? [];\n } catch { this.rules = []; }\n }\n\n private audit(category: string, detail: string, outcome: string): void {\n const entry = JSON.stringify({ ts: new Date().toISOString(), category, detail: detail.slice(0, 200), outcome });\n try { appendFileSync(this.auditPath, entry + \"\\n\"); } catch { /* best effort */ }\n }\n\n private formatMessage(category: string, detail: string): string {\n switch (category) {\n case \"secret-recall\": return `\uD83D\uDD10 Agent wants SECRET memory:\\n\"${detail.slice(0, 100)}\"\\n\\nAuthorize?`;\n case \"bash-auth\": return `\u26A0\uFE0F Agent wants to run:\\n\\`${detail.slice(0, 200)}\\`\\n\\nAuthorize?`;\n default: return `\uD83D\uDD12 Agent requests: ${category}\\n${detail.slice(0, 150)}\\n\\nAuthorize?`;\n }\n }\n}\n"],
5
- "mappings": "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",
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -4,8 +4,9 @@ import {
4
4
  init_logger,
5
5
  logDebug,
6
6
  logInfo
7
- } from "./chunk-OOKNHOCB.js";
8
- import "./chunk-H2K23MOF.js";
7
+ } from "./chunk-GWILHZPT.js";
8
+ import "./chunk-GALQBVKO.js";
9
+ import "./chunk-O7KQG6ME.js";
9
10
  import "./chunk-7K2YZTLD.js";
10
11
 
11
12
  // src/platforms/agent-api/agent-api-adapter.ts
@@ -34,7 +35,7 @@ var AgentApiAdapter = class {
34
35
  * Returns the Orc's response (resolved when card completes).
35
36
  */
36
37
  async handlePeerMessage(peerId, sessionId, text, timeoutMs = 3e5) {
37
- const { spin } = await import("./spin-4DBYHS3E.js");
38
+ const { spin } = await import("./spin-IMW2MZOH.js");
38
39
  logDebug(TAG, `-> ${peerId}/${sessionId}: ${text.slice(0, 100)}`);
39
40
  const { result } = await spin.dispatchAwait({
40
41
  type: "O",
@@ -51,4 +52,4 @@ var AgentApiAdapter = class {
51
52
  export {
52
53
  AgentApiAdapter
53
54
  };
54
- //# sourceMappingURL=agent-api-adapter-PYMNQXHE.js.map
55
+ //# sourceMappingURL=agent-api-adapter-PTJYZKQK.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/platforms/agent-api/agent-api-adapter.ts"],
4
4
  "sourcesContent": ["/**\n * agent-api-adapter.ts \u2014 A2A as a PlatformAdapter (#978).\n *\n * Thin adapter: receives peer chat messages via HTTP, routes through\n * Spin \u2192 Orc. Peers don't get casual chat \u2014 they get orchestrated work.\n * Response buffered via Promise \u2014 resolved when Orc completes the card.\n */\n\nimport type { PlatformAdapter, PlatformCapabilities, InboundMessage, SendOpts } from \"../../types/platform.js\";\nimport { logInfo, logDebug } from \"../../components/logger.js\";\n\nconst TAG = \"a2a-adapter\";\n\nexport class AgentApiAdapter implements PlatformAdapter {\n readonly name = \"a2a\" as const;\n readonly capabilities: PlatformCapabilities = { voice: false, reactions: false, typing: false, threads: false };\n readonly supportsStreaming = false;\n\n async start(): Promise<void> {\n logInfo(TAG, \"A2A platform adapter ready\");\n }\n\n stop(): void {}\n\n authorize(_msg: InboundMessage): boolean {\n return true; // JWT already verified at HTTP layer\n }\n\n async sendMessage(_channelId: string, _text: string, _opts?: SendOpts): Promise<string | undefined> {\n return undefined; // Not used \u2014 response comes from Orc card result\n }\n\n chunkResponse(text: string): string[] {\n return [text];\n }\n\n /**\n * Process a peer chat message: route through Spin \u2192 Orc.\n * Returns the Orc's response (resolved when card completes).\n */\n async handlePeerMessage(peerId: string, sessionId: string, text: string, timeoutMs = 300_000): Promise<string> {\n const { spin } = await import(\"../../components/spin.js\");\n\n logDebug(TAG, `-> ${peerId}/${sessionId}: ${text.slice(0, 100)}`);\n\n const { result } = await spin.dispatchAwait({\n type: \"O\",\n goal: `[PEER REQUEST from ${peerId}] ${text}`,\n title: `peer:${peerId}`,\n source: \"peer\",\n timeoutMs,\n });\n\n const response = result || \"No response\";\n logDebug(TAG, `<- ${peerId}/${sessionId}: ${response.slice(0, 100)}`);\n return response;\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;AASA;AAEA,IAAM,MAAM;AAEL,IAAM,kBAAN,MAAiD;AAAA,EAC7C,OAAO;AAAA,EACP,eAAqC,EAAE,OAAO,OAAO,WAAW,OAAO,QAAQ,OAAO,SAAS,MAAM;AAAA,EACrG,oBAAoB;AAAA,EAE7B,MAAM,QAAuB;AAC3B,YAAQ,KAAK,4BAA4B;AAAA,EAC3C;AAAA,EAEA,OAAa;AAAA,EAAC;AAAA,EAEd,UAAU,MAA+B;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,YAAoB,OAAe,OAA+C;AAClG,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,MAAwB;AACpC,WAAO,CAAC,IAAI;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBAAkB,QAAgB,WAAmB,MAAc,YAAY,KAA0B;AAC7G,UAAM,EAAE,KAAK,IAAI,MAAM,OAAO,oBAA0B;AAExD,aAAS,KAAK,MAAM,MAAM,IAAI,SAAS,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC,EAAE;AAEhE,UAAM,EAAE,OAAO,IAAI,MAAM,KAAK,cAAc;AAAA,MAC1C,MAAM;AAAA,MACN,MAAM,sBAAsB,MAAM,KAAK,IAAI;AAAA,MAC3C,OAAO,QAAQ,MAAM;AAAA,MACrB,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAED,UAAM,WAAW,UAAU;AAC3B,aAAS,KAAK,MAAM,MAAM,IAAI,SAAS,KAAK,SAAS,MAAM,GAAG,GAAG,CAAC,EAAE;AACpE,WAAO;AAAA,EACT;AACF;",
5
+ "mappings": ";;;;;;;;;;;;AASA;AAEA,IAAM,MAAM;AAEL,IAAM,kBAAN,MAAiD;AAAA,EAC7C,OAAO;AAAA,EACP,eAAqC,EAAE,OAAO,OAAO,WAAW,OAAO,QAAQ,OAAO,SAAS,MAAM;AAAA,EACrG,oBAAoB;AAAA,EAE7B,MAAM,QAAuB;AAC3B,YAAQ,KAAK,4BAA4B;AAAA,EAC3C;AAAA,EAEA,OAAa;AAAA,EAAC;AAAA,EAEd,UAAU,MAA+B;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,YAAoB,OAAe,OAA+C;AAClG,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,MAAwB;AACpC,WAAO,CAAC,IAAI;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBAAkB,QAAgB,WAAmB,MAAc,YAAY,KAA0B;AAC7G,UAAM,EAAE,KAAK,IAAI,MAAM,OAAO,oBAA0B;AAExD,aAAS,KAAK,MAAM,MAAM,IAAI,SAAS,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC,EAAE;AAEhE,UAAM,EAAE,OAAO,IAAI,MAAM,KAAK,cAAc;AAAA,MAC1C,MAAM;AAAA,MACN,MAAM,sBAAsB,MAAM,KAAK,IAAI;AAAA,MAC3C,OAAO,QAAQ,MAAM;AAAA,MACrB,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAED,UAAM,WAAW,UAAU;AAC3B,aAAS,KAAK,MAAM,MAAM,IAAI,SAAS,KAAK,SAAS,MAAM,GAAG,GAAG,CAAC,EAAE;AACpE,WAAO;AAAA,EACT;AACF;",
6
6
  "names": []
7
7
  }
@@ -4,14 +4,15 @@ import {
4
4
  checkPeerPostLimit,
5
5
  checkRateLimit,
6
6
  init_agent_api_rate_limit
7
- } from "./chunk-YEOZN5IE.js";
8
- import "./chunk-SSCGWDIC.js";
9
- import "./chunk-OOKNHOCB.js";
10
- import "./chunk-H2K23MOF.js";
7
+ } from "./chunk-DYBW4XXL.js";
8
+ import "./chunk-65VCEC32.js";
9
+ import "./chunk-GWILHZPT.js";
10
+ import "./chunk-GALQBVKO.js";
11
+ import "./chunk-O7KQG6ME.js";
11
12
  import "./chunk-7K2YZTLD.js";
12
13
  init_agent_api_rate_limit();
13
14
  export {
14
15
  checkPeerPostLimit,
15
16
  checkRateLimit
16
17
  };
17
- //# sourceMappingURL=agent-api-rate-limit-4GEZ4YN5.js.map
18
+ //# sourceMappingURL=agent-api-rate-limit-WCFXJMGY.js.map
@@ -3,17 +3,18 @@
3
3
  import {
4
4
  createAgentTransport,
5
5
  createSubagentTransport
6
- } from "./chunk-NGZVJ52F.js";
7
- import "./chunk-37EX63K4.js";
8
- import "./chunk-W726UGI6.js";
6
+ } from "./chunk-ZKJOFASV.js";
7
+ import "./chunk-LUW62WGO.js";
8
+ import "./chunk-GRVWZO4C.js";
9
9
  import "./chunk-N5KN3LGD.js";
10
- import "./chunk-SSCGWDIC.js";
11
- import "./chunk-WP7FZHMI.js";
12
- import "./chunk-OOKNHOCB.js";
13
- import "./chunk-H2K23MOF.js";
10
+ import "./chunk-65VCEC32.js";
11
+ import "./chunk-YSKCQH6E.js";
12
+ import "./chunk-GWILHZPT.js";
13
+ import "./chunk-GALQBVKO.js";
14
+ import "./chunk-O7KQG6ME.js";
14
15
  import "./chunk-7K2YZTLD.js";
15
16
  export {
16
17
  createAgentTransport,
17
18
  createSubagentTransport
18
19
  };
19
- //# sourceMappingURL=agent-registry-563P4EUJ.js.map
20
+ //# sourceMappingURL=agent-registry-GU7ABOK5.js.map
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
3
+ import {
4
+ makeLocalBuildSource,
5
+ makeNpmSource,
6
+ syncSrcRepos
7
+ } from "./chunk-S5GD5EJ5.js";
8
+ import {
9
+ cleanStaleStaging
10
+ } from "./chunk-5NY2YULC.js";
11
+ import {
12
+ packagePaths
13
+ } from "./chunk-O7KQG6ME.js";
14
+ import "./chunk-7K2YZTLD.js";
15
+
16
+ // src/cli/bootstrap.ts
17
+ import { join } from "node:path";
18
+ import { spawnSync } from "node:child_process";
19
+ async function bootstrap(opts) {
20
+ const { channel } = opts;
21
+ const paths = packagePaths("abtars");
22
+ const srcDir = join(paths.releasesDir, "src");
23
+ const repoRoot = join(srcDir, "abtars");
24
+ cleanStaleStaging(paths.appStaging);
25
+ cleanStaleStaging(join(paths.home, "app.staging"));
26
+ let staged;
27
+ if (channel === "dev") {
28
+ try {
29
+ syncSrcRepos(srcDir, ["abtars"]);
30
+ } catch {
31
+ return 1;
32
+ }
33
+ const source = makeLocalBuildSource({ repoRoot, allowStale: true });
34
+ staged = await source.prepare({ stagingDir: paths.appStaging, home: paths.home, allowStale: true });
35
+ } else {
36
+ const source = makeNpmSource("abtars", channel === "alpha" ? "alpha" : "latest");
37
+ staged = await source.prepare({ stagingDir: paths.appStaging, home: paths.home, allowStale: true });
38
+ }
39
+ process.stdout.write(`\u2713 obtained ${staged.version}
40
+ `);
41
+ const freshCli = join(staged.stagedPath, "bundle", "abtars-cli.js");
42
+ const args = [
43
+ freshCli,
44
+ "__deploy",
45
+ "--staged",
46
+ staged.stagedPath,
47
+ "--version",
48
+ staged.version,
49
+ "--channel",
50
+ channel,
51
+ "--repo-root",
52
+ repoRoot
53
+ ];
54
+ if (staged.commit) args.push("--commit", staged.commit);
55
+ if (staged.branch) args.push("--branch", staged.branch);
56
+ if (staged.packageLockHash) args.push("--package-lock-hash", staged.packageLockHash);
57
+ const r = spawnSync("node", args, { stdio: "inherit" });
58
+ return r.status ?? 1;
59
+ }
60
+ export {
61
+ bootstrap
62
+ };
63
+ //# sourceMappingURL=bootstrap-POWWTU6I.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli/bootstrap.ts"],
4
+ "sourcesContent": ["/**\n * bootstrap.ts (#1237) \u2014 the STABLE, old-code surface of `abtars update`.\n *\n * Role: OBTAIN fresh code only (fail-safe \u2014 nothing is swapped here), then hand\n * off to the freshly-staged `__deploy` which performs activation. A bug in\n * activation is self-healing: the next update fetches the fixed __deploy and\n * runs it. Only this file (obtain) runs as old code, and its failure mode is\n * safe-abort (the running release keeps serving).\n *\n * Keep this minimal: reuse the existing obtain primitives (syncSrcRepos +\n * UpdateSource.prepare). No imports from components/*, no business logic, no\n * activation logic. #1243: abmind is no longer obtained here \u2014 it ships\n * separately and is discovered at runtime.\n */\nimport { join } from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport { cleanStaleStaging, packagePaths } from \"./deploy-lib/index.js\";\nimport { syncSrcRepos } from \"./deploy-lib/deploy.js\";\nimport { makeLocalBuildSource } from \"./update-sources/dev.js\";\nimport { makeNpmSource } from \"./update-sources/npm.js\";\nimport type { SourceName, StagedRelease } from \"./update-sources/types.js\";\n\nexport interface BootstrapOptions {\n readonly channel: SourceName;\n}\n\nexport async function bootstrap(opts: BootstrapOptions): Promise<number> {\n const { channel } = opts;\n const paths = packagePaths(\"abtars\");\n const srcDir = join(paths.releasesDir, \"src\");\n const repoRoot = join(srcDir, \"abtars\");\n\n // \u2500\u2500 Obtain (fail-safe) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n cleanStaleStaging(paths.appStaging);\n cleanStaleStaging(join(paths.home, 'app.staging')); // legacy #1247 cleanup\n let staged: StagedRelease;\n if (channel === \"dev\") {\n try { syncSrcRepos(srcDir, [\"abtars\"]); } catch { return 1; }\n const source = makeLocalBuildSource({ repoRoot, allowStale: true });\n staged = await source.prepare({ stagingDir: paths.appStaging, home: paths.home, allowStale: true });\n } else {\n const source = makeNpmSource(\"abtars\", channel === \"alpha\" ? \"alpha\" : \"latest\");\n staged = await source.prepare({ stagingDir: paths.appStaging, home: paths.home, allowStale: true });\n }\n process.stdout.write(`\u2713 obtained ${staged.version}\\n`);\n\n // \u2500\u2500 Hand off to FRESH __deploy (runs the just-staged bundle) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Detach (when needed) is the caller's concern: the /update bridge handler\n // already spawns this whole invocation detached+unref. So we run __deploy\n // synchronously and return its exit code; a terminal user sees the result.\n const freshCli = join(staged.stagedPath, \"bundle\", \"abtars-cli.js\");\n const args = [\n freshCli, \"__deploy\",\n \"--staged\", staged.stagedPath,\n \"--version\", staged.version,\n \"--channel\", channel,\n \"--repo-root\", repoRoot,\n ];\n if (staged.commit) args.push(\"--commit\", staged.commit);\n if (staged.branch) args.push(\"--branch\", staged.branch);\n if (staged.packageLockHash) args.push(\"--package-lock-hash\", staged.packageLockHash);\n\n const r = spawnSync(\"node\", args, { stdio: \"inherit\" });\n return r.status ?? 1;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;AAcA,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAW1B,eAAsB,UAAU,MAAyC;AACvE,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,QAAQ,aAAa,QAAQ;AACnC,QAAM,SAAS,KAAK,MAAM,aAAa,KAAK;AAC5C,QAAM,WAAW,KAAK,QAAQ,QAAQ;AAGtC,oBAAkB,MAAM,UAAU;AAClC,oBAAkB,KAAK,MAAM,MAAM,aAAa,CAAC;AACjD,MAAI;AACJ,MAAI,YAAY,OAAO;AACrB,QAAI;AAAE,mBAAa,QAAQ,CAAC,QAAQ,CAAC;AAAA,IAAG,QAAQ;AAAE,aAAO;AAAA,IAAG;AAC5D,UAAM,SAAS,qBAAqB,EAAE,UAAU,YAAY,KAAK,CAAC;AAClE,aAAS,MAAM,OAAO,QAAQ,EAAE,YAAY,MAAM,YAAY,MAAM,MAAM,MAAM,YAAY,KAAK,CAAC;AAAA,EACpG,OAAO;AACL,UAAM,SAAS,cAAc,UAAU,YAAY,UAAU,UAAU,QAAQ;AAC/E,aAAS,MAAM,OAAO,QAAQ,EAAE,YAAY,MAAM,YAAY,MAAM,MAAM,MAAM,YAAY,KAAK,CAAC;AAAA,EACpG;AACA,UAAQ,OAAO,MAAM,mBAAc,OAAO,OAAO;AAAA,CAAI;AAMrD,QAAM,WAAW,KAAK,OAAO,YAAY,UAAU,eAAe;AAClE,QAAM,OAAO;AAAA,IACX;AAAA,IAAU;AAAA,IACV;AAAA,IAAY,OAAO;AAAA,IACnB;AAAA,IAAa,OAAO;AAAA,IACpB;AAAA,IAAa;AAAA,IACb;AAAA,IAAe;AAAA,EACjB;AACA,MAAI,OAAO,OAAQ,MAAK,KAAK,YAAY,OAAO,MAAM;AACtD,MAAI,OAAO,OAAQ,MAAK,KAAK,YAAY,OAAO,MAAM;AACtD,MAAI,OAAO,gBAAiB,MAAK,KAAK,uBAAuB,OAAO,eAAe;AAEnF,QAAM,IAAI,UAAU,QAAQ,MAAM,EAAE,OAAO,UAAU,CAAC;AACtD,SAAO,EAAE,UAAU;AACrB;",
6
+ "names": []
7
+ }
@@ -18,11 +18,12 @@ import {
18
18
  writeRestartReason,
19
19
  writeRestartRequested,
20
20
  writeSleepStatus
21
- } from "./chunk-W726UGI6.js";
21
+ } from "./chunk-GRVWZO4C.js";
22
22
  import "./chunk-N5KN3LGD.js";
23
- import "./chunk-WP7FZHMI.js";
24
- import "./chunk-OOKNHOCB.js";
25
- import "./chunk-H2K23MOF.js";
23
+ import "./chunk-YSKCQH6E.js";
24
+ import "./chunk-GWILHZPT.js";
25
+ import "./chunk-GALQBVKO.js";
26
+ import "./chunk-O7KQG6ME.js";
26
27
  import "./chunk-7K2YZTLD.js";
27
28
  init_bridge_lock_transport();
28
29
  export {
@@ -43,4 +44,4 @@ export {
43
44
  writeRestartRequested,
44
45
  writeSleepStatus
45
46
  };
46
- //# sourceMappingURL=bridge-lock-transport-LXCF2IVN.js.map
47
+ //# sourceMappingURL=bridge-lock-transport-4ZH7QTJP.js.map
@@ -2,14 +2,15 @@
2
2
  import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
3
3
  import {
4
4
  register
5
- } from "./chunk-E7MV7WFT.js";
6
- import "./chunk-VJATH7AN.js";
7
- import "./chunk-SSCGWDIC.js";
8
- import "./chunk-WP7FZHMI.js";
9
- import "./chunk-OOKNHOCB.js";
10
- import "./chunk-H2K23MOF.js";
5
+ } from "./chunk-7Z3HBPRY.js";
6
+ import "./chunk-2KC5G3EA.js";
7
+ import "./chunk-65VCEC32.js";
8
+ import "./chunk-YSKCQH6E.js";
9
+ import "./chunk-GWILHZPT.js";
10
+ import "./chunk-GALQBVKO.js";
11
+ import "./chunk-O7KQG6ME.js";
11
12
  import "./chunk-7K2YZTLD.js";
12
13
  export {
13
14
  register
14
15
  };
15
- //# sourceMappingURL=browser-2VZOGOGX.js.map
16
+ //# sourceMappingURL=browser-EJNS35NT.js.map
@@ -3,11 +3,12 @@
3
3
  import {
4
4
  init_logger,
5
5
  logWarn
6
- } from "./chunk-OOKNHOCB.js";
6
+ } from "./chunk-GWILHZPT.js";
7
7
  import {
8
8
  abtarsHome,
9
9
  init_paths
10
- } from "./chunk-H2K23MOF.js";
10
+ } from "./chunk-GALQBVKO.js";
11
+ import "./chunk-O7KQG6ME.js";
11
12
  import "./chunk-7K2YZTLD.js";
12
13
 
13
14
  // src/components/budget.ts
@@ -67,7 +68,7 @@ async function sendBudgetNotification(agent, reason) {
67
68
  const msg = `x Budget: ${agent} hit daily ${reason} limit (${detail}). Paused until midnight.`;
68
69
  logWarn("budget", msg);
69
70
  try {
70
- const { sendToMainChat } = await import("./main-chat-YLZDNQPO.js");
71
+ const { sendToMainChat } = await import("./main-chat-ZNUZCTNS.js");
71
72
  await sendToMainChat({}, msg);
72
73
  } catch {
73
74
  }
@@ -88,4 +89,4 @@ export {
88
89
  incrementBudgetCounter,
89
90
  sendBudgetNotification
90
91
  };
91
- //# sourceMappingURL=budget-PPA7WY3D.js.map
92
+ //# sourceMappingURL=budget-45QOBDWA.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/components/budget.ts"],
4
4
  "sourcesContent": ["/**\n * budget.ts \u2014 Daily agent token/call budget enforcement.\n * Config: ~/.abtars/config/budget.json\n */\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { abtarsHome } from \"../paths.js\";\nimport { logWarn } from \"./logger.js\";\n\ninterface AgentBudget { tokens?: number; calls?: number }\ninterface DailyBudget { [agent: string]: AgentBudget }\ninterface Counter { tokens: number; calls: number }\n\nconst counters = new Map<string, Counter>();\nlet lastResetDate = \"\";\nconst lastNotifiedAt = new Map<string, number>();\n\nfunction ensureToday(): void {\n const today = new Date().toISOString().slice(0, 10);\n if (today !== lastResetDate) { counters.clear(); lastResetDate = today; }\n}\n\nfunction loadBudget(): DailyBudget | null {\n try {\n const raw = readFileSync(join(abtarsHome(), \"config\", \"budget.json\"), \"utf-8\");\n const parsed = JSON.parse(raw);\n return parsed?.daily ?? null;\n } catch { return null; }\n}\n\nexport function incrementBudgetCounter(agent: string, tokens: number): void {\n if (!agent) return;\n ensureToday();\n const c = counters.get(agent) ?? { tokens: 0, calls: 0 };\n c.tokens += tokens;\n c.calls += 1;\n counters.set(agent, c);\n}\n\nexport function checkBudget(agent: string): { allowed: boolean; remaining: { tokens: number; calls: number }; limit: AgentBudget } {\n const budget = loadBudget();\n if (!budget || !budget[agent]) return { allowed: true, remaining: { tokens: Infinity, calls: Infinity }, limit: {} };\n ensureToday();\n const used = counters.get(agent) ?? { tokens: 0, calls: 0 };\n const limit = budget[agent];\n const tokenOk = !limit.tokens || used.tokens < limit.tokens * 1000;\n const callsOk = !limit.calls || used.calls < limit.calls;\n return {\n allowed: tokenOk && callsOk,\n remaining: { tokens: (limit.tokens ?? Infinity) * 1000 - used.tokens, calls: (limit.calls ?? Infinity) - used.calls },\n limit,\n };\n}\n\nexport async function sendBudgetNotification(agent: string, reason: string): Promise<void> {\n const now = Date.now();\n const last = lastNotifiedAt.get(agent) ?? 0;\n if (now - last < 3_600_000) return; // max 1 per hour per agent\n lastNotifiedAt.set(agent, now);\n const used = counters.get(agent) ?? { tokens: 0, calls: 0 };\n const limit = loadBudget()?.[agent];\n const detail = reason === \"token\"\n ? `${Math.round(used.tokens / 1000)}K/${limit?.tokens ?? \"?\"}K tokens`\n : `${used.calls}/${limit?.calls ?? \"?\"} calls`;\n const msg = `x Budget: ${agent} hit daily ${reason} limit (${detail}). Paused until midnight.`;\n logWarn(\"budget\", msg);\n try {\n const { sendToMainChat } = await import(\"./main-chat.js\");\n await sendToMainChat({}, msg);\n } catch { /* best effort */ }\n}\n\nexport function getBudgetStatus(): Array<{ agent: string; used: Counter; limit: AgentBudget }> {\n const budget = loadBudget();\n if (!budget) return [];\n ensureToday();\n return Object.entries(budget).map(([agent, limit]) => ({\n agent,\n used: counters.get(agent) ?? { tokens: 0, calls: 0 },\n limit,\n }));\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;AAMA;AACA;AAHA,SAAS,oBAAoB;AAC7B,SAAS,YAAY;AAQrB,IAAM,WAAW,oBAAI,IAAqB;AAC1C,IAAI,gBAAgB;AACpB,IAAM,iBAAiB,oBAAI,IAAoB;AAE/C,SAAS,cAAoB;AAC3B,QAAM,SAAQ,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAClD,MAAI,UAAU,eAAe;AAAE,aAAS,MAAM;AAAG,oBAAgB;AAAA,EAAO;AAC1E;AAEA,SAAS,aAAiC;AACxC,MAAI;AACF,UAAM,MAAM,aAAa,KAAK,WAAW,GAAG,UAAU,aAAa,GAAG,OAAO;AAC7E,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,QAAQ,SAAS;AAAA,EAC1B,QAAQ;AAAE,WAAO;AAAA,EAAM;AACzB;AAEO,SAAS,uBAAuB,OAAe,QAAsB;AAC1E,MAAI,CAAC,MAAO;AACZ,cAAY;AACZ,QAAM,IAAI,SAAS,IAAI,KAAK,KAAK,EAAE,QAAQ,GAAG,OAAO,EAAE;AACvD,IAAE,UAAU;AACZ,IAAE,SAAS;AACX,WAAS,IAAI,OAAO,CAAC;AACvB;AAEO,SAAS,YAAY,OAAuG;AACjI,QAAM,SAAS,WAAW;AAC1B,MAAI,CAAC,UAAU,CAAC,OAAO,KAAK,EAAG,QAAO,EAAE,SAAS,MAAM,WAAW,EAAE,QAAQ,UAAU,OAAO,SAAS,GAAG,OAAO,CAAC,EAAE;AACnH,cAAY;AACZ,QAAM,OAAO,SAAS,IAAI,KAAK,KAAK,EAAE,QAAQ,GAAG,OAAO,EAAE;AAC1D,QAAM,QAAQ,OAAO,KAAK;AAC1B,QAAM,UAAU,CAAC,MAAM,UAAU,KAAK,SAAS,MAAM,SAAS;AAC9D,QAAM,UAAU,CAAC,MAAM,SAAS,KAAK,QAAQ,MAAM;AACnD,SAAO;AAAA,IACL,SAAS,WAAW;AAAA,IACpB,WAAW,EAAE,SAAS,MAAM,UAAU,YAAY,MAAO,KAAK,QAAQ,QAAQ,MAAM,SAAS,YAAY,KAAK,MAAM;AAAA,IACpH;AAAA,EACF;AACF;AAEA,eAAsB,uBAAuB,OAAe,QAA+B;AACzF,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,OAAO,eAAe,IAAI,KAAK,KAAK;AAC1C,MAAI,MAAM,OAAO,KAAW;AAC5B,iBAAe,IAAI,OAAO,GAAG;AAC7B,QAAM,OAAO,SAAS,IAAI,KAAK,KAAK,EAAE,QAAQ,GAAG,OAAO,EAAE;AAC1D,QAAM,QAAQ,WAAW,IAAI,KAAK;AAClC,QAAM,SAAS,WAAW,UACtB,GAAG,KAAK,MAAM,KAAK,SAAS,GAAI,CAAC,KAAK,OAAO,UAAU,GAAG,aAC1D,GAAG,KAAK,KAAK,IAAI,OAAO,SAAS,GAAG;AACxC,QAAM,MAAM,aAAa,KAAK,cAAc,MAAM,WAAW,MAAM;AACnE,UAAQ,UAAU,GAAG;AACrB,MAAI;AACF,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,yBAAgB;AACxD,UAAM,eAAe,CAAC,GAAG,GAAG;AAAA,EAC9B,QAAQ;AAAA,EAAoB;AAC9B;AAEO,SAAS,kBAA+E;AAC7F,QAAM,SAAS,WAAW;AAC1B,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,cAAY;AACZ,SAAO,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO;AAAA,IACrD;AAAA,IACA,MAAM,SAAS,IAAI,KAAK,KAAK,EAAE,QAAQ,GAAG,OAAO,EAAE;AAAA,IACnD;AAAA,EACF,EAAE;AACJ;",
5
+ "mappings": ";;;;;;;;;;;;;;AAMA;AACA;AAHA,SAAS,oBAAoB;AAC7B,SAAS,YAAY;AAQrB,IAAM,WAAW,oBAAI,IAAqB;AAC1C,IAAI,gBAAgB;AACpB,IAAM,iBAAiB,oBAAI,IAAoB;AAE/C,SAAS,cAAoB;AAC3B,QAAM,SAAQ,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAClD,MAAI,UAAU,eAAe;AAAE,aAAS,MAAM;AAAG,oBAAgB;AAAA,EAAO;AAC1E;AAEA,SAAS,aAAiC;AACxC,MAAI;AACF,UAAM,MAAM,aAAa,KAAK,WAAW,GAAG,UAAU,aAAa,GAAG,OAAO;AAC7E,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,QAAQ,SAAS;AAAA,EAC1B,QAAQ;AAAE,WAAO;AAAA,EAAM;AACzB;AAEO,SAAS,uBAAuB,OAAe,QAAsB;AAC1E,MAAI,CAAC,MAAO;AACZ,cAAY;AACZ,QAAM,IAAI,SAAS,IAAI,KAAK,KAAK,EAAE,QAAQ,GAAG,OAAO,EAAE;AACvD,IAAE,UAAU;AACZ,IAAE,SAAS;AACX,WAAS,IAAI,OAAO,CAAC;AACvB;AAEO,SAAS,YAAY,OAAuG;AACjI,QAAM,SAAS,WAAW;AAC1B,MAAI,CAAC,UAAU,CAAC,OAAO,KAAK,EAAG,QAAO,EAAE,SAAS,MAAM,WAAW,EAAE,QAAQ,UAAU,OAAO,SAAS,GAAG,OAAO,CAAC,EAAE;AACnH,cAAY;AACZ,QAAM,OAAO,SAAS,IAAI,KAAK,KAAK,EAAE,QAAQ,GAAG,OAAO,EAAE;AAC1D,QAAM,QAAQ,OAAO,KAAK;AAC1B,QAAM,UAAU,CAAC,MAAM,UAAU,KAAK,SAAS,MAAM,SAAS;AAC9D,QAAM,UAAU,CAAC,MAAM,SAAS,KAAK,QAAQ,MAAM;AACnD,SAAO;AAAA,IACL,SAAS,WAAW;AAAA,IACpB,WAAW,EAAE,SAAS,MAAM,UAAU,YAAY,MAAO,KAAK,QAAQ,QAAQ,MAAM,SAAS,YAAY,KAAK,MAAM;AAAA,IACpH;AAAA,EACF;AACF;AAEA,eAAsB,uBAAuB,OAAe,QAA+B;AACzF,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,OAAO,eAAe,IAAI,KAAK,KAAK;AAC1C,MAAI,MAAM,OAAO,KAAW;AAC5B,iBAAe,IAAI,OAAO,GAAG;AAC7B,QAAM,OAAO,SAAS,IAAI,KAAK,KAAK,EAAE,QAAQ,GAAG,OAAO,EAAE;AAC1D,QAAM,QAAQ,WAAW,IAAI,KAAK;AAClC,QAAM,SAAS,WAAW,UACtB,GAAG,KAAK,MAAM,KAAK,SAAS,GAAI,CAAC,KAAK,OAAO,UAAU,GAAG,aAC1D,GAAG,KAAK,KAAK,IAAI,OAAO,SAAS,GAAG;AACxC,QAAM,MAAM,aAAa,KAAK,cAAc,MAAM,WAAW,MAAM;AACnE,UAAQ,UAAU,GAAG;AACrB,MAAI;AACF,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,yBAAgB;AACxD,UAAM,eAAe,CAAC,GAAG,GAAG;AAAA,EAC9B,QAAQ;AAAA,EAAoB;AAC9B;AAEO,SAAS,kBAA+E;AAC7F,QAAM,SAAS,WAAW;AAC1B,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,cAAY;AACZ,SAAO,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO;AAAA,IACrD;AAAA,IACA,MAAM,SAAS,IAAI,KAAK,KAAK,EAAE,QAAQ,GAAG,OAAO,EAAE;AAAA,IACnD;AAAA,EACF,EAAE;AACJ;",
6
6
  "names": []
7
7
  }
@@ -4,15 +4,16 @@ import {
4
4
  createCapabilityApi,
5
5
  createCapabilityRegistry,
6
6
  discoverCapabilities
7
- } from "./chunk-24V4A6RP.js";
8
- import "./chunk-SSCGWDIC.js";
9
- import "./chunk-WP7FZHMI.js";
10
- import "./chunk-OOKNHOCB.js";
11
- import "./chunk-H2K23MOF.js";
7
+ } from "./chunk-XX6BGTPO.js";
8
+ import "./chunk-65VCEC32.js";
9
+ import "./chunk-YSKCQH6E.js";
10
+ import "./chunk-GWILHZPT.js";
11
+ import "./chunk-GALQBVKO.js";
12
+ import "./chunk-O7KQG6ME.js";
12
13
  import "./chunk-7K2YZTLD.js";
13
14
  export {
14
15
  createCapabilityApi,
15
16
  createCapabilityRegistry,
16
17
  discoverCapabilities
17
18
  };
18
- //# sourceMappingURL=capability-WXEA2WFK.js.map
19
+ //# sourceMappingURL=capability-JFWX3IQF.js.map
@@ -2,10 +2,10 @@
2
2
  import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
3
3
  import {
4
4
  init_log_and_swallow
5
- } from "./chunk-WP7FZHMI.js";
5
+ } from "./chunk-YSKCQH6E.js";
6
6
  import {
7
7
  init_logger
8
- } from "./chunk-OOKNHOCB.js";
8
+ } from "./chunk-GWILHZPT.js";
9
9
 
10
10
  // src/components/command-registry.ts
11
11
  var BOT_COMMANDS = [
@@ -279,4 +279,4 @@ export {
279
279
  emojiToScore,
280
280
  emojiToTag
281
281
  };
282
- //# sourceMappingURL=chunk-CB6S3ZRF.js.map
282
+ //# sourceMappingURL=chunk-2FAZIA37.js.map
@@ -3,21 +3,21 @@
3
3
  import {
4
4
  getEnv,
5
5
  init_env_schema
6
- } from "./chunk-SSCGWDIC.js";
6
+ } from "./chunk-65VCEC32.js";
7
7
  import {
8
8
  init_log_and_swallow,
9
9
  logAndSwallow
10
- } from "./chunk-WP7FZHMI.js";
10
+ } from "./chunk-YSKCQH6E.js";
11
11
  import {
12
12
  init_logger,
13
13
  logDebug,
14
14
  logInfo,
15
15
  logWarn
16
- } from "./chunk-OOKNHOCB.js";
16
+ } from "./chunk-GWILHZPT.js";
17
17
  import {
18
18
  abtarsHome,
19
19
  init_paths
20
- } from "./chunk-H2K23MOF.js";
20
+ } from "./chunk-GALQBVKO.js";
21
21
 
22
22
  // src/capabilities/browser/browser-manager.ts
23
23
  init_log_and_swallow();
@@ -96,13 +96,14 @@ var BrowserManager = class _BrowserManager {
96
96
  return this._launching;
97
97
  }
98
98
  async _launchPatchright() {
99
- const { chromium } = await import("cloakbrowser");
99
+ const { launch } = await import("cloakbrowser");
100
100
  const headed = getEnv().browserHeaded;
101
101
  const args = headed ? [] : ["--headless=new"];
102
102
  if (getEnv().browserNoSandbox) args.push("--no-sandbox");
103
- return chromium.launch({
103
+ return launch({
104
104
  headless: !headed,
105
105
  channel: getEnv().browserChannel,
106
+ // #1203: cloakbrowser LaunchOptions omits 'channel'; passed through to Playwright
106
107
  args
107
108
  });
108
109
  }
@@ -361,7 +362,7 @@ var BrowserTool = class {
361
362
  if (getEnv().ssrfCheck) {
362
363
  try {
363
364
  const { hostname } = new URL(url);
364
- const { isPrivateHost } = await import("./ssrf-guard-6GP4QYVA.js");
365
+ const { isPrivateHost } = await import("./ssrf-guard-O6SHIK6Q.js");
365
366
  if (await isPrivateHost(hostname)) {
366
367
  return { success: false, error: `Blocked: "${hostname}" resolves to a private/internal IP address` };
367
368
  }
@@ -756,4 +757,4 @@ export {
756
757
  BrowserIpcServer,
757
758
  DomainAllowlist
758
759
  };
759
- //# sourceMappingURL=chunk-VJATH7AN.js.map
760
+ //# sourceMappingURL=chunk-2KC5G3EA.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/capabilities/browser/browser-manager.ts", "../src/capabilities/browser/browser-tool.ts", "../src/components/content-extractor.ts", "../src/capabilities/browser/browser-ipc-server.ts", "../src/capabilities/browser/domain-allowlist.ts"],
4
+ "sourcesContent": ["import { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport { logInfo, logWarn } from \"../../components/logger.js\";\nimport { getEnv } from \"../../components/env-schema.js\";\nimport type { Browser, BrowserContext, Page } from \"../../types/browser.js\";\nimport { execFileSync } from \"node:child_process\";\nimport type { BrowserSession } from \"../../types/browser.js\";\n\nconst TAG = \"browser_mgr\";\n\n// ---------------------------------------------------------------------------\n// Environment variable parsing\n\nfunction readPositiveInt(key: string, fallback: number): number {\n const raw = process.env[key];\n if (!raw) return fallback;\n const n = Number(raw);\n return Number.isFinite(n) && Number.isInteger(n) && n > 0 ? n : fallback;\n}\n// ---------------------------------------------------------------------------\n\n\nconst DEFAULTS = {\n BROWSER_SESSION_TIMEOUT_MS: 300_000,\n BROWSER_MAX_SESSIONS: 3,\n WEB_SCRAPE_USER_AGENT: \"Mozilla/5.0 (compatible; Abtars/1.0)\",\n} as const;\n\nexport type BrowserEngine = \"cloakbrowser\";\n\nexport interface BrowserConfig {\n sessionTimeoutMs: number;\n maxSessions: number;\n userAgent: string;\n engine: BrowserEngine;\n}\n\n/**\n * Read and validate browser-related env vars, returning resolved config.\n * Invalid values trigger a console.warn and fall back to defaults.\n * Exported for testability (Property 16).\n */\nexport function parseBrowserConfig(): BrowserConfig {\n const sessionTimeoutMs = readPositiveInt(\n \"BROWSER_SESSION_TIMEOUT_MS\",\n DEFAULTS.BROWSER_SESSION_TIMEOUT_MS,\n );\n const maxSessions = readPositiveInt(\n \"BROWSER_MAX_SESSIONS\",\n DEFAULTS.BROWSER_MAX_SESSIONS,\n );\n // Intentional: raw process.env \u2014 tests mutate this at runtime, getEnv() cache won't reflect changes\n const userAgent = process.env[\"WEB_SCRAPE_USER_AGENT\"]?.trim() || DEFAULTS.WEB_SCRAPE_USER_AGENT;\n\n const engine = \"cloakbrowser\" as BrowserEngine;\n\n return { sessionTimeoutMs, maxSessions, userAgent, engine };\n}\n\n// ---------------------------------------------------------------------------\n// BrowserManager singleton\n// ---------------------------------------------------------------------------\n\nexport class BrowserManager {\n private static _instance: BrowserManager | null = null;\n\n private _browser: Browser | null = null;\n private _launching: Promise<Browser> | null = null;\n private readonly _sessions = new Map<string, BrowserSession>();\n private _idleTimer: ReturnType<typeof setInterval> | null = null;\n private readonly _config: BrowserConfig;\n private _lastActivityAt = 0;\n private readonly _containerIdleStopMs: number;\n\n constructor(config?: BrowserConfig) {\n this._config = config ?? parseBrowserConfig();\n this._containerIdleStopMs = getEnv().browserIdleStopMin * 60_000;\n this._startIdleCheck();\n }\n\n /** Get (or create) the singleton instance. */\n static getInstance(): BrowserManager {\n if (!BrowserManager._instance) {\n BrowserManager._instance = new BrowserManager();\n }\n return BrowserManager._instance;\n }\n\n /** Reset singleton \u2014 primarily for testing. */\n static resetInstance(): void {\n BrowserManager._instance = null;\n }\n\n // -------------------------------------------------------------------------\n // Browser lifecycle\n // -------------------------------------------------------------------------\n\n /** Lazily launch or return the existing browser instance. */\n private async _ensureBrowser(): Promise<Browser> {\n if (this._browser?.isConnected()) return this._browser;\n\n // Avoid duplicate launches if multiple callers race.\n if (this._launching) return this._launching;\n\n this._launching = this._launchPatchright().then((browser) => {\n this._browser = browser;\n this._launching = null;\n browser.on(\"disconnected\", () => {\n this._browser = null;\n this._sessions.clear();\n });\n return browser;\n }).catch((err) => {\n this._launching = null;\n throw err;\n });\n\n return this._launching;\n }\n\n private async _launchPatchright(): Promise<Browser> {\n const { launch } = await import(\"cloakbrowser\");\n const headed = getEnv().browserHeaded;\n const args = headed ? [] : [\"--headless=new\"];\n if (getEnv().browserNoSandbox) args.push(\"--no-sandbox\");\n return launch({\n headless: !headed,\n channel: getEnv().browserChannel, // #1203: cloakbrowser LaunchOptions omits 'channel'; passed through to Playwright\n args,\n } as Parameters<typeof launch>[0]);\n }\n\n // -------------------------------------------------------------------------\n // Named sessions\n // -------------------------------------------------------------------------\n\n /**\n * Get or create a named browser session.\n * Reusing an existing session updates `lastActivityAt`.\n */\n async getSession(sessionId: string): Promise<BrowserSession> {\n const existing = this._sessions.get(sessionId);\n if (existing) {\n existing.lastActivityAt = Date.now();\n return existing;\n }\n\n // Enforce max sessions.\n if (this._sessions.size >= this._config.maxSessions) {\n const activeIds = [...this._sessions.keys()].join(\", \");\n throw new Error(\n `Maximum concurrent sessions (${this._config.maxSessions}) reached. ` +\n `Close an existing session first. Active sessions: ${activeIds}`,\n );\n }\n\n const browser = await this._ensureBrowser();\n const context = await browser.newContext({\n userAgent: this._config.userAgent,\n });\n const page = await context.newPage();\n const now = Date.now();\n\n const session: BrowserSession = {\n sessionId,\n context,\n page,\n createdAt: now,\n lastActivityAt: now,\n };\n\n this._sessions.set(sessionId, session);\n this._lastActivityAt = now;\n return session;\n }\n\n /** Close a named session and release its resources. */\n async closeSession(sessionId: string): Promise<void> {\n const session = this._sessions.get(sessionId);\n if (!session) return;\n\n this._sessions.delete(sessionId);\n try {\n await session.context.close();\n } catch (err) {\n logAndSwallow(TAG, \"closeSession context.close\", err);\n }\n }\n\n // -------------------------------------------------------------------------\n // One-off contexts (ingestion scrapes)\n // -------------------------------------------------------------------------\n\n /** Create a disposable context + page for ingestion. No session tracking. */\n async createOneOffContext(): Promise<{ context: BrowserContext; page: Page }> {\n const browser = await this._ensureBrowser();\n const context = await browser.newContext({\n userAgent: this._config.userAgent,\n });\n const page = await context.newPage();\n return { context, page };\n }\n\n /** Close a one-off context after use. */\n async closeContext(context: BrowserContext): Promise<void> {\n try {\n await context.close();\n } catch (err) {\n logAndSwallow(TAG, \"closeContext\", err);\n }\n }\n\n // -------------------------------------------------------------------------\n // Shutdown & cleanup\n // -------------------------------------------------------------------------\n\n /** Shut down everything: all sessions, the browser, cleanup timers. */\n async shutdown(): Promise<void> {\n this._stopIdleCheck();\n\n // Close all named sessions.\n const closePromises = [...this._sessions.keys()].map((id) =>\n this.closeSession(id),\n );\n await Promise.all(closePromises);\n\n // Close the browser itself.\n if (this._browser) {\n try {\n await this._browser.close();\n } catch (err) {\n logAndSwallow(TAG, \"browser.close shutdown\", err);\n }\n this._browser = null;\n }\n }\n\n // -------------------------------------------------------------------------\n // Idle-check interval\n // -------------------------------------------------------------------------\n\n private _startIdleCheck(): void {\n // Check every 30 seconds for idle sessions.\n this._idleTimer = setInterval(() => {\n void this._sweepIdleSessions();\n }, 30_000);\n\n // Don't prevent Node from exiting.\n if (this._idleTimer && typeof this._idleTimer === \"object\" && \"unref\" in this._idleTimer) {\n this._idleTimer.unref();\n }\n }\n\n private _stopIdleCheck(): void {\n if (this._idleTimer) {\n clearInterval(this._idleTimer);\n this._idleTimer = null;\n }\n }\n\n private async _sweepIdleSessions(): Promise<void> {\n const now = Date.now();\n const expired: string[] = [];\n\n for (const [id, session] of this._sessions) {\n if (now - session.lastActivityAt > this._config.sessionTimeoutMs) {\n expired.push(id);\n }\n }\n\n for (const id of expired) {\n logWarn(\"browser\", `Closing idle session \"${id}\".`);\n await this.closeSession(id);\n }\n\n // Stop container if no sessions and idle long enough\n if (this._sessions.size === 0 && this._browser && this._lastActivityAt > 0 && now - this._lastActivityAt > this._containerIdleStopMs) {\n logInfo(\"browser\", `No sessions for ${Math.round((now - this._lastActivityAt) / 60_000)}min \u2014 stopping container.`);\n await this.shutdown();\n this._stopContainer();\n }\n }\n\n private _stopContainer(): void {\n try {\n execFileSync(\"docker\", [\"stop\", \"abtars-browser\"], { stdio: \"pipe\", timeout: 10_000 });\n } catch (err) { logAndSwallow(\"browser_manager\", \"op\", err); }\n }\n\n // -------------------------------------------------------------------------\n // Accessors\n // -------------------------------------------------------------------------\n\n /** Number of active named sessions. */\n get activeSessionCount(): number {\n return this._sessions.size;\n }\n\n /** Exposed for testing \u2014 the resolved config. */\n get config(): BrowserConfig {\n return this._config;\n }\n}\n", "import { logDebug } from \"../../components/logger.js\";\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport { getEnv } from \"../../components/env-schema.js\";\n\nconst TAG = \"browser_tool\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { readFileSync } from \"node:fs\";\nimport type { BrowserAction, BrowserToolResult, PageElement } from \"../../types/browser.js\";\nimport type { BrowserManager } from \"./browser-manager.js\";\nimport type { DomainAllowlist } from \"./domain-allowlist.js\";\nimport { extractTextFromPage } from \"../../components/content-extractor.js\";\n\nconst LOG_PREFIX = \"[browser-tool]\";\n\n/** Max characters returned by extract_text before truncation. */\nconst TEXT_TRUNCATION_LIMIT = 4000;\n\n/** Max interactive elements returned by get_page_info. */\nconst MAX_PAGE_ELEMENTS = 50;\n\n/** Read navigation timeout from env, default 30 000 ms. */\nfunction getNavigationTimeout(): number {\n const raw = String(getEnv().webScrapePlaywrightTimeoutMs);\n if (raw === undefined || raw === \"\") return 30_000;\n const n = Number(raw);\n if (!Number.isFinite(n) || n <= 0) return 30_000;\n return n;\n}\n\n/**\n * Implements the seven browser actions (navigate, click, fill, extract_text,\n * screenshot, get_page_info, close_session). Pure action dispatch \u2014 receives\n * parsed args, calls BrowserManager + Playwright APIs, returns structured JSON.\n */\nexport class BrowserTool {\n private readonly _browserManager: BrowserManager;\n private readonly _domainAllowlist: DomainAllowlist;\n\n constructor(browserManager: BrowserManager, domainAllowlist: DomainAllowlist) {\n this._browserManager = browserManager;\n this._domainAllowlist = domainAllowlist;\n }\n\n /** Execute a browser action and return a JSON-serializable result. */\n async execute(action: BrowserAction): Promise<BrowserToolResult> {\n try {\n switch (action.action) {\n case \"navigate\":\n return await this._handleNavigate(action);\n case \"click\":\n return await this._handleClick(action);\n case \"fill\":\n return await this._handleFill(action);\n case \"extract_text\":\n return await this._handleExtractText(action);\n case \"screenshot\":\n return await this._handleScreenshot(action);\n case \"get_page_info\":\n return await this._handleGetPageInfo(action);\n case \"close_session\":\n return await this._handleCloseSession(action);\n case \"set_cookie\":\n return await this._handleSetCookie(action);\n default:\n return { success: false, error: `Unknown action: ${String((action as BrowserAction).action)}` };\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return { success: false, error: message };\n }\n }\n\n // -------------------------------------------------------------------------\n // navigate\n // -------------------------------------------------------------------------\n\n private async _handleNavigate(action: BrowserAction): Promise<BrowserToolResult> {\n const url = action.url;\n if (!url) {\n return { success: false, error: \"navigate action requires a url\" };\n }\n\n // Domain allowlist check\n if (!this._domainAllowlist.isAllowed(url)) {\n let hostname: string;\n try {\n hostname = new URL(url).hostname;\n } catch (err) {\n logAndSwallow(TAG, \"parse URL hostname\", err);\n hostname = url;\n }\n return {\n success: false,\n error: `Domain \"${hostname}\" is not in the allowed list. Allowed patterns: ${this._domainAllowlist.patterns.join(\", \")}`,\n };\n }\n\n // SSRF protection: reject private/internal IPs\n if (getEnv().ssrfCheck) {\n try {\n const { hostname } = new URL(url);\n const { isPrivateHost } = await import(\"./ssrf-guard.js\");\n if (await isPrivateHost(hostname)) {\n return { success: false, error: `Blocked: \"${hostname}\" resolves to a private/internal IP address` };\n }\n } catch (err) {\n logAndSwallow(TAG, \"SSRF check\", err);\n return { success: false, error: \"Invalid URL\" };\n }\n }\n\n const session = await this._browserManager.getSession(action.sessionId);\n const timeout = getNavigationTimeout();\n\n logDebug(\"browser\", `${LOG_PREFIX} navigate session=\"${action.sessionId}\" url=\"${url}\"`);\n\n try {\n const response = await session.page.goto(url, {\n waitUntil: \"domcontentloaded\",\n timeout,\n });\n\n const title = await session.page.title();\n const finalUrl = session.page.url();\n const status = response?.status();\n\n return { success: true, title, url: finalUrl, status };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return { success: false, error: `Navigation failed for ${url}: ${message}` };\n }\n }\n\n // -------------------------------------------------------------------------\n // click\n // -------------------------------------------------------------------------\n\n private async _handleClick(action: BrowserAction): Promise<BrowserToolResult> {\n const selector = action.selector;\n if (!selector) {\n return { success: false, error: \"click action requires a selector\" };\n }\n\n const session = await this._browserManager.getSession(action.sessionId);\n\n logDebug(\"browser\", `${LOG_PREFIX} click session=\"${action.sessionId}\" selector=\"${selector}\"`);\n\n try {\n // Use Promise.race to detect if click triggers navigation\n const navigationPromise = session.page\n .waitForNavigation({ waitUntil: \"domcontentloaded\", timeout: 5000 })\n .catch((err: unknown) => { logAndSwallow(TAG, \"waitForNavigation click\", err); return null; });\n\n await session.page.click(selector);\n\n const navResult = await navigationPromise;\n\n if (navResult) {\n const title = await session.page.title();\n const url = session.page.url();\n return { success: true, navigated: true, title, url };\n }\n\n return { success: true, navigated: false };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.includes(\"waiting for selector\") || message.includes(\"No element\")) {\n return { success: false, error: `Selector not found: \"${selector}\"` };\n }\n return { success: false, error: `Click failed for selector \"${selector}\": ${message}` };\n }\n }\n\n // -------------------------------------------------------------------------\n // fill\n // -------------------------------------------------------------------------\n\n private async _handleFill(action: BrowserAction): Promise<BrowserToolResult> {\n const selector = action.selector;\n const value = action.value;\n if (!selector) {\n return { success: false, error: \"fill action requires a selector\" };\n }\n if (value === undefined) {\n return { success: false, error: \"fill action requires a value\" };\n }\n\n const session = await this._browserManager.getSession(action.sessionId);\n\n // Check if the target is a password field to mask in logs\n let isPassword = false;\n try {\n isPassword = await session.page.evaluate(\n `(sel) => { const el = document.querySelector(sel); return el instanceof HTMLInputElement && el.type === \"password\"; }`,\n selector,\n ) as boolean;\n } catch (err) {\n logAndSwallow(TAG, \"evaluate isPassword\", err);\n }\n\n const logValue = isPassword ? \"***\" : value;\n logDebug(\"browser\",\n `${LOG_PREFIX} fill session=\"${action.sessionId}\" selector=\"${selector}\" value=\"${logValue}\"`,\n );\n\n try {\n await session.page.fill(selector, value);\n return { success: true };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.includes(\"waiting for selector\") || message.includes(\"No element\")) {\n return { success: false, error: `Selector not found: \"${selector}\"` };\n }\n return { success: false, error: `Fill failed for selector \"${selector}\": ${message}` };\n }\n }\n\n // -------------------------------------------------------------------------\n // extract_text\n // -------------------------------------------------------------------------\n\n private async _handleExtractText(action: BrowserAction): Promise<BrowserToolResult> {\n const session = await this._browserManager.getSession(action.sessionId);\n\n logDebug(\"browser\",\n `${LOG_PREFIX} extract_text session=\"${action.sessionId}\" selector=\"${action.selector ?? \"(full page)\"}\"`,\n );\n\n try {\n const text = await extractTextFromPage(session.page, action.selector ?? undefined);\n\n if (!text || text.trim().length === 0) {\n return { success: false, error: \"No text content found on the page\" };\n }\n\n const truncated = text.length > TEXT_TRUNCATION_LIMIT;\n const resultText = truncated ? text.slice(0, TEXT_TRUNCATION_LIMIT) : text;\n\n return { success: true, text: resultText, truncated };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.includes(\"waiting for selector\") || message.includes(\"No element\")) {\n return { success: false, error: `Selector not found: \"${action.selector}\"` };\n }\n return { success: false, error: `Text extraction failed: ${message}` };\n }\n }\n\n // -------------------------------------------------------------------------\n // screenshot\n // -------------------------------------------------------------------------\n\n private async _handleScreenshot(action: BrowserAction): Promise<BrowserToolResult> {\n const session = await this._browserManager.getSession(action.sessionId);\n\n const tmpFile = path.join(\n os.tmpdir(),\n `abtars-screenshot-${Date.now()}.png`,\n );\n\n logDebug(\"browser\",\n `${LOG_PREFIX} screenshot session=\"${action.sessionId}\" fullPage=${action.fullPage ?? false} path=\"${tmpFile}\"`,\n );\n\n await session.page.screenshot({\n fullPage: action.fullPage ?? false,\n path: tmpFile,\n });\n\n return { success: true, filePath: tmpFile };\n }\n\n // -------------------------------------------------------------------------\n // get_page_info\n // -------------------------------------------------------------------------\n\n private async _handleGetPageInfo(action: BrowserAction): Promise<BrowserToolResult> {\n const session = await this._browserManager.getSession(action.sessionId);\n\n logDebug(\"browser\", `${LOG_PREFIX} get_page_info session=\"${action.sessionId}\"`);\n\n const title = await session.page.title();\n const url = session.page.url();\n\n const elements = await session.page.evaluate(`(maxElements) => {\n const selectors = \"a, button, input, select, textarea, [role='button'], [role='link']\";\n const nodes = document.querySelectorAll(selectors);\n const results = [];\n\n for (let i = 0; i < nodes.length && results.length < maxElements; i++) {\n const el = nodes[i];\n if (!el || !(el instanceof HTMLElement)) continue;\n\n const style = window.getComputedStyle(el);\n if (style.display === \"none\" || style.visibility === \"hidden\") continue;\n\n let selector = el.tagName.toLowerCase();\n if (el.id) {\n selector = \"#\" + el.id;\n } else if (el.className && typeof el.className === \"string\" && el.className.trim()) {\n const cls = el.className.trim().split(/\\\\s+/).slice(0, 2).join(\".\");\n selector = el.tagName.toLowerCase() + \".\" + cls;\n } else {\n const parent = el.parentElement;\n if (parent) {\n const siblings = parent.querySelectorAll(\":scope > \" + el.tagName.toLowerCase());\n if (siblings.length > 1) {\n const idx = Array.from(siblings).indexOf(el) + 1;\n selector = el.tagName.toLowerCase() + \":nth-of-type(\" + idx + \")\";\n }\n }\n }\n\n const entry = { tag: el.tagName.toLowerCase(), selector };\n const text = (el.textContent || \"\").trim().slice(0, 100);\n if (text) entry.text = text;\n\n if (el instanceof HTMLInputElement || el instanceof HTMLSelectElement || el instanceof HTMLTextAreaElement) {\n if (el instanceof HTMLInputElement && el.type) entry.type = el.type;\n if (el.name) entry.name = el.name;\n if (el instanceof HTMLInputElement && el.placeholder) entry.placeholder = el.placeholder;\n if (el instanceof HTMLTextAreaElement && el.placeholder) entry.placeholder = el.placeholder;\n }\n\n if (el instanceof HTMLAnchorElement && el.href) {\n entry.href = el.href;\n }\n\n results.push(entry);\n }\n\n return results;\n }`, MAX_PAGE_ELEMENTS) as PageElement[];\n\n return {\n success: true,\n url,\n title,\n elements,\n };\n }\n\n // -------------------------------------------------------------------------\n // close_session\n // -------------------------------------------------------------------------\n\n private async _handleCloseSession(action: BrowserAction): Promise<BrowserToolResult> {\n logDebug(\"browser\", `${LOG_PREFIX} close_session session=\"${action.sessionId}\"`);\n await this._browserManager.closeSession(action.sessionId);\n return { success: true };\n }\n\n // -------------------------------------------------------------------------\n // set_cookie\n // -------------------------------------------------------------------------\n\n private async _handleSetCookie(action: BrowserAction): Promise<BrowserToolResult> {\n const file = action.cookieFile;\n if (!file) return { success: false, error: \"set_cookie requires --cookie-file\" };\n\n // Only allow files under /run/browser/cookies (mounted read-only)\n const COOKIES_DIR = \"/run/browser/cookies\";\n const resolved = path.resolve(file);\n if (!resolved.startsWith(COOKIES_DIR)) {\n return { success: false, error: `cookie file must be under ${COOKIES_DIR}` };\n }\n\n const raw = readFileSync(resolved, \"utf-8\");\n const json = JSON.parse(raw) as Record<string, string>;\n\n const session = await this._browserManager.getSession(action.sessionId);\n const url = action.url ?? session.page.url();\n let domain: string;\n try { domain = new URL(url).hostname; } catch (err) { logAndSwallow(TAG, \"parse cookie domain\", err); domain = \"\"; }\n\n const cookies = Object.entries(json).map(([name, value]) => ({\n name, value: String(value), domain, path: \"/\",\n }));\n\n await session.context.addCookies(cookies);\n logDebug(\"browser\", `${LOG_PREFIX} set_cookie session=\"${action.sessionId}\" loaded ${cookies.length} cookies for ${domain}`);\n return { success: true, text: `Loaded ${cookies.length} cookies for ${domain}` };\n }}\n", "import type { Page } from \"../types/browser.js\";\n\n/**\n * Strips non-content HTML elements and returns clean plain text.\n * Shared by both the agent tool's extract_text action and the ingestion WebScraper.\n *\n * Uses regex-based approach for raw HTML strings (no DOM available in Node.js).\n * Uses page.evaluate() for live Playwright pages (DOM APIs available in browser).\n */\n\n/** Tags whose entire content (including children) should be removed. */\nconst STRIPPED_TAGS = [\"script\", \"style\", \"nav\", \"footer\", \"header\", \"aside\"];\n\n/** Build a regex that matches an opening tag through its closing tag (non-greedy, case-insensitive). */\nfunction buildTagStripRegex(tag: string): RegExp {\n return new RegExp(`<${tag}[^>]*>[\\\\s\\\\S]*?<\\\\/${tag}>`, \"gi\");\n}\n\n/** Regex to match elements with role=\"navigation\" or role=\"banner\". */\nconst ROLE_STRIP_REGEX =\n /<[a-z][a-z0-9]*\\s[^>]*?\\brole\\s*=\\s*[\"'](navigation|banner)[\"'][^>]*>[\\s\\S]*?<\\/[a-z][a-z0-9]*>/gi;\n\n/** Regex to match any remaining HTML tag. */\nconst HTML_TAG_REGEX = /<[^>]+>/g;\n\n/** Common HTML entities to decode. */\nconst ENTITY_MAP: Record<string, string> = {\n \"&amp;\": \"&\",\n \"&lt;\": \"<\",\n \"&gt;\": \">\",\n \"&quot;\": '\"',\n \"&#39;\": \"'\",\n \"&nbsp;\": \" \",\n};\n\nconst ENTITY_REGEX = /&amp;|&lt;|&gt;|&quot;|&#39;|&nbsp;/g;\n\n/**\n * Parse raw HTML string and return clean text.\n * Removes non-content elements, strips tags, decodes entities, collapses whitespace.\n * Returns empty string on empty/whitespace-only input.\n */\nexport function extractTextFromHtml(html: string): string {\n if (!html || !html.trim()) return \"\";\n\n let text = html;\n\n // 1. Remove stripped tag elements and their content\n for (const tag of STRIPPED_TAGS) {\n text = text.replace(buildTagStripRegex(tag), \"\");\n }\n\n // 2. Remove elements with role=\"navigation\" or role=\"banner\"\n text = text.replace(ROLE_STRIP_REGEX, \"\");\n\n // 3. Strip all remaining HTML tags\n text = text.replace(HTML_TAG_REGEX, \" \");\n\n // 4. Decode common HTML entities\n text = text.replace(ENTITY_REGEX, (match) => ENTITY_MAP[match] ?? match);\n\n // 5. Collapse consecutive whitespace into single spaces/newlines\n // First normalize newlines, then collapse blank lines, then collapse spaces\n text = text.replace(/\\r\\n/g, \"\\n\");\n text = text.replace(/[ \\t]+/g, \" \");\n text = text.replace(/\\n[ ]+/g, \"\\n\");\n text = text.replace(/[ ]+\\n/g, \"\\n\");\n text = text.replace(/\\n{2,}/g, \"\\n\");\n\n return text.trim();\n}\n\n/**\n * JavaScript source executed inside the browser context via page.evaluate().\n * Uses DOM APIs (document, HTMLElement, etc.) which are only available at runtime.\n * Accepts a single argument: the CSS selector string or null for full-page extraction.\n */\nconst BROWSER_EXTRACT_FN = `\n(sel) => {\n const TAGS = [\"script\", \"style\", \"nav\", \"footer\", \"header\", \"aside\"];\n const ROLES = [\"navigation\", \"banner\"];\n\n const root = sel ? document.querySelector(sel) : document.body;\n if (!root) return \"\";\n\n const clone = root.cloneNode(true);\n\n for (const tag of TAGS) {\n for (const el of clone.querySelectorAll(tag)) el.remove();\n }\n for (const role of ROLES) {\n for (const el of clone.querySelectorAll('[role=\"' + role + '\"]')) el.remove();\n }\n\n let text = clone.textContent || \"\";\n text = text.replace(/\\\\u00a0/g, \" \");\n text = text.replace(/[ \\\\t]+/g, \" \");\n text = text.replace(/\\\\n[ ]+/g, \"\\\\n\");\n text = text.replace(/[ ]+\\\\n/g, \"\\\\n\");\n text = text.replace(/\\\\n{2,}/g, \"\\\\n\");\n return text.trim();\n}\n`;\n\n/**\n * Extract clean text from a live Playwright Page (runs in browser context).\n * Optionally scoped to a CSS selector. Returns empty string on failure.\n */\nexport async function extractTextFromPage(\n page: Page,\n selector?: string,\n): Promise<string> {\n const text = await page.evaluate<string, string | null>(\n new Function(\"sel\", `return (${BROWSER_EXTRACT_FN})(sel)`) as (sel: string | null) => string,\n selector ?? null,\n );\n\n return text ?? \"\";\n}\n", "import { logDebug } from \"../../components/logger.js\";\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport * as net from \"node:net\";\n\nconst TAG = \"browser_ipc\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { BrowserAction, BrowserToolResult } from \"../../types/browser.js\";\nimport type { BrowserTool } from \"./browser-tool.js\";\nimport { abtarsHome } from \"../../paths.js\";\n\nconst LOG_PREFIX = \"[browser-ipc]\";\n\n/** Default socket path: ~/.abtars/browser.sock */\nexport function getDefaultSocketPath(): string {\n return path.join(abtarsHome(), \"browser-socket\", \"browser.sock\");\n}\n\n/**\n * Unix domain socket server that routes BrowserAction requests\n * to a BrowserTool instance, enabling session persistence across\n * CLI invocations.\n *\n * Protocol: client connects \u2192 sends one JSON line \u2192 receives one JSON line \u2192 connection closes.\n */\nexport class BrowserIpcServer {\n private _server: net.Server | null = null;\n private readonly _tool: BrowserTool;\n private readonly _socketPath: string;\n\n constructor(tool: BrowserTool, socketPath?: string) {\n this._tool = tool;\n this._socketPath = socketPath ?? getDefaultSocketPath();\n }\n\n get socketPath(): string {\n return this._socketPath;\n }\n\n get isListening(): boolean {\n return this._server?.listening ?? false;\n }\n\n /** Start listening. Removes stale socket file if present. */\n async start(): Promise<void> {\n // Ensure parent directory exists.\n const dir = path.dirname(this._socketPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Remove stale socket file from a previous run.\n this._removeSocketFile();\n\n return new Promise<void>((resolve, reject) => {\n const server = net.createServer({ allowHalfOpen: true }, (conn) => {\n this._handleConnection(conn);\n });\n\n server.on(\"error\", (err) => {\n console.error(`${LOG_PREFIX} Server error: ${err.message}`);\n reject(err);\n });\n\n server.listen(this._socketPath, () => {\n this._server = server;\n logDebug(\"browser\", `${LOG_PREFIX} Listening on ${this._socketPath}`);\n resolve();\n });\n });\n }\n\n /** Stop the server and remove the socket file. */\n async shutdown(): Promise<void> {\n return new Promise<void>((resolve) => {\n if (!this._server) {\n this._removeSocketFile();\n resolve();\n return;\n }\n\n this._server.close(() => {\n this._server = null;\n this._removeSocketFile();\n logDebug(\"browser\", `${LOG_PREFIX} Shut down`);\n resolve();\n });\n });\n }\n\n // \u2500\u2500 Connection handler \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _handleConnection(conn: net.Socket): void {\n let data = \"\";\n\n conn.on(\"data\", (chunk) => {\n data += chunk.toString();\n });\n\n conn.on(\"end\", () => {\n void this._processRequest(data, conn);\n });\n\n conn.on(\"error\", (err) => {\n console.error(`${LOG_PREFIX} Connection error: ${err.message}`);\n });\n }\n\n private async _processRequest(\n raw: string,\n conn: net.Socket,\n ): Promise<void> {\n let result: BrowserToolResult;\n\n try {\n const action = JSON.parse(raw.trim()) as BrowserAction;\n result = await this._tool.execute(action);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n result = { success: false, error: `IPC parse/execute error: ${message}` };\n }\n\n conn.end(JSON.stringify(result) + \"\\n\");\n }\n\n // \u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private _removeSocketFile(): void {\n try {\n if (fs.existsSync(this._socketPath)) {\n fs.unlinkSync(this._socketPath);\n }\n } catch (err) {\n logAndSwallow(TAG, \"unlink socket\", err);\n }\n }\n}\n", "import { getEnv } from \"../../components/env-schema.js\";\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\n\nconst TAG = \"domain_allowlist\";\n/**\n * Validates URLs against a configurable allowlist of domain patterns.\n * Prevents the agent from navigating to arbitrary domains.\n *\n * Pattern matching:\n * - `*.example.com` \u2192 matches any subdomain of example.com\n * - `example.com` \u2192 exact match only\n * - Empty list \u2192 open mode (all domains allowed)\n */\nexport class DomainAllowlist {\n private readonly _patterns: string[];\n\n constructor(patterns: string[]) {\n this._patterns = patterns\n .map((p) => p.trim().toLowerCase())\n .filter((p) => p.length > 0);\n }\n\n /** Check if a URL's hostname matches the allowlist. Returns true if allowed. */\n isAllowed(url: string): boolean {\n if (this._patterns.length === 0) return true;\n\n let hostname: string;\n try {\n hostname = new URL(url).hostname.toLowerCase();\n } catch (err) {\n logAndSwallow(TAG, \"parse URL\", err);\n return false;\n }\n\n return this._patterns.some((pattern) => {\n if (pattern.startsWith(\"*.\")) {\n const suffix = pattern.slice(2); // e.g. \"example.com\"\n return hostname === suffix || hostname.endsWith(`.${suffix}`);\n }\n return hostname === pattern;\n });\n }\n\n /** Get the list of configured patterns (for error messages). */\n get patterns(): string[] {\n return [...this._patterns];\n }\n\n /** True if no patterns configured (open mode). */\n get isOpenMode(): boolean {\n return this._patterns.length === 0;\n }\n\n /** Create a DomainAllowlist from the BROWSER_ALLOWED_DOMAINS env var. */\n static fromEnv(): DomainAllowlist {\n const raw = getEnv().browserAllowedDomains;\n const patterns = raw.split(\",\").map((s) => s.trim()).filter((s) => s.length > 0);\n return new DomainAllowlist(patterns);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["TAG", "path", "TAG", "LOG_PREFIX", "resolve", "TAG"]
7
+ }