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