activeclaw 2026.2.11 → 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 (531) hide show
  1. package/CHANGELOG.md +106 -0
  2. package/dist/{accounts-DbzMEfKN.js → accounts-DCDeFTra.js} +2 -2
  3. package/dist/{accounts-C2elk6PC.js → accounts-DeqIQjo1.js} +2 -2
  4. package/dist/{acp-cli-CVFTdsQY.js → acp-cli-CeYI4XRd.js} +15 -16
  5. package/dist/{acp-cli-BpJwIyLl.js → acp-cli-rNbGXICg.js} +14 -15
  6. package/dist/{agent-Bz1r5O8q.js → agent-BvNJF5QL.js} +19 -15
  7. package/dist/{agent-22-R4bNS.js → agent-CyMxTyrG.js} +20 -16
  8. package/dist/{agent-scope-D8miw9q_.js → agent-scope-BIEhVP4_.js} +172 -4
  9. package/dist/{agent-scope-CGmuusG9.js → agent-scope-CQCus0rI.js} +3 -3
  10. package/dist/{agent-scope-DQuy3dwI.js → agent-scope-CsRbLH4l.js} +4 -4
  11. package/dist/{agent-scope-BEf5crnU.js → agent-scope-DPIFau3f.js} +5 -1
  12. package/dist/audio-preflight-BU8W7uxc.js +60 -0
  13. package/dist/audio-preflight-CGsumMzb.js +60 -0
  14. package/dist/audio-preflight-SLmkJI6-.js +74 -0
  15. package/dist/audio-preflight-jZc5mFCZ.js +71 -0
  16. package/dist/{audit-C4wLaF0D.js → audit-Dmww_503.js} +71 -19
  17. package/dist/{audit-CY-yopxa.js → audit-wPu26VMb.js} +72 -20
  18. package/dist/{tailscale-DU6DgqVy.js → auth-9x3lqfIY.js} +208 -3
  19. package/dist/{tailscale-Cu-2HNvU.js → auth-CQNl_IaI.js} +190 -3
  20. package/dist/{auth-health-BFKUoCwJ.js → auth-health-C4L4FGBA.js} +1 -1
  21. package/dist/{auth-health-d7BMZlWG.js → auth-health-j6epgQbq.js} +1 -1
  22. package/dist/{auth-profiles-Bv1AEm-Y.js → auth-profiles-ByNs3eEm.js} +87 -31
  23. package/dist/build-info.json +3 -3
  24. package/dist/bundled/boot-md/handler.js +28 -22
  25. package/dist/bundled/session-memory/handler.js +33 -22
  26. package/dist/{call-7yrB6v4I.js → call-DVYCIV8m.js} +5 -5
  27. package/dist/{call-Bek1xlgk.js → call-SolyGS1r.js} +6 -6
  28. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  29. package/dist/{channel-options-3mdYN0C_.js → channel-options-BwC2yQcR.js} +4 -4
  30. package/dist/{channel-options-DJ0b1m7B.js → channel-options-Cq9BVDkP.js} +12 -7
  31. package/dist/{channel-selection-RZimme3j.js → channel-selection-D4D6ImhN.js} +2 -2
  32. package/dist/{channel-selection-B9b7Kuit.js → channel-selection-MZAHm4U8.js} +2 -2
  33. package/dist/{channels-cli-CYbK2Dku.js → channels-cli-9Dsk9Qm7.js} +57 -53
  34. package/dist/{channels-cli-BFznbGOs.js → channels-cli-BJUppQll.js} +59 -55
  35. package/dist/{channels-status-issues-B3KkflfR.js → channels-status-issues-D7GSV1GS.js} +1 -1
  36. package/dist/{channels-status-issues-DQkRaZts.js → channels-status-issues-DDAWeT-6.js} +1 -1
  37. package/dist/{chrome-Db7w64LF.js → chrome-BfB6JdKF.js} +4 -4
  38. package/dist/{chrome-Dm-EgOjJ.js → chrome-Cvr-57lg.js} +6 -5
  39. package/dist/{chrome-CF16STk9.js → chrome-DL0avO8n.js} +2 -1
  40. package/dist/{chrome-yIKmOzCO.js → chrome-foEwx3lN.js} +5 -4
  41. package/dist/{clack-prompter-BCiBkJVr.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-Cl3PdJei.js → cli-ZR9ugUBX.js} +42 -38
  45. package/dist/cli-miPe4Ujz.js +93 -0
  46. package/dist/{client-6xKrRC-1.js → client-BrYfyoDK.js} +54 -5
  47. package/dist/{client-DMloFP_O.js → client-CTwXnRl7.js} +54 -5
  48. package/dist/{command-format-ayFsmwwz.js → command-format-Bxe0mWee.js} +1 -1
  49. package/dist/{command-options-BTAzyqqb.js → command-options-BvgxzPbK.js} +9 -4
  50. package/dist/{commands-CjEGXOZ_.js → commands-BX_OIIVR.js} +4 -4
  51. package/dist/{completion-cli-DrJGfJGl.js → completion-cli-CR77-jyv.js} +3 -3
  52. package/dist/{completion-cli-DOec3E2Z.js → completion-cli-DnjpxAag.js} +30 -30
  53. package/dist/{config-B00lvFac.js → config-Bdhomfei.js} +21 -7
  54. package/dist/{config-XBdA0ciN.js → config-BvMsmctM.js} +83 -9
  55. package/dist/{config-BqGVMf1y.js → config-QYrbd7x7.js} +60 -6
  56. package/dist/{config--NUdpACy.js → config-aFQssWKX.js} +21 -7
  57. package/dist/{config-guard-4kCO_rnQ.js → config-guard-CljaSxJd.js} +160 -51
  58. package/dist/{configure-B69emwZv.js → configure-BXLiucXo.js} +28 -25
  59. package/dist/{configure-sMhpLzFf.js → configure-BYPqXzGZ.js} +28 -25
  60. package/dist/control-auth-8Cf4WXpR.js +54 -0
  61. package/dist/control-auth-DBCu3qyv.js +54 -0
  62. package/dist/{control-service-Db_1V-KY.js → control-service-B5KnPqGP.js} +11 -5
  63. package/dist/{control-service-IRAmbcbN.js → control-service-DKnttEus.js} +10 -4
  64. package/dist/control-ui/assets/{index-CnB9IO4a.js → index-B4LPvte9.js} +369 -369
  65. package/dist/control-ui/assets/index-B4LPvte9.js.map +1 -0
  66. package/dist/control-ui/index.html +1 -1
  67. package/dist/{cron-cli-Cum2324v.js → cron-cli-D7BRjDv2.js} +20 -20
  68. package/dist/{cron-cli-DhUWcYdk.js → cron-cli-z1zk_FXQ.js} +19 -19
  69. package/dist/{daemon-cli-q7nkEF5-.js → daemon-cli-BDkU2ocb.js} +60 -21
  70. package/dist/{daemon-cli-CTC2CHci.js → daemon-cli-cNSF93-v.js} +59 -20
  71. package/dist/{daemon-runtime-c0uXH4Dl.js → daemon-runtime-B0tg_LsX.js} +3 -3
  72. package/dist/{daemon-runtime-UsK-tOty.js → daemon-runtime-Bsjeut6m.js} +3 -3
  73. package/dist/{deliver-hf-WKyWd.js → deliver-CIU9Npgs.js} +373 -281
  74. package/dist/{deliver-CT6KiDqO.js → deliver-DYYCo1G7.js} +369 -278
  75. package/dist/{deliver-T9d44OpZ.js → deliver-LsxKETro.js} +371 -279
  76. package/dist/{deliver-CPy8jYj9.js → deliver-xUU3mGHo.js} +369 -277
  77. package/dist/{deps-Bv1kLtwo.js → deps-QSwGcoNZ.js} +2 -2
  78. package/dist/{deps-DFQdAWQc.js → deps-lAAA2zYI.js} +2 -2
  79. package/dist/{devices-cli-Cm7U1py9.js → devices-cli-BG3-2oqt.js} +14 -14
  80. package/dist/{devices-cli-ZpjlfK-e.js → devices-cli-VIQtOvt_.js} +14 -14
  81. package/dist/{directory-cli-B14TUSJA.js → directory-cli-BCJwjVC0.js} +16 -16
  82. package/dist/{directory-cli-67kzd4I5.js → directory-cli-jYzZ02gk.js} +14 -14
  83. package/dist/{dispatcher-3ElQWGVI.js → dispatcher-DY51b-Zc.js} +2 -2
  84. package/dist/{dns-cli-CU-xfhTN.js → dns-cli-DHIiMJjS.js} +12 -12
  85. package/dist/{dns-cli-Dqj7O6Q_.js → dns-cli-pZlv87Ib.js} +11 -11
  86. package/dist/{docs-cli-CamBqzb5.js → docs-cli-2JDiwfzP.js} +8 -8
  87. package/dist/{docs-cli-Cj3L5oqB.js → docs-cli-BhkYqoIQ.js} +7 -7
  88. package/dist/{doctor-BV1kvbMm.js → doctor-Bf8EhNtA.js} +36 -35
  89. package/dist/{doctor-BJirShBi.js → doctor-sYG5V4Co.js} +34 -33
  90. package/dist/entry.js +56 -18
  91. package/dist/{env-BxRc6wWv.js → env-ONzUVAG2.js} +1 -1
  92. package/dist/{exec-CijMSZd9.js → exec-B8lXct-k.js} +503 -14
  93. package/dist/{exec-B8JKbXKW.js → exec-CACT5OAW.js} +1 -1
  94. package/dist/{exec-57A8Rlc8.js → exec-CJFFoM7H.js} +32 -13
  95. package/dist/{exec-Cv_Ofd1m.js → exec-YIosokWE.js} +1 -1
  96. package/dist/{exec-approvals-cli-DEzz9Iai.js → exec-approvals-cli-7LH0lwhO.js} +21 -21
  97. package/dist/{exec-approvals-cli-DhXj3hQX.js → exec-approvals-cli-apGnQbpj.js} +21 -21
  98. package/dist/extensionAPI.js +7733 -8746
  99. package/dist/fetch-DmiOpALK.js +274 -0
  100. package/dist/fetch-timeout-BEtUjM1S.js +274 -0
  101. package/dist/fetch-timeout-DEoXG_SF.js +274 -0
  102. package/dist/fetch-timeout-DTK9vxex.js +274 -0
  103. package/dist/{gateway-cli-D1EdIq8I.js → gateway-cli-DUdYxlZS.js} +491 -136
  104. package/dist/{gateway-cli-B_xDUDy2.js → gateway-cli-DbvWmE-9.js} +495 -140
  105. package/dist/{gateway-rpc-3B5y445n.js → gateway-rpc-BByb2Snz.js} +3 -3
  106. package/dist/{gateway-rpc-BoL2vinh.js → gateway-rpc-wXSCUZXj.js} +3 -3
  107. package/dist/{github-copilot-auth-Omqrto0J.js → github-copilot-auth-D7ewvpMd.js} +205 -17
  108. package/dist/{github-copilot-auth-CZxurvdz.js → github-copilot-auth-DDispnyz.js} +205 -17
  109. package/dist/{github-copilot-token-SLWintYd.js → github-copilot-token-Cfs0Wxr8.js} +1 -1
  110. package/dist/{gmail-setup-utils-BXQKsLtI.js → gmail-setup-utils-Cfns8TQx.js} +3 -3
  111. package/dist/{gmail-setup-utils-CHcssBOA.js → gmail-setup-utils-DJb-_5kO.js} +4 -4
  112. package/dist/{health-format-Dy1caGsq.js → health-format-KGPokKJH.js} +97 -42
  113. package/dist/{health-format-DrGFg8bx.js → health-format-LZDxu3rv.js} +95 -40
  114. package/dist/{help-format-DAj7l5uV.js → help-format-C48TXngO.js} +1 -1
  115. package/dist/{help-format-CUnac_bT.js → help-format-R5fLToDw.js} +1 -1
  116. package/dist/{hooks-cli-ptEf6TIM.js → hooks-cli-CT8JCRkH.js} +51 -46
  117. package/dist/{hooks-cli-Bhf5VRp1.js → hooks-cli-S1MKumJO.js} +49 -44
  118. package/dist/{hooks-status-Br-2bK2G.js → hooks-status-Cw0xD8Lt.js} +3 -3
  119. package/dist/{hooks-status-DNQJSa4B.js → hooks-status-D9MhwHRp.js} +3 -3
  120. package/dist/{image-rOFfK3PJ.js → image-Brk1sJbw.js} +10 -7
  121. package/dist/{image-fUwR7slg.js → image-C4Nn2p3e.js} +10 -7
  122. package/dist/{image-Ds4NLGPR.js → image-DgtfXMcX.js} +9 -6
  123. package/dist/{image-Dnnxt82I.js → image-RKwc3fsL.js} +8 -5
  124. package/dist/index.js +208 -97
  125. package/dist/{installs-CRSjQxbR.js → installs-CrLcWYHe.js} +8 -7
  126. package/dist/{installs-89zeUsVn.js → installs-DscWb9b9.js} +8 -7
  127. package/dist/{links-7M-j83As.js → links-B8LAzWwg.js} +1 -1
  128. package/dist/{links-C591fM9M.js → links-Eax1UO3w.js} +1 -1
  129. package/dist/llm-slug-generator.js +18 -19
  130. package/dist/{loader-wXwp4rZJ.js → loader-KjT074JR.js} +5722 -6888
  131. package/dist/{logging-MMRGFxGI.js → logging-BAyPwvdH.js} +1 -1
  132. package/dist/{logging-DuK6YXuK.js → logging-CRq4h04P.js} +2 -2
  133. package/dist/{login-qr-wM8BnKJh.js → login-qr-B6ZgAuIf.js} +5 -5
  134. package/dist/{login-qr-CPEsT6dN.js → login-qr-Bua-p0nG.js} +3 -4
  135. package/dist/{login-qr-CGEu5TU-.js → login-qr-CuvemJj4.js} +6 -6
  136. package/dist/{login-qr-DH150tTp.js → login-qr-Djr1JfIf.js} +2 -2
  137. package/dist/{logs-cli-ClgkHnfT.js → logs-cli-9IAV7rWY.js} +38 -22
  138. package/dist/{logs-cli-CmfINsOj.js → logs-cli-EiKzUFPa.js} +37 -21
  139. package/dist/{manager-DYo4PlVM.js → manager-BIMh_eSm.js} +7 -8
  140. package/dist/{manager-D6EbxDV4.js → manager-CwinWQoz.js} +5 -5
  141. package/dist/{manager-BbnHek5T.js → manager-DkqF1GiK.js} +9 -9
  142. package/dist/{manager-CcVYv0N5.js → manager-T1XfGchB.js} +8 -8
  143. package/dist/{manifest-registry-3It8Z8yN.js → manifest-registry-CQhdnDBZ.js} +40 -2
  144. package/dist/{manifest-registry-D5SiA3xq.js → manifest-registry-u0okVSkU.js} +40 -2
  145. package/dist/{message-channel-Cu61-7H6.js → message-channel-BLi2a6Yw.js} +1 -1
  146. package/dist/{message-channel-BlgPSDAh.js → message-channel-C_MmebBt.js} +1 -1
  147. package/dist/{model-auth-ioeR_zLX.js → model-auth-CabXIF6O.js} +116 -34
  148. package/dist/{model-selection-BK7DuyH8.js → model-selection-BLuqsGVB.js} +86 -30
  149. package/dist/{model-selection-CezC36lH.js → model-selection-C1GmkTAV.js} +84 -28
  150. package/dist/{models-cli-C3uGdOrd.js → models-cli-9jmDv-h3.js} +52 -48
  151. package/dist/{models-cli-CUIVPgXE.js → models-cli-zS9rtWz8.js} +53 -49
  152. package/dist/{node-cli-BxBGSuPE.js → node-cli-CrpTxTTs.js} +28 -26
  153. package/dist/{node-cli-CdYAsuQQ.js → node-cli-wemUMCg-.js} +28 -26
  154. package/dist/{node-service-u8g85nD3.js → node-service-C8DTHTMg.js} +2 -2
  155. package/dist/{node-service-CM5vkdIo.js → node-service-WQuEKz6W.js} +2 -2
  156. package/dist/{nodes-cli-By6yeCTB.js → nodes-cli-BaU2SIFw.js} +20 -20
  157. package/dist/{nodes-cli-BaVMTAPc.js → nodes-cli-Dx23D72n.js} +20 -20
  158. package/dist/{nodes-screen-Dvl_ohUY.js → nodes-screen-C0IuBqUL.js} +1 -1
  159. package/dist/{note-5WqioBRA.js → note-BhRSeNeu.js} +2 -2
  160. package/dist/{note-Ci08TSbV.js → note-hhtubr2j.js} +1 -1
  161. package/dist/{onboard-channels-DxXvp8og.js → onboard-channels-C501x8GI.js} +8 -8
  162. package/dist/{onboard-channels-CXhnVy4E.js → onboard-channels-Dxzroasd.js} +8 -8
  163. package/dist/{onboard-skills-CBxsRGyf.js → onboard-skills-DV0Qzvjj.js} +440 -136
  164. package/dist/{onboard-skills-DQwOQ6Ry.js → onboard-skills-rlBHcu3Q.js} +439 -135
  165. package/dist/{onboarding-Du_7qEng.js → onboarding-CN-EDLjd.js} +38 -38
  166. package/dist/{openclaw-root-JLDMp6ux.js → openclaw-root-1VeFrph_.js} +4 -0
  167. package/dist/{openclaw-root-Dw6gumSU.js → openclaw-root-BNlEap4i.js} +4 -0
  168. package/dist/{pairing-cli-CRQDpj8f.js → pairing-cli-CDHG4xuI.js} +15 -15
  169. package/dist/{pairing-cli-Cng1KFWw.js → pairing-cli-CQP34Dlx.js} +15 -15
  170. package/dist/{pairing-labels-Ciu3Zoxj.js → pairing-labels-B6CN0SNH.js} +1 -1
  171. package/dist/{pairing-labels-CWFEtSc3.js → pairing-labels-CgNHnjzT.js} +1 -1
  172. package/dist/{pairing-store-c-QQ2u8p.js → pairing-store-CmlRVqOz.js} +2 -2
  173. package/dist/{pairing-store-CgXR3ZWJ.js → pairing-store-Dp5_JGnG.js} +3 -3
  174. package/dist/{path-env-CXWUFfFv.js → path-env-CLvYNwtL.js} +1 -1
  175. package/dist/{path-env-BgLvMbz_.js → path-env-CaYUVIML.js} +2 -2
  176. package/dist/{paths-MnZaxqPw.js → paths-B0a4ywSO.js} +30 -5
  177. package/dist/{paths-Bkhd_qY8.js → paths-B49s6UZQ.js} +30 -5
  178. package/dist/{paths-DL6EIRTw.js → paths-D0O87MfH.js} +30 -5
  179. package/dist/{paths-IivnSNkP.js → paths-DLINmNFQ.js} +31 -6
  180. package/dist/{pi-embedded-CgPTEqlB.js → pi-embedded-Ctrt2kz0.js} +8759 -9600
  181. package/dist/{pi-embedded-helpers-DYH6OWft.js → pi-embedded-helpers-CMKLjW6X.js} +68 -9
  182. package/dist/{pi-embedded-helpers-y1_Se0yq.js → pi-embedded-helpers-CUzTc1v6.js} +241 -24
  183. package/dist/{pi-embedded-helpers-Bkpd4fTr.js → pi-embedded-helpers-DfwkwPYD.js} +67 -8
  184. package/dist/{pi-embedded-helpers-BbWRSUnc.js → pi-embedded-helpers-WDwx99UA.js} +347 -32
  185. package/dist/{pi-tools.policy-akYsGFiA.js → pi-tools.policy-BpsROZbz.js} +4 -4
  186. package/dist/{plugin-auto-enable-lZwe2yX5.js → plugin-auto-enable-Bqhc3w5n.js} +5 -5
  187. package/dist/{plugin-auto-enable-AOSOJ-v1.js → plugin-auto-enable-PW76g_PJ.js} +5 -5
  188. package/dist/plugin-sdk/agents/bash-process-registry.d.ts +1 -0
  189. package/dist/plugin-sdk/agents/models-config.providers.d.ts +10 -0
  190. package/dist/plugin-sdk/agents/pi-embedded-helpers/errors.d.ts +5 -1
  191. package/dist/plugin-sdk/agents/pi-embedded-helpers.d.ts +1 -1
  192. package/dist/plugin-sdk/agents/pi-embedded-runner/google.d.ts +1 -0
  193. package/dist/plugin-sdk/agents/pi-embedded-runner/run/params.d.ts +2 -0
  194. package/dist/plugin-sdk/agents/pi-embedded-runner/run/payloads.d.ts +1 -0
  195. package/dist/plugin-sdk/agents/pi-embedded-runner/run/types.d.ts +2 -0
  196. package/dist/plugin-sdk/agents/pi-embedded-runner/types.d.ts +15 -0
  197. package/dist/plugin-sdk/agents/pi-embedded-subscribe.handlers.tools.d.ts +1 -1
  198. package/dist/plugin-sdk/agents/pi-embedded-subscribe.handlers.types.d.ts +2 -0
  199. package/dist/plugin-sdk/agents/pi-embedded-subscribe.types.d.ts +2 -0
  200. package/dist/plugin-sdk/agents/session-tool-result-guard-wrapper.d.ts +2 -0
  201. package/dist/plugin-sdk/agents/session-tool-result-guard.d.ts +4 -0
  202. package/dist/plugin-sdk/agents/tools/agent-step.d.ts +3 -0
  203. package/dist/plugin-sdk/agents/tools/browser-tool.schema.d.ts +1 -1
  204. package/dist/plugin-sdk/agents/tools/web-search.d.ts +10 -1
  205. package/dist/plugin-sdk/agents/usage.d.ts +1 -0
  206. package/dist/plugin-sdk/auto-reply/heartbeat.d.ts +1 -1
  207. package/dist/plugin-sdk/auto-reply/reply/get-reply-directives.d.ts +1 -0
  208. package/dist/plugin-sdk/auto-reply/reply/mentions.d.ts +1 -0
  209. package/dist/plugin-sdk/auto-reply/reply/model-selection.d.ts +3 -0
  210. package/dist/plugin-sdk/auto-reply/reply/reply-reference.d.ts +1 -1
  211. package/dist/plugin-sdk/auto-reply/reply/session-run-accounting.d.ts +11 -0
  212. package/dist/plugin-sdk/auto-reply/reply/session-usage.d.ts +8 -0
  213. package/dist/plugin-sdk/auto-reply/types.d.ts +2 -0
  214. package/dist/plugin-sdk/browser/control-auth.d.ts +13 -0
  215. package/dist/plugin-sdk/channels/plugins/onboarding/signal.d.ts +1 -0
  216. package/dist/plugin-sdk/cli/prompt.d.ts +1 -0
  217. package/dist/plugin-sdk/commands/agent/types.d.ts +2 -0
  218. package/dist/plugin-sdk/commands/onboard-types.d.ts +7 -1
  219. package/dist/plugin-sdk/config/sessions/paths.d.ts +7 -2
  220. package/dist/plugin-sdk/config/types.agents.d.ts +2 -0
  221. package/dist/plugin-sdk/config/types.discord.d.ts +5 -0
  222. package/dist/plugin-sdk/config/types.gateway.d.ts +15 -0
  223. package/dist/plugin-sdk/config/types.hooks.d.ts +15 -0
  224. package/dist/plugin-sdk/config/types.memory.d.ts +2 -0
  225. package/dist/plugin-sdk/config/zod-schema.agents.d.ts +1 -0
  226. package/dist/plugin-sdk/config/zod-schema.d.ts +13 -1
  227. package/dist/plugin-sdk/config/zod-schema.hooks.d.ts +1 -1
  228. package/dist/plugin-sdk/config/zod-schema.providers-core.d.ts +9 -0
  229. package/dist/plugin-sdk/config/zod-schema.providers.d.ts +4 -0
  230. package/dist/plugin-sdk/cron/service/jobs.d.ts +8 -0
  231. package/dist/plugin-sdk/cron/service/state.d.ts +1 -0
  232. package/dist/plugin-sdk/cron/types.d.ts +2 -0
  233. package/dist/plugin-sdk/discord/monitor/allow-list.d.ts +15 -0
  234. package/dist/plugin-sdk/discord/send.types.d.ts +5 -0
  235. package/dist/plugin-sdk/gateway/auth.d.ts +36 -0
  236. package/dist/plugin-sdk/gateway/protocol/index.d.ts +0 -3
  237. package/dist/plugin-sdk/gateway/protocol/schema/agent.d.ts +7 -1
  238. package/dist/plugin-sdk/gateway/session-utils.fs.d.ts +3 -1
  239. package/dist/plugin-sdk/index.js +935 -660
  240. package/dist/plugin-sdk/infra/binaries.d.ts +3 -0
  241. package/dist/plugin-sdk/infra/heartbeat-active-hours.d.ts +5 -0
  242. package/dist/plugin-sdk/infra/heartbeat-runner.d.ts +1 -0
  243. package/dist/plugin-sdk/infra/net/fetch-guard.d.ts +1 -0
  244. package/dist/plugin-sdk/infra/net/ssrf.d.ts +1 -0
  245. package/dist/plugin-sdk/infra/tailscale.d.ts +34 -0
  246. package/dist/plugin-sdk/infra/tmp-openclaw-dir.d.ts +10 -0
  247. package/dist/plugin-sdk/logging/console.d.ts +1 -0
  248. package/dist/plugin-sdk/logging/logger.d.ts +1 -1
  249. package/dist/plugin-sdk/logging/state.d.ts +1 -0
  250. package/dist/plugin-sdk/markdown/ir.d.ts +1 -1
  251. package/dist/plugin-sdk/markdown/whatsapp.d.ts +14 -0
  252. package/dist/plugin-sdk/media/input-files.d.ts +5 -0
  253. package/dist/plugin-sdk/media-understanding/audio-preflight.d.ts +16 -0
  254. package/dist/plugin-sdk/media-understanding/types.d.ts +1 -0
  255. package/dist/plugin-sdk/memory/backend-config.d.ts +2 -1
  256. package/dist/plugin-sdk/memory/qmd-manager.d.ts +2 -0
  257. package/dist/plugin-sdk/memory/qmd-query-parser.d.ts +8 -0
  258. package/dist/plugin-sdk/process/command-queue.d.ts +16 -0
  259. package/dist/plugin-sdk/routing/resolve-route.d.ts +3 -1
  260. package/dist/plugin-sdk/security/external-content.d.ts +1 -1
  261. package/dist/plugin-sdk/security/secret-equal.d.ts +1 -0
  262. package/dist/plugin-sdk/sessions/input-provenance.d.ts +16 -0
  263. package/dist/plugin-sdk/signal/monitor/event-handler.types.d.ts +8 -0
  264. package/dist/plugin-sdk/signal/monitor/mentions.d.ts +2 -0
  265. package/dist/plugin-sdk/slack/monitor/commands.d.ts +5 -0
  266. package/dist/plugin-sdk/telegram/bot-message-context.d.ts +2 -1
  267. package/dist/plugin-sdk/telegram/send.d.ts +3 -0
  268. package/dist/plugin-sdk/web/media.d.ts +2 -0
  269. package/dist/{plugins-Db5BiELK.js → plugins-4Hqd1WGf.js} +3 -3
  270. package/dist/{plugins-CNaHNND_.js → plugins-X7d_tfTE.js} +4 -4
  271. package/dist/{plugins-cli-8G-hQPCu.js → plugins-cli-Bgku3EGj.js} +253 -44
  272. package/dist/{plugins-cli-CDiocaDE.js → plugins-cli-CVToH3if.js} +257 -48
  273. package/dist/{ports-BeebfNCb.js → ports-qkt29rdC.js} +2 -2
  274. package/dist/{program-0Cj9YxRN.js → program-Cf7lkBur.js} +82 -80
  275. package/dist/{progress-DIQJt9Va.js → progress-C9kngsTD.js} +1 -1
  276. package/dist/{progress-Da1ehW-x.js → progress-DWqhRakV.js} +1 -1
  277. package/dist/{prompt-style-Dc0C5HC9.js → prompt-style-BFH5D5LN.js} +1 -1
  278. package/dist/{prompt-style-CjQRlDx4.js → prompt-style-CIbmaxSa.js} +1 -1
  279. package/dist/{pw-ai-C43wv1ZF.js → pw-ai-8mdv3h-d.js} +7 -6
  280. package/dist/{pw-ai-COWYvUfG.js → pw-ai-CM1IsSgZ.js} +6 -6
  281. package/dist/{pw-ai-BxJ-KCIy.js → pw-ai-FGoRVblI.js} +5 -6
  282. package/dist/{pw-ai-CsvaObGM.js → pw-ai-sS1fRKW_.js} +3 -3
  283. package/dist/{qmd-manager-CpsjQyaZ.js → qmd-manager-C67Fc8aN.js} +79 -26
  284. package/dist/{qmd-manager-C9YWFeG6.js → qmd-manager-CXVbfg99.js} +81 -26
  285. package/dist/{qmd-manager-C02E8ixK.js → qmd-manager-RMRE8Tqt.js} +81 -26
  286. package/dist/{qmd-manager-BzY2LQTT.js → qmd-manager-pyc_MTIe.js} +78 -23
  287. package/dist/{register.subclis-DUkirdHn.js → register.subclis-C02e4zuJ.js} +29 -29
  288. package/dist/{reply--b7BsXGP.js → reply-DICXkh_C.js} +7289 -8455
  289. package/dist/{routes-DUkEKAc1.js → routes-CmOI1hIH.js} +29 -11
  290. package/dist/{routes-B4QQiFju.js → routes-DewK5tq2.js} +29 -12
  291. package/dist/{rpc-CuMtxrRT.js → rpc-DHr30euf.js} +3 -3
  292. package/dist/{rpc-Blt6MJ4F.js → rpc-T300F8zI.js} +3 -3
  293. package/dist/{run-main-XZcPA23b.js → run-main-C5wpthq1.js} +84 -82
  294. package/dist/runner-CY0nmVme.js +1886 -0
  295. package/dist/runner-Cfm5nTMc.js +1785 -0
  296. package/dist/runner-D_dujMod.js +1886 -0
  297. package/dist/runner-DrGYLH5K.js +1785 -0
  298. package/dist/{sandbox-Aks-9EcZ.js → sandbox-BKYnhYQH.js} +24 -17
  299. package/dist/{sandbox-DqUO2K83.js → sandbox-Bhjnh1Xg.js} +23 -16
  300. package/dist/{sandbox-cli-C99Thxi8.js → sandbox-cli-DBsAjZJN.js} +21 -21
  301. package/dist/{sandbox-cli-CJqRM4V6.js → sandbox-cli-rV9LtFeu.js} +21 -21
  302. package/dist/{security-cli-iqYLMOz3.js → security-cli-BIwJM_rs.js} +27 -27
  303. package/dist/{security-cli-DW3lCz-o.js → security-cli-BRjny8Yu.js} +27 -27
  304. package/dist/{server-context-fX4xiYRh.js → server-context-BGpGs3qd.js} +7 -7
  305. package/dist/{server-context-8Qt35QdF.js → server-context-Cl0U0vE3.js} +7 -7
  306. package/dist/{server-node-events-CHWXfb_T.js → server-node-events-CBfTbiTA.js} +48 -44
  307. package/dist/{server-node-events-BzrEnKLX.js → server-node-events-QCvh8EgI.js} +45 -41
  308. package/dist/{service-Cd4BxKuo.js → service--nPk7DvT.js} +8 -4
  309. package/dist/{service-DDPRbf8a.js → service-99RDXwX4.js} +8 -4
  310. package/dist/{service-audit-CCFxuvKs.js → service-audit-DnLmRGQt.js} +4 -4
  311. package/dist/{service-audit-x6jCN-6a.js → service-audit-ckBaRCVC.js} +4 -4
  312. package/dist/{session-cost-usage-CcCEQNuc.js → session-cost-usage-D7HuoSSD.js} +12 -10
  313. package/dist/{session-cost-usage-PvyVZz-g.js → session-cost-usage-D9hHANWI.js} +12 -10
  314. package/dist/{shared-ILguacOr.js → shared-Bs4vduG4.js} +3 -3
  315. package/dist/{shared-CagUDdmp.js → shared-CEY5IkwG.js} +3 -3
  316. package/dist/{shared-gOyV38rM.js → shared-DRohONn_.js} +4 -4
  317. package/dist/{shared-BDk_zC9p.js → shared-ICqOZibV.js} +4 -4
  318. package/dist/{skill-scanner-C_fQzVDu.js → skill-scanner-CucvxYhu.js} +1 -1
  319. package/dist/{skill-scanner-DrVEHfC6.js → skill-scanner-rHMtUHtP.js} +1 -1
  320. package/dist/{skills-D5UZZZSY.js → skills-DRjfSQT3.js} +141 -6
  321. package/dist/{skills-ccAgQ3Ad.js → skills-DprQj9X2.js} +142 -7
  322. package/dist/{skills-cli-DQilTG3n.js → skills-cli-9WO-C55s.js} +12 -12
  323. package/dist/{skills-cli-ggyLBtAY.js → skills-cli-B9eej-EW.js} +13 -13
  324. package/dist/{skills-status-BosMnzIs.js → skills-status-5U3P3YfJ.js} +3 -3
  325. package/dist/{skills-status-DjtPPMnY.js → skills-status-TDIgVd1K.js} +2 -2
  326. package/dist/{sqlite-B7FPASCO.js → sqlite-BINzs1U0.js} +2 -2
  327. package/dist/{sqlite-Btrgi7-j.js → sqlite-D4w5TejA.js} +3 -3
  328. package/dist/{sqlite-BrQ9tw8B.js → sqlite-DRRHmlug.js} +3 -3
  329. package/dist/{sqlite-HepBVDoX.js → sqlite-F6PGkEm1.js} +2 -2
  330. package/dist/{status-BByCntWS.js → status-BKGkKC_v.js} +3 -3
  331. package/dist/{status-Dt7RE_Yy.js → status-CiHtHdaa.js} +4 -4
  332. package/dist/{status-zfL4Yej7.js → status-DDWoOpeB.js} +37 -37
  333. package/dist/{subsystem-Bh1Y_6Uv.js → subsystem-BoExtIHo.js} +52 -17
  334. package/dist/{system-cli-DwuUkdkH.js → system-cli-B6lr60Io.js} +14 -14
  335. package/dist/{system-cli-Clqsx8U5.js → system-cli-CprW9G3h.js} +14 -14
  336. package/dist/{systemd-BEWwfwn0.js → systemd-C0VZriGM.js} +3 -3
  337. package/dist/{systemd-D6wTPnHi.js → systemd-DrmBtJ5T.js} +3 -3
  338. package/dist/{systemd-hints-zi4ohCOY.js → systemd-hints-DZtXiVHa.js} +1 -1
  339. package/dist/{systemd-linger-CDo2UbHM.js → systemd-linger-NC2kl1SC.js} +2 -2
  340. package/dist/{systemd-linger-BxjTrgoH.js → systemd-linger-xdn3BdPh.js} +2 -2
  341. package/dist/{table-DEnmtvl5.js → table-B8dx3v4v.js} +2 -2
  342. package/dist/{table-cCoGqLsk.js → table-CwulTLQp.js} +1 -1
  343. package/dist/{tool-display-DskiU8Kt.js → tool-display-CZRIDMRm.js} +2 -2
  344. package/dist/{tool-display-o-dDAlqF.js → tool-display-ClRud3pg.js} +2 -2
  345. package/dist/{tui-BdJWZdto.js → tui-CVTQn-dC.js} +14 -13
  346. package/dist/{tui-Bc7XUQGP.js → tui-Lu8FdrlK.js} +13 -14
  347. package/dist/{tui-cli-BGYh0UL0.js → tui-cli-BLpTj1X9.js} +27 -27
  348. package/dist/{tui-cli-D3n-O9zB.js → tui-cli-BLx5kL2I.js} +26 -26
  349. package/dist/{tui-formatters-CA85v4U2.js → tui-formatters-CNySEfJN.js} +6 -6
  350. package/dist/{tui-formatters-C3NarH24.js → tui-formatters-DePhZK3J.js} +6 -6
  351. package/dist/{update-JB16aPIY.js → update-DHVxMTpQ.js} +3 -3
  352. package/dist/{update-Ct9sqJC_.js → update-DU1geolI.js} +3 -3
  353. package/dist/{update-cli-wWKDS3cm.js → update-cli-C0hUvJWK.js} +89 -71
  354. package/dist/{update-cli-DDXp_N9B.js → update-cli-Wb1GB3rL.js} +88 -70
  355. package/dist/{update-runner-ChTf6O6p.js → update-runner--ixK4J3W.js} +11 -11
  356. package/dist/{update-runner-CmE6cHdn.js → update-runner-7Qa1T9y6.js} +10 -10
  357. package/dist/{utils-Dk86IbEs.js → utils-BLJAc3ZV.js} +1 -1
  358. package/dist/{utils-es4ygvQ-.js → utils-Cd9QdCHh.js} +1 -1
  359. package/dist/{webhooks-cli-CVIE9TtX.js → webhooks-cli-DgcMy7RG.js} +12 -12
  360. package/dist/{webhooks-cli-BmKSiQQC.js → webhooks-cli-aVzUcJY9.js} +11 -11
  361. package/dist/{widearea-dns-2ah0bkAj.js → widearea-dns-BaIgNEhY.js} +3 -3
  362. package/dist/{widearea-dns-CMIG6-74.js → widearea-dns-DzuRdwk5.js} +3 -3
  363. package/dist/{ws-DtDKpbLR.js → ws-CHCQHs0F.js} +1 -1
  364. package/dist/{ws-log-BP3z_g6Z.js → ws-log-CIXbLCka.js} +1 -1
  365. package/dist/{ws-log-D7MkvKhg.js → ws-log-DcQFZByi.js} +2 -2
  366. package/dist/{wsl-Cwo7X0Un.js → wsl-BUOkxKJu.js} +2 -2
  367. package/docs/assets/install-script.svg +1 -0
  368. package/docs/automation/hooks.md +1 -38
  369. package/docs/automation/webhook.md +43 -2
  370. package/docs/channels/discord.md +389 -381
  371. package/docs/channels/imessage.md +229 -218
  372. package/docs/channels/slack.md +294 -415
  373. package/docs/channels/telegram.md +401 -505
  374. package/docs/channels/whatsapp.md +338 -310
  375. package/docs/ci.md +0 -12
  376. package/docs/cli/hooks.md +1 -14
  377. package/docs/cli/index.md +6 -1
  378. package/docs/cli/logs.md +4 -0
  379. package/docs/cli/onboard.md +30 -0
  380. package/docs/cli/plugins.md +20 -1
  381. package/docs/cli/security.md +1 -0
  382. package/docs/concepts/memory.md +7 -4
  383. package/docs/concepts/session-tool.md +1 -0
  384. package/docs/docs.json +11 -11
  385. package/docs/gateway/configuration-examples.md +9 -2
  386. package/docs/gateway/configuration-reference.md +2329 -0
  387. package/docs/gateway/configuration.md +338 -3304
  388. package/docs/gateway/index.md +162 -238
  389. package/docs/gateway/openresponses-http-api.md +15 -0
  390. package/docs/gateway/security/index.md +3 -0
  391. package/docs/help/faq.md +9 -0
  392. package/docs/install/hetzner.md +21 -0
  393. package/docs/install/installer.md +20 -0
  394. package/docs/nodes/audio.md +19 -0
  395. package/docs/platforms/mac/release.md +7 -7
  396. package/docs/providers/glm.md +3 -3
  397. package/docs/providers/index.md +1 -0
  398. package/docs/providers/litellm.md +153 -0
  399. package/docs/providers/zai.md +2 -2
  400. package/docs/reference/templates/AGENTS.md +26 -26
  401. package/docs/reference/templates/HEARTBEAT.md +31 -2
  402. package/docs/reference/templates/SOUL.md +14 -8
  403. package/docs/reference/transcript-hygiene.md +18 -0
  404. package/docs/start/getting-started.md +5 -0
  405. package/docs/start/wizard-cli-automation.md +17 -0
  406. package/docs/start/wizard-cli-reference.md +12 -0
  407. package/docs/tools/browser.md +6 -0
  408. package/docs/zh-CN/automation/hooks.md +1 -38
  409. package/docs/zh-CN/cli/hooks.md +1 -14
  410. package/extensions/bluebubbles/package.json +1 -1
  411. package/extensions/bluebubbles/src/monitor.test.ts +40 -28
  412. package/extensions/bluebubbles/src/monitor.ts +0 -4
  413. package/extensions/copilot-proxy/package.json +1 -1
  414. package/extensions/diagnostics-otel/package.json +10 -10
  415. package/extensions/discord/package.json +1 -1
  416. package/extensions/feishu/package.json +2 -5
  417. package/extensions/feishu/src/bot.checkBotMentioned.test.ts +64 -0
  418. package/extensions/feishu/src/bot.ts +1 -1
  419. package/extensions/feishu/src/channel.test.ts +48 -0
  420. package/extensions/feishu/src/channel.ts +1 -3
  421. package/extensions/feishu/src/config-schema.ts +6 -0
  422. package/extensions/feishu/src/docx.ts +14 -4
  423. package/extensions/feishu/src/media.test.ts +151 -0
  424. package/extensions/feishu/src/media.ts +27 -13
  425. package/extensions/feishu/src/reply-dispatcher.test.ts +116 -0
  426. package/extensions/feishu/src/reply-dispatcher.ts +124 -67
  427. package/extensions/feishu/src/streaming-card.ts +223 -0
  428. package/extensions/feishu/src/targets.test.ts +16 -0
  429. package/extensions/feishu/src/targets.ts +1 -1
  430. package/extensions/google-antigravity-auth/package.json +1 -1
  431. package/extensions/google-gemini-cli-auth/package.json +1 -1
  432. package/extensions/googlechat/package.json +1 -1
  433. package/extensions/imessage/package.json +1 -1
  434. package/extensions/irc/package.json +1 -1
  435. package/extensions/irc/src/client.ts +1 -1
  436. package/extensions/line/package.json +1 -1
  437. package/extensions/llm-task/package.json +1 -1
  438. package/extensions/lobster/package.json +1 -1
  439. package/extensions/matrix/CHANGELOG.md +6 -0
  440. package/extensions/matrix/package.json +2 -2
  441. package/extensions/mattermost/package.json +1 -1
  442. package/extensions/memory-core/package.json +1 -1
  443. package/extensions/memory-lancedb/index.ts +6 -2
  444. package/extensions/memory-lancedb/package.json +2 -2
  445. package/extensions/minimax-portal-auth/index.ts +7 -5
  446. package/extensions/minimax-portal-auth/package.json +1 -1
  447. package/extensions/msteams/CHANGELOG.md +6 -0
  448. package/extensions/msteams/package.json +1 -1
  449. package/extensions/nextcloud-talk/package.json +1 -1
  450. package/extensions/nostr/CHANGELOG.md +6 -0
  451. package/extensions/nostr/package.json +2 -2
  452. package/extensions/open-prose/package.json +1 -1
  453. package/extensions/signal/package.json +1 -1
  454. package/extensions/slack/package.json +1 -1
  455. package/extensions/telegram/package.json +1 -1
  456. package/extensions/tlon/package.json +1 -1
  457. package/extensions/twitch/CHANGELOG.md +6 -0
  458. package/extensions/twitch/package.json +1 -1
  459. package/extensions/voice-call/CHANGELOG.md +6 -0
  460. package/extensions/voice-call/package.json +1 -1
  461. package/extensions/voice-call/src/media-stream.ts +7 -1
  462. package/extensions/voice-call/src/providers/twilio.test.ts +5 -3
  463. package/extensions/voice-call/src/providers/twilio.ts +12 -1
  464. package/extensions/whatsapp/package.json +1 -1
  465. package/extensions/zalo/CHANGELOG.md +6 -0
  466. package/extensions/zalo/package.json +1 -1
  467. package/extensions/zalouser/CHANGELOG.md +6 -0
  468. package/extensions/zalouser/package.json +1 -1
  469. package/package.json +26 -22
  470. package/dist/auth-BcNHFK-i.js +0 -184
  471. package/dist/auth-BvIPpm7G.js +0 -184
  472. package/dist/boolean-M-esQJt6.js +0 -30
  473. package/dist/bundled/soul-evil/HOOK.md +0 -71
  474. package/dist/bundled/soul-evil/handler.js +0 -194
  475. package/dist/cli-DJbWJ9aB.js +0 -89
  476. package/dist/config-CI7EpvlP.js +0 -15
  477. package/dist/control-ui/assets/index-CnB9IO4a.js.map +0 -1
  478. package/dist/date-time-c6HTX6IW.js +0 -187
  479. package/dist/frontmatter-xwTm0734.js +0 -105
  480. package/dist/parse-duration-De_tAQSe.js +0 -24
  481. package/dist/session-key-nXYQSv-a.js +0 -167
  482. package/dist/utils-dp_OM900.js +0 -476
  483. package/docs/hooks/soul-evil.md +0 -69
  484. package/docs/zh-CN/hooks/soul-evil.md +0 -72
  485. /package/dist/{archive-CXhvR9nU.js → archive-beaSfAzA.js} +0 -0
  486. /package/dist/{brew-BIrWdDps.js → brew-BUIxHEkn.js} +0 -0
  487. /package/dist/{brew-B7YK4ZoL.js → brew-ROHf0-Xp.js} +0 -0
  488. /package/dist/{cli-utils-PlLcDZlM.js → cli-utils-CRhVAaLV.js} +0 -0
  489. /package/dist/{cli-utils-R-ECs5cY.js → cli-utils-LcHOt63h.js} +0 -0
  490. /package/dist/{command-format-BUxhT1xL.js → command-format-qUVxzqYm.js} +0 -0
  491. /package/dist/{constants-CNTiY-ZN.js → constants-BvQ6S8j5.js} +0 -0
  492. /package/dist/{constants-DuoCkWRh.js → constants-JPeoOZnw.js} +0 -0
  493. /package/dist/{errors-D3tYRJWG.js → errors-B91HIDPD.js} +0 -0
  494. /package/dist/{errors-B0eT3jVv.js → errors-Bv81hF2P.js} +0 -0
  495. /package/dist/{errors-x4NYs-1P.js → errors-DjZBTJJ3.js} +0 -0
  496. /package/dist/{exec-approvals-DGPTjO0N.js → exec-approvals-Cb4ZLukq.js} +0 -0
  497. /package/dist/{exec-approvals-DhmKpiIo.js → exec-approvals-DQ8TVVmj.js} +0 -0
  498. /package/dist/{format-CaxeRcue.js → format-CNU-Zkrz.js} +0 -0
  499. /package/dist/{format-DLOJPZmo.js → format-DcfK-dwd.js} +0 -0
  500. /package/dist/{format-duration-Be5Z7JdJ.js → format-duration-84n6_DgO.js} +0 -0
  501. /package/dist/{format-duration-CEmFWLyX.js → format-duration-Bo9zNKwO.js} +0 -0
  502. /package/dist/{format-relative-79_Y1n2Y.js → format-relative-CZOlQ2pA.js} +0 -0
  503. /package/dist/{format-relative-Db7eqEu8.js → format-relative-cegC_FF5.js} +0 -0
  504. /package/dist/{github-copilot-token-C9IJh2Pn.js → github-copilot-token-DkiRbJdR.js} +0 -0
  505. /package/dist/{helpers-CQI-5xS9.js → helpers-8O7IVGO-.js} +0 -0
  506. /package/dist/{helpers-CRzoyyXS.js → helpers-D_jqdWkd.js} +0 -0
  507. /package/dist/{helpers-C89IG08W.js → helpers-HyeZXsnu.js} +0 -0
  508. /package/dist/{is-main-WWuz28Ip.js → is-main-BWoXGz7p.js} +0 -0
  509. /package/dist/{logging-BzvBIA3Y.js → logging-fywhKCmE.js} +0 -0
  510. /package/dist/{nodes-screen-lykd2cny.js → nodes-screen-CdCWeiwy.js} +0 -0
  511. /package/dist/{parse-Cjiudy6x.js → parse-Bw0oH-rT.js} +0 -0
  512. /package/dist/{parse-DqAvJRIf.js → parse-ioZhOtha.js} +0 -0
  513. /package/dist/{parse-log-line-CUrpqe1w.js → parse-log-line-BoDqomM4.js} +0 -0
  514. /package/dist/{parse-log-line-D2UGw0wR.js → parse-log-line-DPxH1XZx.js} +0 -0
  515. /package/dist/{parse-timeout-DFSPLxpY.js → parse-timeout-D1XX_zN_.js} +0 -0
  516. /package/dist/{parse-timeout-DV8NQQWk.js → parse-timeout-DMW-z4Iz.js} +0 -0
  517. /package/dist/{pi-model-discovery-CV2V1HHz.js → pi-model-discovery-DqgqUyAv.js} +0 -0
  518. /package/dist/{pi-model-discovery-DzFOAbQt.js → pi-model-discovery-EwKVHlZB.js} +0 -0
  519. /package/dist/{prompts--d-6l5Ln.js → prompts-Bg96reub.js} +0 -0
  520. /package/dist/{redact-DAKeu7PA.js → redact-BRsnXqwD.js} +0 -0
  521. /package/dist/{redact-DuEEf1p1.js → redact-Br9GfacZ.js} +0 -0
  522. /package/dist/{redact-BOIof271.js → redact-BrXLgslJ.js} +0 -0
  523. /package/dist/{status-Cv36yYdi.js → status-BRZfQbJ2.js} +0 -0
  524. /package/dist/{status-Drziap9H.js → status-CoAy6bEC.js} +0 -0
  525. /package/dist/{systemd-hints-CH4pbCFD.js → systemd-hints-CXNtLw9Q.js} +0 -0
  526. /package/dist/{tailnet-DGRSvYuQ.js → tailnet-DATIFSsY.js} +0 -0
  527. /package/dist/{transcript-events-BlIONGVn.js → transcript-events-BHS7QoRl.js} +0 -0
  528. /package/dist/{transcript-events-C1hdue6u.js → transcript-events-Bp7fGnwv.js} +0 -0
  529. /package/dist/{transcript-events-CZ8CG4ht.js → transcript-events-BtNd-j6q.js} +0 -0
  530. /package/dist/{usage-format-6Uar63S0.js → usage-format-C4JfTbSp.js} +0 -0
  531. /package/dist/{usage-format-hd37en6b.js → usage-format-CpORtVCG.js} +0 -0
@@ -0,0 +1,2329 @@
1
+ ---
2
+ title: "Configuration Reference"
3
+ description: "Complete field-by-field reference for ~/.openclaw/openclaw.json"
4
+ ---
5
+
6
+ # Configuration Reference
7
+
8
+ Every field available in `~/.openclaw/openclaw.json`. For a task-oriented overview, see [Configuration](/gateway/configuration).
9
+
10
+ Config format is **JSON5** (comments + trailing commas allowed). All fields are optional — OpenClaw uses safe defaults when omitted.
11
+
12
+ ---
13
+
14
+ ## Channels
15
+
16
+ Each channel starts automatically when its config section exists (unless `enabled: false`).
17
+
18
+ ### DM and group access
19
+
20
+ All channels support DM policies and group policies:
21
+
22
+ | DM policy | Behavior |
23
+ | ------------------- | --------------------------------------------------------------- |
24
+ | `pairing` (default) | Unknown senders get a one-time pairing code; owner must approve |
25
+ | `allowlist` | Only senders in `allowFrom` (or paired allow store) |
26
+ | `open` | Allow all inbound DMs (requires `allowFrom: ["*"]`) |
27
+ | `disabled` | Ignore all inbound DMs |
28
+
29
+ | Group policy | Behavior |
30
+ | --------------------- | ------------------------------------------------------ |
31
+ | `allowlist` (default) | Only groups matching the configured allowlist |
32
+ | `open` | Bypass group allowlists (mention-gating still applies) |
33
+ | `disabled` | Block all group/room messages |
34
+
35
+ <Note>
36
+ `channels.defaults.groupPolicy` sets the default when a provider's `groupPolicy` is unset.
37
+ Pairing codes expire after 1 hour. Pending DM pairing requests are capped at **3 per channel**.
38
+ Slack/Discord have a special fallback: if their provider section is missing entirely, runtime group policy can resolve to `open` (with a startup warning).
39
+ </Note>
40
+
41
+ ### WhatsApp
42
+
43
+ WhatsApp runs through the gateway's web channel (Baileys Web). It starts automatically when a linked session exists.
44
+
45
+ ```json5
46
+ {
47
+ channels: {
48
+ whatsapp: {
49
+ dmPolicy: "pairing", // pairing | allowlist | open | disabled
50
+ allowFrom: ["+15555550123", "+447700900123"],
51
+ textChunkLimit: 4000,
52
+ chunkMode: "length", // length | newline
53
+ mediaMaxMb: 50,
54
+ sendReadReceipts: true, // blue ticks (false in self-chat mode)
55
+ groups: {
56
+ "*": { requireMention: true },
57
+ },
58
+ groupPolicy: "allowlist",
59
+ groupAllowFrom: ["+15551234567"],
60
+ },
61
+ },
62
+ web: {
63
+ enabled: true,
64
+ heartbeatSeconds: 60,
65
+ reconnect: {
66
+ initialMs: 2000,
67
+ maxMs: 120000,
68
+ factor: 1.4,
69
+ jitter: 0.2,
70
+ maxAttempts: 0,
71
+ },
72
+ },
73
+ }
74
+ ```
75
+
76
+ <Accordion title="Multi-account WhatsApp">
77
+
78
+ ```json5
79
+ {
80
+ channels: {
81
+ whatsapp: {
82
+ accounts: {
83
+ default: {},
84
+ personal: {},
85
+ biz: {
86
+ // authDir: "~/.openclaw/credentials/whatsapp/biz",
87
+ },
88
+ },
89
+ },
90
+ },
91
+ }
92
+ ```
93
+
94
+ - Outbound commands default to account `default` if present; otherwise the first configured account id (sorted).
95
+ - Legacy single-account Baileys auth dir is migrated by `openclaw doctor` into `whatsapp/default`.
96
+ - Per-account override: `channels.whatsapp.accounts.<id>.sendReadReceipts`.
97
+
98
+ </Accordion>
99
+
100
+ ### Telegram
101
+
102
+ ```json5
103
+ {
104
+ channels: {
105
+ telegram: {
106
+ enabled: true,
107
+ botToken: "your-bot-token",
108
+ dmPolicy: "pairing",
109
+ allowFrom: ["tg:123456789"],
110
+ groups: {
111
+ "*": { requireMention: true },
112
+ "-1001234567890": {
113
+ allowFrom: ["@admin"],
114
+ systemPrompt: "Keep answers brief.",
115
+ topics: {
116
+ "99": {
117
+ requireMention: false,
118
+ skills: ["search"],
119
+ systemPrompt: "Stay on topic.",
120
+ },
121
+ },
122
+ },
123
+ },
124
+ customCommands: [
125
+ { command: "backup", description: "Git backup" },
126
+ { command: "generate", description: "Create an image" },
127
+ ],
128
+ historyLimit: 50,
129
+ replyToMode: "first", // off | first | all
130
+ linkPreview: true,
131
+ streamMode: "partial", // off | partial | block
132
+ draftChunk: {
133
+ minChars: 200,
134
+ maxChars: 800,
135
+ breakPreference: "paragraph", // paragraph | newline | sentence
136
+ },
137
+ actions: { reactions: true, sendMessage: true },
138
+ reactionNotifications: "own", // off | own | all
139
+ mediaMaxMb: 5,
140
+ retry: {
141
+ attempts: 3,
142
+ minDelayMs: 400,
143
+ maxDelayMs: 30000,
144
+ jitter: 0.1,
145
+ },
146
+ network: { autoSelectFamily: false },
147
+ proxy: "socks5://localhost:9050",
148
+ webhookUrl: "https://example.com/telegram-webhook",
149
+ webhookSecret: "secret",
150
+ webhookPath: "/telegram-webhook",
151
+ },
152
+ },
153
+ }
154
+ ```
155
+
156
+ - Bot token: `channels.telegram.botToken` or `channels.telegram.tokenFile`, with `TELEGRAM_BOT_TOKEN` as fallback for the default account.
157
+ - `configWrites: false` blocks Telegram-initiated config writes (supergroup ID migrations, `/config set|unset`).
158
+ - Draft streaming uses Telegram `sendMessageDraft` (requires private chat topics).
159
+ - Retry policy: see [Retry policy](/concepts/retry).
160
+
161
+ ### Discord
162
+
163
+ ```json5
164
+ {
165
+ channels: {
166
+ discord: {
167
+ enabled: true,
168
+ token: "your-bot-token",
169
+ mediaMaxMb: 8,
170
+ allowBots: false,
171
+ actions: {
172
+ reactions: true,
173
+ stickers: true,
174
+ polls: true,
175
+ permissions: true,
176
+ messages: true,
177
+ threads: true,
178
+ pins: true,
179
+ search: true,
180
+ memberInfo: true,
181
+ roleInfo: true,
182
+ roles: false,
183
+ channelInfo: true,
184
+ voiceStatus: true,
185
+ events: true,
186
+ moderation: false,
187
+ },
188
+ replyToMode: "off", // off | first | all
189
+ dm: {
190
+ enabled: true,
191
+ policy: "pairing",
192
+ allowFrom: ["1234567890", "steipete"],
193
+ groupEnabled: false,
194
+ groupChannels: ["openclaw-dm"],
195
+ },
196
+ guilds: {
197
+ "123456789012345678": {
198
+ slug: "friends-of-openclaw",
199
+ requireMention: false,
200
+ reactionNotifications: "own",
201
+ users: ["987654321098765432"],
202
+ channels: {
203
+ general: { allow: true },
204
+ help: {
205
+ allow: true,
206
+ requireMention: true,
207
+ users: ["987654321098765432"],
208
+ skills: ["docs"],
209
+ systemPrompt: "Short answers only.",
210
+ },
211
+ },
212
+ },
213
+ },
214
+ historyLimit: 20,
215
+ textChunkLimit: 2000,
216
+ chunkMode: "length", // length | newline
217
+ maxLinesPerMessage: 17,
218
+ retry: {
219
+ attempts: 3,
220
+ minDelayMs: 500,
221
+ maxDelayMs: 30000,
222
+ jitter: 0.1,
223
+ },
224
+ },
225
+ },
226
+ }
227
+ ```
228
+
229
+ - Token: `channels.discord.token`, with `DISCORD_BOT_TOKEN` as fallback for the default account.
230
+ - Use `user:<id>` (DM) or `channel:<id>` (guild channel) for delivery targets; bare numeric IDs are rejected.
231
+ - Guild slugs are lowercase with spaces replaced by `-`; channel keys use the slugged name (no `#`). Prefer guild IDs.
232
+ - Bot-authored messages are ignored by default. `allowBots: true` enables them (own messages still filtered).
233
+ - `maxLinesPerMessage` (default 17) splits tall messages even when under 2000 chars.
234
+
235
+ **Reaction notification modes:** `off` (none), `own` (bot's messages, default), `all` (all messages), `allowlist` (from `guilds.<id>.users` on all messages).
236
+
237
+ ### Google Chat
238
+
239
+ ```json5
240
+ {
241
+ channels: {
242
+ googlechat: {
243
+ enabled: true,
244
+ serviceAccountFile: "/path/to/service-account.json",
245
+ audienceType: "app-url", // app-url | project-number
246
+ audience: "https://gateway.example.com/googlechat",
247
+ webhookPath: "/googlechat",
248
+ botUser: "users/1234567890",
249
+ dm: {
250
+ enabled: true,
251
+ policy: "pairing",
252
+ allowFrom: ["users/1234567890"],
253
+ },
254
+ groupPolicy: "allowlist",
255
+ groups: {
256
+ "spaces/AAAA": { allow: true, requireMention: true },
257
+ },
258
+ actions: { reactions: true },
259
+ typingIndicator: "message",
260
+ mediaMaxMb: 20,
261
+ },
262
+ },
263
+ }
264
+ ```
265
+
266
+ - Service account JSON: inline (`serviceAccount`) or file-based (`serviceAccountFile`).
267
+ - Env fallbacks: `GOOGLE_CHAT_SERVICE_ACCOUNT` or `GOOGLE_CHAT_SERVICE_ACCOUNT_FILE`.
268
+ - Use `spaces/<spaceId>` or `users/<userId|email>` for delivery targets.
269
+
270
+ ### Slack
271
+
272
+ ```json5
273
+ {
274
+ channels: {
275
+ slack: {
276
+ enabled: true,
277
+ botToken: "xoxb-...",
278
+ appToken: "xapp-...",
279
+ dm: {
280
+ enabled: true,
281
+ policy: "pairing",
282
+ allowFrom: ["U123", "U456", "*"],
283
+ groupEnabled: false,
284
+ groupChannels: ["G123"],
285
+ },
286
+ channels: {
287
+ C123: { allow: true, requireMention: true, allowBots: false },
288
+ "#general": {
289
+ allow: true,
290
+ requireMention: true,
291
+ allowBots: false,
292
+ users: ["U123"],
293
+ skills: ["docs"],
294
+ systemPrompt: "Short answers only.",
295
+ },
296
+ },
297
+ historyLimit: 50,
298
+ allowBots: false,
299
+ reactionNotifications: "own",
300
+ reactionAllowlist: ["U123"],
301
+ replyToMode: "off", // off | first | all
302
+ thread: {
303
+ historyScope: "thread", // thread | channel
304
+ inheritParent: false,
305
+ },
306
+ actions: {
307
+ reactions: true,
308
+ messages: true,
309
+ pins: true,
310
+ memberInfo: true,
311
+ emojiList: true,
312
+ },
313
+ slashCommand: {
314
+ enabled: true,
315
+ name: "openclaw",
316
+ sessionPrefix: "slack:slash",
317
+ ephemeral: true,
318
+ },
319
+ textChunkLimit: 4000,
320
+ chunkMode: "length",
321
+ mediaMaxMb: 20,
322
+ },
323
+ },
324
+ }
325
+ ```
326
+
327
+ - **Socket mode** requires both `botToken` and `appToken` (`SLACK_BOT_TOKEN` + `SLACK_APP_TOKEN` for default account env fallback).
328
+ - **HTTP mode** requires `botToken` plus `signingSecret` (at root or per-account).
329
+ - `configWrites: false` blocks Slack-initiated config writes.
330
+ - Use `user:<id>` (DM) or `channel:<id>` for delivery targets.
331
+
332
+ **Reaction notification modes:** `off`, `own` (default), `all`, `allowlist` (from `reactionAllowlist`).
333
+
334
+ **Thread session isolation:** `thread.historyScope` is per-thread (default) or shared across channel. `thread.inheritParent` copies parent channel transcript to new threads.
335
+
336
+ | Action group | Default | Notes |
337
+ | ------------ | ------- | ---------------------- |
338
+ | reactions | enabled | React + list reactions |
339
+ | messages | enabled | Read/send/edit/delete |
340
+ | pins | enabled | Pin/unpin/list |
341
+ | memberInfo | enabled | Member info |
342
+ | emojiList | enabled | Custom emoji list |
343
+
344
+ ### Mattermost
345
+
346
+ Mattermost ships as a plugin: `openclaw plugins install @openclaw/mattermost`.
347
+
348
+ ```json5
349
+ {
350
+ channels: {
351
+ mattermost: {
352
+ enabled: true,
353
+ botToken: "mm-token",
354
+ baseUrl: "https://chat.example.com",
355
+ dmPolicy: "pairing",
356
+ chatmode: "oncall", // oncall | onmessage | onchar
357
+ oncharPrefixes: [">", "!"],
358
+ textChunkLimit: 4000,
359
+ chunkMode: "length",
360
+ },
361
+ },
362
+ }
363
+ ```
364
+
365
+ Chat modes: `oncall` (respond on @-mention, default), `onmessage` (every message), `onchar` (messages starting with trigger prefix).
366
+
367
+ ### Signal
368
+
369
+ ```json5
370
+ {
371
+ channels: {
372
+ signal: {
373
+ reactionNotifications: "own", // off | own | all | allowlist
374
+ reactionAllowlist: ["+15551234567", "uuid:123e4567-e89b-12d3-a456-426614174000"],
375
+ historyLimit: 50,
376
+ },
377
+ },
378
+ }
379
+ ```
380
+
381
+ **Reaction notification modes:** `off`, `own` (default), `all`, `allowlist` (from `reactionAllowlist`).
382
+
383
+ ### iMessage
384
+
385
+ OpenClaw spawns `imsg rpc` (JSON-RPC over stdio). No daemon or port required.
386
+
387
+ ```json5
388
+ {
389
+ channels: {
390
+ imessage: {
391
+ enabled: true,
392
+ cliPath: "imsg",
393
+ dbPath: "~/Library/Messages/chat.db",
394
+ remoteHost: "user@gateway-host",
395
+ dmPolicy: "pairing",
396
+ allowFrom: ["+15555550123", "user@example.com", "chat_id:123"],
397
+ historyLimit: 50,
398
+ includeAttachments: false,
399
+ mediaMaxMb: 16,
400
+ service: "auto",
401
+ region: "US",
402
+ },
403
+ },
404
+ }
405
+ ```
406
+
407
+ - Requires Full Disk Access to the Messages DB.
408
+ - Prefer `chat_id:<id>` targets. Use `imsg chats --limit 20` to list chats.
409
+ - `cliPath` can point to an SSH wrapper; set `remoteHost` for SCP attachment fetching.
410
+
411
+ <Accordion title="iMessage SSH wrapper example">
412
+
413
+ ```bash
414
+ #!/usr/bin/env bash
415
+ exec ssh -T gateway-host imsg "$@"
416
+ ```
417
+
418
+ </Accordion>
419
+
420
+ ### Multi-account (all channels)
421
+
422
+ Run multiple accounts per channel (each with its own `accountId`):
423
+
424
+ ```json5
425
+ {
426
+ channels: {
427
+ telegram: {
428
+ accounts: {
429
+ default: {
430
+ name: "Primary bot",
431
+ botToken: "123456:ABC...",
432
+ },
433
+ alerts: {
434
+ name: "Alerts bot",
435
+ botToken: "987654:XYZ...",
436
+ },
437
+ },
438
+ },
439
+ },
440
+ }
441
+ ```
442
+
443
+ - `default` is used when `accountId` is omitted (CLI + routing).
444
+ - Env tokens only apply to the **default** account.
445
+ - Base channel settings apply to all accounts unless overridden per account.
446
+ - Use `bindings[].match.accountId` to route each account to a different agent.
447
+
448
+ ### Group chat mention gating
449
+
450
+ Group messages default to **require mention** (metadata mention or regex patterns). Applies to WhatsApp, Telegram, Discord, Google Chat, and iMessage group chats.
451
+
452
+ **Mention types:**
453
+
454
+ - **Metadata mentions**: Native platform @-mentions. Ignored in WhatsApp self-chat mode.
455
+ - **Text patterns**: Regex patterns in `agents.list[].groupChat.mentionPatterns`. Always checked.
456
+ - Mention gating is enforced only when detection is possible (native mentions or at least one pattern).
457
+
458
+ ```json5
459
+ {
460
+ messages: {
461
+ groupChat: { historyLimit: 50 },
462
+ },
463
+ agents: {
464
+ list: [{ id: "main", groupChat: { mentionPatterns: ["@openclaw", "openclaw"] } }],
465
+ },
466
+ }
467
+ ```
468
+
469
+ `messages.groupChat.historyLimit` sets the global default. Channels can override with `channels.<channel>.historyLimit` (or per-account). Set `0` to disable.
470
+
471
+ #### DM history limits
472
+
473
+ ```json5
474
+ {
475
+ channels: {
476
+ telegram: {
477
+ dmHistoryLimit: 30,
478
+ dms: {
479
+ "123456789": { historyLimit: 50 },
480
+ },
481
+ },
482
+ },
483
+ }
484
+ ```
485
+
486
+ Resolution: per-DM override → provider default → no limit (all retained).
487
+
488
+ Supported: `telegram`, `whatsapp`, `discord`, `slack`, `signal`, `imessage`, `msteams`.
489
+
490
+ #### Self-chat mode
491
+
492
+ Include your own number in `allowFrom` to enable self-chat mode (ignores native @-mentions, only responds to text patterns):
493
+
494
+ ```json5
495
+ {
496
+ channels: {
497
+ whatsapp: {
498
+ allowFrom: ["+15555550123"],
499
+ groups: { "*": { requireMention: true } },
500
+ },
501
+ },
502
+ agents: {
503
+ list: [
504
+ {
505
+ id: "main",
506
+ groupChat: { mentionPatterns: ["reisponde", "@openclaw"] },
507
+ },
508
+ ],
509
+ },
510
+ }
511
+ ```
512
+
513
+ ### Commands (chat command handling)
514
+
515
+ ```json5
516
+ {
517
+ commands: {
518
+ native: "auto", // register native commands when supported
519
+ text: true, // parse /commands in chat messages
520
+ bash: false, // allow ! (alias: /bash)
521
+ bashForegroundMs: 2000,
522
+ config: false, // allow /config
523
+ debug: false, // allow /debug
524
+ restart: false, // allow /restart + gateway restart tool
525
+ allowFrom: {
526
+ "*": ["user1"],
527
+ discord: ["user:123"],
528
+ },
529
+ useAccessGroups: true,
530
+ },
531
+ }
532
+ ```
533
+
534
+ <Accordion title="Command details">
535
+
536
+ - Text commands must be **standalone** messages with leading `/`.
537
+ - `native: "auto"` turns on native commands for Discord/Telegram, leaves Slack off.
538
+ - Override per channel: `channels.discord.commands.native` (bool or `"auto"`). `false` clears previously registered commands.
539
+ - `channels.telegram.customCommands` adds extra Telegram bot menu entries.
540
+ - `bash: true` enables `! <cmd>` for host shell. Requires `tools.elevated.enabled` and sender in `tools.elevated.allowFrom.<channel>`.
541
+ - `config: true` enables `/config` (reads/writes `openclaw.json`).
542
+ - `channels.<provider>.configWrites` gates config mutations per channel (default: true).
543
+ - `allowFrom` is per-provider. When set, it is the **only** authorization source (channel allowlists/pairing and `useAccessGroups` are ignored).
544
+ - `useAccessGroups: false` allows commands to bypass access-group policies when `allowFrom` is not set.
545
+
546
+ </Accordion>
547
+
548
+ ---
549
+
550
+ ## Agent defaults
551
+
552
+ ### `agents.defaults.workspace`
553
+
554
+ Default: `~/.openclaw/workspace`.
555
+
556
+ ```json5
557
+ {
558
+ agents: { defaults: { workspace: "~/.openclaw/workspace" } },
559
+ }
560
+ ```
561
+
562
+ ### `agents.defaults.repoRoot`
563
+
564
+ Optional repository root shown in the system prompt's Runtime line. If unset, OpenClaw auto-detects by walking upward from the workspace.
565
+
566
+ ```json5
567
+ {
568
+ agents: { defaults: { repoRoot: "~/Projects/openclaw" } },
569
+ }
570
+ ```
571
+
572
+ ### `agents.defaults.skipBootstrap`
573
+
574
+ Disables automatic creation of workspace bootstrap files (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md`).
575
+
576
+ ```json5
577
+ {
578
+ agents: { defaults: { skipBootstrap: true } },
579
+ }
580
+ ```
581
+
582
+ ### `agents.defaults.bootstrapMaxChars`
583
+
584
+ Max characters per workspace bootstrap file before truncation. Default: `20000`.
585
+
586
+ ```json5
587
+ {
588
+ agents: { defaults: { bootstrapMaxChars: 20000 } },
589
+ }
590
+ ```
591
+
592
+ ### `agents.defaults.userTimezone`
593
+
594
+ Timezone for system prompt context (not message timestamps). Falls back to host timezone.
595
+
596
+ ```json5
597
+ {
598
+ agents: { defaults: { userTimezone: "America/Chicago" } },
599
+ }
600
+ ```
601
+
602
+ ### `agents.defaults.timeFormat`
603
+
604
+ Time format in system prompt. Default: `auto` (OS preference).
605
+
606
+ ```json5
607
+ {
608
+ agents: { defaults: { timeFormat: "auto" } }, // auto | 12 | 24
609
+ }
610
+ ```
611
+
612
+ ### `agents.defaults.model`
613
+
614
+ ```json5
615
+ {
616
+ agents: {
617
+ defaults: {
618
+ models: {
619
+ "anthropic/claude-opus-4-6": { alias: "opus" },
620
+ "minimax/MiniMax-M2.1": { alias: "minimax" },
621
+ },
622
+ model: {
623
+ primary: "anthropic/claude-opus-4-6",
624
+ fallbacks: ["minimax/MiniMax-M2.1"],
625
+ },
626
+ imageModel: {
627
+ primary: "openrouter/qwen/qwen-2.5-vl-72b-instruct:free",
628
+ fallbacks: ["openrouter/google/gemini-2.0-flash-vision:free"],
629
+ },
630
+ thinkingDefault: "low",
631
+ verboseDefault: "off",
632
+ elevatedDefault: "on",
633
+ timeoutSeconds: 600,
634
+ mediaMaxMb: 5,
635
+ contextTokens: 200000,
636
+ maxConcurrent: 3,
637
+ },
638
+ },
639
+ }
640
+ ```
641
+
642
+ - `model.primary`: format `provider/model` (e.g. `anthropic/claude-opus-4-6`). If you omit the provider, OpenClaw assumes `anthropic` (deprecated).
643
+ - `models`: the configured model catalog and allowlist for `/model`. Each entry can include `alias` (shortcut) and `params` (provider-specific: `temperature`, `maxTokens`).
644
+ - `imageModel`: only used if the primary model lacks image input.
645
+ - `maxConcurrent`: max parallel agent runs across sessions (each session still serialized). Default: 1.
646
+
647
+ **Built-in alias shorthands** (only apply when the model is in `agents.defaults.models`):
648
+
649
+ | Alias | Model |
650
+ | -------------- | ------------------------------- |
651
+ | `opus` | `anthropic/claude-opus-4-6` |
652
+ | `sonnet` | `anthropic/claude-sonnet-4-5` |
653
+ | `gpt` | `openai/gpt-5.2` |
654
+ | `gpt-mini` | `openai/gpt-5-mini` |
655
+ | `gemini` | `google/gemini-3-pro-preview` |
656
+ | `gemini-flash` | `google/gemini-3-flash-preview` |
657
+
658
+ Your configured aliases always win over defaults.
659
+
660
+ Z.AI GLM-4.x models automatically enable thinking mode unless you set `--thinking off` or define `agents.defaults.models["zai/<model>"].params.thinking` yourself.
661
+
662
+ ### `agents.defaults.cliBackends`
663
+
664
+ Optional CLI backends for text-only fallback runs (no tool calls). Useful as a backup when API providers fail.
665
+
666
+ ```json5
667
+ {
668
+ agents: {
669
+ defaults: {
670
+ cliBackends: {
671
+ "claude-cli": {
672
+ command: "/opt/homebrew/bin/claude",
673
+ },
674
+ "my-cli": {
675
+ command: "my-cli",
676
+ args: ["--json"],
677
+ output: "json",
678
+ modelArg: "--model",
679
+ sessionArg: "--session",
680
+ sessionMode: "existing",
681
+ systemPromptArg: "--system",
682
+ systemPromptWhen: "first",
683
+ imageArg: "--image",
684
+ imageMode: "repeat",
685
+ },
686
+ },
687
+ },
688
+ },
689
+ }
690
+ ```
691
+
692
+ - CLI backends are text-first; tools are always disabled.
693
+ - Sessions supported when `sessionArg` is set.
694
+ - Image pass-through supported when `imageArg` accepts file paths.
695
+
696
+ ### `agents.defaults.heartbeat`
697
+
698
+ Periodic heartbeat runs.
699
+
700
+ ```json5
701
+ {
702
+ agents: {
703
+ defaults: {
704
+ heartbeat: {
705
+ every: "30m", // 0m disables
706
+ model: "openai/gpt-5.2-mini",
707
+ includeReasoning: false,
708
+ session: "main",
709
+ to: "+15555550123",
710
+ target: "last", // last | whatsapp | telegram | discord | ... | none
711
+ prompt: "Read HEARTBEAT.md if it exists...",
712
+ ackMaxChars: 300,
713
+ },
714
+ },
715
+ },
716
+ }
717
+ ```
718
+
719
+ - `every`: duration string (ms/s/m/h). Default: `30m`.
720
+ - Per-agent: set `agents.list[].heartbeat`. When any agent defines `heartbeat`, **only those agents** run heartbeats.
721
+ - Heartbeats run full agent turns — shorter intervals burn more tokens.
722
+
723
+ ### `agents.defaults.compaction`
724
+
725
+ ```json5
726
+ {
727
+ agents: {
728
+ defaults: {
729
+ compaction: {
730
+ mode: "safeguard", // default | safeguard
731
+ reserveTokensFloor: 24000,
732
+ memoryFlush: {
733
+ enabled: true,
734
+ softThresholdTokens: 6000,
735
+ systemPrompt: "Session nearing compaction. Store durable memories now.",
736
+ prompt: "Write any lasting notes to memory/YYYY-MM-DD.md; reply with NO_REPLY if nothing to store.",
737
+ },
738
+ },
739
+ },
740
+ },
741
+ }
742
+ ```
743
+
744
+ - `mode`: `default` or `safeguard` (chunked summarization for long histories). See [Compaction](/concepts/compaction).
745
+ - `memoryFlush`: silent agentic turn before auto-compaction to store durable memories. Skipped when workspace is read-only.
746
+
747
+ ### `agents.defaults.contextPruning`
748
+
749
+ Prunes **old tool results** from in-memory context before sending to the LLM. Does **not** modify session history on disk.
750
+
751
+ ```json5
752
+ {
753
+ agents: {
754
+ defaults: {
755
+ contextPruning: {
756
+ mode: "cache-ttl", // off | cache-ttl
757
+ ttl: "1h", // duration (ms/s/m/h), default unit: minutes
758
+ keepLastAssistants: 3,
759
+ softTrimRatio: 0.3,
760
+ hardClearRatio: 0.5,
761
+ minPrunableToolChars: 50000,
762
+ softTrim: { maxChars: 4000, headChars: 1500, tailChars: 1500 },
763
+ hardClear: { enabled: true, placeholder: "[Old tool result content cleared]" },
764
+ tools: { deny: ["browser", "canvas"] },
765
+ },
766
+ },
767
+ },
768
+ }
769
+ ```
770
+
771
+ <Accordion title="cache-ttl mode behavior">
772
+
773
+ - `mode: "cache-ttl"` enables pruning passes.
774
+ - `ttl` controls how often pruning can run again (after the last cache touch).
775
+ - Pruning soft-trims oversized tool results first, then hard-clears older tool results if needed.
776
+
777
+ **Soft-trim** keeps beginning + end and inserts `...` in the middle.
778
+
779
+ **Hard-clear** replaces the entire tool result with the placeholder.
780
+
781
+ Notes:
782
+
783
+ - Image blocks are never trimmed/cleared.
784
+ - Ratios are character-based (approximate), not exact token counts.
785
+ - If fewer than `keepLastAssistants` assistant messages exist, pruning is skipped.
786
+
787
+ </Accordion>
788
+
789
+ See [Session Pruning](/concepts/session-pruning) for behavior details.
790
+
791
+ ### Block streaming
792
+
793
+ ```json5
794
+ {
795
+ agents: {
796
+ defaults: {
797
+ blockStreamingDefault: "off", // on | off
798
+ blockStreamingBreak: "text_end", // text_end | message_end
799
+ blockStreamingChunk: { minChars: 800, maxChars: 1200 },
800
+ blockStreamingCoalesce: { idleMs: 1000 },
801
+ humanDelay: { mode: "natural" }, // off | natural | custom (use minMs/maxMs)
802
+ },
803
+ },
804
+ }
805
+ ```
806
+
807
+ - Non-Telegram channels require explicit `*.blockStreaming: true` to enable block replies.
808
+ - Channel overrides: `channels.<channel>.blockStreamingCoalesce` (and per-account variants). Signal/Slack/Discord/Google Chat default `minChars: 1500`.
809
+ - `humanDelay`: randomized pause between block replies. `natural` = 800–2500ms. Per-agent override: `agents.list[].humanDelay`.
810
+
811
+ See [Streaming](/concepts/streaming) for behavior + chunking details.
812
+
813
+ ### Typing indicators
814
+
815
+ ```json5
816
+ {
817
+ agents: {
818
+ defaults: {
819
+ typingMode: "instant", // never | instant | thinking | message
820
+ typingIntervalSeconds: 6,
821
+ },
822
+ },
823
+ }
824
+ ```
825
+
826
+ - Defaults: `instant` for direct chats/mentions, `message` for unmentioned group chats.
827
+ - Per-session overrides: `session.typingMode`, `session.typingIntervalSeconds`.
828
+
829
+ See [Typing Indicators](/concepts/typing-indicators).
830
+
831
+ ### `agents.defaults.sandbox`
832
+
833
+ Optional **Docker sandboxing** for the embedded agent. See [Sandboxing](/gateway/sandboxing) for the full guide.
834
+
835
+ ```json5
836
+ {
837
+ agents: {
838
+ defaults: {
839
+ sandbox: {
840
+ mode: "non-main", // off | non-main | all
841
+ scope: "agent", // session | agent | shared
842
+ workspaceAccess: "none", // none | ro | rw
843
+ workspaceRoot: "~/.openclaw/sandboxes",
844
+ docker: {
845
+ image: "openclaw-sandbox:bookworm-slim",
846
+ containerPrefix: "openclaw-sbx-",
847
+ workdir: "/workspace",
848
+ readOnlyRoot: true,
849
+ tmpfs: ["/tmp", "/var/tmp", "/run"],
850
+ network: "none",
851
+ user: "1000:1000",
852
+ capDrop: ["ALL"],
853
+ env: { LANG: "C.UTF-8" },
854
+ setupCommand: "apt-get update && apt-get install -y git curl jq",
855
+ pidsLimit: 256,
856
+ memory: "1g",
857
+ memorySwap: "2g",
858
+ cpus: 1,
859
+ ulimits: {
860
+ nofile: { soft: 1024, hard: 2048 },
861
+ nproc: 256,
862
+ },
863
+ seccompProfile: "/path/to/seccomp.json",
864
+ apparmorProfile: "openclaw-sandbox",
865
+ dns: ["1.1.1.1", "8.8.8.8"],
866
+ extraHosts: ["internal.service:10.0.0.5"],
867
+ binds: ["/home/user/source:/source:rw"],
868
+ },
869
+ browser: {
870
+ enabled: false,
871
+ image: "openclaw-sandbox-browser:bookworm-slim",
872
+ cdpPort: 9222,
873
+ vncPort: 5900,
874
+ noVncPort: 6080,
875
+ headless: false,
876
+ enableNoVnc: true,
877
+ allowHostControl: false,
878
+ autoStart: true,
879
+ autoStartTimeoutMs: 12000,
880
+ },
881
+ prune: {
882
+ idleHours: 24,
883
+ maxAgeDays: 7,
884
+ },
885
+ },
886
+ },
887
+ },
888
+ tools: {
889
+ sandbox: {
890
+ tools: {
891
+ allow: [
892
+ "exec",
893
+ "process",
894
+ "read",
895
+ "write",
896
+ "edit",
897
+ "apply_patch",
898
+ "sessions_list",
899
+ "sessions_history",
900
+ "sessions_send",
901
+ "sessions_spawn",
902
+ "session_status",
903
+ ],
904
+ deny: ["browser", "canvas", "nodes", "cron", "discord", "gateway"],
905
+ },
906
+ },
907
+ },
908
+ }
909
+ ```
910
+
911
+ <Accordion title="Sandbox details">
912
+
913
+ **Workspace access:**
914
+
915
+ - `none`: per-scope sandbox workspace under `~/.openclaw/sandboxes`
916
+ - `ro`: sandbox workspace at `/workspace`, agent workspace mounted read-only at `/agent`
917
+ - `rw`: agent workspace mounted read/write at `/workspace`
918
+
919
+ **Scope:**
920
+
921
+ - `session`: per-session container + workspace
922
+ - `agent`: one container + workspace per agent (default)
923
+ - `shared`: shared container and workspace (no cross-session isolation)
924
+
925
+ **`setupCommand`** runs once after container creation (via `sh -lc`). Needs network egress, writable root, root user.
926
+
927
+ **Containers default to `network: "none"`** — set to `"bridge"` if the agent needs outbound access.
928
+
929
+ **Inbound attachments** are staged into `media/inbound/*` in the active workspace.
930
+
931
+ **`docker.binds`** mounts additional host directories; global and per-agent binds are merged.
932
+
933
+ **Sandboxed browser** (`sandbox.browser.enabled`): Chromium + CDP in a container. noVNC URL injected into system prompt. Does not require `browser.enabled` in main config.
934
+
935
+ - `allowHostControl: false` (default) blocks sandboxed sessions from targeting the host browser.
936
+
937
+ </Accordion>
938
+
939
+ Build images:
940
+
941
+ ```bash
942
+ scripts/sandbox-setup.sh # main sandbox image
943
+ scripts/sandbox-browser-setup.sh # optional browser image
944
+ ```
945
+
946
+ ### `agents.list` (per-agent overrides)
947
+
948
+ ```json5
949
+ {
950
+ agents: {
951
+ list: [
952
+ {
953
+ id: "main",
954
+ default: true,
955
+ name: "Main Agent",
956
+ workspace: "~/.openclaw/workspace",
957
+ agentDir: "~/.openclaw/agents/main/agent",
958
+ model: "anthropic/claude-opus-4-6", // or { primary, fallbacks }
959
+ identity: {
960
+ name: "Samantha",
961
+ theme: "helpful sloth",
962
+ emoji: "🦥",
963
+ avatar: "avatars/samantha.png",
964
+ },
965
+ groupChat: { mentionPatterns: ["@openclaw"] },
966
+ sandbox: { mode: "off" },
967
+ subagents: { allowAgents: ["*"] },
968
+ tools: {
969
+ profile: "coding",
970
+ allow: ["browser"],
971
+ deny: ["canvas"],
972
+ elevated: { enabled: true },
973
+ },
974
+ },
975
+ ],
976
+ },
977
+ }
978
+ ```
979
+
980
+ - `id`: stable agent id (required).
981
+ - `default`: when multiple are set, first wins (warning logged). If none set, first list entry is default.
982
+ - `model`: string form overrides `primary` only; object form `{ primary, fallbacks }` overrides both (`[]` disables global fallbacks).
983
+ - `identity.avatar`: workspace-relative path, `http(s)` URL, or `data:` URI.
984
+ - `identity` derives defaults: `ackReaction` from `emoji`, `mentionPatterns` from `name`/`emoji`.
985
+ - `subagents.allowAgents`: allowlist of agent ids for `sessions_spawn` (`["*"]` = any; default: same agent only).
986
+
987
+ ---
988
+
989
+ ## Multi-agent routing
990
+
991
+ Run multiple isolated agents inside one Gateway. See [Multi-Agent](/concepts/multi-agent).
992
+
993
+ ```json5
994
+ {
995
+ agents: {
996
+ list: [
997
+ { id: "home", default: true, workspace: "~/.openclaw/workspace-home" },
998
+ { id: "work", workspace: "~/.openclaw/workspace-work" },
999
+ ],
1000
+ },
1001
+ bindings: [
1002
+ { agentId: "home", match: { channel: "whatsapp", accountId: "personal" } },
1003
+ { agentId: "work", match: { channel: "whatsapp", accountId: "biz" } },
1004
+ ],
1005
+ }
1006
+ ```
1007
+
1008
+ ### Binding match fields
1009
+
1010
+ - `match.channel` (required)
1011
+ - `match.accountId` (optional; `*` = any account; omitted = default account)
1012
+ - `match.peer` (optional; `{ kind: direct|group|channel, id }`)
1013
+ - `match.guildId` / `match.teamId` (optional; channel-specific)
1014
+
1015
+ **Deterministic match order:**
1016
+
1017
+ 1. `match.peer`
1018
+ 2. `match.guildId`
1019
+ 3. `match.teamId`
1020
+ 4. `match.accountId` (exact, no peer/guild/team)
1021
+ 5. `match.accountId: "*"` (channel-wide)
1022
+ 6. Default agent
1023
+
1024
+ Within each tier, the first matching `bindings` entry wins.
1025
+
1026
+ ### Per-agent access profiles
1027
+
1028
+ <Accordion title="Full access (no sandbox)">
1029
+
1030
+ ```json5
1031
+ {
1032
+ agents: {
1033
+ list: [
1034
+ {
1035
+ id: "personal",
1036
+ workspace: "~/.openclaw/workspace-personal",
1037
+ sandbox: { mode: "off" },
1038
+ },
1039
+ ],
1040
+ },
1041
+ }
1042
+ ```
1043
+
1044
+ </Accordion>
1045
+
1046
+ <Accordion title="Read-only tools + workspace">
1047
+
1048
+ ```json5
1049
+ {
1050
+ agents: {
1051
+ list: [
1052
+ {
1053
+ id: "family",
1054
+ workspace: "~/.openclaw/workspace-family",
1055
+ sandbox: { mode: "all", scope: "agent", workspaceAccess: "ro" },
1056
+ tools: {
1057
+ allow: [
1058
+ "read",
1059
+ "sessions_list",
1060
+ "sessions_history",
1061
+ "sessions_send",
1062
+ "sessions_spawn",
1063
+ "session_status",
1064
+ ],
1065
+ deny: ["write", "edit", "apply_patch", "exec", "process", "browser"],
1066
+ },
1067
+ },
1068
+ ],
1069
+ },
1070
+ }
1071
+ ```
1072
+
1073
+ </Accordion>
1074
+
1075
+ <Accordion title="No filesystem access (messaging only)">
1076
+
1077
+ ```json5
1078
+ {
1079
+ agents: {
1080
+ list: [
1081
+ {
1082
+ id: "public",
1083
+ workspace: "~/.openclaw/workspace-public",
1084
+ sandbox: { mode: "all", scope: "agent", workspaceAccess: "none" },
1085
+ tools: {
1086
+ allow: [
1087
+ "sessions_list",
1088
+ "sessions_history",
1089
+ "sessions_send",
1090
+ "sessions_spawn",
1091
+ "session_status",
1092
+ "whatsapp",
1093
+ "telegram",
1094
+ "slack",
1095
+ "discord",
1096
+ "gateway",
1097
+ ],
1098
+ deny: [
1099
+ "read",
1100
+ "write",
1101
+ "edit",
1102
+ "apply_patch",
1103
+ "exec",
1104
+ "process",
1105
+ "browser",
1106
+ "canvas",
1107
+ "nodes",
1108
+ "cron",
1109
+ "gateway",
1110
+ "image",
1111
+ ],
1112
+ },
1113
+ },
1114
+ ],
1115
+ },
1116
+ }
1117
+ ```
1118
+
1119
+ </Accordion>
1120
+
1121
+ See [Multi-Agent Sandbox & Tools](/tools/multi-agent-sandbox-tools) for precedence details.
1122
+
1123
+ ---
1124
+
1125
+ ## Session
1126
+
1127
+ ```json5
1128
+ {
1129
+ session: {
1130
+ scope: "per-sender",
1131
+ dmScope: "main", // main | per-peer | per-channel-peer | per-account-channel-peer
1132
+ identityLinks: {
1133
+ alice: ["telegram:123456789", "discord:987654321012345678"],
1134
+ },
1135
+ reset: {
1136
+ mode: "daily", // daily | idle
1137
+ atHour: 4,
1138
+ idleMinutes: 60,
1139
+ },
1140
+ resetByType: {
1141
+ thread: { mode: "daily", atHour: 4 },
1142
+ direct: { mode: "idle", idleMinutes: 240 },
1143
+ group: { mode: "idle", idleMinutes: 120 },
1144
+ },
1145
+ resetTriggers: ["/new", "/reset"],
1146
+ store: "~/.openclaw/agents/{agentId}/sessions/sessions.json",
1147
+ maintenance: {
1148
+ mode: "warn", // warn | enforce
1149
+ pruneAfter: "30d",
1150
+ maxEntries: 500,
1151
+ rotateBytes: "10mb",
1152
+ },
1153
+ mainKey: "main", // legacy (runtime always uses "main")
1154
+ agentToAgent: { maxPingPongTurns: 5 },
1155
+ sendPolicy: {
1156
+ rules: [{ action: "deny", match: { channel: "discord", chatType: "group" } }],
1157
+ default: "allow",
1158
+ },
1159
+ },
1160
+ }
1161
+ ```
1162
+
1163
+ <Accordion title="Session field details">
1164
+
1165
+ - **`dmScope`**: how DMs are grouped.
1166
+ - `main`: all DMs share the main session.
1167
+ - `per-peer`: isolate by sender id across channels.
1168
+ - `per-channel-peer`: isolate per channel + sender (recommended for multi-user inboxes).
1169
+ - `per-account-channel-peer`: isolate per account + channel + sender (recommended for multi-account).
1170
+ - **`identityLinks`**: map canonical ids to provider-prefixed peers for cross-channel session sharing.
1171
+ - **`reset`**: primary reset policy. `daily` resets at `atHour` local time; `idle` resets after `idleMinutes`. When both configured, whichever expires first wins.
1172
+ - **`resetByType`**: per-type overrides (`direct`, `group`, `thread`). Legacy `dm` accepted as alias for `direct`.
1173
+ - **`mainKey`**: legacy field. Runtime now always uses `"main"` for the main direct-chat bucket.
1174
+ - **`sendPolicy`**: match by `channel`, `chatType` (`direct|group|channel`, with legacy `dm` alias), or `keyPrefix`. First deny wins.
1175
+ - **`maintenance`**: `warn` warns the active session on eviction; `enforce` applies pruning and rotation.
1176
+
1177
+ </Accordion>
1178
+
1179
+ ---
1180
+
1181
+ ## Messages
1182
+
1183
+ ```json5
1184
+ {
1185
+ messages: {
1186
+ responsePrefix: "🦞", // or "auto"
1187
+ ackReaction: "👀",
1188
+ ackReactionScope: "group-mentions", // group-mentions | group-all | direct | all
1189
+ removeAckAfterReply: false,
1190
+ queue: {
1191
+ mode: "collect", // steer | followup | collect | steer-backlog | steer+backlog | queue | interrupt
1192
+ debounceMs: 1000,
1193
+ cap: 20,
1194
+ drop: "summarize", // old | new | summarize
1195
+ byChannel: {
1196
+ whatsapp: "collect",
1197
+ telegram: "collect",
1198
+ },
1199
+ },
1200
+ inbound: {
1201
+ debounceMs: 2000, // 0 disables
1202
+ byChannel: {
1203
+ whatsapp: 5000,
1204
+ slack: 1500,
1205
+ },
1206
+ },
1207
+ },
1208
+ }
1209
+ ```
1210
+
1211
+ ### Response prefix
1212
+
1213
+ Per-channel/account overrides: `channels.<channel>.responsePrefix`, `channels.<channel>.accounts.<id>.responsePrefix`.
1214
+
1215
+ Resolution (most specific wins): account → channel → global. `""` disables and stops cascade. `"auto"` derives `[{identity.name}]`.
1216
+
1217
+ **Template variables:**
1218
+
1219
+ | Variable | Description | Example |
1220
+ | ----------------- | ---------------------- | --------------------------- |
1221
+ | `{model}` | Short model name | `claude-opus-4-6` |
1222
+ | `{modelFull}` | Full model identifier | `anthropic/claude-opus-4-6` |
1223
+ | `{provider}` | Provider name | `anthropic` |
1224
+ | `{thinkingLevel}` | Current thinking level | `high`, `low`, `off` |
1225
+ | `{identity.name}` | Agent identity name | (same as `"auto"`) |
1226
+
1227
+ Variables are case-insensitive. `{think}` is an alias for `{thinkingLevel}`.
1228
+
1229
+ ### Ack reaction
1230
+
1231
+ - Defaults to active agent's `identity.emoji`, otherwise `"👀"`. Set `""` to disable.
1232
+ - Scope: `group-mentions` (default), `group-all`, `direct`, `all`.
1233
+ - `removeAckAfterReply`: removes ack after reply (Slack/Discord/Telegram/Google Chat only).
1234
+
1235
+ ### Inbound debounce
1236
+
1237
+ Batches rapid text-only messages from the same sender into a single agent turn. Media/attachments flush immediately. Control commands bypass debouncing.
1238
+
1239
+ ### TTS (text-to-speech)
1240
+
1241
+ ```json5
1242
+ {
1243
+ messages: {
1244
+ tts: {
1245
+ auto: "always", // off | always | inbound | tagged
1246
+ mode: "final", // final | all
1247
+ provider: "elevenlabs",
1248
+ summaryModel: "openai/gpt-4.1-mini",
1249
+ modelOverrides: { enabled: true },
1250
+ maxTextLength: 4000,
1251
+ timeoutMs: 30000,
1252
+ prefsPath: "~/.openclaw/settings/tts.json",
1253
+ elevenlabs: {
1254
+ apiKey: "elevenlabs_api_key",
1255
+ baseUrl: "https://api.elevenlabs.io",
1256
+ voiceId: "voice_id",
1257
+ modelId: "eleven_multilingual_v2",
1258
+ seed: 42,
1259
+ applyTextNormalization: "auto",
1260
+ languageCode: "en",
1261
+ voiceSettings: {
1262
+ stability: 0.5,
1263
+ similarityBoost: 0.75,
1264
+ style: 0.0,
1265
+ useSpeakerBoost: true,
1266
+ speed: 1.0,
1267
+ },
1268
+ },
1269
+ openai: {
1270
+ apiKey: "openai_api_key",
1271
+ model: "gpt-4o-mini-tts",
1272
+ voice: "alloy",
1273
+ },
1274
+ },
1275
+ },
1276
+ }
1277
+ ```
1278
+
1279
+ - `auto` controls auto-TTS. `/tts off|always|inbound|tagged` overrides per session.
1280
+ - `summaryModel` overrides `agents.defaults.model.primary` for auto-summary.
1281
+ - API keys fall back to `ELEVENLABS_API_KEY`/`XI_API_KEY` and `OPENAI_API_KEY`.
1282
+
1283
+ ---
1284
+
1285
+ ## Talk
1286
+
1287
+ Defaults for Talk mode (macOS/iOS/Android).
1288
+
1289
+ ```json5
1290
+ {
1291
+ talk: {
1292
+ voiceId: "elevenlabs_voice_id",
1293
+ voiceAliases: {
1294
+ Clawd: "EXAVITQu4vr4xnSDxMaL",
1295
+ Roger: "CwhRBWXzGAHq8TQ4Fs17",
1296
+ },
1297
+ modelId: "eleven_v3",
1298
+ outputFormat: "mp3_44100_128",
1299
+ apiKey: "elevenlabs_api_key",
1300
+ interruptOnSpeech: true,
1301
+ },
1302
+ }
1303
+ ```
1304
+
1305
+ - Voice IDs fall back to `ELEVENLABS_VOICE_ID` or `SAG_VOICE_ID`.
1306
+ - `apiKey` falls back to `ELEVENLABS_API_KEY`.
1307
+ - `voiceAliases` lets Talk directives use friendly names.
1308
+
1309
+ ---
1310
+
1311
+ ## Tools
1312
+
1313
+ ### Tool profiles
1314
+
1315
+ `tools.profile` sets a base allowlist before `tools.allow`/`tools.deny`:
1316
+
1317
+ | Profile | Includes |
1318
+ | ----------- | ----------------------------------------------------------------------------------------- |
1319
+ | `minimal` | `session_status` only |
1320
+ | `coding` | `group:fs`, `group:runtime`, `group:sessions`, `group:memory`, `image` |
1321
+ | `messaging` | `group:messaging`, `sessions_list`, `sessions_history`, `sessions_send`, `session_status` |
1322
+ | `full` | No restriction (same as unset) |
1323
+
1324
+ ### Tool groups
1325
+
1326
+ | Group | Tools |
1327
+ | ------------------ | ---------------------------------------------------------------------------------------- |
1328
+ | `group:runtime` | `exec`, `process` (`bash` is accepted as an alias for `exec`) |
1329
+ | `group:fs` | `read`, `write`, `edit`, `apply_patch` |
1330
+ | `group:sessions` | `sessions_list`, `sessions_history`, `sessions_send`, `sessions_spawn`, `session_status` |
1331
+ | `group:memory` | `memory_search`, `memory_get` |
1332
+ | `group:web` | `web_search`, `web_fetch` |
1333
+ | `group:ui` | `browser`, `canvas` |
1334
+ | `group:automation` | `cron`, `gateway` |
1335
+ | `group:messaging` | `message` |
1336
+ | `group:nodes` | `nodes` |
1337
+ | `group:openclaw` | All built-in tools (excludes provider plugins) |
1338
+
1339
+ ### `tools.allow` / `tools.deny`
1340
+
1341
+ Global tool allow/deny policy (deny wins). Case-insensitive, supports `*` wildcards. Applied even when Docker sandbox is off.
1342
+
1343
+ ```json5
1344
+ {
1345
+ tools: { deny: ["browser", "canvas"] },
1346
+ }
1347
+ ```
1348
+
1349
+ ### `tools.byProvider`
1350
+
1351
+ Further restrict tools for specific providers or models. Order: base profile → provider profile → allow/deny.
1352
+
1353
+ ```json5
1354
+ {
1355
+ tools: {
1356
+ profile: "coding",
1357
+ byProvider: {
1358
+ "google-antigravity": { profile: "minimal" },
1359
+ "openai/gpt-5.2": { allow: ["group:fs", "sessions_list"] },
1360
+ },
1361
+ },
1362
+ }
1363
+ ```
1364
+
1365
+ ### `tools.elevated`
1366
+
1367
+ Controls elevated (host) exec access:
1368
+
1369
+ ```json5
1370
+ {
1371
+ tools: {
1372
+ elevated: {
1373
+ enabled: true,
1374
+ allowFrom: {
1375
+ whatsapp: ["+15555550123"],
1376
+ discord: ["steipete", "1234567890123"],
1377
+ },
1378
+ },
1379
+ },
1380
+ }
1381
+ ```
1382
+
1383
+ - Per-agent override (`agents.list[].tools.elevated`) can only further restrict.
1384
+ - `/elevated on|off|ask|full` stores state per session; inline directives apply to single message.
1385
+ - Elevated `exec` runs on the host, bypasses sandboxing.
1386
+
1387
+ ### `tools.exec`
1388
+
1389
+ ```json5
1390
+ {
1391
+ tools: {
1392
+ exec: {
1393
+ backgroundMs: 10000,
1394
+ timeoutSec: 1800,
1395
+ cleanupMs: 1800000,
1396
+ notifyOnExit: true,
1397
+ applyPatch: {
1398
+ enabled: false,
1399
+ allowModels: ["gpt-5.2"],
1400
+ },
1401
+ },
1402
+ },
1403
+ }
1404
+ ```
1405
+
1406
+ ### `tools.web`
1407
+
1408
+ ```json5
1409
+ {
1410
+ tools: {
1411
+ web: {
1412
+ search: {
1413
+ enabled: true,
1414
+ apiKey: "brave_api_key", // or BRAVE_API_KEY env
1415
+ maxResults: 5,
1416
+ timeoutSeconds: 30,
1417
+ cacheTtlMinutes: 15,
1418
+ },
1419
+ fetch: {
1420
+ enabled: true,
1421
+ maxChars: 50000,
1422
+ maxCharsCap: 50000,
1423
+ timeoutSeconds: 30,
1424
+ cacheTtlMinutes: 15,
1425
+ userAgent: "custom-ua",
1426
+ },
1427
+ },
1428
+ },
1429
+ }
1430
+ ```
1431
+
1432
+ ### `tools.media`
1433
+
1434
+ Configures inbound media understanding (image/audio/video):
1435
+
1436
+ ```json5
1437
+ {
1438
+ tools: {
1439
+ media: {
1440
+ concurrency: 2,
1441
+ audio: {
1442
+ enabled: true,
1443
+ maxBytes: 20971520,
1444
+ scope: {
1445
+ default: "deny",
1446
+ rules: [{ action: "allow", match: { chatType: "direct" } }],
1447
+ },
1448
+ models: [
1449
+ { provider: "openai", model: "gpt-4o-mini-transcribe" },
1450
+ { type: "cli", command: "whisper", args: ["--model", "base", "{{MediaPath}}"] },
1451
+ ],
1452
+ },
1453
+ video: {
1454
+ enabled: true,
1455
+ maxBytes: 52428800,
1456
+ models: [{ provider: "google", model: "gemini-3-flash-preview" }],
1457
+ },
1458
+ },
1459
+ },
1460
+ }
1461
+ ```
1462
+
1463
+ <Accordion title="Media model entry fields">
1464
+
1465
+ **Provider entry** (`type: "provider"` or omitted):
1466
+
1467
+ - `provider`: API provider id (`openai`, `anthropic`, `google`/`gemini`, `groq`, etc.)
1468
+ - `model`: model id override
1469
+ - `profile` / `preferredProfile`: auth profile selection
1470
+
1471
+ **CLI entry** (`type: "cli"`):
1472
+
1473
+ - `command`: executable to run
1474
+ - `args`: templated args (supports `{{MediaPath}}`, `{{Prompt}}`, `{{MaxChars}}`, etc.)
1475
+
1476
+ **Common fields:**
1477
+
1478
+ - `capabilities`: optional list (`image`, `audio`, `video`). Defaults: `openai`/`anthropic`/`minimax` → image, `google` → image+audio+video, `groq` → audio.
1479
+ - `prompt`, `maxChars`, `maxBytes`, `timeoutSeconds`, `language`: per-entry overrides.
1480
+ - Failures fall back to the next entry.
1481
+
1482
+ Provider auth follows standard order: auth profiles → env vars → `models.providers.*.apiKey`.
1483
+
1484
+ </Accordion>
1485
+
1486
+ ### `tools.agentToAgent`
1487
+
1488
+ ```json5
1489
+ {
1490
+ tools: {
1491
+ agentToAgent: {
1492
+ enabled: false,
1493
+ allow: ["home", "work"],
1494
+ },
1495
+ },
1496
+ }
1497
+ ```
1498
+
1499
+ ### `tools.subagents`
1500
+
1501
+ ```json5
1502
+ {
1503
+ agents: {
1504
+ defaults: {
1505
+ subagents: {
1506
+ model: "minimax/MiniMax-M2.1",
1507
+ maxConcurrent: 1,
1508
+ archiveAfterMinutes: 60,
1509
+ },
1510
+ },
1511
+ },
1512
+ }
1513
+ ```
1514
+
1515
+ - `model`: default model for spawned sub-agents. If omitted, sub-agents inherit the caller's model.
1516
+ - Per-subagent tool policy: `tools.subagents.tools.allow` / `tools.subagents.tools.deny`.
1517
+
1518
+ ---
1519
+
1520
+ ## Custom providers and base URLs
1521
+
1522
+ OpenClaw uses the pi-coding-agent model catalog. Add custom providers via `models.providers` in config or `~/.openclaw/agents/<agentId>/agent/models.json`.
1523
+
1524
+ ```json5
1525
+ {
1526
+ models: {
1527
+ mode: "merge", // merge (default) | replace
1528
+ providers: {
1529
+ "custom-proxy": {
1530
+ baseUrl: "http://localhost:4000/v1",
1531
+ apiKey: "LITELLM_KEY",
1532
+ api: "openai-completions", // openai-completions | openai-responses | anthropic-messages | google-generative-ai
1533
+ models: [
1534
+ {
1535
+ id: "llama-3.1-8b",
1536
+ name: "Llama 3.1 8B",
1537
+ reasoning: false,
1538
+ input: ["text"],
1539
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
1540
+ contextWindow: 128000,
1541
+ maxTokens: 32000,
1542
+ },
1543
+ ],
1544
+ },
1545
+ },
1546
+ },
1547
+ }
1548
+ ```
1549
+
1550
+ - Use `authHeader: true` + `headers` for custom auth needs.
1551
+ - Override agent config root with `OPENCLAW_AGENT_DIR` (or `PI_CODING_AGENT_DIR`).
1552
+
1553
+ ### Provider examples
1554
+
1555
+ <Accordion title="Cerebras (GLM 4.6 / 4.7)">
1556
+
1557
+ ```json5
1558
+ {
1559
+ env: { CEREBRAS_API_KEY: "sk-..." },
1560
+ agents: {
1561
+ defaults: {
1562
+ model: {
1563
+ primary: "cerebras/zai-glm-4.7",
1564
+ fallbacks: ["cerebras/zai-glm-4.6"],
1565
+ },
1566
+ models: {
1567
+ "cerebras/zai-glm-4.7": { alias: "GLM 4.7 (Cerebras)" },
1568
+ "cerebras/zai-glm-4.6": { alias: "GLM 4.6 (Cerebras)" },
1569
+ },
1570
+ },
1571
+ },
1572
+ models: {
1573
+ mode: "merge",
1574
+ providers: {
1575
+ cerebras: {
1576
+ baseUrl: "https://api.cerebras.ai/v1",
1577
+ apiKey: "${CEREBRAS_API_KEY}",
1578
+ api: "openai-completions",
1579
+ models: [
1580
+ { id: "zai-glm-4.7", name: "GLM 4.7 (Cerebras)" },
1581
+ { id: "zai-glm-4.6", name: "GLM 4.6 (Cerebras)" },
1582
+ ],
1583
+ },
1584
+ },
1585
+ },
1586
+ }
1587
+ ```
1588
+
1589
+ Use `cerebras/zai-glm-4.7` for Cerebras; `zai/glm-4.7` for Z.AI direct.
1590
+
1591
+ </Accordion>
1592
+
1593
+ <Accordion title="OpenCode Zen">
1594
+
1595
+ ```json5
1596
+ {
1597
+ agents: {
1598
+ defaults: {
1599
+ model: { primary: "opencode/claude-opus-4-6" },
1600
+ models: { "opencode/claude-opus-4-6": { alias: "Opus" } },
1601
+ },
1602
+ },
1603
+ }
1604
+ ```
1605
+
1606
+ Set `OPENCODE_API_KEY` (or `OPENCODE_ZEN_API_KEY`). Shortcut: `openclaw onboard --auth-choice opencode-zen`.
1607
+
1608
+ </Accordion>
1609
+
1610
+ <Accordion title="Z.AI (GLM-4.7)">
1611
+
1612
+ ```json5
1613
+ {
1614
+ agents: {
1615
+ defaults: {
1616
+ model: { primary: "zai/glm-4.7" },
1617
+ models: { "zai/glm-4.7": {} },
1618
+ },
1619
+ },
1620
+ }
1621
+ ```
1622
+
1623
+ Set `ZAI_API_KEY`. `z.ai/*` and `z-ai/*` are accepted aliases. Shortcut: `openclaw onboard --auth-choice zai-api-key`.
1624
+
1625
+ - General endpoint: `https://api.z.ai/api/paas/v4`
1626
+ - Coding endpoint (default): `https://api.z.ai/api/coding/paas/v4`
1627
+ - For the general endpoint, define a custom provider with the base URL override.
1628
+
1629
+ </Accordion>
1630
+
1631
+ <Accordion title="Moonshot AI (Kimi)">
1632
+
1633
+ ```json5
1634
+ {
1635
+ env: { MOONSHOT_API_KEY: "sk-..." },
1636
+ agents: {
1637
+ defaults: {
1638
+ model: { primary: "moonshot/kimi-k2.5" },
1639
+ models: { "moonshot/kimi-k2.5": { alias: "Kimi K2.5" } },
1640
+ },
1641
+ },
1642
+ models: {
1643
+ mode: "merge",
1644
+ providers: {
1645
+ moonshot: {
1646
+ baseUrl: "https://api.moonshot.ai/v1",
1647
+ apiKey: "${MOONSHOT_API_KEY}",
1648
+ api: "openai-completions",
1649
+ models: [
1650
+ {
1651
+ id: "kimi-k2.5",
1652
+ name: "Kimi K2.5",
1653
+ reasoning: false,
1654
+ input: ["text"],
1655
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
1656
+ contextWindow: 256000,
1657
+ maxTokens: 8192,
1658
+ },
1659
+ ],
1660
+ },
1661
+ },
1662
+ },
1663
+ }
1664
+ ```
1665
+
1666
+ For the China endpoint: `baseUrl: "https://api.moonshot.cn/v1"` or `openclaw onboard --auth-choice moonshot-api-key-cn`.
1667
+
1668
+ </Accordion>
1669
+
1670
+ <Accordion title="Kimi Coding">
1671
+
1672
+ ```json5
1673
+ {
1674
+ env: { KIMI_API_KEY: "sk-..." },
1675
+ agents: {
1676
+ defaults: {
1677
+ model: { primary: "kimi-coding/k2p5" },
1678
+ models: { "kimi-coding/k2p5": { alias: "Kimi K2.5" } },
1679
+ },
1680
+ },
1681
+ }
1682
+ ```
1683
+
1684
+ Anthropic-compatible, built-in provider. Shortcut: `openclaw onboard --auth-choice kimi-code-api-key`.
1685
+
1686
+ </Accordion>
1687
+
1688
+ <Accordion title="Synthetic (Anthropic-compatible)">
1689
+
1690
+ ```json5
1691
+ {
1692
+ env: { SYNTHETIC_API_KEY: "sk-..." },
1693
+ agents: {
1694
+ defaults: {
1695
+ model: { primary: "synthetic/hf:MiniMaxAI/MiniMax-M2.1" },
1696
+ models: { "synthetic/hf:MiniMaxAI/MiniMax-M2.1": { alias: "MiniMax M2.1" } },
1697
+ },
1698
+ },
1699
+ models: {
1700
+ mode: "merge",
1701
+ providers: {
1702
+ synthetic: {
1703
+ baseUrl: "https://api.synthetic.new/anthropic",
1704
+ apiKey: "${SYNTHETIC_API_KEY}",
1705
+ api: "anthropic-messages",
1706
+ models: [
1707
+ {
1708
+ id: "hf:MiniMaxAI/MiniMax-M2.1",
1709
+ name: "MiniMax M2.1",
1710
+ reasoning: false,
1711
+ input: ["text"],
1712
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
1713
+ contextWindow: 192000,
1714
+ maxTokens: 65536,
1715
+ },
1716
+ ],
1717
+ },
1718
+ },
1719
+ },
1720
+ }
1721
+ ```
1722
+
1723
+ Base URL should omit `/v1` (Anthropic client appends it). Shortcut: `openclaw onboard --auth-choice synthetic-api-key`.
1724
+
1725
+ </Accordion>
1726
+
1727
+ <Accordion title="MiniMax M2.1 (direct)">
1728
+
1729
+ ```json5
1730
+ {
1731
+ agents: {
1732
+ defaults: {
1733
+ model: { primary: "minimax/MiniMax-M2.1" },
1734
+ models: {
1735
+ "minimax/MiniMax-M2.1": { alias: "Minimax" },
1736
+ },
1737
+ },
1738
+ },
1739
+ models: {
1740
+ mode: "merge",
1741
+ providers: {
1742
+ minimax: {
1743
+ baseUrl: "https://api.minimax.io/anthropic",
1744
+ apiKey: "${MINIMAX_API_KEY}",
1745
+ api: "anthropic-messages",
1746
+ models: [
1747
+ {
1748
+ id: "MiniMax-M2.1",
1749
+ name: "MiniMax M2.1",
1750
+ reasoning: false,
1751
+ input: ["text"],
1752
+ cost: { input: 15, output: 60, cacheRead: 2, cacheWrite: 10 },
1753
+ contextWindow: 200000,
1754
+ maxTokens: 8192,
1755
+ },
1756
+ ],
1757
+ },
1758
+ },
1759
+ },
1760
+ }
1761
+ ```
1762
+
1763
+ Set `MINIMAX_API_KEY`. Shortcut: `openclaw onboard --auth-choice minimax-api`.
1764
+
1765
+ </Accordion>
1766
+
1767
+ <Accordion title="Local models (LM Studio)">
1768
+
1769
+ See [Local Models](/gateway/local-models). TL;DR: run MiniMax M2.1 via LM Studio Responses API on serious hardware; keep hosted models merged for fallback.
1770
+
1771
+ </Accordion>
1772
+
1773
+ ---
1774
+
1775
+ ## Skills
1776
+
1777
+ ```json5
1778
+ {
1779
+ skills: {
1780
+ allowBundled: ["gemini", "peekaboo"],
1781
+ load: {
1782
+ extraDirs: ["~/Projects/agent-scripts/skills"],
1783
+ },
1784
+ install: {
1785
+ preferBrew: true,
1786
+ nodeManager: "npm", // npm | pnpm | yarn
1787
+ },
1788
+ entries: {
1789
+ "nano-banana-pro": {
1790
+ apiKey: "GEMINI_KEY_HERE",
1791
+ env: { GEMINI_API_KEY: "GEMINI_KEY_HERE" },
1792
+ },
1793
+ peekaboo: { enabled: true },
1794
+ sag: { enabled: false },
1795
+ },
1796
+ },
1797
+ }
1798
+ ```
1799
+
1800
+ - `allowBundled`: optional allowlist for bundled skills only (managed/workspace skills unaffected).
1801
+ - `entries.<skillKey>.enabled: false` disables a skill even if bundled/installed.
1802
+ - `entries.<skillKey>.apiKey`: convenience for skills declaring a primary env var.
1803
+
1804
+ ---
1805
+
1806
+ ## Plugins
1807
+
1808
+ ```json5
1809
+ {
1810
+ plugins: {
1811
+ enabled: true,
1812
+ allow: ["voice-call"],
1813
+ deny: [],
1814
+ load: {
1815
+ paths: ["~/Projects/oss/voice-call-extension"],
1816
+ },
1817
+ entries: {
1818
+ "voice-call": {
1819
+ enabled: true,
1820
+ config: { provider: "twilio" },
1821
+ },
1822
+ },
1823
+ },
1824
+ }
1825
+ ```
1826
+
1827
+ - Loaded from `~/.openclaw/extensions`, `<workspace>/.openclaw/extensions`, plus `plugins.load.paths`.
1828
+ - **Config changes require a gateway restart.**
1829
+ - `allow`: optional allowlist (only listed plugins load). `deny` wins.
1830
+
1831
+ See [Plugins](/tools/plugin).
1832
+
1833
+ ---
1834
+
1835
+ ## Browser
1836
+
1837
+ ```json5
1838
+ {
1839
+ browser: {
1840
+ enabled: true,
1841
+ evaluateEnabled: true,
1842
+ defaultProfile: "chrome",
1843
+ profiles: {
1844
+ openclaw: { cdpPort: 18800, color: "#FF4500" },
1845
+ work: { cdpPort: 18801, color: "#0066CC" },
1846
+ remote: { cdpUrl: "http://10.0.0.42:9222", color: "#00AA00" },
1847
+ },
1848
+ color: "#FF4500",
1849
+ // headless: false,
1850
+ // noSandbox: false,
1851
+ // executablePath: "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",
1852
+ // attachOnly: false,
1853
+ },
1854
+ }
1855
+ ```
1856
+
1857
+ - `evaluateEnabled: false` disables `act:evaluate` and `wait --fn`.
1858
+ - Remote profiles are attach-only (start/stop/reset disabled).
1859
+ - Auto-detect order: default browser if Chromium-based → Chrome → Brave → Edge → Chromium → Chrome Canary.
1860
+ - Control service: loopback only (port derived from `gateway.port`, default `18791`).
1861
+
1862
+ ---
1863
+
1864
+ ## UI
1865
+
1866
+ ```json5
1867
+ {
1868
+ ui: {
1869
+ seamColor: "#FF4500",
1870
+ assistant: {
1871
+ name: "OpenClaw",
1872
+ avatar: "CB", // emoji, short text, image URL, or data URI
1873
+ },
1874
+ },
1875
+ }
1876
+ ```
1877
+
1878
+ - `seamColor`: accent color for native app UI chrome (Talk Mode bubble tint, etc.).
1879
+ - `assistant`: Control UI identity override. Falls back to active agent identity.
1880
+
1881
+ ---
1882
+
1883
+ ## Gateway
1884
+
1885
+ ```json5
1886
+ {
1887
+ gateway: {
1888
+ mode: "local", // local | remote
1889
+ port: 18789,
1890
+ bind: "loopback",
1891
+ auth: {
1892
+ mode: "token", // token | password
1893
+ token: "your-token",
1894
+ // password: "your-password", // or OPENCLAW_GATEWAY_PASSWORD
1895
+ allowTailscale: true,
1896
+ },
1897
+ tailscale: {
1898
+ mode: "off", // off | serve | funnel
1899
+ resetOnExit: false,
1900
+ },
1901
+ controlUi: {
1902
+ enabled: true,
1903
+ basePath: "/openclaw",
1904
+ // root: "dist/control-ui",
1905
+ // allowInsecureAuth: false,
1906
+ // dangerouslyDisableDeviceAuth: false,
1907
+ },
1908
+ remote: {
1909
+ url: "ws://gateway.tailnet:18789",
1910
+ transport: "ssh", // ssh | direct
1911
+ token: "your-token",
1912
+ // password: "your-password",
1913
+ },
1914
+ trustedProxies: ["10.0.0.1"],
1915
+ },
1916
+ }
1917
+ ```
1918
+
1919
+ <Accordion title="Gateway field details">
1920
+
1921
+ - `mode`: `local` (run gateway) or `remote` (connect to remote gateway). Gateway refuses to start unless `local`.
1922
+ - `port`: single multiplexed port for WS + HTTP. Precedence: `--port` > `OPENCLAW_GATEWAY_PORT` > `gateway.port` > `18789`.
1923
+ - `bind`: `auto`, `loopback` (default), `lan` (`0.0.0.0`), `tailnet` (Tailscale IP only), or `custom`.
1924
+ - **Auth**: required by default. Non-loopback binds require a shared token/password. Onboarding wizard generates a token by default.
1925
+ - `auth.allowTailscale`: when `true`, Tailscale Serve identity headers satisfy auth (verified via `tailscale whois`). Defaults to `true` when `tailscale.mode = "serve"`.
1926
+ - `tailscale.mode`: `serve` (tailnet only, loopback bind) or `funnel` (public, requires auth).
1927
+ - `remote.transport`: `ssh` (default) or `direct` (ws/wss). For `direct`, `remote.url` must be `ws://` or `wss://`.
1928
+ - `gateway.remote.token` is for remote CLI calls only; does not enable local gateway auth.
1929
+ - `trustedProxies`: reverse proxy IPs that terminate TLS. Only list proxies you control.
1930
+
1931
+ </Accordion>
1932
+
1933
+ ### OpenAI-compatible endpoints
1934
+
1935
+ - Chat Completions: disabled by default. Enable with `gateway.http.endpoints.chatCompletions.enabled: true`.
1936
+ - Responses API: `gateway.http.endpoints.responses.enabled`.
1937
+ - Responses URL-input hardening:
1938
+ - `gateway.http.endpoints.responses.maxUrlParts`
1939
+ - `gateway.http.endpoints.responses.files.urlAllowlist`
1940
+ - `gateway.http.endpoints.responses.images.urlAllowlist`
1941
+
1942
+ ### Multi-instance isolation
1943
+
1944
+ Run multiple gateways on one host with unique ports and state dirs:
1945
+
1946
+ ```bash
1947
+ OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \
1948
+ OPENCLAW_STATE_DIR=~/.openclaw-a \
1949
+ openclaw gateway --port 19001
1950
+ ```
1951
+
1952
+ Convenience flags: `--dev` (uses `~/.openclaw-dev` + port `19001`), `--profile <name>` (uses `~/.openclaw-<name>`).
1953
+
1954
+ See [Multiple Gateways](/gateway/multiple-gateways).
1955
+
1956
+ ---
1957
+
1958
+ ## Hooks
1959
+
1960
+ ```json5
1961
+ {
1962
+ hooks: {
1963
+ enabled: true,
1964
+ token: "shared-secret",
1965
+ path: "/hooks",
1966
+ maxBodyBytes: 262144,
1967
+ defaultSessionKey: "hook:ingress",
1968
+ allowRequestSessionKey: false,
1969
+ allowedSessionKeyPrefixes: ["hook:"],
1970
+ allowedAgentIds: ["hooks", "main"],
1971
+ presets: ["gmail"],
1972
+ transformsDir: "~/.openclaw/hooks",
1973
+ mappings: [
1974
+ {
1975
+ match: { path: "gmail" },
1976
+ action: "agent",
1977
+ agentId: "hooks",
1978
+ wakeMode: "now",
1979
+ name: "Gmail",
1980
+ sessionKey: "hook:gmail:{{messages[0].id}}",
1981
+ messageTemplate: "From: {{messages[0].from}}\nSubject: {{messages[0].subject}}\n{{messages[0].snippet}}",
1982
+ deliver: true,
1983
+ channel: "last",
1984
+ model: "openai/gpt-5.2-mini",
1985
+ },
1986
+ ],
1987
+ },
1988
+ }
1989
+ ```
1990
+
1991
+ Auth: `Authorization: Bearer <token>` or `x-openclaw-token: <token>`.
1992
+
1993
+ **Endpoints:**
1994
+
1995
+ - `POST /hooks/wake` → `{ text, mode?: "now"|"next-heartbeat" }`
1996
+ - `POST /hooks/agent` → `{ message, name?, agentId?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSeconds? }`
1997
+ - `sessionKey` from request payload is accepted only when `hooks.allowRequestSessionKey=true` (default: `false`).
1998
+ - `POST /hooks/<name>` → resolved via `hooks.mappings`
1999
+
2000
+ <Accordion title="Mapping details">
2001
+
2002
+ - `match.path` matches sub-path after `/hooks` (e.g. `/hooks/gmail` → `gmail`).
2003
+ - `match.source` matches a payload field for generic paths.
2004
+ - Templates like `{{messages[0].subject}}` read from the payload.
2005
+ - `transform` can point to a JS/TS module returning a hook action.
2006
+ - `agentId` routes to a specific agent; unknown IDs fall back to default.
2007
+ - `allowedAgentIds`: restricts explicit routing (`*` or omitted = allow all, `[]` = deny all).
2008
+ - `defaultSessionKey`: optional fixed session key for hook agent runs without explicit `sessionKey`.
2009
+ - `allowRequestSessionKey`: allow `/hooks/agent` callers to set `sessionKey` (default: `false`).
2010
+ - `allowedSessionKeyPrefixes`: optional prefix allowlist for explicit `sessionKey` values (request + mapping), e.g. `["hook:"]`.
2011
+ - `deliver: true` sends final reply to a channel; `channel` defaults to `last`.
2012
+ - `model` overrides LLM for this hook run (must be allowed if model catalog is set).
2013
+
2014
+ </Accordion>
2015
+
2016
+ ### Gmail integration
2017
+
2018
+ ```json5
2019
+ {
2020
+ hooks: {
2021
+ gmail: {
2022
+ account: "openclaw@gmail.com",
2023
+ topic: "projects/<project-id>/topics/gog-gmail-watch",
2024
+ subscription: "gog-gmail-watch-push",
2025
+ pushToken: "shared-push-token",
2026
+ hookUrl: "http://127.0.0.1:18789/hooks/gmail",
2027
+ includeBody: true,
2028
+ maxBytes: 20000,
2029
+ renewEveryMinutes: 720,
2030
+ serve: { bind: "127.0.0.1", port: 8788, path: "/" },
2031
+ tailscale: { mode: "funnel", path: "/gmail-pubsub" },
2032
+ model: "openrouter/meta-llama/llama-3.3-70b-instruct:free",
2033
+ thinking: "off",
2034
+ },
2035
+ },
2036
+ }
2037
+ ```
2038
+
2039
+ - Gateway auto-starts `gog gmail watch serve` on boot when configured. Set `OPENCLAW_SKIP_GMAIL_WATCHER=1` to disable.
2040
+ - Don't run a separate `gog gmail watch serve` alongside the Gateway.
2041
+
2042
+ ---
2043
+
2044
+ ## Canvas host
2045
+
2046
+ ```json5
2047
+ {
2048
+ canvasHost: {
2049
+ root: "~/.openclaw/workspace/canvas",
2050
+ port: 18793,
2051
+ liveReload: true,
2052
+ // enabled: false, // or OPENCLAW_SKIP_CANVAS_HOST=1
2053
+ },
2054
+ }
2055
+ ```
2056
+
2057
+ - Serves HTML/CSS/JS over HTTP for iOS/Android nodes.
2058
+ - Injects live-reload client into served HTML.
2059
+ - Auto-creates starter `index.html` when empty.
2060
+ - Also serves A2UI at `/__openclaw__/a2ui/`.
2061
+ - Changes require a gateway restart.
2062
+ - Disable live reload for large directories or `EMFILE` errors.
2063
+
2064
+ ---
2065
+
2066
+ ## Discovery
2067
+
2068
+ ### mDNS (Bonjour)
2069
+
2070
+ ```json5
2071
+ {
2072
+ discovery: {
2073
+ mdns: {
2074
+ mode: "minimal", // minimal | full | off
2075
+ },
2076
+ },
2077
+ }
2078
+ ```
2079
+
2080
+ - `minimal` (default): omit `cliPath` + `sshPort` from TXT records.
2081
+ - `full`: include `cliPath` + `sshPort`.
2082
+ - Hostname defaults to `openclaw`. Override with `OPENCLAW_MDNS_HOSTNAME`.
2083
+
2084
+ ### Wide-area (DNS-SD)
2085
+
2086
+ ```json5
2087
+ {
2088
+ discovery: {
2089
+ wideArea: { enabled: true },
2090
+ },
2091
+ }
2092
+ ```
2093
+
2094
+ Writes a unicast DNS-SD zone under `~/.openclaw/dns/`. For cross-network discovery, pair with a DNS server (CoreDNS recommended) + Tailscale split DNS.
2095
+
2096
+ Setup: `openclaw dns setup --apply`.
2097
+
2098
+ ---
2099
+
2100
+ ## Environment
2101
+
2102
+ ### `env` (inline env vars)
2103
+
2104
+ ```json5
2105
+ {
2106
+ env: {
2107
+ OPENROUTER_API_KEY: "sk-or-...",
2108
+ vars: {
2109
+ GROQ_API_KEY: "gsk-...",
2110
+ },
2111
+ shellEnv: {
2112
+ enabled: true,
2113
+ timeoutMs: 15000,
2114
+ },
2115
+ },
2116
+ }
2117
+ ```
2118
+
2119
+ - Inline env vars are only applied if the process env is missing the key.
2120
+ - `.env` files: CWD `.env` + `~/.openclaw/.env` (neither overrides existing vars).
2121
+ - `shellEnv`: imports missing expected keys from your login shell profile.
2122
+ - See [Environment](/help/environment) for full precedence.
2123
+
2124
+ ### Env var substitution
2125
+
2126
+ Reference env vars in any config string with `${VAR_NAME}`:
2127
+
2128
+ ```json5
2129
+ {
2130
+ gateway: {
2131
+ auth: { token: "${OPENCLAW_GATEWAY_TOKEN}" },
2132
+ },
2133
+ }
2134
+ ```
2135
+
2136
+ - Only uppercase names matched: `[A-Z_][A-Z0-9_]*`.
2137
+ - Missing/empty vars throw an error at config load.
2138
+ - Escape with `$${VAR}` for a literal `${VAR}`.
2139
+ - Works with `$include`.
2140
+
2141
+ ---
2142
+
2143
+ ## Auth storage
2144
+
2145
+ ```json5
2146
+ {
2147
+ auth: {
2148
+ profiles: {
2149
+ "anthropic:me@example.com": { provider: "anthropic", mode: "oauth", email: "me@example.com" },
2150
+ "anthropic:work": { provider: "anthropic", mode: "api_key" },
2151
+ },
2152
+ order: {
2153
+ anthropic: ["anthropic:me@example.com", "anthropic:work"],
2154
+ },
2155
+ },
2156
+ }
2157
+ ```
2158
+
2159
+ - Per-agent auth profiles stored at `<agentDir>/auth-profiles.json`.
2160
+ - Legacy OAuth imports from `~/.openclaw/credentials/oauth.json`.
2161
+ - See [OAuth](/concepts/oauth).
2162
+
2163
+ ---
2164
+
2165
+ ## Logging
2166
+
2167
+ ```json5
2168
+ {
2169
+ logging: {
2170
+ level: "info",
2171
+ file: "/tmp/openclaw/openclaw.log",
2172
+ consoleLevel: "info",
2173
+ consoleStyle: "pretty", // pretty | compact | json
2174
+ redactSensitive: "tools", // off | tools
2175
+ redactPatterns: ["\\bTOKEN\\b\\s*[=:]\\s*([\"']?)([^\\s\"']+)\\1"],
2176
+ },
2177
+ }
2178
+ ```
2179
+
2180
+ - Default log file: `/tmp/openclaw/openclaw-YYYY-MM-DD.log`.
2181
+ - Set `logging.file` for a stable path.
2182
+ - `consoleLevel` bumps to `debug` when `--verbose`.
2183
+
2184
+ ---
2185
+
2186
+ ## Wizard
2187
+
2188
+ Metadata written by CLI wizards (`onboard`, `configure`, `doctor`):
2189
+
2190
+ ```json5
2191
+ {
2192
+ wizard: {
2193
+ lastRunAt: "2026-01-01T00:00:00.000Z",
2194
+ lastRunVersion: "2026.1.4",
2195
+ lastRunCommit: "abc1234",
2196
+ lastRunCommand: "configure",
2197
+ lastRunMode: "local",
2198
+ },
2199
+ }
2200
+ ```
2201
+
2202
+ ---
2203
+
2204
+ ## Identity
2205
+
2206
+ ```json5
2207
+ {
2208
+ agents: {
2209
+ list: [
2210
+ {
2211
+ id: "main",
2212
+ identity: {
2213
+ name: "Samantha",
2214
+ theme: "helpful sloth",
2215
+ emoji: "🦥",
2216
+ avatar: "avatars/samantha.png",
2217
+ },
2218
+ },
2219
+ ],
2220
+ },
2221
+ }
2222
+ ```
2223
+
2224
+ Written by the macOS onboarding assistant. Derives defaults:
2225
+
2226
+ - `messages.ackReaction` from `identity.emoji` (falls back to 👀)
2227
+ - `mentionPatterns` from `identity.name`/`identity.emoji`
2228
+ - `avatar` accepts: workspace-relative path, `http(s)` URL, or `data:` URI
2229
+
2230
+ ---
2231
+
2232
+ ## Bridge (legacy, removed)
2233
+
2234
+ Current builds no longer include the TCP bridge. Nodes connect over the Gateway WebSocket. `bridge.*` keys are no longer part of the config schema (validation fails until removed; `openclaw doctor --fix` can strip unknown keys).
2235
+
2236
+ <Accordion title="Legacy bridge config (historical reference)">
2237
+
2238
+ ```json
2239
+ {
2240
+ "bridge": {
2241
+ "enabled": true,
2242
+ "port": 18790,
2243
+ "bind": "tailnet",
2244
+ "tls": {
2245
+ "enabled": true,
2246
+ "autoGenerate": true
2247
+ }
2248
+ }
2249
+ }
2250
+ ```
2251
+
2252
+ </Accordion>
2253
+
2254
+ ---
2255
+
2256
+ ## Cron
2257
+
2258
+ ```json5
2259
+ {
2260
+ cron: {
2261
+ enabled: true,
2262
+ maxConcurrentRuns: 2,
2263
+ sessionRetention: "24h", // duration string or false
2264
+ },
2265
+ }
2266
+ ```
2267
+
2268
+ - `sessionRetention`: how long to keep completed cron sessions before pruning. Default: `24h`.
2269
+
2270
+ See [Cron Jobs](/automation/cron-jobs).
2271
+
2272
+ ---
2273
+
2274
+ ## Media model template variables
2275
+
2276
+ Template placeholders expanded in `tools.media.*.models[].args`:
2277
+
2278
+ | Variable | Description |
2279
+ | ------------------ | ------------------------------------------------- |
2280
+ | `{{Body}}` | Full inbound message body |
2281
+ | `{{RawBody}}` | Raw body (no history/sender wrappers) |
2282
+ | `{{BodyStripped}}` | Body with group mentions stripped |
2283
+ | `{{From}}` | Sender identifier |
2284
+ | `{{To}}` | Destination identifier |
2285
+ | `{{MessageSid}}` | Channel message id |
2286
+ | `{{SessionId}}` | Current session UUID |
2287
+ | `{{IsNewSession}}` | `"true"` when new session created |
2288
+ | `{{MediaUrl}}` | Inbound media pseudo-URL |
2289
+ | `{{MediaPath}}` | Local media path |
2290
+ | `{{MediaType}}` | Media type (image/audio/document/…) |
2291
+ | `{{Transcript}}` | Audio transcript |
2292
+ | `{{Prompt}}` | Resolved media prompt for CLI entries |
2293
+ | `{{MaxChars}}` | Resolved max output chars for CLI entries |
2294
+ | `{{ChatType}}` | `"direct"` or `"group"` |
2295
+ | `{{GroupSubject}}` | Group subject (best effort) |
2296
+ | `{{GroupMembers}}` | Group members preview (best effort) |
2297
+ | `{{SenderName}}` | Sender display name (best effort) |
2298
+ | `{{SenderE164}}` | Sender phone number (best effort) |
2299
+ | `{{Provider}}` | Provider hint (whatsapp, telegram, discord, etc.) |
2300
+
2301
+ ---
2302
+
2303
+ ## Config includes (`$include`)
2304
+
2305
+ Split config into multiple files:
2306
+
2307
+ ```json5
2308
+ // ~/.openclaw/openclaw.json
2309
+ {
2310
+ gateway: { port: 18789 },
2311
+ agents: { $include: "./agents.json5" },
2312
+ broadcast: {
2313
+ $include: ["./clients/mueller.json5", "./clients/schmidt.json5"],
2314
+ },
2315
+ }
2316
+ ```
2317
+
2318
+ **Merge behavior:**
2319
+
2320
+ - Single file: replaces the containing object.
2321
+ - Array of files: deep-merged in order (later overrides earlier).
2322
+ - Sibling keys: merged after includes (override included values).
2323
+ - Nested includes: up to 10 levels deep.
2324
+ - Paths: relative (to the including file), absolute, or `../` parent references.
2325
+ - Errors: clear messages for missing files, parse errors, and circular includes.
2326
+
2327
+ ---
2328
+
2329
+ _Related: [Configuration](/gateway/configuration) · [Configuration Examples](/gateway/configuration-examples) · [Doctor](/gateway/doctor)_