activeclaw 2026.2.12 → 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 (364) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/{accounts-DbzMEfKN.js → accounts-DCDeFTra.js} +2 -2
  3. package/dist/{accounts-DimKrt7j.js → accounts-DeqIQjo1.js} +2 -2
  4. package/dist/{acp-cli-Cs1ai4XO.js → acp-cli-CeYI4XRd.js} +15 -16
  5. package/dist/{acp-cli-oV2dodPg.js → acp-cli-rNbGXICg.js} +14 -15
  6. package/dist/{agent-BndgzkUe.js → agent-BvNJF5QL.js} +19 -16
  7. package/dist/{agent-DZvDwqnd.js → agent-CyMxTyrG.js} +20 -17
  8. package/dist/{agent-scope-rXQ7WARN.js → agent-scope-BIEhVP4_.js} +1 -1
  9. package/dist/{agent-scope---6LLHj0.js → agent-scope-CQCus0rI.js} +2 -2
  10. package/dist/{agent-scope-RCSw6gHy.js → agent-scope-CsRbLH4l.js} +3 -3
  11. package/dist/{agent-scope-CN8DM4Xb.js → agent-scope-DPIFau3f.js} +1 -1
  12. package/dist/{audio-preflight-SZRntkxo.js → audio-preflight-BU8W7uxc.js} +10 -10
  13. package/dist/{audio-preflight-ClVNINDs.js → audio-preflight-CGsumMzb.js} +10 -10
  14. package/dist/{audio-preflight-txAP3v-C.js → audio-preflight-SLmkJI6-.js} +22 -22
  15. package/dist/{audio-preflight-BP6s-UPp.js → audio-preflight-jZc5mFCZ.js} +23 -23
  16. package/dist/{audit-CQzrm61N.js → audit-Dmww_503.js} +70 -18
  17. package/dist/{audit-DMH3CSXY.js → audit-wPu26VMb.js} +72 -20
  18. package/dist/{tailscale-DU6DgqVy.js → auth-9x3lqfIY.js} +208 -3
  19. package/dist/{tailscale-DHfcfRCx.js → auth-CQNl_IaI.js} +190 -3
  20. package/dist/{auth-health-BB3e3OmN.js → auth-health-C4L4FGBA.js} +1 -1
  21. package/dist/{auth-health-zZ9dnQGC.js → auth-health-j6epgQbq.js} +1 -1
  22. package/dist/{auth-profiles-CcJ3hrog.js → auth-profiles-ByNs3eEm.js} +60 -22
  23. package/dist/build-info.json +3 -3
  24. package/dist/bundled/boot-md/handler.js +19 -16
  25. package/dist/bundled/session-memory/handler.js +16 -15
  26. package/dist/{call-Yxns4CVq.js → call-DVYCIV8m.js} +5 -5
  27. package/dist/{call-C9az806y.js → call-SolyGS1r.js} +4 -4
  28. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  29. package/dist/{channel-options-CjXPwMWu.js → channel-options-BwC2yQcR.js} +4 -4
  30. package/dist/{channel-options-CX4iYQfR.js → channel-options-Cq9BVDkP.js} +7 -7
  31. package/dist/{channel-selection-BoQ7GurB.js → channel-selection-D4D6ImhN.js} +2 -2
  32. package/dist/{channel-selection-C78IwbD-.js → channel-selection-MZAHm4U8.js} +2 -2
  33. package/dist/{channels-cli-DUHsmX3q.js → channels-cli-9Dsk9Qm7.js} +53 -51
  34. package/dist/{channels-cli-BXMQPB4x.js → channels-cli-BJUppQll.js} +52 -50
  35. package/dist/{channels-status-issues-Ca9--azp.js → channels-status-issues-D7GSV1GS.js} +1 -1
  36. package/dist/{channels-status-issues-CbULFg2X.js → channels-status-issues-DDAWeT-6.js} +1 -1
  37. package/dist/{chrome-svgmQ8T_.js → chrome-BfB6JdKF.js} +2 -1
  38. package/dist/{chrome-juQxt0zf.js → chrome-Cvr-57lg.js} +4 -3
  39. package/dist/{chrome-BCPPeLQ6.js → chrome-DL0avO8n.js} +2 -1
  40. package/dist/{chrome-yIKmOzCO.js → chrome-foEwx3lN.js} +5 -4
  41. package/dist/{clack-prompter-Dmvcu3gn.js → clack-prompter-Bz3Mmcl-.js} +5 -5
  42. package/dist/{clack-prompter-DuBVnTKy.js → clack-prompter-ChCGXfyt.js} +4 -4
  43. package/dist/cli/daemon-cli.js +1 -1
  44. package/dist/{cli-FdxAcu_y.js → cli-ZR9ugUBX.js} +42 -40
  45. package/dist/{cli-By331Q9f.js → cli-miPe4Ujz.js} +42 -40
  46. package/dist/{client-B0_GiCjB.js → client-BrYfyoDK.js} +52 -3
  47. package/dist/{client-D7wrC1Ug.js → client-CTwXnRl7.js} +53 -4
  48. package/dist/{command-format-ayFsmwwz.js → command-format-Bxe0mWee.js} +1 -1
  49. package/dist/{command-options-BSDiKuyX.js → command-options-BvgxzPbK.js} +4 -4
  50. package/dist/{commands-BG25qku5.js → commands-BX_OIIVR.js} +4 -4
  51. package/dist/{completion-cli-C4zxjkC1.js → completion-cli-CR77-jyv.js} +3 -3
  52. package/dist/{completion-cli-DECEgBWR.js → completion-cli-DnjpxAag.js} +29 -29
  53. package/dist/{config-B7sno9eI.js → config-Bdhomfei.js} +15 -6
  54. package/dist/{config-BuF7vm-v.js → config-BvMsmctM.js} +13 -4
  55. package/dist/{config-D50SQVar.js → config-QYrbd7x7.js} +13 -4
  56. package/dist/{config-DH9TLUNc.js → config-aFQssWKX.js} +15 -6
  57. package/dist/{config-guard-DPxxY1iw.js → config-guard-CljaSxJd.js} +39 -39
  58. package/dist/{configure-BZQ9uSVX.js → configure-BXLiucXo.js} +19 -19
  59. package/dist/{configure-Cg5IKSUy.js → configure-BYPqXzGZ.js} +19 -19
  60. package/dist/control-auth-8Cf4WXpR.js +54 -0
  61. package/dist/control-auth-DBCu3qyv.js +54 -0
  62. package/dist/{control-service-CBlMVTRu.js → control-service-B5KnPqGP.js} +11 -5
  63. package/dist/{control-service-B2er20Ke.js → control-service-DKnttEus.js} +10 -4
  64. package/dist/{cron-cli-B2Zwhy_r.js → cron-cli-D7BRjDv2.js} +17 -17
  65. package/dist/{cron-cli-EaRUVd0p.js → cron-cli-z1zk_FXQ.js} +16 -16
  66. package/dist/{daemon-cli-CVNzObIF.js → daemon-cli-BDkU2ocb.js} +18 -18
  67. package/dist/{daemon-cli-DF6Rxjy6.js → daemon-cli-cNSF93-v.js} +19 -19
  68. package/dist/{daemon-runtime-BHF5NjQ7.js → daemon-runtime-B0tg_LsX.js} +2 -2
  69. package/dist/{daemon-runtime-B05PME1z.js → daemon-runtime-Bsjeut6m.js} +3 -3
  70. package/dist/{deliver-DzcxEcza.js → deliver-CIU9Npgs.js} +306 -12
  71. package/dist/{deliver-COf5XFo_.js → deliver-DYYCo1G7.js} +302 -8
  72. package/dist/{deliver-B1jsU2r7.js → deliver-LsxKETro.js} +306 -12
  73. package/dist/{deliver-CLwC284e.js → deliver-xUU3mGHo.js} +302 -8
  74. package/dist/{deps-Cva7QM_t.js → deps-QSwGcoNZ.js} +2 -2
  75. package/dist/{deps-B6602Wid.js → deps-lAAA2zYI.js} +2 -2
  76. package/dist/{devices-cli-DPg_4aW8.js → devices-cli-BG3-2oqt.js} +13 -13
  77. package/dist/{devices-cli-D8K3hZR5.js → devices-cli-VIQtOvt_.js} +13 -13
  78. package/dist/{directory-cli-OGBSVKAZ.js → directory-cli-BCJwjVC0.js} +15 -15
  79. package/dist/{directory-cli-Bn47fFX7.js → directory-cli-jYzZ02gk.js} +14 -14
  80. package/dist/{dispatcher-BHsNwFe-.js → dispatcher-DY51b-Zc.js} +2 -2
  81. package/dist/{dns-cli-DmTHXgwU.js → dns-cli-DHIiMJjS.js} +11 -11
  82. package/dist/{dns-cli-kk2rysJh.js → dns-cli-pZlv87Ib.js} +11 -11
  83. package/dist/{docs-cli-CB77CeM4.js → docs-cli-2JDiwfzP.js} +7 -7
  84. package/dist/{docs-cli-DUcyw0X0.js → docs-cli-BhkYqoIQ.js} +6 -6
  85. package/dist/{doctor-DwqdkfPa.js → doctor-Bf8EhNtA.js} +33 -33
  86. package/dist/{doctor-BZfxDGUg.js → doctor-sYG5V4Co.js} +32 -32
  87. package/dist/entry.js +36 -14
  88. package/dist/{env-DE9xvYOL.js → env-ONzUVAG2.js} +1 -1
  89. package/dist/{exec-4WHuOniw.js → exec-B8lXct-k.js} +31 -13
  90. package/dist/{exec-B8JKbXKW.js → exec-CACT5OAW.js} +1 -1
  91. package/dist/{exec-D12IZYtJ.js → exec-CJFFoM7H.js} +31 -13
  92. package/dist/{exec-DXtR2fhb.js → exec-YIosokWE.js} +1 -1
  93. package/dist/{exec-approvals-cli-GizapOX5.js → exec-approvals-cli-7LH0lwhO.js} +19 -19
  94. package/dist/{exec-approvals-cli-BWO0Rs-a.js → exec-approvals-cli-apGnQbpj.js} +19 -19
  95. package/dist/extensionAPI.js +1108 -661
  96. package/dist/{fetch-CqZP8jwB.js → fetch-DmiOpALK.js} +5 -3
  97. package/dist/{fetch-timeout-B2KlHXi3.js → fetch-timeout-BEtUjM1S.js} +5 -3
  98. package/dist/{fetch-timeout-ohY5QmsW.js → fetch-timeout-DEoXG_SF.js} +5 -3
  99. package/dist/{fetch-timeout-4UKsdtE1.js → fetch-timeout-DTK9vxex.js} +5 -3
  100. package/dist/{gateway-cli-Bbd1Xbsc.js → gateway-cli-DUdYxlZS.js} +315 -103
  101. package/dist/{gateway-cli-PR1S0BTe.js → gateway-cli-DbvWmE-9.js} +314 -102
  102. package/dist/{gateway-rpc-8gue7Qjt.js → gateway-rpc-BByb2Snz.js} +3 -3
  103. package/dist/{gateway-rpc-DjuxyOm-.js → gateway-rpc-wXSCUZXj.js} +3 -3
  104. package/dist/{github-copilot-auth-B3chCDfc.js → github-copilot-auth-D7ewvpMd.js} +16 -8
  105. package/dist/{github-copilot-auth-Cm2SB8Qf.js → github-copilot-auth-DDispnyz.js} +16 -8
  106. package/dist/{github-copilot-token-SLWintYd.js → github-copilot-token-Cfs0Wxr8.js} +1 -1
  107. package/dist/{gmail-setup-utils-Cgh0ptgA.js → gmail-setup-utils-Cfns8TQx.js} +3 -3
  108. package/dist/{gmail-setup-utils-WDyf1gTU.js → gmail-setup-utils-DJb-_5kO.js} +4 -4
  109. package/dist/{health-format-C0C_Apce.js → health-format-KGPokKJH.js} +68 -28
  110. package/dist/{health-format-gLMfE2wf.js → health-format-LZDxu3rv.js} +67 -27
  111. package/dist/{help-format-5iAL_46a.js → help-format-C48TXngO.js} +1 -1
  112. package/dist/{help-format-DUy1KRxq.js → help-format-R5fLToDw.js} +1 -1
  113. package/dist/{hooks-cli-CEN1h1ya.js → hooks-cli-CT8JCRkH.js} +46 -44
  114. package/dist/{hooks-cli-DrchIqSi.js → hooks-cli-S1MKumJO.js} +47 -45
  115. package/dist/{hooks-status-Cgy6AtQk.js → hooks-status-Cw0xD8Lt.js} +3 -3
  116. package/dist/{hooks-status--xVLpAXz.js → hooks-status-D9MhwHRp.js} +3 -3
  117. package/dist/{image-Dkawt9Kg.js → image-Brk1sJbw.js} +4 -4
  118. package/dist/{image-DI9s9eEx.js → image-C4Nn2p3e.js} +5 -5
  119. package/dist/{image-LxFvu0wL.js → image-DgtfXMcX.js} +5 -5
  120. package/dist/{image-B4mDPdyz.js → image-RKwc3fsL.js} +4 -4
  121. package/dist/index.js +83 -83
  122. package/dist/{installs-NS0VMPN7.js → installs-CrLcWYHe.js} +4 -4
  123. package/dist/{installs-DA-eSN1B.js → installs-DscWb9b9.js} +5 -5
  124. package/dist/{links-CV4oki2u.js → links-B8LAzWwg.js} +1 -1
  125. package/dist/{links-7M-j83As.js → links-Eax1UO3w.js} +1 -1
  126. package/dist/llm-slug-generator.js +15 -15
  127. package/dist/{loader-Caow9TPA.js → loader-KjT074JR.js} +1105 -762
  128. package/dist/{logging-CeHn2itV.js → logging-BAyPwvdH.js} +1 -1
  129. package/dist/{logging-D0MyqUlV.js → logging-CRq4h04P.js} +2 -2
  130. package/dist/{login-qr-Xx8yJrSc.js → login-qr-B6ZgAuIf.js} +5 -5
  131. package/dist/{login-qr-CoskdtvN.js → login-qr-Bua-p0nG.js} +2 -2
  132. package/dist/{login-qr-CAk9D-FM.js → login-qr-CuvemJj4.js} +6 -6
  133. package/dist/{login-qr-kUyMWXV1.js → login-qr-Djr1JfIf.js} +2 -2
  134. package/dist/{logs-cli-B476pzJS.js → logs-cli-9IAV7rWY.js} +15 -15
  135. package/dist/{logs-cli-BQRUI_PO.js → logs-cli-EiKzUFPa.js} +14 -14
  136. package/dist/{manager-CBApH7eR.js → manager-BIMh_eSm.js} +5 -5
  137. package/dist/{manager-CyJH6WMg.js → manager-CwinWQoz.js} +5 -5
  138. package/dist/{manager-DScY_ZTT.js → manager-DkqF1GiK.js} +7 -7
  139. package/dist/{manager-DseK7RWj.js → manager-T1XfGchB.js} +8 -8
  140. package/dist/{manifest-registry-DFckk-L8.js → manifest-registry-CQhdnDBZ.js} +2 -2
  141. package/dist/{manifest-registry-BTgLN_W2.js → manifest-registry-u0okVSkU.js} +2 -2
  142. package/dist/{message-channel-0717wOz-.js → message-channel-BLi2a6Yw.js} +1 -1
  143. package/dist/{message-channel-BlgPSDAh.js → message-channel-C_MmebBt.js} +1 -1
  144. package/dist/{model-auth-CbqRVYRp.js → model-auth-CabXIF6O.js} +57 -19
  145. package/dist/{model-selection-unMJyUIE.js → model-selection-BLuqsGVB.js} +59 -21
  146. package/dist/{model-selection-B9Y7dKQd.js → model-selection-C1GmkTAV.js} +57 -19
  147. package/dist/{models-cli-B1cLGcRz.js → models-cli-9jmDv-h3.js} +50 -48
  148. package/dist/{models-cli-D7sChCi6.js → models-cli-zS9rtWz8.js} +48 -46
  149. package/dist/{node-cli-ic2C1xs2.js → node-cli-CrpTxTTs.js} +26 -24
  150. package/dist/{node-cli-CS3KwBh1.js → node-cli-wemUMCg-.js} +25 -23
  151. package/dist/{node-service-D_Cdq1JI.js → node-service-C8DTHTMg.js} +2 -2
  152. package/dist/{node-service-_vgO5xR-.js → node-service-WQuEKz6W.js} +1 -1
  153. package/dist/{nodes-cli-CipcvVMc.js → nodes-cli-BaU2SIFw.js} +16 -16
  154. package/dist/{nodes-cli-B1meaW7S.js → nodes-cli-Dx23D72n.js} +16 -16
  155. package/dist/{nodes-screen-N-4_0VIu.js → nodes-screen-C0IuBqUL.js} +1 -1
  156. package/dist/{note-CAM9PbSJ.js → note-BhRSeNeu.js} +2 -2
  157. package/dist/{note-Ci08TSbV.js → note-hhtubr2j.js} +1 -1
  158. package/dist/{onboard-channels-DMcOT0dj.js → onboard-channels-C501x8GI.js} +8 -8
  159. package/dist/{onboard-channels-CsT3E4bT.js → onboard-channels-Dxzroasd.js} +8 -8
  160. package/dist/{onboard-skills-DoxkpnEU.js → onboard-skills-DV0Qzvjj.js} +19 -19
  161. package/dist/{onboard-skills-D-BrCoRN.js → onboard-skills-rlBHcu3Q.js} +18 -18
  162. package/dist/{onboarding-B92952fz.js → onboarding-CN-EDLjd.js} +34 -34
  163. package/dist/{pairing-cli-BDUJ5VoX.js → pairing-cli-CDHG4xuI.js} +15 -15
  164. package/dist/{pairing-cli-0wbU1u8d.js → pairing-cli-CQP34Dlx.js} +14 -14
  165. package/dist/{pairing-labels-3o3QO3Qn.js → pairing-labels-B6CN0SNH.js} +1 -1
  166. package/dist/{pairing-labels-Bin1K7_f.js → pairing-labels-CgNHnjzT.js} +1 -1
  167. package/dist/{pairing-store-CL4rJ7m7.js → pairing-store-CmlRVqOz.js} +2 -2
  168. package/dist/{pairing-store-fIWI3pXG.js → pairing-store-Dp5_JGnG.js} +3 -3
  169. package/dist/{path-env-CXWUFfFv.js → path-env-CLvYNwtL.js} +1 -1
  170. package/dist/{path-env-C5FR_Eay.js → path-env-CaYUVIML.js} +2 -2
  171. package/dist/{paths-DwKNqk_S.js → paths-B0a4ywSO.js} +30 -5
  172. package/dist/{paths-RITJT4UY.js → paths-B49s6UZQ.js} +30 -5
  173. package/dist/{paths-CB2fqqbX.js → paths-D0O87MfH.js} +30 -5
  174. package/dist/{paths-IivnSNkP.js → paths-DLINmNFQ.js} +31 -6
  175. package/dist/{pi-embedded-DhYItk8O.js → pi-embedded-Ctrt2kz0.js} +1109 -662
  176. package/dist/{pi-embedded-helpers-CmftU5Zj.js → pi-embedded-helpers-CMKLjW6X.js} +8 -5
  177. package/dist/{pi-embedded-helpers-CfXnSIFx.js → pi-embedded-helpers-CUzTc1v6.js} +170 -19
  178. package/dist/{pi-embedded-helpers-Uan-3N1T.js → pi-embedded-helpers-DfwkwPYD.js} +7 -4
  179. package/dist/{pi-embedded-helpers-Bri9tk9g.js → pi-embedded-helpers-WDwx99UA.js} +170 -19
  180. package/dist/{pi-tools.policy-CJFi1sny.js → pi-tools.policy-BpsROZbz.js} +4 -4
  181. package/dist/{plugin-auto-enable-BY4CqJbD.js → plugin-auto-enable-Bqhc3w5n.js} +5 -5
  182. package/dist/{plugin-auto-enable-DbQrtQjL.js → plugin-auto-enable-PW76g_PJ.js} +5 -5
  183. package/dist/plugin-sdk/agents/pi-embedded-runner/run/params.d.ts +2 -0
  184. package/dist/plugin-sdk/agents/pi-embedded-runner/run/types.d.ts +2 -0
  185. package/dist/plugin-sdk/agents/pi-embedded-runner/types.d.ts +15 -0
  186. package/dist/plugin-sdk/agents/pi-embedded-subscribe.handlers.tools.d.ts +1 -1
  187. package/dist/plugin-sdk/agents/pi-embedded-subscribe.handlers.types.d.ts +2 -0
  188. package/dist/plugin-sdk/agents/pi-embedded-subscribe.types.d.ts +2 -0
  189. package/dist/plugin-sdk/agents/session-tool-result-guard-wrapper.d.ts +2 -0
  190. package/dist/plugin-sdk/agents/session-tool-result-guard.d.ts +4 -0
  191. package/dist/plugin-sdk/agents/tools/agent-step.d.ts +3 -0
  192. package/dist/plugin-sdk/agents/usage.d.ts +1 -0
  193. package/dist/plugin-sdk/auto-reply/reply/reply-reference.d.ts +1 -1
  194. package/dist/plugin-sdk/auto-reply/reply/session-run-accounting.d.ts +11 -0
  195. package/dist/plugin-sdk/auto-reply/reply/session-usage.d.ts +8 -0
  196. package/dist/plugin-sdk/browser/control-auth.d.ts +13 -0
  197. package/dist/plugin-sdk/channels/plugins/onboarding/signal.d.ts +1 -0
  198. package/dist/plugin-sdk/cli/prompt.d.ts +1 -0
  199. package/dist/plugin-sdk/commands/agent/types.d.ts +2 -0
  200. package/dist/plugin-sdk/config/sessions/paths.d.ts +7 -2
  201. package/dist/plugin-sdk/config/types.agents.d.ts +2 -0
  202. package/dist/plugin-sdk/config/types.discord.d.ts +5 -0
  203. package/dist/plugin-sdk/config/types.gateway.d.ts +15 -0
  204. package/dist/plugin-sdk/config/types.hooks.d.ts +15 -0
  205. package/dist/plugin-sdk/config/zod-schema.agents.d.ts +1 -0
  206. package/dist/plugin-sdk/config/zod-schema.d.ts +11 -0
  207. package/dist/plugin-sdk/config/zod-schema.providers-core.d.ts +9 -0
  208. package/dist/plugin-sdk/config/zod-schema.providers.d.ts +4 -0
  209. package/dist/plugin-sdk/discord/monitor/allow-list.d.ts +15 -0
  210. package/dist/plugin-sdk/discord/send.types.d.ts +3 -0
  211. package/dist/plugin-sdk/gateway/auth.d.ts +36 -0
  212. package/dist/plugin-sdk/gateway/protocol/schema/agent.d.ts +6 -0
  213. package/dist/plugin-sdk/gateway/session-utils.fs.d.ts +3 -1
  214. package/dist/plugin-sdk/index.js +295 -99
  215. package/dist/plugin-sdk/infra/binaries.d.ts +3 -0
  216. package/dist/plugin-sdk/infra/heartbeat-runner.d.ts +1 -0
  217. package/dist/plugin-sdk/infra/net/fetch-guard.d.ts +1 -0
  218. package/dist/plugin-sdk/infra/net/ssrf.d.ts +1 -0
  219. package/dist/plugin-sdk/infra/tailscale.d.ts +34 -0
  220. package/dist/plugin-sdk/infra/tmp-openclaw-dir.d.ts +10 -0
  221. package/dist/plugin-sdk/logging/logger.d.ts +1 -1
  222. package/dist/plugin-sdk/media/input-files.d.ts +5 -0
  223. package/dist/plugin-sdk/routing/resolve-route.d.ts +3 -1
  224. package/dist/plugin-sdk/security/external-content.d.ts +1 -1
  225. package/dist/plugin-sdk/security/secret-equal.d.ts +1 -0
  226. package/dist/plugin-sdk/sessions/input-provenance.d.ts +16 -0
  227. package/dist/plugin-sdk/signal/monitor/event-handler.types.d.ts +8 -0
  228. package/dist/plugin-sdk/signal/monitor/mentions.d.ts +2 -0
  229. package/dist/{plugins-3GyCj5KL.js → plugins-4Hqd1WGf.js} +3 -3
  230. package/dist/{plugins-BL9lIXSA.js → plugins-X7d_tfTE.js} +4 -4
  231. package/dist/{plugins-cli-Ce7VsvZh.js → plugins-cli-Bgku3EGj.js} +253 -46
  232. package/dist/{plugins-cli-e9gUebMd.js → plugins-cli-CVToH3if.js} +254 -47
  233. package/dist/{ports-DupIRXQ0.js → ports-qkt29rdC.js} +2 -2
  234. package/dist/{program-u22vbFpH.js → program-Cf7lkBur.js} +82 -82
  235. package/dist/{progress-g9R--HZD.js → progress-C9kngsTD.js} +1 -1
  236. package/dist/{progress-Da1ehW-x.js → progress-DWqhRakV.js} +1 -1
  237. package/dist/{prompt-style-Dc0C5HC9.js → prompt-style-BFH5D5LN.js} +1 -1
  238. package/dist/{prompt-style-lmJDcgtA.js → prompt-style-CIbmaxSa.js} +1 -1
  239. package/dist/{pw-ai-C43wv1ZF.js → pw-ai-8mdv3h-d.js} +7 -6
  240. package/dist/{pw-ai-DTZVjndL.js → pw-ai-CM1IsSgZ.js} +5 -5
  241. package/dist/{pw-ai-zVebjrSG.js → pw-ai-FGoRVblI.js} +3 -3
  242. package/dist/{pw-ai-CWrnJ98b.js → pw-ai-sS1fRKW_.js} +3 -3
  243. package/dist/{qmd-manager-NPD5Yh_4.js → qmd-manager-C67Fc8aN.js} +4 -4
  244. package/dist/{qmd-manager-ozZ933qc.js → qmd-manager-CXVbfg99.js} +7 -7
  245. package/dist/{qmd-manager-DBCZ1sio.js → qmd-manager-RMRE8Tqt.js} +6 -6
  246. package/dist/{qmd-manager-a9Bt0405.js → qmd-manager-pyc_MTIe.js} +4 -4
  247. package/dist/{register.subclis-BpX3ulH1.js → register.subclis-C02e4zuJ.js} +28 -28
  248. package/dist/{reply-m467_fOC.js → reply-DICXkh_C.js} +911 -568
  249. package/dist/{routes-82Ywfho6.js → routes-CmOI1hIH.js} +29 -11
  250. package/dist/{routes-BqxA3ZYr.js → routes-DewK5tq2.js} +29 -12
  251. package/dist/{rpc-DcGBG-Fp.js → rpc-DHr30euf.js} +3 -3
  252. package/dist/{rpc-CfdBHlnp.js → rpc-T300F8zI.js} +3 -3
  253. package/dist/{run-main-aolvSfj3.js → run-main-C5wpthq1.js} +84 -84
  254. package/dist/{runner-C1G8RFWl.js → runner-CY0nmVme.js} +9 -9
  255. package/dist/{runner-BCBs8JKA.js → runner-Cfm5nTMc.js} +6 -6
  256. package/dist/{runner-CInKPsiP.js → runner-D_dujMod.js} +8 -8
  257. package/dist/{runner-Cwfn-VOM.js → runner-DrGYLH5K.js} +6 -6
  258. package/dist/{sandbox-B0K9e6Fw.js → sandbox-BKYnhYQH.js} +23 -15
  259. package/dist/{sandbox-BW8Xnkw1.js → sandbox-Bhjnh1Xg.js} +21 -13
  260. package/dist/{sandbox-cli-mKCs2J0i.js → sandbox-cli-DBsAjZJN.js} +20 -20
  261. package/dist/{sandbox-cli-BD5LkZ0B.js → sandbox-cli-rV9LtFeu.js} +19 -19
  262. package/dist/{security-cli-kgI4soGy.js → security-cli-BIwJM_rs.js} +27 -27
  263. package/dist/{security-cli-kz8TiyqU.js → security-cli-BRjny8Yu.js} +26 -26
  264. package/dist/{server-context-fX4xiYRh.js → server-context-BGpGs3qd.js} +7 -7
  265. package/dist/{server-context-Lb-eUZG_.js → server-context-Cl0U0vE3.js} +5 -5
  266. package/dist/{server-node-events-Dx18uVrH.js → server-node-events-CBfTbiTA.js} +45 -43
  267. package/dist/{server-node-events-KqZMN30F.js → server-node-events-QCvh8EgI.js} +45 -43
  268. package/dist/{service-DZMXgMra.js → service--nPk7DvT.js} +3 -3
  269. package/dist/{service-DNcIZ5Kp.js → service-99RDXwX4.js} +2 -2
  270. package/dist/{service-audit-0WLGnoNT.js → service-audit-DnLmRGQt.js} +4 -4
  271. package/dist/{service-audit-uhZSlxeb.js → service-audit-ckBaRCVC.js} +3 -3
  272. package/dist/{session-cost-usage-HU4OeRgw.js → session-cost-usage-D7HuoSSD.js} +10 -8
  273. package/dist/{session-cost-usage-CL8gnHRN.js → session-cost-usage-D9hHANWI.js} +10 -8
  274. package/dist/{shared-j4Qtr475.js → shared-Bs4vduG4.js} +3 -3
  275. package/dist/{shared-BBw6F-YC.js → shared-CEY5IkwG.js} +2 -2
  276. package/dist/{shared-DOZs2SoH.js → shared-DRohONn_.js} +3 -3
  277. package/dist/{shared-CtP9K-o2.js → shared-ICqOZibV.js} +3 -3
  278. package/dist/{skill-scanner-C_fQzVDu.js → skill-scanner-rHMtUHtP.js} +1 -1
  279. package/dist/{skills-BvPUNjxo.js → skills-DRjfSQT3.js} +128 -4
  280. package/dist/{skills-aFOsriMP.js → skills-DprQj9X2.js} +129 -5
  281. package/dist/{skills-cli-oWaTJzZd.js → skills-cli-9WO-C55s.js} +12 -12
  282. package/dist/{skills-cli-E6shXpdd.js → skills-cli-B9eej-EW.js} +13 -13
  283. package/dist/{skills-status-D4vbIMnz.js → skills-status-5U3P3YfJ.js} +3 -3
  284. package/dist/{skills-status-DJDaA2Ur.js → skills-status-TDIgVd1K.js} +2 -2
  285. package/dist/{sqlite-B7FPASCO.js → sqlite-BINzs1U0.js} +2 -2
  286. package/dist/{sqlite-B4Z1_Ioc.js → sqlite-D4w5TejA.js} +2 -2
  287. package/dist/{sqlite-BkYnxkQO.js → sqlite-DRRHmlug.js} +2 -2
  288. package/dist/{sqlite-EuQPVXvn.js → sqlite-F6PGkEm1.js} +2 -2
  289. package/dist/{status-B2Yr-2J5.js → status-BKGkKC_v.js} +3 -3
  290. package/dist/{status-DW7m5xUN.js → status-CiHtHdaa.js} +4 -4
  291. package/dist/{status-CxhnUa5J.js → status-DDWoOpeB.js} +33 -33
  292. package/dist/{subsystem-Bv7dGhES.js → subsystem-BoExtIHo.js} +32 -13
  293. package/dist/{system-cli-0JXhJNWm.js → system-cli-B6lr60Io.js} +14 -14
  294. package/dist/{system-cli-D-0OaMtH.js → system-cli-CprW9G3h.js} +14 -14
  295. package/dist/{systemd-CNTodvCO.js → systemd-C0VZriGM.js} +2 -2
  296. package/dist/{systemd-CUJJHgHa.js → systemd-DrmBtJ5T.js} +3 -3
  297. package/dist/{systemd-hints-cmHtrXUl.js → systemd-hints-DZtXiVHa.js} +1 -1
  298. package/dist/{systemd-linger-CArPbmvv.js → systemd-linger-NC2kl1SC.js} +2 -2
  299. package/dist/{systemd-linger-XvT9Y9sb.js → systemd-linger-xdn3BdPh.js} +2 -2
  300. package/dist/{table-DzBBIqHO.js → table-B8dx3v4v.js} +2 -2
  301. package/dist/{table-oJQPTUL6.js → table-CwulTLQp.js} +1 -1
  302. package/dist/{tool-display-Na-EVL83.js → tool-display-CZRIDMRm.js} +1 -1
  303. package/dist/{tool-display-sHJa3kRs.js → tool-display-ClRud3pg.js} +2 -2
  304. package/dist/{tui-nGp8ltQK.js → tui-CVTQn-dC.js} +9 -9
  305. package/dist/{tui-Biw7aqPj.js → tui-Lu8FdrlK.js} +9 -9
  306. package/dist/{tui-cli-C9FEfG7C.js → tui-cli-BLpTj1X9.js} +25 -25
  307. package/dist/{tui-cli-Dxnu5JGl.js → tui-cli-BLx5kL2I.js} +25 -25
  308. package/dist/{tui-formatters-BiNTNGwg.js → tui-formatters-CNySEfJN.js} +5 -5
  309. package/dist/{tui-formatters-C_baVYUz.js → tui-formatters-DePhZK3J.js} +5 -5
  310. package/dist/{update-C4rsLj2F.js → update-DHVxMTpQ.js} +3 -3
  311. package/dist/{update-uwUWrKFu.js → update-DU1geolI.js} +3 -3
  312. package/dist/{update-cli-cNd_G9E6.js → update-cli-C0hUvJWK.js} +66 -66
  313. package/dist/{update-cli-CBXp-c4C.js → update-cli-Wb1GB3rL.js} +68 -68
  314. package/dist/{update-runner-BLsqC24J.js → update-runner--ixK4J3W.js} +10 -10
  315. package/dist/{update-runner-C_FDpmA3.js → update-runner-7Qa1T9y6.js} +9 -9
  316. package/dist/{utils-Dk86IbEs.js → utils-BLJAc3ZV.js} +1 -1
  317. package/dist/{utils-BHPdZE4h.js → utils-Cd9QdCHh.js} +1 -1
  318. package/dist/{webhooks-cli-BpBKXL7W.js → webhooks-cli-DgcMy7RG.js} +12 -12
  319. package/dist/{webhooks-cli-wNfhfKqm.js → webhooks-cli-aVzUcJY9.js} +11 -11
  320. package/dist/{widearea-dns-WVCWJTEb.js → widearea-dns-BaIgNEhY.js} +1 -1
  321. package/dist/{widearea-dns-BWYPcfby.js → widearea-dns-DzuRdwk5.js} +1 -1
  322. package/dist/{ws-log-Cafylho7.js → ws-log-CIXbLCka.js} +1 -1
  323. package/dist/{ws-log-DTUOUVgR.js → ws-log-DcQFZByi.js} +1 -1
  324. package/dist/{wsl-B-H6Z5wp.js → wsl-BUOkxKJu.js} +2 -2
  325. package/docs/automation/webhook.md +43 -2
  326. package/docs/channels/discord.md +29 -1
  327. package/docs/cli/plugins.md +20 -1
  328. package/docs/cli/security.md +1 -0
  329. package/docs/concepts/session-tool.md +1 -0
  330. package/docs/gateway/configuration-reference.md +11 -0
  331. package/docs/gateway/configuration.md +3 -0
  332. package/docs/gateway/openresponses-http-api.md +15 -0
  333. package/docs/gateway/security/index.md +3 -0
  334. package/docs/help/faq.md +9 -0
  335. package/docs/install/installer.md +20 -0
  336. package/docs/reference/transcript-hygiene.md +18 -0
  337. package/docs/tools/browser.md +6 -0
  338. package/extensions/diagnostics-otel/package.json +9 -9
  339. package/extensions/feishu/package.json +1 -1
  340. package/extensions/feishu/src/config-schema.ts +6 -0
  341. package/extensions/feishu/src/reply-dispatcher.test.ts +116 -0
  342. package/extensions/feishu/src/reply-dispatcher.ts +124 -67
  343. package/extensions/feishu/src/streaming-card.ts +223 -0
  344. package/extensions/feishu/src/targets.test.ts +16 -0
  345. package/extensions/feishu/src/targets.ts +1 -1
  346. package/extensions/irc/src/client.ts +1 -1
  347. package/extensions/minimax-portal-auth/index.ts +7 -5
  348. package/extensions/nostr/package.json +1 -1
  349. package/package.json +13 -13
  350. package/dist/auth-BcNHFK-i.js +0 -184
  351. package/dist/auth-jrfLXze7.js +0 -184
  352. /package/dist/{archive-DqNr5i8b.js → archive-beaSfAzA.js} +0 -0
  353. /package/dist/{brew-BIrWdDps.js → brew-BUIxHEkn.js} +0 -0
  354. /package/dist/{brew-6UyogeLe.js → brew-ROHf0-Xp.js} +0 -0
  355. /package/dist/{constants-DuoCkWRh.js → constants-BvQ6S8j5.js} +0 -0
  356. /package/dist/{errors-x4NYs-1P.js → errors-DjZBTJJ3.js} +0 -0
  357. /package/dist/{helpers-BDvtkJjw.js → helpers-HyeZXsnu.js} +0 -0
  358. /package/dist/{is-main-CE1eOBYb.js → is-main-BWoXGz7p.js} +0 -0
  359. /package/dist/{parse-Cjiudy6x.js → parse-Bw0oH-rT.js} +0 -0
  360. /package/dist/{parse-timeout-DFSPLxpY.js → parse-timeout-D1XX_zN_.js} +0 -0
  361. /package/dist/{prompts-BOz5176z.js → prompts-Bg96reub.js} +0 -0
  362. /package/dist/{redact-DuEEf1p1.js → redact-Br9GfacZ.js} +0 -0
  363. /package/dist/{skill-scanner-CprFkZib.js → skill-scanner-CucvxYhu.js} +0 -0
  364. /package/dist/{transcript-events-CZ8CG4ht.js → transcript-events-BtNd-j6q.js} +0 -0
@@ -1,23 +1,24 @@
1
1
  import { g as resolveStateDir, m as resolveOAuthDir, o as resolveConfigPath } from "./paths-DVBShlw6.js";
2
2
  import { l as normalizeAgentId } from "./session-key-BWxPj0z_.js";
3
- import { n as runExec } from "./exec-DXtR2fhb.js";
4
- import { c as resolveDefaultAgentId, s as resolveAgentWorkspaceDir } from "./agent-scope---6LLHj0.js";
3
+ import { n as runExec } from "./exec-YIosokWE.js";
4
+ import { c as resolveDefaultAgentId, s as resolveAgentWorkspaceDir } from "./agent-scope-CQCus0rI.js";
5
5
  import { t as formatCliCommand } from "./command-format-ChfKqObn.js";
6
- import { D as INCLUDE_KEY, O as MAX_INCLUDE_DEPTH, r as createConfigIO } from "./config-DH9TLUNc.js";
7
- import { a as MANIFEST_KEY } from "./manifest-registry-DFckk-L8.js";
8
- import { n as listChannelPlugins } from "./plugins-BL9lIXSA.js";
9
- import { $ as resolveSandboxToolPolicyForAgent, Z as resolveSandboxConfigForAgent, ot as resolveToolProfilePolicy } from "./sandbox-BW8Xnkw1.js";
10
- import { i as loadWorkspaceSkillEntries } from "./skills-aFOsriMP.js";
6
+ import { D as INCLUDE_KEY, O as MAX_INCLUDE_DEPTH, r as createConfigIO } from "./config-aFQssWKX.js";
7
+ import { a as MANIFEST_KEY } from "./manifest-registry-CQhdnDBZ.js";
8
+ import { n as listChannelPlugins } from "./plugins-X7d_tfTE.js";
9
+ import { $ as resolveSandboxToolPolicyForAgent, Z as resolveSandboxConfigForAgent, ot as resolveToolProfilePolicy } from "./sandbox-Bhjnh1Xg.js";
10
+ import { i as loadWorkspaceSkillEntries } from "./skills-DprQj9X2.js";
11
11
  import { n as formatErrorMessage } from "./errors-Bv81hF2P.js";
12
- import { a as resolveProfile, i as resolveBrowserConfig } from "./server-context-Lb-eUZG_.js";
13
- import { h as GATEWAY_CLIENT_NAMES, m as GATEWAY_CLIENT_MODES } from "./message-channel-0717wOz-.js";
14
- import { t as GatewayClient } from "./client-B0_GiCjB.js";
15
- import { t as buildGatewayConnectionDetails } from "./call-C9az806y.js";
16
- import { i as readChannelAllowFromStore } from "./pairing-store-CL4rJ7m7.js";
17
- import { c as resolveNativeSkillsEnabled, n as isToolAllowedByPolicies, s as resolveNativeCommandsEnabled } from "./pi-tools.policy-CJFi1sny.js";
18
- import { t as resolveChannelDefaultAccountId } from "./helpers-BDvtkJjw.js";
19
- import { t as scanDirectoryWithSummary } from "./skill-scanner-CprFkZib.js";
20
- import { i as resolveGatewayAuth } from "./auth-jrfLXze7.js";
12
+ import { a as resolveProfile, i as resolveBrowserConfig } from "./server-context-Cl0U0vE3.js";
13
+ import { h as GATEWAY_CLIENT_NAMES, m as GATEWAY_CLIENT_MODES } from "./message-channel-BLi2a6Yw.js";
14
+ import { t as GatewayClient } from "./client-BrYfyoDK.js";
15
+ import { t as buildGatewayConnectionDetails } from "./call-SolyGS1r.js";
16
+ import { i as readChannelAllowFromStore } from "./pairing-store-CmlRVqOz.js";
17
+ import { c as resolveNativeSkillsEnabled, n as isToolAllowedByPolicies, s as resolveNativeCommandsEnabled } from "./pi-tools.policy-BpsROZbz.js";
18
+ import { i as resolveGatewayAuth } from "./auth-CQNl_IaI.js";
19
+ import { n as resolveBrowserControlAuth } from "./control-auth-DBCu3qyv.js";
20
+ import { t as resolveChannelDefaultAccountId } from "./helpers-HyeZXsnu.js";
21
+ import { t as scanDirectoryWithSummary } from "./skill-scanner-CucvxYhu.js";
21
22
  import os from "node:os";
22
23
  import path from "node:path";
23
24
  import JSON5 from "json5";
@@ -143,6 +144,11 @@ function looksLikeEnvRef(value) {
143
144
  const v = value.trim();
144
145
  return v.startsWith("${") && v.endsWith("}");
145
146
  }
147
+ function isGatewayRemotelyExposed(cfg) {
148
+ if ((typeof cfg.gateway?.bind === "string" ? cfg.gateway.bind : "loopback") !== "loopback") return true;
149
+ const tailscaleMode = cfg.gateway?.tailscale?.mode ?? "off";
150
+ return tailscaleMode === "serve" || tailscaleMode === "funnel";
151
+ }
146
152
  function addModel(models, raw, source) {
147
153
  if (typeof raw !== "string") return;
148
154
  const id = raw.trim();
@@ -353,6 +359,31 @@ function collectHooksHardeningFindings(cfg) {
353
359
  detail: "hooks.path='/' would shadow other HTTP endpoints and is unsafe.",
354
360
  remediation: "Use a dedicated path like '/hooks'."
355
361
  });
362
+ const allowRequestSessionKey = cfg.hooks?.allowRequestSessionKey === true;
363
+ const defaultSessionKey = typeof cfg.hooks?.defaultSessionKey === "string" ? cfg.hooks.defaultSessionKey.trim() : "";
364
+ const allowedPrefixes = Array.isArray(cfg.hooks?.allowedSessionKeyPrefixes) ? cfg.hooks.allowedSessionKeyPrefixes.map((prefix) => prefix.trim()).filter((prefix) => prefix.length > 0) : [];
365
+ const remoteExposure = isGatewayRemotelyExposed(cfg);
366
+ if (!defaultSessionKey) findings.push({
367
+ checkId: "hooks.default_session_key_unset",
368
+ severity: "warn",
369
+ title: "hooks.defaultSessionKey is not configured",
370
+ detail: "Hook agent runs without explicit sessionKey use generated per-request keys. Set hooks.defaultSessionKey to keep hook ingress scoped to a known session.",
371
+ remediation: "Set hooks.defaultSessionKey (for example, \"hook:ingress\")."
372
+ });
373
+ if (allowRequestSessionKey) findings.push({
374
+ checkId: "hooks.request_session_key_enabled",
375
+ severity: remoteExposure ? "critical" : "warn",
376
+ title: "External hook payloads may override sessionKey",
377
+ detail: "hooks.allowRequestSessionKey=true allows `/hooks/agent` callers to choose the session key. Treat hook token holders as full-trust unless you also restrict prefixes.",
378
+ remediation: "Set hooks.allowRequestSessionKey=false (recommended) or constrain hooks.allowedSessionKeyPrefixes."
379
+ });
380
+ if (allowRequestSessionKey && allowedPrefixes.length === 0) findings.push({
381
+ checkId: "hooks.request_session_key_prefixes_missing",
382
+ severity: remoteExposure ? "critical" : "warn",
383
+ title: "Request sessionKey override is enabled without prefix restrictions",
384
+ detail: "hooks.allowRequestSessionKey=true and hooks.allowedSessionKeyPrefixes is unset/empty, so request payloads can target arbitrary session key shapes.",
385
+ remediation: "Set hooks.allowedSessionKeyPrefixes (for example, [\"hook:\"]) or disable request overrides."
386
+ });
356
387
  return findings;
357
388
  }
358
389
  function collectModelHygieneFindings(cfg) {
@@ -1361,6 +1392,7 @@ function collectGatewayConfigFindings(cfg, env) {
1361
1392
  const hasSharedSecret = auth.mode === "token" && hasToken || auth.mode === "password" && hasPassword;
1362
1393
  const hasTailscaleAuth = auth.allowTailscale && tailscaleMode === "serve";
1363
1394
  const hasGatewayAuth = hasSharedSecret || hasTailscaleAuth;
1395
+ const remotelyExposed = bind !== "loopback" || tailscaleMode === "serve" || tailscaleMode === "funnel";
1364
1396
  if (bind !== "loopback" && !hasSharedSecret) findings.push({
1365
1397
  checkId: "gateway.bind_no_auth",
1366
1398
  severity: "critical",
@@ -1416,9 +1448,21 @@ function collectGatewayConfigFindings(cfg, env) {
1416
1448
  title: "Gateway token looks short",
1417
1449
  detail: `gateway auth token is ${token.length} chars; prefer a long random token.`
1418
1450
  });
1451
+ const chatCompletionsEnabled = cfg.gateway?.http?.endpoints?.chatCompletions?.enabled === true;
1452
+ const responsesEnabled = cfg.gateway?.http?.endpoints?.responses?.enabled === true;
1453
+ if (chatCompletionsEnabled || responsesEnabled) {
1454
+ const enabledEndpoints = [chatCompletionsEnabled ? "/v1/chat/completions" : null, responsesEnabled ? "/v1/responses" : null].filter((value) => Boolean(value));
1455
+ findings.push({
1456
+ checkId: "gateway.http.session_key_override_enabled",
1457
+ severity: remotelyExposed ? "warn" : "info",
1458
+ title: "HTTP APIs accept explicit session key override headers",
1459
+ detail: `${enabledEndpoints.join(", ")} support x-openclaw-session-key. Any authenticated caller can route requests into arbitrary sessions.`,
1460
+ remediation: "Treat HTTP API credentials as full-trust, disable unused endpoints, and avoid sharing tokens across tenants."
1461
+ });
1462
+ }
1419
1463
  return findings;
1420
1464
  }
1421
- function collectBrowserControlFindings(cfg) {
1465
+ function collectBrowserControlFindings(cfg, env) {
1422
1466
  const findings = [];
1423
1467
  let resolved;
1424
1468
  try {
@@ -1434,6 +1478,14 @@ function collectBrowserControlFindings(cfg) {
1434
1478
  return findings;
1435
1479
  }
1436
1480
  if (!resolved.enabled) return findings;
1481
+ const browserAuth = resolveBrowserControlAuth(cfg, env);
1482
+ if (!browserAuth.token && !browserAuth.password) findings.push({
1483
+ checkId: "browser.control_no_auth",
1484
+ severity: "critical",
1485
+ title: "Browser control has no auth",
1486
+ detail: "Browser control HTTP routes are enabled but no gateway.auth token/password is configured. Any local process (or SSRF to loopback) can call browser control endpoints.",
1487
+ remediation: "Set gateway.auth.token (recommended) or gateway.auth.password so browser control HTTP routes require authentication. Restarting the gateway will auto-generate gateway.auth.token when browser control is enabled."
1488
+ });
1437
1489
  for (const name of Object.keys(resolved.profiles)) {
1438
1490
  const profile = resolveProfile(resolved, name);
1439
1491
  if (!profile || profile.cdpIsLoopback) continue;
@@ -1778,7 +1830,7 @@ async function runSecurityAudit(opts) {
1778
1830
  configPath
1779
1831
  }));
1780
1832
  findings.push(...collectGatewayConfigFindings(cfg, env));
1781
- findings.push(...collectBrowserControlFindings(cfg));
1833
+ findings.push(...collectBrowserControlFindings(cfg, env));
1782
1834
  findings.push(...collectLoggingFindings(cfg));
1783
1835
  findings.push(...collectElevatedFindings(cfg));
1784
1836
  findings.push(...collectHooksHardeningFindings(cfg));
@@ -1,23 +1,24 @@
1
- import { B as resolveConfigPath, J as resolveOAuthDir, X as resolveStateDir } from "./entry.js";
2
- import { t as formatCliCommand } from "./command-format-ayFsmwwz.js";
1
+ import { V as resolveConfigPath, Y as resolveOAuthDir, Z as resolveStateDir } from "./entry.js";
2
+ import { t as formatCliCommand } from "./command-format-Bxe0mWee.js";
3
3
  import { l as normalizeAgentId } from "./session-key-DVvxnFKg.js";
4
- import { n as runExec } from "./exec-B8JKbXKW.js";
5
- import { c as resolveDefaultAgentId, s as resolveAgentWorkspaceDir } from "./agent-scope-RCSw6gHy.js";
6
- import { D as INCLUDE_KEY, O as MAX_INCLUDE_DEPTH, r as createConfigIO } from "./config-B7sno9eI.js";
7
- import { a as MANIFEST_KEY } from "./manifest-registry-BTgLN_W2.js";
8
- import { a as resolveBrowserConfig, o as resolveProfile } from "./server-context-fX4xiYRh.js";
9
- import { n as formatErrorMessage } from "./errors-x4NYs-1P.js";
10
- import { i as resolveGatewayAuth } from "./auth-BcNHFK-i.js";
11
- import { t as GatewayClient } from "./client-D7wrC1Ug.js";
12
- import { t as buildGatewayConnectionDetails } from "./call-Yxns4CVq.js";
13
- import { h as GATEWAY_CLIENT_NAMES, m as GATEWAY_CLIENT_MODES } from "./message-channel-BlgPSDAh.js";
14
- import { n as listChannelPlugins } from "./plugins-3GyCj5KL.js";
4
+ import { n as runExec } from "./exec-CACT5OAW.js";
5
+ import { c as resolveDefaultAgentId, s as resolveAgentWorkspaceDir } from "./agent-scope-CsRbLH4l.js";
6
+ import { D as INCLUDE_KEY, O as MAX_INCLUDE_DEPTH, r as createConfigIO } from "./config-Bdhomfei.js";
7
+ import { a as MANIFEST_KEY } from "./manifest-registry-u0okVSkU.js";
8
+ import { a as resolveBrowserConfig, o as resolveProfile } from "./server-context-BGpGs3qd.js";
9
+ import { i as resolveGatewayAuth } from "./auth-9x3lqfIY.js";
10
+ import { n as resolveBrowserControlAuth } from "./control-auth-8Cf4WXpR.js";
11
+ import { n as formatErrorMessage } from "./errors-DjZBTJJ3.js";
12
+ import { t as GatewayClient } from "./client-CTwXnRl7.js";
13
+ import { t as buildGatewayConnectionDetails } from "./call-DVYCIV8m.js";
14
+ import { h as GATEWAY_CLIENT_NAMES, m as GATEWAY_CLIENT_MODES } from "./message-channel-C_MmebBt.js";
15
+ import { n as listChannelPlugins } from "./plugins-4Hqd1WGf.js";
15
16
  import { t as resolveChannelDefaultAccountId } from "./helpers-DdwqKAAS.js";
16
- import { t as scanDirectoryWithSummary } from "./skill-scanner-C_fQzVDu.js";
17
- import { G as resolveSandboxToolPolicyForAgent, Q as resolveToolProfilePolicy, U as resolveSandboxConfigForAgent } from "./sandbox-B0K9e6Fw.js";
18
- import { i as loadWorkspaceSkillEntries } from "./skills-BvPUNjxo.js";
19
- import { a as isToolAllowedByPolicies, n as resolveNativeCommandsEnabled, r as resolveNativeSkillsEnabled } from "./commands-BG25qku5.js";
20
- import { i as readChannelAllowFromStore } from "./pairing-store-fIWI3pXG.js";
17
+ import { t as scanDirectoryWithSummary } from "./skill-scanner-rHMtUHtP.js";
18
+ import { G as resolveSandboxToolPolicyForAgent, Q as resolveToolProfilePolicy, U as resolveSandboxConfigForAgent } from "./sandbox-BKYnhYQH.js";
19
+ import { i as loadWorkspaceSkillEntries } from "./skills-DRjfSQT3.js";
20
+ import { a as isToolAllowedByPolicies, n as resolveNativeCommandsEnabled, r as resolveNativeSkillsEnabled } from "./commands-BX_OIIVR.js";
21
+ import { i as readChannelAllowFromStore } from "./pairing-store-Dp5_JGnG.js";
21
22
  import path from "node:path";
22
23
  import os from "node:os";
23
24
  import JSON5 from "json5";
@@ -143,6 +144,11 @@ function looksLikeEnvRef(value) {
143
144
  const v = value.trim();
144
145
  return v.startsWith("${") && v.endsWith("}");
145
146
  }
147
+ function isGatewayRemotelyExposed(cfg) {
148
+ if ((typeof cfg.gateway?.bind === "string" ? cfg.gateway.bind : "loopback") !== "loopback") return true;
149
+ const tailscaleMode = cfg.gateway?.tailscale?.mode ?? "off";
150
+ return tailscaleMode === "serve" || tailscaleMode === "funnel";
151
+ }
146
152
  function addModel(models, raw, source) {
147
153
  if (typeof raw !== "string") return;
148
154
  const id = raw.trim();
@@ -353,6 +359,31 @@ function collectHooksHardeningFindings(cfg) {
353
359
  detail: "hooks.path='/' would shadow other HTTP endpoints and is unsafe.",
354
360
  remediation: "Use a dedicated path like '/hooks'."
355
361
  });
362
+ const allowRequestSessionKey = cfg.hooks?.allowRequestSessionKey === true;
363
+ const defaultSessionKey = typeof cfg.hooks?.defaultSessionKey === "string" ? cfg.hooks.defaultSessionKey.trim() : "";
364
+ const allowedPrefixes = Array.isArray(cfg.hooks?.allowedSessionKeyPrefixes) ? cfg.hooks.allowedSessionKeyPrefixes.map((prefix) => prefix.trim()).filter((prefix) => prefix.length > 0) : [];
365
+ const remoteExposure = isGatewayRemotelyExposed(cfg);
366
+ if (!defaultSessionKey) findings.push({
367
+ checkId: "hooks.default_session_key_unset",
368
+ severity: "warn",
369
+ title: "hooks.defaultSessionKey is not configured",
370
+ detail: "Hook agent runs without explicit sessionKey use generated per-request keys. Set hooks.defaultSessionKey to keep hook ingress scoped to a known session.",
371
+ remediation: "Set hooks.defaultSessionKey (for example, \"hook:ingress\")."
372
+ });
373
+ if (allowRequestSessionKey) findings.push({
374
+ checkId: "hooks.request_session_key_enabled",
375
+ severity: remoteExposure ? "critical" : "warn",
376
+ title: "External hook payloads may override sessionKey",
377
+ detail: "hooks.allowRequestSessionKey=true allows `/hooks/agent` callers to choose the session key. Treat hook token holders as full-trust unless you also restrict prefixes.",
378
+ remediation: "Set hooks.allowRequestSessionKey=false (recommended) or constrain hooks.allowedSessionKeyPrefixes."
379
+ });
380
+ if (allowRequestSessionKey && allowedPrefixes.length === 0) findings.push({
381
+ checkId: "hooks.request_session_key_prefixes_missing",
382
+ severity: remoteExposure ? "critical" : "warn",
383
+ title: "Request sessionKey override is enabled without prefix restrictions",
384
+ detail: "hooks.allowRequestSessionKey=true and hooks.allowedSessionKeyPrefixes is unset/empty, so request payloads can target arbitrary session key shapes.",
385
+ remediation: "Set hooks.allowedSessionKeyPrefixes (for example, [\"hook:\"]) or disable request overrides."
386
+ });
356
387
  return findings;
357
388
  }
358
389
  function collectModelHygieneFindings(cfg) {
@@ -1361,6 +1392,7 @@ function collectGatewayConfigFindings(cfg, env) {
1361
1392
  const hasSharedSecret = auth.mode === "token" && hasToken || auth.mode === "password" && hasPassword;
1362
1393
  const hasTailscaleAuth = auth.allowTailscale && tailscaleMode === "serve";
1363
1394
  const hasGatewayAuth = hasSharedSecret || hasTailscaleAuth;
1395
+ const remotelyExposed = bind !== "loopback" || tailscaleMode === "serve" || tailscaleMode === "funnel";
1364
1396
  if (bind !== "loopback" && !hasSharedSecret) findings.push({
1365
1397
  checkId: "gateway.bind_no_auth",
1366
1398
  severity: "critical",
@@ -1416,9 +1448,21 @@ function collectGatewayConfigFindings(cfg, env) {
1416
1448
  title: "Gateway token looks short",
1417
1449
  detail: `gateway auth token is ${token.length} chars; prefer a long random token.`
1418
1450
  });
1451
+ const chatCompletionsEnabled = cfg.gateway?.http?.endpoints?.chatCompletions?.enabled === true;
1452
+ const responsesEnabled = cfg.gateway?.http?.endpoints?.responses?.enabled === true;
1453
+ if (chatCompletionsEnabled || responsesEnabled) {
1454
+ const enabledEndpoints = [chatCompletionsEnabled ? "/v1/chat/completions" : null, responsesEnabled ? "/v1/responses" : null].filter((value) => Boolean(value));
1455
+ findings.push({
1456
+ checkId: "gateway.http.session_key_override_enabled",
1457
+ severity: remotelyExposed ? "warn" : "info",
1458
+ title: "HTTP APIs accept explicit session key override headers",
1459
+ detail: `${enabledEndpoints.join(", ")} support x-openclaw-session-key. Any authenticated caller can route requests into arbitrary sessions.`,
1460
+ remediation: "Treat HTTP API credentials as full-trust, disable unused endpoints, and avoid sharing tokens across tenants."
1461
+ });
1462
+ }
1419
1463
  return findings;
1420
1464
  }
1421
- function collectBrowserControlFindings(cfg) {
1465
+ function collectBrowserControlFindings(cfg, env) {
1422
1466
  const findings = [];
1423
1467
  let resolved;
1424
1468
  try {
@@ -1434,6 +1478,14 @@ function collectBrowserControlFindings(cfg) {
1434
1478
  return findings;
1435
1479
  }
1436
1480
  if (!resolved.enabled) return findings;
1481
+ const browserAuth = resolveBrowserControlAuth(cfg, env);
1482
+ if (!browserAuth.token && !browserAuth.password) findings.push({
1483
+ checkId: "browser.control_no_auth",
1484
+ severity: "critical",
1485
+ title: "Browser control has no auth",
1486
+ detail: "Browser control HTTP routes are enabled but no gateway.auth token/password is configured. Any local process (or SSRF to loopback) can call browser control endpoints.",
1487
+ remediation: "Set gateway.auth.token (recommended) or gateway.auth.password so browser control HTTP routes require authentication. Restarting the gateway will auto-generate gateway.auth.token when browser control is enabled."
1488
+ });
1437
1489
  for (const name of Object.keys(resolved.profiles)) {
1438
1490
  const profile = resolveProfile(resolved, name);
1439
1491
  if (!profile || profile.cdpIsLoopback) continue;
@@ -1778,7 +1830,7 @@ async function runSecurityAudit(opts) {
1778
1830
  configPath
1779
1831
  }));
1780
1832
  findings.push(...collectGatewayConfigFindings(cfg, env));
1781
- findings.push(...collectBrowserControlFindings(cfg));
1833
+ findings.push(...collectBrowserControlFindings(cfg, env));
1782
1834
  findings.push(...collectLoggingFindings(cfg));
1783
1835
  findings.push(...collectElevatedFindings(cfg));
1784
1836
  findings.push(...collectHooksHardeningFindings(cfg));
@@ -1,7 +1,27 @@
1
- import { x as logVerbose } from "./entry.js";
2
- import { n as runExec } from "./exec-B8JKbXKW.js";
1
+ import { S as logVerbose, b as isVerbose, x as isYes } from "./entry.js";
2
+ import { n as runExec } from "./exec-CACT5OAW.js";
3
+ import { i as isTrustedProxyAddress, l as resolveGatewayClientIp, n as isLoopbackAddress, o as parseForwardedForClientIp } from "./ws-C0k_dhCP.js";
4
+ import { stdin, stdout } from "node:process";
3
5
  import { existsSync } from "node:fs";
6
+ import { timingSafeEqual } from "node:crypto";
7
+ import readline from "node:readline/promises";
4
8
 
9
+ //#region src/cli/prompt.ts
10
+ async function promptYesNo(question, defaultYes = false) {
11
+ if (isVerbose() && isYes()) return true;
12
+ if (isYes()) return true;
13
+ const rl = readline.createInterface({
14
+ input: stdin,
15
+ output: stdout
16
+ });
17
+ const suffix = defaultYes ? " [Y/n] " : " [y/N] ";
18
+ const answer = (await rl.question(`${question}${suffix}`)).trim().toLowerCase();
19
+ rl.close();
20
+ if (!answer) return defaultYes;
21
+ return answer.startsWith("y");
22
+ }
23
+
24
+ //#endregion
5
25
  //#region src/infra/tailscale.ts
6
26
  function parsePossiblyNoisyJsonObject(stdout) {
7
27
  const trimmed = stdout.trim();
@@ -222,4 +242,189 @@ async function readTailscaleWhoisIdentity(ip, exec = runExec, opts) {
222
242
  }
223
243
 
224
244
  //#endregion
225
- export { findTailscaleBinary as a, readTailscaleWhoisIdentity as c, enableTailscaleServe as i, disableTailscaleServe as n, getTailnetHostname as o, enableTailscaleFunnel as r, readTailscaleStatusJson as s, disableTailscaleFunnel as t };
245
+ //#region src/security/secret-equal.ts
246
+ function safeEqualSecret(provided, expected) {
247
+ if (typeof provided !== "string" || typeof expected !== "string") return false;
248
+ const providedBuffer = Buffer.from(provided);
249
+ const expectedBuffer = Buffer.from(expected);
250
+ if (providedBuffer.length !== expectedBuffer.length) return false;
251
+ return timingSafeEqual(providedBuffer, expectedBuffer);
252
+ }
253
+
254
+ //#endregion
255
+ //#region src/gateway/auth.ts
256
+ function normalizeLogin(login) {
257
+ return login.trim().toLowerCase();
258
+ }
259
+ function getHostName(hostHeader) {
260
+ const host = (hostHeader ?? "").trim().toLowerCase();
261
+ if (!host) return "";
262
+ if (host.startsWith("[")) {
263
+ const end = host.indexOf("]");
264
+ if (end !== -1) return host.slice(1, end);
265
+ }
266
+ const [name] = host.split(":");
267
+ return name ?? "";
268
+ }
269
+ function headerValue(value) {
270
+ return Array.isArray(value) ? value[0] : value;
271
+ }
272
+ function resolveTailscaleClientIp(req) {
273
+ if (!req) return;
274
+ const forwardedFor = headerValue(req.headers?.["x-forwarded-for"]);
275
+ return forwardedFor ? parseForwardedForClientIp(forwardedFor) : void 0;
276
+ }
277
+ function resolveRequestClientIp(req, trustedProxies) {
278
+ if (!req) return;
279
+ return resolveGatewayClientIp({
280
+ remoteAddr: req.socket?.remoteAddress ?? "",
281
+ forwardedFor: headerValue(req.headers?.["x-forwarded-for"]),
282
+ realIp: headerValue(req.headers?.["x-real-ip"]),
283
+ trustedProxies
284
+ });
285
+ }
286
+ function isLocalDirectRequest(req, trustedProxies) {
287
+ if (!req) return false;
288
+ if (!isLoopbackAddress(resolveRequestClientIp(req, trustedProxies) ?? "")) return false;
289
+ const host = getHostName(req.headers?.host);
290
+ const hostIsLocal = host === "localhost" || host === "127.0.0.1" || host === "::1";
291
+ const hostIsTailscaleServe = host.endsWith(".ts.net");
292
+ const hasForwarded = Boolean(req.headers?.["x-forwarded-for"] || req.headers?.["x-real-ip"] || req.headers?.["x-forwarded-host"]);
293
+ const remoteIsTrustedProxy = isTrustedProxyAddress(req.socket?.remoteAddress, trustedProxies);
294
+ return (hostIsLocal || hostIsTailscaleServe) && (!hasForwarded || remoteIsTrustedProxy);
295
+ }
296
+ function getTailscaleUser(req) {
297
+ if (!req) return null;
298
+ const login = req.headers["tailscale-user-login"];
299
+ if (typeof login !== "string" || !login.trim()) return null;
300
+ const nameRaw = req.headers["tailscale-user-name"];
301
+ const profilePic = req.headers["tailscale-user-profile-pic"];
302
+ const name = typeof nameRaw === "string" && nameRaw.trim() ? nameRaw.trim() : login.trim();
303
+ return {
304
+ login: login.trim(),
305
+ name,
306
+ profilePic: typeof profilePic === "string" && profilePic.trim() ? profilePic.trim() : void 0
307
+ };
308
+ }
309
+ function hasTailscaleProxyHeaders(req) {
310
+ if (!req) return false;
311
+ return Boolean(req.headers["x-forwarded-for"] && req.headers["x-forwarded-proto"] && req.headers["x-forwarded-host"]);
312
+ }
313
+ function isTailscaleProxyRequest(req) {
314
+ if (!req) return false;
315
+ return isLoopbackAddress(req.socket?.remoteAddress) && hasTailscaleProxyHeaders(req);
316
+ }
317
+ async function resolveVerifiedTailscaleUser(params) {
318
+ const { req, tailscaleWhois } = params;
319
+ const tailscaleUser = getTailscaleUser(req);
320
+ if (!tailscaleUser) return {
321
+ ok: false,
322
+ reason: "tailscale_user_missing"
323
+ };
324
+ if (!isTailscaleProxyRequest(req)) return {
325
+ ok: false,
326
+ reason: "tailscale_proxy_missing"
327
+ };
328
+ const clientIp = resolveTailscaleClientIp(req);
329
+ if (!clientIp) return {
330
+ ok: false,
331
+ reason: "tailscale_whois_failed"
332
+ };
333
+ const whois = await tailscaleWhois(clientIp);
334
+ if (!whois?.login) return {
335
+ ok: false,
336
+ reason: "tailscale_whois_failed"
337
+ };
338
+ if (normalizeLogin(whois.login) !== normalizeLogin(tailscaleUser.login)) return {
339
+ ok: false,
340
+ reason: "tailscale_user_mismatch"
341
+ };
342
+ return {
343
+ ok: true,
344
+ user: {
345
+ login: whois.login,
346
+ name: whois.name ?? tailscaleUser.name,
347
+ profilePic: tailscaleUser.profilePic
348
+ }
349
+ };
350
+ }
351
+ function resolveGatewayAuth(params) {
352
+ const authConfig = params.authConfig ?? {};
353
+ const env = params.env ?? process.env;
354
+ const token = authConfig.token ?? env.OPENCLAW_GATEWAY_TOKEN ?? env.CLAWDBOT_GATEWAY_TOKEN ?? void 0;
355
+ const password = authConfig.password ?? env.OPENCLAW_GATEWAY_PASSWORD ?? env.CLAWDBOT_GATEWAY_PASSWORD ?? void 0;
356
+ const mode = authConfig.mode ?? (password ? "password" : "token");
357
+ return {
358
+ mode,
359
+ token,
360
+ password,
361
+ allowTailscale: authConfig.allowTailscale ?? (params.tailscaleMode === "serve" && mode !== "password")
362
+ };
363
+ }
364
+ function assertGatewayAuthConfigured(auth) {
365
+ if (auth.mode === "token" && !auth.token) {
366
+ if (auth.allowTailscale) return;
367
+ throw new Error("gateway auth mode is token, but no token was configured (set gateway.auth.token or OPENCLAW_GATEWAY_TOKEN)");
368
+ }
369
+ if (auth.mode === "password" && !auth.password) throw new Error("gateway auth mode is password, but no password was configured");
370
+ }
371
+ async function authorizeGatewayConnect(params) {
372
+ const { auth, connectAuth, req, trustedProxies } = params;
373
+ const tailscaleWhois = params.tailscaleWhois ?? readTailscaleWhoisIdentity;
374
+ const localDirect = isLocalDirectRequest(req, trustedProxies);
375
+ if (auth.allowTailscale && !localDirect) {
376
+ const tailscaleCheck = await resolveVerifiedTailscaleUser({
377
+ req,
378
+ tailscaleWhois
379
+ });
380
+ if (tailscaleCheck.ok) return {
381
+ ok: true,
382
+ method: "tailscale",
383
+ user: tailscaleCheck.user.login
384
+ };
385
+ }
386
+ if (auth.mode === "token") {
387
+ if (!auth.token) return {
388
+ ok: false,
389
+ reason: "token_missing_config"
390
+ };
391
+ if (!connectAuth?.token) return {
392
+ ok: false,
393
+ reason: "token_missing"
394
+ };
395
+ if (!safeEqualSecret(connectAuth.token, auth.token)) return {
396
+ ok: false,
397
+ reason: "token_mismatch"
398
+ };
399
+ return {
400
+ ok: true,
401
+ method: "token"
402
+ };
403
+ }
404
+ if (auth.mode === "password") {
405
+ const password = connectAuth?.password;
406
+ if (!auth.password) return {
407
+ ok: false,
408
+ reason: "password_missing_config"
409
+ };
410
+ if (!password) return {
411
+ ok: false,
412
+ reason: "password_missing"
413
+ };
414
+ if (!safeEqualSecret(password, auth.password)) return {
415
+ ok: false,
416
+ reason: "password_mismatch"
417
+ };
418
+ return {
419
+ ok: true,
420
+ method: "password"
421
+ };
422
+ }
423
+ return {
424
+ ok: false,
425
+ reason: "unauthorized"
426
+ };
427
+ }
428
+
429
+ //#endregion
430
+ export { safeEqualSecret as a, enableTailscaleFunnel as c, getTailnetHostname as d, readTailscaleStatusJson as f, resolveGatewayAuth as i, enableTailscaleServe as l, authorizeGatewayConnect as n, disableTailscaleFunnel as o, promptYesNo as p, isLocalDirectRequest as r, disableTailscaleServe as s, assertGatewayAuthConfigured as t, findTailscaleBinary as u };