@gguf/claw 2026.2.9 → 2026.2.13

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 (715) hide show
  1. package/CHANGELOG.md +159 -0
  2. package/LICENSE +1 -1
  3. package/dist/{accounts-MyAvfCVH.js → accounts-54zZMYCo.js} +5 -2
  4. package/dist/{accounts-DbzMEfKN.js → accounts-Bvh0DFxS.js} +5 -2
  5. package/dist/{acp-cli-MZ3h1E1n.js → acp-cli-BslcOPdx.js} +146 -25
  6. package/dist/{acp-cli-DKJRTfwB.js → acp-cli-D6rk5cOh.js} +145 -24
  7. package/dist/{agent-whSJT2Lk.js → agent-C0yL70cy.js} +26 -20
  8. package/dist/{agent-c1QNeDmV.js → agent-DjZxytiC.js} +26 -20
  9. package/dist/{agent-scope-D3me2AZa.js → agent-scope-Bkr9fZtl.js} +31 -14
  10. package/dist/{agent-scope-Dp8sREli.js → agent-scope-DASgjz2_.js} +199 -14
  11. package/dist/{agent-scope-DnyDZ5RH.js → agent-scope-GYIs5dyU.js} +30 -13
  12. package/dist/{agent-scope-Dpav7C-i.js → agent-scope-okUOVjE5.js} +32 -11
  13. package/dist/audio-preflight-B0kLz-Ma.js +60 -0
  14. package/dist/audio-preflight-BCs_J33s.js +60 -0
  15. package/dist/audio-preflight-CTl2RCyF.js +71 -0
  16. package/dist/audio-preflight-MhF6YlAY.js +74 -0
  17. package/dist/{audit-BFYy1qSw.js → audit-BYfhZ7LA.js} +454 -31
  18. package/dist/{audit-Dn2cBl2x.js → audit-CfPZ_5Id.js} +452 -29
  19. package/dist/auth-9nTeB2Je.js +602 -0
  20. package/dist/auth-CLhyWwAU.js +593 -0
  21. package/dist/{auth-health-Cx5exPMV.js → auth-health-CWiLyzSr.js} +1 -1
  22. package/dist/{auth-health-DjT4fUpw.js → auth-health-qD4RND47.js} +1 -1
  23. package/dist/{auth-profiles-FJ3VY25a.js → auth-profiles-Cp9MtUdM.js} +353 -33
  24. package/dist/build-info.json +2 -2
  25. package/dist/bundled/boot-md/handler.js +33 -25
  26. package/dist/bundled/session-memory/handler.js +33 -22
  27. package/dist/{call-CD2IZCHT.js → call-CjEdFGAf.js} +7 -7
  28. package/dist/{call-CM25qgxz.js → call-DAfkvtVq.js} +6 -6
  29. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  30. package/dist/canvas-host/a2ui/a2ui.bundle.js +7 -1
  31. package/dist/{channel-options-CremuJyh.js → channel-options-B8dPzlyO.js} +4 -4
  32. package/dist/{channel-options-D-JnJ4Ft.js → channel-options-Bq5IC5Tv.js} +12 -7
  33. package/dist/{channel-selection-DAHCVAX4.js → channel-selection-BaW1xXEa.js} +2 -2
  34. package/dist/{channel-selection-DPV9hvY8.js → channel-selection-dR0jCgTn.js} +2 -2
  35. package/dist/{channels-cli-6deHFr9t.js → channels-cli-hPo28hWS.js} +61 -56
  36. package/dist/{channels-cli-D3tKmhlt.js → channels-cli-zi3rO0jq.js} +62 -57
  37. package/dist/{channels-status-issues-BN1ICfdy.js → channels-status-issues-kb-M2Fi0.js} +1 -1
  38. package/dist/{channels-status-issues-DFhI_u0p.js → channels-status-issues-ketdwZun.js} +1 -1
  39. package/dist/{chrome-B2UjqY-9.js → chrome--Fe8F5Kf.js} +24 -12
  40. package/dist/{chrome-COabMr6f.js → chrome-BWeMtFGf.js} +24 -12
  41. package/dist/{chrome-CQd_MVOA.js → chrome-Bx24uq7B.js} +27 -15
  42. package/dist/{chrome-CxRJz4ZD.js → chrome-n_3rtK2c.js} +22 -11
  43. package/dist/{clack-prompter-BkNZ4Xdw.js → clack-prompter-B-tJmODa.js} +5 -5
  44. package/dist/{clack-prompter-DuBVnTKy.js → clack-prompter-DpuKn_Uy.js} +5 -5
  45. package/dist/cli/daemon-cli.js +8 -1
  46. package/dist/cli-9lwO6Ttx.js +94 -0
  47. package/dist/cli-CNNdyxPO.js +91 -0
  48. package/dist/{client-DMloFP_O.js → client-BhZjzrH2.js} +73 -9
  49. package/dist/{client-C0gQ7hrj.js → client-DyAxKXKY.js} +73 -9
  50. package/dist/{command-format-ayFsmwwz.js → command-format-Bxe0mWee.js} +1 -1
  51. package/dist/{command-options-BQdH6qnK.js → command-options-BDV7Xgs-.js} +9 -4
  52. package/dist/{commands-BWHYcc83.js → commands-gOiRcfoU.js} +4 -4
  53. package/dist/{tui-formatters-BDP_71Xt.js → commands-registry-6NUFrejL.js} +6 -114
  54. package/dist/{tui-formatters-CIx4sCQO.js → commands-registry-DGgkLQ7A.js} +6 -114
  55. package/dist/{completion-cli-DEJia0V1.js → completion-cli-B1kHKJZX.js} +30 -30
  56. package/dist/{completion-cli-D_0fx2O6.js → completion-cli-Drks7xRK.js} +3 -3
  57. package/dist/{config-CQt4vGxI.js → config-7NCznPmF.js} +336 -97
  58. package/dist/{config-fCnPoWjU.js → config-B8v0zg48.js} +295 -99
  59. package/dist/{config-Bj2eDa02.js → config-CeWMHOiQ.js} +295 -99
  60. package/dist/{config-ethqi73X.js → config-D8pgDSNo.js} +358 -99
  61. package/dist/{config-guard-BJuqQvng.js → config-guard-RbHxYc9j.js} +212 -63
  62. package/dist/{configure-skrLiSwW.js → configure-DLp2Xz7L.js} +59 -40
  63. package/dist/{configure-C-pYuYg_.js → configure-Su1S0gi-.js} +58 -39
  64. package/dist/control-auth-BlWU-jBl.js +54 -0
  65. package/dist/control-auth-C8rIqEdA.js +54 -0
  66. package/dist/{control-service-BDgF-FZ0.js → control-service-BNDthc1N.js} +11 -5
  67. package/dist/{control-service-Djd_WI3_.js → control-service-COF59GQe.js} +10 -4
  68. package/dist/control-ui/assets/{index-CnB9IO4a.js → index-BECn2L1T.js} +369 -368
  69. package/dist/control-ui/assets/index-BECn2L1T.js.map +1 -0
  70. package/dist/control-ui/assets/index-DRPcd1Z4.css +1 -0
  71. package/dist/control-ui/index.html +2 -2
  72. package/dist/{cron-cli-CB6CufAb.js → cron-cli-CSy4-JGS.js} +20 -20
  73. package/dist/{cron-cli-Db6fardJ.js → cron-cli-Db3uCDIT.js} +21 -21
  74. package/dist/{daemon-cli-Xe22v7lZ.js → daemon-cli-BLbzcTuD.js} +61 -22
  75. package/dist/{daemon-cli-BlHK0ly2.js → daemon-cli-DR0D35MO.js} +60 -21
  76. package/dist/{daemon-runtime-CMqH8BUE.js → daemon-runtime-ZWXvLDxx.js} +3 -3
  77. package/dist/{daemon-runtime-DwQFvDXZ.js → daemon-runtime-pVcZ2KDE.js} +3 -3
  78. package/dist/{deliver-CD7-BhYD.js → deliver-BHNoC9Yk.js} +396 -290
  79. package/dist/{deliver-BdGjIcTC.js → deliver-C_5eGQrX.js} +392 -286
  80. package/dist/{deliver-nTKaXF--.js → deliver-DPHZlWgr.js} +392 -287
  81. package/dist/{deliver-CDMGxRoW.js → deliver-geVWJ52I.js} +394 -288
  82. package/dist/{deps-BDQ_K8zf.js → deps-CP0dcOgD.js} +2 -2
  83. package/dist/{deps-D60FbgTP.js → deps-DW5r2IEk.js} +2 -2
  84. package/dist/{devices-cli-N559801X.js → devices-cli-BViqX5pl.js} +15 -15
  85. package/dist/{devices-cli-IxmPLIk8.js → devices-cli-DpYaY-iM.js} +14 -14
  86. package/dist/{directory-cli-Caq-OYk8.js → directory-cli-BWD1DdKf.js} +16 -16
  87. package/dist/{directory-cli-ClrdmQL-.js → directory-cli-BcvZfkfo.js} +17 -17
  88. package/dist/{dispatcher-BfXtm4Dl.js → dispatcher-4Qn951N3.js} +5 -3
  89. package/dist/{dns-cli-DgVO0Pkw.js → dns-cli-_Ych2tu9.js} +12 -12
  90. package/dist/{dns-cli-BTNZkWHs.js → dns-cli-gQCxUXgU.js} +13 -13
  91. package/dist/{docs-cli-9Xan7C6D.js → docs-cli-Bseiau7J.js} +7 -7
  92. package/dist/{docs-cli-DZULc91f.js → docs-cli-DzBTlWQE.js} +8 -8
  93. package/dist/{doctor-D39rZvNH.js → doctor-BNkYYahD.js} +37 -36
  94. package/dist/{doctor-Dq1YeYdH.js → doctor-DzIgdPx1.js} +37 -36
  95. package/dist/entry.js +77 -21
  96. package/dist/{env-B5YXooWp.js → env-BUuSkE19.js} +1 -1
  97. package/dist/{exec-DFOtZbI0.js → exec-BPQSKwGa.js} +5 -3
  98. package/dist/{exec-B8JKbXKW.js → exec-DqZFMawz.js} +5 -3
  99. package/dist/{exec-Bas1hoSJ.js → exec-EKUaAU91.js} +57 -18
  100. package/dist/{exec-CiH_vkWn.js → exec-_PSUrMP8.js} +528 -19
  101. package/dist/{exec-approvals-DGPTjO0N.js → exec-approvals-Bqk-tIxY.js} +134 -51
  102. package/dist/{exec-approvals-C9InMoAB.js → exec-approvals-C67V-ljH.js} +134 -51
  103. package/dist/{exec-approvals-cli-EASbqFd-.js → exec-approvals-cli-D6vfSqQu.js} +22 -22
  104. package/dist/{exec-approvals-cli-DPHItoxG.js → exec-approvals-cli-DAdoki_R.js} +21 -21
  105. package/dist/extensionAPI.js +8518 -9140
  106. package/dist/fetch-Bz1WxfzV.js +285 -0
  107. package/dist/fetch-D2O8s8I1.js +285 -0
  108. package/dist/fetch-Dm-nCwa_.js +285 -0
  109. package/dist/fetch-wuOZDzdT.js +285 -0
  110. package/dist/{gateway-cli-BFqUIif8.js → gateway-cli-C-k7JPlr.js} +1868 -1072
  111. package/dist/{gateway-cli-v4kSPsLE.js → gateway-cli-DIIJ9Z0Y.js} +1870 -1074
  112. package/dist/{gateway-rpc-D6LrkcSA.js → gateway-rpc-D6jLh81b.js} +3 -3
  113. package/dist/{gateway-rpc-dHFK02Kk.js → gateway-rpc-aqysUyf5.js} +3 -3
  114. package/dist/{github-copilot-auth-CQIWc0hC.js → github-copilot-auth-BUqfX7hG.js} +316 -52
  115. package/dist/{github-copilot-auth-D2jfnapd.js → github-copilot-auth-By-nyRb6.js} +316 -52
  116. package/dist/{github-copilot-token-SLWintYd.js → github-copilot-token-C9W4SY9o.js} +7 -4
  117. package/dist/{github-copilot-token-BW-SEg7E.js → github-copilot-token-CiF5Iyi2.js} +6 -3
  118. package/dist/{github-copilot-token-C9IJh2Pn.js → github-copilot-token-DatTe1w-.js} +6 -3
  119. package/dist/{github-copilot-token-wCk9Fg_E.js → github-copilot-token-c9Igt3ZH.js} +6 -3
  120. package/dist/{gmail-setup-utils-CVNgLkXL.js → gmail-setup-utils-HvKMdooP.js} +4 -4
  121. package/dist/{gmail-setup-utils-CAM1vbUS.js → gmail-setup-utils-c-iF00aL.js} +3 -3
  122. package/dist/{health-format-C77hrjEQ.js → health-format-BORnJOeS.js} +106 -44
  123. package/dist/{health-format-DDYtlkB9.js → health-format-Nd0jcoqM.js} +105 -43
  124. package/dist/{help-format-CUnac_bT.js → help-format-Cd5PLwXe.js} +1 -1
  125. package/dist/{help-format-aiW76js8.js → help-format-DYBEvMOX.js} +1 -1
  126. package/dist/{hooks-cli-DsflBRxX.js → hooks-cli-3KdsbdRi.js} +53 -47
  127. package/dist/{hooks-cli-C7kctMuZ.js → hooks-cli-BThja6wK.js} +53 -47
  128. package/dist/{hooks-status-DRAVHSPg.js → hooks-status-BbIz0zmm.js} +6 -5
  129. package/dist/{hooks-status-lHWrY64E.js → hooks-status-DPJORMB6.js} +6 -5
  130. package/dist/{image--gbzucyh.js → image-BaJKrmCs.js} +12 -8
  131. package/dist/{image-ORs4LLwg.js → image-D-5pUELC.js} +13 -9
  132. package/dist/{image-DMnjYGdA.js → image-TvL5YI_W.js} +13 -9
  133. package/dist/{image-BVNytEIn.js → image-bodq5cUH.js} +13 -9
  134. package/dist/index.js +261 -109
  135. package/dist/{installs-CXGV291R.js → installs-BrOMqREO.js} +7 -6
  136. package/dist/{installs-89zeUsVn.js → installs-z69au9Te.js} +7 -6
  137. package/dist/{links-Dg90NTyF.js → links-AVB88xxH.js} +1 -1
  138. package/dist/{links-7M-j83As.js → links-DpxpaKe1.js} +1 -1
  139. package/dist/llm-slug-generator.js +18 -19
  140. package/dist/{loader-BnzQyT31.js → loader-CS-5lMQa.js} +3694 -4531
  141. package/dist/{logging-DuK6YXuK.js → logging-B3KnAryz.js} +2 -2
  142. package/dist/{logging-CNq0UUgf.js → logging-DEPo2hji.js} +1 -1
  143. package/dist/{login-qr-CJ__cE3-.js → login-qr--28WL1TN.js} +11 -5
  144. package/dist/{login-qr-BVeOFfNW.js → login-qr-4o2aC2UE.js} +9 -4
  145. package/dist/{login-qr-BJChByHH.js → login-qr-BUdeu1Sl.js} +8 -2
  146. package/dist/{login-qr-KUOtNJaQ.js → login-qr-BsYM2E1y.js} +12 -6
  147. package/dist/{logs-cli-Cm7AiarR.js → logs-cli-DDMD5w5_.js} +38 -22
  148. package/dist/{logs-cli-BWmtAsjp.js → logs-cli-DvPoVKCN.js} +38 -22
  149. package/dist/{manager-C-jXr9ks.js → manager-CXo1uqmO.js} +102 -86
  150. package/dist/{manager-CMFBuvVd.js → manager-ChW0jk7T.js} +101 -85
  151. package/dist/{manager-D2Ndphg3.js → manager-DUOe7ud6.js} +100 -85
  152. package/dist/{manager-BsdlwsL5.js → manager-PoxUqdN_.js} +98 -82
  153. package/dist/{manifest-registry-D5SiA3xq.js → manifest-registry-CVsqjgX0.js} +40 -2
  154. package/dist/{manifest-registry-DyMRD3rY.js → manifest-registry-jeAPx6AW.js} +40 -2
  155. package/dist/{message-channel-CHRYQtAM.js → message-channel-CTtrEkmW.js} +1 -1
  156. package/dist/{message-channel-BlgPSDAh.js → message-channel-DWcu72r7.js} +1 -1
  157. package/dist/{model-auth-BqjMkNFs.js → model-auth-BvODRbV0.js} +362 -35
  158. package/dist/{model-selection-DbsbOAoh.js → model-selection-B53OvWCf.js} +353 -33
  159. package/dist/{model-selection-DlV6wnTr.js → model-selection-vC82fEiP.js} +331 -30
  160. package/dist/{models-cli-DIFBrK4W.js → models-cli-DqsKsOgd.js} +66 -55
  161. package/dist/{models-cli-0XhQQbMW.js → models-cli-NV0bnh8l.js} +66 -55
  162. package/dist/{node-cli-BMUfVCSq.js → node-cli-C7YleuBk.js} +54 -44
  163. package/dist/{node-cli-DY4lzhDA.js → node-cli-CxwoHnZ6.js} +54 -44
  164. package/dist/{node-service-DQ-tiSie.js → node-service-C7f_uvx9.js} +2 -2
  165. package/dist/{node-service-u8g85nD3.js → node-service-De_WkxJe.js} +2 -2
  166. package/dist/{nodes-cli-BX6oWnLC.js → nodes-cli-BxrMVI9V.js} +25 -23
  167. package/dist/{nodes-cli-CVHzcQo2.js → nodes-cli-Clb0ocwB.js} +24 -22
  168. package/dist/{nodes-screen-DGlNPbk4.js → nodes-screen-CVL9363A.js} +48 -6
  169. package/dist/{nodes-screen-lykd2cny.js → nodes-screen-DsHJIN2I.js} +47 -5
  170. package/dist/{note-Ci08TSbV.js → note-Duiadw1g.js} +1 -1
  171. package/dist/{note-DVO1KLaW.js → note-uC6iDp4y.js} +2 -2
  172. package/dist/{onboard-channels-DTkFFbzS.js → onboard-channels-C5Iaafwb.js} +10 -10
  173. package/dist/{onboard-channels-CtDnwaF5.js → onboard-channels-C5uL3i8d.js} +11 -11
  174. package/dist/{onboard-skills-BnAcpzfX.js → onboard-skills-BFxdI1Y1.js} +1143 -112
  175. package/dist/{onboard-skills-DuoDzEmI.js → onboard-skills-DUG8Y0se.js} +1142 -111
  176. package/dist/{onboarding-DvhiiHh0.js → onboarding-ClzElK4D.js} +56 -48
  177. package/dist/{openclaw-root-93W6UrUK.js → openclaw-root-BKsZvO6K.js} +6 -2
  178. package/dist/{openclaw-root-9ILYSmJ9.js → openclaw-root-CEnmuBUN.js} +6 -2
  179. package/dist/{pairing-cli-BKJHBxwT.js → pairing-cli-BWWFZF7Q.js} +16 -16
  180. package/dist/{pairing-cli-DJHjPBwu.js → pairing-cli-BrFLxnug.js} +16 -16
  181. package/dist/{pairing-labels-xImhiJax.js → pairing-labels-C8KULWNH.js} +1 -1
  182. package/dist/{pairing-labels-CHxlh3tT.js → pairing-labels-Dt2vXyI7.js} +1 -1
  183. package/dist/{pairing-store-CO6umWFP.js → pairing-store-Dz-ArTQS.js} +3 -3
  184. package/dist/{pairing-store-BpPUNzmB.js → pairing-store-gQdv7Ruh.js} +2 -2
  185. package/dist/{path-env-Nq83EHH9.js → path-env-BRKerjt1.js} +2 -2
  186. package/dist/{path-env-CXWUFfFv.js → path-env-OJAyUeWW.js} +1 -1
  187. package/dist/paths-BZK4Ct0I.js +81 -0
  188. package/dist/paths-DWYi0R_2.js +78 -0
  189. package/dist/{paths-Bkhd_qY8.js → paths-DdKf4lHp.js} +35 -5
  190. package/dist/paths-SFzVNGbc.js +78 -0
  191. package/dist/pi-auth-json-D7hGObyW.js +12 -0
  192. package/dist/pi-auth-json-DgvHjfJy.js +8 -0
  193. package/dist/pi-auth-json-la6lnAzY.js +79 -0
  194. package/dist/pi-auth-json-p3vsMR7W.js +79 -0
  195. package/dist/{pi-embedded-C1qKCgDT.js → pi-embedded-De6SeAPs.js} +9518 -9968
  196. package/dist/{pi-embedded-helpers-DtPn5RC8.js → pi-embedded-helpers-BrUBxrE2.js} +70 -10
  197. package/dist/{pi-embedded-helpers-DhEkdWB1.js → pi-embedded-helpers-D0mqOwwq.js} +821 -128
  198. package/dist/{pi-embedded-helpers-7AjuNiiJ.js → pi-embedded-helpers-DpJb0kUk.js} +69 -9
  199. package/dist/{pi-embedded-helpers-BTkXgwJ7.js → pi-embedded-helpers-ZI1UCSRM.js} +927 -136
  200. package/dist/{pi-tools.policy-gG96mWwA.js → pi-tools.policy-z5Wd_2WN.js} +4 -4
  201. package/dist/{plugin-auto-enable-D5ye7QnB.js → plugin-auto-enable-B8mX3rX3.js} +14 -5
  202. package/dist/{plugin-auto-enable-BROgMZcf.js → plugin-auto-enable-OO0eDINB.js} +14 -5
  203. package/dist/plugin-sdk/agents/apply-patch-update.d.ts +3 -1
  204. package/dist/plugin-sdk/agents/apply-patch.d.ts +11 -3
  205. package/dist/plugin-sdk/agents/auth-profiles/profiles.d.ts +5 -0
  206. package/dist/plugin-sdk/agents/auth-profiles.d.ts +1 -1
  207. package/dist/plugin-sdk/agents/bash-process-registry.d.ts +1 -0
  208. package/dist/plugin-sdk/agents/bash-tools.exec.d.ts +26 -0
  209. package/dist/plugin-sdk/agents/current-time.d.ts +17 -0
  210. package/dist/plugin-sdk/agents/huggingface-models.d.ts +17 -0
  211. package/dist/plugin-sdk/agents/models-config.providers.d.ts +10 -0
  212. package/dist/plugin-sdk/agents/openclaw-tools.d.ts +2 -0
  213. package/dist/plugin-sdk/agents/pi-auth-json.d.ts +14 -0
  214. package/dist/plugin-sdk/agents/pi-embedded-helpers/errors.d.ts +5 -1
  215. package/dist/plugin-sdk/agents/pi-embedded-helpers.d.ts +1 -1
  216. package/dist/plugin-sdk/agents/pi-embedded-runner/google.d.ts +1 -0
  217. package/dist/plugin-sdk/agents/pi-embedded-runner/run/images.d.ts +9 -4
  218. package/dist/plugin-sdk/agents/pi-embedded-runner/run/params.d.ts +2 -0
  219. package/dist/plugin-sdk/agents/pi-embedded-runner/run/payloads.d.ts +1 -0
  220. package/dist/plugin-sdk/agents/pi-embedded-runner/run/types.d.ts +2 -0
  221. package/dist/plugin-sdk/agents/pi-embedded-runner/types.d.ts +15 -0
  222. package/dist/plugin-sdk/agents/pi-embedded-subscribe.handlers.tools.d.ts +1 -1
  223. package/dist/plugin-sdk/agents/pi-embedded-subscribe.handlers.types.d.ts +2 -0
  224. package/dist/plugin-sdk/agents/pi-embedded-subscribe.types.d.ts +2 -0
  225. package/dist/plugin-sdk/agents/pi-tools.read.d.ts +8 -3
  226. package/dist/plugin-sdk/agents/sandbox/constants.d.ts +1 -1
  227. package/dist/plugin-sdk/agents/sandbox/docker.d.ts +14 -3
  228. package/dist/plugin-sdk/agents/sandbox/fs-bridge.d.ts +56 -0
  229. package/dist/plugin-sdk/agents/sandbox/types.d.ts +2 -0
  230. package/dist/plugin-sdk/agents/session-tool-result-guard-wrapper.d.ts +2 -0
  231. package/dist/plugin-sdk/agents/session-tool-result-guard.d.ts +4 -0
  232. package/dist/plugin-sdk/agents/subagent-registry.d.ts +3 -1
  233. package/dist/plugin-sdk/agents/tools/agent-step.d.ts +3 -0
  234. package/dist/plugin-sdk/agents/tools/browser-tool.schema.d.ts +2 -2
  235. package/dist/plugin-sdk/agents/tools/common.d.ts +4 -0
  236. package/dist/plugin-sdk/agents/tools/image-tool.d.ts +9 -1
  237. package/dist/plugin-sdk/agents/tools/web-search.d.ts +10 -1
  238. package/dist/plugin-sdk/agents/usage.d.ts +1 -0
  239. package/dist/plugin-sdk/auto-reply/reply/commands-status.d.ts +1 -0
  240. package/dist/plugin-sdk/auto-reply/reply/get-reply-directives.d.ts +1 -0
  241. package/dist/plugin-sdk/auto-reply/reply/memory-flush.d.ts +2 -2
  242. package/dist/plugin-sdk/auto-reply/reply/mentions.d.ts +1 -0
  243. package/dist/plugin-sdk/auto-reply/reply/model-selection.d.ts +3 -0
  244. package/dist/plugin-sdk/auto-reply/reply/reply-reference.d.ts +1 -1
  245. package/dist/plugin-sdk/auto-reply/reply/session-run-accounting.d.ts +11 -0
  246. package/dist/plugin-sdk/auto-reply/reply/session-usage.d.ts +8 -0
  247. package/dist/plugin-sdk/auto-reply/status.d.ts +2 -0
  248. package/dist/plugin-sdk/auto-reply/templating.d.ts +3 -0
  249. package/dist/plugin-sdk/auto-reply/thinking.d.ts +1 -1
  250. package/dist/plugin-sdk/auto-reply/types.d.ts +2 -0
  251. package/dist/plugin-sdk/browser/cdp.helpers.d.ts +2 -1
  252. package/dist/plugin-sdk/browser/client-actions-core.d.ts +1 -0
  253. package/dist/plugin-sdk/browser/control-auth.d.ts +13 -0
  254. package/dist/plugin-sdk/browser/pw-ai.d.ts +1 -1
  255. package/dist/plugin-sdk/browser/pw-session.d.ts +25 -0
  256. package/dist/plugin-sdk/browser/pw-tools-core.interactions.d.ts +2 -0
  257. package/dist/plugin-sdk/browser/routes/dispatcher.d.ts +1 -0
  258. package/dist/plugin-sdk/browser/routes/types.d.ts +5 -0
  259. package/dist/plugin-sdk/channels/plugins/onboarding/signal.d.ts +1 -0
  260. package/dist/plugin-sdk/channels/registry.d.ts +2 -2
  261. package/dist/plugin-sdk/cli/nodes-camera.d.ts +8 -2
  262. package/dist/plugin-sdk/cli/prompt.d.ts +1 -0
  263. package/dist/plugin-sdk/commands/agent/types.d.ts +2 -0
  264. package/dist/plugin-sdk/commands/onboard-helpers.d.ts +1 -0
  265. package/dist/plugin-sdk/commands/onboard-types.d.ts +9 -1
  266. package/dist/plugin-sdk/commands/signal-install.d.ts +20 -0
  267. package/dist/plugin-sdk/config/config.d.ts +1 -1
  268. package/dist/plugin-sdk/config/group-policy.d.ts +3 -0
  269. package/dist/plugin-sdk/config/merge-patch.d.ts +1 -0
  270. package/dist/plugin-sdk/config/sessions/paths.d.ts +14 -4
  271. package/dist/plugin-sdk/config/sessions/store.d.ts +8 -0
  272. package/dist/plugin-sdk/config/sessions/types.d.ts +8 -0
  273. package/dist/plugin-sdk/config/types.agents.d.ts +2 -0
  274. package/dist/plugin-sdk/config/types.channels.d.ts +2 -0
  275. package/dist/plugin-sdk/config/types.d.ts +1 -0
  276. package/dist/plugin-sdk/config/types.discord.d.ts +5 -0
  277. package/dist/plugin-sdk/config/types.gateway.d.ts +35 -0
  278. package/dist/plugin-sdk/config/types.hooks.d.ts +23 -1
  279. package/dist/plugin-sdk/config/types.irc.d.ts +96 -0
  280. package/dist/plugin-sdk/config/types.memory.d.ts +2 -0
  281. package/dist/plugin-sdk/config/types.openclaw.d.ts +6 -0
  282. package/dist/plugin-sdk/config/types.queue.d.ts +1 -0
  283. package/dist/plugin-sdk/config/types.slack.d.ts +2 -0
  284. package/dist/plugin-sdk/config/types.telegram.d.ts +2 -0
  285. package/dist/plugin-sdk/config/validation.d.ts +20 -0
  286. package/dist/plugin-sdk/config/zod-schema.agents.d.ts +1 -0
  287. package/dist/plugin-sdk/config/zod-schema.core.d.ts +2 -0
  288. package/dist/plugin-sdk/config/zod-schema.d.ts +193 -2
  289. package/dist/plugin-sdk/config/zod-schema.hooks.d.ts +3 -2
  290. package/dist/plugin-sdk/config/zod-schema.providers-core.d.ts +378 -0
  291. package/dist/plugin-sdk/config/zod-schema.providers.d.ts +176 -0
  292. package/dist/plugin-sdk/config/zod-schema.sensitive.d.ts +2 -0
  293. package/dist/plugin-sdk/config/zod-schema.session.d.ts +1 -0
  294. package/dist/plugin-sdk/cron/service/jobs.d.ts +8 -0
  295. package/dist/plugin-sdk/cron/service/state.d.ts +1 -0
  296. package/dist/plugin-sdk/cron/types.d.ts +2 -0
  297. package/dist/plugin-sdk/discord/monitor/allow-list.d.ts +15 -0
  298. package/dist/plugin-sdk/discord/send.types.d.ts +5 -0
  299. package/dist/plugin-sdk/gateway/auth-rate-limit.d.ts +59 -0
  300. package/dist/plugin-sdk/gateway/auth.d.ts +47 -0
  301. package/dist/plugin-sdk/gateway/net.d.ts +5 -0
  302. package/dist/plugin-sdk/gateway/protocol/index.d.ts +7 -7
  303. package/dist/plugin-sdk/gateway/protocol/schema/agent.d.ts +7 -1
  304. package/dist/plugin-sdk/gateway/protocol/schema/channels.d.ts +21 -0
  305. package/dist/plugin-sdk/gateway/protocol/schema/types.d.ts +3 -1
  306. package/dist/plugin-sdk/gateway/session-utils.fs.d.ts +3 -1
  307. package/dist/plugin-sdk/gateway/session-utils.types.d.ts +1 -0
  308. package/dist/plugin-sdk/imessage/send.d.ts +12 -0
  309. package/dist/plugin-sdk/index.js +2147 -900
  310. package/dist/plugin-sdk/infra/binaries.d.ts +3 -0
  311. package/dist/plugin-sdk/infra/brew.d.ts +8 -0
  312. package/dist/plugin-sdk/infra/heartbeat-active-hours.d.ts +5 -0
  313. package/dist/plugin-sdk/infra/heartbeat-runner.d.ts +1 -0
  314. package/dist/plugin-sdk/infra/heartbeat-wake.d.ts +8 -1
  315. package/dist/plugin-sdk/infra/net/fetch-guard.d.ts +1 -0
  316. package/dist/plugin-sdk/infra/net/ssrf.d.ts +1 -0
  317. package/dist/plugin-sdk/infra/outbound/message.d.ts +2 -0
  318. package/dist/plugin-sdk/infra/outbound/outbound-send-service.d.ts +2 -0
  319. package/dist/plugin-sdk/infra/session-cost-usage.d.ts +3 -0
  320. package/dist/plugin-sdk/infra/tailscale.d.ts +34 -0
  321. package/dist/plugin-sdk/infra/tmp-openclaw-dir.d.ts +10 -0
  322. package/dist/plugin-sdk/logging/console.d.ts +4 -0
  323. package/dist/plugin-sdk/logging/logger.d.ts +1 -1
  324. package/dist/plugin-sdk/logging/state.d.ts +1 -0
  325. package/dist/plugin-sdk/logging.d.ts +2 -2
  326. package/dist/plugin-sdk/markdown/ir.d.ts +1 -1
  327. package/dist/plugin-sdk/markdown/whatsapp.d.ts +14 -0
  328. package/dist/plugin-sdk/media/input-files.d.ts +5 -0
  329. package/dist/plugin-sdk/media/store.d.ts +10 -0
  330. package/dist/plugin-sdk/media-understanding/audio-preflight.d.ts +16 -0
  331. package/dist/plugin-sdk/media-understanding/types.d.ts +1 -0
  332. package/dist/plugin-sdk/memory/backend-config.d.ts +2 -1
  333. package/dist/plugin-sdk/memory/embedding-chunk-limits.d.ts +3 -0
  334. package/dist/plugin-sdk/memory/embedding-input-limits.d.ts +2 -0
  335. package/dist/plugin-sdk/memory/embedding-model-limits.d.ts +2 -0
  336. package/dist/plugin-sdk/memory/embeddings.d.ts +1 -0
  337. package/dist/plugin-sdk/memory/internal.d.ts +11 -0
  338. package/dist/plugin-sdk/memory/manager.d.ts +0 -6
  339. package/dist/plugin-sdk/memory/qmd-manager.d.ts +2 -0
  340. package/dist/plugin-sdk/memory/qmd-query-parser.d.ts +8 -0
  341. package/dist/plugin-sdk/memory/session-files.d.ts +2 -0
  342. package/dist/plugin-sdk/process/command-queue.d.ts +16 -0
  343. package/dist/plugin-sdk/providers/github-copilot-token.d.ts +3 -0
  344. package/dist/plugin-sdk/routing/resolve-route.d.ts +3 -1
  345. package/dist/plugin-sdk/security/external-content.d.ts +1 -1
  346. package/dist/plugin-sdk/security/secret-equal.d.ts +1 -0
  347. package/dist/plugin-sdk/sessions/input-provenance.d.ts +16 -0
  348. package/dist/plugin-sdk/signal/monitor/event-handler.types.d.ts +8 -0
  349. package/dist/plugin-sdk/signal/monitor/mentions.d.ts +2 -0
  350. package/dist/plugin-sdk/slack/monitor/commands.d.ts +5 -0
  351. package/dist/plugin-sdk/slack/monitor/media.d.ts +21 -0
  352. package/dist/plugin-sdk/slack/types.d.ts +1 -0
  353. package/dist/plugin-sdk/telegram/bot-message-context.d.ts +2 -1
  354. package/dist/plugin-sdk/telegram/fetch.d.ts +1 -0
  355. package/dist/plugin-sdk/telegram/monitor.d.ts +1 -0
  356. package/dist/plugin-sdk/telegram/send.d.ts +3 -0
  357. package/dist/plugin-sdk/tts/tts.d.ts +2 -2
  358. package/dist/plugin-sdk/utils/fetch-timeout.d.ts +2 -0
  359. package/dist/plugin-sdk/web/media.d.ts +12 -2
  360. package/dist/{plugins-CQw3z3Nw.js → plugins-CTjLu-z-.js} +4 -4
  361. package/dist/{plugins-B7F0Ly9G.js → plugins-CxrdL_IZ.js} +3 -3
  362. package/dist/{plugins-cli-CJ74eHvr.js → plugins-cli-CbX97Kvt.js} +259 -49
  363. package/dist/{plugins-cli-ubDwUAzK.js → plugins-cli-Dn9OeO53.js} +257 -47
  364. package/dist/{ports-kYsTYQdA.js → ports-C8YYHVlc.js} +2 -2
  365. package/dist/{program-1bQ15ivo.js → program-D-mNC0It.js} +86 -83
  366. package/dist/{progress-Da1ehW-x.js → progress-COHv-uNT.js} +1 -1
  367. package/dist/{progress-COzt9PNY.js → progress-DZb6yPcJ.js} +1 -1
  368. package/dist/{prompt-style-Dc0C5HC9.js → prompt-style-Cf1r1L6k.js} +1 -1
  369. package/dist/{prompt-style-DjZDxcFg.js → prompt-style-lSlXMhsd.js} +1 -1
  370. package/dist/{pw-ai-CQ4-gUNR.js → pw-ai-6GzTgK5g.js} +205 -32
  371. package/dist/{pw-ai-1NN0FrJb.js → pw-ai-C8YhJRaI.js} +207 -32
  372. package/dist/{pw-ai-qEMUq5Mt.js → pw-ai-CKGenizV.js} +203 -29
  373. package/dist/{pw-ai-IOqEXO1O.js → pw-ai-D7devT89.js} +206 -32
  374. package/dist/{qmd-manager-CEwp3el1.js → qmd-manager-CQzWovq-.js} +71 -90
  375. package/dist/{qmd-manager-D6N3qvQ5.js → qmd-manager-Cs8RJVQp.js} +73 -90
  376. package/dist/{qmd-manager-C48QzrRe.js → qmd-manager-DdgrQ2kc.js} +71 -88
  377. package/dist/{qmd-manager-DaUqCKB_.js → qmd-manager-dyIoOvKl.js} +73 -90
  378. package/dist/{register.subclis-Cm-VJ5nP.js → register.subclis-ifHtmF3e.js} +29 -29
  379. package/dist/{reply-CBs4e9Rm.js → reply-VIHqsQ-k.js} +7906 -8743
  380. package/dist/{routes-9ygR0GOk.js → routes-CaCvio4Q.js} +36 -15
  381. package/dist/{routes-BrWrBk2R.js → routes-Cpfxk96k.js} +36 -14
  382. package/dist/{rpc-Cjuz2Gv1.js → rpc-BhB01Bhj.js} +3 -3
  383. package/dist/{rpc-DhkLVY5H.js → rpc-C5WsS_Ne.js} +3 -3
  384. package/dist/{run-main-BlZ5l-X9.js → run-main-DVy6KJTe.js} +88 -85
  385. package/dist/runner-B7CKBC80.js +1800 -0
  386. package/dist/runner-BEy5ZGFv.js +1901 -0
  387. package/dist/runner-Bv0BmJPF.js +1800 -0
  388. package/dist/runner-ChqVEgPx.js +1901 -0
  389. package/dist/{sandbox-qt49csTr.js → sandbox-BAChxjC5.js} +627 -157
  390. package/dist/{sandbox-CPZiaKcS.js → sandbox-DNHDwHw8.js} +628 -158
  391. package/dist/{sandbox-cli-C6_iNuqO.js → sandbox-cli-9oq67QEg.js} +22 -22
  392. package/dist/{sandbox-cli-C_wK-KAE.js → sandbox-cli-BiNq9yUe.js} +22 -22
  393. package/dist/{security-cli-CTTD1vms.js → security-cli-CRg03hvq.js} +28 -28
  394. package/dist/{security-cli-DRpGF2Yc.js → security-cli-LmBBHnmh.js} +28 -28
  395. package/dist/{server-context-lyNcqJYD.js → server-context-FwqBRH3K.js} +10 -10
  396. package/dist/{server-context-39mkstUs.js → server-context-RY7lRaxl.js} +9 -9
  397. package/dist/{server-node-events-V_G9BRRw.js → server-node-events-BbHOZX3O.js} +48 -43
  398. package/dist/{server-node-events-o9G18PaE.js → server-node-events-CngNLVL-.js} +50 -45
  399. package/dist/{service-DOlJdIqe.js → service-BnqdBTAK.js} +8 -4
  400. package/dist/{service-DDPRbf8a.js → service-DZN7KRok.js} +8 -4
  401. package/dist/{service-audit-VDRrWefh.js → service-audit-0Eil3ISN.js} +4 -4
  402. package/dist/{service-audit-CVy00Ze_.js → service-audit-B8KIOe8A.js} +4 -4
  403. package/dist/{session-cost-usage-CcCEQNuc.js → session-cost-usage-B-tyjp76.js} +14 -14
  404. package/dist/{session-cost-usage-PvyVZz-g.js → session-cost-usage-BYUb7fov.js} +14 -14
  405. package/dist/{shared-BnpC3wMU.js → shared-BCdNboU1.js} +3 -3
  406. package/dist/{shared-CagUDdmp.js → shared-CsAwU6-q.js} +3 -3
  407. package/dist/{shared-BDk_zC9p.js → shared-Csn6DLBA.js} +5 -5
  408. package/dist/{shared-C92wo-6f.js → shared-DEanAgja.js} +4 -4
  409. package/dist/{skill-scanner-C_fQzVDu.js → skill-scanner-BrGkh5K7.js} +1 -1
  410. package/dist/{skill-scanner-DrVEHfC6.js → skill-scanner-CucvxYhu.js} +1 -1
  411. package/dist/{skills-Ccsv3IQq.js → skills-CE7by2IF.js} +151 -8
  412. package/dist/{skills-_eKGrw9z.js → skills-Dz15dAM4.js} +152 -9
  413. package/dist/{skills-cli-DqvLjooh.js → skills-cli-B5b75pDK.js} +13 -13
  414. package/dist/{skills-cli-DUncybht.js → skills-cli-CbCDrYwp.js} +13 -13
  415. package/dist/{skills-status-Cp2ZFhIx.js → skills-status-B99Us6yS.js} +2 -2
  416. package/dist/{skills-status-Ck0CCFZG.js → skills-status-ChM7JE47.js} +3 -3
  417. package/dist/{sqlite-DODNHWJb.js → sqlite-2UsPaJz5.js} +97 -2
  418. package/dist/{sqlite-cSdsHVEw.js → sqlite-CASnHrgX.js} +97 -1
  419. package/dist/{sqlite-Bwo2rASR.js → sqlite-CVWiMkGu.js} +97 -1
  420. package/dist/{sqlite-CpqIbY4-.js → sqlite-CcIWkGaM.js} +97 -1
  421. package/dist/{status-Bmx9_1C7.js → status-CKuX1-zb.js} +3 -3
  422. package/dist/{status-CBGgwlTW.js → status-Cm4q6o-I.js} +57 -49
  423. package/dist/{status-DkJgtvSz.js → status-DD2iqGc9.js} +4 -4
  424. package/dist/{subsystem-DPnkvS73.js → subsystem-DHfJG4gk.js} +73 -20
  425. package/dist/{system-cli-9fQ1uLiz.js → system-cli-BVJDR474.js} +87 -15
  426. package/dist/{system-cli-Gq8OWHFg.js → system-cli-C3Y_9VpI.js} +88 -16
  427. package/dist/{systemd-Pa7LURHB.js → systemd-DxddcFsa.js} +3 -3
  428. package/dist/{systemd-hints-zi4ohCOY.js → systemd-hints-BVLopJ9O.js} +1 -1
  429. package/dist/{systemd-linger-CDo2UbHM.js → systemd-linger-BThjV1Sr.js} +2 -2
  430. package/dist/{systemd-linger-6_naJcJp.js → systemd-linger-D3Va1Cv7.js} +2 -2
  431. package/dist/{systemd-BEWwfwn0.js → systemd-s3S2HVog.js} +3 -3
  432. package/dist/{table-Bb9gAVIp.js → table-BIk8Aan_.js} +2 -2
  433. package/dist/{table-cCoGqLsk.js → table-Bvka_vkc.js} +1 -1
  434. package/dist/{tool-display-DUVhO36P.js → tool-display-DbdMQFZx.js} +2 -2
  435. package/dist/{tool-display-DNOVCI6J.js → tool-display-kpW5Hg2z.js} +2 -2
  436. package/dist/{tui-DDVqLwqT.js → tui-B40Z2jMa.js} +120 -14
  437. package/dist/{tui-cli-CurbazQf.js → tui-cli-Bwa6K7xR.js} +28 -28
  438. package/dist/{tui-cli-BeN2K38I.js → tui-cli-DD6g7uZb.js} +27 -27
  439. package/dist/{tui-B9zLJxf6.js → tui-lFMZUnx6.js} +121 -13
  440. package/dist/{update-Ct9sqJC_.js → update-Bos8PPCG.js} +3 -3
  441. package/dist/{update--i077azM.js → update-Cg8MtrEr.js} +3 -3
  442. package/dist/{update-cli-CT5W0kpw.js → update-cli-CC-wTeje.js} +92 -73
  443. package/dist/{update-cli-C87lNK1S.js → update-cli-CULnXFL_.js} +91 -72
  444. package/dist/{update-runner-BIttRDyV.js → update-runner-BaLsla0c.js} +11 -11
  445. package/dist/{update-runner-xbeVkAD9.js → update-runner-Dbsdl5AU.js} +10 -10
  446. package/dist/{utils-Dk86IbEs.js → utils-BLJAc3ZV.js} +1 -1
  447. package/dist/{utils-BTaR--Ln.js → utils-BtIMES3N.js} +1 -1
  448. package/dist/{webhooks-cli-Db3zyJaw.js → webhooks-cli-ClHLUu_j.js} +21 -13
  449. package/dist/{webhooks-cli-DUUa8gVY.js → webhooks-cli-DVXr2uyN.js} +21 -13
  450. package/dist/{widearea-dns-BgYasW6m.js → widearea-dns-C4RnIR9O.js} +3 -3
  451. package/dist/{widearea-dns-CMIG6-74.js → widearea-dns-Ypwgjpsr.js} +3 -3
  452. package/dist/{ws-C0k_dhCP.js → ws-BcJt4pcg.js} +24 -2
  453. package/dist/{ws-DtDKpbLR.js → ws-MC-rTJLe.js} +24 -2
  454. package/dist/{ws-log-cMNgAyLy.js → ws-log-WrJ4QYu7.js} +1 -1
  455. package/dist/{ws-log-C6vm_XMA.js → ws-log-lip4ETlm.js} +2 -2
  456. package/dist/{wsl-rfIr_Sde.js → wsl-BvTIzy-8.js} +5 -3
  457. package/docs/assets/install-script.svg +1 -0
  458. package/docs/automation/hooks.md +1 -38
  459. package/docs/automation/webhook.md +52 -2
  460. package/docs/channels/discord.md +389 -381
  461. package/docs/channels/grammy.md +1 -1
  462. package/docs/channels/imessage.md +229 -218
  463. package/docs/channels/index.md +1 -0
  464. package/docs/channels/irc.md +234 -0
  465. package/docs/channels/msteams.md +2 -0
  466. package/docs/channels/pairing.md +1 -1
  467. package/docs/channels/slack.md +295 -415
  468. package/docs/channels/telegram.md +397 -460
  469. package/docs/channels/whatsapp.md +338 -310
  470. package/docs/ci.md +0 -12
  471. package/docs/cli/hooks.md +1 -14
  472. package/docs/cli/index.md +6 -1
  473. package/docs/cli/logs.md +4 -0
  474. package/docs/cli/onboard.md +33 -0
  475. package/docs/cli/plugins.md +20 -1
  476. package/docs/cli/security.md +2 -0
  477. package/docs/concepts/architecture.md +0 -16
  478. package/docs/concepts/memory.md +7 -4
  479. package/docs/concepts/model-providers.md +27 -0
  480. package/docs/concepts/session-tool.md +1 -0
  481. package/docs/concepts/system-prompt.md +13 -0
  482. package/docs/docs.json +18 -12
  483. package/docs/experiments/plans/browser-evaluate-cdp-refactor.md +229 -0
  484. package/docs/gateway/configuration-examples.md +9 -2
  485. package/docs/gateway/configuration-reference.md +2345 -0
  486. package/docs/gateway/configuration.md +338 -3297
  487. package/docs/gateway/index.md +162 -238
  488. package/docs/gateway/openai-http-api.md +1 -0
  489. package/docs/gateway/openresponses-http-api.md +16 -0
  490. package/docs/gateway/remote-gateway-readme.md +0 -16
  491. package/docs/gateway/security/index.md +4 -16
  492. package/docs/gateway/tools-invoke-http-api.md +26 -1
  493. package/docs/help/faq.md +9 -0
  494. package/docs/help/testing.md +11 -0
  495. package/docs/install/docker.md +18 -0
  496. package/docs/install/hetzner.md +21 -0
  497. package/docs/install/installer.md +20 -0
  498. package/docs/nodes/audio.md +19 -0
  499. package/docs/platforms/mac/release.md +7 -7
  500. package/docs/providers/glm.md +3 -3
  501. package/docs/providers/huggingface.md +209 -0
  502. package/docs/providers/index.md +3 -0
  503. package/docs/providers/litellm.md +153 -0
  504. package/docs/providers/together.md +2 -2
  505. package/docs/providers/vllm.md +92 -0
  506. package/docs/providers/zai.md +2 -2
  507. package/docs/reference/credits.md +4 -28
  508. package/docs/reference/test.md +2 -1
  509. package/docs/reference/token-use.md +1 -1
  510. package/docs/reference/transcript-hygiene.md +18 -0
  511. package/docs/start/getting-started.md +5 -0
  512. package/docs/start/onboarding-overview.md +51 -0
  513. package/docs/start/onboarding.md +1 -0
  514. package/docs/start/openclaw.md +0 -16
  515. package/docs/start/wizard-cli-automation.md +17 -0
  516. package/docs/start/wizard-cli-reference.md +12 -0
  517. package/docs/start/wizard.md +3 -1
  518. package/docs/tools/browser.md +6 -0
  519. package/docs/zh-CN/automation/hooks.md +1 -38
  520. package/docs/zh-CN/cli/hooks.md +1 -14
  521. package/extensions/bluebubbles/package.json +1 -1
  522. package/extensions/bluebubbles/src/monitor.test.ts +40 -28
  523. package/extensions/bluebubbles/src/monitor.ts +0 -4
  524. package/extensions/copilot-proxy/package.json +1 -1
  525. package/extensions/diagnostics-otel/package.json +10 -10
  526. package/extensions/discord/package.json +1 -1
  527. package/extensions/feishu/package.json +2 -5
  528. package/extensions/feishu/src/bot.checkBotMentioned.test.ts +64 -0
  529. package/extensions/feishu/src/bot.test.ts +265 -0
  530. package/extensions/feishu/src/bot.ts +73 -18
  531. package/extensions/feishu/src/channel.test.ts +48 -0
  532. package/extensions/feishu/src/channel.ts +1 -3
  533. package/extensions/feishu/src/config-schema.ts +6 -0
  534. package/extensions/feishu/src/docx.ts +14 -4
  535. package/extensions/feishu/src/media.test.ts +151 -0
  536. package/extensions/feishu/src/media.ts +27 -13
  537. package/extensions/feishu/src/reply-dispatcher.test.ts +116 -0
  538. package/extensions/feishu/src/reply-dispatcher.ts +124 -67
  539. package/extensions/feishu/src/streaming-card.ts +223 -0
  540. package/extensions/feishu/src/targets.test.ts +16 -0
  541. package/extensions/feishu/src/targets.ts +1 -1
  542. package/extensions/google-antigravity-auth/package.json +1 -1
  543. package/extensions/google-gemini-cli-auth/oauth.test.ts +4 -1
  544. package/extensions/google-gemini-cli-auth/package.json +1 -1
  545. package/extensions/googlechat/package.json +1 -1
  546. package/extensions/googlechat/src/channel.ts +3 -20
  547. package/extensions/googlechat/src/resolve-target.test.ts +138 -0
  548. package/extensions/imessage/package.json +1 -1
  549. package/extensions/irc/index.ts +17 -0
  550. package/extensions/irc/openclaw.plugin.json +9 -0
  551. package/extensions/irc/package.json +14 -0
  552. package/extensions/irc/src/accounts.ts +268 -0
  553. package/extensions/irc/src/channel.ts +367 -0
  554. package/extensions/irc/src/client.test.ts +43 -0
  555. package/extensions/irc/src/client.ts +439 -0
  556. package/extensions/irc/src/config-schema.test.ts +27 -0
  557. package/extensions/irc/src/config-schema.ts +97 -0
  558. package/extensions/irc/src/control-chars.ts +22 -0
  559. package/extensions/irc/src/inbound.ts +334 -0
  560. package/extensions/irc/src/monitor.test.ts +43 -0
  561. package/extensions/irc/src/monitor.ts +158 -0
  562. package/extensions/irc/src/normalize.test.ts +46 -0
  563. package/extensions/irc/src/normalize.ts +117 -0
  564. package/extensions/irc/src/onboarding.test.ts +118 -0
  565. package/extensions/irc/src/onboarding.ts +479 -0
  566. package/extensions/irc/src/policy.test.ts +132 -0
  567. package/extensions/irc/src/policy.ts +157 -0
  568. package/extensions/irc/src/probe.ts +64 -0
  569. package/extensions/irc/src/protocol.test.ts +44 -0
  570. package/extensions/irc/src/protocol.ts +169 -0
  571. package/extensions/irc/src/runtime.ts +14 -0
  572. package/extensions/irc/src/send.ts +99 -0
  573. package/extensions/irc/src/types.ts +94 -0
  574. package/extensions/line/package.json +1 -1
  575. package/extensions/llm-task/package.json +1 -1
  576. package/extensions/lobster/package.json +1 -1
  577. package/extensions/matrix/CHANGELOG.md +6 -0
  578. package/extensions/matrix/node_modules/.bin/markdown-it +2 -2
  579. package/extensions/matrix/node_modules/.bin/markdown-it.CMD +2 -2
  580. package/extensions/matrix/node_modules/.bin/markdown-it.ps1 +2 -2
  581. package/extensions/matrix/package.json +2 -2
  582. package/extensions/matrix/src/matrix/monitor/media.ts +4 -2
  583. package/extensions/mattermost/package.json +1 -1
  584. package/extensions/memory-core/package.json +1 -1
  585. package/extensions/memory-lancedb/index.ts +6 -2
  586. package/extensions/memory-lancedb/node_modules/.bin/openai +2 -2
  587. package/extensions/memory-lancedb/node_modules/.bin/openai.CMD +2 -2
  588. package/extensions/memory-lancedb/node_modules/.bin/openai.ps1 +2 -2
  589. package/extensions/memory-lancedb/package.json +2 -2
  590. package/extensions/minimax-portal-auth/index.ts +7 -5
  591. package/extensions/minimax-portal-auth/package.json +1 -1
  592. package/extensions/msteams/CHANGELOG.md +6 -0
  593. package/extensions/msteams/package.json +1 -1
  594. package/extensions/msteams/src/media-helpers.test.ts +9 -0
  595. package/extensions/msteams/src/media-helpers.ts +15 -1
  596. package/extensions/msteams/src/mentions.test.ts +235 -0
  597. package/extensions/msteams/src/mentions.ts +114 -0
  598. package/extensions/msteams/src/messenger.test.ts +81 -1
  599. package/extensions/msteams/src/messenger.ts +11 -2
  600. package/extensions/nextcloud-talk/package.json +1 -1
  601. package/extensions/nostr/CHANGELOG.md +6 -0
  602. package/extensions/nostr/package.json +2 -2
  603. package/extensions/open-prose/package.json +1 -1
  604. package/extensions/signal/package.json +1 -1
  605. package/extensions/slack/package.json +1 -1
  606. package/extensions/telegram/package.json +1 -1
  607. package/extensions/telegram/src/channel.ts +1 -0
  608. package/extensions/tlon/package.json +1 -1
  609. package/extensions/twitch/CHANGELOG.md +6 -0
  610. package/extensions/twitch/package.json +1 -1
  611. package/extensions/twitch/src/onboarding.test.ts +5 -0
  612. package/extensions/twitch/src/outbound.test.ts +17 -6
  613. package/extensions/twitch/src/outbound.ts +12 -10
  614. package/extensions/voice-call/CHANGELOG.md +6 -0
  615. package/extensions/voice-call/package.json +1 -1
  616. package/extensions/voice-call/src/media-stream.ts +7 -1
  617. package/extensions/voice-call/src/providers/twilio.test.ts +5 -3
  618. package/extensions/voice-call/src/providers/twilio.ts +12 -1
  619. package/extensions/whatsapp/package.json +1 -1
  620. package/extensions/whatsapp/src/channel.ts +6 -16
  621. package/extensions/whatsapp/src/resolve-target.test.ts +154 -0
  622. package/extensions/zalo/CHANGELOG.md +6 -0
  623. package/extensions/zalo/package.json +1 -1
  624. package/extensions/zalouser/CHANGELOG.md +6 -0
  625. package/extensions/zalouser/package.json +1 -1
  626. package/package.json +26 -22
  627. package/dist/auth-BcNHFK-i.js +0 -184
  628. package/dist/auth-DkjJ3pm-.js +0 -184
  629. package/dist/boolean-M-esQJt6.js +0 -30
  630. package/dist/bundled/soul-evil/HOOK.md +0 -71
  631. package/dist/bundled/soul-evil/handler.js +0 -194
  632. package/dist/cli-B631__JU.js +0 -89
  633. package/dist/cli-DVhCVZZ6.js +0 -86
  634. package/dist/config-CI7EpvlP.js +0 -15
  635. package/dist/constants-DuoCkWRh.js +0 -65
  636. package/dist/control-ui/assets/index-CnB9IO4a.js.map +0 -1
  637. package/dist/control-ui/assets/index-DWhx-9JL.css +0 -1
  638. package/dist/date-time-c6HTX6IW.js +0 -187
  639. package/dist/frontmatter-xwTm0734.js +0 -105
  640. package/dist/parse-DqAvJRIf.js +0 -23
  641. package/dist/parse-duration-De_tAQSe.js +0 -24
  642. package/dist/parse-timeout-DV8NQQWk.js +0 -16
  643. package/dist/paths-IivnSNkP.js +0 -51
  644. package/dist/paths-MnZaxqPw.js +0 -48
  645. package/dist/paths-uoGO2aiO.js +0 -48
  646. package/dist/pi-model-discovery-DzFOAbQt.js +0 -20
  647. package/dist/plugin-sdk/tui/tui-formatters.d.ts +0 -31
  648. package/dist/session-key-nXYQSv-a.js +0 -167
  649. package/dist/tailscale-DU6DgqVy.js +0 -225
  650. package/dist/tailscale-DzJUWmKf.js +0 -252
  651. package/dist/utils-dp_OM900.js +0 -476
  652. package/docs/hooks/soul-evil.md +0 -69
  653. package/docs/zh-CN/hooks/soul-evil.md +0 -72
  654. package/skills/local-places/SERVER_README.md +0 -101
  655. package/skills/local-places/SKILL.md +0 -102
  656. package/skills/local-places/pyproject.toml +0 -21
  657. package/skills/local-places/src/local_places/__init__.py +0 -2
  658. package/skills/local-places/src/local_places/google_places.py +0 -314
  659. package/skills/local-places/src/local_places/main.py +0 -65
  660. package/skills/local-places/src/local_places/schemas.py +0 -107
  661. /package/dist/{archive-CXhvR9nU.js → archive-aSMUcOc6.js} +0 -0
  662. /package/dist/{archive-D0z3LZDK.js → archive-beaSfAzA.js} +0 -0
  663. /package/dist/{brew-BIrWdDps.js → brew-DlQQMJ3n.js} +0 -0
  664. /package/dist/{brew-B7YK4ZoL.js → brew-ROHf0-Xp.js} +0 -0
  665. /package/dist/{cli-utils-PlLcDZlM.js → cli-utils-CRhVAaLV.js} +0 -0
  666. /package/dist/{cli-utils-R-ECs5cY.js → cli-utils-CodyYLHe.js} +0 -0
  667. /package/dist/{command-format-BUxhT1xL.js → command-format-qUVxzqYm.js} +0 -0
  668. /package/dist/{constants-CNTiY-ZN.js → constants-BvQ6S8j5.js} +0 -0
  669. /package/dist/{errors-D3tYRJWG.js → errors-B91HIDPD.js} +0 -0
  670. /package/dist/{errors-B0eT3jVv.js → errors-Bv81hF2P.js} +0 -0
  671. /package/dist/{errors-x4NYs-1P.js → errors-Cojm0Kl7.js} +0 -0
  672. /package/dist/{format-CaxeRcue.js → format-CL8VOhxX.js} +0 -0
  673. /package/dist/{format-DLOJPZmo.js → format-DcfK-dwd.js} +0 -0
  674. /package/dist/{format-duration-CEmFWLyX.js → format-duration--hQihAvf.js} +0 -0
  675. /package/dist/{format-duration-DCXJx2ba.js → format-duration-84n6_DgO.js} +0 -0
  676. /package/dist/{format-relative-79_Y1n2Y.js → format-relative-Cywx6ldk.js} +0 -0
  677. /package/dist/{format-relative-Db7eqEu8.js → format-relative-cegC_FF5.js} +0 -0
  678. /package/dist/{helpers-CQI-5xS9.js → helpers-8O7IVGO-.js} +0 -0
  679. /package/dist/{helpers-DdwqKAAS.js → helpers-ByYj2Aq5.js} +0 -0
  680. /package/dist/{helpers-CRzoyyXS.js → helpers-CUVSCDJV.js} +0 -0
  681. /package/dist/{helpers-C89IG08W.js → helpers-HyeZXsnu.js} +0 -0
  682. /package/dist/{is-main-qJ675wPV.js → is-main-B9A8S9YC.js} +0 -0
  683. /package/dist/{is-main-WWuz28Ip.js → is-main-BWoXGz7p.js} +0 -0
  684. /package/dist/{logging-BzvBIA3Y.js → logging-D-Jq2wIo.js} +0 -0
  685. /package/dist/{logging-CfEk_PnX.js → logging-fywhKCmE.js} +0 -0
  686. /package/dist/{parse-Cjiudy6x.js → parse-Bw0oH-rT.js} +0 -0
  687. /package/dist/{parse-log-line-CUrpqe1w.js → parse-log-line-BuRiE-Ij.js} +0 -0
  688. /package/dist/{parse-log-line-D2UGw0wR.js → parse-log-line-CfVgwy6x.js} +0 -0
  689. /package/dist/{parse-timeout-DFSPLxpY.js → parse-timeout-D1XX_zN_.js} +0 -0
  690. /package/dist/{pi-model-discovery-CV2V1HHz.js → pi-model-discovery-DqgqUyAv.js} +0 -0
  691. /package/dist/{pi-model-discovery-DzEIEgHL.js → pi-model-discovery-EwKVHlZB.js} +0 -0
  692. /package/dist/{prompts--d-6l5Ln.js → prompts-Bg96reub.js} +0 -0
  693. /package/dist/{prompts-CXLLIBwP.js → prompts-Dszjy1n_.js} +0 -0
  694. /package/dist/{redact-BRmQPYDR.js → redact-BIMJ3ntQ.js} +0 -0
  695. /package/dist/{redact-BHmk44DI.js → redact-BRsnXqwD.js} +0 -0
  696. /package/dist/{redact-DAKeu7PA.js → redact-UvkXqguc.js} +0 -0
  697. /package/dist/{status-Cv36yYdi.js → status-C_dMhoE0.js} +0 -0
  698. /package/dist/{status-Drziap9H.js → status-DCkF_L3U.js} +0 -0
  699. /package/dist/{systemd-hints-CH4pbCFD.js → systemd-hints-CXNtLw9Q.js} +0 -0
  700. /package/dist/{tailnet-CL5GtL7t.js → tailnet-DATIFSsY.js} +0 -0
  701. /package/dist/{tailnet-DGRSvYuQ.js → tailnet-uoFvUSsw.js} +0 -0
  702. /package/dist/{transcript-events-BlIONGVn.js → transcript-events-BHS7QoRl.js} +0 -0
  703. /package/dist/{transcript-events-C1hdue6u.js → transcript-events-Bp7fGnwv.js} +0 -0
  704. /package/dist/{transcript-events-CZ8CG4ht.js → transcript-events-Ch7wLX-j.js} +0 -0
  705. /package/dist/{usage-format-6Uar63S0.js → usage-format-Bhl_WCWP.js} +0 -0
  706. /package/dist/{usage-format-hd37en6b.js → usage-format-CpORtVCG.js} +0 -0
  707. /package/extensions/{feishu → irc}/node_modules/.bin/claw +0 -0
  708. /package/extensions/{feishu → irc}/node_modules/.bin/claw.CMD +0 -0
  709. /package/extensions/{feishu → irc}/node_modules/.bin/claw.ps1 +0 -0
  710. /package/extensions/{feishu → irc}/node_modules/.bin/moltbot +0 -0
  711. /package/extensions/{feishu → irc}/node_modules/.bin/moltbot.CMD +0 -0
  712. /package/extensions/{feishu → irc}/node_modules/.bin/moltbot.ps1 +0 -0
  713. /package/extensions/{feishu → irc}/node_modules/.bin/pigbot +0 -0
  714. /package/extensions/{feishu → irc}/node_modules/.bin/pigbot.CMD +0 -0
  715. /package/extensions/{feishu → irc}/node_modules/.bin/pigbot.ps1 +0 -0
@@ -0,0 +1,285 @@
1
+ import { c as logWarn } from "./exec-_PSUrMP8.js";
2
+ import { Bt as SsrFBlockedError, En as extensionForMime, Ht as createPinnedDispatcher, Tn as detectMime, Ut as resolvePinnedHostnameWithPolicy, Vt as closeDispatcher } from "./pi-embedded-helpers-ZI1UCSRM.js";
3
+ import path from "node:path";
4
+
5
+ //#region src/utils/fetch-timeout.ts
6
+ /**
7
+ * Relay abort without forwarding the Event argument as the abort reason.
8
+ * Using .bind() avoids closure scope capture (memory leak prevention).
9
+ */
10
+ function relayAbort() {
11
+ this.abort();
12
+ }
13
+ /** Returns a bound abort relay for use as an event listener. */
14
+ function bindAbortRelay(controller) {
15
+ return relayAbort.bind(controller);
16
+ }
17
+ /**
18
+ * Fetch wrapper that adds timeout support via AbortController.
19
+ *
20
+ * @param url - The URL to fetch
21
+ * @param init - RequestInit options (headers, method, body, etc.)
22
+ * @param timeoutMs - Timeout in milliseconds
23
+ * @param fetchFn - The fetch implementation to use (defaults to global fetch)
24
+ * @returns The fetch Response
25
+ * @throws AbortError if the request times out
26
+ */
27
+ async function fetchWithTimeout(url, init, timeoutMs, fetchFn = fetch) {
28
+ const controller = new AbortController();
29
+ const timer = setTimeout(controller.abort.bind(controller), Math.max(1, timeoutMs));
30
+ try {
31
+ return await fetchFn(url, {
32
+ ...init,
33
+ signal: controller.signal
34
+ });
35
+ } finally {
36
+ clearTimeout(timer);
37
+ }
38
+ }
39
+
40
+ //#endregion
41
+ //#region src/infra/net/fetch-guard.ts
42
+ const DEFAULT_MAX_REDIRECTS = 3;
43
+ function isRedirectStatus(status) {
44
+ return status === 301 || status === 302 || status === 303 || status === 307 || status === 308;
45
+ }
46
+ function buildAbortSignal(params) {
47
+ const { timeoutMs, signal } = params;
48
+ if (!timeoutMs && !signal) return {
49
+ signal: void 0,
50
+ cleanup: () => {}
51
+ };
52
+ if (!timeoutMs) return {
53
+ signal,
54
+ cleanup: () => {}
55
+ };
56
+ const controller = new AbortController();
57
+ const timeoutId = setTimeout(controller.abort.bind(controller), timeoutMs);
58
+ const onAbort = bindAbortRelay(controller);
59
+ if (signal) if (signal.aborted) controller.abort();
60
+ else signal.addEventListener("abort", onAbort, { once: true });
61
+ const cleanup = () => {
62
+ clearTimeout(timeoutId);
63
+ if (signal) signal.removeEventListener("abort", onAbort);
64
+ };
65
+ return {
66
+ signal: controller.signal,
67
+ cleanup
68
+ };
69
+ }
70
+ async function fetchWithSsrFGuard(params) {
71
+ const fetcher = params.fetchImpl ?? globalThis.fetch;
72
+ if (!fetcher) throw new Error("fetch is not available");
73
+ const maxRedirects = typeof params.maxRedirects === "number" && Number.isFinite(params.maxRedirects) ? Math.max(0, Math.floor(params.maxRedirects)) : DEFAULT_MAX_REDIRECTS;
74
+ const { signal, cleanup } = buildAbortSignal({
75
+ timeoutMs: params.timeoutMs,
76
+ signal: params.signal
77
+ });
78
+ let released = false;
79
+ const release = async (dispatcher) => {
80
+ if (released) return;
81
+ released = true;
82
+ cleanup();
83
+ await closeDispatcher(dispatcher ?? void 0);
84
+ };
85
+ const visited = /* @__PURE__ */ new Set();
86
+ let currentUrl = params.url;
87
+ let redirectCount = 0;
88
+ while (true) {
89
+ let parsedUrl;
90
+ try {
91
+ parsedUrl = new URL(currentUrl);
92
+ } catch {
93
+ await release();
94
+ throw new Error("Invalid URL: must be http or https");
95
+ }
96
+ if (!["http:", "https:"].includes(parsedUrl.protocol)) {
97
+ await release();
98
+ throw new Error("Invalid URL: must be http or https");
99
+ }
100
+ let dispatcher = null;
101
+ try {
102
+ const pinned = await resolvePinnedHostnameWithPolicy(parsedUrl.hostname, {
103
+ lookupFn: params.lookupFn,
104
+ policy: params.policy
105
+ });
106
+ if (params.pinDns !== false) dispatcher = createPinnedDispatcher(pinned);
107
+ const init = {
108
+ ...params.init ? { ...params.init } : {},
109
+ redirect: "manual",
110
+ ...dispatcher ? { dispatcher } : {},
111
+ ...signal ? { signal } : {}
112
+ };
113
+ const response = await fetcher(parsedUrl.toString(), init);
114
+ if (isRedirectStatus(response.status)) {
115
+ const location = response.headers.get("location");
116
+ if (!location) {
117
+ await release(dispatcher);
118
+ throw new Error(`Redirect missing location header (${response.status})`);
119
+ }
120
+ redirectCount += 1;
121
+ if (redirectCount > maxRedirects) {
122
+ await release(dispatcher);
123
+ throw new Error(`Too many redirects (limit: ${maxRedirects})`);
124
+ }
125
+ const nextUrl = new URL(location, parsedUrl).toString();
126
+ if (visited.has(nextUrl)) {
127
+ await release(dispatcher);
128
+ throw new Error("Redirect loop detected");
129
+ }
130
+ visited.add(nextUrl);
131
+ response.body?.cancel();
132
+ await closeDispatcher(dispatcher);
133
+ currentUrl = nextUrl;
134
+ continue;
135
+ }
136
+ return {
137
+ response,
138
+ finalUrl: currentUrl,
139
+ release: async () => release(dispatcher)
140
+ };
141
+ } catch (err) {
142
+ if (err instanceof SsrFBlockedError) logWarn(`security: blocked URL fetch (${params.auditContext ?? "url-fetch"}) target=${parsedUrl.origin}${parsedUrl.pathname} reason=${err.message}`);
143
+ await release(dispatcher);
144
+ throw err;
145
+ }
146
+ }
147
+ }
148
+
149
+ //#endregion
150
+ //#region src/media/fetch.ts
151
+ var MediaFetchError = class extends Error {
152
+ constructor(code, message) {
153
+ super(message);
154
+ this.code = code;
155
+ this.name = "MediaFetchError";
156
+ }
157
+ };
158
+ function stripQuotes(value) {
159
+ return value.replace(/^["']|["']$/g, "");
160
+ }
161
+ function parseContentDispositionFileName(header) {
162
+ if (!header) return;
163
+ const starMatch = /filename\*\s*=\s*([^;]+)/i.exec(header);
164
+ if (starMatch?.[1]) {
165
+ const cleaned = stripQuotes(starMatch[1].trim());
166
+ const encoded = cleaned.split("''").slice(1).join("''") || cleaned;
167
+ try {
168
+ return path.basename(decodeURIComponent(encoded));
169
+ } catch {
170
+ return path.basename(encoded);
171
+ }
172
+ }
173
+ const match = /filename\s*=\s*([^;]+)/i.exec(header);
174
+ if (match?.[1]) return path.basename(stripQuotes(match[1].trim()));
175
+ }
176
+ async function readErrorBodySnippet(res, maxChars = 200) {
177
+ try {
178
+ const text = await res.text();
179
+ if (!text) return;
180
+ const collapsed = text.replace(/\s+/g, " ").trim();
181
+ if (!collapsed) return;
182
+ if (collapsed.length <= maxChars) return collapsed;
183
+ return `${collapsed.slice(0, maxChars)}…`;
184
+ } catch {
185
+ return;
186
+ }
187
+ }
188
+ async function fetchRemoteMedia(options) {
189
+ const { url, fetchImpl, filePathHint, maxBytes, maxRedirects, ssrfPolicy, lookupFn } = options;
190
+ let res;
191
+ let finalUrl = url;
192
+ let release = null;
193
+ try {
194
+ const result = await fetchWithSsrFGuard({
195
+ url,
196
+ fetchImpl,
197
+ maxRedirects,
198
+ policy: ssrfPolicy,
199
+ lookupFn
200
+ });
201
+ res = result.response;
202
+ finalUrl = result.finalUrl;
203
+ release = result.release;
204
+ } catch (err) {
205
+ throw new MediaFetchError("fetch_failed", `Failed to fetch media from ${url}: ${String(err)}`);
206
+ }
207
+ try {
208
+ if (!res.ok) {
209
+ const statusText = res.statusText ? ` ${res.statusText}` : "";
210
+ const redirected = finalUrl !== url ? ` (redirected to ${finalUrl})` : "";
211
+ let detail = `HTTP ${res.status}${statusText}`;
212
+ if (!res.body) detail = `HTTP ${res.status}${statusText}; empty response body`;
213
+ else {
214
+ const snippet = await readErrorBodySnippet(res);
215
+ if (snippet) detail += `; body: ${snippet}`;
216
+ }
217
+ throw new MediaFetchError("http_error", `Failed to fetch media from ${url}${redirected}: ${detail}`);
218
+ }
219
+ const contentLength = res.headers.get("content-length");
220
+ if (maxBytes && contentLength) {
221
+ const length = Number(contentLength);
222
+ if (Number.isFinite(length) && length > maxBytes) throw new MediaFetchError("max_bytes", `Failed to fetch media from ${url}: content length ${length} exceeds maxBytes ${maxBytes}`);
223
+ }
224
+ const buffer = maxBytes ? await readResponseWithLimit(res, maxBytes) : Buffer.from(await res.arrayBuffer());
225
+ let fileNameFromUrl;
226
+ try {
227
+ const parsed = new URL(finalUrl);
228
+ fileNameFromUrl = path.basename(parsed.pathname) || void 0;
229
+ } catch {}
230
+ const headerFileName = parseContentDispositionFileName(res.headers.get("content-disposition"));
231
+ let fileName = headerFileName || fileNameFromUrl || (filePathHint ? path.basename(filePathHint) : void 0);
232
+ const filePathForMime = headerFileName && path.extname(headerFileName) ? headerFileName : filePathHint ?? finalUrl;
233
+ const contentType = await detectMime({
234
+ buffer,
235
+ headerMime: res.headers.get("content-type"),
236
+ filePath: filePathForMime
237
+ });
238
+ if (fileName && !path.extname(fileName) && contentType) {
239
+ const ext = extensionForMime(contentType);
240
+ if (ext) fileName = `${fileName}${ext}`;
241
+ }
242
+ return {
243
+ buffer,
244
+ contentType: contentType ?? void 0,
245
+ fileName
246
+ };
247
+ } finally {
248
+ if (release) await release();
249
+ }
250
+ }
251
+ async function readResponseWithLimit(res, maxBytes) {
252
+ const body = res.body;
253
+ if (!body || typeof body.getReader !== "function") {
254
+ const fallback = Buffer.from(await res.arrayBuffer());
255
+ if (fallback.length > maxBytes) throw new MediaFetchError("max_bytes", `Failed to fetch media from ${res.url || "response"}: payload exceeds maxBytes ${maxBytes}`);
256
+ return fallback;
257
+ }
258
+ const reader = body.getReader();
259
+ const chunks = [];
260
+ let total = 0;
261
+ try {
262
+ while (true) {
263
+ const { done, value } = await reader.read();
264
+ if (done) break;
265
+ if (value?.length) {
266
+ total += value.length;
267
+ if (total > maxBytes) {
268
+ try {
269
+ await reader.cancel();
270
+ } catch {}
271
+ throw new MediaFetchError("max_bytes", `Failed to fetch media from ${res.url || "response"}: payload exceeds maxBytes ${maxBytes}`);
272
+ }
273
+ chunks.push(value);
274
+ }
275
+ }
276
+ } finally {
277
+ try {
278
+ reader.releaseLock();
279
+ } catch {}
280
+ }
281
+ return Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)), total);
282
+ }
283
+
284
+ //#endregion
285
+ export { fetchWithTimeout as a, bindAbortRelay as i, fetchRemoteMedia as n, fetchWithSsrFGuard as r, MediaFetchError as t };
@@ -0,0 +1,285 @@
1
+ import { c as logWarn } from "./exec-DqZFMawz.js";
2
+ import { a as closeDispatcher, i as SsrFBlockedError, m as extensionForMime, o as createPinnedDispatcher, p as detectMime, s as resolvePinnedHostnameWithPolicy } from "./routes-CaCvio4Q.js";
3
+ import path from "node:path";
4
+
5
+ //#region src/utils/fetch-timeout.ts
6
+ /**
7
+ * Relay abort without forwarding the Event argument as the abort reason.
8
+ * Using .bind() avoids closure scope capture (memory leak prevention).
9
+ */
10
+ function relayAbort() {
11
+ this.abort();
12
+ }
13
+ /** Returns a bound abort relay for use as an event listener. */
14
+ function bindAbortRelay(controller) {
15
+ return relayAbort.bind(controller);
16
+ }
17
+ /**
18
+ * Fetch wrapper that adds timeout support via AbortController.
19
+ *
20
+ * @param url - The URL to fetch
21
+ * @param init - RequestInit options (headers, method, body, etc.)
22
+ * @param timeoutMs - Timeout in milliseconds
23
+ * @param fetchFn - The fetch implementation to use (defaults to global fetch)
24
+ * @returns The fetch Response
25
+ * @throws AbortError if the request times out
26
+ */
27
+ async function fetchWithTimeout(url, init, timeoutMs, fetchFn = fetch) {
28
+ const controller = new AbortController();
29
+ const timer = setTimeout(controller.abort.bind(controller), Math.max(1, timeoutMs));
30
+ try {
31
+ return await fetchFn(url, {
32
+ ...init,
33
+ signal: controller.signal
34
+ });
35
+ } finally {
36
+ clearTimeout(timer);
37
+ }
38
+ }
39
+
40
+ //#endregion
41
+ //#region src/infra/net/fetch-guard.ts
42
+ const DEFAULT_MAX_REDIRECTS = 3;
43
+ function isRedirectStatus(status) {
44
+ return status === 301 || status === 302 || status === 303 || status === 307 || status === 308;
45
+ }
46
+ function buildAbortSignal(params) {
47
+ const { timeoutMs, signal } = params;
48
+ if (!timeoutMs && !signal) return {
49
+ signal: void 0,
50
+ cleanup: () => {}
51
+ };
52
+ if (!timeoutMs) return {
53
+ signal,
54
+ cleanup: () => {}
55
+ };
56
+ const controller = new AbortController();
57
+ const timeoutId = setTimeout(controller.abort.bind(controller), timeoutMs);
58
+ const onAbort = bindAbortRelay(controller);
59
+ if (signal) if (signal.aborted) controller.abort();
60
+ else signal.addEventListener("abort", onAbort, { once: true });
61
+ const cleanup = () => {
62
+ clearTimeout(timeoutId);
63
+ if (signal) signal.removeEventListener("abort", onAbort);
64
+ };
65
+ return {
66
+ signal: controller.signal,
67
+ cleanup
68
+ };
69
+ }
70
+ async function fetchWithSsrFGuard(params) {
71
+ const fetcher = params.fetchImpl ?? globalThis.fetch;
72
+ if (!fetcher) throw new Error("fetch is not available");
73
+ const maxRedirects = typeof params.maxRedirects === "number" && Number.isFinite(params.maxRedirects) ? Math.max(0, Math.floor(params.maxRedirects)) : DEFAULT_MAX_REDIRECTS;
74
+ const { signal, cleanup } = buildAbortSignal({
75
+ timeoutMs: params.timeoutMs,
76
+ signal: params.signal
77
+ });
78
+ let released = false;
79
+ const release = async (dispatcher) => {
80
+ if (released) return;
81
+ released = true;
82
+ cleanup();
83
+ await closeDispatcher(dispatcher ?? void 0);
84
+ };
85
+ const visited = /* @__PURE__ */ new Set();
86
+ let currentUrl = params.url;
87
+ let redirectCount = 0;
88
+ while (true) {
89
+ let parsedUrl;
90
+ try {
91
+ parsedUrl = new URL(currentUrl);
92
+ } catch {
93
+ await release();
94
+ throw new Error("Invalid URL: must be http or https");
95
+ }
96
+ if (!["http:", "https:"].includes(parsedUrl.protocol)) {
97
+ await release();
98
+ throw new Error("Invalid URL: must be http or https");
99
+ }
100
+ let dispatcher = null;
101
+ try {
102
+ const pinned = await resolvePinnedHostnameWithPolicy(parsedUrl.hostname, {
103
+ lookupFn: params.lookupFn,
104
+ policy: params.policy
105
+ });
106
+ if (params.pinDns !== false) dispatcher = createPinnedDispatcher(pinned);
107
+ const init = {
108
+ ...params.init ? { ...params.init } : {},
109
+ redirect: "manual",
110
+ ...dispatcher ? { dispatcher } : {},
111
+ ...signal ? { signal } : {}
112
+ };
113
+ const response = await fetcher(parsedUrl.toString(), init);
114
+ if (isRedirectStatus(response.status)) {
115
+ const location = response.headers.get("location");
116
+ if (!location) {
117
+ await release(dispatcher);
118
+ throw new Error(`Redirect missing location header (${response.status})`);
119
+ }
120
+ redirectCount += 1;
121
+ if (redirectCount > maxRedirects) {
122
+ await release(dispatcher);
123
+ throw new Error(`Too many redirects (limit: ${maxRedirects})`);
124
+ }
125
+ const nextUrl = new URL(location, parsedUrl).toString();
126
+ if (visited.has(nextUrl)) {
127
+ await release(dispatcher);
128
+ throw new Error("Redirect loop detected");
129
+ }
130
+ visited.add(nextUrl);
131
+ response.body?.cancel();
132
+ await closeDispatcher(dispatcher);
133
+ currentUrl = nextUrl;
134
+ continue;
135
+ }
136
+ return {
137
+ response,
138
+ finalUrl: currentUrl,
139
+ release: async () => release(dispatcher)
140
+ };
141
+ } catch (err) {
142
+ if (err instanceof SsrFBlockedError) logWarn(`security: blocked URL fetch (${params.auditContext ?? "url-fetch"}) target=${parsedUrl.origin}${parsedUrl.pathname} reason=${err.message}`);
143
+ await release(dispatcher);
144
+ throw err;
145
+ }
146
+ }
147
+ }
148
+
149
+ //#endregion
150
+ //#region src/media/fetch.ts
151
+ var MediaFetchError = class extends Error {
152
+ constructor(code, message) {
153
+ super(message);
154
+ this.code = code;
155
+ this.name = "MediaFetchError";
156
+ }
157
+ };
158
+ function stripQuotes(value) {
159
+ return value.replace(/^["']|["']$/g, "");
160
+ }
161
+ function parseContentDispositionFileName(header) {
162
+ if (!header) return;
163
+ const starMatch = /filename\*\s*=\s*([^;]+)/i.exec(header);
164
+ if (starMatch?.[1]) {
165
+ const cleaned = stripQuotes(starMatch[1].trim());
166
+ const encoded = cleaned.split("''").slice(1).join("''") || cleaned;
167
+ try {
168
+ return path.basename(decodeURIComponent(encoded));
169
+ } catch {
170
+ return path.basename(encoded);
171
+ }
172
+ }
173
+ const match = /filename\s*=\s*([^;]+)/i.exec(header);
174
+ if (match?.[1]) return path.basename(stripQuotes(match[1].trim()));
175
+ }
176
+ async function readErrorBodySnippet(res, maxChars = 200) {
177
+ try {
178
+ const text = await res.text();
179
+ if (!text) return;
180
+ const collapsed = text.replace(/\s+/g, " ").trim();
181
+ if (!collapsed) return;
182
+ if (collapsed.length <= maxChars) return collapsed;
183
+ return `${collapsed.slice(0, maxChars)}…`;
184
+ } catch {
185
+ return;
186
+ }
187
+ }
188
+ async function fetchRemoteMedia(options) {
189
+ const { url, fetchImpl, filePathHint, maxBytes, maxRedirects, ssrfPolicy, lookupFn } = options;
190
+ let res;
191
+ let finalUrl = url;
192
+ let release = null;
193
+ try {
194
+ const result = await fetchWithSsrFGuard({
195
+ url,
196
+ fetchImpl,
197
+ maxRedirects,
198
+ policy: ssrfPolicy,
199
+ lookupFn
200
+ });
201
+ res = result.response;
202
+ finalUrl = result.finalUrl;
203
+ release = result.release;
204
+ } catch (err) {
205
+ throw new MediaFetchError("fetch_failed", `Failed to fetch media from ${url}: ${String(err)}`);
206
+ }
207
+ try {
208
+ if (!res.ok) {
209
+ const statusText = res.statusText ? ` ${res.statusText}` : "";
210
+ const redirected = finalUrl !== url ? ` (redirected to ${finalUrl})` : "";
211
+ let detail = `HTTP ${res.status}${statusText}`;
212
+ if (!res.body) detail = `HTTP ${res.status}${statusText}; empty response body`;
213
+ else {
214
+ const snippet = await readErrorBodySnippet(res);
215
+ if (snippet) detail += `; body: ${snippet}`;
216
+ }
217
+ throw new MediaFetchError("http_error", `Failed to fetch media from ${url}${redirected}: ${detail}`);
218
+ }
219
+ const contentLength = res.headers.get("content-length");
220
+ if (maxBytes && contentLength) {
221
+ const length = Number(contentLength);
222
+ if (Number.isFinite(length) && length > maxBytes) throw new MediaFetchError("max_bytes", `Failed to fetch media from ${url}: content length ${length} exceeds maxBytes ${maxBytes}`);
223
+ }
224
+ const buffer = maxBytes ? await readResponseWithLimit(res, maxBytes) : Buffer.from(await res.arrayBuffer());
225
+ let fileNameFromUrl;
226
+ try {
227
+ const parsed = new URL(finalUrl);
228
+ fileNameFromUrl = path.basename(parsed.pathname) || void 0;
229
+ } catch {}
230
+ const headerFileName = parseContentDispositionFileName(res.headers.get("content-disposition"));
231
+ let fileName = headerFileName || fileNameFromUrl || (filePathHint ? path.basename(filePathHint) : void 0);
232
+ const filePathForMime = headerFileName && path.extname(headerFileName) ? headerFileName : filePathHint ?? finalUrl;
233
+ const contentType = await detectMime({
234
+ buffer,
235
+ headerMime: res.headers.get("content-type"),
236
+ filePath: filePathForMime
237
+ });
238
+ if (fileName && !path.extname(fileName) && contentType) {
239
+ const ext = extensionForMime(contentType);
240
+ if (ext) fileName = `${fileName}${ext}`;
241
+ }
242
+ return {
243
+ buffer,
244
+ contentType: contentType ?? void 0,
245
+ fileName
246
+ };
247
+ } finally {
248
+ if (release) await release();
249
+ }
250
+ }
251
+ async function readResponseWithLimit(res, maxBytes) {
252
+ const body = res.body;
253
+ if (!body || typeof body.getReader !== "function") {
254
+ const fallback = Buffer.from(await res.arrayBuffer());
255
+ if (fallback.length > maxBytes) throw new MediaFetchError("max_bytes", `Failed to fetch media from ${res.url || "response"}: payload exceeds maxBytes ${maxBytes}`);
256
+ return fallback;
257
+ }
258
+ const reader = body.getReader();
259
+ const chunks = [];
260
+ let total = 0;
261
+ try {
262
+ while (true) {
263
+ const { done, value } = await reader.read();
264
+ if (done) break;
265
+ if (value?.length) {
266
+ total += value.length;
267
+ if (total > maxBytes) {
268
+ try {
269
+ await reader.cancel();
270
+ } catch {}
271
+ throw new MediaFetchError("max_bytes", `Failed to fetch media from ${res.url || "response"}: payload exceeds maxBytes ${maxBytes}`);
272
+ }
273
+ chunks.push(value);
274
+ }
275
+ }
276
+ } finally {
277
+ try {
278
+ reader.releaseLock();
279
+ } catch {}
280
+ }
281
+ return Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)), total);
282
+ }
283
+
284
+ //#endregion
285
+ export { fetchWithTimeout as a, bindAbortRelay as i, fetchRemoteMedia as n, fetchWithSsrFGuard as r, MediaFetchError as t };