activeclaw 2026.2.11 → 2026.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +106 -0
- package/dist/{accounts-DbzMEfKN.js → accounts-DCDeFTra.js} +2 -2
- package/dist/{accounts-C2elk6PC.js → accounts-DeqIQjo1.js} +2 -2
- package/dist/{acp-cli-CVFTdsQY.js → acp-cli-CeYI4XRd.js} +15 -16
- package/dist/{acp-cli-BpJwIyLl.js → acp-cli-rNbGXICg.js} +14 -15
- package/dist/{agent-Bz1r5O8q.js → agent-BvNJF5QL.js} +19 -15
- package/dist/{agent-22-R4bNS.js → agent-CyMxTyrG.js} +20 -16
- package/dist/{agent-scope-D8miw9q_.js → agent-scope-BIEhVP4_.js} +172 -4
- package/dist/{agent-scope-CGmuusG9.js → agent-scope-CQCus0rI.js} +3 -3
- package/dist/{agent-scope-DQuy3dwI.js → agent-scope-CsRbLH4l.js} +4 -4
- package/dist/{agent-scope-BEf5crnU.js → agent-scope-DPIFau3f.js} +5 -1
- package/dist/audio-preflight-BU8W7uxc.js +60 -0
- package/dist/audio-preflight-CGsumMzb.js +60 -0
- package/dist/audio-preflight-SLmkJI6-.js +74 -0
- package/dist/audio-preflight-jZc5mFCZ.js +71 -0
- package/dist/{audit-C4wLaF0D.js → audit-Dmww_503.js} +71 -19
- package/dist/{audit-CY-yopxa.js → audit-wPu26VMb.js} +72 -20
- package/dist/{tailscale-DU6DgqVy.js → auth-9x3lqfIY.js} +208 -3
- package/dist/{tailscale-Cu-2HNvU.js → auth-CQNl_IaI.js} +190 -3
- package/dist/{auth-health-BFKUoCwJ.js → auth-health-C4L4FGBA.js} +1 -1
- package/dist/{auth-health-d7BMZlWG.js → auth-health-j6epgQbq.js} +1 -1
- package/dist/{auth-profiles-Bv1AEm-Y.js → auth-profiles-ByNs3eEm.js} +87 -31
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +28 -22
- package/dist/bundled/session-memory/handler.js +33 -22
- package/dist/{call-7yrB6v4I.js → call-DVYCIV8m.js} +5 -5
- package/dist/{call-Bek1xlgk.js → call-SolyGS1r.js} +6 -6
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{channel-options-3mdYN0C_.js → channel-options-BwC2yQcR.js} +4 -4
- package/dist/{channel-options-DJ0b1m7B.js → channel-options-Cq9BVDkP.js} +12 -7
- package/dist/{channel-selection-RZimme3j.js → channel-selection-D4D6ImhN.js} +2 -2
- package/dist/{channel-selection-B9b7Kuit.js → channel-selection-MZAHm4U8.js} +2 -2
- package/dist/{channels-cli-CYbK2Dku.js → channels-cli-9Dsk9Qm7.js} +57 -53
- package/dist/{channels-cli-BFznbGOs.js → channels-cli-BJUppQll.js} +59 -55
- package/dist/{channels-status-issues-B3KkflfR.js → channels-status-issues-D7GSV1GS.js} +1 -1
- package/dist/{channels-status-issues-DQkRaZts.js → channels-status-issues-DDAWeT-6.js} +1 -1
- package/dist/{chrome-Db7w64LF.js → chrome-BfB6JdKF.js} +4 -4
- package/dist/{chrome-Dm-EgOjJ.js → chrome-Cvr-57lg.js} +6 -5
- package/dist/{chrome-CF16STk9.js → chrome-DL0avO8n.js} +2 -1
- package/dist/{chrome-yIKmOzCO.js → chrome-foEwx3lN.js} +5 -4
- package/dist/{clack-prompter-BCiBkJVr.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-Cl3PdJei.js → cli-ZR9ugUBX.js} +42 -38
- package/dist/cli-miPe4Ujz.js +93 -0
- package/dist/{client-6xKrRC-1.js → client-BrYfyoDK.js} +54 -5
- package/dist/{client-DMloFP_O.js → client-CTwXnRl7.js} +54 -5
- package/dist/{command-format-ayFsmwwz.js → command-format-Bxe0mWee.js} +1 -1
- package/dist/{command-options-BTAzyqqb.js → command-options-BvgxzPbK.js} +9 -4
- package/dist/{commands-CjEGXOZ_.js → commands-BX_OIIVR.js} +4 -4
- package/dist/{completion-cli-DrJGfJGl.js → completion-cli-CR77-jyv.js} +3 -3
- package/dist/{completion-cli-DOec3E2Z.js → completion-cli-DnjpxAag.js} +30 -30
- package/dist/{config-B00lvFac.js → config-Bdhomfei.js} +21 -7
- package/dist/{config-XBdA0ciN.js → config-BvMsmctM.js} +83 -9
- package/dist/{config-BqGVMf1y.js → config-QYrbd7x7.js} +60 -6
- package/dist/{config--NUdpACy.js → config-aFQssWKX.js} +21 -7
- package/dist/{config-guard-4kCO_rnQ.js → config-guard-CljaSxJd.js} +160 -51
- package/dist/{configure-B69emwZv.js → configure-BXLiucXo.js} +28 -25
- package/dist/{configure-sMhpLzFf.js → configure-BYPqXzGZ.js} +28 -25
- package/dist/control-auth-8Cf4WXpR.js +54 -0
- package/dist/control-auth-DBCu3qyv.js +54 -0
- package/dist/{control-service-Db_1V-KY.js → control-service-B5KnPqGP.js} +11 -5
- package/dist/{control-service-IRAmbcbN.js → control-service-DKnttEus.js} +10 -4
- package/dist/control-ui/assets/{index-CnB9IO4a.js → index-B4LPvte9.js} +369 -369
- package/dist/control-ui/assets/index-B4LPvte9.js.map +1 -0
- package/dist/control-ui/index.html +1 -1
- package/dist/{cron-cli-Cum2324v.js → cron-cli-D7BRjDv2.js} +20 -20
- package/dist/{cron-cli-DhUWcYdk.js → cron-cli-z1zk_FXQ.js} +19 -19
- package/dist/{daemon-cli-q7nkEF5-.js → daemon-cli-BDkU2ocb.js} +60 -21
- package/dist/{daemon-cli-CTC2CHci.js → daemon-cli-cNSF93-v.js} +59 -20
- package/dist/{daemon-runtime-c0uXH4Dl.js → daemon-runtime-B0tg_LsX.js} +3 -3
- package/dist/{daemon-runtime-UsK-tOty.js → daemon-runtime-Bsjeut6m.js} +3 -3
- package/dist/{deliver-hf-WKyWd.js → deliver-CIU9Npgs.js} +373 -281
- package/dist/{deliver-CT6KiDqO.js → deliver-DYYCo1G7.js} +369 -278
- package/dist/{deliver-T9d44OpZ.js → deliver-LsxKETro.js} +371 -279
- package/dist/{deliver-CPy8jYj9.js → deliver-xUU3mGHo.js} +369 -277
- package/dist/{deps-Bv1kLtwo.js → deps-QSwGcoNZ.js} +2 -2
- package/dist/{deps-DFQdAWQc.js → deps-lAAA2zYI.js} +2 -2
- package/dist/{devices-cli-Cm7U1py9.js → devices-cli-BG3-2oqt.js} +14 -14
- package/dist/{devices-cli-ZpjlfK-e.js → devices-cli-VIQtOvt_.js} +14 -14
- package/dist/{directory-cli-B14TUSJA.js → directory-cli-BCJwjVC0.js} +16 -16
- package/dist/{directory-cli-67kzd4I5.js → directory-cli-jYzZ02gk.js} +14 -14
- package/dist/{dispatcher-3ElQWGVI.js → dispatcher-DY51b-Zc.js} +2 -2
- package/dist/{dns-cli-CU-xfhTN.js → dns-cli-DHIiMJjS.js} +12 -12
- package/dist/{dns-cli-Dqj7O6Q_.js → dns-cli-pZlv87Ib.js} +11 -11
- package/dist/{docs-cli-CamBqzb5.js → docs-cli-2JDiwfzP.js} +8 -8
- package/dist/{docs-cli-Cj3L5oqB.js → docs-cli-BhkYqoIQ.js} +7 -7
- package/dist/{doctor-BV1kvbMm.js → doctor-Bf8EhNtA.js} +36 -35
- package/dist/{doctor-BJirShBi.js → doctor-sYG5V4Co.js} +34 -33
- package/dist/entry.js +56 -18
- package/dist/{env-BxRc6wWv.js → env-ONzUVAG2.js} +1 -1
- package/dist/{exec-CijMSZd9.js → exec-B8lXct-k.js} +503 -14
- package/dist/{exec-B8JKbXKW.js → exec-CACT5OAW.js} +1 -1
- package/dist/{exec-57A8Rlc8.js → exec-CJFFoM7H.js} +32 -13
- package/dist/{exec-Cv_Ofd1m.js → exec-YIosokWE.js} +1 -1
- package/dist/{exec-approvals-cli-DEzz9Iai.js → exec-approvals-cli-7LH0lwhO.js} +21 -21
- package/dist/{exec-approvals-cli-DhXj3hQX.js → exec-approvals-cli-apGnQbpj.js} +21 -21
- package/dist/extensionAPI.js +7733 -8746
- package/dist/fetch-DmiOpALK.js +274 -0
- package/dist/fetch-timeout-BEtUjM1S.js +274 -0
- package/dist/fetch-timeout-DEoXG_SF.js +274 -0
- package/dist/fetch-timeout-DTK9vxex.js +274 -0
- package/dist/{gateway-cli-D1EdIq8I.js → gateway-cli-DUdYxlZS.js} +491 -136
- package/dist/{gateway-cli-B_xDUDy2.js → gateway-cli-DbvWmE-9.js} +495 -140
- package/dist/{gateway-rpc-3B5y445n.js → gateway-rpc-BByb2Snz.js} +3 -3
- package/dist/{gateway-rpc-BoL2vinh.js → gateway-rpc-wXSCUZXj.js} +3 -3
- package/dist/{github-copilot-auth-Omqrto0J.js → github-copilot-auth-D7ewvpMd.js} +205 -17
- package/dist/{github-copilot-auth-CZxurvdz.js → github-copilot-auth-DDispnyz.js} +205 -17
- package/dist/{github-copilot-token-SLWintYd.js → github-copilot-token-Cfs0Wxr8.js} +1 -1
- package/dist/{gmail-setup-utils-BXQKsLtI.js → gmail-setup-utils-Cfns8TQx.js} +3 -3
- package/dist/{gmail-setup-utils-CHcssBOA.js → gmail-setup-utils-DJb-_5kO.js} +4 -4
- package/dist/{health-format-Dy1caGsq.js → health-format-KGPokKJH.js} +97 -42
- package/dist/{health-format-DrGFg8bx.js → health-format-LZDxu3rv.js} +95 -40
- package/dist/{help-format-DAj7l5uV.js → help-format-C48TXngO.js} +1 -1
- package/dist/{help-format-CUnac_bT.js → help-format-R5fLToDw.js} +1 -1
- package/dist/{hooks-cli-ptEf6TIM.js → hooks-cli-CT8JCRkH.js} +51 -46
- package/dist/{hooks-cli-Bhf5VRp1.js → hooks-cli-S1MKumJO.js} +49 -44
- package/dist/{hooks-status-Br-2bK2G.js → hooks-status-Cw0xD8Lt.js} +3 -3
- package/dist/{hooks-status-DNQJSa4B.js → hooks-status-D9MhwHRp.js} +3 -3
- package/dist/{image-rOFfK3PJ.js → image-Brk1sJbw.js} +10 -7
- package/dist/{image-fUwR7slg.js → image-C4Nn2p3e.js} +10 -7
- package/dist/{image-Ds4NLGPR.js → image-DgtfXMcX.js} +9 -6
- package/dist/{image-Dnnxt82I.js → image-RKwc3fsL.js} +8 -5
- package/dist/index.js +208 -97
- package/dist/{installs-CRSjQxbR.js → installs-CrLcWYHe.js} +8 -7
- package/dist/{installs-89zeUsVn.js → installs-DscWb9b9.js} +8 -7
- package/dist/{links-7M-j83As.js → links-B8LAzWwg.js} +1 -1
- package/dist/{links-C591fM9M.js → links-Eax1UO3w.js} +1 -1
- package/dist/llm-slug-generator.js +18 -19
- package/dist/{loader-wXwp4rZJ.js → loader-KjT074JR.js} +5722 -6888
- package/dist/{logging-MMRGFxGI.js → logging-BAyPwvdH.js} +1 -1
- package/dist/{logging-DuK6YXuK.js → logging-CRq4h04P.js} +2 -2
- package/dist/{login-qr-wM8BnKJh.js → login-qr-B6ZgAuIf.js} +5 -5
- package/dist/{login-qr-CPEsT6dN.js → login-qr-Bua-p0nG.js} +3 -4
- package/dist/{login-qr-CGEu5TU-.js → login-qr-CuvemJj4.js} +6 -6
- package/dist/{login-qr-DH150tTp.js → login-qr-Djr1JfIf.js} +2 -2
- package/dist/{logs-cli-ClgkHnfT.js → logs-cli-9IAV7rWY.js} +38 -22
- package/dist/{logs-cli-CmfINsOj.js → logs-cli-EiKzUFPa.js} +37 -21
- package/dist/{manager-DYo4PlVM.js → manager-BIMh_eSm.js} +7 -8
- package/dist/{manager-D6EbxDV4.js → manager-CwinWQoz.js} +5 -5
- package/dist/{manager-BbnHek5T.js → manager-DkqF1GiK.js} +9 -9
- package/dist/{manager-CcVYv0N5.js → manager-T1XfGchB.js} +8 -8
- package/dist/{manifest-registry-3It8Z8yN.js → manifest-registry-CQhdnDBZ.js} +40 -2
- package/dist/{manifest-registry-D5SiA3xq.js → manifest-registry-u0okVSkU.js} +40 -2
- package/dist/{message-channel-Cu61-7H6.js → message-channel-BLi2a6Yw.js} +1 -1
- package/dist/{message-channel-BlgPSDAh.js → message-channel-C_MmebBt.js} +1 -1
- package/dist/{model-auth-ioeR_zLX.js → model-auth-CabXIF6O.js} +116 -34
- package/dist/{model-selection-BK7DuyH8.js → model-selection-BLuqsGVB.js} +86 -30
- package/dist/{model-selection-CezC36lH.js → model-selection-C1GmkTAV.js} +84 -28
- package/dist/{models-cli-C3uGdOrd.js → models-cli-9jmDv-h3.js} +52 -48
- package/dist/{models-cli-CUIVPgXE.js → models-cli-zS9rtWz8.js} +53 -49
- package/dist/{node-cli-BxBGSuPE.js → node-cli-CrpTxTTs.js} +28 -26
- package/dist/{node-cli-CdYAsuQQ.js → node-cli-wemUMCg-.js} +28 -26
- package/dist/{node-service-u8g85nD3.js → node-service-C8DTHTMg.js} +2 -2
- package/dist/{node-service-CM5vkdIo.js → node-service-WQuEKz6W.js} +2 -2
- package/dist/{nodes-cli-By6yeCTB.js → nodes-cli-BaU2SIFw.js} +20 -20
- package/dist/{nodes-cli-BaVMTAPc.js → nodes-cli-Dx23D72n.js} +20 -20
- package/dist/{nodes-screen-Dvl_ohUY.js → nodes-screen-C0IuBqUL.js} +1 -1
- package/dist/{note-5WqioBRA.js → note-BhRSeNeu.js} +2 -2
- package/dist/{note-Ci08TSbV.js → note-hhtubr2j.js} +1 -1
- package/dist/{onboard-channels-DxXvp8og.js → onboard-channels-C501x8GI.js} +8 -8
- package/dist/{onboard-channels-CXhnVy4E.js → onboard-channels-Dxzroasd.js} +8 -8
- package/dist/{onboard-skills-CBxsRGyf.js → onboard-skills-DV0Qzvjj.js} +440 -136
- package/dist/{onboard-skills-DQwOQ6Ry.js → onboard-skills-rlBHcu3Q.js} +439 -135
- package/dist/{onboarding-Du_7qEng.js → onboarding-CN-EDLjd.js} +38 -38
- package/dist/{openclaw-root-JLDMp6ux.js → openclaw-root-1VeFrph_.js} +4 -0
- package/dist/{openclaw-root-Dw6gumSU.js → openclaw-root-BNlEap4i.js} +4 -0
- package/dist/{pairing-cli-CRQDpj8f.js → pairing-cli-CDHG4xuI.js} +15 -15
- package/dist/{pairing-cli-Cng1KFWw.js → pairing-cli-CQP34Dlx.js} +15 -15
- package/dist/{pairing-labels-Ciu3Zoxj.js → pairing-labels-B6CN0SNH.js} +1 -1
- package/dist/{pairing-labels-CWFEtSc3.js → pairing-labels-CgNHnjzT.js} +1 -1
- package/dist/{pairing-store-c-QQ2u8p.js → pairing-store-CmlRVqOz.js} +2 -2
- package/dist/{pairing-store-CgXR3ZWJ.js → pairing-store-Dp5_JGnG.js} +3 -3
- package/dist/{path-env-CXWUFfFv.js → path-env-CLvYNwtL.js} +1 -1
- package/dist/{path-env-BgLvMbz_.js → path-env-CaYUVIML.js} +2 -2
- package/dist/{paths-MnZaxqPw.js → paths-B0a4ywSO.js} +30 -5
- package/dist/{paths-Bkhd_qY8.js → paths-B49s6UZQ.js} +30 -5
- package/dist/{paths-DL6EIRTw.js → paths-D0O87MfH.js} +30 -5
- package/dist/{paths-IivnSNkP.js → paths-DLINmNFQ.js} +31 -6
- package/dist/{pi-embedded-CgPTEqlB.js → pi-embedded-Ctrt2kz0.js} +8759 -9600
- package/dist/{pi-embedded-helpers-DYH6OWft.js → pi-embedded-helpers-CMKLjW6X.js} +68 -9
- package/dist/{pi-embedded-helpers-y1_Se0yq.js → pi-embedded-helpers-CUzTc1v6.js} +241 -24
- package/dist/{pi-embedded-helpers-Bkpd4fTr.js → pi-embedded-helpers-DfwkwPYD.js} +67 -8
- package/dist/{pi-embedded-helpers-BbWRSUnc.js → pi-embedded-helpers-WDwx99UA.js} +347 -32
- package/dist/{pi-tools.policy-akYsGFiA.js → pi-tools.policy-BpsROZbz.js} +4 -4
- package/dist/{plugin-auto-enable-lZwe2yX5.js → plugin-auto-enable-Bqhc3w5n.js} +5 -5
- package/dist/{plugin-auto-enable-AOSOJ-v1.js → plugin-auto-enable-PW76g_PJ.js} +5 -5
- package/dist/plugin-sdk/agents/bash-process-registry.d.ts +1 -0
- package/dist/plugin-sdk/agents/models-config.providers.d.ts +10 -0
- package/dist/plugin-sdk/agents/pi-embedded-helpers/errors.d.ts +5 -1
- package/dist/plugin-sdk/agents/pi-embedded-helpers.d.ts +1 -1
- package/dist/plugin-sdk/agents/pi-embedded-runner/google.d.ts +1 -0
- package/dist/plugin-sdk/agents/pi-embedded-runner/run/params.d.ts +2 -0
- package/dist/plugin-sdk/agents/pi-embedded-runner/run/payloads.d.ts +1 -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/tools/browser-tool.schema.d.ts +1 -1
- package/dist/plugin-sdk/agents/tools/web-search.d.ts +10 -1
- package/dist/plugin-sdk/agents/usage.d.ts +1 -0
- package/dist/plugin-sdk/auto-reply/heartbeat.d.ts +1 -1
- package/dist/plugin-sdk/auto-reply/reply/get-reply-directives.d.ts +1 -0
- package/dist/plugin-sdk/auto-reply/reply/mentions.d.ts +1 -0
- package/dist/plugin-sdk/auto-reply/reply/model-selection.d.ts +3 -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/auto-reply/types.d.ts +2 -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/commands/onboard-types.d.ts +7 -1
- 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/types.memory.d.ts +2 -0
- package/dist/plugin-sdk/config/zod-schema.agents.d.ts +1 -0
- package/dist/plugin-sdk/config/zod-schema.d.ts +13 -1
- package/dist/plugin-sdk/config/zod-schema.hooks.d.ts +1 -1
- 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/cron/service/jobs.d.ts +8 -0
- package/dist/plugin-sdk/cron/service/state.d.ts +1 -0
- package/dist/plugin-sdk/cron/types.d.ts +2 -0
- package/dist/plugin-sdk/discord/monitor/allow-list.d.ts +15 -0
- package/dist/plugin-sdk/discord/send.types.d.ts +5 -0
- package/dist/plugin-sdk/gateway/auth.d.ts +36 -0
- package/dist/plugin-sdk/gateway/protocol/index.d.ts +0 -3
- package/dist/plugin-sdk/gateway/protocol/schema/agent.d.ts +7 -1
- package/dist/plugin-sdk/gateway/session-utils.fs.d.ts +3 -1
- package/dist/plugin-sdk/index.js +935 -660
- package/dist/plugin-sdk/infra/binaries.d.ts +3 -0
- package/dist/plugin-sdk/infra/heartbeat-active-hours.d.ts +5 -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/console.d.ts +1 -0
- package/dist/plugin-sdk/logging/logger.d.ts +1 -1
- package/dist/plugin-sdk/logging/state.d.ts +1 -0
- package/dist/plugin-sdk/markdown/ir.d.ts +1 -1
- package/dist/plugin-sdk/markdown/whatsapp.d.ts +14 -0
- package/dist/plugin-sdk/media/input-files.d.ts +5 -0
- package/dist/plugin-sdk/media-understanding/audio-preflight.d.ts +16 -0
- package/dist/plugin-sdk/media-understanding/types.d.ts +1 -0
- package/dist/plugin-sdk/memory/backend-config.d.ts +2 -1
- package/dist/plugin-sdk/memory/qmd-manager.d.ts +2 -0
- package/dist/plugin-sdk/memory/qmd-query-parser.d.ts +8 -0
- package/dist/plugin-sdk/process/command-queue.d.ts +16 -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/plugin-sdk/slack/monitor/commands.d.ts +5 -0
- package/dist/plugin-sdk/telegram/bot-message-context.d.ts +2 -1
- package/dist/plugin-sdk/telegram/send.d.ts +3 -0
- package/dist/plugin-sdk/web/media.d.ts +2 -0
- package/dist/{plugins-Db5BiELK.js → plugins-4Hqd1WGf.js} +3 -3
- package/dist/{plugins-CNaHNND_.js → plugins-X7d_tfTE.js} +4 -4
- package/dist/{plugins-cli-8G-hQPCu.js → plugins-cli-Bgku3EGj.js} +253 -44
- package/dist/{plugins-cli-CDiocaDE.js → plugins-cli-CVToH3if.js} +257 -48
- package/dist/{ports-BeebfNCb.js → ports-qkt29rdC.js} +2 -2
- package/dist/{program-0Cj9YxRN.js → program-Cf7lkBur.js} +82 -80
- package/dist/{progress-DIQJt9Va.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-CjQRlDx4.js → prompt-style-CIbmaxSa.js} +1 -1
- package/dist/{pw-ai-C43wv1ZF.js → pw-ai-8mdv3h-d.js} +7 -6
- package/dist/{pw-ai-COWYvUfG.js → pw-ai-CM1IsSgZ.js} +6 -6
- package/dist/{pw-ai-BxJ-KCIy.js → pw-ai-FGoRVblI.js} +5 -6
- package/dist/{pw-ai-CsvaObGM.js → pw-ai-sS1fRKW_.js} +3 -3
- package/dist/{qmd-manager-CpsjQyaZ.js → qmd-manager-C67Fc8aN.js} +79 -26
- package/dist/{qmd-manager-C9YWFeG6.js → qmd-manager-CXVbfg99.js} +81 -26
- package/dist/{qmd-manager-C02E8ixK.js → qmd-manager-RMRE8Tqt.js} +81 -26
- package/dist/{qmd-manager-BzY2LQTT.js → qmd-manager-pyc_MTIe.js} +78 -23
- package/dist/{register.subclis-DUkirdHn.js → register.subclis-C02e4zuJ.js} +29 -29
- package/dist/{reply--b7BsXGP.js → reply-DICXkh_C.js} +7289 -8455
- package/dist/{routes-DUkEKAc1.js → routes-CmOI1hIH.js} +29 -11
- package/dist/{routes-B4QQiFju.js → routes-DewK5tq2.js} +29 -12
- package/dist/{rpc-CuMtxrRT.js → rpc-DHr30euf.js} +3 -3
- package/dist/{rpc-Blt6MJ4F.js → rpc-T300F8zI.js} +3 -3
- package/dist/{run-main-XZcPA23b.js → run-main-C5wpthq1.js} +84 -82
- package/dist/runner-CY0nmVme.js +1886 -0
- package/dist/runner-Cfm5nTMc.js +1785 -0
- package/dist/runner-D_dujMod.js +1886 -0
- package/dist/runner-DrGYLH5K.js +1785 -0
- package/dist/{sandbox-Aks-9EcZ.js → sandbox-BKYnhYQH.js} +24 -17
- package/dist/{sandbox-DqUO2K83.js → sandbox-Bhjnh1Xg.js} +23 -16
- package/dist/{sandbox-cli-C99Thxi8.js → sandbox-cli-DBsAjZJN.js} +21 -21
- package/dist/{sandbox-cli-CJqRM4V6.js → sandbox-cli-rV9LtFeu.js} +21 -21
- package/dist/{security-cli-iqYLMOz3.js → security-cli-BIwJM_rs.js} +27 -27
- package/dist/{security-cli-DW3lCz-o.js → security-cli-BRjny8Yu.js} +27 -27
- package/dist/{server-context-fX4xiYRh.js → server-context-BGpGs3qd.js} +7 -7
- package/dist/{server-context-8Qt35QdF.js → server-context-Cl0U0vE3.js} +7 -7
- package/dist/{server-node-events-CHWXfb_T.js → server-node-events-CBfTbiTA.js} +48 -44
- package/dist/{server-node-events-BzrEnKLX.js → server-node-events-QCvh8EgI.js} +45 -41
- package/dist/{service-Cd4BxKuo.js → service--nPk7DvT.js} +8 -4
- package/dist/{service-DDPRbf8a.js → service-99RDXwX4.js} +8 -4
- package/dist/{service-audit-CCFxuvKs.js → service-audit-DnLmRGQt.js} +4 -4
- package/dist/{service-audit-x6jCN-6a.js → service-audit-ckBaRCVC.js} +4 -4
- package/dist/{session-cost-usage-CcCEQNuc.js → session-cost-usage-D7HuoSSD.js} +12 -10
- package/dist/{session-cost-usage-PvyVZz-g.js → session-cost-usage-D9hHANWI.js} +12 -10
- package/dist/{shared-ILguacOr.js → shared-Bs4vduG4.js} +3 -3
- package/dist/{shared-CagUDdmp.js → shared-CEY5IkwG.js} +3 -3
- package/dist/{shared-gOyV38rM.js → shared-DRohONn_.js} +4 -4
- package/dist/{shared-BDk_zC9p.js → shared-ICqOZibV.js} +4 -4
- package/dist/{skill-scanner-C_fQzVDu.js → skill-scanner-CucvxYhu.js} +1 -1
- package/dist/{skill-scanner-DrVEHfC6.js → skill-scanner-rHMtUHtP.js} +1 -1
- package/dist/{skills-D5UZZZSY.js → skills-DRjfSQT3.js} +141 -6
- package/dist/{skills-ccAgQ3Ad.js → skills-DprQj9X2.js} +142 -7
- package/dist/{skills-cli-DQilTG3n.js → skills-cli-9WO-C55s.js} +12 -12
- package/dist/{skills-cli-ggyLBtAY.js → skills-cli-B9eej-EW.js} +13 -13
- package/dist/{skills-status-BosMnzIs.js → skills-status-5U3P3YfJ.js} +3 -3
- package/dist/{skills-status-DjtPPMnY.js → skills-status-TDIgVd1K.js} +2 -2
- package/dist/{sqlite-B7FPASCO.js → sqlite-BINzs1U0.js} +2 -2
- package/dist/{sqlite-Btrgi7-j.js → sqlite-D4w5TejA.js} +3 -3
- package/dist/{sqlite-BrQ9tw8B.js → sqlite-DRRHmlug.js} +3 -3
- package/dist/{sqlite-HepBVDoX.js → sqlite-F6PGkEm1.js} +2 -2
- package/dist/{status-BByCntWS.js → status-BKGkKC_v.js} +3 -3
- package/dist/{status-Dt7RE_Yy.js → status-CiHtHdaa.js} +4 -4
- package/dist/{status-zfL4Yej7.js → status-DDWoOpeB.js} +37 -37
- package/dist/{subsystem-Bh1Y_6Uv.js → subsystem-BoExtIHo.js} +52 -17
- package/dist/{system-cli-DwuUkdkH.js → system-cli-B6lr60Io.js} +14 -14
- package/dist/{system-cli-Clqsx8U5.js → system-cli-CprW9G3h.js} +14 -14
- package/dist/{systemd-BEWwfwn0.js → systemd-C0VZriGM.js} +3 -3
- package/dist/{systemd-D6wTPnHi.js → systemd-DrmBtJ5T.js} +3 -3
- package/dist/{systemd-hints-zi4ohCOY.js → systemd-hints-DZtXiVHa.js} +1 -1
- package/dist/{systemd-linger-CDo2UbHM.js → systemd-linger-NC2kl1SC.js} +2 -2
- package/dist/{systemd-linger-BxjTrgoH.js → systemd-linger-xdn3BdPh.js} +2 -2
- package/dist/{table-DEnmtvl5.js → table-B8dx3v4v.js} +2 -2
- package/dist/{table-cCoGqLsk.js → table-CwulTLQp.js} +1 -1
- package/dist/{tool-display-DskiU8Kt.js → tool-display-CZRIDMRm.js} +2 -2
- package/dist/{tool-display-o-dDAlqF.js → tool-display-ClRud3pg.js} +2 -2
- package/dist/{tui-BdJWZdto.js → tui-CVTQn-dC.js} +14 -13
- package/dist/{tui-Bc7XUQGP.js → tui-Lu8FdrlK.js} +13 -14
- package/dist/{tui-cli-BGYh0UL0.js → tui-cli-BLpTj1X9.js} +27 -27
- package/dist/{tui-cli-D3n-O9zB.js → tui-cli-BLx5kL2I.js} +26 -26
- package/dist/{tui-formatters-CA85v4U2.js → tui-formatters-CNySEfJN.js} +6 -6
- package/dist/{tui-formatters-C3NarH24.js → tui-formatters-DePhZK3J.js} +6 -6
- package/dist/{update-JB16aPIY.js → update-DHVxMTpQ.js} +3 -3
- package/dist/{update-Ct9sqJC_.js → update-DU1geolI.js} +3 -3
- package/dist/{update-cli-wWKDS3cm.js → update-cli-C0hUvJWK.js} +89 -71
- package/dist/{update-cli-DDXp_N9B.js → update-cli-Wb1GB3rL.js} +88 -70
- package/dist/{update-runner-ChTf6O6p.js → update-runner--ixK4J3W.js} +11 -11
- package/dist/{update-runner-CmE6cHdn.js → update-runner-7Qa1T9y6.js} +10 -10
- package/dist/{utils-Dk86IbEs.js → utils-BLJAc3ZV.js} +1 -1
- package/dist/{utils-es4ygvQ-.js → utils-Cd9QdCHh.js} +1 -1
- package/dist/{webhooks-cli-CVIE9TtX.js → webhooks-cli-DgcMy7RG.js} +12 -12
- package/dist/{webhooks-cli-BmKSiQQC.js → webhooks-cli-aVzUcJY9.js} +11 -11
- package/dist/{widearea-dns-2ah0bkAj.js → widearea-dns-BaIgNEhY.js} +3 -3
- package/dist/{widearea-dns-CMIG6-74.js → widearea-dns-DzuRdwk5.js} +3 -3
- package/dist/{ws-DtDKpbLR.js → ws-CHCQHs0F.js} +1 -1
- package/dist/{ws-log-BP3z_g6Z.js → ws-log-CIXbLCka.js} +1 -1
- package/dist/{ws-log-D7MkvKhg.js → ws-log-DcQFZByi.js} +2 -2
- package/dist/{wsl-Cwo7X0Un.js → wsl-BUOkxKJu.js} +2 -2
- package/docs/assets/install-script.svg +1 -0
- package/docs/automation/hooks.md +1 -38
- package/docs/automation/webhook.md +43 -2
- package/docs/channels/discord.md +389 -381
- package/docs/channels/imessage.md +229 -218
- package/docs/channels/slack.md +294 -415
- package/docs/channels/telegram.md +401 -505
- package/docs/channels/whatsapp.md +338 -310
- package/docs/ci.md +0 -12
- package/docs/cli/hooks.md +1 -14
- package/docs/cli/index.md +6 -1
- package/docs/cli/logs.md +4 -0
- package/docs/cli/onboard.md +30 -0
- package/docs/cli/plugins.md +20 -1
- package/docs/cli/security.md +1 -0
- package/docs/concepts/memory.md +7 -4
- package/docs/concepts/session-tool.md +1 -0
- package/docs/docs.json +11 -11
- package/docs/gateway/configuration-examples.md +9 -2
- package/docs/gateway/configuration-reference.md +2329 -0
- package/docs/gateway/configuration.md +338 -3304
- package/docs/gateway/index.md +162 -238
- 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/hetzner.md +21 -0
- package/docs/install/installer.md +20 -0
- package/docs/nodes/audio.md +19 -0
- package/docs/platforms/mac/release.md +7 -7
- package/docs/providers/glm.md +3 -3
- package/docs/providers/index.md +1 -0
- package/docs/providers/litellm.md +153 -0
- package/docs/providers/zai.md +2 -2
- package/docs/reference/templates/AGENTS.md +26 -26
- package/docs/reference/templates/HEARTBEAT.md +31 -2
- package/docs/reference/templates/SOUL.md +14 -8
- package/docs/reference/transcript-hygiene.md +18 -0
- package/docs/start/getting-started.md +5 -0
- package/docs/start/wizard-cli-automation.md +17 -0
- package/docs/start/wizard-cli-reference.md +12 -0
- package/docs/tools/browser.md +6 -0
- package/docs/zh-CN/automation/hooks.md +1 -38
- package/docs/zh-CN/cli/hooks.md +1 -14
- package/extensions/bluebubbles/package.json +1 -1
- package/extensions/bluebubbles/src/monitor.test.ts +40 -28
- package/extensions/bluebubbles/src/monitor.ts +0 -4
- package/extensions/copilot-proxy/package.json +1 -1
- package/extensions/diagnostics-otel/package.json +10 -10
- package/extensions/discord/package.json +1 -1
- package/extensions/feishu/package.json +2 -5
- package/extensions/feishu/src/bot.checkBotMentioned.test.ts +64 -0
- package/extensions/feishu/src/bot.ts +1 -1
- package/extensions/feishu/src/channel.test.ts +48 -0
- package/extensions/feishu/src/channel.ts +1 -3
- package/extensions/feishu/src/config-schema.ts +6 -0
- package/extensions/feishu/src/docx.ts +14 -4
- package/extensions/feishu/src/media.test.ts +151 -0
- package/extensions/feishu/src/media.ts +27 -13
- 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/google-antigravity-auth/package.json +1 -1
- package/extensions/google-gemini-cli-auth/package.json +1 -1
- package/extensions/googlechat/package.json +1 -1
- package/extensions/imessage/package.json +1 -1
- package/extensions/irc/package.json +1 -1
- package/extensions/irc/src/client.ts +1 -1
- package/extensions/line/package.json +1 -1
- package/extensions/llm-task/package.json +1 -1
- package/extensions/lobster/package.json +1 -1
- package/extensions/matrix/CHANGELOG.md +6 -0
- package/extensions/matrix/package.json +2 -2
- package/extensions/mattermost/package.json +1 -1
- package/extensions/memory-core/package.json +1 -1
- package/extensions/memory-lancedb/index.ts +6 -2
- package/extensions/memory-lancedb/package.json +2 -2
- package/extensions/minimax-portal-auth/index.ts +7 -5
- package/extensions/minimax-portal-auth/package.json +1 -1
- package/extensions/msteams/CHANGELOG.md +6 -0
- package/extensions/msteams/package.json +1 -1
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nostr/CHANGELOG.md +6 -0
- package/extensions/nostr/package.json +2 -2
- package/extensions/open-prose/package.json +1 -1
- package/extensions/signal/package.json +1 -1
- package/extensions/slack/package.json +1 -1
- package/extensions/telegram/package.json +1 -1
- package/extensions/tlon/package.json +1 -1
- package/extensions/twitch/CHANGELOG.md +6 -0
- package/extensions/twitch/package.json +1 -1
- package/extensions/voice-call/CHANGELOG.md +6 -0
- package/extensions/voice-call/package.json +1 -1
- package/extensions/voice-call/src/media-stream.ts +7 -1
- package/extensions/voice-call/src/providers/twilio.test.ts +5 -3
- package/extensions/voice-call/src/providers/twilio.ts +12 -1
- package/extensions/whatsapp/package.json +1 -1
- package/extensions/zalo/CHANGELOG.md +6 -0
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalouser/CHANGELOG.md +6 -0
- package/extensions/zalouser/package.json +1 -1
- package/package.json +26 -22
- package/dist/auth-BcNHFK-i.js +0 -184
- package/dist/auth-BvIPpm7G.js +0 -184
- package/dist/boolean-M-esQJt6.js +0 -30
- package/dist/bundled/soul-evil/HOOK.md +0 -71
- package/dist/bundled/soul-evil/handler.js +0 -194
- package/dist/cli-DJbWJ9aB.js +0 -89
- package/dist/config-CI7EpvlP.js +0 -15
- package/dist/control-ui/assets/index-CnB9IO4a.js.map +0 -1
- package/dist/date-time-c6HTX6IW.js +0 -187
- package/dist/frontmatter-xwTm0734.js +0 -105
- package/dist/parse-duration-De_tAQSe.js +0 -24
- package/dist/session-key-nXYQSv-a.js +0 -167
- package/dist/utils-dp_OM900.js +0 -476
- package/docs/hooks/soul-evil.md +0 -69
- package/docs/zh-CN/hooks/soul-evil.md +0 -72
- /package/dist/{archive-CXhvR9nU.js → archive-beaSfAzA.js} +0 -0
- /package/dist/{brew-BIrWdDps.js → brew-BUIxHEkn.js} +0 -0
- /package/dist/{brew-B7YK4ZoL.js → brew-ROHf0-Xp.js} +0 -0
- /package/dist/{cli-utils-PlLcDZlM.js → cli-utils-CRhVAaLV.js} +0 -0
- /package/dist/{cli-utils-R-ECs5cY.js → cli-utils-LcHOt63h.js} +0 -0
- /package/dist/{command-format-BUxhT1xL.js → command-format-qUVxzqYm.js} +0 -0
- /package/dist/{constants-CNTiY-ZN.js → constants-BvQ6S8j5.js} +0 -0
- /package/dist/{constants-DuoCkWRh.js → constants-JPeoOZnw.js} +0 -0
- /package/dist/{errors-D3tYRJWG.js → errors-B91HIDPD.js} +0 -0
- /package/dist/{errors-B0eT3jVv.js → errors-Bv81hF2P.js} +0 -0
- /package/dist/{errors-x4NYs-1P.js → errors-DjZBTJJ3.js} +0 -0
- /package/dist/{exec-approvals-DGPTjO0N.js → exec-approvals-Cb4ZLukq.js} +0 -0
- /package/dist/{exec-approvals-DhmKpiIo.js → exec-approvals-DQ8TVVmj.js} +0 -0
- /package/dist/{format-CaxeRcue.js → format-CNU-Zkrz.js} +0 -0
- /package/dist/{format-DLOJPZmo.js → format-DcfK-dwd.js} +0 -0
- /package/dist/{format-duration-Be5Z7JdJ.js → format-duration-84n6_DgO.js} +0 -0
- /package/dist/{format-duration-CEmFWLyX.js → format-duration-Bo9zNKwO.js} +0 -0
- /package/dist/{format-relative-79_Y1n2Y.js → format-relative-CZOlQ2pA.js} +0 -0
- /package/dist/{format-relative-Db7eqEu8.js → format-relative-cegC_FF5.js} +0 -0
- /package/dist/{github-copilot-token-C9IJh2Pn.js → github-copilot-token-DkiRbJdR.js} +0 -0
- /package/dist/{helpers-CQI-5xS9.js → helpers-8O7IVGO-.js} +0 -0
- /package/dist/{helpers-CRzoyyXS.js → helpers-D_jqdWkd.js} +0 -0
- /package/dist/{helpers-C89IG08W.js → helpers-HyeZXsnu.js} +0 -0
- /package/dist/{is-main-WWuz28Ip.js → is-main-BWoXGz7p.js} +0 -0
- /package/dist/{logging-BzvBIA3Y.js → logging-fywhKCmE.js} +0 -0
- /package/dist/{nodes-screen-lykd2cny.js → nodes-screen-CdCWeiwy.js} +0 -0
- /package/dist/{parse-Cjiudy6x.js → parse-Bw0oH-rT.js} +0 -0
- /package/dist/{parse-DqAvJRIf.js → parse-ioZhOtha.js} +0 -0
- /package/dist/{parse-log-line-CUrpqe1w.js → parse-log-line-BoDqomM4.js} +0 -0
- /package/dist/{parse-log-line-D2UGw0wR.js → parse-log-line-DPxH1XZx.js} +0 -0
- /package/dist/{parse-timeout-DFSPLxpY.js → parse-timeout-D1XX_zN_.js} +0 -0
- /package/dist/{parse-timeout-DV8NQQWk.js → parse-timeout-DMW-z4Iz.js} +0 -0
- /package/dist/{pi-model-discovery-CV2V1HHz.js → pi-model-discovery-DqgqUyAv.js} +0 -0
- /package/dist/{pi-model-discovery-DzFOAbQt.js → pi-model-discovery-EwKVHlZB.js} +0 -0
- /package/dist/{prompts--d-6l5Ln.js → prompts-Bg96reub.js} +0 -0
- /package/dist/{redact-DAKeu7PA.js → redact-BRsnXqwD.js} +0 -0
- /package/dist/{redact-DuEEf1p1.js → redact-Br9GfacZ.js} +0 -0
- /package/dist/{redact-BOIof271.js → redact-BrXLgslJ.js} +0 -0
- /package/dist/{status-Cv36yYdi.js → status-BRZfQbJ2.js} +0 -0
- /package/dist/{status-Drziap9H.js → status-CoAy6bEC.js} +0 -0
- /package/dist/{systemd-hints-CH4pbCFD.js → systemd-hints-CXNtLw9Q.js} +0 -0
- /package/dist/{tailnet-DGRSvYuQ.js → tailnet-DATIFSsY.js} +0 -0
- /package/dist/{transcript-events-BlIONGVn.js → transcript-events-BHS7QoRl.js} +0 -0
- /package/dist/{transcript-events-C1hdue6u.js → transcript-events-Bp7fGnwv.js} +0 -0
- /package/dist/{transcript-events-CZ8CG4ht.js → transcript-events-BtNd-j6q.js} +0 -0
- /package/dist/{usage-format-6Uar63S0.js → usage-format-C4JfTbSp.js} +0 -0
- /package/dist/{usage-format-hd37en6b.js → usage-format-CpORtVCG.js} +0 -0
package/dist/auth-BcNHFK-i.js
DELETED
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
import { i as isTrustedProxyAddress, l as resolveGatewayClientIp, n as isLoopbackAddress, o as parseForwardedForClientIp } from "./ws-C0k_dhCP.js";
|
|
2
|
-
import { c as readTailscaleWhoisIdentity } from "./tailscale-DU6DgqVy.js";
|
|
3
|
-
import { timingSafeEqual } from "node:crypto";
|
|
4
|
-
|
|
5
|
-
//#region src/gateway/auth.ts
|
|
6
|
-
function safeEqual(a, b) {
|
|
7
|
-
if (a.length !== b.length) return false;
|
|
8
|
-
return timingSafeEqual(Buffer.from(a), Buffer.from(b));
|
|
9
|
-
}
|
|
10
|
-
function normalizeLogin(login) {
|
|
11
|
-
return login.trim().toLowerCase();
|
|
12
|
-
}
|
|
13
|
-
function getHostName(hostHeader) {
|
|
14
|
-
const host = (hostHeader ?? "").trim().toLowerCase();
|
|
15
|
-
if (!host) return "";
|
|
16
|
-
if (host.startsWith("[")) {
|
|
17
|
-
const end = host.indexOf("]");
|
|
18
|
-
if (end !== -1) return host.slice(1, end);
|
|
19
|
-
}
|
|
20
|
-
const [name] = host.split(":");
|
|
21
|
-
return name ?? "";
|
|
22
|
-
}
|
|
23
|
-
function headerValue(value) {
|
|
24
|
-
return Array.isArray(value) ? value[0] : value;
|
|
25
|
-
}
|
|
26
|
-
function resolveTailscaleClientIp(req) {
|
|
27
|
-
if (!req) return;
|
|
28
|
-
const forwardedFor = headerValue(req.headers?.["x-forwarded-for"]);
|
|
29
|
-
return forwardedFor ? parseForwardedForClientIp(forwardedFor) : void 0;
|
|
30
|
-
}
|
|
31
|
-
function resolveRequestClientIp(req, trustedProxies) {
|
|
32
|
-
if (!req) return;
|
|
33
|
-
return resolveGatewayClientIp({
|
|
34
|
-
remoteAddr: req.socket?.remoteAddress ?? "",
|
|
35
|
-
forwardedFor: headerValue(req.headers?.["x-forwarded-for"]),
|
|
36
|
-
realIp: headerValue(req.headers?.["x-real-ip"]),
|
|
37
|
-
trustedProxies
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
function isLocalDirectRequest(req, trustedProxies) {
|
|
41
|
-
if (!req) return false;
|
|
42
|
-
if (!isLoopbackAddress(resolveRequestClientIp(req, trustedProxies) ?? "")) return false;
|
|
43
|
-
const host = getHostName(req.headers?.host);
|
|
44
|
-
const hostIsLocal = host === "localhost" || host === "127.0.0.1" || host === "::1";
|
|
45
|
-
const hostIsTailscaleServe = host.endsWith(".ts.net");
|
|
46
|
-
const hasForwarded = Boolean(req.headers?.["x-forwarded-for"] || req.headers?.["x-real-ip"] || req.headers?.["x-forwarded-host"]);
|
|
47
|
-
const remoteIsTrustedProxy = isTrustedProxyAddress(req.socket?.remoteAddress, trustedProxies);
|
|
48
|
-
return (hostIsLocal || hostIsTailscaleServe) && (!hasForwarded || remoteIsTrustedProxy);
|
|
49
|
-
}
|
|
50
|
-
function getTailscaleUser(req) {
|
|
51
|
-
if (!req) return null;
|
|
52
|
-
const login = req.headers["tailscale-user-login"];
|
|
53
|
-
if (typeof login !== "string" || !login.trim()) return null;
|
|
54
|
-
const nameRaw = req.headers["tailscale-user-name"];
|
|
55
|
-
const profilePic = req.headers["tailscale-user-profile-pic"];
|
|
56
|
-
const name = typeof nameRaw === "string" && nameRaw.trim() ? nameRaw.trim() : login.trim();
|
|
57
|
-
return {
|
|
58
|
-
login: login.trim(),
|
|
59
|
-
name,
|
|
60
|
-
profilePic: typeof profilePic === "string" && profilePic.trim() ? profilePic.trim() : void 0
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
function hasTailscaleProxyHeaders(req) {
|
|
64
|
-
if (!req) return false;
|
|
65
|
-
return Boolean(req.headers["x-forwarded-for"] && req.headers["x-forwarded-proto"] && req.headers["x-forwarded-host"]);
|
|
66
|
-
}
|
|
67
|
-
function isTailscaleProxyRequest(req) {
|
|
68
|
-
if (!req) return false;
|
|
69
|
-
return isLoopbackAddress(req.socket?.remoteAddress) && hasTailscaleProxyHeaders(req);
|
|
70
|
-
}
|
|
71
|
-
async function resolveVerifiedTailscaleUser(params) {
|
|
72
|
-
const { req, tailscaleWhois } = params;
|
|
73
|
-
const tailscaleUser = getTailscaleUser(req);
|
|
74
|
-
if (!tailscaleUser) return {
|
|
75
|
-
ok: false,
|
|
76
|
-
reason: "tailscale_user_missing"
|
|
77
|
-
};
|
|
78
|
-
if (!isTailscaleProxyRequest(req)) return {
|
|
79
|
-
ok: false,
|
|
80
|
-
reason: "tailscale_proxy_missing"
|
|
81
|
-
};
|
|
82
|
-
const clientIp = resolveTailscaleClientIp(req);
|
|
83
|
-
if (!clientIp) return {
|
|
84
|
-
ok: false,
|
|
85
|
-
reason: "tailscale_whois_failed"
|
|
86
|
-
};
|
|
87
|
-
const whois = await tailscaleWhois(clientIp);
|
|
88
|
-
if (!whois?.login) return {
|
|
89
|
-
ok: false,
|
|
90
|
-
reason: "tailscale_whois_failed"
|
|
91
|
-
};
|
|
92
|
-
if (normalizeLogin(whois.login) !== normalizeLogin(tailscaleUser.login)) return {
|
|
93
|
-
ok: false,
|
|
94
|
-
reason: "tailscale_user_mismatch"
|
|
95
|
-
};
|
|
96
|
-
return {
|
|
97
|
-
ok: true,
|
|
98
|
-
user: {
|
|
99
|
-
login: whois.login,
|
|
100
|
-
name: whois.name ?? tailscaleUser.name,
|
|
101
|
-
profilePic: tailscaleUser.profilePic
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
function resolveGatewayAuth(params) {
|
|
106
|
-
const authConfig = params.authConfig ?? {};
|
|
107
|
-
const env = params.env ?? process.env;
|
|
108
|
-
const token = authConfig.token ?? env.OPENCLAW_GATEWAY_TOKEN ?? env.CLAWDBOT_GATEWAY_TOKEN ?? void 0;
|
|
109
|
-
const password = authConfig.password ?? env.OPENCLAW_GATEWAY_PASSWORD ?? env.CLAWDBOT_GATEWAY_PASSWORD ?? void 0;
|
|
110
|
-
const mode = authConfig.mode ?? (password ? "password" : "token");
|
|
111
|
-
return {
|
|
112
|
-
mode,
|
|
113
|
-
token,
|
|
114
|
-
password,
|
|
115
|
-
allowTailscale: authConfig.allowTailscale ?? (params.tailscaleMode === "serve" && mode !== "password")
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
function assertGatewayAuthConfigured(auth) {
|
|
119
|
-
if (auth.mode === "token" && !auth.token) {
|
|
120
|
-
if (auth.allowTailscale) return;
|
|
121
|
-
throw new Error("gateway auth mode is token, but no token was configured (set gateway.auth.token or OPENCLAW_GATEWAY_TOKEN)");
|
|
122
|
-
}
|
|
123
|
-
if (auth.mode === "password" && !auth.password) throw new Error("gateway auth mode is password, but no password was configured");
|
|
124
|
-
}
|
|
125
|
-
async function authorizeGatewayConnect(params) {
|
|
126
|
-
const { auth, connectAuth, req, trustedProxies } = params;
|
|
127
|
-
const tailscaleWhois = params.tailscaleWhois ?? readTailscaleWhoisIdentity;
|
|
128
|
-
const localDirect = isLocalDirectRequest(req, trustedProxies);
|
|
129
|
-
if (auth.allowTailscale && !localDirect) {
|
|
130
|
-
const tailscaleCheck = await resolveVerifiedTailscaleUser({
|
|
131
|
-
req,
|
|
132
|
-
tailscaleWhois
|
|
133
|
-
});
|
|
134
|
-
if (tailscaleCheck.ok) return {
|
|
135
|
-
ok: true,
|
|
136
|
-
method: "tailscale",
|
|
137
|
-
user: tailscaleCheck.user.login
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
if (auth.mode === "token") {
|
|
141
|
-
if (!auth.token) return {
|
|
142
|
-
ok: false,
|
|
143
|
-
reason: "token_missing_config"
|
|
144
|
-
};
|
|
145
|
-
if (!connectAuth?.token) return {
|
|
146
|
-
ok: false,
|
|
147
|
-
reason: "token_missing"
|
|
148
|
-
};
|
|
149
|
-
if (!safeEqual(connectAuth.token, auth.token)) return {
|
|
150
|
-
ok: false,
|
|
151
|
-
reason: "token_mismatch"
|
|
152
|
-
};
|
|
153
|
-
return {
|
|
154
|
-
ok: true,
|
|
155
|
-
method: "token"
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
if (auth.mode === "password") {
|
|
159
|
-
const password = connectAuth?.password;
|
|
160
|
-
if (!auth.password) return {
|
|
161
|
-
ok: false,
|
|
162
|
-
reason: "password_missing_config"
|
|
163
|
-
};
|
|
164
|
-
if (!password) return {
|
|
165
|
-
ok: false,
|
|
166
|
-
reason: "password_missing"
|
|
167
|
-
};
|
|
168
|
-
if (!safeEqual(password, auth.password)) return {
|
|
169
|
-
ok: false,
|
|
170
|
-
reason: "password_mismatch"
|
|
171
|
-
};
|
|
172
|
-
return {
|
|
173
|
-
ok: true,
|
|
174
|
-
method: "password"
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
return {
|
|
178
|
-
ok: false,
|
|
179
|
-
reason: "unauthorized"
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
//#endregion
|
|
184
|
-
export { resolveGatewayAuth as i, authorizeGatewayConnect as n, isLocalDirectRequest as r, assertGatewayAuthConfigured as t };
|
package/dist/auth-BvIPpm7G.js
DELETED
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
import { i as isTrustedProxyAddress, l as resolveGatewayClientIp, n as isLoopbackAddress, o as parseForwardedForClientIp } from "./ws-DtDKpbLR.js";
|
|
2
|
-
import { c as readTailscaleWhoisIdentity } from "./tailscale-Cu-2HNvU.js";
|
|
3
|
-
import { timingSafeEqual } from "node:crypto";
|
|
4
|
-
|
|
5
|
-
//#region src/gateway/auth.ts
|
|
6
|
-
function safeEqual(a, b) {
|
|
7
|
-
if (a.length !== b.length) return false;
|
|
8
|
-
return timingSafeEqual(Buffer.from(a), Buffer.from(b));
|
|
9
|
-
}
|
|
10
|
-
function normalizeLogin(login) {
|
|
11
|
-
return login.trim().toLowerCase();
|
|
12
|
-
}
|
|
13
|
-
function getHostName(hostHeader) {
|
|
14
|
-
const host = (hostHeader ?? "").trim().toLowerCase();
|
|
15
|
-
if (!host) return "";
|
|
16
|
-
if (host.startsWith("[")) {
|
|
17
|
-
const end = host.indexOf("]");
|
|
18
|
-
if (end !== -1) return host.slice(1, end);
|
|
19
|
-
}
|
|
20
|
-
const [name] = host.split(":");
|
|
21
|
-
return name ?? "";
|
|
22
|
-
}
|
|
23
|
-
function headerValue(value) {
|
|
24
|
-
return Array.isArray(value) ? value[0] : value;
|
|
25
|
-
}
|
|
26
|
-
function resolveTailscaleClientIp(req) {
|
|
27
|
-
if (!req) return;
|
|
28
|
-
const forwardedFor = headerValue(req.headers?.["x-forwarded-for"]);
|
|
29
|
-
return forwardedFor ? parseForwardedForClientIp(forwardedFor) : void 0;
|
|
30
|
-
}
|
|
31
|
-
function resolveRequestClientIp(req, trustedProxies) {
|
|
32
|
-
if (!req) return;
|
|
33
|
-
return resolveGatewayClientIp({
|
|
34
|
-
remoteAddr: req.socket?.remoteAddress ?? "",
|
|
35
|
-
forwardedFor: headerValue(req.headers?.["x-forwarded-for"]),
|
|
36
|
-
realIp: headerValue(req.headers?.["x-real-ip"]),
|
|
37
|
-
trustedProxies
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
function isLocalDirectRequest(req, trustedProxies) {
|
|
41
|
-
if (!req) return false;
|
|
42
|
-
if (!isLoopbackAddress(resolveRequestClientIp(req, trustedProxies) ?? "")) return false;
|
|
43
|
-
const host = getHostName(req.headers?.host);
|
|
44
|
-
const hostIsLocal = host === "localhost" || host === "127.0.0.1" || host === "::1";
|
|
45
|
-
const hostIsTailscaleServe = host.endsWith(".ts.net");
|
|
46
|
-
const hasForwarded = Boolean(req.headers?.["x-forwarded-for"] || req.headers?.["x-real-ip"] || req.headers?.["x-forwarded-host"]);
|
|
47
|
-
const remoteIsTrustedProxy = isTrustedProxyAddress(req.socket?.remoteAddress, trustedProxies);
|
|
48
|
-
return (hostIsLocal || hostIsTailscaleServe) && (!hasForwarded || remoteIsTrustedProxy);
|
|
49
|
-
}
|
|
50
|
-
function getTailscaleUser(req) {
|
|
51
|
-
if (!req) return null;
|
|
52
|
-
const login = req.headers["tailscale-user-login"];
|
|
53
|
-
if (typeof login !== "string" || !login.trim()) return null;
|
|
54
|
-
const nameRaw = req.headers["tailscale-user-name"];
|
|
55
|
-
const profilePic = req.headers["tailscale-user-profile-pic"];
|
|
56
|
-
const name = typeof nameRaw === "string" && nameRaw.trim() ? nameRaw.trim() : login.trim();
|
|
57
|
-
return {
|
|
58
|
-
login: login.trim(),
|
|
59
|
-
name,
|
|
60
|
-
profilePic: typeof profilePic === "string" && profilePic.trim() ? profilePic.trim() : void 0
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
function hasTailscaleProxyHeaders(req) {
|
|
64
|
-
if (!req) return false;
|
|
65
|
-
return Boolean(req.headers["x-forwarded-for"] && req.headers["x-forwarded-proto"] && req.headers["x-forwarded-host"]);
|
|
66
|
-
}
|
|
67
|
-
function isTailscaleProxyRequest(req) {
|
|
68
|
-
if (!req) return false;
|
|
69
|
-
return isLoopbackAddress(req.socket?.remoteAddress) && hasTailscaleProxyHeaders(req);
|
|
70
|
-
}
|
|
71
|
-
async function resolveVerifiedTailscaleUser(params) {
|
|
72
|
-
const { req, tailscaleWhois } = params;
|
|
73
|
-
const tailscaleUser = getTailscaleUser(req);
|
|
74
|
-
if (!tailscaleUser) return {
|
|
75
|
-
ok: false,
|
|
76
|
-
reason: "tailscale_user_missing"
|
|
77
|
-
};
|
|
78
|
-
if (!isTailscaleProxyRequest(req)) return {
|
|
79
|
-
ok: false,
|
|
80
|
-
reason: "tailscale_proxy_missing"
|
|
81
|
-
};
|
|
82
|
-
const clientIp = resolveTailscaleClientIp(req);
|
|
83
|
-
if (!clientIp) return {
|
|
84
|
-
ok: false,
|
|
85
|
-
reason: "tailscale_whois_failed"
|
|
86
|
-
};
|
|
87
|
-
const whois = await tailscaleWhois(clientIp);
|
|
88
|
-
if (!whois?.login) return {
|
|
89
|
-
ok: false,
|
|
90
|
-
reason: "tailscale_whois_failed"
|
|
91
|
-
};
|
|
92
|
-
if (normalizeLogin(whois.login) !== normalizeLogin(tailscaleUser.login)) return {
|
|
93
|
-
ok: false,
|
|
94
|
-
reason: "tailscale_user_mismatch"
|
|
95
|
-
};
|
|
96
|
-
return {
|
|
97
|
-
ok: true,
|
|
98
|
-
user: {
|
|
99
|
-
login: whois.login,
|
|
100
|
-
name: whois.name ?? tailscaleUser.name,
|
|
101
|
-
profilePic: tailscaleUser.profilePic
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
function resolveGatewayAuth(params) {
|
|
106
|
-
const authConfig = params.authConfig ?? {};
|
|
107
|
-
const env = params.env ?? process.env;
|
|
108
|
-
const token = authConfig.token ?? env.OPENCLAW_GATEWAY_TOKEN ?? env.CLAWDBOT_GATEWAY_TOKEN ?? void 0;
|
|
109
|
-
const password = authConfig.password ?? env.OPENCLAW_GATEWAY_PASSWORD ?? env.CLAWDBOT_GATEWAY_PASSWORD ?? void 0;
|
|
110
|
-
const mode = authConfig.mode ?? (password ? "password" : "token");
|
|
111
|
-
return {
|
|
112
|
-
mode,
|
|
113
|
-
token,
|
|
114
|
-
password,
|
|
115
|
-
allowTailscale: authConfig.allowTailscale ?? (params.tailscaleMode === "serve" && mode !== "password")
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
function assertGatewayAuthConfigured(auth) {
|
|
119
|
-
if (auth.mode === "token" && !auth.token) {
|
|
120
|
-
if (auth.allowTailscale) return;
|
|
121
|
-
throw new Error("gateway auth mode is token, but no token was configured (set gateway.auth.token or OPENCLAW_GATEWAY_TOKEN)");
|
|
122
|
-
}
|
|
123
|
-
if (auth.mode === "password" && !auth.password) throw new Error("gateway auth mode is password, but no password was configured");
|
|
124
|
-
}
|
|
125
|
-
async function authorizeGatewayConnect(params) {
|
|
126
|
-
const { auth, connectAuth, req, trustedProxies } = params;
|
|
127
|
-
const tailscaleWhois = params.tailscaleWhois ?? readTailscaleWhoisIdentity;
|
|
128
|
-
const localDirect = isLocalDirectRequest(req, trustedProxies);
|
|
129
|
-
if (auth.allowTailscale && !localDirect) {
|
|
130
|
-
const tailscaleCheck = await resolveVerifiedTailscaleUser({
|
|
131
|
-
req,
|
|
132
|
-
tailscaleWhois
|
|
133
|
-
});
|
|
134
|
-
if (tailscaleCheck.ok) return {
|
|
135
|
-
ok: true,
|
|
136
|
-
method: "tailscale",
|
|
137
|
-
user: tailscaleCheck.user.login
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
if (auth.mode === "token") {
|
|
141
|
-
if (!auth.token) return {
|
|
142
|
-
ok: false,
|
|
143
|
-
reason: "token_missing_config"
|
|
144
|
-
};
|
|
145
|
-
if (!connectAuth?.token) return {
|
|
146
|
-
ok: false,
|
|
147
|
-
reason: "token_missing"
|
|
148
|
-
};
|
|
149
|
-
if (!safeEqual(connectAuth.token, auth.token)) return {
|
|
150
|
-
ok: false,
|
|
151
|
-
reason: "token_mismatch"
|
|
152
|
-
};
|
|
153
|
-
return {
|
|
154
|
-
ok: true,
|
|
155
|
-
method: "token"
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
if (auth.mode === "password") {
|
|
159
|
-
const password = connectAuth?.password;
|
|
160
|
-
if (!auth.password) return {
|
|
161
|
-
ok: false,
|
|
162
|
-
reason: "password_missing_config"
|
|
163
|
-
};
|
|
164
|
-
if (!password) return {
|
|
165
|
-
ok: false,
|
|
166
|
-
reason: "password_missing"
|
|
167
|
-
};
|
|
168
|
-
if (!safeEqual(password, auth.password)) return {
|
|
169
|
-
ok: false,
|
|
170
|
-
reason: "password_mismatch"
|
|
171
|
-
};
|
|
172
|
-
return {
|
|
173
|
-
ok: true,
|
|
174
|
-
method: "password"
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
return {
|
|
178
|
-
ok: false,
|
|
179
|
-
reason: "unauthorized"
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
//#endregion
|
|
184
|
-
export { resolveGatewayAuth as i, authorizeGatewayConnect as n, isLocalDirectRequest as r, assertGatewayAuthConfigured as t };
|
package/dist/boolean-M-esQJt6.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
//#region src/utils/boolean.ts
|
|
2
|
-
const DEFAULT_TRUTHY = [
|
|
3
|
-
"true",
|
|
4
|
-
"1",
|
|
5
|
-
"yes",
|
|
6
|
-
"on"
|
|
7
|
-
];
|
|
8
|
-
const DEFAULT_FALSY = [
|
|
9
|
-
"false",
|
|
10
|
-
"0",
|
|
11
|
-
"no",
|
|
12
|
-
"off"
|
|
13
|
-
];
|
|
14
|
-
const DEFAULT_TRUTHY_SET = new Set(DEFAULT_TRUTHY);
|
|
15
|
-
const DEFAULT_FALSY_SET = new Set(DEFAULT_FALSY);
|
|
16
|
-
function parseBooleanValue(value, options = {}) {
|
|
17
|
-
if (typeof value === "boolean") return value;
|
|
18
|
-
if (typeof value !== "string") return;
|
|
19
|
-
const normalized = value.trim().toLowerCase();
|
|
20
|
-
if (!normalized) return;
|
|
21
|
-
const truthy = options.truthy ?? DEFAULT_TRUTHY;
|
|
22
|
-
const falsy = options.falsy ?? DEFAULT_FALSY;
|
|
23
|
-
const truthySet = truthy === DEFAULT_TRUTHY ? DEFAULT_TRUTHY_SET : new Set(truthy);
|
|
24
|
-
const falsySet = falsy === DEFAULT_FALSY ? DEFAULT_FALSY_SET : new Set(falsy);
|
|
25
|
-
if (truthySet.has(normalized)) return true;
|
|
26
|
-
if (falsySet.has(normalized)) return false;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
//#endregion
|
|
30
|
-
export { parseBooleanValue as t };
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: soul-evil
|
|
3
|
-
description: "Swap SOUL.md with SOUL_EVIL.md during a purge window or by random chance"
|
|
4
|
-
homepage: https://docs.openclaw.ai/hooks/soul-evil
|
|
5
|
-
metadata:
|
|
6
|
-
{
|
|
7
|
-
"openclaw":
|
|
8
|
-
{
|
|
9
|
-
"emoji": "😈",
|
|
10
|
-
"events": ["agent:bootstrap"],
|
|
11
|
-
"requires": { "config": ["hooks.internal.entries.soul-evil.enabled"] },
|
|
12
|
-
"install": [{ "id": "bundled", "kind": "bundled", "label": "Bundled with OpenClaw" }],
|
|
13
|
-
},
|
|
14
|
-
}
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
# SOUL Evil Hook
|
|
18
|
-
|
|
19
|
-
Replaces the injected `SOUL.md` content with `SOUL_EVIL.md` during a daily purge window or by random chance.
|
|
20
|
-
|
|
21
|
-
## What It Does
|
|
22
|
-
|
|
23
|
-
When enabled and the trigger conditions match, the hook swaps the **injected** `SOUL.md` content before the system prompt is built. It does **not** modify files on disk.
|
|
24
|
-
|
|
25
|
-
## Files
|
|
26
|
-
|
|
27
|
-
- `SOUL.md` — normal persona (always read)
|
|
28
|
-
- `SOUL_EVIL.md` — alternate persona (read only when triggered)
|
|
29
|
-
|
|
30
|
-
You can change the filename via hook config.
|
|
31
|
-
|
|
32
|
-
## Configuration
|
|
33
|
-
|
|
34
|
-
Add this to your config (`~/.openclaw/openclaw.json`):
|
|
35
|
-
|
|
36
|
-
```json
|
|
37
|
-
{
|
|
38
|
-
"hooks": {
|
|
39
|
-
"internal": {
|
|
40
|
-
"enabled": true,
|
|
41
|
-
"entries": {
|
|
42
|
-
"soul-evil": {
|
|
43
|
-
"enabled": true,
|
|
44
|
-
"file": "SOUL_EVIL.md",
|
|
45
|
-
"chance": 0.1,
|
|
46
|
-
"purge": { "at": "21:00", "duration": "15m" }
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### Options
|
|
55
|
-
|
|
56
|
-
- `file` (string): alternate SOUL filename (default: `SOUL_EVIL.md`)
|
|
57
|
-
- `chance` (number 0–1): random chance per run to swap in SOUL_EVIL
|
|
58
|
-
- `purge.at` (HH:mm): daily purge window start time (24h)
|
|
59
|
-
- `purge.duration` (duration): window length (e.g. `30s`, `10m`, `1h`)
|
|
60
|
-
|
|
61
|
-
**Precedence:** purge window wins over chance.
|
|
62
|
-
|
|
63
|
-
## Requirements
|
|
64
|
-
|
|
65
|
-
- `hooks.internal.entries.soul-evil.enabled` must be set to `true`
|
|
66
|
-
|
|
67
|
-
## Enable
|
|
68
|
-
|
|
69
|
-
```bash
|
|
70
|
-
openclaw hooks enable soul-evil
|
|
71
|
-
```
|
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
import "../../paths-BZtyHNCi.js";
|
|
2
|
-
import { h as isSubagentSessionKey } from "../../session-key-nXYQSv-a.js";
|
|
3
|
-
import { g as resolveUserPath } from "../../utils-dp_OM900.js";
|
|
4
|
-
import "../../boolean-M-esQJt6.js";
|
|
5
|
-
import { o as isAgentBootstrapEvent, r as resolveUserTimezone } from "../../date-time-c6HTX6IW.js";
|
|
6
|
-
import { t as parseDurationMs } from "../../parse-duration-De_tAQSe.js";
|
|
7
|
-
import "../../frontmatter-xwTm0734.js";
|
|
8
|
-
import { t as resolveHookConfig } from "../../config-CI7EpvlP.js";
|
|
9
|
-
import fs from "node:fs/promises";
|
|
10
|
-
import path from "node:path";
|
|
11
|
-
|
|
12
|
-
//#region src/hooks/soul-evil.ts
|
|
13
|
-
const DEFAULT_SOUL_EVIL_FILENAME = "SOUL_EVIL.md";
|
|
14
|
-
function resolveSoulEvilConfigFromHook(entry, log) {
|
|
15
|
-
if (!entry) return null;
|
|
16
|
-
const file = typeof entry.file === "string" ? entry.file : void 0;
|
|
17
|
-
if (entry.file !== void 0 && !file) log?.warn?.("soul-evil config: file must be a string");
|
|
18
|
-
let chance;
|
|
19
|
-
if (entry.chance !== void 0) if (typeof entry.chance === "number" && Number.isFinite(entry.chance)) chance = entry.chance;
|
|
20
|
-
else log?.warn?.("soul-evil config: chance must be a number");
|
|
21
|
-
let purge;
|
|
22
|
-
if (entry.purge && typeof entry.purge === "object") {
|
|
23
|
-
const at = typeof entry.purge.at === "string" ? entry.purge.at : void 0;
|
|
24
|
-
const duration = typeof entry.purge.duration === "string" ? entry.purge.duration : void 0;
|
|
25
|
-
if (entry.purge.at !== void 0 && !at) log?.warn?.("soul-evil config: purge.at must be a string");
|
|
26
|
-
if (entry.purge.duration !== void 0 && !duration) log?.warn?.("soul-evil config: purge.duration must be a string");
|
|
27
|
-
purge = {
|
|
28
|
-
at,
|
|
29
|
-
duration
|
|
30
|
-
};
|
|
31
|
-
} else if (entry.purge !== void 0) log?.warn?.("soul-evil config: purge must be an object");
|
|
32
|
-
if (!file && chance === void 0 && !purge) return null;
|
|
33
|
-
return {
|
|
34
|
-
file,
|
|
35
|
-
chance,
|
|
36
|
-
purge
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
function clampChance(value) {
|
|
40
|
-
if (typeof value !== "number" || !Number.isFinite(value)) return 0;
|
|
41
|
-
return Math.min(1, Math.max(0, value));
|
|
42
|
-
}
|
|
43
|
-
function parsePurgeAt(raw) {
|
|
44
|
-
if (!raw) return null;
|
|
45
|
-
const trimmed = raw.trim();
|
|
46
|
-
const match = /^([01]?\d|2[0-3]):([0-5]\d)$/.exec(trimmed);
|
|
47
|
-
if (!match) return null;
|
|
48
|
-
const hour = Number.parseInt(match[1] ?? "", 10);
|
|
49
|
-
const minute = Number.parseInt(match[2] ?? "", 10);
|
|
50
|
-
if (!Number.isFinite(hour) || !Number.isFinite(minute)) return null;
|
|
51
|
-
return hour * 60 + minute;
|
|
52
|
-
}
|
|
53
|
-
function timeOfDayMsInTimezone(date, timeZone) {
|
|
54
|
-
try {
|
|
55
|
-
const parts = new Intl.DateTimeFormat("en-US", {
|
|
56
|
-
timeZone,
|
|
57
|
-
hour: "2-digit",
|
|
58
|
-
minute: "2-digit",
|
|
59
|
-
second: "2-digit",
|
|
60
|
-
hourCycle: "h23"
|
|
61
|
-
}).formatToParts(date);
|
|
62
|
-
const map = {};
|
|
63
|
-
for (const part of parts) if (part.type !== "literal") map[part.type] = part.value;
|
|
64
|
-
if (!map.hour || !map.minute || !map.second) return null;
|
|
65
|
-
const hour = Number.parseInt(map.hour, 10);
|
|
66
|
-
const minute = Number.parseInt(map.minute, 10);
|
|
67
|
-
const second = Number.parseInt(map.second, 10);
|
|
68
|
-
if (!Number.isFinite(hour) || !Number.isFinite(minute) || !Number.isFinite(second)) return null;
|
|
69
|
-
return (hour * 3600 + minute * 60 + second) * 1e3 + date.getMilliseconds();
|
|
70
|
-
} catch {
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
function isWithinDailyPurgeWindow(params) {
|
|
75
|
-
if (!params.at || !params.duration) return false;
|
|
76
|
-
const startMinutes = parsePurgeAt(params.at);
|
|
77
|
-
if (startMinutes === null) return false;
|
|
78
|
-
let durationMs;
|
|
79
|
-
try {
|
|
80
|
-
durationMs = parseDurationMs(params.duration, { defaultUnit: "m" });
|
|
81
|
-
} catch {
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
if (!Number.isFinite(durationMs) || durationMs <= 0) return false;
|
|
85
|
-
const dayMs = 1440 * 60 * 1e3;
|
|
86
|
-
if (durationMs >= dayMs) return true;
|
|
87
|
-
const nowMs = timeOfDayMsInTimezone(params.now, params.timeZone);
|
|
88
|
-
if (nowMs === null) return false;
|
|
89
|
-
const startMs = startMinutes * 60 * 1e3;
|
|
90
|
-
const endMs = startMs + durationMs;
|
|
91
|
-
if (endMs < dayMs) return nowMs >= startMs && nowMs < endMs;
|
|
92
|
-
const wrappedEnd = endMs % dayMs;
|
|
93
|
-
return nowMs >= startMs || nowMs < wrappedEnd;
|
|
94
|
-
}
|
|
95
|
-
function decideSoulEvil(params) {
|
|
96
|
-
const evil = params.config;
|
|
97
|
-
const fileName = evil?.file?.trim() || DEFAULT_SOUL_EVIL_FILENAME;
|
|
98
|
-
if (!evil) return {
|
|
99
|
-
useEvil: false,
|
|
100
|
-
fileName
|
|
101
|
-
};
|
|
102
|
-
const timeZone = resolveUserTimezone(params.userTimezone);
|
|
103
|
-
const now = params.now ?? /* @__PURE__ */ new Date();
|
|
104
|
-
if (isWithinDailyPurgeWindow({
|
|
105
|
-
at: evil.purge?.at,
|
|
106
|
-
duration: evil.purge?.duration,
|
|
107
|
-
now,
|
|
108
|
-
timeZone
|
|
109
|
-
})) return {
|
|
110
|
-
useEvil: true,
|
|
111
|
-
reason: "purge",
|
|
112
|
-
fileName
|
|
113
|
-
};
|
|
114
|
-
const chance = clampChance(evil.chance);
|
|
115
|
-
if (chance > 0) {
|
|
116
|
-
if ((params.random ?? Math.random)() < chance) return {
|
|
117
|
-
useEvil: true,
|
|
118
|
-
reason: "chance",
|
|
119
|
-
fileName
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
return {
|
|
123
|
-
useEvil: false,
|
|
124
|
-
fileName
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
async function applySoulEvilOverride(params) {
|
|
128
|
-
const decision = decideSoulEvil({
|
|
129
|
-
config: params.config,
|
|
130
|
-
userTimezone: params.userTimezone,
|
|
131
|
-
now: params.now,
|
|
132
|
-
random: params.random
|
|
133
|
-
});
|
|
134
|
-
if (!decision.useEvil) return params.files;
|
|
135
|
-
const workspaceDir = resolveUserPath(params.workspaceDir);
|
|
136
|
-
const evilPath = path.join(workspaceDir, decision.fileName);
|
|
137
|
-
let evilContent;
|
|
138
|
-
try {
|
|
139
|
-
evilContent = await fs.readFile(evilPath, "utf-8");
|
|
140
|
-
} catch {
|
|
141
|
-
params.log?.warn?.(`SOUL_EVIL active (${decision.reason ?? "unknown"}) but file missing: ${evilPath}`);
|
|
142
|
-
return params.files;
|
|
143
|
-
}
|
|
144
|
-
if (!evilContent.trim()) {
|
|
145
|
-
params.log?.warn?.(`SOUL_EVIL active (${decision.reason ?? "unknown"}) but file empty: ${evilPath}`);
|
|
146
|
-
return params.files;
|
|
147
|
-
}
|
|
148
|
-
if (!params.files.some((file) => file.name === "SOUL.md")) {
|
|
149
|
-
params.log?.warn?.(`SOUL_EVIL active (${decision.reason ?? "unknown"}) but SOUL.md not in bootstrap files`);
|
|
150
|
-
return params.files;
|
|
151
|
-
}
|
|
152
|
-
let replaced = false;
|
|
153
|
-
const updated = params.files.map((file) => {
|
|
154
|
-
if (file.name !== "SOUL.md") return file;
|
|
155
|
-
replaced = true;
|
|
156
|
-
return {
|
|
157
|
-
...file,
|
|
158
|
-
content: evilContent,
|
|
159
|
-
missing: false
|
|
160
|
-
};
|
|
161
|
-
});
|
|
162
|
-
if (!replaced) return params.files;
|
|
163
|
-
params.log?.debug?.(`SOUL_EVIL active (${decision.reason ?? "unknown"}) using ${decision.fileName}`);
|
|
164
|
-
return updated;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
//#endregion
|
|
168
|
-
//#region src/hooks/bundled/soul-evil/handler.ts
|
|
169
|
-
const HOOK_KEY = "soul-evil";
|
|
170
|
-
const soulEvilHook = async (event) => {
|
|
171
|
-
if (!isAgentBootstrapEvent(event)) return;
|
|
172
|
-
const context = event.context;
|
|
173
|
-
if (context.sessionKey && isSubagentSessionKey(context.sessionKey)) return;
|
|
174
|
-
const cfg = context.cfg;
|
|
175
|
-
const hookConfig = resolveHookConfig(cfg, HOOK_KEY);
|
|
176
|
-
if (!hookConfig || hookConfig.enabled === false) return;
|
|
177
|
-
const soulConfig = resolveSoulEvilConfigFromHook(hookConfig, { warn: (message) => console.warn(`[soul-evil] ${message}`) });
|
|
178
|
-
if (!soulConfig) return;
|
|
179
|
-
const workspaceDir = context.workspaceDir;
|
|
180
|
-
if (!workspaceDir || !Array.isArray(context.bootstrapFiles)) return;
|
|
181
|
-
context.bootstrapFiles = await applySoulEvilOverride({
|
|
182
|
-
files: context.bootstrapFiles,
|
|
183
|
-
workspaceDir,
|
|
184
|
-
config: soulConfig,
|
|
185
|
-
userTimezone: cfg?.agents?.defaults?.userTimezone,
|
|
186
|
-
log: {
|
|
187
|
-
warn: (message) => console.warn(`[soul-evil] ${message}`),
|
|
188
|
-
debug: (message) => console.debug?.(`[soul-evil] ${message}`)
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
//#endregion
|
|
194
|
-
export { soulEvilHook as default };
|