activeclaw 2026.2.12 → 2026.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (364) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/{accounts-DbzMEfKN.js → accounts-DCDeFTra.js} +2 -2
  3. package/dist/{accounts-DimKrt7j.js → accounts-DeqIQjo1.js} +2 -2
  4. package/dist/{acp-cli-Cs1ai4XO.js → acp-cli-CeYI4XRd.js} +15 -16
  5. package/dist/{acp-cli-oV2dodPg.js → acp-cli-rNbGXICg.js} +14 -15
  6. package/dist/{agent-BndgzkUe.js → agent-BvNJF5QL.js} +19 -16
  7. package/dist/{agent-DZvDwqnd.js → agent-CyMxTyrG.js} +20 -17
  8. package/dist/{agent-scope-rXQ7WARN.js → agent-scope-BIEhVP4_.js} +1 -1
  9. package/dist/{agent-scope---6LLHj0.js → agent-scope-CQCus0rI.js} +2 -2
  10. package/dist/{agent-scope-RCSw6gHy.js → agent-scope-CsRbLH4l.js} +3 -3
  11. package/dist/{agent-scope-CN8DM4Xb.js → agent-scope-DPIFau3f.js} +1 -1
  12. package/dist/{audio-preflight-SZRntkxo.js → audio-preflight-BU8W7uxc.js} +10 -10
  13. package/dist/{audio-preflight-ClVNINDs.js → audio-preflight-CGsumMzb.js} +10 -10
  14. package/dist/{audio-preflight-txAP3v-C.js → audio-preflight-SLmkJI6-.js} +22 -22
  15. package/dist/{audio-preflight-BP6s-UPp.js → audio-preflight-jZc5mFCZ.js} +23 -23
  16. package/dist/{audit-CQzrm61N.js → audit-Dmww_503.js} +70 -18
  17. package/dist/{audit-DMH3CSXY.js → audit-wPu26VMb.js} +72 -20
  18. package/dist/{tailscale-DU6DgqVy.js → auth-9x3lqfIY.js} +208 -3
  19. package/dist/{tailscale-DHfcfRCx.js → auth-CQNl_IaI.js} +190 -3
  20. package/dist/{auth-health-BB3e3OmN.js → auth-health-C4L4FGBA.js} +1 -1
  21. package/dist/{auth-health-zZ9dnQGC.js → auth-health-j6epgQbq.js} +1 -1
  22. package/dist/{auth-profiles-CcJ3hrog.js → auth-profiles-ByNs3eEm.js} +60 -22
  23. package/dist/build-info.json +3 -3
  24. package/dist/bundled/boot-md/handler.js +19 -16
  25. package/dist/bundled/session-memory/handler.js +16 -15
  26. package/dist/{call-Yxns4CVq.js → call-DVYCIV8m.js} +5 -5
  27. package/dist/{call-C9az806y.js → call-SolyGS1r.js} +4 -4
  28. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  29. package/dist/{channel-options-CjXPwMWu.js → channel-options-BwC2yQcR.js} +4 -4
  30. package/dist/{channel-options-CX4iYQfR.js → channel-options-Cq9BVDkP.js} +7 -7
  31. package/dist/{channel-selection-BoQ7GurB.js → channel-selection-D4D6ImhN.js} +2 -2
  32. package/dist/{channel-selection-C78IwbD-.js → channel-selection-MZAHm4U8.js} +2 -2
  33. package/dist/{channels-cli-DUHsmX3q.js → channels-cli-9Dsk9Qm7.js} +53 -51
  34. package/dist/{channels-cli-BXMQPB4x.js → channels-cli-BJUppQll.js} +52 -50
  35. package/dist/{channels-status-issues-Ca9--azp.js → channels-status-issues-D7GSV1GS.js} +1 -1
  36. package/dist/{channels-status-issues-CbULFg2X.js → channels-status-issues-DDAWeT-6.js} +1 -1
  37. package/dist/{chrome-svgmQ8T_.js → chrome-BfB6JdKF.js} +2 -1
  38. package/dist/{chrome-juQxt0zf.js → chrome-Cvr-57lg.js} +4 -3
  39. package/dist/{chrome-BCPPeLQ6.js → chrome-DL0avO8n.js} +2 -1
  40. package/dist/{chrome-yIKmOzCO.js → chrome-foEwx3lN.js} +5 -4
  41. package/dist/{clack-prompter-Dmvcu3gn.js → clack-prompter-Bz3Mmcl-.js} +5 -5
  42. package/dist/{clack-prompter-DuBVnTKy.js → clack-prompter-ChCGXfyt.js} +4 -4
  43. package/dist/cli/daemon-cli.js +1 -1
  44. package/dist/{cli-FdxAcu_y.js → cli-ZR9ugUBX.js} +42 -40
  45. package/dist/{cli-By331Q9f.js → cli-miPe4Ujz.js} +42 -40
  46. package/dist/{client-B0_GiCjB.js → client-BrYfyoDK.js} +52 -3
  47. package/dist/{client-D7wrC1Ug.js → client-CTwXnRl7.js} +53 -4
  48. package/dist/{command-format-ayFsmwwz.js → command-format-Bxe0mWee.js} +1 -1
  49. package/dist/{command-options-BSDiKuyX.js → command-options-BvgxzPbK.js} +4 -4
  50. package/dist/{commands-BG25qku5.js → commands-BX_OIIVR.js} +4 -4
  51. package/dist/{completion-cli-C4zxjkC1.js → completion-cli-CR77-jyv.js} +3 -3
  52. package/dist/{completion-cli-DECEgBWR.js → completion-cli-DnjpxAag.js} +29 -29
  53. package/dist/{config-B7sno9eI.js → config-Bdhomfei.js} +15 -6
  54. package/dist/{config-BuF7vm-v.js → config-BvMsmctM.js} +13 -4
  55. package/dist/{config-D50SQVar.js → config-QYrbd7x7.js} +13 -4
  56. package/dist/{config-DH9TLUNc.js → config-aFQssWKX.js} +15 -6
  57. package/dist/{config-guard-DPxxY1iw.js → config-guard-CljaSxJd.js} +39 -39
  58. package/dist/{configure-BZQ9uSVX.js → configure-BXLiucXo.js} +19 -19
  59. package/dist/{configure-Cg5IKSUy.js → configure-BYPqXzGZ.js} +19 -19
  60. package/dist/control-auth-8Cf4WXpR.js +54 -0
  61. package/dist/control-auth-DBCu3qyv.js +54 -0
  62. package/dist/{control-service-CBlMVTRu.js → control-service-B5KnPqGP.js} +11 -5
  63. package/dist/{control-service-B2er20Ke.js → control-service-DKnttEus.js} +10 -4
  64. package/dist/{cron-cli-B2Zwhy_r.js → cron-cli-D7BRjDv2.js} +17 -17
  65. package/dist/{cron-cli-EaRUVd0p.js → cron-cli-z1zk_FXQ.js} +16 -16
  66. package/dist/{daemon-cli-CVNzObIF.js → daemon-cli-BDkU2ocb.js} +18 -18
  67. package/dist/{daemon-cli-DF6Rxjy6.js → daemon-cli-cNSF93-v.js} +19 -19
  68. package/dist/{daemon-runtime-BHF5NjQ7.js → daemon-runtime-B0tg_LsX.js} +2 -2
  69. package/dist/{daemon-runtime-B05PME1z.js → daemon-runtime-Bsjeut6m.js} +3 -3
  70. package/dist/{deliver-DzcxEcza.js → deliver-CIU9Npgs.js} +306 -12
  71. package/dist/{deliver-COf5XFo_.js → deliver-DYYCo1G7.js} +302 -8
  72. package/dist/{deliver-B1jsU2r7.js → deliver-LsxKETro.js} +306 -12
  73. package/dist/{deliver-CLwC284e.js → deliver-xUU3mGHo.js} +302 -8
  74. package/dist/{deps-Cva7QM_t.js → deps-QSwGcoNZ.js} +2 -2
  75. package/dist/{deps-B6602Wid.js → deps-lAAA2zYI.js} +2 -2
  76. package/dist/{devices-cli-DPg_4aW8.js → devices-cli-BG3-2oqt.js} +13 -13
  77. package/dist/{devices-cli-D8K3hZR5.js → devices-cli-VIQtOvt_.js} +13 -13
  78. package/dist/{directory-cli-OGBSVKAZ.js → directory-cli-BCJwjVC0.js} +15 -15
  79. package/dist/{directory-cli-Bn47fFX7.js → directory-cli-jYzZ02gk.js} +14 -14
  80. package/dist/{dispatcher-BHsNwFe-.js → dispatcher-DY51b-Zc.js} +2 -2
  81. package/dist/{dns-cli-DmTHXgwU.js → dns-cli-DHIiMJjS.js} +11 -11
  82. package/dist/{dns-cli-kk2rysJh.js → dns-cli-pZlv87Ib.js} +11 -11
  83. package/dist/{docs-cli-CB77CeM4.js → docs-cli-2JDiwfzP.js} +7 -7
  84. package/dist/{docs-cli-DUcyw0X0.js → docs-cli-BhkYqoIQ.js} +6 -6
  85. package/dist/{doctor-DwqdkfPa.js → doctor-Bf8EhNtA.js} +33 -33
  86. package/dist/{doctor-BZfxDGUg.js → doctor-sYG5V4Co.js} +32 -32
  87. package/dist/entry.js +36 -14
  88. package/dist/{env-DE9xvYOL.js → env-ONzUVAG2.js} +1 -1
  89. package/dist/{exec-4WHuOniw.js → exec-B8lXct-k.js} +31 -13
  90. package/dist/{exec-B8JKbXKW.js → exec-CACT5OAW.js} +1 -1
  91. package/dist/{exec-D12IZYtJ.js → exec-CJFFoM7H.js} +31 -13
  92. package/dist/{exec-DXtR2fhb.js → exec-YIosokWE.js} +1 -1
  93. package/dist/{exec-approvals-cli-GizapOX5.js → exec-approvals-cli-7LH0lwhO.js} +19 -19
  94. package/dist/{exec-approvals-cli-BWO0Rs-a.js → exec-approvals-cli-apGnQbpj.js} +19 -19
  95. package/dist/extensionAPI.js +1108 -661
  96. package/dist/{fetch-CqZP8jwB.js → fetch-DmiOpALK.js} +5 -3
  97. package/dist/{fetch-timeout-B2KlHXi3.js → fetch-timeout-BEtUjM1S.js} +5 -3
  98. package/dist/{fetch-timeout-ohY5QmsW.js → fetch-timeout-DEoXG_SF.js} +5 -3
  99. package/dist/{fetch-timeout-4UKsdtE1.js → fetch-timeout-DTK9vxex.js} +5 -3
  100. package/dist/{gateway-cli-Bbd1Xbsc.js → gateway-cli-DUdYxlZS.js} +315 -103
  101. package/dist/{gateway-cli-PR1S0BTe.js → gateway-cli-DbvWmE-9.js} +314 -102
  102. package/dist/{gateway-rpc-8gue7Qjt.js → gateway-rpc-BByb2Snz.js} +3 -3
  103. package/dist/{gateway-rpc-DjuxyOm-.js → gateway-rpc-wXSCUZXj.js} +3 -3
  104. package/dist/{github-copilot-auth-B3chCDfc.js → github-copilot-auth-D7ewvpMd.js} +16 -8
  105. package/dist/{github-copilot-auth-Cm2SB8Qf.js → github-copilot-auth-DDispnyz.js} +16 -8
  106. package/dist/{github-copilot-token-SLWintYd.js → github-copilot-token-Cfs0Wxr8.js} +1 -1
  107. package/dist/{gmail-setup-utils-Cgh0ptgA.js → gmail-setup-utils-Cfns8TQx.js} +3 -3
  108. package/dist/{gmail-setup-utils-WDyf1gTU.js → gmail-setup-utils-DJb-_5kO.js} +4 -4
  109. package/dist/{health-format-C0C_Apce.js → health-format-KGPokKJH.js} +68 -28
  110. package/dist/{health-format-gLMfE2wf.js → health-format-LZDxu3rv.js} +67 -27
  111. package/dist/{help-format-5iAL_46a.js → help-format-C48TXngO.js} +1 -1
  112. package/dist/{help-format-DUy1KRxq.js → help-format-R5fLToDw.js} +1 -1
  113. package/dist/{hooks-cli-CEN1h1ya.js → hooks-cli-CT8JCRkH.js} +46 -44
  114. package/dist/{hooks-cli-DrchIqSi.js → hooks-cli-S1MKumJO.js} +47 -45
  115. package/dist/{hooks-status-Cgy6AtQk.js → hooks-status-Cw0xD8Lt.js} +3 -3
  116. package/dist/{hooks-status--xVLpAXz.js → hooks-status-D9MhwHRp.js} +3 -3
  117. package/dist/{image-Dkawt9Kg.js → image-Brk1sJbw.js} +4 -4
  118. package/dist/{image-DI9s9eEx.js → image-C4Nn2p3e.js} +5 -5
  119. package/dist/{image-LxFvu0wL.js → image-DgtfXMcX.js} +5 -5
  120. package/dist/{image-B4mDPdyz.js → image-RKwc3fsL.js} +4 -4
  121. package/dist/index.js +83 -83
  122. package/dist/{installs-NS0VMPN7.js → installs-CrLcWYHe.js} +4 -4
  123. package/dist/{installs-DA-eSN1B.js → installs-DscWb9b9.js} +5 -5
  124. package/dist/{links-CV4oki2u.js → links-B8LAzWwg.js} +1 -1
  125. package/dist/{links-7M-j83As.js → links-Eax1UO3w.js} +1 -1
  126. package/dist/llm-slug-generator.js +15 -15
  127. package/dist/{loader-Caow9TPA.js → loader-KjT074JR.js} +1105 -762
  128. package/dist/{logging-CeHn2itV.js → logging-BAyPwvdH.js} +1 -1
  129. package/dist/{logging-D0MyqUlV.js → logging-CRq4h04P.js} +2 -2
  130. package/dist/{login-qr-Xx8yJrSc.js → login-qr-B6ZgAuIf.js} +5 -5
  131. package/dist/{login-qr-CoskdtvN.js → login-qr-Bua-p0nG.js} +2 -2
  132. package/dist/{login-qr-CAk9D-FM.js → login-qr-CuvemJj4.js} +6 -6
  133. package/dist/{login-qr-kUyMWXV1.js → login-qr-Djr1JfIf.js} +2 -2
  134. package/dist/{logs-cli-B476pzJS.js → logs-cli-9IAV7rWY.js} +15 -15
  135. package/dist/{logs-cli-BQRUI_PO.js → logs-cli-EiKzUFPa.js} +14 -14
  136. package/dist/{manager-CBApH7eR.js → manager-BIMh_eSm.js} +5 -5
  137. package/dist/{manager-CyJH6WMg.js → manager-CwinWQoz.js} +5 -5
  138. package/dist/{manager-DScY_ZTT.js → manager-DkqF1GiK.js} +7 -7
  139. package/dist/{manager-DseK7RWj.js → manager-T1XfGchB.js} +8 -8
  140. package/dist/{manifest-registry-DFckk-L8.js → manifest-registry-CQhdnDBZ.js} +2 -2
  141. package/dist/{manifest-registry-BTgLN_W2.js → manifest-registry-u0okVSkU.js} +2 -2
  142. package/dist/{message-channel-0717wOz-.js → message-channel-BLi2a6Yw.js} +1 -1
  143. package/dist/{message-channel-BlgPSDAh.js → message-channel-C_MmebBt.js} +1 -1
  144. package/dist/{model-auth-CbqRVYRp.js → model-auth-CabXIF6O.js} +57 -19
  145. package/dist/{model-selection-unMJyUIE.js → model-selection-BLuqsGVB.js} +59 -21
  146. package/dist/{model-selection-B9Y7dKQd.js → model-selection-C1GmkTAV.js} +57 -19
  147. package/dist/{models-cli-B1cLGcRz.js → models-cli-9jmDv-h3.js} +50 -48
  148. package/dist/{models-cli-D7sChCi6.js → models-cli-zS9rtWz8.js} +48 -46
  149. package/dist/{node-cli-ic2C1xs2.js → node-cli-CrpTxTTs.js} +26 -24
  150. package/dist/{node-cli-CS3KwBh1.js → node-cli-wemUMCg-.js} +25 -23
  151. package/dist/{node-service-D_Cdq1JI.js → node-service-C8DTHTMg.js} +2 -2
  152. package/dist/{node-service-_vgO5xR-.js → node-service-WQuEKz6W.js} +1 -1
  153. package/dist/{nodes-cli-CipcvVMc.js → nodes-cli-BaU2SIFw.js} +16 -16
  154. package/dist/{nodes-cli-B1meaW7S.js → nodes-cli-Dx23D72n.js} +16 -16
  155. package/dist/{nodes-screen-N-4_0VIu.js → nodes-screen-C0IuBqUL.js} +1 -1
  156. package/dist/{note-CAM9PbSJ.js → note-BhRSeNeu.js} +2 -2
  157. package/dist/{note-Ci08TSbV.js → note-hhtubr2j.js} +1 -1
  158. package/dist/{onboard-channels-DMcOT0dj.js → onboard-channels-C501x8GI.js} +8 -8
  159. package/dist/{onboard-channels-CsT3E4bT.js → onboard-channels-Dxzroasd.js} +8 -8
  160. package/dist/{onboard-skills-DoxkpnEU.js → onboard-skills-DV0Qzvjj.js} +19 -19
  161. package/dist/{onboard-skills-D-BrCoRN.js → onboard-skills-rlBHcu3Q.js} +18 -18
  162. package/dist/{onboarding-B92952fz.js → onboarding-CN-EDLjd.js} +34 -34
  163. package/dist/{pairing-cli-BDUJ5VoX.js → pairing-cli-CDHG4xuI.js} +15 -15
  164. package/dist/{pairing-cli-0wbU1u8d.js → pairing-cli-CQP34Dlx.js} +14 -14
  165. package/dist/{pairing-labels-3o3QO3Qn.js → pairing-labels-B6CN0SNH.js} +1 -1
  166. package/dist/{pairing-labels-Bin1K7_f.js → pairing-labels-CgNHnjzT.js} +1 -1
  167. package/dist/{pairing-store-CL4rJ7m7.js → pairing-store-CmlRVqOz.js} +2 -2
  168. package/dist/{pairing-store-fIWI3pXG.js → pairing-store-Dp5_JGnG.js} +3 -3
  169. package/dist/{path-env-CXWUFfFv.js → path-env-CLvYNwtL.js} +1 -1
  170. package/dist/{path-env-C5FR_Eay.js → path-env-CaYUVIML.js} +2 -2
  171. package/dist/{paths-DwKNqk_S.js → paths-B0a4ywSO.js} +30 -5
  172. package/dist/{paths-RITJT4UY.js → paths-B49s6UZQ.js} +30 -5
  173. package/dist/{paths-CB2fqqbX.js → paths-D0O87MfH.js} +30 -5
  174. package/dist/{paths-IivnSNkP.js → paths-DLINmNFQ.js} +31 -6
  175. package/dist/{pi-embedded-DhYItk8O.js → pi-embedded-Ctrt2kz0.js} +1109 -662
  176. package/dist/{pi-embedded-helpers-CmftU5Zj.js → pi-embedded-helpers-CMKLjW6X.js} +8 -5
  177. package/dist/{pi-embedded-helpers-CfXnSIFx.js → pi-embedded-helpers-CUzTc1v6.js} +170 -19
  178. package/dist/{pi-embedded-helpers-Uan-3N1T.js → pi-embedded-helpers-DfwkwPYD.js} +7 -4
  179. package/dist/{pi-embedded-helpers-Bri9tk9g.js → pi-embedded-helpers-WDwx99UA.js} +170 -19
  180. package/dist/{pi-tools.policy-CJFi1sny.js → pi-tools.policy-BpsROZbz.js} +4 -4
  181. package/dist/{plugin-auto-enable-BY4CqJbD.js → plugin-auto-enable-Bqhc3w5n.js} +5 -5
  182. package/dist/{plugin-auto-enable-DbQrtQjL.js → plugin-auto-enable-PW76g_PJ.js} +5 -5
  183. package/dist/plugin-sdk/agents/pi-embedded-runner/run/params.d.ts +2 -0
  184. package/dist/plugin-sdk/agents/pi-embedded-runner/run/types.d.ts +2 -0
  185. package/dist/plugin-sdk/agents/pi-embedded-runner/types.d.ts +15 -0
  186. package/dist/plugin-sdk/agents/pi-embedded-subscribe.handlers.tools.d.ts +1 -1
  187. package/dist/plugin-sdk/agents/pi-embedded-subscribe.handlers.types.d.ts +2 -0
  188. package/dist/plugin-sdk/agents/pi-embedded-subscribe.types.d.ts +2 -0
  189. package/dist/plugin-sdk/agents/session-tool-result-guard-wrapper.d.ts +2 -0
  190. package/dist/plugin-sdk/agents/session-tool-result-guard.d.ts +4 -0
  191. package/dist/plugin-sdk/agents/tools/agent-step.d.ts +3 -0
  192. package/dist/plugin-sdk/agents/usage.d.ts +1 -0
  193. package/dist/plugin-sdk/auto-reply/reply/reply-reference.d.ts +1 -1
  194. package/dist/plugin-sdk/auto-reply/reply/session-run-accounting.d.ts +11 -0
  195. package/dist/plugin-sdk/auto-reply/reply/session-usage.d.ts +8 -0
  196. package/dist/plugin-sdk/browser/control-auth.d.ts +13 -0
  197. package/dist/plugin-sdk/channels/plugins/onboarding/signal.d.ts +1 -0
  198. package/dist/plugin-sdk/cli/prompt.d.ts +1 -0
  199. package/dist/plugin-sdk/commands/agent/types.d.ts +2 -0
  200. package/dist/plugin-sdk/config/sessions/paths.d.ts +7 -2
  201. package/dist/plugin-sdk/config/types.agents.d.ts +2 -0
  202. package/dist/plugin-sdk/config/types.discord.d.ts +5 -0
  203. package/dist/plugin-sdk/config/types.gateway.d.ts +15 -0
  204. package/dist/plugin-sdk/config/types.hooks.d.ts +15 -0
  205. package/dist/plugin-sdk/config/zod-schema.agents.d.ts +1 -0
  206. package/dist/plugin-sdk/config/zod-schema.d.ts +11 -0
  207. package/dist/plugin-sdk/config/zod-schema.providers-core.d.ts +9 -0
  208. package/dist/plugin-sdk/config/zod-schema.providers.d.ts +4 -0
  209. package/dist/plugin-sdk/discord/monitor/allow-list.d.ts +15 -0
  210. package/dist/plugin-sdk/discord/send.types.d.ts +3 -0
  211. package/dist/plugin-sdk/gateway/auth.d.ts +36 -0
  212. package/dist/plugin-sdk/gateway/protocol/schema/agent.d.ts +6 -0
  213. package/dist/plugin-sdk/gateway/session-utils.fs.d.ts +3 -1
  214. package/dist/plugin-sdk/index.js +295 -99
  215. package/dist/plugin-sdk/infra/binaries.d.ts +3 -0
  216. package/dist/plugin-sdk/infra/heartbeat-runner.d.ts +1 -0
  217. package/dist/plugin-sdk/infra/net/fetch-guard.d.ts +1 -0
  218. package/dist/plugin-sdk/infra/net/ssrf.d.ts +1 -0
  219. package/dist/plugin-sdk/infra/tailscale.d.ts +34 -0
  220. package/dist/plugin-sdk/infra/tmp-openclaw-dir.d.ts +10 -0
  221. package/dist/plugin-sdk/logging/logger.d.ts +1 -1
  222. package/dist/plugin-sdk/media/input-files.d.ts +5 -0
  223. package/dist/plugin-sdk/routing/resolve-route.d.ts +3 -1
  224. package/dist/plugin-sdk/security/external-content.d.ts +1 -1
  225. package/dist/plugin-sdk/security/secret-equal.d.ts +1 -0
  226. package/dist/plugin-sdk/sessions/input-provenance.d.ts +16 -0
  227. package/dist/plugin-sdk/signal/monitor/event-handler.types.d.ts +8 -0
  228. package/dist/plugin-sdk/signal/monitor/mentions.d.ts +2 -0
  229. package/dist/{plugins-3GyCj5KL.js → plugins-4Hqd1WGf.js} +3 -3
  230. package/dist/{plugins-BL9lIXSA.js → plugins-X7d_tfTE.js} +4 -4
  231. package/dist/{plugins-cli-Ce7VsvZh.js → plugins-cli-Bgku3EGj.js} +253 -46
  232. package/dist/{plugins-cli-e9gUebMd.js → plugins-cli-CVToH3if.js} +254 -47
  233. package/dist/{ports-DupIRXQ0.js → ports-qkt29rdC.js} +2 -2
  234. package/dist/{program-u22vbFpH.js → program-Cf7lkBur.js} +82 -82
  235. package/dist/{progress-g9R--HZD.js → progress-C9kngsTD.js} +1 -1
  236. package/dist/{progress-Da1ehW-x.js → progress-DWqhRakV.js} +1 -1
  237. package/dist/{prompt-style-Dc0C5HC9.js → prompt-style-BFH5D5LN.js} +1 -1
  238. package/dist/{prompt-style-lmJDcgtA.js → prompt-style-CIbmaxSa.js} +1 -1
  239. package/dist/{pw-ai-C43wv1ZF.js → pw-ai-8mdv3h-d.js} +7 -6
  240. package/dist/{pw-ai-DTZVjndL.js → pw-ai-CM1IsSgZ.js} +5 -5
  241. package/dist/{pw-ai-zVebjrSG.js → pw-ai-FGoRVblI.js} +3 -3
  242. package/dist/{pw-ai-CWrnJ98b.js → pw-ai-sS1fRKW_.js} +3 -3
  243. package/dist/{qmd-manager-NPD5Yh_4.js → qmd-manager-C67Fc8aN.js} +4 -4
  244. package/dist/{qmd-manager-ozZ933qc.js → qmd-manager-CXVbfg99.js} +7 -7
  245. package/dist/{qmd-manager-DBCZ1sio.js → qmd-manager-RMRE8Tqt.js} +6 -6
  246. package/dist/{qmd-manager-a9Bt0405.js → qmd-manager-pyc_MTIe.js} +4 -4
  247. package/dist/{register.subclis-BpX3ulH1.js → register.subclis-C02e4zuJ.js} +28 -28
  248. package/dist/{reply-m467_fOC.js → reply-DICXkh_C.js} +911 -568
  249. package/dist/{routes-82Ywfho6.js → routes-CmOI1hIH.js} +29 -11
  250. package/dist/{routes-BqxA3ZYr.js → routes-DewK5tq2.js} +29 -12
  251. package/dist/{rpc-DcGBG-Fp.js → rpc-DHr30euf.js} +3 -3
  252. package/dist/{rpc-CfdBHlnp.js → rpc-T300F8zI.js} +3 -3
  253. package/dist/{run-main-aolvSfj3.js → run-main-C5wpthq1.js} +84 -84
  254. package/dist/{runner-C1G8RFWl.js → runner-CY0nmVme.js} +9 -9
  255. package/dist/{runner-BCBs8JKA.js → runner-Cfm5nTMc.js} +6 -6
  256. package/dist/{runner-CInKPsiP.js → runner-D_dujMod.js} +8 -8
  257. package/dist/{runner-Cwfn-VOM.js → runner-DrGYLH5K.js} +6 -6
  258. package/dist/{sandbox-B0K9e6Fw.js → sandbox-BKYnhYQH.js} +23 -15
  259. package/dist/{sandbox-BW8Xnkw1.js → sandbox-Bhjnh1Xg.js} +21 -13
  260. package/dist/{sandbox-cli-mKCs2J0i.js → sandbox-cli-DBsAjZJN.js} +20 -20
  261. package/dist/{sandbox-cli-BD5LkZ0B.js → sandbox-cli-rV9LtFeu.js} +19 -19
  262. package/dist/{security-cli-kgI4soGy.js → security-cli-BIwJM_rs.js} +27 -27
  263. package/dist/{security-cli-kz8TiyqU.js → security-cli-BRjny8Yu.js} +26 -26
  264. package/dist/{server-context-fX4xiYRh.js → server-context-BGpGs3qd.js} +7 -7
  265. package/dist/{server-context-Lb-eUZG_.js → server-context-Cl0U0vE3.js} +5 -5
  266. package/dist/{server-node-events-Dx18uVrH.js → server-node-events-CBfTbiTA.js} +45 -43
  267. package/dist/{server-node-events-KqZMN30F.js → server-node-events-QCvh8EgI.js} +45 -43
  268. package/dist/{service-DZMXgMra.js → service--nPk7DvT.js} +3 -3
  269. package/dist/{service-DNcIZ5Kp.js → service-99RDXwX4.js} +2 -2
  270. package/dist/{service-audit-0WLGnoNT.js → service-audit-DnLmRGQt.js} +4 -4
  271. package/dist/{service-audit-uhZSlxeb.js → service-audit-ckBaRCVC.js} +3 -3
  272. package/dist/{session-cost-usage-HU4OeRgw.js → session-cost-usage-D7HuoSSD.js} +10 -8
  273. package/dist/{session-cost-usage-CL8gnHRN.js → session-cost-usage-D9hHANWI.js} +10 -8
  274. package/dist/{shared-j4Qtr475.js → shared-Bs4vduG4.js} +3 -3
  275. package/dist/{shared-BBw6F-YC.js → shared-CEY5IkwG.js} +2 -2
  276. package/dist/{shared-DOZs2SoH.js → shared-DRohONn_.js} +3 -3
  277. package/dist/{shared-CtP9K-o2.js → shared-ICqOZibV.js} +3 -3
  278. package/dist/{skill-scanner-C_fQzVDu.js → skill-scanner-rHMtUHtP.js} +1 -1
  279. package/dist/{skills-BvPUNjxo.js → skills-DRjfSQT3.js} +128 -4
  280. package/dist/{skills-aFOsriMP.js → skills-DprQj9X2.js} +129 -5
  281. package/dist/{skills-cli-oWaTJzZd.js → skills-cli-9WO-C55s.js} +12 -12
  282. package/dist/{skills-cli-E6shXpdd.js → skills-cli-B9eej-EW.js} +13 -13
  283. package/dist/{skills-status-D4vbIMnz.js → skills-status-5U3P3YfJ.js} +3 -3
  284. package/dist/{skills-status-DJDaA2Ur.js → skills-status-TDIgVd1K.js} +2 -2
  285. package/dist/{sqlite-B7FPASCO.js → sqlite-BINzs1U0.js} +2 -2
  286. package/dist/{sqlite-B4Z1_Ioc.js → sqlite-D4w5TejA.js} +2 -2
  287. package/dist/{sqlite-BkYnxkQO.js → sqlite-DRRHmlug.js} +2 -2
  288. package/dist/{sqlite-EuQPVXvn.js → sqlite-F6PGkEm1.js} +2 -2
  289. package/dist/{status-B2Yr-2J5.js → status-BKGkKC_v.js} +3 -3
  290. package/dist/{status-DW7m5xUN.js → status-CiHtHdaa.js} +4 -4
  291. package/dist/{status-CxhnUa5J.js → status-DDWoOpeB.js} +33 -33
  292. package/dist/{subsystem-Bv7dGhES.js → subsystem-BoExtIHo.js} +32 -13
  293. package/dist/{system-cli-0JXhJNWm.js → system-cli-B6lr60Io.js} +14 -14
  294. package/dist/{system-cli-D-0OaMtH.js → system-cli-CprW9G3h.js} +14 -14
  295. package/dist/{systemd-CNTodvCO.js → systemd-C0VZriGM.js} +2 -2
  296. package/dist/{systemd-CUJJHgHa.js → systemd-DrmBtJ5T.js} +3 -3
  297. package/dist/{systemd-hints-cmHtrXUl.js → systemd-hints-DZtXiVHa.js} +1 -1
  298. package/dist/{systemd-linger-CArPbmvv.js → systemd-linger-NC2kl1SC.js} +2 -2
  299. package/dist/{systemd-linger-XvT9Y9sb.js → systemd-linger-xdn3BdPh.js} +2 -2
  300. package/dist/{table-DzBBIqHO.js → table-B8dx3v4v.js} +2 -2
  301. package/dist/{table-oJQPTUL6.js → table-CwulTLQp.js} +1 -1
  302. package/dist/{tool-display-Na-EVL83.js → tool-display-CZRIDMRm.js} +1 -1
  303. package/dist/{tool-display-sHJa3kRs.js → tool-display-ClRud3pg.js} +2 -2
  304. package/dist/{tui-nGp8ltQK.js → tui-CVTQn-dC.js} +9 -9
  305. package/dist/{tui-Biw7aqPj.js → tui-Lu8FdrlK.js} +9 -9
  306. package/dist/{tui-cli-C9FEfG7C.js → tui-cli-BLpTj1X9.js} +25 -25
  307. package/dist/{tui-cli-Dxnu5JGl.js → tui-cli-BLx5kL2I.js} +25 -25
  308. package/dist/{tui-formatters-BiNTNGwg.js → tui-formatters-CNySEfJN.js} +5 -5
  309. package/dist/{tui-formatters-C_baVYUz.js → tui-formatters-DePhZK3J.js} +5 -5
  310. package/dist/{update-C4rsLj2F.js → update-DHVxMTpQ.js} +3 -3
  311. package/dist/{update-uwUWrKFu.js → update-DU1geolI.js} +3 -3
  312. package/dist/{update-cli-cNd_G9E6.js → update-cli-C0hUvJWK.js} +66 -66
  313. package/dist/{update-cli-CBXp-c4C.js → update-cli-Wb1GB3rL.js} +68 -68
  314. package/dist/{update-runner-BLsqC24J.js → update-runner--ixK4J3W.js} +10 -10
  315. package/dist/{update-runner-C_FDpmA3.js → update-runner-7Qa1T9y6.js} +9 -9
  316. package/dist/{utils-Dk86IbEs.js → utils-BLJAc3ZV.js} +1 -1
  317. package/dist/{utils-BHPdZE4h.js → utils-Cd9QdCHh.js} +1 -1
  318. package/dist/{webhooks-cli-BpBKXL7W.js → webhooks-cli-DgcMy7RG.js} +12 -12
  319. package/dist/{webhooks-cli-wNfhfKqm.js → webhooks-cli-aVzUcJY9.js} +11 -11
  320. package/dist/{widearea-dns-WVCWJTEb.js → widearea-dns-BaIgNEhY.js} +1 -1
  321. package/dist/{widearea-dns-BWYPcfby.js → widearea-dns-DzuRdwk5.js} +1 -1
  322. package/dist/{ws-log-Cafylho7.js → ws-log-CIXbLCka.js} +1 -1
  323. package/dist/{ws-log-DTUOUVgR.js → ws-log-DcQFZByi.js} +1 -1
  324. package/dist/{wsl-B-H6Z5wp.js → wsl-BUOkxKJu.js} +2 -2
  325. package/docs/automation/webhook.md +43 -2
  326. package/docs/channels/discord.md +29 -1
  327. package/docs/cli/plugins.md +20 -1
  328. package/docs/cli/security.md +1 -0
  329. package/docs/concepts/session-tool.md +1 -0
  330. package/docs/gateway/configuration-reference.md +11 -0
  331. package/docs/gateway/configuration.md +3 -0
  332. package/docs/gateway/openresponses-http-api.md +15 -0
  333. package/docs/gateway/security/index.md +3 -0
  334. package/docs/help/faq.md +9 -0
  335. package/docs/install/installer.md +20 -0
  336. package/docs/reference/transcript-hygiene.md +18 -0
  337. package/docs/tools/browser.md +6 -0
  338. package/extensions/diagnostics-otel/package.json +9 -9
  339. package/extensions/feishu/package.json +1 -1
  340. package/extensions/feishu/src/config-schema.ts +6 -0
  341. package/extensions/feishu/src/reply-dispatcher.test.ts +116 -0
  342. package/extensions/feishu/src/reply-dispatcher.ts +124 -67
  343. package/extensions/feishu/src/streaming-card.ts +223 -0
  344. package/extensions/feishu/src/targets.test.ts +16 -0
  345. package/extensions/feishu/src/targets.ts +1 -1
  346. package/extensions/irc/src/client.ts +1 -1
  347. package/extensions/minimax-portal-auth/index.ts +7 -5
  348. package/extensions/nostr/package.json +1 -1
  349. package/package.json +13 -13
  350. package/dist/auth-BcNHFK-i.js +0 -184
  351. package/dist/auth-jrfLXze7.js +0 -184
  352. /package/dist/{archive-DqNr5i8b.js → archive-beaSfAzA.js} +0 -0
  353. /package/dist/{brew-BIrWdDps.js → brew-BUIxHEkn.js} +0 -0
  354. /package/dist/{brew-6UyogeLe.js → brew-ROHf0-Xp.js} +0 -0
  355. /package/dist/{constants-DuoCkWRh.js → constants-BvQ6S8j5.js} +0 -0
  356. /package/dist/{errors-x4NYs-1P.js → errors-DjZBTJJ3.js} +0 -0
  357. /package/dist/{helpers-BDvtkJjw.js → helpers-HyeZXsnu.js} +0 -0
  358. /package/dist/{is-main-CE1eOBYb.js → is-main-BWoXGz7p.js} +0 -0
  359. /package/dist/{parse-Cjiudy6x.js → parse-Bw0oH-rT.js} +0 -0
  360. /package/dist/{parse-timeout-DFSPLxpY.js → parse-timeout-D1XX_zN_.js} +0 -0
  361. /package/dist/{prompts-BOz5176z.js → prompts-Bg96reub.js} +0 -0
  362. /package/dist/{redact-DuEEf1p1.js → redact-Br9GfacZ.js} +0 -0
  363. /package/dist/{skill-scanner-CprFkZib.js → skill-scanner-CucvxYhu.js} +0 -0
  364. /package/dist/{transcript-events-CZ8CG4ht.js → transcript-events-BtNd-j6q.js} +0 -0
@@ -1476,6 +1476,7 @@ const DiscordGuildChannelSchema = z.object({
1476
1476
  skills: z.array(z.string()).optional(),
1477
1477
  enabled: z.boolean().optional(),
1478
1478
  users: z.array(z.union([z.string(), z.number()])).optional(),
1479
+ roles: z.array(z.union([z.string(), z.number()])).optional(),
1479
1480
  systemPrompt: z.string().optional(),
1480
1481
  includeThreadStarter: z.boolean().optional(),
1481
1482
  autoThread: z.boolean().optional()
@@ -1492,6 +1493,7 @@ const DiscordGuildSchema = z.object({
1492
1493
  "allowlist"
1493
1494
  ]).optional(),
1494
1495
  users: z.array(z.union([z.string(), z.number()])).optional(),
1496
+ roles: z.array(z.union([z.string(), z.number()])).optional(),
1495
1497
  channels: z.record(z.string(), DiscordGuildChannelSchema.optional()).optional()
1496
1498
  }).strict();
1497
1499
  const DiscordAccountSchema = z.object({
@@ -2411,6 +2413,31 @@ function resolveGatewayPort(cfg, env = process.env) {
2411
2413
  return DEFAULT_GATEWAY_PORT;
2412
2414
  }
2413
2415
 
2416
+ //#endregion
2417
+ //#region src/infra/tmp-openclaw-dir.ts
2418
+ const POSIX_OPENCLAW_TMP_DIR = "/tmp/openclaw";
2419
+ function isNodeErrorWithCode(err, code) {
2420
+ return typeof err === "object" && err !== null && "code" in err && err.code === code;
2421
+ }
2422
+ function resolvePreferredOpenClawTmpDir(options = {}) {
2423
+ const accessSync = options.accessSync ?? fs.accessSync;
2424
+ const statSync = options.statSync ?? fs.statSync;
2425
+ const tmpdir = options.tmpdir ?? os.tmpdir;
2426
+ try {
2427
+ if (!statSync(POSIX_OPENCLAW_TMP_DIR).isDirectory()) return path.join(tmpdir(), "openclaw");
2428
+ accessSync(POSIX_OPENCLAW_TMP_DIR, fs.constants.W_OK | fs.constants.X_OK);
2429
+ return POSIX_OPENCLAW_TMP_DIR;
2430
+ } catch (err) {
2431
+ if (!isNodeErrorWithCode(err, "ENOENT")) return path.join(tmpdir(), "openclaw");
2432
+ }
2433
+ try {
2434
+ accessSync("/tmp", fs.constants.W_OK | fs.constants.X_OK);
2435
+ return POSIX_OPENCLAW_TMP_DIR;
2436
+ } catch {
2437
+ return path.join(tmpdir(), "openclaw");
2438
+ }
2439
+ }
2440
+
2414
2441
  //#endregion
2415
2442
  //#region src/logging/config.ts
2416
2443
  function readLoggingConfig() {
@@ -2471,7 +2498,7 @@ const loggingState = {
2471
2498
 
2472
2499
  //#endregion
2473
2500
  //#region src/logging/logger.ts
2474
- const DEFAULT_LOG_DIR = "/tmp/openclaw";
2501
+ const DEFAULT_LOG_DIR = resolvePreferredOpenClawTmpDir();
2475
2502
  const DEFAULT_LOG_FILE = path.join(DEFAULT_LOG_DIR, "openclaw.log");
2476
2503
  const LOG_PREFIX = "openclaw";
2477
2504
  const LOG_SUFFIX = ".log";
@@ -2815,17 +2842,10 @@ function restoreTerminalState(reason) {
2815
2842
  reportRestoreFailure("progress line", err, reason);
2816
2843
  }
2817
2844
  const stdin = process.stdin;
2818
- if (stdin.isTTY && typeof stdin.setRawMode === "function") {
2819
- try {
2820
- stdin.setRawMode(false);
2821
- } catch (err) {
2822
- reportRestoreFailure("raw mode", err, reason);
2823
- }
2824
- if (typeof stdin.isPaused === "function" && stdin.isPaused()) try {
2825
- stdin.resume();
2826
- } catch (err) {
2827
- reportRestoreFailure("stdin resume", err, reason);
2828
- }
2845
+ if (stdin.isTTY && typeof stdin.setRawMode === "function") try {
2846
+ stdin.setRawMode(false);
2847
+ } catch (err) {
2848
+ reportRestoreFailure("raw mode", err, reason);
2829
2849
  }
2830
2850
  if (process.stdout.isTTY) try {
2831
2851
  process.stdout.write(RESET_SEQUENCE);
@@ -7837,23 +7857,53 @@ function buildMinimaxProvider() {
7837
7857
  return {
7838
7858
  baseUrl: MINIMAX_API_BASE_URL,
7839
7859
  api: "openai-completions",
7840
- models: [{
7841
- id: MINIMAX_DEFAULT_MODEL_ID,
7842
- name: "MiniMax M2.1",
7843
- reasoning: false,
7844
- input: ["text"],
7845
- cost: MINIMAX_API_COST,
7846
- contextWindow: MINIMAX_DEFAULT_CONTEXT_WINDOW,
7847
- maxTokens: MINIMAX_DEFAULT_MAX_TOKENS
7848
- }, {
7849
- id: MINIMAX_DEFAULT_VISION_MODEL_ID,
7850
- name: "MiniMax VL 01",
7851
- reasoning: false,
7852
- input: ["text", "image"],
7853
- cost: MINIMAX_API_COST,
7854
- contextWindow: MINIMAX_DEFAULT_CONTEXT_WINDOW,
7855
- maxTokens: MINIMAX_DEFAULT_MAX_TOKENS
7856
- }]
7860
+ models: [
7861
+ {
7862
+ id: MINIMAX_DEFAULT_MODEL_ID,
7863
+ name: "MiniMax M2.1",
7864
+ reasoning: false,
7865
+ input: ["text"],
7866
+ cost: MINIMAX_API_COST,
7867
+ contextWindow: MINIMAX_DEFAULT_CONTEXT_WINDOW,
7868
+ maxTokens: MINIMAX_DEFAULT_MAX_TOKENS
7869
+ },
7870
+ {
7871
+ id: "MiniMax-M2.1-lightning",
7872
+ name: "MiniMax M2.1 Lightning",
7873
+ reasoning: false,
7874
+ input: ["text"],
7875
+ cost: MINIMAX_API_COST,
7876
+ contextWindow: MINIMAX_DEFAULT_CONTEXT_WINDOW,
7877
+ maxTokens: MINIMAX_DEFAULT_MAX_TOKENS
7878
+ },
7879
+ {
7880
+ id: MINIMAX_DEFAULT_VISION_MODEL_ID,
7881
+ name: "MiniMax VL 01",
7882
+ reasoning: false,
7883
+ input: ["text", "image"],
7884
+ cost: MINIMAX_API_COST,
7885
+ contextWindow: MINIMAX_DEFAULT_CONTEXT_WINDOW,
7886
+ maxTokens: MINIMAX_DEFAULT_MAX_TOKENS
7887
+ },
7888
+ {
7889
+ id: "MiniMax-M2.5",
7890
+ name: "MiniMax M2.5",
7891
+ reasoning: true,
7892
+ input: ["text"],
7893
+ cost: MINIMAX_API_COST,
7894
+ contextWindow: MINIMAX_DEFAULT_CONTEXT_WINDOW,
7895
+ maxTokens: MINIMAX_DEFAULT_MAX_TOKENS
7896
+ },
7897
+ {
7898
+ id: "MiniMax-M2.5-Lightning",
7899
+ name: "MiniMax M2.5 Lightning",
7900
+ reasoning: true,
7901
+ input: ["text"],
7902
+ cost: MINIMAX_API_COST,
7903
+ contextWindow: MINIMAX_DEFAULT_CONTEXT_WINDOW,
7904
+ maxTokens: MINIMAX_DEFAULT_MAX_TOKENS
7905
+ }
7906
+ ]
7857
7907
  };
7858
7908
  }
7859
7909
  function buildMinimaxPortalProvider() {
@@ -7868,6 +7918,14 @@ function buildMinimaxPortalProvider() {
7868
7918
  cost: MINIMAX_API_COST,
7869
7919
  contextWindow: MINIMAX_DEFAULT_CONTEXT_WINDOW,
7870
7920
  maxTokens: MINIMAX_DEFAULT_MAX_TOKENS
7921
+ }, {
7922
+ id: "MiniMax-M2.5",
7923
+ name: "MiniMax M2.5",
7924
+ reasoning: true,
7925
+ input: ["text"],
7926
+ cost: MINIMAX_API_COST,
7927
+ contextWindow: MINIMAX_DEFAULT_CONTEXT_WINDOW,
7928
+ maxTokens: MINIMAX_DEFAULT_MAX_TOKENS
7871
7929
  }]
7872
7930
  };
7873
7931
  }
@@ -10435,7 +10493,8 @@ const BindingsSchema = z.array(z.object({
10435
10493
  id: z.string()
10436
10494
  }).strict().optional(),
10437
10495
  guildId: z.string().optional(),
10438
- teamId: z.string().optional()
10496
+ teamId: z.string().optional(),
10497
+ roles: z.array(z.string()).optional()
10439
10498
  }).strict()
10440
10499
  }).strict()).optional();
10441
10500
  const BroadcastStrategySchema = z.enum(["parallel", "sequential"]);
@@ -10924,6 +10983,9 @@ const OpenClawSchema = z.object({
10924
10983
  enabled: z.boolean().optional(),
10925
10984
  path: z.string().optional(),
10926
10985
  token: z.string().optional(),
10986
+ defaultSessionKey: z.string().optional(),
10987
+ allowRequestSessionKey: z.boolean().optional(),
10988
+ allowedSessionKeyPrefixes: z.array(z.string()).optional(),
10927
10989
  allowedAgentIds: z.array(z.string()).optional(),
10928
10990
  maxBodyBytes: z.number().int().positive().optional(),
10929
10991
  presets: z.array(z.string()).optional(),
@@ -11029,8 +11091,10 @@ const OpenClawSchema = z.object({
11029
11091
  responses: z.object({
11030
11092
  enabled: z.boolean().optional(),
11031
11093
  maxBodyBytes: z.number().int().positive().optional(),
11094
+ maxUrlParts: z.number().int().nonnegative().optional(),
11032
11095
  files: z.object({
11033
11096
  allowUrl: z.boolean().optional(),
11097
+ urlAllowlist: z.array(z.string()).optional(),
11034
11098
  allowedMimes: z.array(z.string()).optional(),
11035
11099
  maxBytes: z.number().int().positive().optional(),
11036
11100
  maxChars: z.number().int().positive().optional(),
@@ -11044,6 +11108,7 @@ const OpenClawSchema = z.object({
11044
11108
  }).strict().optional(),
11045
11109
  images: z.object({
11046
11110
  allowUrl: z.boolean().optional(),
11111
+ urlAllowlist: z.array(z.string()).optional(),
11047
11112
  allowedMimes: z.array(z.string()).optional(),
11048
11113
  maxBytes: z.number().int().positive().optional(),
11049
11114
  maxRedirects: z.number().int().nonnegative().optional(),
@@ -13248,6 +13313,22 @@ function normalizeHostnameSet(values) {
13248
13313
  if (!values || values.length === 0) return /* @__PURE__ */ new Set();
13249
13314
  return new Set(values.map((value) => normalizeHostname(value)).filter(Boolean));
13250
13315
  }
13316
+ function normalizeHostnameAllowlist(values) {
13317
+ if (!values || values.length === 0) return [];
13318
+ return Array.from(new Set(values.map((value) => normalizeHostname(value)).filter((value) => value !== "*" && value !== "*." && value.length > 0)));
13319
+ }
13320
+ function isHostnameAllowedByPattern(hostname, pattern) {
13321
+ if (pattern.startsWith("*.")) {
13322
+ const suffix = pattern.slice(2);
13323
+ if (!suffix || hostname === suffix) return false;
13324
+ return hostname.endsWith(`.${suffix}`);
13325
+ }
13326
+ return hostname === pattern;
13327
+ }
13328
+ function matchesHostnameAllowlist(hostname, allowlist) {
13329
+ if (allowlist.length === 0) return true;
13330
+ return allowlist.some((pattern) => isHostnameAllowedByPattern(hostname, pattern));
13331
+ }
13251
13332
  function parseIpv4(address) {
13252
13333
  const parts = address.split(".");
13253
13334
  if (parts.length !== 4) return null;
@@ -13348,7 +13429,10 @@ async function resolvePinnedHostnameWithPolicy(hostname, params = {}) {
13348
13429
  const normalized = normalizeHostname(hostname);
13349
13430
  if (!normalized) throw new Error("Invalid hostname");
13350
13431
  const allowPrivateNetwork = Boolean(params.policy?.allowPrivateNetwork);
13351
- const isExplicitAllowed = normalizeHostnameSet(params.policy?.allowedHostnames).has(normalized);
13432
+ const allowedHostnames = normalizeHostnameSet(params.policy?.allowedHostnames);
13433
+ const hostnameAllowlist = normalizeHostnameAllowlist(params.policy?.hostnameAllowlist);
13434
+ const isExplicitAllowed = allowedHostnames.has(normalized);
13435
+ if (!matchesHostnameAllowlist(normalized, hostnameAllowlist)) throw new SsrFBlockedError(`Blocked hostname (not in allowlist): ${hostname}`);
13352
13436
  if (!allowPrivateNetwork && !isExplicitAllowed) {
13353
13437
  if (isBlockedHostname(normalized)) throw new SsrFBlockedError(`Blocked hostname: ${hostname}`);
13354
13438
  if (isPrivateIpAddress(normalized)) throw new SsrFBlockedError("Blocked: private/internal IP address");
@@ -13369,9 +13453,6 @@ async function resolvePinnedHostnameWithPolicy(hostname, params = {}) {
13369
13453
  })
13370
13454
  };
13371
13455
  }
13372
- async function resolvePinnedHostname(hostname, lookupFn = lookup$1) {
13373
- return await resolvePinnedHostnameWithPolicy(hostname, { lookupFn });
13374
- }
13375
13456
  function createPinnedDispatcher(pinned) {
13376
13457
  return new Agent({ connect: { lookup: pinned.lookup } });
13377
13458
  }
@@ -13541,10 +13622,10 @@ async function fetchWithSsrFGuard(params) {
13541
13622
  }
13542
13623
  let dispatcher = null;
13543
13624
  try {
13544
- const pinned = Boolean(params.policy?.allowPrivateNetwork || params.policy?.allowedHostnames?.length) ? await resolvePinnedHostnameWithPolicy(parsedUrl.hostname, {
13625
+ const pinned = await resolvePinnedHostnameWithPolicy(parsedUrl.hostname, {
13545
13626
  lookupFn: params.lookupFn,
13546
13627
  policy: params.policy
13547
- }) : await resolvePinnedHostname(parsedUrl.hostname, params.lookupFn);
13628
+ });
13548
13629
  if (params.pinDns !== false) dispatcher = createPinnedDispatcher(pinned);
13549
13630
  const init = {
13550
13631
  ...params.init ? { ...params.init } : {},
@@ -13581,6 +13662,7 @@ async function fetchWithSsrFGuard(params) {
13581
13662
  release: async () => release(dispatcher)
13582
13663
  };
13583
13664
  } catch (err) {
13665
+ if (err instanceof SsrFBlockedError) logWarn(`security: blocked URL fetch (${params.auditContext ?? "url-fetch"}) target=${parsedUrl.origin}${parsedUrl.pathname} reason=${err.message}`);
13584
13666
  await release(dispatcher);
13585
13667
  throw err;
13586
13668
  }
@@ -13960,6 +14042,8 @@ async function optimizeImageToJpeg(buffer, maxBytes, opts = {}) {
13960
14042
  //#endregion
13961
14043
  //#region src/discord/send.permissions.ts
13962
14044
  const PERMISSION_ENTRIES = Object.entries(PermissionFlagsBits).filter(([, value]) => typeof value === "bigint");
14045
+ const ALL_PERMISSIONS = PERMISSION_ENTRIES.reduce((acc, [, value]) => acc | value, 0n);
14046
+ const ADMINISTRATOR_BIT = PermissionFlagsBits.Administrator;
13963
14047
 
13964
14048
  //#endregion
13965
14049
  //#region src/discord/send.types.ts
@@ -15318,6 +15402,14 @@ function buildDeviceAuthPayload(params) {
15318
15402
  return base.join("|");
15319
15403
  }
15320
15404
 
15405
+ //#endregion
15406
+ //#region src/sessions/input-provenance.ts
15407
+ const INPUT_PROVENANCE_KIND_VALUES = [
15408
+ "external_user",
15409
+ "inter_session",
15410
+ "internal_system"
15411
+ ];
15412
+
15321
15413
  //#endregion
15322
15414
  //#region src/sessions/session-label.ts
15323
15415
  const SESSION_LABEL_MAX_LENGTH = 64;
@@ -15389,6 +15481,12 @@ const AgentParamsSchema = Type.Object({
15389
15481
  timeout: Type.Optional(Type.Integer({ minimum: 0 })),
15390
15482
  lane: Type.Optional(Type.String()),
15391
15483
  extraSystemPrompt: Type.Optional(Type.String()),
15484
+ inputProvenance: Type.Optional(Type.Object({
15485
+ kind: Type.String({ enum: [...INPUT_PROVENANCE_KIND_VALUES] }),
15486
+ sourceSessionKey: Type.Optional(Type.String()),
15487
+ sourceChannel: Type.Optional(Type.String()),
15488
+ sourceTool: Type.Optional(Type.String())
15489
+ }, { additionalProperties: false })),
15392
15490
  idempotencyKey: NonEmptyString,
15393
15491
  label: Type.Optional(SessionLabelString),
15394
15492
  spawnedBy: Type.Optional(Type.String())
@@ -18264,6 +18362,18 @@ async function installSignalCli(runtime) {
18264
18362
  //#endregion
18265
18363
  //#region src/channels/plugins/onboarding/signal.ts
18266
18364
  const channel$1 = "signal";
18365
+ const MIN_E164_DIGITS = 5;
18366
+ const MAX_E164_DIGITS = 15;
18367
+ const DIGITS_ONLY = /^\d+$/;
18368
+ const INVALID_SIGNAL_ACCOUNT_ERROR = "Invalid E.164 phone number (must start with + and country code, e.g. +15555550123)";
18369
+ function normalizeSignalAccountInput(value) {
18370
+ const trimmed = value?.trim();
18371
+ if (!trimmed) return null;
18372
+ const digits = normalizeE164(trimmed).slice(1);
18373
+ if (!DIGITS_ONLY.test(digits)) return null;
18374
+ if (digits.length < MIN_E164_DIGITS || digits.length > MAX_E164_DIGITS) return null;
18375
+ return `+${digits}`;
18376
+ }
18267
18377
  function setSignalDmPolicy(cfg, dmPolicy) {
18268
18378
  const allowFrom = dmPolicy === "open" ? addWildcardAllowFrom(cfg.channels?.signal?.allowFrom) : void 0;
18269
18379
  return {
@@ -18417,15 +18527,22 @@ const signalOnboardingAdapter = {
18417
18527
  if (!cliDetected) await prompter.note("signal-cli not found. Install it, then rerun this step or set channels.signal.cliPath.", "Signal");
18418
18528
  let account = accountConfig.account ?? "";
18419
18529
  if (account) {
18420
- if (!await prompter.confirm({
18421
- message: `Signal account set (${account}). Keep it?`,
18422
- initialValue: true
18423
- })) account = "";
18530
+ const normalizedExisting = normalizeSignalAccountInput(account);
18531
+ if (!normalizedExisting) {
18532
+ await prompter.note("Existing Signal account isn't a valid E.164 number. Please enter it again.", "Signal");
18533
+ account = "";
18534
+ } else {
18535
+ account = normalizedExisting;
18536
+ if (!await prompter.confirm({
18537
+ message: `Signal account set (${account}). Keep it?`,
18538
+ initialValue: true
18539
+ })) account = "";
18540
+ }
18424
18541
  }
18425
- if (!account) account = String(await prompter.text({
18542
+ if (!account) account = normalizeSignalAccountInput(String(await prompter.text({
18426
18543
  message: "Signal bot number (E.164)",
18427
- validate: (value) => value?.trim() ? void 0 : "Required"
18428
- })).trim();
18544
+ validate: (value) => normalizeSignalAccountInput(String(value ?? "")) ? void 0 : INVALID_SIGNAL_ACCOUNT_ERROR
18545
+ }))) ?? "";
18429
18546
  if (account) if (signalAccountId === DEFAULT_ACCOUNT_ID) next = {
18430
18547
  ...next,
18431
18548
  channels: {
@@ -18674,6 +18791,61 @@ const SANDBOX_STATE_DIR = path.join(STATE_DIR, "sandbox");
18674
18791
  const SANDBOX_REGISTRY_PATH = path.join(SANDBOX_STATE_DIR, "containers.json");
18675
18792
  const SANDBOX_BROWSER_REGISTRY_PATH = path.join(SANDBOX_STATE_DIR, "browsers.json");
18676
18793
 
18794
+ //#endregion
18795
+ //#region src/agents/sandbox-paths.ts
18796
+ const UNICODE_SPACES = /[\u00A0\u2000-\u200A\u202F\u205F\u3000]/g;
18797
+ function normalizeUnicodeSpaces(str) {
18798
+ return str.replace(UNICODE_SPACES, " ");
18799
+ }
18800
+ function expandPath(filePath) {
18801
+ const normalized = normalizeUnicodeSpaces(filePath);
18802
+ if (normalized === "~") return os.homedir();
18803
+ if (normalized.startsWith("~/")) return os.homedir() + normalized.slice(1);
18804
+ return normalized;
18805
+ }
18806
+ function resolveToCwd(filePath, cwd) {
18807
+ const expanded = expandPath(filePath);
18808
+ if (path.isAbsolute(expanded)) return expanded;
18809
+ return path.resolve(cwd, expanded);
18810
+ }
18811
+ function resolveSandboxPath(params) {
18812
+ const resolved = resolveToCwd(params.filePath, params.cwd);
18813
+ const rootResolved = path.resolve(params.root);
18814
+ const relative = path.relative(rootResolved, resolved);
18815
+ if (!relative || relative === "") return {
18816
+ resolved,
18817
+ relative: ""
18818
+ };
18819
+ if (relative.startsWith("..") || path.isAbsolute(relative)) throw new Error(`Path escapes sandbox root (${shortPath(rootResolved)}): ${params.filePath}`);
18820
+ return {
18821
+ resolved,
18822
+ relative
18823
+ };
18824
+ }
18825
+ async function assertSandboxPath(params) {
18826
+ const resolved = resolveSandboxPath(params);
18827
+ await assertNoSymlink(resolved.relative, path.resolve(params.root));
18828
+ return resolved;
18829
+ }
18830
+ async function assertNoSymlink(relative, root) {
18831
+ if (!relative) return;
18832
+ const parts = relative.split(path.sep).filter(Boolean);
18833
+ let current = root;
18834
+ for (const part of parts) {
18835
+ current = path.join(current, part);
18836
+ try {
18837
+ if ((await fs$1.lstat(current)).isSymbolicLink()) throw new Error(`Symlink not allowed in sandbox path: ${current}`);
18838
+ } catch (err) {
18839
+ if (err.code === "ENOENT") return;
18840
+ throw err;
18841
+ }
18842
+ }
18843
+ }
18844
+ function shortPath(value) {
18845
+ if (value.startsWith(os.homedir())) return `~${value.slice(os.homedir().length)}`;
18846
+ return value;
18847
+ }
18848
+
18677
18849
  //#endregion
18678
18850
  //#region src/agents/skills/plugin-skills.ts
18679
18851
  const log$17 = createSubsystemLogger("skills");
@@ -18695,6 +18867,10 @@ const SELECTOR_UNSUPPORTED_MESSAGE = [
18695
18867
  "This is more reliable for modern SPAs."
18696
18868
  ].join("\n");
18697
18869
 
18870
+ //#endregion
18871
+ //#region src/browser/routes/agent.debug.ts
18872
+ const DEFAULT_TRACE_DIR = resolvePreferredOpenClawTmpDir();
18873
+
18698
18874
  //#endregion
18699
18875
  //#region src/browser/screenshot.ts
18700
18876
  const DEFAULT_BROWSER_SCREENSHOT_MAX_BYTES = 5 * 1024 * 1024;
@@ -18726,11 +18902,80 @@ function isContextOverflowError(errorMessage) {
18726
18902
  const hasContextWindow = lower.includes("context window") || lower.includes("context length") || lower.includes("maximum context length");
18727
18903
  return lower.includes("request_too_large") || lower.includes("request exceeds the maximum size") || lower.includes("context length exceeded") || lower.includes("maximum context length") || lower.includes("prompt is too long") || lower.includes("exceeds model context window") || hasRequestSizeExceeds && hasContextWindow || lower.includes("context overflow:") || lower.includes("413") && lower.includes("too large");
18728
18904
  }
18905
+ const CONTEXT_WINDOW_TOO_SMALL_RE = /context window.*(too small|minimum is)/i;
18906
+ const CONTEXT_OVERFLOW_HINT_RE = /context.*overflow|context window.*(too (?:large|long)|exceed|over|limit|max(?:imum)?|requested|sent|tokens)|prompt.*(too (?:large|long)|exceed|over|limit|max(?:imum)?)|(?:request|input).*(?:context|window|length|token).*(too (?:large|long)|exceed|over|limit|max(?:imum)?)/i;
18907
+ const RATE_LIMIT_HINT_RE = /rate limit|too many requests|requests per (?:minute|hour|day)|quota|throttl|429\b/i;
18908
+ function isLikelyContextOverflowError(errorMessage) {
18909
+ if (!errorMessage) return false;
18910
+ if (CONTEXT_WINDOW_TOO_SMALL_RE.test(errorMessage)) return false;
18911
+ if (isRateLimitErrorMessage(errorMessage)) return false;
18912
+ if (isContextOverflowError(errorMessage)) return true;
18913
+ if (RATE_LIMIT_HINT_RE.test(errorMessage)) return false;
18914
+ return CONTEXT_OVERFLOW_HINT_RE.test(errorMessage);
18915
+ }
18729
18916
  function isCompactionFailureError(errorMessage) {
18730
18917
  if (!errorMessage) return false;
18731
18918
  const lower = errorMessage.toLowerCase();
18732
18919
  if (!(lower.includes("summarization failed") || lower.includes("auto-compaction") || lower.includes("compaction failed") || lower.includes("compaction"))) return false;
18733
- return isContextOverflowError(errorMessage) || lower.includes("context overflow");
18920
+ if (isLikelyContextOverflowError(errorMessage)) return true;
18921
+ return lower.includes("context overflow");
18922
+ }
18923
+ const ERROR_PATTERNS = {
18924
+ rateLimit: [
18925
+ /rate[_ ]limit|too many requests|429/,
18926
+ "exceeded your current quota",
18927
+ "resource has been exhausted",
18928
+ "quota exceeded",
18929
+ "resource_exhausted",
18930
+ "usage limit"
18931
+ ],
18932
+ overloaded: [/overloaded_error|"type"\s*:\s*"overloaded_error"/i, "overloaded"],
18933
+ timeout: [
18934
+ "timeout",
18935
+ "timed out",
18936
+ "deadline exceeded",
18937
+ "context deadline exceeded"
18938
+ ],
18939
+ billing: [
18940
+ /["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|\b(?:got|returned|received)\s+(?:a\s+)?402\b|^\s*402\s+payment/i,
18941
+ "payment required",
18942
+ "insufficient credits",
18943
+ "credit balance",
18944
+ "plans & billing",
18945
+ "insufficient balance"
18946
+ ],
18947
+ auth: [
18948
+ /invalid[_ ]?api[_ ]?key/,
18949
+ "incorrect api key",
18950
+ "invalid token",
18951
+ "authentication",
18952
+ "re-authenticate",
18953
+ "oauth token refresh failed",
18954
+ "unauthorized",
18955
+ "forbidden",
18956
+ "access denied",
18957
+ "expired",
18958
+ "token has expired",
18959
+ /\b401\b/,
18960
+ /\b403\b/,
18961
+ "no credentials found",
18962
+ "no api key found"
18963
+ ],
18964
+ format: [
18965
+ "string should match pattern",
18966
+ "tool_use.id",
18967
+ "tool_use_id",
18968
+ "messages.1.content.1.tool_use.id",
18969
+ "invalid request format"
18970
+ ]
18971
+ };
18972
+ function matchesErrorPatterns(raw, patterns) {
18973
+ if (!raw) return false;
18974
+ const value = raw.toLowerCase();
18975
+ return patterns.some((pattern) => pattern instanceof RegExp ? pattern.test(value) : value.includes(pattern));
18976
+ }
18977
+ function isRateLimitErrorMessage(raw) {
18978
+ return matchesErrorPatterns(raw, ERROR_PATTERNS.rateLimit);
18734
18979
  }
18735
18980
 
18736
18981
  //#endregion
@@ -20340,6 +20585,10 @@ const discordEventQueueLog = createSubsystemLogger("discord/event-queue");
20340
20585
  //#region src/pairing/pairing-store.ts
20341
20586
  const PAIRING_PENDING_TTL_MS = 3600 * 1e3;
20342
20587
 
20588
+ //#endregion
20589
+ //#region src/discord/monitor/threading.ts
20590
+ const DISCORD_THREAD_STARTER_CACHE_TTL_MS = 300 * 1e3;
20591
+
20343
20592
  //#endregion
20344
20593
  //#region src/security/external-content.ts
20345
20594
  /**
@@ -20367,6 +20616,7 @@ const EXTERNAL_SOURCE_LABELS = {
20367
20616
  email: "Email",
20368
20617
  webhook: "Webhook",
20369
20618
  api: "API",
20619
+ browser: "Browser",
20370
20620
  channel_metadata: "Channel metadata",
20371
20621
  web_search: "Web Search",
20372
20622
  web_fetch: "Web Fetch",
@@ -20832,61 +21082,6 @@ async function loginWeb(verbose, waitForConnection, runtime = defaultRuntime, ac
20832
21082
  //#region src/plugins/tools.ts
20833
21083
  const log$6 = createSubsystemLogger("plugins");
20834
21084
 
20835
- //#endregion
20836
- //#region src/agents/sandbox-paths.ts
20837
- const UNICODE_SPACES = /[\u00A0\u2000-\u200A\u202F\u205F\u3000]/g;
20838
- function normalizeUnicodeSpaces(str) {
20839
- return str.replace(UNICODE_SPACES, " ");
20840
- }
20841
- function expandPath(filePath) {
20842
- const normalized = normalizeUnicodeSpaces(filePath);
20843
- if (normalized === "~") return os.homedir();
20844
- if (normalized.startsWith("~/")) return os.homedir() + normalized.slice(1);
20845
- return normalized;
20846
- }
20847
- function resolveToCwd(filePath, cwd) {
20848
- const expanded = expandPath(filePath);
20849
- if (path.isAbsolute(expanded)) return expanded;
20850
- return path.resolve(cwd, expanded);
20851
- }
20852
- function resolveSandboxPath(params) {
20853
- const resolved = resolveToCwd(params.filePath, params.cwd);
20854
- const rootResolved = path.resolve(params.root);
20855
- const relative = path.relative(rootResolved, resolved);
20856
- if (!relative || relative === "") return {
20857
- resolved,
20858
- relative: ""
20859
- };
20860
- if (relative.startsWith("..") || path.isAbsolute(relative)) throw new Error(`Path escapes sandbox root (${shortPath(rootResolved)}): ${params.filePath}`);
20861
- return {
20862
- resolved,
20863
- relative
20864
- };
20865
- }
20866
- async function assertSandboxPath(params) {
20867
- const resolved = resolveSandboxPath(params);
20868
- await assertNoSymlink(resolved.relative, path.resolve(params.root));
20869
- return resolved;
20870
- }
20871
- async function assertNoSymlink(relative, root) {
20872
- if (!relative) return;
20873
- const parts = relative.split(path.sep).filter(Boolean);
20874
- let current = root;
20875
- for (const part of parts) {
20876
- current = path.join(current, part);
20877
- try {
20878
- if ((await fs$1.lstat(current)).isSymbolicLink()) throw new Error(`Symlink not allowed in sandbox path: ${current}`);
20879
- } catch (err) {
20880
- if (err.code === "ENOENT") return;
20881
- throw err;
20882
- }
20883
- }
20884
- }
20885
- function shortPath(value) {
20886
- if (value.startsWith(os.homedir())) return `~${value.slice(os.homedir().length)}`;
20887
- return value;
20888
- }
20889
-
20890
21085
  //#endregion
20891
21086
  //#region src/agents/apply-patch.ts
20892
21087
  const applyPatchSchema = Type.Object({ input: Type.String({ description: "Patch content using the *** Begin Patch/End Patch format." }) });
@@ -24965,6 +25160,7 @@ const log = createSubsystemLogger("agent/claude-cli");
24965
25160
  const DEFAULT_MEMORY_FLUSH_PROMPT = [
24966
25161
  "Pre-compaction memory flush.",
24967
25162
  "Store durable memories now (use memory/YYYY-MM-DD.md; create memory/ if needed).",
25163
+ "IMPORTANT: If the file already exists, APPEND new content only and do not overwrite existing entries.",
24968
25164
  `If nothing to store, reply with ${SILENT_REPLY_TOKEN}.`
24969
25165
  ].join(" ");
24970
25166
  const DEFAULT_MEMORY_FLUSH_SYSTEM_PROMPT = [
@@ -0,0 +1,3 @@
1
+ import { runExec } from "../process/exec.js";
2
+ import { type RuntimeEnv } from "../runtime.js";
3
+ export declare function ensureBinary(name: string, exec?: typeof runExec, runtime?: RuntimeEnv): Promise<void>;
@@ -20,6 +20,7 @@ export type HeartbeatSummary = {
20
20
  model?: string;
21
21
  ackMaxChars: number;
22
22
  };
23
+ export declare function isCronSystemEvent(evt: string): boolean;
23
24
  export type HeartbeatRunner = {
24
25
  stop: () => void;
25
26
  updateConfig: (cfg: OpenClawConfig) => void;
@@ -10,6 +10,7 @@ export type GuardedFetchOptions = {
10
10
  policy?: SsrFPolicy;
11
11
  lookupFn?: LookupFn;
12
12
  pinDns?: boolean;
13
+ auditContext?: string;
13
14
  };
14
15
  export type GuardedFetchResult = {
15
16
  response: Response;
@@ -8,6 +8,7 @@ export type LookupFn = typeof dnsLookup;
8
8
  export type SsrFPolicy = {
9
9
  allowPrivateNetwork?: boolean;
10
10
  allowedHostnames?: string[];
11
+ hostnameAllowlist?: string[];
11
12
  };
12
13
  export declare function isPrivateIpAddress(address: string): boolean;
13
14
  export declare function isBlockedHostname(hostname: string): boolean;
@@ -0,0 +1,34 @@
1
+ import { promptYesNo } from "../cli/prompt.js";
2
+ import { runExec } from "../process/exec.js";
3
+ import { type RuntimeEnv } from "../runtime.js";
4
+ /**
5
+ * Locate Tailscale binary using multiple strategies:
6
+ * 1. PATH lookup (via which command)
7
+ * 2. Known macOS app path
8
+ * 3. find /Applications for Tailscale.app
9
+ * 4. locate database (if available)
10
+ *
11
+ * @returns Path to Tailscale binary or null if not found
12
+ */
13
+ export declare function findTailscaleBinary(): Promise<string | null>;
14
+ export declare function getTailnetHostname(exec?: typeof runExec, detectedBinary?: string): Promise<string>;
15
+ export declare function getTailscaleBinary(): Promise<string>;
16
+ export declare function readTailscaleStatusJson(exec?: typeof runExec, opts?: {
17
+ timeoutMs?: number;
18
+ }): Promise<Record<string, unknown>>;
19
+ export declare function ensureGoInstalled(exec?: typeof runExec, prompt?: typeof promptYesNo, runtime?: RuntimeEnv): Promise<void>;
20
+ export declare function ensureTailscaledInstalled(exec?: typeof runExec, prompt?: typeof promptYesNo, runtime?: RuntimeEnv): Promise<void>;
21
+ export type TailscaleWhoisIdentity = {
22
+ login: string;
23
+ name?: string;
24
+ };
25
+ export declare function ensureFunnel(port: number, exec?: typeof runExec, runtime?: RuntimeEnv, prompt?: typeof promptYesNo): Promise<void>;
26
+ export declare function enableTailscaleServe(port: number, exec?: typeof runExec): Promise<void>;
27
+ export declare function disableTailscaleServe(exec?: typeof runExec): Promise<void>;
28
+ export declare function enableTailscaleFunnel(port: number, exec?: typeof runExec): Promise<void>;
29
+ export declare function disableTailscaleFunnel(exec?: typeof runExec): Promise<void>;
30
+ export declare function readTailscaleWhoisIdentity(ip: string, exec?: typeof runExec, opts?: {
31
+ timeoutMs?: number;
32
+ cacheTtlMs?: number;
33
+ errorTtlMs?: number;
34
+ }): Promise<TailscaleWhoisIdentity | null>;
@@ -0,0 +1,10 @@
1
+ export declare const POSIX_OPENCLAW_TMP_DIR = "/tmp/openclaw";
2
+ type ResolvePreferredOpenClawTmpDirOptions = {
3
+ accessSync?: (path: string, mode?: number) => void;
4
+ statSync?: (path: string) => {
5
+ isDirectory(): boolean;
6
+ };
7
+ tmpdir?: () => string;
8
+ };
9
+ export declare function resolvePreferredOpenClawTmpDir(options?: ResolvePreferredOpenClawTmpDirOptions): string;
10
+ export {};
@@ -1,7 +1,7 @@
1
1
  import { Logger as TsLogger } from "tslog";
2
2
  import type { ConsoleStyle } from "./console.js";
3
3
  import { type LogLevel } from "./levels.js";
4
- export declare const DEFAULT_LOG_DIR = "/tmp/openclaw";
4
+ export declare const DEFAULT_LOG_DIR: string;
5
5
  export declare const DEFAULT_LOG_FILE: string;
6
6
  export type LoggerSettings = {
7
7
  level?: LogLevel;