clawbrah 1.0.1
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 +1577 -0
- package/LICENSE +21 -0
- package/README-header.png +0 -0
- package/README.md +655 -0
- package/assets/avatar-placeholder.svg +19 -0
- package/assets/chrome-extension/README.md +22 -0
- package/assets/chrome-extension/background.js +438 -0
- package/assets/chrome-extension/icons/icon128.png +0 -0
- package/assets/chrome-extension/icons/icon16.png +0 -0
- package/assets/chrome-extension/icons/icon32.png +0 -0
- package/assets/chrome-extension/icons/icon48.png +0 -0
- package/assets/chrome-extension/manifest.json +25 -0
- package/assets/chrome-extension/options.html +196 -0
- package/assets/chrome-extension/options.js +59 -0
- package/assets/dmg-background-small.png +0 -0
- package/assets/dmg-background.png +0 -0
- package/clawbrah.mjs +14 -0
- package/dist/accounts-CjPkmYhF.js +251 -0
- package/dist/accounts-D9U5z8T8.js +250 -0
- package/dist/acp-cli-BnKXNti3.js +929 -0
- package/dist/acp-cli-CQw991sO.js +925 -0
- package/dist/agent-BIxLfYkv.js +702 -0
- package/dist/agent-Dj_EwzkO.js +702 -0
- package/dist/agent-scope-BCxtHmMP.js +370 -0
- package/dist/agent-scope-C-hibssz.js +606 -0
- package/dist/agent-scope-CbEuCv2l.js +370 -0
- package/dist/ansi-Dslhk-pR.js +67 -0
- package/dist/archive-CCWYT_Aq.js +85 -0
- package/dist/archive-CIDIaMie.js +85 -0
- package/dist/audit-DK1NXsUR.js +1853 -0
- package/dist/audit-XFpWISrQ.js +1853 -0
- package/dist/auth-BPnkbfof.js +192 -0
- package/dist/auth-DwH9mnk7.js +192 -0
- package/dist/auth-health-DO7finG2.js +149 -0
- package/dist/auth-health-DUIg_lRU.js +149 -0
- package/dist/auth-profiles-BMF1fdhQ.js +2938 -0
- package/dist/boolean-C6Pbt2Ue.js +30 -0
- package/dist/brah-provider-CKcQ2qQ8.js +59 -0
- package/dist/brah-provider-D7G_zAuN.js +53 -0
- package/dist/brah-provider-Djzuocx7.js +54 -0
- package/dist/branding-CONYHJSC.js +82 -0
- package/dist/branding-DcW4KU4p.js +82 -0
- package/dist/brew-BIrWdDps.js +46 -0
- package/dist/brew-DYTEg8IL.js +46 -0
- package/dist/build-info.json +5 -0
- package/dist/call-B0EB11Hz.js +278 -0
- package/dist/call-Bykpt9_M.js +278 -0
- package/dist/canvas-host/a2ui/.bundle.hash +1 -0
- package/dist/canvas-host/a2ui/a2ui.bundle.js +17765 -0
- package/dist/canvas-host/a2ui/index.html +307 -0
- package/dist/channel-options-DLVRytYw.js +62 -0
- package/dist/channel-options-tgFQd3C0.js +32 -0
- package/dist/channel-selection-BE7PqmOC.js +51 -0
- package/dist/channel-selection-Dqp6K4Pw.js +51 -0
- package/dist/channel-summary-DZDiZAGl.js +1120 -0
- package/dist/channel-summary-ECvQTB5n.js +1121 -0
- package/dist/channels-cli-BFG8o_5O.js +1416 -0
- package/dist/channels-cli-NW8TfhTG.js +1419 -0
- package/dist/channels-status-issues-BiIcz4nz.js +18 -0
- package/dist/channels-status-issues-CIiu_Xxf.js +18 -0
- package/dist/chrome-4hKxr5KT.js +1973 -0
- package/dist/chrome-DQIhPH0W.js +1953 -0
- package/dist/clack-prompter-CJZpapQF.js +94 -0
- package/dist/clack-prompter-Dujo5dAa.js +94 -0
- package/dist/cli/daemon-cli.js +2 -0
- package/dist/cli-CBWZx_9K.js +94 -0
- package/dist/cli-Dpw7vdkR.js +90 -0
- package/dist/cli-utils-EpvLL-7H.js +43 -0
- package/dist/cli-utils-Yv4G3uEz.js +43 -0
- package/dist/client-DyaYZBTP.js +1617 -0
- package/dist/client-to8eMV2s.js +1617 -0
- package/dist/command-format-B96YFpq4.js +53 -0
- package/dist/command-format-Bb91kyB5.js +39 -0
- package/dist/command-format-Ch4rJeOo.js +133 -0
- package/dist/command-options-CiVRXfHE.js +33 -0
- package/dist/commands-DH9qcYUu.js +230 -0
- package/dist/completion-cli-BO3ziRR1.js +773 -0
- package/dist/completion-cli-xQqLK_Ni.js +434 -0
- package/dist/config-Ddbeba_Z.js +4915 -0
- package/dist/config-JJ_qstMV.js +4916 -0
- package/dist/config-c_xnI78-.js +5657 -0
- package/dist/config-guard-CKr985of.js +5971 -0
- package/dist/configure-Baroiqo5.js +895 -0
- package/dist/configure-tZw988ro.js +896 -0
- package/dist/constants-AeetkqWc.js +67 -0
- package/dist/constants-Dz79cVwc.js +67 -0
- package/dist/control-service-D6DqOGJY.js +61 -0
- package/dist/control-service-Dssk9Kaa.js +61 -0
- package/dist/control-ui/apple-touch-icon.png +0 -0
- package/dist/control-ui/assets/index-BoXosYY6.css +1 -0
- package/dist/control-ui/assets/index-Dm6g1E26.js +7553 -0
- package/dist/control-ui/assets/index-Dm6g1E26.js.map +1 -0
- package/dist/control-ui/favicon-32.png +0 -0
- package/dist/control-ui/favicon.ico +0 -0
- package/dist/control-ui/favicon.svg +22 -0
- package/dist/control-ui/index.html +17 -0
- package/dist/cron-cli-B-LWRLK-.js +460 -0
- package/dist/cron-cli-Ck-LIACc.js +456 -0
- package/dist/daemon-cli-CatDQvXp.js +759 -0
- package/dist/daemon-cli-DyljCSvh.js +757 -0
- package/dist/daemon-runtime-Bfpf-iTt.js +517 -0
- package/dist/daemon-runtime-Bof4EAty.js +517 -0
- package/dist/deliver-BBwjenkx.js +2587 -0
- package/dist/deliver-CQNhT-AZ.js +2587 -0
- package/dist/deliver-CqtN8jzj.js +2557 -0
- package/dist/deps-CwIHF5Kq.js +27 -0
- package/dist/deps-NlR-vxlh.js +27 -0
- package/dist/devices-cli-D2gNGH39.js +206 -0
- package/dist/devices-cli-_rugjRme.js +210 -0
- package/dist/directory-cli-BiGqaTbn.js +246 -0
- package/dist/directory-cli-DamxdQvl.js +250 -0
- package/dist/dispatcher-DOZGzrqb.js +160 -0
- package/dist/dns-cli-BGvF-HPE.js +200 -0
- package/dist/dns-cli-CwFuD5pv.js +204 -0
- package/dist/docs-cli-DJWF_t89.js +163 -0
- package/dist/docs-cli-Dplzz8Mq.js +160 -0
- package/dist/doctor-CdqmZxrK.js +2586 -0
- package/dist/doctor-DdHvLQSW.js +2588 -0
- package/dist/entry.js +1330 -0
- package/dist/env-YhBsuZYR.js +32 -0
- package/dist/errors-HrPt6FJ9.js +1952 -0
- package/dist/exec-4puFQDLB.js +246 -0
- package/dist/exec-BMnoMcZW.js +1099 -0
- package/dist/exec-BtbR_Cur.js +246 -0
- package/dist/exec-approvals-CA18XenO.js +1043 -0
- package/dist/exec-approvals-cli-BGB1TyrS.js +392 -0
- package/dist/exec-approvals-cli-Bq2Rv7if.js +388 -0
- package/dist/exec-approvals-iOoxTSaW.js +1043 -0
- package/dist/extensionAPI.js +67491 -0
- package/dist/format-DSCRXSo3.js +34 -0
- package/dist/format-DZA-SIiB.js +34 -0
- package/dist/gateway-cli-Ctozr1Nr.js +17356 -0
- package/dist/gateway-cli-Dm6fyKOW.js +17354 -0
- package/dist/gateway-rpc-DIBI9dZU.js +28 -0
- package/dist/gateway-rpc-DiR8jxC9.js +28 -0
- package/dist/github-copilot-auth-CWMgcPFb.js +1190 -0
- package/dist/github-copilot-auth-DBciFmic.js +1190 -0
- package/dist/github-copilot-token-B3SA95yo.js +103 -0
- package/dist/github-copilot-token-B9LJ8KjT.js +103 -0
- package/dist/github-copilot-token-BqZxoChM.js +103 -0
- package/dist/gmail-setup-utils-DC0hK-al.js +428 -0
- package/dist/gmail-setup-utils-Dt5K3pG2.js +428 -0
- package/dist/health-format-DZpQiSPr.js +1383 -0
- package/dist/health-format-rvKQDZAe.js +1385 -0
- package/dist/help-format-DUy1KRxq.js +17 -0
- package/dist/help-format-dO-Q4-RZ.js +17 -0
- package/dist/helpers-8O7IVGO-.js +25 -0
- package/dist/helpers-CcHGV820.js +10 -0
- package/dist/helpers-D_jqdWkd.js +25 -0
- package/dist/helpers-f7Q47hAD.js +10 -0
- package/dist/hooks/bundled/boot-md/HOOK.md +19 -0
- package/dist/hooks/bundled/command-logger/HOOK.md +122 -0
- package/dist/hooks/bundled/session-memory/HOOK.md +109 -0
- package/dist/hooks/bundled/soul-evil/HOOK.md +71 -0
- package/dist/hooks-cli-Dk70ZlpQ.js +1065 -0
- package/dist/hooks-cli-DkN_zNe_.js +1061 -0
- package/dist/hooks-status-BKToL6h7.js +443 -0
- package/dist/hooks-status-DAZqmvvU.js +443 -0
- package/dist/image-BZtCTxrR.js +634 -0
- package/dist/image-Yc5sSkOR.js +1426 -0
- package/dist/image-fscCHaO2.js +634 -0
- package/dist/index.js +6159 -0
- package/dist/installs-B8pY7vqZ.js +425 -0
- package/dist/installs-OI3UrTrZ.js +425 -0
- package/dist/is-main-BI9IbomE.js +25 -0
- package/dist/is-main-CatKw_er.js +25 -0
- package/dist/links-4bWi9tNq.js +15 -0
- package/dist/links-DPN-zsft.js +15 -0
- package/dist/loader-BQu3NLsc.js +64119 -0
- package/dist/logging-BggTN-OA.js +15 -0
- package/dist/logging-BvdokaVt.js +1 -0
- package/dist/logging-BzvBIA3Y.js +1 -0
- package/dist/logging-C-XFUtHZ.js +15 -0
- package/dist/login-qr-AehM-U7T.js +478 -0
- package/dist/login-qr-BbkDI6z-.js +475 -0
- package/dist/login-qr-KkxF3src.js +478 -0
- package/dist/logs-cli-GIy-ReUJ.js +232 -0
- package/dist/logs-cli-PkeymkCI.js +228 -0
- package/dist/manager-5cVcI5p8.js +2870 -0
- package/dist/manager-BHVQTR5S.js +2870 -0
- package/dist/manager-DYwowaGP.js +2872 -0
- package/dist/manifest-registry-CWVhL1Tp.js +669 -0
- package/dist/manifest-registry-yIkIFf0S.js +669 -0
- package/dist/message-channel-C0Y-pfV3.js +110 -0
- package/dist/message-channel-C3TK8GwV.js +110 -0
- package/dist/model-selection-BtrQIp5S.js +2940 -0
- package/dist/model-selection-DpbwUcPt.js +2691 -0
- package/dist/models-cli-BD-etPw9.js +2548 -0
- package/dist/models-cli-bdUO1YB5.js +2544 -0
- package/dist/net-8u61izyE.js +137 -0
- package/dist/net-D2zciGj5.js +137 -0
- package/dist/node-cli-DfUhskVm.js +1457 -0
- package/dist/node-cli-nnREUTNh.js +1461 -0
- package/dist/node-service-BF4ipV1g.js +67 -0
- package/dist/node-service-BQlkoIs-.js +67 -0
- package/dist/nodes-cli-BTFnWb5A.js +1209 -0
- package/dist/nodes-cli-C1KLCUgY.js +1213 -0
- package/dist/nodes-screen-BZIbguNP.js +157 -0
- package/dist/nodes-screen-D9YOHKnK.js +157 -0
- package/dist/note-DGwSQRou.js +73 -0
- package/dist/note-u0j4Zri6.js +73 -0
- package/dist/onboard-channels--6mZlRdm.js +671 -0
- package/dist/onboard-channels-Cjs_-7rV.js +671 -0
- package/dist/onboard-skills-CKh0otKb.js +3392 -0
- package/dist/onboard-skills-DFX908cv.js +3392 -0
- package/dist/onboarding-C9T4fYdo.js +3269 -0
- package/dist/openclaw-root-CNUzBTmy.js +84 -0
- package/dist/openclaw-root-DHli8vJO.js +84 -0
- package/dist/pairing-cli-DfM3LkLw.js +115 -0
- package/dist/pairing-cli-_nN81r25.js +119 -0
- package/dist/pairing-labels-BjA6wnhH.js +9 -0
- package/dist/pairing-labels-uGmG1FM-.js +9 -0
- package/dist/pairing-store-DfYWlf47.js +391 -0
- package/dist/pairing-store-RVhKX0MC.js +391 -0
- package/dist/parse-87ybtYW1.js +23 -0
- package/dist/parse-DOybnFJK.js +23 -0
- package/dist/parse-log-line-BoDqomM4.js +44 -0
- package/dist/parse-log-line-BuRiE-Ij.js +44 -0
- package/dist/parse-timeout-BIB19Upi.js +16 -0
- package/dist/parse-timeout-R8SiSP1t.js +16 -0
- package/dist/path-env-CXWUFfFv.js +77 -0
- package/dist/path-env-Dkh275Rh.js +77 -0
- package/dist/paths-B1kfl4h5.js +164 -0
- package/dist/paths-BPTe_oCW.js +43 -0
- package/dist/paths-BgalzSrB.js +40 -0
- package/dist/paths-DoU2wF-8.js +43 -0
- package/dist/paths-scjhy7N2.js +180 -0
- package/dist/pi-embedded-helpers-B8VNIgsS.js +8475 -0
- package/dist/pi-embedded-helpers-BpYQcZB0.js +1298 -0
- package/dist/pi-embedded-helpers-R5an9K5m.js +1298 -0
- package/dist/pi-model-discovery-CmCpGwer.js +20 -0
- package/dist/pi-model-discovery-DqgqUyAv.js +20 -0
- package/dist/pi-model-discovery-EhM2JAQo.js +20 -0
- package/dist/pi-tools.policy-6uFIt3Ju.js +230 -0
- package/dist/plugin-auto-enable-BhpgoPQ-.js +461 -0
- package/dist/plugin-auto-enable-C5fXErMQ.js +461 -0
- package/dist/plugin-sdk/brah-provider-Dv55ggdB.js +48 -0
- package/dist/plugin-sdk/index.d.ts +8856 -0
- package/dist/plugin-sdk/index.js +21240 -0
- package/dist/plugin-sdk/model-selection-D1wuaM-4.js +3184 -0
- package/dist/plugin-sdk/pi-model-discovery-Dw3A6oXH.js +37 -0
- package/dist/plugins-09ktk12_.js +496 -0
- package/dist/plugins-CDPqd0g4.js +495 -0
- package/dist/plugins-cli-BKPTobSa.js +445 -0
- package/dist/plugins-cli-FsBHhKXs.js +449 -0
- package/dist/ports-CNd5FYYb.js +96 -0
- package/dist/program-Tlz-_XHE.js +196 -0
- package/dist/progress-CkVQZWRm.js +133 -0
- package/dist/progress-DsH6InCn.js +133 -0
- package/dist/prompt-style-BdTr09G0.js +9 -0
- package/dist/prompt-style-XexlH5fB.js +9 -0
- package/dist/prompts-BaP7USwc.js +13 -0
- package/dist/prompts-CFRoaX7f.js +13 -0
- package/dist/pw-ai-8Eyk8VuD.js +1649 -0
- package/dist/pw-ai-Cl6-KNxy.js +1650 -0
- package/dist/pw-ai-DRdnHJHd.js +1653 -0
- package/dist/qmd-manager-BAFM4z59.js +619 -0
- package/dist/qmd-manager-Bmxs48Ir.js +615 -0
- package/dist/qmd-manager-CWJVDrwW.js +617 -0
- package/dist/redact-BIMJ3ntQ.js +94 -0
- package/dist/redact-CjQe_7H_.js +97 -0
- package/dist/redact-DAKeu7PA.js +97 -0
- package/dist/register.subclis-Buhb02qd.js +348 -0
- package/dist/reply-E1ga4GXi.js +64123 -0
- package/dist/rolldown-runtime-Cbj13DAv.js +20 -0
- package/dist/routes-CcDbWmxz.js +2410 -0
- package/dist/routes-f7Edit7G.js +2410 -0
- package/dist/rpc-B655pmNJ.js +95 -0
- package/dist/rpc-CGmdslK7.js +95 -0
- package/dist/run-main-7eydAwGv.js +200 -0
- package/dist/sandbox-B4M0ryQ9.js +2945 -0
- package/dist/sandbox-BO_Ngn9c.js +2944 -0
- package/dist/sandbox-cli-CM0-sW9i.js +461 -0
- package/dist/sandbox-cli-CoTcXRmo.js +465 -0
- package/dist/security-cli-B_s4Rfs1.js +511 -0
- package/dist/security-cli-D3igkp01.js +507 -0
- package/dist/server-context-BqWI0WDa.js +740 -0
- package/dist/server-context-DGn4KtxY.js +740 -0
- package/dist/server-node-events-DXWeo9KB.js +224 -0
- package/dist/server-node-events-DxMqJ1vi.js +220 -0
- package/dist/service-BmhixqmA.js +680 -0
- package/dist/service-CkduwhWU.js +680 -0
- package/dist/service-audit-BaAmsSA_.js +542 -0
- package/dist/service-audit-Nmqw1tRw.js +542 -0
- package/dist/session-cost-usage-Oj8cY19d.js +692 -0
- package/dist/session-cost-usage-hz41m3rR.js +692 -0
- package/dist/session-key-Dm2EOhrH.js +177 -0
- package/dist/shared-ByqSbw-o.js +150 -0
- package/dist/shared-CUArCxmj.js +74 -0
- package/dist/shared-DV0YxQE5.js +150 -0
- package/dist/shared-Oinouexg.js +74 -0
- package/dist/skill-scanner-BSMluzCy.js +255 -0
- package/dist/skill-scanner-ClmmXaeD.js +255 -0
- package/dist/skills-CTnvXE52.js +693 -0
- package/dist/skills-cli-B7GNsN5Z.js +292 -0
- package/dist/skills-cli-DfNIFyiP.js +288 -0
- package/dist/skills-iqJKhB3Q.js +694 -0
- package/dist/skills-status-B6Hjszph.js +187 -0
- package/dist/skills-status-B9teTTgu.js +187 -0
- package/dist/sqlite-BK4CGCLp.js +197 -0
- package/dist/sqlite-Dnmf3LS7.js +215 -0
- package/dist/sqlite-wME36UET.js +215 -0
- package/dist/status-BH22yQwC.js +27 -0
- package/dist/status-C09l2YXY.js +3176 -0
- package/dist/status-C_dMhoE0.js +21 -0
- package/dist/status-CoAy6bEC.js +21 -0
- package/dist/status-UIA3ZI_U.js +27 -0
- package/dist/subsystem-MZJ7YwGv.js +771 -0
- package/dist/system-cli-DEm78jPM.js +86 -0
- package/dist/system-cli-DW-cysMR.js +82 -0
- package/dist/systemd-DSVtqGOg.js +438 -0
- package/dist/systemd-QeNHBKY_.js +438 -0
- package/dist/systemd-hints-Bm58h2q6.js +19 -0
- package/dist/systemd-hints-DpYzxoFm.js +19 -0
- package/dist/systemd-linger-6najuv4T.js +75 -0
- package/dist/systemd-linger-BAqwxT4B.js +75 -0
- package/dist/table-BnT-yxX7.js +279 -0
- package/dist/table-Br4x1U8t.js +279 -0
- package/dist/tailnet-PJSFUYzh.js +42 -0
- package/dist/tailnet-tKZZ7PZm.js +42 -0
- package/dist/tailscale-CLOGxzVe.js +225 -0
- package/dist/tailscale-Csps5HaJ.js +252 -0
- package/dist/tool-display-B-D4P2Fx.js +795 -0
- package/dist/tool-display-CeXLhfq_.js +795 -0
- package/dist/transcript-events-C1hdue6u.js +17 -0
- package/dist/transcript-events-CSDpB0zT.js +17 -0
- package/dist/transcript-events-JLH5W4He.js +17 -0
- package/dist/tui-DpSIQB-L.js +2671 -0
- package/dist/tui-M4SDqVBr.js +2672 -0
- package/dist/tui-cli-BgeLL-6G.js +57 -0
- package/dist/tui-cli-DM2GolnA.js +61 -0
- package/dist/update-By6OFSOm.js +317 -0
- package/dist/update-CrY_whxA.js +317 -0
- package/dist/update-cli-Bfsx9UKw.js +1039 -0
- package/dist/update-cli-DoiUKlNw.js +1042 -0
- package/dist/update-runner-LPAHTmXu.js +1458 -0
- package/dist/update-runner-_TG-7dl6.js +1458 -0
- package/dist/usage-format-Bhl_WCWP.js +36 -0
- package/dist/usage-format-C0mOZv3Q.js +36 -0
- package/dist/utils-BQRXRRrc.js +188 -0
- package/dist/utils-DZrCbm8I.js +192 -0
- package/dist/webhooks-cli-D5oYa1jv.js +314 -0
- package/dist/webhooks-cli-HqwLm34I.js +310 -0
- package/dist/widearea-dns-DYYvkzkp.js +127 -0
- package/dist/widearea-dns-pTj59jZd.js +127 -0
- package/dist/ws-CdWr05vX.js +13 -0
- package/dist/ws-log-CDRetW_w.js +267 -0
- package/dist/ws-log-Cmu4Hs9k.js +267 -0
- package/dist/ws-odwH8aKX.js +13 -0
- package/dist/wsl-BrI_Sz-3.js +160 -0
- package/docs/.i18n/README.md +31 -0
- package/docs/.i18n/glossary.zh-CN.json +210 -0
- package/docs/.i18n/zh-CN.tm.jsonl +1329 -0
- package/docs/CNAME +1 -0
- package/docs/assets/macos-onboarding/01-macos-warning.jpeg +0 -0
- package/docs/assets/macos-onboarding/02-local-networks.jpeg +0 -0
- package/docs/assets/macos-onboarding/03-security-notice.png +0 -0
- package/docs/assets/macos-onboarding/04-choose-gateway.png +0 -0
- package/docs/assets/macos-onboarding/05-permissions.png +0 -0
- package/docs/assets/openclaw-logo-text-dark.png +0 -0
- package/docs/assets/openclaw-logo-text.png +0 -0
- package/docs/assets/pixel-lobster.svg +60 -0
- package/docs/assets/showcase/agents-ui.jpg +0 -0
- package/docs/assets/showcase/bambu-cli.png +0 -0
- package/docs/assets/showcase/codexmonitor.png +0 -0
- package/docs/assets/showcase/gohome-grafana.png +0 -0
- package/docs/assets/showcase/ios-testflight.jpg +0 -0
- package/docs/assets/showcase/oura-health.png +0 -0
- package/docs/assets/showcase/padel-cli.svg +11 -0
- package/docs/assets/showcase/padel-screenshot.jpg +0 -0
- package/docs/assets/showcase/papla-tts.jpg +0 -0
- package/docs/assets/showcase/pr-review-telegram.jpg +0 -0
- package/docs/assets/showcase/roborock-screenshot.jpg +0 -0
- package/docs/assets/showcase/roborock-status.svg +13 -0
- package/docs/assets/showcase/roof-camera-sky.jpg +0 -0
- package/docs/assets/showcase/snag.png +0 -0
- package/docs/assets/showcase/tesco-shop.jpg +0 -0
- package/docs/assets/showcase/wienerlinien.png +0 -0
- package/docs/assets/showcase/wine-cellar-skill.jpg +0 -0
- package/docs/assets/showcase/winix-air-purifier.jpg +0 -0
- package/docs/assets/showcase/xuezh-pronunciation.jpeg +0 -0
- package/docs/automation/auth-monitoring.md +44 -0
- package/docs/automation/cron-jobs.md +468 -0
- package/docs/automation/cron-vs-heartbeat.md +282 -0
- package/docs/automation/gmail-pubsub.md +256 -0
- package/docs/automation/poll.md +69 -0
- package/docs/automation/webhook.md +163 -0
- package/docs/bedrock.md +176 -0
- package/docs/brave-search.md +41 -0
- package/docs/broadcast-groups.md +442 -0
- package/docs/channels/bluebubbles.md +338 -0
- package/docs/channels/brah-sync.md +92 -0
- package/docs/channels/discord.md +476 -0
- package/docs/channels/feishu.md +577 -0
- package/docs/channels/googlechat.md +250 -0
- package/docs/channels/grammy.md +31 -0
- package/docs/channels/imessage.md +299 -0
- package/docs/channels/index.md +47 -0
- package/docs/channels/line.md +186 -0
- package/docs/channels/location.md +56 -0
- package/docs/channels/matrix.md +233 -0
- package/docs/channels/mattermost.md +138 -0
- package/docs/channels/msteams.md +768 -0
- package/docs/channels/nextcloud-talk.md +136 -0
- package/docs/channels/nostr.md +233 -0
- package/docs/channels/signal.md +202 -0
- package/docs/channels/slack.md +548 -0
- package/docs/channels/telegram.md +769 -0
- package/docs/channels/tlon.md +132 -0
- package/docs/channels/troubleshooting.md +29 -0
- package/docs/channels/twitch.md +379 -0
- package/docs/channels/whatsapp.md +404 -0
- package/docs/channels/zalo.md +189 -0
- package/docs/channels/zalouser.md +140 -0
- package/docs/cli/acp.md +170 -0
- package/docs/cli/agent.md +24 -0
- package/docs/cli/agents.md +75 -0
- package/docs/cli/approvals.md +50 -0
- package/docs/cli/browser.md +107 -0
- package/docs/cli/channels.md +79 -0
- package/docs/cli/config.md +50 -0
- package/docs/cli/configure.md +33 -0
- package/docs/cli/cron.md +42 -0
- package/docs/cli/dashboard.md +16 -0
- package/docs/cli/devices.md +70 -0
- package/docs/cli/directory.md +63 -0
- package/docs/cli/dns.md +23 -0
- package/docs/cli/docs.md +15 -0
- package/docs/cli/doctor.md +41 -0
- package/docs/cli/gateway.md +202 -0
- package/docs/cli/health.md +21 -0
- package/docs/cli/hooks.md +304 -0
- package/docs/cli/index.md +1031 -0
- package/docs/cli/logs.md +24 -0
- package/docs/cli/memory.md +45 -0
- package/docs/cli/message.md +239 -0
- package/docs/cli/models.md +79 -0
- package/docs/cli/node.md +112 -0
- package/docs/cli/nodes.md +73 -0
- package/docs/cli/onboard.md +43 -0
- package/docs/cli/pairing.md +21 -0
- package/docs/cli/plugins.md +62 -0
- package/docs/cli/reset.md +17 -0
- package/docs/cli/sandbox.md +152 -0
- package/docs/cli/security.md +26 -0
- package/docs/cli/sessions.md +16 -0
- package/docs/cli/setup.md +29 -0
- package/docs/cli/skills.md +26 -0
- package/docs/cli/status.md +26 -0
- package/docs/cli/system.md +60 -0
- package/docs/cli/tui.md +23 -0
- package/docs/cli/uninstall.md +17 -0
- package/docs/cli/update.md +98 -0
- package/docs/cli/voicecall.md +34 -0
- package/docs/cli/webhooks.md +25 -0
- package/docs/concepts/agent-loop.md +146 -0
- package/docs/concepts/agent-workspace.md +233 -0
- package/docs/concepts/agent.md +123 -0
- package/docs/concepts/architecture.md +129 -0
- package/docs/concepts/channel-routing.md +114 -0
- package/docs/concepts/compaction.md +61 -0
- package/docs/concepts/context.md +161 -0
- package/docs/concepts/features.md +53 -0
- package/docs/concepts/group-messages.md +84 -0
- package/docs/concepts/groups.md +373 -0
- package/docs/concepts/markdown-formatting.md +130 -0
- package/docs/concepts/memory.md +546 -0
- package/docs/concepts/messages.md +154 -0
- package/docs/concepts/model-failover.md +149 -0
- package/docs/concepts/model-providers.md +316 -0
- package/docs/concepts/models.md +208 -0
- package/docs/concepts/multi-agent.md +376 -0
- package/docs/concepts/oauth.md +145 -0
- package/docs/concepts/presence.md +102 -0
- package/docs/concepts/queue.md +89 -0
- package/docs/concepts/retry.md +69 -0
- package/docs/concepts/session-pruning.md +122 -0
- package/docs/concepts/session-tool.md +193 -0
- package/docs/concepts/session.md +204 -0
- package/docs/concepts/sessions.md +10 -0
- package/docs/concepts/streaming.md +135 -0
- package/docs/concepts/system-prompt.md +115 -0
- package/docs/concepts/timezone.md +91 -0
- package/docs/concepts/typebox.md +289 -0
- package/docs/concepts/typing-indicators.md +68 -0
- package/docs/concepts/usage-tracking.md +35 -0
- package/docs/date-time.md +128 -0
- package/docs/debug/node-issue.md +83 -0
- package/docs/debugging.md +162 -0
- package/docs/diagnostics/flags.md +91 -0
- package/docs/docs.json +1736 -0
- package/docs/environment.md +81 -0
- package/docs/experiments/onboarding-config-protocol.md +40 -0
- package/docs/experiments/plans/cron-add-hardening.md +63 -0
- package/docs/experiments/plans/group-policy-hardening.md +40 -0
- package/docs/experiments/plans/openresponses-gateway.md +123 -0
- package/docs/experiments/proposals/model-config.md +36 -0
- package/docs/experiments/research/memory.md +228 -0
- package/docs/gateway/authentication.md +145 -0
- package/docs/gateway/background-process.md +93 -0
- package/docs/gateway/bonjour.md +167 -0
- package/docs/gateway/bridge-protocol.md +89 -0
- package/docs/gateway/cli-backends.md +225 -0
- package/docs/gateway/configuration-examples.md +606 -0
- package/docs/gateway/configuration.md +3411 -0
- package/docs/gateway/discovery.md +116 -0
- package/docs/gateway/doctor.md +282 -0
- package/docs/gateway/gateway-lock.md +34 -0
- package/docs/gateway/health.md +35 -0
- package/docs/gateway/heartbeat.md +362 -0
- package/docs/gateway/index.md +328 -0
- package/docs/gateway/local-models.md +150 -0
- package/docs/gateway/logging.md +113 -0
- package/docs/gateway/multiple-gateways.md +112 -0
- package/docs/gateway/network-model.md +17 -0
- package/docs/gateway/openai-http-api.md +118 -0
- package/docs/gateway/openresponses-http-api.md +317 -0
- package/docs/gateway/pairing.md +99 -0
- package/docs/gateway/protocol.md +221 -0
- package/docs/gateway/remote-gateway-readme.md +157 -0
- package/docs/gateway/remote.md +129 -0
- package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +128 -0
- package/docs/gateway/sandboxing.md +193 -0
- package/docs/gateway/security/formal-verification.md +164 -0
- package/docs/gateway/security/index.md +825 -0
- package/docs/gateway/tailscale.md +127 -0
- package/docs/gateway/tools-invoke-http-api.md +85 -0
- package/docs/gateway/troubleshooting.md +767 -0
- package/docs/help/faq.md +2829 -0
- package/docs/help/index.md +21 -0
- package/docs/help/submitting-a-pr.md +214 -0
- package/docs/help/submitting-an-issue.md +165 -0
- package/docs/help/troubleshooting.md +98 -0
- package/docs/hooks/soul-evil.md +69 -0
- package/docs/hooks.md +913 -0
- package/docs/images/feishu-step2-create-app.png +0 -0
- package/docs/images/feishu-step3-credentials.png +0 -0
- package/docs/images/feishu-step4-permissions.png +0 -0
- package/docs/images/feishu-step5-bot-capability.png +0 -0
- package/docs/images/feishu-step6-event-subscription.png +0 -0
- package/docs/images/groups-flow.svg +52 -0
- package/docs/images/mobile-ui-screenshot.png +0 -0
- package/docs/index.md +192 -0
- package/docs/install/ansible.md +208 -0
- package/docs/install/bun.md +59 -0
- package/docs/install/development-channels.md +75 -0
- package/docs/install/docker.md +567 -0
- package/docs/install/exe-dev.md +126 -0
- package/docs/install/fly.md +486 -0
- package/docs/install/gcp.md +503 -0
- package/docs/install/hetzner.md +330 -0
- package/docs/install/index.md +187 -0
- package/docs/install/installer.md +123 -0
- package/docs/install/macos-vm.md +281 -0
- package/docs/install/migrating.md +192 -0
- package/docs/install/nix.md +96 -0
- package/docs/install/node.md +78 -0
- package/docs/install/northflank.mdx +53 -0
- package/docs/install/railway.mdx +99 -0
- package/docs/install/render.mdx +165 -0
- package/docs/install/uninstall.md +128 -0
- package/docs/install/updating.md +228 -0
- package/docs/logging.md +350 -0
- package/docs/multi-agent-sandbox-tools.md +395 -0
- package/docs/network.md +54 -0
- package/docs/nodes/audio.md +114 -0
- package/docs/nodes/camera.md +156 -0
- package/docs/nodes/images.md +72 -0
- package/docs/nodes/index.md +341 -0
- package/docs/nodes/location-command.md +113 -0
- package/docs/nodes/media-understanding.md +379 -0
- package/docs/nodes/talk.md +90 -0
- package/docs/nodes/voicewake.md +65 -0
- package/docs/perplexity.md +80 -0
- package/docs/pi-dev.md +70 -0
- package/docs/pi.md +612 -0
- package/docs/platforms/android.md +148 -0
- package/docs/platforms/digitalocean.md +262 -0
- package/docs/platforms/index.md +53 -0
- package/docs/platforms/ios.md +107 -0
- package/docs/platforms/linux.md +94 -0
- package/docs/platforms/mac/bundled-gateway.md +73 -0
- package/docs/platforms/mac/canvas.md +125 -0
- package/docs/platforms/mac/child-process.md +69 -0
- package/docs/platforms/mac/dev-setup.md +102 -0
- package/docs/platforms/mac/health.md +34 -0
- package/docs/platforms/mac/icon.md +31 -0
- package/docs/platforms/mac/logging.md +57 -0
- package/docs/platforms/mac/menu-bar.md +81 -0
- package/docs/platforms/mac/peekaboo.md +65 -0
- package/docs/platforms/mac/permissions.md +44 -0
- package/docs/platforms/mac/release.md +85 -0
- package/docs/platforms/mac/remote.md +83 -0
- package/docs/platforms/mac/signing.md +47 -0
- package/docs/platforms/mac/skills.md +33 -0
- package/docs/platforms/mac/voice-overlay.md +60 -0
- package/docs/platforms/mac/voicewake.md +67 -0
- package/docs/platforms/mac/webchat.md +41 -0
- package/docs/platforms/mac/xpc.md +61 -0
- package/docs/platforms/macos.md +203 -0
- package/docs/platforms/oracle.md +303 -0
- package/docs/platforms/raspberry-pi.md +358 -0
- package/docs/platforms/windows.md +159 -0
- package/docs/plugin.md +664 -0
- package/docs/plugins/agent-tools.md +99 -0
- package/docs/plugins/manifest.md +71 -0
- package/docs/plugins/voice-call.md +284 -0
- package/docs/plugins/zalouser.md +81 -0
- package/docs/prose.md +134 -0
- package/docs/providers/anthropic.md +152 -0
- package/docs/providers/claude-max-api-proxy.md +148 -0
- package/docs/providers/cloudflare-ai-gateway.md +71 -0
- package/docs/providers/deepgram.md +93 -0
- package/docs/providers/github-copilot.md +72 -0
- package/docs/providers/glm.md +33 -0
- package/docs/providers/index.md +63 -0
- package/docs/providers/minimax.md +208 -0
- package/docs/providers/models.md +51 -0
- package/docs/providers/moonshot.md +142 -0
- package/docs/providers/ollama.md +277 -0
- package/docs/providers/openai.md +62 -0
- package/docs/providers/opencode.md +36 -0
- package/docs/providers/openrouter.md +37 -0
- package/docs/providers/qwen.md +53 -0
- package/docs/providers/synthetic.md +99 -0
- package/docs/providers/venice.md +267 -0
- package/docs/providers/vercel-ai-gateway.md +50 -0
- package/docs/providers/xiaomi.md +64 -0
- package/docs/providers/zai.md +36 -0
- package/docs/refactor/clawnet.md +417 -0
- package/docs/refactor/exec-host.md +316 -0
- package/docs/refactor/outbound-session-mirroring.md +85 -0
- package/docs/refactor/plugin-sdk.md +214 -0
- package/docs/refactor/strict-config.md +93 -0
- package/docs/reference/AGENTS.default.md +124 -0
- package/docs/reference/RELEASING.md +120 -0
- package/docs/reference/api-usage-costs.md +137 -0
- package/docs/reference/credits.md +27 -0
- package/docs/reference/device-models.md +47 -0
- package/docs/reference/rpc.md +43 -0
- package/docs/reference/session-management-compaction.md +285 -0
- package/docs/reference/templates/AGENTS.dev.md +83 -0
- package/docs/reference/templates/AGENTS.md +218 -0
- package/docs/reference/templates/BOOT.md +10 -0
- package/docs/reference/templates/BOOTSTRAP.md +61 -0
- package/docs/reference/templates/HEARTBEAT.md +11 -0
- package/docs/reference/templates/IDENTITY.dev.md +47 -0
- package/docs/reference/templates/IDENTITY.md +27 -0
- package/docs/reference/templates/SOUL.dev.md +76 -0
- package/docs/reference/templates/SOUL.md +42 -0
- package/docs/reference/templates/TOOLS.dev.md +24 -0
- package/docs/reference/templates/TOOLS.md +46 -0
- package/docs/reference/templates/USER.dev.md +18 -0
- package/docs/reference/templates/USER.md +22 -0
- package/docs/reference/test.md +50 -0
- package/docs/reference/transcript-hygiene.md +129 -0
- package/docs/reference/wizard.md +268 -0
- package/docs/scripts.md +28 -0
- package/docs/security/formal-verification.md +164 -0
- package/docs/start/bootstrapping.md +41 -0
- package/docs/start/docs-directory.md +64 -0
- package/docs/start/getting-started.md +120 -0
- package/docs/start/hubs.md +197 -0
- package/docs/start/lore.md +219 -0
- package/docs/start/onboarding.md +80 -0
- package/docs/start/openclaw.md +224 -0
- package/docs/start/pairing.md +86 -0
- package/docs/start/quickstart.md +22 -0
- package/docs/start/setup.md +162 -0
- package/docs/start/showcase.md +416 -0
- package/docs/start/wizard-cli-automation.md +141 -0
- package/docs/start/wizard-cli-reference.md +244 -0
- package/docs/start/wizard.md +108 -0
- package/docs/style.css +3 -0
- package/docs/testing.md +368 -0
- package/docs/token-use.md +112 -0
- package/docs/tools/agent-send.md +53 -0
- package/docs/tools/apply-patch.md +50 -0
- package/docs/tools/browser-linux-troubleshooting.md +139 -0
- package/docs/tools/browser-login.md +68 -0
- package/docs/tools/browser.md +576 -0
- package/docs/tools/chrome-extension.md +178 -0
- package/docs/tools/clawhub.md +257 -0
- package/docs/tools/creating-skills.md +54 -0
- package/docs/tools/elevated.md +57 -0
- package/docs/tools/exec-approvals.md +246 -0
- package/docs/tools/exec.md +179 -0
- package/docs/tools/firecrawl.md +61 -0
- package/docs/tools/index.md +512 -0
- package/docs/tools/llm-task.md +115 -0
- package/docs/tools/lobster.md +342 -0
- package/docs/tools/reactions.md +22 -0
- package/docs/tools/skills-config.md +76 -0
- package/docs/tools/skills.md +300 -0
- package/docs/tools/slash-commands.md +198 -0
- package/docs/tools/subagents.md +151 -0
- package/docs/tools/thinking.md +74 -0
- package/docs/tools/web.md +261 -0
- package/docs/tts.md +396 -0
- package/docs/tui.md +162 -0
- package/docs/vps.md +43 -0
- package/docs/web/control-ui.md +223 -0
- package/docs/web/dashboard.md +46 -0
- package/docs/web/index.md +116 -0
- package/docs/web/webchat.md +49 -0
- package/docs/whatsapp-openclaw-ai-zh.jpg +0 -0
- package/docs/whatsapp-openclaw.jpg +0 -0
- package/docs/zh-CN/AGENTS.md +59 -0
- package/docs/zh-CN/automation/auth-monitoring.md +47 -0
- package/docs/zh-CN/automation/cron-jobs.md +424 -0
- package/docs/zh-CN/automation/cron-vs-heartbeat.md +286 -0
- package/docs/zh-CN/automation/gmail-pubsub.md +249 -0
- package/docs/zh-CN/automation/poll.md +76 -0
- package/docs/zh-CN/automation/webhook.md +163 -0
- package/docs/zh-CN/bedrock.md +170 -0
- package/docs/zh-CN/brave-search.md +48 -0
- package/docs/zh-CN/broadcast-groups.md +449 -0
- package/docs/zh-CN/channels/bluebubbles.md +271 -0
- package/docs/zh-CN/channels/discord.md +468 -0
- package/docs/zh-CN/channels/feishu.md +629 -0
- package/docs/zh-CN/channels/googlechat.md +257 -0
- package/docs/zh-CN/channels/grammy.md +38 -0
- package/docs/zh-CN/channels/imessage.md +302 -0
- package/docs/zh-CN/channels/index.md +53 -0
- package/docs/zh-CN/channels/line.md +180 -0
- package/docs/zh-CN/channels/location.md +63 -0
- package/docs/zh-CN/channels/matrix.md +221 -0
- package/docs/zh-CN/channels/mattermost.md +144 -0
- package/docs/zh-CN/channels/msteams.md +775 -0
- package/docs/zh-CN/channels/nextcloud-talk.md +142 -0
- package/docs/zh-CN/channels/nostr.md +240 -0
- package/docs/zh-CN/channels/signal.md +209 -0
- package/docs/zh-CN/channels/slack.md +531 -0
- package/docs/zh-CN/channels/telegram.md +751 -0
- package/docs/zh-CN/channels/tlon.md +136 -0
- package/docs/zh-CN/channels/troubleshooting.md +36 -0
- package/docs/zh-CN/channels/twitch.md +385 -0
- package/docs/zh-CN/channels/whatsapp.md +411 -0
- package/docs/zh-CN/channels/zalo.md +196 -0
- package/docs/zh-CN/channels/zalouser.md +147 -0
- package/docs/zh-CN/cli/acp.md +173 -0
- package/docs/zh-CN/cli/agent.md +30 -0
- package/docs/zh-CN/cli/agents.md +82 -0
- package/docs/zh-CN/cli/approvals.md +57 -0
- package/docs/zh-CN/cli/browser.md +114 -0
- package/docs/zh-CN/cli/channels.md +86 -0
- package/docs/zh-CN/cli/config.md +57 -0
- package/docs/zh-CN/cli/configure.md +38 -0
- package/docs/zh-CN/cli/cron.md +43 -0
- package/docs/zh-CN/cli/dashboard.md +23 -0
- package/docs/zh-CN/cli/devices.md +74 -0
- package/docs/zh-CN/cli/directory.md +70 -0
- package/docs/zh-CN/cli/dns.md +30 -0
- package/docs/zh-CN/cli/docs.md +22 -0
- package/docs/zh-CN/cli/doctor.md +48 -0
- package/docs/zh-CN/cli/gateway.md +206 -0
- package/docs/zh-CN/cli/health.md +28 -0
- package/docs/zh-CN/cli/hooks.md +311 -0
- package/docs/zh-CN/cli/index.md +1032 -0
- package/docs/zh-CN/cli/logs.md +31 -0
- package/docs/zh-CN/cli/memory.md +52 -0
- package/docs/zh-CN/cli/message.md +246 -0
- package/docs/zh-CN/cli/models.md +85 -0
- package/docs/zh-CN/cli/node.md +115 -0
- package/docs/zh-CN/cli/nodes.md +80 -0
- package/docs/zh-CN/cli/onboard.md +36 -0
- package/docs/zh-CN/cli/pairing.md +28 -0
- package/docs/zh-CN/cli/plugins.md +66 -0
- package/docs/zh-CN/cli/reset.md +24 -0
- package/docs/zh-CN/cli/sandbox.md +158 -0
- package/docs/zh-CN/cli/security.md +33 -0
- package/docs/zh-CN/cli/sessions.md +23 -0
- package/docs/zh-CN/cli/setup.md +36 -0
- package/docs/zh-CN/cli/skills.md +33 -0
- package/docs/zh-CN/cli/status.md +33 -0
- package/docs/zh-CN/cli/system.md +63 -0
- package/docs/zh-CN/cli/tui.md +30 -0
- package/docs/zh-CN/cli/uninstall.md +24 -0
- package/docs/zh-CN/cli/update.md +101 -0
- package/docs/zh-CN/cli/voicecall.md +41 -0
- package/docs/zh-CN/cli/webhooks.md +32 -0
- package/docs/zh-CN/concepts/agent-loop.md +146 -0
- package/docs/zh-CN/concepts/agent-workspace.md +219 -0
- package/docs/zh-CN/concepts/agent.md +115 -0
- package/docs/zh-CN/concepts/architecture.md +123 -0
- package/docs/zh-CN/concepts/channel-routing.md +117 -0
- package/docs/zh-CN/concepts/compaction.md +67 -0
- package/docs/zh-CN/concepts/context.md +168 -0
- package/docs/zh-CN/concepts/features.md +59 -0
- package/docs/zh-CN/concepts/group-messages.md +91 -0
- package/docs/zh-CN/concepts/groups.md +379 -0
- package/docs/zh-CN/concepts/markdown-formatting.md +117 -0
- package/docs/zh-CN/concepts/memory.md +412 -0
- package/docs/zh-CN/concepts/messages.md +141 -0
- package/docs/zh-CN/concepts/model-failover.md +145 -0
- package/docs/zh-CN/concepts/model-providers.md +320 -0
- package/docs/zh-CN/concepts/models.md +196 -0
- package/docs/zh-CN/concepts/multi-agent.md +372 -0
- package/docs/zh-CN/concepts/oauth.md +151 -0
- package/docs/zh-CN/concepts/presence.md +99 -0
- package/docs/zh-CN/concepts/queue.md +94 -0
- package/docs/zh-CN/concepts/retry.md +76 -0
- package/docs/zh-CN/concepts/session-pruning.md +129 -0
- package/docs/zh-CN/concepts/session-tool.md +200 -0
- package/docs/zh-CN/concepts/session.md +166 -0
- package/docs/zh-CN/concepts/sessions.md +17 -0
- package/docs/zh-CN/concepts/streaming.md +133 -0
- package/docs/zh-CN/concepts/system-prompt.md +101 -0
- package/docs/zh-CN/concepts/timezone.md +96 -0
- package/docs/zh-CN/concepts/typebox.md +284 -0
- package/docs/zh-CN/concepts/typing-indicators.md +74 -0
- package/docs/zh-CN/concepts/usage-tracking.md +42 -0
- package/docs/zh-CN/date-time.md +129 -0
- package/docs/zh-CN/debug/node-issue.md +90 -0
- package/docs/zh-CN/debugging.md +160 -0
- package/docs/zh-CN/diagnostics/flags.md +98 -0
- package/docs/zh-CN/environment.md +88 -0
- package/docs/zh-CN/experiments/onboarding-config-protocol.md +47 -0
- package/docs/zh-CN/experiments/plans/cron-add-hardening.md +70 -0
- package/docs/zh-CN/experiments/plans/group-policy-hardening.md +45 -0
- package/docs/zh-CN/experiments/plans/openresponses-gateway.md +121 -0
- package/docs/zh-CN/experiments/proposals/model-config.md +42 -0
- package/docs/zh-CN/experiments/research/memory.md +235 -0
- package/docs/zh-CN/gateway/authentication.md +142 -0
- package/docs/zh-CN/gateway/background-process.md +100 -0
- package/docs/zh-CN/gateway/bonjour.md +174 -0
- package/docs/zh-CN/gateway/bridge-protocol.md +86 -0
- package/docs/zh-CN/gateway/cli-backends.md +213 -0
- package/docs/zh-CN/gateway/configuration-examples.md +587 -0
- package/docs/zh-CN/gateway/configuration.md +3332 -0
- package/docs/zh-CN/gateway/discovery.md +123 -0
- package/docs/zh-CN/gateway/doctor.md +238 -0
- package/docs/zh-CN/gateway/gateway-lock.md +41 -0
- package/docs/zh-CN/gateway/health.md +42 -0
- package/docs/zh-CN/gateway/heartbeat.md +274 -0
- package/docs/zh-CN/gateway/index.md +335 -0
- package/docs/zh-CN/gateway/local-models.md +157 -0
- package/docs/zh-CN/gateway/logging.md +114 -0
- package/docs/zh-CN/gateway/multiple-gateways.md +119 -0
- package/docs/zh-CN/gateway/network-model.md +23 -0
- package/docs/zh-CN/gateway/openai-http-api.md +125 -0
- package/docs/zh-CN/gateway/openresponses-http-api.md +317 -0
- package/docs/zh-CN/gateway/pairing.md +99 -0
- package/docs/zh-CN/gateway/protocol.md +220 -0
- package/docs/zh-CN/gateway/remote-gateway-readme.md +164 -0
- package/docs/zh-CN/gateway/remote.md +133 -0
- package/docs/zh-CN/gateway/sandbox-vs-tool-policy-vs-elevated.md +135 -0
- package/docs/zh-CN/gateway/sandboxing.md +188 -0
- package/docs/zh-CN/gateway/security/formal-verification.md +169 -0
- package/docs/zh-CN/gateway/security/index.md +777 -0
- package/docs/zh-CN/gateway/tailscale.md +124 -0
- package/docs/zh-CN/gateway/tools-invoke-http-api.md +92 -0
- package/docs/zh-CN/gateway/troubleshooting.md +771 -0
- package/docs/zh-CN/help/faq.md +2628 -0
- package/docs/zh-CN/help/index.md +28 -0
- package/docs/zh-CN/help/troubleshooting.md +104 -0
- package/docs/zh-CN/hooks/soul-evil.md +72 -0
- package/docs/zh-CN/hooks.md +919 -0
- package/docs/zh-CN/index.md +186 -0
- package/docs/zh-CN/install/ansible.md +215 -0
- package/docs/zh-CN/install/bun.md +65 -0
- package/docs/zh-CN/install/development-channels.md +81 -0
- package/docs/zh-CN/install/docker.md +532 -0
- package/docs/zh-CN/install/exe-dev.md +127 -0
- package/docs/zh-CN/install/fly.md +490 -0
- package/docs/zh-CN/install/gcp.md +510 -0
- package/docs/zh-CN/install/hetzner.md +337 -0
- package/docs/zh-CN/install/index.md +193 -0
- package/docs/zh-CN/install/installer.md +128 -0
- package/docs/zh-CN/install/macos-vm.md +288 -0
- package/docs/zh-CN/install/migrating.md +199 -0
- package/docs/zh-CN/install/nix.md +99 -0
- package/docs/zh-CN/install/node.md +85 -0
- package/docs/zh-CN/install/northflank.mdx +60 -0
- package/docs/zh-CN/install/railway.mdx +106 -0
- package/docs/zh-CN/install/render.mdx +169 -0
- package/docs/zh-CN/install/uninstall.md +135 -0
- package/docs/zh-CN/install/updating.md +233 -0
- package/docs/zh-CN/logging.md +329 -0
- package/docs/zh-CN/multi-agent-sandbox-tools.md +401 -0
- package/docs/zh-CN/network.md +59 -0
- package/docs/zh-CN/nodes/audio.md +120 -0
- package/docs/zh-CN/nodes/camera.md +162 -0
- package/docs/zh-CN/nodes/images.md +79 -0
- package/docs/zh-CN/nodes/index.md +348 -0
- package/docs/zh-CN/nodes/location-command.md +120 -0
- package/docs/zh-CN/nodes/media-understanding.md +380 -0
- package/docs/zh-CN/nodes/talk.md +97 -0
- package/docs/zh-CN/nodes/voicewake.md +72 -0
- package/docs/zh-CN/perplexity.md +84 -0
- package/docs/zh-CN/pi-dev.md +77 -0
- package/docs/zh-CN/pi.md +619 -0
- package/docs/zh-CN/platforms/android.md +155 -0
- package/docs/zh-CN/platforms/digitalocean.md +269 -0
- package/docs/zh-CN/platforms/index.md +60 -0
- package/docs/zh-CN/platforms/ios.md +114 -0
- package/docs/zh-CN/platforms/linux.md +101 -0
- package/docs/zh-CN/platforms/mac/bundled-gateway.md +75 -0
- package/docs/zh-CN/platforms/mac/canvas.md +128 -0
- package/docs/zh-CN/platforms/mac/child-process.md +73 -0
- package/docs/zh-CN/platforms/mac/dev-setup.md +109 -0
- package/docs/zh-CN/platforms/mac/health.md +41 -0
- package/docs/zh-CN/platforms/mac/icon.md +38 -0
- package/docs/zh-CN/platforms/mac/logging.md +64 -0
- package/docs/zh-CN/platforms/mac/menu-bar.md +88 -0
- package/docs/zh-CN/platforms/mac/peekaboo.md +62 -0
- package/docs/zh-CN/platforms/mac/permissions.md +46 -0
- package/docs/zh-CN/platforms/mac/release.md +92 -0
- package/docs/zh-CN/platforms/mac/remote.md +90 -0
- package/docs/zh-CN/platforms/mac/signing.md +54 -0
- package/docs/zh-CN/platforms/mac/skills.md +40 -0
- package/docs/zh-CN/platforms/mac/voice-overlay.md +67 -0
- package/docs/zh-CN/platforms/mac/voicewake.md +74 -0
- package/docs/zh-CN/platforms/mac/webchat.md +43 -0
- package/docs/zh-CN/platforms/mac/xpc.md +68 -0
- package/docs/zh-CN/platforms/macos.md +193 -0
- package/docs/zh-CN/platforms/oracle.md +310 -0
- package/docs/zh-CN/platforms/raspberry-pi.md +365 -0
- package/docs/zh-CN/platforms/windows.md +156 -0
- package/docs/zh-CN/plugin.md +639 -0
- package/docs/zh-CN/plugins/agent-tools.md +99 -0
- package/docs/zh-CN/plugins/manifest.md +68 -0
- package/docs/zh-CN/plugins/voice-call.md +250 -0
- package/docs/zh-CN/plugins/zalouser.md +88 -0
- package/docs/zh-CN/prose.md +141 -0
- package/docs/zh-CN/providers/anthropic.md +159 -0
- package/docs/zh-CN/providers/claude-max-api-proxy.md +155 -0
- package/docs/zh-CN/providers/deepgram.md +97 -0
- package/docs/zh-CN/providers/github-copilot.md +67 -0
- package/docs/zh-CN/providers/glm.md +39 -0
- package/docs/zh-CN/providers/index.md +68 -0
- package/docs/zh-CN/providers/minimax.md +206 -0
- package/docs/zh-CN/providers/models.md +55 -0
- package/docs/zh-CN/providers/moonshot.md +145 -0
- package/docs/zh-CN/providers/ollama.md +230 -0
- package/docs/zh-CN/providers/openai.md +68 -0
- package/docs/zh-CN/providers/opencode.md +41 -0
- package/docs/zh-CN/providers/openrouter.md +43 -0
- package/docs/zh-CN/providers/qwen.md +55 -0
- package/docs/zh-CN/providers/synthetic.md +102 -0
- package/docs/zh-CN/providers/venice.md +274 -0
- package/docs/zh-CN/providers/vercel-ai-gateway.md +57 -0
- package/docs/zh-CN/providers/xiaomi.md +68 -0
- package/docs/zh-CN/providers/zai.md +41 -0
- package/docs/zh-CN/refactor/clawnet.md +424 -0
- package/docs/zh-CN/refactor/exec-host.md +323 -0
- package/docs/zh-CN/refactor/outbound-session-mirroring.md +92 -0
- package/docs/zh-CN/refactor/plugin-sdk.md +221 -0
- package/docs/zh-CN/refactor/strict-config.md +100 -0
- package/docs/zh-CN/reference/AGENTS.default.md +131 -0
- package/docs/zh-CN/reference/RELEASING.md +123 -0
- package/docs/zh-CN/reference/api-usage-costs.md +136 -0
- package/docs/zh-CN/reference/credits.md +34 -0
- package/docs/zh-CN/reference/device-models.md +54 -0
- package/docs/zh-CN/reference/rpc.md +48 -0
- package/docs/zh-CN/reference/session-management-compaction.md +287 -0
- package/docs/zh-CN/reference/templates/AGENTS.dev.md +89 -0
- package/docs/zh-CN/reference/templates/AGENTS.md +225 -0
- package/docs/zh-CN/reference/templates/BOOT.md +17 -0
- package/docs/zh-CN/reference/templates/BOOTSTRAP.md +68 -0
- package/docs/zh-CN/reference/templates/HEARTBEAT.md +18 -0
- package/docs/zh-CN/reference/templates/IDENTITY.dev.md +54 -0
- package/docs/zh-CN/reference/templates/IDENTITY.md +35 -0
- package/docs/zh-CN/reference/templates/SOUL.dev.md +83 -0
- package/docs/zh-CN/reference/templates/SOUL.md +49 -0
- package/docs/zh-CN/reference/templates/TOOLS.dev.md +31 -0
- package/docs/zh-CN/reference/templates/TOOLS.md +53 -0
- package/docs/zh-CN/reference/templates/USER.dev.md +25 -0
- package/docs/zh-CN/reference/templates/USER.md +30 -0
- package/docs/zh-CN/reference/test.md +57 -0
- package/docs/zh-CN/reference/transcript-hygiene.md +109 -0
- package/docs/zh-CN/scripts.md +35 -0
- package/docs/zh-CN/security/formal-verification.md +171 -0
- package/docs/zh-CN/start/docs-directory.md +70 -0
- package/docs/zh-CN/start/getting-started.md +206 -0
- package/docs/zh-CN/start/hubs.md +200 -0
- package/docs/zh-CN/start/lore.md +226 -0
- package/docs/zh-CN/start/onboarding.md +105 -0
- package/docs/zh-CN/start/openclaw.md +248 -0
- package/docs/zh-CN/start/pairing.md +89 -0
- package/docs/zh-CN/start/quickstart.md +88 -0
- package/docs/zh-CN/start/setup.md +153 -0
- package/docs/zh-CN/start/showcase.md +423 -0
- package/docs/zh-CN/start/wizard.md +331 -0
- package/docs/zh-CN/testing.md +375 -0
- package/docs/zh-CN/token-use.md +119 -0
- package/docs/zh-CN/tools/agent-send.md +59 -0
- package/docs/zh-CN/tools/apply-patch.md +57 -0
- package/docs/zh-CN/tools/browser-linux-troubleshooting.md +144 -0
- package/docs/zh-CN/tools/browser-login.md +75 -0
- package/docs/zh-CN/tools/browser.md +553 -0
- package/docs/zh-CN/tools/chrome-extension.md +183 -0
- package/docs/zh-CN/tools/clawhub.md +209 -0
- package/docs/zh-CN/tools/creating-skills.md +61 -0
- package/docs/zh-CN/tools/elevated.md +64 -0
- package/docs/zh-CN/tools/exec-approvals.md +234 -0
- package/docs/zh-CN/tools/exec.md +169 -0
- package/docs/zh-CN/tools/firecrawl.md +68 -0
- package/docs/zh-CN/tools/index.md +515 -0
- package/docs/zh-CN/tools/llm-task.md +117 -0
- package/docs/zh-CN/tools/lobster.md +349 -0
- package/docs/zh-CN/tools/reactions.md +29 -0
- package/docs/zh-CN/tools/skills-config.md +78 -0
- package/docs/zh-CN/tools/skills.md +279 -0
- package/docs/zh-CN/tools/slash-commands.md +205 -0
- package/docs/zh-CN/tools/subagents.md +156 -0
- package/docs/zh-CN/tools/thinking.md +80 -0
- package/docs/zh-CN/tools/web.md +257 -0
- package/docs/zh-CN/tts.md +375 -0
- package/docs/zh-CN/tui.md +166 -0
- package/docs/zh-CN/vps.md +47 -0
- package/docs/zh-CN/web/control-ui.md +191 -0
- package/docs/zh-CN/web/dashboard.md +53 -0
- package/docs/zh-CN/web/index.md +118 -0
- package/docs/zh-CN/web/webchat.md +56 -0
- package/extensions/bluebubbles/README.md +45 -0
- package/extensions/bluebubbles/index.ts +19 -0
- package/extensions/bluebubbles/node_modules/.bin/clawbrah +21 -0
- package/extensions/bluebubbles/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/bluebubbles/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/bluebubbles/node_modules/.bin/openclaw +21 -0
- package/extensions/bluebubbles/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/bluebubbles/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/bluebubbles/openclaw.plugin.json +9 -0
- package/extensions/bluebubbles/package.json +36 -0
- package/extensions/bluebubbles/src/accounts.ts +88 -0
- package/extensions/bluebubbles/src/actions.test.ts +650 -0
- package/extensions/bluebubbles/src/actions.ts +438 -0
- package/extensions/bluebubbles/src/attachments.test.ts +345 -0
- package/extensions/bluebubbles/src/attachments.ts +300 -0
- package/extensions/bluebubbles/src/channel.ts +414 -0
- package/extensions/bluebubbles/src/chat.test.ts +461 -0
- package/extensions/bluebubbles/src/chat.ts +378 -0
- package/extensions/bluebubbles/src/config-schema.ts +51 -0
- package/extensions/bluebubbles/src/media-send.ts +174 -0
- package/extensions/bluebubbles/src/monitor.test.ts +2342 -0
- package/extensions/bluebubbles/src/monitor.ts +2499 -0
- package/extensions/bluebubbles/src/onboarding.ts +352 -0
- package/extensions/bluebubbles/src/probe.ts +135 -0
- package/extensions/bluebubbles/src/reactions.test.ts +392 -0
- package/extensions/bluebubbles/src/reactions.ts +188 -0
- package/extensions/bluebubbles/src/runtime.ts +14 -0
- package/extensions/bluebubbles/src/send.test.ts +808 -0
- package/extensions/bluebubbles/src/send.ts +467 -0
- package/extensions/bluebubbles/src/targets.test.ts +183 -0
- package/extensions/bluebubbles/src/targets.ts +422 -0
- package/extensions/bluebubbles/src/types.ts +127 -0
- package/extensions/brah-sync/README.md +53 -0
- package/extensions/brah-sync/index.ts +19 -0
- package/extensions/brah-sync/node_modules/.bin/clawbrah +21 -0
- package/extensions/brah-sync/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/brah-sync/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/brah-sync/node_modules/.bin/openclaw +21 -0
- package/extensions/brah-sync/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/brah-sync/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/brah-sync/openclaw.plugin.json +9 -0
- package/extensions/brah-sync/package.json +12 -0
- package/extensions/brah-sync/src/channel.ts +100 -0
- package/extensions/brah-sync/src/config-schema.ts +35 -0
- package/extensions/brah-sync/src/runtime.ts +14 -0
- package/extensions/copilot-proxy/README.md +24 -0
- package/extensions/copilot-proxy/index.ts +149 -0
- package/extensions/copilot-proxy/node_modules/.bin/clawbrah +21 -0
- package/extensions/copilot-proxy/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/copilot-proxy/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/copilot-proxy/node_modules/.bin/openclaw +21 -0
- package/extensions/copilot-proxy/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/copilot-proxy/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/copilot-proxy/openclaw.plugin.json +9 -0
- package/extensions/copilot-proxy/package.json +14 -0
- package/extensions/diagnostics-otel/index.ts +15 -0
- package/extensions/diagnostics-otel/node_modules/.bin/acorn +21 -0
- package/extensions/diagnostics-otel/node_modules/.bin/acorn.CMD +12 -0
- package/extensions/diagnostics-otel/node_modules/.bin/acorn.ps1 +41 -0
- package/extensions/diagnostics-otel/node_modules/.bin/clawbrah +21 -0
- package/extensions/diagnostics-otel/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/diagnostics-otel/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/diagnostics-otel/node_modules/.bin/openclaw +21 -0
- package/extensions/diagnostics-otel/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/diagnostics-otel/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/diagnostics-otel/openclaw.plugin.json +8 -0
- package/extensions/diagnostics-otel/package.json +27 -0
- package/extensions/diagnostics-otel/src/service.test.ts +226 -0
- package/extensions/diagnostics-otel/src/service.ts +635 -0
- package/extensions/discord/index.ts +17 -0
- package/extensions/discord/node_modules/.bin/clawbrah +21 -0
- package/extensions/discord/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/discord/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/discord/node_modules/.bin/openclaw +21 -0
- package/extensions/discord/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/discord/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/discord/openclaw.plugin.json +9 -0
- package/extensions/discord/package.json +14 -0
- package/extensions/discord/src/channel.ts +422 -0
- package/extensions/discord/src/runtime.ts +14 -0
- package/extensions/feishu/index.ts +63 -0
- package/extensions/feishu/node_modules/.bin/clawbrah +21 -0
- package/extensions/feishu/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/feishu/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/feishu/node_modules/.bin/openclaw +21 -0
- package/extensions/feishu/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/feishu/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/feishu/openclaw.plugin.json +10 -0
- package/extensions/feishu/package.json +37 -0
- package/extensions/feishu/skills/feishu-doc/SKILL.md +105 -0
- package/extensions/feishu/skills/feishu-doc/references/block-types.md +103 -0
- package/extensions/feishu/skills/feishu-drive/SKILL.md +97 -0
- package/extensions/feishu/skills/feishu-perm/SKILL.md +119 -0
- package/extensions/feishu/skills/feishu-wiki/SKILL.md +111 -0
- package/extensions/feishu/src/accounts.ts +144 -0
- package/extensions/feishu/src/bitable.ts +459 -0
- package/extensions/feishu/src/bot.ts +871 -0
- package/extensions/feishu/src/channel.ts +341 -0
- package/extensions/feishu/src/client.ts +118 -0
- package/extensions/feishu/src/config-schema.ts +172 -0
- package/extensions/feishu/src/directory.ts +177 -0
- package/extensions/feishu/src/doc-schema.ts +47 -0
- package/extensions/feishu/src/docx.ts +521 -0
- package/extensions/feishu/src/drive-schema.ts +46 -0
- package/extensions/feishu/src/drive.ts +227 -0
- package/extensions/feishu/src/media.ts +527 -0
- package/extensions/feishu/src/mention.ts +126 -0
- package/extensions/feishu/src/monitor.ts +190 -0
- package/extensions/feishu/src/onboarding.ts +356 -0
- package/extensions/feishu/src/outbound.ts +40 -0
- package/extensions/feishu/src/perm-schema.ts +52 -0
- package/extensions/feishu/src/perm.ts +173 -0
- package/extensions/feishu/src/policy.ts +104 -0
- package/extensions/feishu/src/probe.ts +44 -0
- package/extensions/feishu/src/reactions.ts +160 -0
- package/extensions/feishu/src/reply-dispatcher.ts +184 -0
- package/extensions/feishu/src/runtime.ts +14 -0
- package/extensions/feishu/src/send.ts +358 -0
- package/extensions/feishu/src/targets.ts +78 -0
- package/extensions/feishu/src/tools-config.ts +21 -0
- package/extensions/feishu/src/types.ts +75 -0
- package/extensions/feishu/src/typing.ts +80 -0
- package/extensions/feishu/src/wiki-schema.ts +55 -0
- package/extensions/feishu/src/wiki.ts +232 -0
- package/extensions/google-antigravity-auth/README.md +24 -0
- package/extensions/google-antigravity-auth/index.ts +461 -0
- package/extensions/google-antigravity-auth/node_modules/.bin/clawbrah +21 -0
- package/extensions/google-antigravity-auth/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/google-antigravity-auth/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/google-antigravity-auth/node_modules/.bin/openclaw +21 -0
- package/extensions/google-antigravity-auth/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/google-antigravity-auth/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/google-antigravity-auth/openclaw.plugin.json +9 -0
- package/extensions/google-antigravity-auth/package.json +14 -0
- package/extensions/google-gemini-cli-auth/README.md +35 -0
- package/extensions/google-gemini-cli-auth/index.ts +88 -0
- package/extensions/google-gemini-cli-auth/node_modules/.bin/clawbrah +21 -0
- package/extensions/google-gemini-cli-auth/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/google-gemini-cli-auth/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/google-gemini-cli-auth/node_modules/.bin/openclaw +21 -0
- package/extensions/google-gemini-cli-auth/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/google-gemini-cli-auth/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/google-gemini-cli-auth/oauth.test.ts +240 -0
- package/extensions/google-gemini-cli-auth/oauth.ts +662 -0
- package/extensions/google-gemini-cli-auth/openclaw.plugin.json +9 -0
- package/extensions/google-gemini-cli-auth/package.json +14 -0
- package/extensions/googlechat/index.ts +19 -0
- package/extensions/googlechat/node_modules/.bin/clawbrah +21 -0
- package/extensions/googlechat/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/googlechat/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/googlechat/node_modules/.bin/openclaw +21 -0
- package/extensions/googlechat/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/googlechat/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/googlechat/openclaw.plugin.json +9 -0
- package/extensions/googlechat/package.json +39 -0
- package/extensions/googlechat/src/accounts.ts +147 -0
- package/extensions/googlechat/src/actions.ts +181 -0
- package/extensions/googlechat/src/api.test.ts +61 -0
- package/extensions/googlechat/src/api.ts +282 -0
- package/extensions/googlechat/src/auth.ts +123 -0
- package/extensions/googlechat/src/channel.ts +583 -0
- package/extensions/googlechat/src/monitor.test.ts +22 -0
- package/extensions/googlechat/src/monitor.ts +960 -0
- package/extensions/googlechat/src/onboarding.ts +269 -0
- package/extensions/googlechat/src/runtime.ts +14 -0
- package/extensions/googlechat/src/targets.test.ts +32 -0
- package/extensions/googlechat/src/targets.ts +65 -0
- package/extensions/googlechat/src/types.config.ts +3 -0
- package/extensions/googlechat/src/types.ts +73 -0
- package/extensions/imessage/index.ts +17 -0
- package/extensions/imessage/node_modules/.bin/clawbrah +21 -0
- package/extensions/imessage/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/imessage/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/imessage/node_modules/.bin/openclaw +21 -0
- package/extensions/imessage/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/imessage/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/imessage/openclaw.plugin.json +9 -0
- package/extensions/imessage/package.json +14 -0
- package/extensions/imessage/src/channel.ts +294 -0
- package/extensions/imessage/src/runtime.ts +14 -0
- package/extensions/line/index.ts +19 -0
- package/extensions/line/node_modules/.bin/clawbrah +21 -0
- package/extensions/line/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/line/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/line/node_modules/.bin/openclaw +21 -0
- package/extensions/line/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/line/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/line/openclaw.plugin.json +9 -0
- package/extensions/line/package.json +29 -0
- package/extensions/line/src/card-command.ts +344 -0
- package/extensions/line/src/channel.logout.test.ts +99 -0
- package/extensions/line/src/channel.sendPayload.test.ts +306 -0
- package/extensions/line/src/channel.ts +780 -0
- package/extensions/line/src/runtime.ts +14 -0
- package/extensions/llm-task/README.md +97 -0
- package/extensions/llm-task/index.ts +6 -0
- package/extensions/llm-task/node_modules/.bin/clawbrah +21 -0
- package/extensions/llm-task/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/llm-task/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/llm-task/node_modules/.bin/openclaw +21 -0
- package/extensions/llm-task/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/llm-task/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/llm-task/openclaw.plugin.json +21 -0
- package/extensions/llm-task/package.json +14 -0
- package/extensions/llm-task/src/llm-task-tool.test.ts +138 -0
- package/extensions/llm-task/src/llm-task-tool.ts +245 -0
- package/extensions/lobster/README.md +75 -0
- package/extensions/lobster/SKILL.md +97 -0
- package/extensions/lobster/index.ts +14 -0
- package/extensions/lobster/node_modules/.bin/clawbrah +21 -0
- package/extensions/lobster/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/lobster/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/lobster/node_modules/.bin/openclaw +21 -0
- package/extensions/lobster/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/lobster/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/lobster/openclaw.plugin.json +10 -0
- package/extensions/lobster/package.json +14 -0
- package/extensions/lobster/src/lobster-tool.test.ts +247 -0
- package/extensions/lobster/src/lobster-tool.ts +328 -0
- package/extensions/matrix/CHANGELOG.md +93 -0
- package/extensions/matrix/index.ts +17 -0
- package/extensions/matrix/node_modules/.bin/clawbrah +21 -0
- package/extensions/matrix/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/matrix/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/matrix/node_modules/.bin/markdown-it +21 -0
- package/extensions/matrix/node_modules/.bin/markdown-it.CMD +12 -0
- package/extensions/matrix/node_modules/.bin/markdown-it.ps1 +41 -0
- package/extensions/matrix/node_modules/.bin/openclaw +21 -0
- package/extensions/matrix/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/matrix/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/matrix/openclaw.plugin.json +9 -0
- package/extensions/matrix/package.json +36 -0
- package/extensions/matrix/src/actions.ts +195 -0
- package/extensions/matrix/src/channel.directory.test.ts +64 -0
- package/extensions/matrix/src/channel.ts +439 -0
- package/extensions/matrix/src/config-schema.ts +63 -0
- package/extensions/matrix/src/directory-live.ts +188 -0
- package/extensions/matrix/src/group-mentions.ts +66 -0
- package/extensions/matrix/src/matrix/accounts.test.ts +82 -0
- package/extensions/matrix/src/matrix/accounts.ts +65 -0
- package/extensions/matrix/src/matrix/actions/client.ts +57 -0
- package/extensions/matrix/src/matrix/actions/messages.ts +128 -0
- package/extensions/matrix/src/matrix/actions/pins.ts +76 -0
- package/extensions/matrix/src/matrix/actions/reactions.ts +96 -0
- package/extensions/matrix/src/matrix/actions/room.ts +85 -0
- package/extensions/matrix/src/matrix/actions/summary.ts +75 -0
- package/extensions/matrix/src/matrix/actions/types.ts +84 -0
- package/extensions/matrix/src/matrix/actions.ts +15 -0
- package/extensions/matrix/src/matrix/active-client.ts +11 -0
- package/extensions/matrix/src/matrix/client/config.ts +160 -0
- package/extensions/matrix/src/matrix/client/create-client.ts +123 -0
- package/extensions/matrix/src/matrix/client/logging.ts +36 -0
- package/extensions/matrix/src/matrix/client/runtime.ts +4 -0
- package/extensions/matrix/src/matrix/client/shared.ts +170 -0
- package/extensions/matrix/src/matrix/client/storage.ts +131 -0
- package/extensions/matrix/src/matrix/client/types.ts +34 -0
- package/extensions/matrix/src/matrix/client.test.ts +56 -0
- package/extensions/matrix/src/matrix/client.ts +5 -0
- package/extensions/matrix/src/matrix/credentials.ts +105 -0
- package/extensions/matrix/src/matrix/deps.ts +60 -0
- package/extensions/matrix/src/matrix/format.test.ts +33 -0
- package/extensions/matrix/src/matrix/format.ts +22 -0
- package/extensions/matrix/src/matrix/index.ts +11 -0
- package/extensions/matrix/src/matrix/monitor/allowlist.test.ts +45 -0
- package/extensions/matrix/src/matrix/monitor/allowlist.ts +103 -0
- package/extensions/matrix/src/matrix/monitor/auto-join.ts +71 -0
- package/extensions/matrix/src/matrix/monitor/direct.ts +104 -0
- package/extensions/matrix/src/matrix/monitor/events.ts +101 -0
- package/extensions/matrix/src/matrix/monitor/handler.ts +665 -0
- package/extensions/matrix/src/matrix/monitor/index.ts +338 -0
- package/extensions/matrix/src/matrix/monitor/location.ts +100 -0
- package/extensions/matrix/src/matrix/monitor/media.test.ts +102 -0
- package/extensions/matrix/src/matrix/monitor/media.ts +113 -0
- package/extensions/matrix/src/matrix/monitor/mentions.ts +31 -0
- package/extensions/matrix/src/matrix/monitor/replies.ts +97 -0
- package/extensions/matrix/src/matrix/monitor/room-info.ts +55 -0
- package/extensions/matrix/src/matrix/monitor/rooms.test.ts +39 -0
- package/extensions/matrix/src/matrix/monitor/rooms.ts +47 -0
- package/extensions/matrix/src/matrix/monitor/threads.ts +68 -0
- package/extensions/matrix/src/matrix/monitor/types.ts +39 -0
- package/extensions/matrix/src/matrix/poll-types.test.ts +21 -0
- package/extensions/matrix/src/matrix/poll-types.ts +166 -0
- package/extensions/matrix/src/matrix/probe.ts +70 -0
- package/extensions/matrix/src/matrix/send/client.ts +66 -0
- package/extensions/matrix/src/matrix/send/formatting.ts +89 -0
- package/extensions/matrix/src/matrix/send/media.ts +229 -0
- package/extensions/matrix/src/matrix/send/targets.test.ts +98 -0
- package/extensions/matrix/src/matrix/send/targets.ts +136 -0
- package/extensions/matrix/src/matrix/send/types.ts +109 -0
- package/extensions/matrix/src/matrix/send.test.ts +171 -0
- package/extensions/matrix/src/matrix/send.ts +260 -0
- package/extensions/matrix/src/onboarding.ts +449 -0
- package/extensions/matrix/src/outbound.ts +52 -0
- package/extensions/matrix/src/resolve-targets.test.ts +48 -0
- package/extensions/matrix/src/resolve-targets.ts +135 -0
- package/extensions/matrix/src/runtime.ts +14 -0
- package/extensions/matrix/src/tool-actions.ts +164 -0
- package/extensions/matrix/src/types.ts +97 -0
- package/extensions/mattermost/index.ts +17 -0
- package/extensions/mattermost/node_modules/.bin/clawbrah +21 -0
- package/extensions/mattermost/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/mattermost/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/mattermost/node_modules/.bin/openclaw +21 -0
- package/extensions/mattermost/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/mattermost/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/mattermost/openclaw.plugin.json +9 -0
- package/extensions/mattermost/package.json +28 -0
- package/extensions/mattermost/src/channel.test.ts +72 -0
- package/extensions/mattermost/src/channel.ts +337 -0
- package/extensions/mattermost/src/config-schema.ts +56 -0
- package/extensions/mattermost/src/group-mentions.ts +15 -0
- package/extensions/mattermost/src/mattermost/accounts.ts +128 -0
- package/extensions/mattermost/src/mattermost/client.ts +220 -0
- package/extensions/mattermost/src/mattermost/index.ts +9 -0
- package/extensions/mattermost/src/mattermost/monitor-helpers.ts +166 -0
- package/extensions/mattermost/src/mattermost/monitor.ts +991 -0
- package/extensions/mattermost/src/mattermost/probe.ts +74 -0
- package/extensions/mattermost/src/mattermost/send.ts +231 -0
- package/extensions/mattermost/src/normalize.ts +46 -0
- package/extensions/mattermost/src/onboarding-helpers.ts +44 -0
- package/extensions/mattermost/src/onboarding.ts +186 -0
- package/extensions/mattermost/src/runtime.ts +14 -0
- package/extensions/mattermost/src/types.ts +52 -0
- package/extensions/memory-core/index.ts +38 -0
- package/extensions/memory-core/node_modules/.bin/clawbrah +21 -0
- package/extensions/memory-core/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/memory-core/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/memory-core/node_modules/.bin/openclaw +21 -0
- package/extensions/memory-core/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/memory-core/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/memory-core/openclaw.plugin.json +9 -0
- package/extensions/memory-core/package.json +17 -0
- package/extensions/memory-lancedb/config.ts +139 -0
- package/extensions/memory-lancedb/index.test.ts +295 -0
- package/extensions/memory-lancedb/index.ts +608 -0
- package/extensions/memory-lancedb/node_modules/.bin/arrow2csv +21 -0
- package/extensions/memory-lancedb/node_modules/.bin/arrow2csv.CMD +12 -0
- package/extensions/memory-lancedb/node_modules/.bin/arrow2csv.ps1 +41 -0
- package/extensions/memory-lancedb/node_modules/.bin/clawbrah +21 -0
- package/extensions/memory-lancedb/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/memory-lancedb/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/memory-lancedb/node_modules/.bin/openai +21 -0
- package/extensions/memory-lancedb/node_modules/.bin/openai.CMD +12 -0
- package/extensions/memory-lancedb/node_modules/.bin/openai.ps1 +41 -0
- package/extensions/memory-lancedb/node_modules/.bin/openclaw +21 -0
- package/extensions/memory-lancedb/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/memory-lancedb/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/memory-lancedb/openclaw.plugin.json +60 -0
- package/extensions/memory-lancedb/package.json +19 -0
- package/extensions/minimax-portal-auth/README.md +33 -0
- package/extensions/minimax-portal-auth/index.ts +155 -0
- package/extensions/minimax-portal-auth/node_modules/.bin/clawbrah +21 -0
- package/extensions/minimax-portal-auth/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/minimax-portal-auth/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/minimax-portal-auth/node_modules/.bin/openclaw +21 -0
- package/extensions/minimax-portal-auth/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/minimax-portal-auth/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/minimax-portal-auth/oauth.ts +247 -0
- package/extensions/minimax-portal-auth/openclaw.plugin.json +9 -0
- package/extensions/minimax-portal-auth/package.json +14 -0
- package/extensions/msteams/CHANGELOG.md +89 -0
- package/extensions/msteams/index.ts +17 -0
- package/extensions/msteams/node_modules/.bin/clawbrah +21 -0
- package/extensions/msteams/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/msteams/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/msteams/node_modules/.bin/openclaw +21 -0
- package/extensions/msteams/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/msteams/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/msteams/openclaw.plugin.json +9 -0
- package/extensions/msteams/package.json +39 -0
- package/extensions/msteams/src/attachments/download.ts +283 -0
- package/extensions/msteams/src/attachments/graph.ts +353 -0
- package/extensions/msteams/src/attachments/html.ts +90 -0
- package/extensions/msteams/src/attachments/payload.ts +22 -0
- package/extensions/msteams/src/attachments/shared.ts +291 -0
- package/extensions/msteams/src/attachments/types.ts +37 -0
- package/extensions/msteams/src/attachments.test.ts +459 -0
- package/extensions/msteams/src/attachments.ts +18 -0
- package/extensions/msteams/src/channel.directory.test.ts +48 -0
- package/extensions/msteams/src/channel.ts +459 -0
- package/extensions/msteams/src/conversation-store-fs.test.ts +88 -0
- package/extensions/msteams/src/conversation-store-fs.ts +165 -0
- package/extensions/msteams/src/conversation-store-memory.ts +47 -0
- package/extensions/msteams/src/conversation-store.ts +41 -0
- package/extensions/msteams/src/directory-live.ts +205 -0
- package/extensions/msteams/src/errors.test.ts +45 -0
- package/extensions/msteams/src/errors.ts +190 -0
- package/extensions/msteams/src/file-consent-helpers.test.ts +243 -0
- package/extensions/msteams/src/file-consent-helpers.ts +73 -0
- package/extensions/msteams/src/file-consent.ts +126 -0
- package/extensions/msteams/src/graph-chat.ts +53 -0
- package/extensions/msteams/src/graph-upload.ts +453 -0
- package/extensions/msteams/src/inbound.test.ts +66 -0
- package/extensions/msteams/src/inbound.ts +48 -0
- package/extensions/msteams/src/index.ts +4 -0
- package/extensions/msteams/src/media-helpers.test.ts +189 -0
- package/extensions/msteams/src/media-helpers.ts +86 -0
- package/extensions/msteams/src/messenger.test.ts +248 -0
- package/extensions/msteams/src/messenger.ts +495 -0
- package/extensions/msteams/src/monitor-handler/inbound-media.ts +128 -0
- package/extensions/msteams/src/monitor-handler/message-handler.ts +641 -0
- package/extensions/msteams/src/monitor-handler.ts +162 -0
- package/extensions/msteams/src/monitor-types.ts +5 -0
- package/extensions/msteams/src/monitor.ts +295 -0
- package/extensions/msteams/src/onboarding.ts +431 -0
- package/extensions/msteams/src/outbound.ts +46 -0
- package/extensions/msteams/src/pending-uploads.ts +89 -0
- package/extensions/msteams/src/policy.test.ts +209 -0
- package/extensions/msteams/src/policy.ts +273 -0
- package/extensions/msteams/src/polls-store-memory.ts +32 -0
- package/extensions/msteams/src/polls-store.test.ts +38 -0
- package/extensions/msteams/src/polls.test.ts +72 -0
- package/extensions/msteams/src/polls.ts +315 -0
- package/extensions/msteams/src/probe.test.ts +58 -0
- package/extensions/msteams/src/probe.ts +107 -0
- package/extensions/msteams/src/reply-dispatcher.ts +132 -0
- package/extensions/msteams/src/resolve-allowlist.ts +297 -0
- package/extensions/msteams/src/runtime.ts +14 -0
- package/extensions/msteams/src/sdk-types.ts +19 -0
- package/extensions/msteams/src/sdk.ts +33 -0
- package/extensions/msteams/src/send-context.ts +164 -0
- package/extensions/msteams/src/send.ts +519 -0
- package/extensions/msteams/src/sent-message-cache.test.ts +15 -0
- package/extensions/msteams/src/sent-message-cache.ts +47 -0
- package/extensions/msteams/src/storage.ts +25 -0
- package/extensions/msteams/src/store-fs.ts +83 -0
- package/extensions/msteams/src/token.ts +19 -0
- package/extensions/nextcloud-talk/index.ts +17 -0
- package/extensions/nextcloud-talk/node_modules/.bin/clawbrah +21 -0
- package/extensions/nextcloud-talk/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/nextcloud-talk/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/nextcloud-talk/node_modules/.bin/openclaw +21 -0
- package/extensions/nextcloud-talk/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/nextcloud-talk/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/nextcloud-talk/openclaw.plugin.json +9 -0
- package/extensions/nextcloud-talk/package.json +33 -0
- package/extensions/nextcloud-talk/src/accounts.ts +174 -0
- package/extensions/nextcloud-talk/src/channel.ts +409 -0
- package/extensions/nextcloud-talk/src/config-schema.ts +79 -0
- package/extensions/nextcloud-talk/src/format.ts +79 -0
- package/extensions/nextcloud-talk/src/inbound.ts +327 -0
- package/extensions/nextcloud-talk/src/monitor.ts +246 -0
- package/extensions/nextcloud-talk/src/normalize.ts +39 -0
- package/extensions/nextcloud-talk/src/onboarding.ts +343 -0
- package/extensions/nextcloud-talk/src/policy.test.ts +33 -0
- package/extensions/nextcloud-talk/src/policy.ts +180 -0
- package/extensions/nextcloud-talk/src/room-info.ts +125 -0
- package/extensions/nextcloud-talk/src/runtime.ts +14 -0
- package/extensions/nextcloud-talk/src/send.ts +215 -0
- package/extensions/nextcloud-talk/src/signature.ts +72 -0
- package/extensions/nextcloud-talk/src/types.ts +181 -0
- package/extensions/nostr/CHANGELOG.md +80 -0
- package/extensions/nostr/README.md +136 -0
- package/extensions/nostr/index.ts +68 -0
- package/extensions/nostr/node_modules/.bin/clawbrah +21 -0
- package/extensions/nostr/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/nostr/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/nostr/node_modules/.bin/openclaw +21 -0
- package/extensions/nostr/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/nostr/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/nostr/node_modules/.bin/tsc +21 -0
- package/extensions/nostr/node_modules/.bin/tsc.CMD +12 -0
- package/extensions/nostr/node_modules/.bin/tsc.ps1 +41 -0
- package/extensions/nostr/node_modules/.bin/tsserver +21 -0
- package/extensions/nostr/node_modules/.bin/tsserver.CMD +12 -0
- package/extensions/nostr/node_modules/.bin/tsserver.ps1 +41 -0
- package/extensions/nostr/openclaw.plugin.json +9 -0
- package/extensions/nostr/package.json +34 -0
- package/extensions/nostr/src/channel.test.ts +151 -0
- package/extensions/nostr/src/channel.ts +353 -0
- package/extensions/nostr/src/config-schema.ts +90 -0
- package/extensions/nostr/src/metrics.ts +478 -0
- package/extensions/nostr/src/nostr-bus.fuzz.test.ts +533 -0
- package/extensions/nostr/src/nostr-bus.integration.test.ts +448 -0
- package/extensions/nostr/src/nostr-bus.test.ts +199 -0
- package/extensions/nostr/src/nostr-bus.ts +715 -0
- package/extensions/nostr/src/nostr-profile-http.test.ts +378 -0
- package/extensions/nostr/src/nostr-profile-http.ts +519 -0
- package/extensions/nostr/src/nostr-profile-import.test.ts +119 -0
- package/extensions/nostr/src/nostr-profile-import.ts +262 -0
- package/extensions/nostr/src/nostr-profile.fuzz.test.ts +477 -0
- package/extensions/nostr/src/nostr-profile.test.ts +410 -0
- package/extensions/nostr/src/nostr-profile.ts +277 -0
- package/extensions/nostr/src/nostr-state-store.test.ts +131 -0
- package/extensions/nostr/src/nostr-state-store.ts +226 -0
- package/extensions/nostr/src/runtime.ts +14 -0
- package/extensions/nostr/src/seen-tracker.ts +303 -0
- package/extensions/nostr/src/types.test.ts +157 -0
- package/extensions/nostr/src/types.ts +101 -0
- package/extensions/nostr/test/setup.ts +5 -0
- package/extensions/open-prose/README.md +25 -0
- package/extensions/open-prose/index.ts +5 -0
- package/extensions/open-prose/node_modules/.bin/clawbrah +21 -0
- package/extensions/open-prose/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/open-prose/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/open-prose/node_modules/.bin/openclaw +21 -0
- package/extensions/open-prose/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/open-prose/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/open-prose/openclaw.plugin.json +11 -0
- package/extensions/open-prose/package.json +14 -0
- package/extensions/open-prose/skills/prose/LICENSE +21 -0
- package/extensions/open-prose/skills/prose/SKILL.md +323 -0
- package/extensions/open-prose/skills/prose/alt-borges.md +141 -0
- package/extensions/open-prose/skills/prose/alts/arabian-nights.md +358 -0
- package/extensions/open-prose/skills/prose/alts/borges.md +360 -0
- package/extensions/open-prose/skills/prose/alts/folk.md +322 -0
- package/extensions/open-prose/skills/prose/alts/homer.md +346 -0
- package/extensions/open-prose/skills/prose/alts/kafka.md +373 -0
- package/extensions/open-prose/skills/prose/compiler.md +2971 -0
- package/extensions/open-prose/skills/prose/examples/01-hello-world.prose +4 -0
- package/extensions/open-prose/skills/prose/examples/02-research-and-summarize.prose +6 -0
- package/extensions/open-prose/skills/prose/examples/03-code-review.prose +17 -0
- package/extensions/open-prose/skills/prose/examples/04-write-and-refine.prose +14 -0
- package/extensions/open-prose/skills/prose/examples/05-debug-issue.prose +20 -0
- package/extensions/open-prose/skills/prose/examples/06-explain-codebase.prose +17 -0
- package/extensions/open-prose/skills/prose/examples/07-refactor.prose +20 -0
- package/extensions/open-prose/skills/prose/examples/08-blog-post.prose +20 -0
- package/extensions/open-prose/skills/prose/examples/09-research-with-agents.prose +25 -0
- package/extensions/open-prose/skills/prose/examples/10-code-review-agents.prose +32 -0
- package/extensions/open-prose/skills/prose/examples/11-skills-and-imports.prose +27 -0
- package/extensions/open-prose/skills/prose/examples/12-secure-agent-permissions.prose +43 -0
- package/extensions/open-prose/skills/prose/examples/13-variables-and-context.prose +51 -0
- package/extensions/open-prose/skills/prose/examples/14-composition-blocks.prose +48 -0
- package/extensions/open-prose/skills/prose/examples/15-inline-sequences.prose +23 -0
- package/extensions/open-prose/skills/prose/examples/16-parallel-reviews.prose +19 -0
- package/extensions/open-prose/skills/prose/examples/17-parallel-research.prose +19 -0
- package/extensions/open-prose/skills/prose/examples/18-mixed-parallel-sequential.prose +36 -0
- package/extensions/open-prose/skills/prose/examples/19-advanced-parallel.prose +71 -0
- package/extensions/open-prose/skills/prose/examples/20-fixed-loops.prose +20 -0
- package/extensions/open-prose/skills/prose/examples/21-pipeline-operations.prose +35 -0
- package/extensions/open-prose/skills/prose/examples/22-error-handling.prose +51 -0
- package/extensions/open-prose/skills/prose/examples/23-retry-with-backoff.prose +63 -0
- package/extensions/open-prose/skills/prose/examples/24-choice-blocks.prose +86 -0
- package/extensions/open-prose/skills/prose/examples/25-conditionals.prose +114 -0
- package/extensions/open-prose/skills/prose/examples/26-parameterized-blocks.prose +100 -0
- package/extensions/open-prose/skills/prose/examples/27-string-interpolation.prose +105 -0
- package/extensions/open-prose/skills/prose/examples/28-automated-pr-review.prose +37 -0
- package/extensions/open-prose/skills/prose/examples/28-gas-town.prose +1572 -0
- package/extensions/open-prose/skills/prose/examples/29-captains-chair.prose +218 -0
- package/extensions/open-prose/skills/prose/examples/30-captains-chair-simple.prose +42 -0
- package/extensions/open-prose/skills/prose/examples/31-captains-chair-with-memory.prose +145 -0
- package/extensions/open-prose/skills/prose/examples/33-pr-review-autofix.prose +168 -0
- package/extensions/open-prose/skills/prose/examples/34-content-pipeline.prose +204 -0
- package/extensions/open-prose/skills/prose/examples/35-feature-factory.prose +296 -0
- package/extensions/open-prose/skills/prose/examples/36-bug-hunter.prose +237 -0
- package/extensions/open-prose/skills/prose/examples/37-the-forge.prose +1474 -0
- package/extensions/open-prose/skills/prose/examples/38-skill-scan.prose +455 -0
- package/extensions/open-prose/skills/prose/examples/39-architect-by-simulation.prose +277 -0
- package/extensions/open-prose/skills/prose/examples/40-rlm-self-refine.prose +32 -0
- package/extensions/open-prose/skills/prose/examples/41-rlm-divide-conquer.prose +38 -0
- package/extensions/open-prose/skills/prose/examples/42-rlm-filter-recurse.prose +46 -0
- package/extensions/open-prose/skills/prose/examples/43-rlm-pairwise.prose +50 -0
- package/extensions/open-prose/skills/prose/examples/44-run-endpoint-ux-test.prose +261 -0
- package/extensions/open-prose/skills/prose/examples/45-plugin-release.prose +159 -0
- package/extensions/open-prose/skills/prose/examples/45-run-endpoint-ux-test-with-remediation.prose +637 -0
- package/extensions/open-prose/skills/prose/examples/46-run-endpoint-ux-test-fast.prose +148 -0
- package/extensions/open-prose/skills/prose/examples/46-workflow-crystallizer.prose +225 -0
- package/extensions/open-prose/skills/prose/examples/47-language-self-improvement.prose +356 -0
- package/extensions/open-prose/skills/prose/examples/48-habit-miner.prose +445 -0
- package/extensions/open-prose/skills/prose/examples/49-prose-run-retrospective.prose +210 -0
- package/extensions/open-prose/skills/prose/examples/README.md +391 -0
- package/extensions/open-prose/skills/prose/examples/roadmap/README.md +22 -0
- package/extensions/open-prose/skills/prose/examples/roadmap/iterative-refinement.prose +20 -0
- package/extensions/open-prose/skills/prose/examples/roadmap/parallel-review.prose +18 -0
- package/extensions/open-prose/skills/prose/examples/roadmap/simple-pipeline.prose +17 -0
- package/extensions/open-prose/skills/prose/examples/roadmap/syntax/open-prose-syntax.prose +223 -0
- package/extensions/open-prose/skills/prose/guidance/antipatterns.md +951 -0
- package/extensions/open-prose/skills/prose/guidance/patterns.md +700 -0
- package/extensions/open-prose/skills/prose/guidance/system-prompt.md +180 -0
- package/extensions/open-prose/skills/prose/help.md +144 -0
- package/extensions/open-prose/skills/prose/lib/README.md +108 -0
- package/extensions/open-prose/skills/prose/lib/calibrator.prose +215 -0
- package/extensions/open-prose/skills/prose/lib/cost-analyzer.prose +174 -0
- package/extensions/open-prose/skills/prose/lib/error-forensics.prose +250 -0
- package/extensions/open-prose/skills/prose/lib/inspector.prose +196 -0
- package/extensions/open-prose/skills/prose/lib/profiler.prose +460 -0
- package/extensions/open-prose/skills/prose/lib/program-improver.prose +275 -0
- package/extensions/open-prose/skills/prose/lib/project-memory.prose +118 -0
- package/extensions/open-prose/skills/prose/lib/user-memory.prose +93 -0
- package/extensions/open-prose/skills/prose/lib/vm-improver.prose +243 -0
- package/extensions/open-prose/skills/prose/primitives/session.md +593 -0
- package/extensions/open-prose/skills/prose/prose.md +1237 -0
- package/extensions/open-prose/skills/prose/state/filesystem.md +498 -0
- package/extensions/open-prose/skills/prose/state/in-context.md +384 -0
- package/extensions/open-prose/skills/prose/state/postgres.md +880 -0
- package/extensions/open-prose/skills/prose/state/sqlite.md +574 -0
- package/extensions/qwen-portal-auth/README.md +24 -0
- package/extensions/qwen-portal-auth/index.ts +130 -0
- package/extensions/qwen-portal-auth/oauth.ts +190 -0
- package/extensions/qwen-portal-auth/openclaw.plugin.json +9 -0
- package/extensions/signal/index.ts +17 -0
- package/extensions/signal/node_modules/.bin/clawbrah +21 -0
- package/extensions/signal/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/signal/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/signal/node_modules/.bin/openclaw +21 -0
- package/extensions/signal/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/signal/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/signal/openclaw.plugin.json +9 -0
- package/extensions/signal/package.json +14 -0
- package/extensions/signal/src/channel.ts +315 -0
- package/extensions/signal/src/runtime.ts +14 -0
- package/extensions/slack/index.ts +17 -0
- package/extensions/slack/node_modules/.bin/clawbrah +21 -0
- package/extensions/slack/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/slack/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/slack/node_modules/.bin/openclaw +21 -0
- package/extensions/slack/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/slack/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/slack/openclaw.plugin.json +9 -0
- package/extensions/slack/package.json +14 -0
- package/extensions/slack/src/channel.ts +604 -0
- package/extensions/slack/src/runtime.ts +14 -0
- package/extensions/telegram/index.ts +17 -0
- package/extensions/telegram/node_modules/.bin/clawbrah +21 -0
- package/extensions/telegram/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/telegram/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/telegram/node_modules/.bin/openclaw +21 -0
- package/extensions/telegram/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/telegram/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/telegram/openclaw.plugin.json +9 -0
- package/extensions/telegram/package.json +14 -0
- package/extensions/telegram/src/channel.ts +482 -0
- package/extensions/telegram/src/runtime.ts +14 -0
- package/extensions/tlon/README.md +5 -0
- package/extensions/tlon/index.ts +17 -0
- package/extensions/tlon/node_modules/.bin/clawbrah +21 -0
- package/extensions/tlon/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/tlon/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/tlon/node_modules/.bin/openclaw +21 -0
- package/extensions/tlon/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/tlon/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/tlon/openclaw.plugin.json +9 -0
- package/extensions/tlon/package.json +33 -0
- package/extensions/tlon/src/channel.ts +392 -0
- package/extensions/tlon/src/config-schema.test.ts +31 -0
- package/extensions/tlon/src/config-schema.ts +45 -0
- package/extensions/tlon/src/monitor/discovery.ts +76 -0
- package/extensions/tlon/src/monitor/history.ts +90 -0
- package/extensions/tlon/src/monitor/index.ts +580 -0
- package/extensions/tlon/src/monitor/processed-messages.test.ts +23 -0
- package/extensions/tlon/src/monitor/processed-messages.ts +46 -0
- package/extensions/tlon/src/monitor/utils.ts +106 -0
- package/extensions/tlon/src/onboarding.ts +214 -0
- package/extensions/tlon/src/runtime.ts +14 -0
- package/extensions/tlon/src/targets.ts +89 -0
- package/extensions/tlon/src/types.ts +92 -0
- package/extensions/tlon/src/urbit/auth.ts +18 -0
- package/extensions/tlon/src/urbit/http-api.ts +38 -0
- package/extensions/tlon/src/urbit/send.test.ts +38 -0
- package/extensions/tlon/src/urbit/send.ts +131 -0
- package/extensions/tlon/src/urbit/sse-client.test.ts +40 -0
- package/extensions/tlon/src/urbit/sse-client.ts +395 -0
- package/extensions/twitch/CHANGELOG.md +51 -0
- package/extensions/twitch/README.md +89 -0
- package/extensions/twitch/index.ts +20 -0
- package/extensions/twitch/node_modules/.bin/clawbrah +21 -0
- package/extensions/twitch/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/twitch/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/twitch/node_modules/.bin/openclaw +21 -0
- package/extensions/twitch/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/twitch/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/twitch/openclaw.plugin.json +9 -0
- package/extensions/twitch/package.json +20 -0
- package/extensions/twitch/src/access-control.test.ts +489 -0
- package/extensions/twitch/src/access-control.ts +166 -0
- package/extensions/twitch/src/actions.ts +173 -0
- package/extensions/twitch/src/client-manager-registry.ts +115 -0
- package/extensions/twitch/src/config-schema.ts +84 -0
- package/extensions/twitch/src/config.test.ts +87 -0
- package/extensions/twitch/src/config.ts +116 -0
- package/extensions/twitch/src/monitor.ts +272 -0
- package/extensions/twitch/src/onboarding.test.ts +311 -0
- package/extensions/twitch/src/onboarding.ts +417 -0
- package/extensions/twitch/src/outbound.test.ts +373 -0
- package/extensions/twitch/src/outbound.ts +184 -0
- package/extensions/twitch/src/plugin.test.ts +39 -0
- package/extensions/twitch/src/plugin.ts +274 -0
- package/extensions/twitch/src/probe.test.ts +195 -0
- package/extensions/twitch/src/probe.ts +120 -0
- package/extensions/twitch/src/resolver.ts +137 -0
- package/extensions/twitch/src/runtime.ts +14 -0
- package/extensions/twitch/src/send.test.ts +289 -0
- package/extensions/twitch/src/send.ts +136 -0
- package/extensions/twitch/src/status.test.ts +270 -0
- package/extensions/twitch/src/status.ts +178 -0
- package/extensions/twitch/src/token.test.ts +171 -0
- package/extensions/twitch/src/token.ts +91 -0
- package/extensions/twitch/src/twitch-client.test.ts +589 -0
- package/extensions/twitch/src/twitch-client.ts +277 -0
- package/extensions/twitch/src/types.ts +143 -0
- package/extensions/twitch/src/utils/markdown.ts +98 -0
- package/extensions/twitch/src/utils/twitch.ts +78 -0
- package/extensions/twitch/test/setup.ts +7 -0
- package/extensions/voice-call/CHANGELOG.md +115 -0
- package/extensions/voice-call/README.md +139 -0
- package/extensions/voice-call/index.ts +493 -0
- package/extensions/voice-call/node_modules/.bin/clawbrah +21 -0
- package/extensions/voice-call/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/voice-call/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/voice-call/node_modules/.bin/openclaw +21 -0
- package/extensions/voice-call/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/voice-call/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/voice-call/openclaw.plugin.json +559 -0
- package/extensions/voice-call/package.json +19 -0
- package/extensions/voice-call/src/allowlist.ts +19 -0
- package/extensions/voice-call/src/cli.ts +279 -0
- package/extensions/voice-call/src/config.test.ts +234 -0
- package/extensions/voice-call/src/config.ts +523 -0
- package/extensions/voice-call/src/core-bridge.ts +159 -0
- package/extensions/voice-call/src/manager/context.ts +21 -0
- package/extensions/voice-call/src/manager/events.ts +188 -0
- package/extensions/voice-call/src/manager/lookup.ts +35 -0
- package/extensions/voice-call/src/manager/outbound.ts +275 -0
- package/extensions/voice-call/src/manager/state.ts +48 -0
- package/extensions/voice-call/src/manager/store.ts +91 -0
- package/extensions/voice-call/src/manager/timers.ts +89 -0
- package/extensions/voice-call/src/manager/twiml.ts +9 -0
- package/extensions/voice-call/src/manager.test.ts +224 -0
- package/extensions/voice-call/src/manager.ts +887 -0
- package/extensions/voice-call/src/media-stream.test.ts +96 -0
- package/extensions/voice-call/src/media-stream.ts +411 -0
- package/extensions/voice-call/src/providers/base.ts +67 -0
- package/extensions/voice-call/src/providers/index.ts +10 -0
- package/extensions/voice-call/src/providers/mock.ts +165 -0
- package/extensions/voice-call/src/providers/plivo.test.ts +27 -0
- package/extensions/voice-call/src/providers/plivo.ts +515 -0
- package/extensions/voice-call/src/providers/stt-openai-realtime.ts +311 -0
- package/extensions/voice-call/src/providers/telnyx.ts +371 -0
- package/extensions/voice-call/src/providers/tts-openai.ts +259 -0
- package/extensions/voice-call/src/providers/twilio/api.ts +42 -0
- package/extensions/voice-call/src/providers/twilio/webhook.ts +32 -0
- package/extensions/voice-call/src/providers/twilio.test.ts +60 -0
- package/extensions/voice-call/src/providers/twilio.ts +626 -0
- package/extensions/voice-call/src/response-generator.ts +158 -0
- package/extensions/voice-call/src/runtime.ts +212 -0
- package/extensions/voice-call/src/telephony-audio.ts +90 -0
- package/extensions/voice-call/src/telephony-tts.ts +104 -0
- package/extensions/voice-call/src/tunnel.ts +314 -0
- package/extensions/voice-call/src/types.ts +272 -0
- package/extensions/voice-call/src/utils.ts +14 -0
- package/extensions/voice-call/src/voice-mapping.ts +67 -0
- package/extensions/voice-call/src/webhook-security.test.ts +377 -0
- package/extensions/voice-call/src/webhook-security.ts +689 -0
- package/extensions/voice-call/src/webhook.ts +491 -0
- package/extensions/whatsapp/index.ts +17 -0
- package/extensions/whatsapp/node_modules/.bin/clawbrah +21 -0
- package/extensions/whatsapp/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/whatsapp/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/whatsapp/node_modules/.bin/openclaw +21 -0
- package/extensions/whatsapp/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/whatsapp/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/whatsapp/openclaw.plugin.json +9 -0
- package/extensions/whatsapp/package.json +14 -0
- package/extensions/whatsapp/src/channel.ts +508 -0
- package/extensions/whatsapp/src/runtime.ts +14 -0
- package/extensions/zalo/CHANGELOG.md +95 -0
- package/extensions/zalo/README.md +50 -0
- package/extensions/zalo/index.ts +19 -0
- package/extensions/zalo/node_modules/.bin/clawbrah +21 -0
- package/extensions/zalo/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/zalo/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/zalo/node_modules/.bin/openclaw +21 -0
- package/extensions/zalo/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/zalo/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/zalo/openclaw.plugin.json +9 -0
- package/extensions/zalo/package.json +36 -0
- package/extensions/zalo/src/accounts.ts +80 -0
- package/extensions/zalo/src/actions.ts +67 -0
- package/extensions/zalo/src/api.ts +208 -0
- package/extensions/zalo/src/channel.directory.test.ts +43 -0
- package/extensions/zalo/src/channel.ts +414 -0
- package/extensions/zalo/src/config-schema.ts +25 -0
- package/extensions/zalo/src/monitor.ts +764 -0
- package/extensions/zalo/src/monitor.webhook.test.ts +73 -0
- package/extensions/zalo/src/onboarding.ts +401 -0
- package/extensions/zalo/src/probe.ts +46 -0
- package/extensions/zalo/src/proxy.ts +21 -0
- package/extensions/zalo/src/runtime.ts +14 -0
- package/extensions/zalo/src/send.ts +124 -0
- package/extensions/zalo/src/status-issues.ts +53 -0
- package/extensions/zalo/src/token.ts +63 -0
- package/extensions/zalo/src/types.ts +44 -0
- package/extensions/zalouser/CHANGELOG.md +67 -0
- package/extensions/zalouser/README.md +225 -0
- package/extensions/zalouser/index.ts +31 -0
- package/extensions/zalouser/node_modules/.bin/clawbrah +21 -0
- package/extensions/zalouser/node_modules/.bin/clawbrah.CMD +12 -0
- package/extensions/zalouser/node_modules/.bin/clawbrah.ps1 +41 -0
- package/extensions/zalouser/node_modules/.bin/openclaw +21 -0
- package/extensions/zalouser/node_modules/.bin/openclaw.CMD +12 -0
- package/extensions/zalouser/node_modules/.bin/openclaw.ps1 +41 -0
- package/extensions/zalouser/openclaw.plugin.json +9 -0
- package/extensions/zalouser/package.json +36 -0
- package/extensions/zalouser/src/accounts.ts +135 -0
- package/extensions/zalouser/src/channel.test.ts +18 -0
- package/extensions/zalouser/src/channel.ts +686 -0
- package/extensions/zalouser/src/config-schema.ts +28 -0
- package/extensions/zalouser/src/monitor.ts +601 -0
- package/extensions/zalouser/src/onboarding.ts +504 -0
- package/extensions/zalouser/src/probe.ts +28 -0
- package/extensions/zalouser/src/runtime.ts +14 -0
- package/extensions/zalouser/src/send.ts +160 -0
- package/extensions/zalouser/src/status-issues.test.ts +57 -0
- package/extensions/zalouser/src/status-issues.ts +89 -0
- package/extensions/zalouser/src/tool.ts +164 -0
- package/extensions/zalouser/src/types.ts +110 -0
- package/extensions/zalouser/src/zca.ts +202 -0
- package/openclaw.mjs +14 -0
- package/package.json +228 -0
- package/skills/1password/SKILL.md +70 -0
- package/skills/1password/references/cli-examples.md +29 -0
- package/skills/1password/references/get-started.md +17 -0
- package/skills/apple-notes/SKILL.md +77 -0
- package/skills/apple-reminders/SKILL.md +96 -0
- package/skills/bear-notes/SKILL.md +107 -0
- package/skills/bird/SKILL.md +224 -0
- package/skills/blogwatcher/SKILL.md +69 -0
- package/skills/blucli/SKILL.md +47 -0
- package/skills/bluebubbles/SKILL.md +131 -0
- package/skills/camsnap/SKILL.md +45 -0
- package/skills/canvas/SKILL.md +198 -0
- package/skills/clawhub/SKILL.md +77 -0
- package/skills/coding-agent/SKILL.md +284 -0
- package/skills/discord/SKILL.md +578 -0
- package/skills/eightctl/SKILL.md +50 -0
- package/skills/food-order/SKILL.md +48 -0
- package/skills/gemini/SKILL.md +43 -0
- package/skills/gifgrep/SKILL.md +79 -0
- package/skills/github/SKILL.md +77 -0
- package/skills/gog/SKILL.md +116 -0
- package/skills/goplaces/SKILL.md +52 -0
- package/skills/healthcheck/SKILL.md +245 -0
- package/skills/himalaya/SKILL.md +257 -0
- package/skills/himalaya/references/configuration.md +184 -0
- package/skills/himalaya/references/message-composition.md +199 -0
- package/skills/imsg/SKILL.md +74 -0
- package/skills/local-places/SERVER_README.md +101 -0
- package/skills/local-places/SKILL.md +102 -0
- package/skills/local-places/pyproject.toml +21 -0
- package/skills/local-places/src/local_places/__init__.py +2 -0
- package/skills/local-places/src/local_places/google_places.py +314 -0
- package/skills/local-places/src/local_places/main.py +65 -0
- package/skills/local-places/src/local_places/schemas.py +107 -0
- package/skills/mcporter/SKILL.md +61 -0
- package/skills/model-usage/SKILL.md +69 -0
- package/skills/model-usage/references/codexbar-cli.md +33 -0
- package/skills/model-usage/scripts/model_usage.py +310 -0
- package/skills/nano-banana-pro/SKILL.md +58 -0
- package/skills/nano-banana-pro/scripts/generate_image.py +184 -0
- package/skills/nano-pdf/SKILL.md +38 -0
- package/skills/notion/SKILL.md +172 -0
- package/skills/obsidian/SKILL.md +81 -0
- package/skills/openai-image-gen/SKILL.md +89 -0
- package/skills/openai-image-gen/scripts/gen.py +240 -0
- package/skills/openai-whisper/SKILL.md +38 -0
- package/skills/openai-whisper-api/SKILL.md +52 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
- package/skills/openhue/SKILL.md +51 -0
- package/skills/oracle/SKILL.md +125 -0
- package/skills/ordercli/SKILL.md +78 -0
- package/skills/peekaboo/SKILL.md +190 -0
- package/skills/sag/SKILL.md +87 -0
- package/skills/session-logs/SKILL.md +115 -0
- package/skills/sherpa-onnx-tts/SKILL.md +103 -0
- package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
- package/skills/skill-creator/SKILL.md +370 -0
- package/skills/skill-creator/license.txt +202 -0
- package/skills/skill-creator/scripts/init_skill.py +378 -0
- package/skills/skill-creator/scripts/package_skill.py +111 -0
- package/skills/skill-creator/scripts/quick_validate.py +101 -0
- package/skills/slack/SKILL.md +144 -0
- package/skills/songsee/SKILL.md +49 -0
- package/skills/sonoscli/SKILL.md +46 -0
- package/skills/spotify-player/SKILL.md +64 -0
- package/skills/summarize/SKILL.md +87 -0
- package/skills/things-mac/SKILL.md +86 -0
- package/skills/tmux/SKILL.md +135 -0
- package/skills/tmux/scripts/find-sessions.sh +112 -0
- package/skills/tmux/scripts/wait-for-text.sh +83 -0
- package/skills/trello/SKILL.md +95 -0
- package/skills/video-frames/SKILL.md +46 -0
- package/skills/video-frames/scripts/frame.sh +81 -0
- package/skills/voice-call/SKILL.md +45 -0
- package/skills/wacli/SKILL.md +72 -0
- package/skills/weather/SKILL.md +54 -0
|
@@ -0,0 +1,3184 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import fs from "node:fs";
|
|
5
|
+
import { Logger } from "tslog";
|
|
6
|
+
import json5 from "json5";
|
|
7
|
+
import chalk, { Chalk } from "chalk";
|
|
8
|
+
import fs$1 from "node:fs/promises";
|
|
9
|
+
import { execFile, execFileSync, spawn } from "node:child_process";
|
|
10
|
+
import { promisify } from "node:util";
|
|
11
|
+
import { fileURLToPath } from "node:url";
|
|
12
|
+
import "proper-lockfile";
|
|
13
|
+
import { getEnvApiKey, getOAuthProviders } from "@mariozechner/pi-ai";
|
|
14
|
+
import { BedrockClient, ListFoundationModelsCommand } from "@aws-sdk/client-bedrock";
|
|
15
|
+
|
|
16
|
+
//#region src/plugins/runtime.ts
|
|
17
|
+
const createEmptyRegistry = () => ({
|
|
18
|
+
plugins: [],
|
|
19
|
+
tools: [],
|
|
20
|
+
hooks: [],
|
|
21
|
+
typedHooks: [],
|
|
22
|
+
channels: [],
|
|
23
|
+
providers: [],
|
|
24
|
+
gatewayHandlers: {},
|
|
25
|
+
httpHandlers: [],
|
|
26
|
+
httpRoutes: [],
|
|
27
|
+
cliRegistrars: [],
|
|
28
|
+
services: [],
|
|
29
|
+
commands: [],
|
|
30
|
+
diagnostics: []
|
|
31
|
+
});
|
|
32
|
+
const REGISTRY_STATE = Symbol.for("openclaw.pluginRegistryState");
|
|
33
|
+
const state = (() => {
|
|
34
|
+
const globalState = globalThis;
|
|
35
|
+
if (!globalState[REGISTRY_STATE]) globalState[REGISTRY_STATE] = {
|
|
36
|
+
registry: createEmptyRegistry(),
|
|
37
|
+
key: null
|
|
38
|
+
};
|
|
39
|
+
return globalState[REGISTRY_STATE];
|
|
40
|
+
})();
|
|
41
|
+
function getActivePluginRegistry() {
|
|
42
|
+
return state.registry;
|
|
43
|
+
}
|
|
44
|
+
function requireActivePluginRegistry() {
|
|
45
|
+
if (!state.registry) state.registry = createEmptyRegistry();
|
|
46
|
+
return state.registry;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
//#endregion
|
|
50
|
+
//#region src/channels/registry.ts
|
|
51
|
+
const CHAT_CHANNEL_ORDER = [
|
|
52
|
+
"telegram",
|
|
53
|
+
"whatsapp",
|
|
54
|
+
"discord",
|
|
55
|
+
"googlechat",
|
|
56
|
+
"slack",
|
|
57
|
+
"signal",
|
|
58
|
+
"imessage"
|
|
59
|
+
];
|
|
60
|
+
const CHANNEL_IDS = [...CHAT_CHANNEL_ORDER];
|
|
61
|
+
const CHAT_CHANNEL_META = {
|
|
62
|
+
telegram: {
|
|
63
|
+
id: "telegram",
|
|
64
|
+
label: "Telegram",
|
|
65
|
+
selectionLabel: "Telegram (Bot API)",
|
|
66
|
+
detailLabel: "Telegram Bot",
|
|
67
|
+
docsPath: "/channels/telegram",
|
|
68
|
+
docsLabel: "telegram",
|
|
69
|
+
blurb: "simplest way to get started — register a bot with @BotFather and get going.",
|
|
70
|
+
systemImage: "paperplane",
|
|
71
|
+
selectionDocsPrefix: "",
|
|
72
|
+
selectionDocsOmitLabel: true,
|
|
73
|
+
selectionExtras: ["https://openclaw.ai"]
|
|
74
|
+
},
|
|
75
|
+
whatsapp: {
|
|
76
|
+
id: "whatsapp",
|
|
77
|
+
label: "WhatsApp",
|
|
78
|
+
selectionLabel: "WhatsApp (QR link)",
|
|
79
|
+
detailLabel: "WhatsApp Web",
|
|
80
|
+
docsPath: "/channels/whatsapp",
|
|
81
|
+
docsLabel: "whatsapp",
|
|
82
|
+
blurb: "works with your own number; recommend a separate phone + eSIM.",
|
|
83
|
+
systemImage: "message"
|
|
84
|
+
},
|
|
85
|
+
discord: {
|
|
86
|
+
id: "discord",
|
|
87
|
+
label: "Discord",
|
|
88
|
+
selectionLabel: "Discord (Bot API)",
|
|
89
|
+
detailLabel: "Discord Bot",
|
|
90
|
+
docsPath: "/channels/discord",
|
|
91
|
+
docsLabel: "discord",
|
|
92
|
+
blurb: "very well supported right now.",
|
|
93
|
+
systemImage: "bubble.left.and.bubble.right"
|
|
94
|
+
},
|
|
95
|
+
googlechat: {
|
|
96
|
+
id: "googlechat",
|
|
97
|
+
label: "Google Chat",
|
|
98
|
+
selectionLabel: "Google Chat (Chat API)",
|
|
99
|
+
detailLabel: "Google Chat",
|
|
100
|
+
docsPath: "/channels/googlechat",
|
|
101
|
+
docsLabel: "googlechat",
|
|
102
|
+
blurb: "Google Workspace Chat app with HTTP webhook.",
|
|
103
|
+
systemImage: "message.badge"
|
|
104
|
+
},
|
|
105
|
+
slack: {
|
|
106
|
+
id: "slack",
|
|
107
|
+
label: "Slack",
|
|
108
|
+
selectionLabel: "Slack (Socket Mode)",
|
|
109
|
+
detailLabel: "Slack Bot",
|
|
110
|
+
docsPath: "/channels/slack",
|
|
111
|
+
docsLabel: "slack",
|
|
112
|
+
blurb: "supported (Socket Mode).",
|
|
113
|
+
systemImage: "number"
|
|
114
|
+
},
|
|
115
|
+
signal: {
|
|
116
|
+
id: "signal",
|
|
117
|
+
label: "Signal",
|
|
118
|
+
selectionLabel: "Signal (signal-cli)",
|
|
119
|
+
detailLabel: "Signal REST",
|
|
120
|
+
docsPath: "/channels/signal",
|
|
121
|
+
docsLabel: "signal",
|
|
122
|
+
blurb: "signal-cli linked device; more setup (David Reagans: \"Hop on Discord.\").",
|
|
123
|
+
systemImage: "antenna.radiowaves.left.and.right"
|
|
124
|
+
},
|
|
125
|
+
imessage: {
|
|
126
|
+
id: "imessage",
|
|
127
|
+
label: "iMessage",
|
|
128
|
+
selectionLabel: "iMessage (imsg)",
|
|
129
|
+
detailLabel: "iMessage",
|
|
130
|
+
docsPath: "/channels/imessage",
|
|
131
|
+
docsLabel: "imessage",
|
|
132
|
+
blurb: "this is still a work in progress.",
|
|
133
|
+
systemImage: "message.fill"
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
const CHAT_CHANNEL_ALIASES = {
|
|
137
|
+
imsg: "imessage",
|
|
138
|
+
"google-chat": "googlechat",
|
|
139
|
+
gchat: "googlechat"
|
|
140
|
+
};
|
|
141
|
+
const normalizeChannelKey = (raw) => {
|
|
142
|
+
return raw?.trim().toLowerCase() || void 0;
|
|
143
|
+
};
|
|
144
|
+
function getChatChannelMeta(id) {
|
|
145
|
+
return CHAT_CHANNEL_META[id];
|
|
146
|
+
}
|
|
147
|
+
function normalizeChatChannelId(raw) {
|
|
148
|
+
const normalized = normalizeChannelKey(raw);
|
|
149
|
+
if (!normalized) return null;
|
|
150
|
+
const resolved = CHAT_CHANNEL_ALIASES[normalized] ?? normalized;
|
|
151
|
+
return CHAT_CHANNEL_ORDER.includes(resolved) ? resolved : null;
|
|
152
|
+
}
|
|
153
|
+
function normalizeAnyChannelId(raw) {
|
|
154
|
+
const key = normalizeChannelKey(raw);
|
|
155
|
+
if (!key) return null;
|
|
156
|
+
return requireActivePluginRegistry().channels.find((entry) => {
|
|
157
|
+
const id = String(entry.plugin.id ?? "").trim().toLowerCase();
|
|
158
|
+
if (id && id === key) return true;
|
|
159
|
+
return (entry.plugin.meta.aliases ?? []).some((alias) => alias.trim().toLowerCase() === key);
|
|
160
|
+
})?.plugin.id ?? null;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
//#endregion
|
|
164
|
+
//#region src/sessions/session-key-utils.ts
|
|
165
|
+
function parseAgentSessionKey(sessionKey) {
|
|
166
|
+
const raw = (sessionKey ?? "").trim();
|
|
167
|
+
if (!raw) return null;
|
|
168
|
+
const parts = raw.split(":").filter(Boolean);
|
|
169
|
+
if (parts.length < 3) return null;
|
|
170
|
+
if (parts[0] !== "agent") return null;
|
|
171
|
+
const agentId = parts[1]?.trim();
|
|
172
|
+
const rest = parts.slice(2).join(":");
|
|
173
|
+
if (!agentId || !rest) return null;
|
|
174
|
+
return {
|
|
175
|
+
agentId,
|
|
176
|
+
rest
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
//#endregion
|
|
181
|
+
//#region src/routing/session-key.ts
|
|
182
|
+
const DEFAULT_AGENT_ID = "main";
|
|
183
|
+
const DEFAULT_ACCOUNT_ID = "default";
|
|
184
|
+
const VALID_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/i;
|
|
185
|
+
const INVALID_CHARS_RE = /[^a-z0-9_-]+/g;
|
|
186
|
+
const LEADING_DASH_RE = /^-+/;
|
|
187
|
+
const TRAILING_DASH_RE = /-+$/;
|
|
188
|
+
function resolveAgentIdFromSessionKey(sessionKey) {
|
|
189
|
+
return normalizeAgentId(parseAgentSessionKey(sessionKey)?.agentId ?? DEFAULT_AGENT_ID);
|
|
190
|
+
}
|
|
191
|
+
function normalizeAgentId(value) {
|
|
192
|
+
const trimmed = (value ?? "").trim();
|
|
193
|
+
if (!trimmed) return DEFAULT_AGENT_ID;
|
|
194
|
+
if (VALID_ID_RE.test(trimmed)) return trimmed.toLowerCase();
|
|
195
|
+
return trimmed.toLowerCase().replace(INVALID_CHARS_RE, "-").replace(LEADING_DASH_RE, "").replace(TRAILING_DASH_RE, "").slice(0, 64) || DEFAULT_AGENT_ID;
|
|
196
|
+
}
|
|
197
|
+
function normalizeAccountId(value) {
|
|
198
|
+
const trimmed = (value ?? "").trim();
|
|
199
|
+
if (!trimmed) return DEFAULT_ACCOUNT_ID;
|
|
200
|
+
if (VALID_ID_RE.test(trimmed)) return trimmed.toLowerCase();
|
|
201
|
+
return trimmed.toLowerCase().replace(INVALID_CHARS_RE, "-").replace(LEADING_DASH_RE, "").replace(TRAILING_DASH_RE, "").slice(0, 64) || DEFAULT_ACCOUNT_ID;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
//#endregion
|
|
205
|
+
//#region src/config/paths.ts
|
|
206
|
+
/**
|
|
207
|
+
* Nix mode detection: When OPENCLAW_NIX_MODE=1, the gateway is running under Nix.
|
|
208
|
+
* In this mode:
|
|
209
|
+
* - No auto-install flows should be attempted
|
|
210
|
+
* - Missing dependencies should produce actionable Nix-specific error messages
|
|
211
|
+
* - Config is managed externally (read-only from Nix perspective)
|
|
212
|
+
*/
|
|
213
|
+
function resolveIsNixMode(env = process.env) {
|
|
214
|
+
return env.OPENCLAW_NIX_MODE === "1";
|
|
215
|
+
}
|
|
216
|
+
const isNixMode = resolveIsNixMode();
|
|
217
|
+
const LEGACY_STATE_DIRNAMES = [
|
|
218
|
+
".clawdbot",
|
|
219
|
+
".moltbot",
|
|
220
|
+
".moldbot"
|
|
221
|
+
];
|
|
222
|
+
const NEW_STATE_DIRNAME = ".openclaw";
|
|
223
|
+
const CONFIG_FILENAME = "openclaw.json";
|
|
224
|
+
const LEGACY_CONFIG_FILENAMES = [
|
|
225
|
+
"clawdbot.json",
|
|
226
|
+
"moltbot.json",
|
|
227
|
+
"moldbot.json"
|
|
228
|
+
];
|
|
229
|
+
function legacyStateDirs(homedir = os.homedir) {
|
|
230
|
+
return LEGACY_STATE_DIRNAMES.map((dir) => path.join(homedir(), dir));
|
|
231
|
+
}
|
|
232
|
+
function newStateDir(homedir = os.homedir) {
|
|
233
|
+
return path.join(homedir(), NEW_STATE_DIRNAME);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* State directory for mutable data (sessions, logs, caches).
|
|
237
|
+
* Can be overridden via OPENCLAW_STATE_DIR.
|
|
238
|
+
* Default: ~/.openclaw
|
|
239
|
+
*/
|
|
240
|
+
function resolveStateDir(env = process.env, homedir = os.homedir) {
|
|
241
|
+
const override = env.OPENCLAW_STATE_DIR?.trim() || env.CLAWDBOT_STATE_DIR?.trim();
|
|
242
|
+
if (override) return resolveUserPath$1(override);
|
|
243
|
+
const newDir = newStateDir(homedir);
|
|
244
|
+
const legacyDirs = legacyStateDirs(homedir);
|
|
245
|
+
if (fs.existsSync(newDir)) return newDir;
|
|
246
|
+
const existingLegacy = legacyDirs.find((dir) => {
|
|
247
|
+
try {
|
|
248
|
+
return fs.existsSync(dir);
|
|
249
|
+
} catch {
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
if (existingLegacy) return existingLegacy;
|
|
254
|
+
return newDir;
|
|
255
|
+
}
|
|
256
|
+
function resolveUserPath$1(input) {
|
|
257
|
+
const trimmed = input.trim();
|
|
258
|
+
if (!trimmed) return trimmed;
|
|
259
|
+
if (trimmed.startsWith("~")) {
|
|
260
|
+
const expanded = trimmed.replace(/^~(?=$|[\\/])/, os.homedir());
|
|
261
|
+
return path.resolve(expanded);
|
|
262
|
+
}
|
|
263
|
+
return path.resolve(trimmed);
|
|
264
|
+
}
|
|
265
|
+
const STATE_DIR = resolveStateDir();
|
|
266
|
+
/**
|
|
267
|
+
* Config file path (JSON5).
|
|
268
|
+
* Can be overridden via OPENCLAW_CONFIG_PATH.
|
|
269
|
+
* Default: ~/.openclaw/openclaw.json (or $OPENCLAW_STATE_DIR/openclaw.json)
|
|
270
|
+
*/
|
|
271
|
+
function resolveCanonicalConfigPath(env = process.env, stateDir = resolveStateDir(env, os.homedir)) {
|
|
272
|
+
const override = env.OPENCLAW_CONFIG_PATH?.trim() || env.CLAWDBOT_CONFIG_PATH?.trim();
|
|
273
|
+
if (override) return resolveUserPath$1(override);
|
|
274
|
+
return path.join(stateDir, CONFIG_FILENAME);
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Resolve the active config path by preferring existing config candidates
|
|
278
|
+
* before falling back to the canonical path.
|
|
279
|
+
*/
|
|
280
|
+
function resolveConfigPathCandidate(env = process.env, homedir = os.homedir) {
|
|
281
|
+
const existing = resolveDefaultConfigCandidates(env, homedir).find((candidate) => {
|
|
282
|
+
try {
|
|
283
|
+
return fs.existsSync(candidate);
|
|
284
|
+
} catch {
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
if (existing) return existing;
|
|
289
|
+
return resolveCanonicalConfigPath(env, resolveStateDir(env, homedir));
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Active config path (prefers existing config files).
|
|
293
|
+
*/
|
|
294
|
+
function resolveConfigPath(env = process.env, stateDir = resolveStateDir(env, os.homedir), homedir = os.homedir) {
|
|
295
|
+
const override = env.OPENCLAW_CONFIG_PATH?.trim();
|
|
296
|
+
if (override) return resolveUserPath$1(override);
|
|
297
|
+
const stateOverride = env.OPENCLAW_STATE_DIR?.trim();
|
|
298
|
+
const existing = [path.join(stateDir, CONFIG_FILENAME), ...LEGACY_CONFIG_FILENAMES.map((name) => path.join(stateDir, name))].find((candidate) => {
|
|
299
|
+
try {
|
|
300
|
+
return fs.existsSync(candidate);
|
|
301
|
+
} catch {
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
if (existing) return existing;
|
|
306
|
+
if (stateOverride) return path.join(stateDir, CONFIG_FILENAME);
|
|
307
|
+
const defaultStateDir = resolveStateDir(env, homedir);
|
|
308
|
+
if (path.resolve(stateDir) === path.resolve(defaultStateDir)) return resolveConfigPathCandidate(env, homedir);
|
|
309
|
+
return path.join(stateDir, CONFIG_FILENAME);
|
|
310
|
+
}
|
|
311
|
+
const CONFIG_PATH = resolveConfigPathCandidate();
|
|
312
|
+
/**
|
|
313
|
+
* Resolve default config path candidates across default locations.
|
|
314
|
+
* Order: explicit config path → state-dir-derived paths → new default.
|
|
315
|
+
*/
|
|
316
|
+
function resolveDefaultConfigCandidates(env = process.env, homedir = os.homedir) {
|
|
317
|
+
const explicit = env.OPENCLAW_CONFIG_PATH?.trim() || env.CLAWDBOT_CONFIG_PATH?.trim();
|
|
318
|
+
if (explicit) return [resolveUserPath$1(explicit)];
|
|
319
|
+
const candidates = [];
|
|
320
|
+
const openclawStateDir = env.OPENCLAW_STATE_DIR?.trim() || env.CLAWDBOT_STATE_DIR?.trim();
|
|
321
|
+
if (openclawStateDir) {
|
|
322
|
+
const resolved = resolveUserPath$1(openclawStateDir);
|
|
323
|
+
candidates.push(path.join(resolved, CONFIG_FILENAME));
|
|
324
|
+
candidates.push(...LEGACY_CONFIG_FILENAMES.map((name) => path.join(resolved, name)));
|
|
325
|
+
}
|
|
326
|
+
const defaultDirs = [newStateDir(homedir), ...legacyStateDirs(homedir)];
|
|
327
|
+
for (const dir of defaultDirs) {
|
|
328
|
+
candidates.push(path.join(dir, CONFIG_FILENAME));
|
|
329
|
+
candidates.push(...LEGACY_CONFIG_FILENAMES.map((name) => path.join(dir, name)));
|
|
330
|
+
}
|
|
331
|
+
return candidates;
|
|
332
|
+
}
|
|
333
|
+
const DEFAULT_GATEWAY_PORT = 18789;
|
|
334
|
+
const OAUTH_FILENAME = "oauth.json";
|
|
335
|
+
/**
|
|
336
|
+
* OAuth credentials storage directory.
|
|
337
|
+
*
|
|
338
|
+
* Precedence:
|
|
339
|
+
* - `OPENCLAW_OAUTH_DIR` (explicit override)
|
|
340
|
+
* - `$*_STATE_DIR/credentials` (canonical server/default)
|
|
341
|
+
*/
|
|
342
|
+
function resolveOAuthDir(env = process.env, stateDir = resolveStateDir(env, os.homedir)) {
|
|
343
|
+
const override = env.OPENCLAW_OAUTH_DIR?.trim();
|
|
344
|
+
if (override) return resolveUserPath$1(override);
|
|
345
|
+
return path.join(stateDir, "credentials");
|
|
346
|
+
}
|
|
347
|
+
function resolveOAuthPath(env = process.env, stateDir = resolveStateDir(env, os.homedir)) {
|
|
348
|
+
return path.join(resolveOAuthDir(env, stateDir), OAUTH_FILENAME);
|
|
349
|
+
}
|
|
350
|
+
function resolveGatewayPort(cfg, env = process.env) {
|
|
351
|
+
const envRaw = env.OPENCLAW_GATEWAY_PORT?.trim() || env.CLAWDBOT_GATEWAY_PORT?.trim();
|
|
352
|
+
if (envRaw) {
|
|
353
|
+
const parsed = Number.parseInt(envRaw, 10);
|
|
354
|
+
if (Number.isFinite(parsed) && parsed > 0) return parsed;
|
|
355
|
+
}
|
|
356
|
+
const configPort = cfg?.gateway?.port;
|
|
357
|
+
if (typeof configPort === "number" && Number.isFinite(configPort)) {
|
|
358
|
+
if (configPort > 0) return configPort;
|
|
359
|
+
}
|
|
360
|
+
return DEFAULT_GATEWAY_PORT;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
//#endregion
|
|
364
|
+
//#region src/logging/config.ts
|
|
365
|
+
function readLoggingConfig() {
|
|
366
|
+
const configPath = resolveConfigPath();
|
|
367
|
+
try {
|
|
368
|
+
if (!fs.existsSync(configPath)) return;
|
|
369
|
+
const raw = fs.readFileSync(configPath, "utf-8");
|
|
370
|
+
const logging = json5.parse(raw)?.logging;
|
|
371
|
+
if (!logging || typeof logging !== "object" || Array.isArray(logging)) return;
|
|
372
|
+
return logging;
|
|
373
|
+
} catch {
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
//#endregion
|
|
379
|
+
//#region src/logging/levels.ts
|
|
380
|
+
const ALLOWED_LOG_LEVELS = [
|
|
381
|
+
"silent",
|
|
382
|
+
"fatal",
|
|
383
|
+
"error",
|
|
384
|
+
"warn",
|
|
385
|
+
"info",
|
|
386
|
+
"debug",
|
|
387
|
+
"trace"
|
|
388
|
+
];
|
|
389
|
+
function normalizeLogLevel(level, fallback = "info") {
|
|
390
|
+
const candidate = (level ?? fallback).trim();
|
|
391
|
+
return ALLOWED_LOG_LEVELS.includes(candidate) ? candidate : fallback;
|
|
392
|
+
}
|
|
393
|
+
function levelToMinLevel(level) {
|
|
394
|
+
return {
|
|
395
|
+
fatal: 0,
|
|
396
|
+
error: 1,
|
|
397
|
+
warn: 2,
|
|
398
|
+
info: 3,
|
|
399
|
+
debug: 4,
|
|
400
|
+
trace: 5,
|
|
401
|
+
silent: Number.POSITIVE_INFINITY
|
|
402
|
+
}[level];
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
//#endregion
|
|
406
|
+
//#region src/logging/state.ts
|
|
407
|
+
const loggingState = {
|
|
408
|
+
cachedLogger: null,
|
|
409
|
+
cachedSettings: null,
|
|
410
|
+
cachedConsoleSettings: null,
|
|
411
|
+
overrideSettings: null,
|
|
412
|
+
consolePatched: false,
|
|
413
|
+
forceConsoleToStderr: false,
|
|
414
|
+
consoleTimestampPrefix: false,
|
|
415
|
+
consoleSubsystemFilter: null,
|
|
416
|
+
resolvingConsoleSettings: false,
|
|
417
|
+
rawConsole: null
|
|
418
|
+
};
|
|
419
|
+
|
|
420
|
+
//#endregion
|
|
421
|
+
//#region src/logging/logger.ts
|
|
422
|
+
const DEFAULT_LOG_DIR = "/tmp/openclaw";
|
|
423
|
+
const DEFAULT_LOG_FILE = path.join(DEFAULT_LOG_DIR, "openclaw.log");
|
|
424
|
+
const LOG_PREFIX = "openclaw";
|
|
425
|
+
const LOG_SUFFIX = ".log";
|
|
426
|
+
const MAX_LOG_AGE_MS = 1440 * 60 * 1e3;
|
|
427
|
+
const requireConfig$1 = createRequire(import.meta.url);
|
|
428
|
+
const externalTransports = /* @__PURE__ */ new Set();
|
|
429
|
+
function attachExternalTransport(logger, transport) {
|
|
430
|
+
logger.attachTransport((logObj) => {
|
|
431
|
+
if (!externalTransports.has(transport)) return;
|
|
432
|
+
try {
|
|
433
|
+
transport(logObj);
|
|
434
|
+
} catch {}
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
function resolveSettings() {
|
|
438
|
+
let cfg = loggingState.overrideSettings ?? readLoggingConfig();
|
|
439
|
+
if (!cfg) try {
|
|
440
|
+
cfg = requireConfig$1("../config/config.js").loadConfig?.().logging;
|
|
441
|
+
} catch {
|
|
442
|
+
cfg = void 0;
|
|
443
|
+
}
|
|
444
|
+
return {
|
|
445
|
+
level: normalizeLogLevel(cfg?.level, "info"),
|
|
446
|
+
file: cfg?.file ?? defaultRollingPathForToday()
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
function settingsChanged(a, b) {
|
|
450
|
+
if (!a) return true;
|
|
451
|
+
return a.level !== b.level || a.file !== b.file;
|
|
452
|
+
}
|
|
453
|
+
function isFileLogLevelEnabled(level) {
|
|
454
|
+
const settings = loggingState.cachedSettings ?? resolveSettings();
|
|
455
|
+
if (!loggingState.cachedSettings) loggingState.cachedSettings = settings;
|
|
456
|
+
if (settings.level === "silent") return false;
|
|
457
|
+
return levelToMinLevel(level) <= levelToMinLevel(settings.level);
|
|
458
|
+
}
|
|
459
|
+
function buildLogger(settings) {
|
|
460
|
+
fs.mkdirSync(path.dirname(settings.file), { recursive: true });
|
|
461
|
+
if (isRollingPath(settings.file)) pruneOldRollingLogs(path.dirname(settings.file));
|
|
462
|
+
const logger = new Logger({
|
|
463
|
+
name: "openclaw",
|
|
464
|
+
minLevel: levelToMinLevel(settings.level),
|
|
465
|
+
type: "hidden"
|
|
466
|
+
});
|
|
467
|
+
logger.attachTransport((logObj) => {
|
|
468
|
+
try {
|
|
469
|
+
const time = logObj.date?.toISOString?.() ?? (/* @__PURE__ */ new Date()).toISOString();
|
|
470
|
+
const line = JSON.stringify({
|
|
471
|
+
...logObj,
|
|
472
|
+
time
|
|
473
|
+
});
|
|
474
|
+
fs.appendFileSync(settings.file, `${line}\n`, { encoding: "utf8" });
|
|
475
|
+
} catch {}
|
|
476
|
+
});
|
|
477
|
+
for (const transport of externalTransports) attachExternalTransport(logger, transport);
|
|
478
|
+
return logger;
|
|
479
|
+
}
|
|
480
|
+
function getLogger() {
|
|
481
|
+
const settings = resolveSettings();
|
|
482
|
+
const cachedLogger = loggingState.cachedLogger;
|
|
483
|
+
const cachedSettings = loggingState.cachedSettings;
|
|
484
|
+
if (!cachedLogger || settingsChanged(cachedSettings, settings)) {
|
|
485
|
+
loggingState.cachedLogger = buildLogger(settings);
|
|
486
|
+
loggingState.cachedSettings = settings;
|
|
487
|
+
}
|
|
488
|
+
return loggingState.cachedLogger;
|
|
489
|
+
}
|
|
490
|
+
function getChildLogger(bindings, opts) {
|
|
491
|
+
const base = getLogger();
|
|
492
|
+
const minLevel = opts?.level ? levelToMinLevel(opts.level) : void 0;
|
|
493
|
+
const name = bindings ? JSON.stringify(bindings) : void 0;
|
|
494
|
+
return base.getSubLogger({
|
|
495
|
+
name,
|
|
496
|
+
minLevel,
|
|
497
|
+
prefix: bindings ? [name ?? ""] : []
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
function toPinoLikeLogger(logger, level) {
|
|
501
|
+
const buildChild = (bindings) => toPinoLikeLogger(logger.getSubLogger({ name: bindings ? JSON.stringify(bindings) : void 0 }), level);
|
|
502
|
+
return {
|
|
503
|
+
level,
|
|
504
|
+
child: buildChild,
|
|
505
|
+
trace: (...args) => logger.trace(...args),
|
|
506
|
+
debug: (...args) => logger.debug(...args),
|
|
507
|
+
info: (...args) => logger.info(...args),
|
|
508
|
+
warn: (...args) => logger.warn(...args),
|
|
509
|
+
error: (...args) => logger.error(...args),
|
|
510
|
+
fatal: (...args) => logger.fatal(...args)
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
function registerLogTransport(transport) {
|
|
514
|
+
externalTransports.add(transport);
|
|
515
|
+
const logger = loggingState.cachedLogger;
|
|
516
|
+
if (logger) attachExternalTransport(logger, transport);
|
|
517
|
+
return () => {
|
|
518
|
+
externalTransports.delete(transport);
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
function formatLocalDate(date) {
|
|
522
|
+
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}-${String(date.getDate()).padStart(2, "0")}`;
|
|
523
|
+
}
|
|
524
|
+
function defaultRollingPathForToday() {
|
|
525
|
+
const today = formatLocalDate(/* @__PURE__ */ new Date());
|
|
526
|
+
return path.join(DEFAULT_LOG_DIR, `${LOG_PREFIX}-${today}${LOG_SUFFIX}`);
|
|
527
|
+
}
|
|
528
|
+
function isRollingPath(file) {
|
|
529
|
+
const base = path.basename(file);
|
|
530
|
+
return base.startsWith(`${LOG_PREFIX}-`) && base.endsWith(LOG_SUFFIX) && base.length === `${LOG_PREFIX}-YYYY-MM-DD${LOG_SUFFIX}`.length;
|
|
531
|
+
}
|
|
532
|
+
function pruneOldRollingLogs(dir) {
|
|
533
|
+
try {
|
|
534
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
535
|
+
const cutoff = Date.now() - MAX_LOG_AGE_MS;
|
|
536
|
+
for (const entry of entries) {
|
|
537
|
+
if (!entry.isFile()) continue;
|
|
538
|
+
if (!entry.name.startsWith(`${LOG_PREFIX}-`) || !entry.name.endsWith(LOG_SUFFIX)) continue;
|
|
539
|
+
const fullPath = path.join(dir, entry.name);
|
|
540
|
+
try {
|
|
541
|
+
if (fs.statSync(fullPath).mtimeMs < cutoff) fs.rmSync(fullPath, { force: true });
|
|
542
|
+
} catch {}
|
|
543
|
+
}
|
|
544
|
+
} catch {}
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
//#endregion
|
|
548
|
+
//#region src/terminal/palette.ts
|
|
549
|
+
const LOBSTER_PALETTE = {
|
|
550
|
+
accent: "#FF5A2D",
|
|
551
|
+
accentBright: "#FF7A3D",
|
|
552
|
+
accentDim: "#D14A22",
|
|
553
|
+
info: "#FF8A5B",
|
|
554
|
+
success: "#2FBF71",
|
|
555
|
+
warn: "#FFB020",
|
|
556
|
+
error: "#E23D2D",
|
|
557
|
+
muted: "#8B7F77"
|
|
558
|
+
};
|
|
559
|
+
|
|
560
|
+
//#endregion
|
|
561
|
+
//#region src/terminal/theme.ts
|
|
562
|
+
const hasForceColor = typeof process.env.FORCE_COLOR === "string" && process.env.FORCE_COLOR.trim().length > 0 && process.env.FORCE_COLOR.trim() !== "0";
|
|
563
|
+
const baseChalk = process.env.NO_COLOR && !hasForceColor ? new Chalk({ level: 0 }) : chalk;
|
|
564
|
+
const hex = (value) => baseChalk.hex(value);
|
|
565
|
+
const theme = {
|
|
566
|
+
accent: hex(LOBSTER_PALETTE.accent),
|
|
567
|
+
accentBright: hex(LOBSTER_PALETTE.accentBright),
|
|
568
|
+
accentDim: hex(LOBSTER_PALETTE.accentDim),
|
|
569
|
+
info: hex(LOBSTER_PALETTE.info),
|
|
570
|
+
success: hex(LOBSTER_PALETTE.success),
|
|
571
|
+
warn: hex(LOBSTER_PALETTE.warn),
|
|
572
|
+
error: hex(LOBSTER_PALETTE.error),
|
|
573
|
+
muted: hex(LOBSTER_PALETTE.muted),
|
|
574
|
+
heading: baseChalk.bold.hex(LOBSTER_PALETTE.accent),
|
|
575
|
+
command: hex(LOBSTER_PALETTE.accentBright),
|
|
576
|
+
option: hex(LOBSTER_PALETTE.warn)
|
|
577
|
+
};
|
|
578
|
+
|
|
579
|
+
//#endregion
|
|
580
|
+
//#region src/globals.ts
|
|
581
|
+
let globalVerbose = false;
|
|
582
|
+
function isVerbose() {
|
|
583
|
+
return globalVerbose;
|
|
584
|
+
}
|
|
585
|
+
function shouldLogVerbose() {
|
|
586
|
+
return globalVerbose || isFileLogLevelEnabled("debug");
|
|
587
|
+
}
|
|
588
|
+
function logVerbose(message) {
|
|
589
|
+
if (!shouldLogVerbose()) return;
|
|
590
|
+
try {
|
|
591
|
+
getLogger().debug({ message }, "verbose");
|
|
592
|
+
} catch {}
|
|
593
|
+
if (!globalVerbose) return;
|
|
594
|
+
console.log(theme.muted(message));
|
|
595
|
+
}
|
|
596
|
+
function logVerboseConsole(message) {
|
|
597
|
+
if (!globalVerbose) return;
|
|
598
|
+
console.log(theme.muted(message));
|
|
599
|
+
}
|
|
600
|
+
const success = theme.success;
|
|
601
|
+
const warn = theme.warn;
|
|
602
|
+
const info = theme.info;
|
|
603
|
+
const danger = theme.error;
|
|
604
|
+
|
|
605
|
+
//#endregion
|
|
606
|
+
//#region src/utils.ts
|
|
607
|
+
async function ensureDir(dir) {
|
|
608
|
+
await fs.promises.mkdir(dir, { recursive: true });
|
|
609
|
+
}
|
|
610
|
+
function normalizeE164(number) {
|
|
611
|
+
const digits = number.replace(/^whatsapp:/, "").trim().replace(/[^\d+]/g, "");
|
|
612
|
+
if (digits.startsWith("+")) return `+${digits.slice(1)}`;
|
|
613
|
+
return `+${digits}`;
|
|
614
|
+
}
|
|
615
|
+
function sleep(ms) {
|
|
616
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
617
|
+
}
|
|
618
|
+
function isHighSurrogate(codeUnit) {
|
|
619
|
+
return codeUnit >= 55296 && codeUnit <= 56319;
|
|
620
|
+
}
|
|
621
|
+
function isLowSurrogate(codeUnit) {
|
|
622
|
+
return codeUnit >= 56320 && codeUnit <= 57343;
|
|
623
|
+
}
|
|
624
|
+
function sliceUtf16Safe(input, start, end) {
|
|
625
|
+
const len = input.length;
|
|
626
|
+
let from = start < 0 ? Math.max(len + start, 0) : Math.min(start, len);
|
|
627
|
+
let to = end === void 0 ? len : end < 0 ? Math.max(len + end, 0) : Math.min(end, len);
|
|
628
|
+
if (to < from) {
|
|
629
|
+
const tmp = from;
|
|
630
|
+
from = to;
|
|
631
|
+
to = tmp;
|
|
632
|
+
}
|
|
633
|
+
if (from > 0 && from < len) {
|
|
634
|
+
if (isLowSurrogate(input.charCodeAt(from)) && isHighSurrogate(input.charCodeAt(from - 1))) from += 1;
|
|
635
|
+
}
|
|
636
|
+
if (to > 0 && to < len) {
|
|
637
|
+
if (isHighSurrogate(input.charCodeAt(to - 1)) && isLowSurrogate(input.charCodeAt(to))) to -= 1;
|
|
638
|
+
}
|
|
639
|
+
return input.slice(from, to);
|
|
640
|
+
}
|
|
641
|
+
function resolveUserPath(input) {
|
|
642
|
+
const trimmed = input.trim();
|
|
643
|
+
if (!trimmed) return trimmed;
|
|
644
|
+
if (trimmed.startsWith("~")) {
|
|
645
|
+
const expanded = trimmed.replace(/^~(?=$|[\\/])/, os.homedir());
|
|
646
|
+
return path.resolve(expanded);
|
|
647
|
+
}
|
|
648
|
+
return path.resolve(trimmed);
|
|
649
|
+
}
|
|
650
|
+
function resolveConfigDir(env = process.env, homedir = os.homedir) {
|
|
651
|
+
const override = env.OPENCLAW_STATE_DIR?.trim() || env.CLAWDBOT_STATE_DIR?.trim();
|
|
652
|
+
if (override) return resolveUserPath(override);
|
|
653
|
+
const newDir = path.join(homedir(), ".openclaw");
|
|
654
|
+
try {
|
|
655
|
+
if (fs.existsSync(newDir)) return newDir;
|
|
656
|
+
} catch {}
|
|
657
|
+
return newDir;
|
|
658
|
+
}
|
|
659
|
+
function resolveHomeDir() {
|
|
660
|
+
const envHome = process.env.HOME?.trim();
|
|
661
|
+
if (envHome) return envHome;
|
|
662
|
+
const envProfile = process.env.USERPROFILE?.trim();
|
|
663
|
+
if (envProfile) return envProfile;
|
|
664
|
+
try {
|
|
665
|
+
const home = os.homedir();
|
|
666
|
+
return home?.trim() ? home : void 0;
|
|
667
|
+
} catch {
|
|
668
|
+
return;
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
function shortenHomeInString(input) {
|
|
672
|
+
if (!input) return input;
|
|
673
|
+
const home = resolveHomeDir();
|
|
674
|
+
if (!home) return input;
|
|
675
|
+
return input.split(home).join("~");
|
|
676
|
+
}
|
|
677
|
+
function formatTerminalLink(label, url, opts) {
|
|
678
|
+
const esc = "\x1B";
|
|
679
|
+
const safeLabel = label.replaceAll(esc, "");
|
|
680
|
+
const safeUrl = url.replaceAll(esc, "");
|
|
681
|
+
if (!(opts?.force === true ? true : opts?.force === false ? false : Boolean(process.stdout.isTTY))) return opts?.fallback ?? `${safeLabel} (${safeUrl})`;
|
|
682
|
+
return `\u001b]8;;${safeUrl}\u0007${safeLabel}\u001b]8;;\u0007`;
|
|
683
|
+
}
|
|
684
|
+
const CONFIG_DIR = resolveConfigDir();
|
|
685
|
+
|
|
686
|
+
//#endregion
|
|
687
|
+
//#region src/terminal/progress-line.ts
|
|
688
|
+
let activeStream = null;
|
|
689
|
+
function clearActiveProgressLine() {
|
|
690
|
+
if (!activeStream?.isTTY) return;
|
|
691
|
+
activeStream.write("\r\x1B[2K");
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
//#endregion
|
|
695
|
+
//#region src/terminal/restore.ts
|
|
696
|
+
const RESET_SEQUENCE = "\x1B[0m\x1B[?25h\x1B[?1000l\x1B[?1002l\x1B[?1003l\x1B[?1006l\x1B[?2004l";
|
|
697
|
+
function reportRestoreFailure(scope, err, reason) {
|
|
698
|
+
const suffix = reason ? ` (${reason})` : "";
|
|
699
|
+
const message = `[terminal] restore ${scope} failed${suffix}: ${String(err)}`;
|
|
700
|
+
try {
|
|
701
|
+
process.stderr.write(`${message}\n`);
|
|
702
|
+
} catch (writeErr) {
|
|
703
|
+
console.error(`[terminal] restore reporting failed${suffix}: ${String(writeErr)}`);
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
function restoreTerminalState(reason) {
|
|
707
|
+
try {
|
|
708
|
+
clearActiveProgressLine();
|
|
709
|
+
} catch (err) {
|
|
710
|
+
reportRestoreFailure("progress line", err, reason);
|
|
711
|
+
}
|
|
712
|
+
const stdin = process.stdin;
|
|
713
|
+
if (stdin.isTTY && typeof stdin.setRawMode === "function") {
|
|
714
|
+
try {
|
|
715
|
+
stdin.setRawMode(false);
|
|
716
|
+
} catch (err) {
|
|
717
|
+
reportRestoreFailure("raw mode", err, reason);
|
|
718
|
+
}
|
|
719
|
+
if (typeof stdin.isPaused === "function" && stdin.isPaused()) try {
|
|
720
|
+
stdin.resume();
|
|
721
|
+
} catch (err) {
|
|
722
|
+
reportRestoreFailure("stdin resume", err, reason);
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
if (process.stdout.isTTY) try {
|
|
726
|
+
process.stdout.write(RESET_SEQUENCE);
|
|
727
|
+
} catch (err) {
|
|
728
|
+
reportRestoreFailure("stdout reset", err, reason);
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
//#endregion
|
|
733
|
+
//#region src/runtime.ts
|
|
734
|
+
const defaultRuntime = {
|
|
735
|
+
log: (...args) => {
|
|
736
|
+
clearActiveProgressLine();
|
|
737
|
+
console.log(...args);
|
|
738
|
+
},
|
|
739
|
+
error: (...args) => {
|
|
740
|
+
clearActiveProgressLine();
|
|
741
|
+
console.error(...args);
|
|
742
|
+
},
|
|
743
|
+
exit: (code) => {
|
|
744
|
+
restoreTerminalState("runtime exit");
|
|
745
|
+
process.exit(code);
|
|
746
|
+
throw new Error("unreachable");
|
|
747
|
+
}
|
|
748
|
+
};
|
|
749
|
+
|
|
750
|
+
//#endregion
|
|
751
|
+
//#region src/terminal/ansi.ts
|
|
752
|
+
const ANSI_SGR_PATTERN = "\\x1b\\[[0-9;]*m";
|
|
753
|
+
const OSC8_PATTERN = "\\x1b\\]8;;.*?\\x1b\\\\|\\x1b\\]8;;\\x1b\\\\";
|
|
754
|
+
const ANSI_REGEX = new RegExp(ANSI_SGR_PATTERN, "g");
|
|
755
|
+
const OSC8_REGEX = new RegExp(OSC8_PATTERN, "g");
|
|
756
|
+
|
|
757
|
+
//#endregion
|
|
758
|
+
//#region src/logging/console.ts
|
|
759
|
+
const requireConfig = createRequire(import.meta.url);
|
|
760
|
+
function normalizeConsoleLevel(level) {
|
|
761
|
+
if (isVerbose()) return "debug";
|
|
762
|
+
return normalizeLogLevel(level, "info");
|
|
763
|
+
}
|
|
764
|
+
function normalizeConsoleStyle(style) {
|
|
765
|
+
if (style === "compact" || style === "json" || style === "pretty") return style;
|
|
766
|
+
if (!process.stdout.isTTY) return "compact";
|
|
767
|
+
return "pretty";
|
|
768
|
+
}
|
|
769
|
+
function resolveConsoleSettings() {
|
|
770
|
+
let cfg = loggingState.overrideSettings ?? readLoggingConfig();
|
|
771
|
+
if (!cfg) if (loggingState.resolvingConsoleSettings) cfg = void 0;
|
|
772
|
+
else {
|
|
773
|
+
loggingState.resolvingConsoleSettings = true;
|
|
774
|
+
try {
|
|
775
|
+
cfg = requireConfig("../config/config.js").loadConfig?.().logging;
|
|
776
|
+
} catch {
|
|
777
|
+
cfg = void 0;
|
|
778
|
+
} finally {
|
|
779
|
+
loggingState.resolvingConsoleSettings = false;
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
return {
|
|
783
|
+
level: normalizeConsoleLevel(cfg?.consoleLevel),
|
|
784
|
+
style: normalizeConsoleStyle(cfg?.consoleStyle)
|
|
785
|
+
};
|
|
786
|
+
}
|
|
787
|
+
function consoleSettingsChanged(a, b) {
|
|
788
|
+
if (!a) return true;
|
|
789
|
+
return a.level !== b.level || a.style !== b.style;
|
|
790
|
+
}
|
|
791
|
+
function getConsoleSettings() {
|
|
792
|
+
const settings = resolveConsoleSettings();
|
|
793
|
+
const cached = loggingState.cachedConsoleSettings;
|
|
794
|
+
if (!cached || consoleSettingsChanged(cached, settings)) loggingState.cachedConsoleSettings = settings;
|
|
795
|
+
return loggingState.cachedConsoleSettings;
|
|
796
|
+
}
|
|
797
|
+
function shouldLogSubsystemToConsole(subsystem) {
|
|
798
|
+
const filter = loggingState.consoleSubsystemFilter;
|
|
799
|
+
if (!filter || filter.length === 0) return true;
|
|
800
|
+
return filter.some((prefix) => subsystem === prefix || subsystem.startsWith(`${prefix}/`));
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
//#endregion
|
|
804
|
+
//#region src/logging/subsystem.ts
|
|
805
|
+
function shouldLogToConsole(level, settings) {
|
|
806
|
+
if (settings.level === "silent") return false;
|
|
807
|
+
return levelToMinLevel(level) <= levelToMinLevel(settings.level);
|
|
808
|
+
}
|
|
809
|
+
function isRichConsoleEnv() {
|
|
810
|
+
const term = (process.env.TERM ?? "").toLowerCase();
|
|
811
|
+
if (process.env.COLORTERM || process.env.TERM_PROGRAM) return true;
|
|
812
|
+
return term.length > 0 && term !== "dumb";
|
|
813
|
+
}
|
|
814
|
+
function getColorForConsole() {
|
|
815
|
+
const hasForceColor = typeof process.env.FORCE_COLOR === "string" && process.env.FORCE_COLOR.trim().length > 0 && process.env.FORCE_COLOR.trim() !== "0";
|
|
816
|
+
if (process.env.NO_COLOR && !hasForceColor) return new Chalk({ level: 0 });
|
|
817
|
+
return Boolean(process.stdout.isTTY || process.stderr.isTTY) || isRichConsoleEnv() ? new Chalk({ level: 1 }) : new Chalk({ level: 0 });
|
|
818
|
+
}
|
|
819
|
+
const SUBSYSTEM_COLORS = [
|
|
820
|
+
"cyan",
|
|
821
|
+
"green",
|
|
822
|
+
"yellow",
|
|
823
|
+
"blue",
|
|
824
|
+
"magenta",
|
|
825
|
+
"red"
|
|
826
|
+
];
|
|
827
|
+
const SUBSYSTEM_COLOR_OVERRIDES = { "gmail-watcher": "blue" };
|
|
828
|
+
const SUBSYSTEM_PREFIXES_TO_DROP = [
|
|
829
|
+
"gateway",
|
|
830
|
+
"channels",
|
|
831
|
+
"providers"
|
|
832
|
+
];
|
|
833
|
+
const SUBSYSTEM_MAX_SEGMENTS = 2;
|
|
834
|
+
const CHANNEL_SUBSYSTEM_PREFIXES = new Set(CHAT_CHANNEL_ORDER);
|
|
835
|
+
function pickSubsystemColor(color, subsystem) {
|
|
836
|
+
const override = SUBSYSTEM_COLOR_OVERRIDES[subsystem];
|
|
837
|
+
if (override) return color[override];
|
|
838
|
+
let hash = 0;
|
|
839
|
+
for (let i = 0; i < subsystem.length; i += 1) hash = hash * 31 + subsystem.charCodeAt(i) | 0;
|
|
840
|
+
return color[SUBSYSTEM_COLORS[Math.abs(hash) % SUBSYSTEM_COLORS.length]];
|
|
841
|
+
}
|
|
842
|
+
function formatSubsystemForConsole(subsystem) {
|
|
843
|
+
const parts = subsystem.split("/").filter(Boolean);
|
|
844
|
+
const original = parts.join("/") || subsystem;
|
|
845
|
+
while (parts.length > 0 && SUBSYSTEM_PREFIXES_TO_DROP.includes(parts[0])) parts.shift();
|
|
846
|
+
if (parts.length === 0) return original;
|
|
847
|
+
if (CHANNEL_SUBSYSTEM_PREFIXES.has(parts[0])) return parts[0];
|
|
848
|
+
if (parts.length > SUBSYSTEM_MAX_SEGMENTS) return parts.slice(-SUBSYSTEM_MAX_SEGMENTS).join("/");
|
|
849
|
+
return parts.join("/");
|
|
850
|
+
}
|
|
851
|
+
function stripRedundantSubsystemPrefixForConsole(message, displaySubsystem) {
|
|
852
|
+
if (!displaySubsystem) return message;
|
|
853
|
+
if (message.startsWith("[")) {
|
|
854
|
+
const closeIdx = message.indexOf("]");
|
|
855
|
+
if (closeIdx > 1) {
|
|
856
|
+
if (message.slice(1, closeIdx).toLowerCase() === displaySubsystem.toLowerCase()) {
|
|
857
|
+
let i = closeIdx + 1;
|
|
858
|
+
while (message[i] === " ") i += 1;
|
|
859
|
+
return message.slice(i);
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
if (message.slice(0, displaySubsystem.length).toLowerCase() !== displaySubsystem.toLowerCase()) return message;
|
|
864
|
+
const next = message.slice(displaySubsystem.length, displaySubsystem.length + 1);
|
|
865
|
+
if (next !== ":" && next !== " ") return message;
|
|
866
|
+
let i = displaySubsystem.length;
|
|
867
|
+
while (message[i] === " ") i += 1;
|
|
868
|
+
if (message[i] === ":") i += 1;
|
|
869
|
+
while (message[i] === " ") i += 1;
|
|
870
|
+
return message.slice(i);
|
|
871
|
+
}
|
|
872
|
+
function formatConsoleLine(opts) {
|
|
873
|
+
const displaySubsystem = opts.style === "json" ? opts.subsystem : formatSubsystemForConsole(opts.subsystem);
|
|
874
|
+
if (opts.style === "json") return JSON.stringify({
|
|
875
|
+
time: (/* @__PURE__ */ new Date()).toISOString(),
|
|
876
|
+
level: opts.level,
|
|
877
|
+
subsystem: displaySubsystem,
|
|
878
|
+
message: opts.message,
|
|
879
|
+
...opts.meta
|
|
880
|
+
});
|
|
881
|
+
const color = getColorForConsole();
|
|
882
|
+
const prefix = `[${displaySubsystem}]`;
|
|
883
|
+
const prefixColor = pickSubsystemColor(color, displaySubsystem);
|
|
884
|
+
const levelColor = opts.level === "error" || opts.level === "fatal" ? color.red : opts.level === "warn" ? color.yellow : opts.level === "debug" || opts.level === "trace" ? color.gray : color.cyan;
|
|
885
|
+
const displayMessage = stripRedundantSubsystemPrefixForConsole(opts.message, displaySubsystem);
|
|
886
|
+
return `${[(() => {
|
|
887
|
+
if (opts.style === "pretty") return color.gray((/* @__PURE__ */ new Date()).toISOString().slice(11, 19));
|
|
888
|
+
if (loggingState.consoleTimestampPrefix) return color.gray((/* @__PURE__ */ new Date()).toISOString());
|
|
889
|
+
return "";
|
|
890
|
+
})(), prefixColor(prefix)].filter(Boolean).join(" ")} ${levelColor(displayMessage)}`;
|
|
891
|
+
}
|
|
892
|
+
function writeConsoleLine(level, line) {
|
|
893
|
+
clearActiveProgressLine();
|
|
894
|
+
const sanitized = process.platform === "win32" && process.env.GITHUB_ACTIONS === "true" ? line.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, "?").replace(/[\uD800-\uDFFF]/g, "?") : line;
|
|
895
|
+
const sink = loggingState.rawConsole ?? console;
|
|
896
|
+
if (loggingState.forceConsoleToStderr || level === "error" || level === "fatal") (sink.error ?? console.error)(sanitized);
|
|
897
|
+
else if (level === "warn") (sink.warn ?? console.warn)(sanitized);
|
|
898
|
+
else (sink.log ?? console.log)(sanitized);
|
|
899
|
+
}
|
|
900
|
+
function logToFile(fileLogger, level, message, meta) {
|
|
901
|
+
if (level === "silent") return;
|
|
902
|
+
const method = fileLogger[level];
|
|
903
|
+
if (typeof method !== "function") return;
|
|
904
|
+
if (meta && Object.keys(meta).length > 0) method.call(fileLogger, meta, message);
|
|
905
|
+
else method.call(fileLogger, message);
|
|
906
|
+
}
|
|
907
|
+
function createSubsystemLogger(subsystem) {
|
|
908
|
+
let fileLogger = null;
|
|
909
|
+
const getFileLogger = () => {
|
|
910
|
+
if (!fileLogger) fileLogger = getChildLogger({ subsystem });
|
|
911
|
+
return fileLogger;
|
|
912
|
+
};
|
|
913
|
+
const emit = (level, message, meta) => {
|
|
914
|
+
const consoleSettings = getConsoleSettings();
|
|
915
|
+
let consoleMessageOverride;
|
|
916
|
+
let fileMeta = meta;
|
|
917
|
+
if (meta && Object.keys(meta).length > 0) {
|
|
918
|
+
const { consoleMessage, ...rest } = meta;
|
|
919
|
+
if (typeof consoleMessage === "string") consoleMessageOverride = consoleMessage;
|
|
920
|
+
fileMeta = Object.keys(rest).length > 0 ? rest : void 0;
|
|
921
|
+
}
|
|
922
|
+
logToFile(getFileLogger(), level, message, fileMeta);
|
|
923
|
+
if (!shouldLogToConsole(level, { level: consoleSettings.level })) return;
|
|
924
|
+
if (!shouldLogSubsystemToConsole(subsystem)) return;
|
|
925
|
+
const consoleMessage = consoleMessageOverride ?? message;
|
|
926
|
+
if (!isVerbose() && subsystem === "agent/embedded" && /(sessionId|runId)=probe-/.test(consoleMessage)) return;
|
|
927
|
+
writeConsoleLine(level, formatConsoleLine({
|
|
928
|
+
level,
|
|
929
|
+
subsystem,
|
|
930
|
+
message: consoleSettings.style === "json" ? message : consoleMessage,
|
|
931
|
+
style: consoleSettings.style,
|
|
932
|
+
meta: fileMeta
|
|
933
|
+
}));
|
|
934
|
+
};
|
|
935
|
+
return {
|
|
936
|
+
subsystem,
|
|
937
|
+
trace: (message, meta) => emit("trace", message, meta),
|
|
938
|
+
debug: (message, meta) => emit("debug", message, meta),
|
|
939
|
+
info: (message, meta) => emit("info", message, meta),
|
|
940
|
+
warn: (message, meta) => emit("warn", message, meta),
|
|
941
|
+
error: (message, meta) => emit("error", message, meta),
|
|
942
|
+
fatal: (message, meta) => emit("fatal", message, meta),
|
|
943
|
+
raw: (message) => {
|
|
944
|
+
logToFile(getFileLogger(), "info", message, { raw: true });
|
|
945
|
+
if (shouldLogSubsystemToConsole(subsystem)) {
|
|
946
|
+
if (!isVerbose() && subsystem === "agent/embedded" && /(sessionId|runId)=probe-/.test(message)) return;
|
|
947
|
+
writeConsoleLine("info", message);
|
|
948
|
+
}
|
|
949
|
+
},
|
|
950
|
+
child: (name) => createSubsystemLogger(`${subsystem}/${name}`)
|
|
951
|
+
};
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
//#endregion
|
|
955
|
+
//#region src/logger.ts
|
|
956
|
+
const subsystemPrefixRe = /^([a-z][a-z0-9-]{1,20}):\s+(.*)$/i;
|
|
957
|
+
function splitSubsystem(message) {
|
|
958
|
+
const match = message.match(subsystemPrefixRe);
|
|
959
|
+
if (!match) return null;
|
|
960
|
+
const [, subsystem, rest] = match;
|
|
961
|
+
return {
|
|
962
|
+
subsystem,
|
|
963
|
+
rest
|
|
964
|
+
};
|
|
965
|
+
}
|
|
966
|
+
function logInfo(message, runtime = defaultRuntime) {
|
|
967
|
+
const parsed = runtime === defaultRuntime ? splitSubsystem(message) : null;
|
|
968
|
+
if (parsed) {
|
|
969
|
+
createSubsystemLogger(parsed.subsystem).info(parsed.rest);
|
|
970
|
+
return;
|
|
971
|
+
}
|
|
972
|
+
runtime.log(info(message));
|
|
973
|
+
getLogger().info(message);
|
|
974
|
+
}
|
|
975
|
+
function logWarn(message, runtime = defaultRuntime) {
|
|
976
|
+
const parsed = runtime === defaultRuntime ? splitSubsystem(message) : null;
|
|
977
|
+
if (parsed) {
|
|
978
|
+
createSubsystemLogger(parsed.subsystem).warn(parsed.rest);
|
|
979
|
+
return;
|
|
980
|
+
}
|
|
981
|
+
runtime.log(warn(message));
|
|
982
|
+
getLogger().warn(message);
|
|
983
|
+
}
|
|
984
|
+
function logError(message, runtime = defaultRuntime) {
|
|
985
|
+
const parsed = runtime === defaultRuntime ? splitSubsystem(message) : null;
|
|
986
|
+
if (parsed) {
|
|
987
|
+
createSubsystemLogger(parsed.subsystem).error(parsed.rest);
|
|
988
|
+
return;
|
|
989
|
+
}
|
|
990
|
+
runtime.error(danger(message));
|
|
991
|
+
getLogger().error(message);
|
|
992
|
+
}
|
|
993
|
+
function logDebug(message) {
|
|
994
|
+
getLogger().debug(message);
|
|
995
|
+
logVerboseConsole(message);
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
//#endregion
|
|
999
|
+
//#region src/process/spawn-utils.ts
|
|
1000
|
+
const DEFAULT_RETRY_CODES = ["EBADF"];
|
|
1001
|
+
function resolveCommandStdio(params) {
|
|
1002
|
+
return [
|
|
1003
|
+
params.hasInput ? "pipe" : params.preferInherit ? "inherit" : "pipe",
|
|
1004
|
+
"pipe",
|
|
1005
|
+
"pipe"
|
|
1006
|
+
];
|
|
1007
|
+
}
|
|
1008
|
+
function formatSpawnError(err) {
|
|
1009
|
+
if (!(err instanceof Error)) return String(err);
|
|
1010
|
+
const details = err;
|
|
1011
|
+
const parts = [];
|
|
1012
|
+
const message = err.message?.trim();
|
|
1013
|
+
if (message) parts.push(message);
|
|
1014
|
+
if (details.code && !message?.includes(details.code)) parts.push(details.code);
|
|
1015
|
+
if (details.syscall) parts.push(`syscall=${details.syscall}`);
|
|
1016
|
+
if (typeof details.errno === "number") parts.push(`errno=${details.errno}`);
|
|
1017
|
+
return parts.join(" ");
|
|
1018
|
+
}
|
|
1019
|
+
function shouldRetry(err, codes) {
|
|
1020
|
+
const code = err && typeof err === "object" && "code" in err ? String(err.code) : "";
|
|
1021
|
+
return code.length > 0 && codes.includes(code);
|
|
1022
|
+
}
|
|
1023
|
+
async function spawnAndWaitForSpawn(spawnImpl, argv, options) {
|
|
1024
|
+
const child = spawnImpl(argv[0], argv.slice(1), options);
|
|
1025
|
+
return await new Promise((resolve, reject) => {
|
|
1026
|
+
let settled = false;
|
|
1027
|
+
const cleanup = () => {
|
|
1028
|
+
child.removeListener("error", onError);
|
|
1029
|
+
child.removeListener("spawn", onSpawn);
|
|
1030
|
+
};
|
|
1031
|
+
const finishResolve = () => {
|
|
1032
|
+
if (settled) return;
|
|
1033
|
+
settled = true;
|
|
1034
|
+
cleanup();
|
|
1035
|
+
resolve(child);
|
|
1036
|
+
};
|
|
1037
|
+
const onError = (err) => {
|
|
1038
|
+
if (settled) return;
|
|
1039
|
+
settled = true;
|
|
1040
|
+
cleanup();
|
|
1041
|
+
reject(err);
|
|
1042
|
+
};
|
|
1043
|
+
const onSpawn = () => {
|
|
1044
|
+
finishResolve();
|
|
1045
|
+
};
|
|
1046
|
+
child.once("error", onError);
|
|
1047
|
+
child.once("spawn", onSpawn);
|
|
1048
|
+
process.nextTick(() => {
|
|
1049
|
+
if (typeof child.pid === "number") finishResolve();
|
|
1050
|
+
});
|
|
1051
|
+
});
|
|
1052
|
+
}
|
|
1053
|
+
async function spawnWithFallback(params) {
|
|
1054
|
+
const spawnImpl = params.spawnImpl ?? spawn;
|
|
1055
|
+
const retryCodes = params.retryCodes ?? DEFAULT_RETRY_CODES;
|
|
1056
|
+
const baseOptions = { ...params.options };
|
|
1057
|
+
const fallbacks = params.fallbacks ?? [];
|
|
1058
|
+
const attempts = [{ options: baseOptions }, ...fallbacks.map((fallback) => ({
|
|
1059
|
+
label: fallback.label,
|
|
1060
|
+
options: {
|
|
1061
|
+
...baseOptions,
|
|
1062
|
+
...fallback.options
|
|
1063
|
+
}
|
|
1064
|
+
}))];
|
|
1065
|
+
let lastError;
|
|
1066
|
+
for (let index = 0; index < attempts.length; index += 1) {
|
|
1067
|
+
const attempt = attempts[index];
|
|
1068
|
+
try {
|
|
1069
|
+
return {
|
|
1070
|
+
child: await spawnAndWaitForSpawn(spawnImpl, params.argv, attempt.options),
|
|
1071
|
+
usedFallback: index > 0,
|
|
1072
|
+
fallbackLabel: attempt.label
|
|
1073
|
+
};
|
|
1074
|
+
} catch (err) {
|
|
1075
|
+
lastError = err;
|
|
1076
|
+
const nextFallback = fallbacks[index];
|
|
1077
|
+
if (!nextFallback || !shouldRetry(err, retryCodes)) throw err;
|
|
1078
|
+
params.onFallback?.(err, nextFallback);
|
|
1079
|
+
}
|
|
1080
|
+
}
|
|
1081
|
+
throw lastError;
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
//#endregion
|
|
1085
|
+
//#region src/process/exec.ts
|
|
1086
|
+
const execFileAsync = promisify(execFile);
|
|
1087
|
+
/**
|
|
1088
|
+
* Resolves a command for Windows compatibility.
|
|
1089
|
+
* On Windows, non-.exe commands (like npm, pnpm) require their .cmd extension.
|
|
1090
|
+
*/
|
|
1091
|
+
function resolveCommand(command) {
|
|
1092
|
+
if (process.platform !== "win32") return command;
|
|
1093
|
+
const basename = path.basename(command).toLowerCase();
|
|
1094
|
+
if (path.extname(basename)) return command;
|
|
1095
|
+
if ([
|
|
1096
|
+
"npm",
|
|
1097
|
+
"pnpm",
|
|
1098
|
+
"yarn",
|
|
1099
|
+
"npx"
|
|
1100
|
+
].includes(basename)) return `${command}.cmd`;
|
|
1101
|
+
return command;
|
|
1102
|
+
}
|
|
1103
|
+
async function runExec(command, args, opts = 1e4) {
|
|
1104
|
+
const options = typeof opts === "number" ? {
|
|
1105
|
+
timeout: opts,
|
|
1106
|
+
encoding: "utf8"
|
|
1107
|
+
} : {
|
|
1108
|
+
timeout: opts.timeoutMs,
|
|
1109
|
+
maxBuffer: opts.maxBuffer,
|
|
1110
|
+
encoding: "utf8"
|
|
1111
|
+
};
|
|
1112
|
+
try {
|
|
1113
|
+
const { stdout, stderr } = await execFileAsync(resolveCommand(command), args, options);
|
|
1114
|
+
if (shouldLogVerbose()) {
|
|
1115
|
+
if (stdout.trim()) logDebug(stdout.trim());
|
|
1116
|
+
if (stderr.trim()) logError(stderr.trim());
|
|
1117
|
+
}
|
|
1118
|
+
return {
|
|
1119
|
+
stdout,
|
|
1120
|
+
stderr
|
|
1121
|
+
};
|
|
1122
|
+
} catch (err) {
|
|
1123
|
+
if (shouldLogVerbose()) logError(danger(`Command failed: ${command} ${args.join(" ")}`));
|
|
1124
|
+
throw err;
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
async function runCommandWithTimeout(argv, optionsOrTimeout) {
|
|
1128
|
+
const options = typeof optionsOrTimeout === "number" ? { timeoutMs: optionsOrTimeout } : optionsOrTimeout;
|
|
1129
|
+
const { timeoutMs, cwd, input, env } = options;
|
|
1130
|
+
const { windowsVerbatimArguments } = options;
|
|
1131
|
+
const hasInput = input !== void 0;
|
|
1132
|
+
const shouldSuppressNpmFund = (() => {
|
|
1133
|
+
const cmd = path.basename(argv[0] ?? "");
|
|
1134
|
+
if (cmd === "npm" || cmd === "npm.cmd" || cmd === "npm.exe") return true;
|
|
1135
|
+
if (cmd === "node" || cmd === "node.exe") return (argv[1] ?? "").includes("npm-cli.js");
|
|
1136
|
+
return false;
|
|
1137
|
+
})();
|
|
1138
|
+
const resolvedEnv = env ? {
|
|
1139
|
+
...process.env,
|
|
1140
|
+
...env
|
|
1141
|
+
} : { ...process.env };
|
|
1142
|
+
if (shouldSuppressNpmFund) {
|
|
1143
|
+
if (resolvedEnv.NPM_CONFIG_FUND == null) resolvedEnv.NPM_CONFIG_FUND = "false";
|
|
1144
|
+
if (resolvedEnv.npm_config_fund == null) resolvedEnv.npm_config_fund = "false";
|
|
1145
|
+
}
|
|
1146
|
+
const stdio = resolveCommandStdio({
|
|
1147
|
+
hasInput,
|
|
1148
|
+
preferInherit: true
|
|
1149
|
+
});
|
|
1150
|
+
const child = spawn(resolveCommand(argv[0]), argv.slice(1), {
|
|
1151
|
+
stdio,
|
|
1152
|
+
cwd,
|
|
1153
|
+
env: resolvedEnv,
|
|
1154
|
+
windowsVerbatimArguments
|
|
1155
|
+
});
|
|
1156
|
+
return await new Promise((resolve, reject) => {
|
|
1157
|
+
let stdout = "";
|
|
1158
|
+
let stderr = "";
|
|
1159
|
+
let settled = false;
|
|
1160
|
+
const timer = setTimeout(() => {
|
|
1161
|
+
if (typeof child.kill === "function") child.kill("SIGKILL");
|
|
1162
|
+
}, timeoutMs);
|
|
1163
|
+
if (hasInput && child.stdin) {
|
|
1164
|
+
child.stdin.write(input ?? "");
|
|
1165
|
+
child.stdin.end();
|
|
1166
|
+
}
|
|
1167
|
+
child.stdout?.on("data", (d) => {
|
|
1168
|
+
stdout += d.toString();
|
|
1169
|
+
});
|
|
1170
|
+
child.stderr?.on("data", (d) => {
|
|
1171
|
+
stderr += d.toString();
|
|
1172
|
+
});
|
|
1173
|
+
child.on("error", (err) => {
|
|
1174
|
+
if (settled) return;
|
|
1175
|
+
settled = true;
|
|
1176
|
+
clearTimeout(timer);
|
|
1177
|
+
reject(err);
|
|
1178
|
+
});
|
|
1179
|
+
child.on("close", (code, signal) => {
|
|
1180
|
+
if (settled) return;
|
|
1181
|
+
settled = true;
|
|
1182
|
+
clearTimeout(timer);
|
|
1183
|
+
resolve({
|
|
1184
|
+
stdout,
|
|
1185
|
+
stderr,
|
|
1186
|
+
code,
|
|
1187
|
+
signal,
|
|
1188
|
+
killed: child.killed
|
|
1189
|
+
});
|
|
1190
|
+
});
|
|
1191
|
+
});
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1194
|
+
//#endregion
|
|
1195
|
+
//#region src/agents/workspace-templates.ts
|
|
1196
|
+
const FALLBACK_TEMPLATE_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../docs/reference/templates");
|
|
1197
|
+
|
|
1198
|
+
//#endregion
|
|
1199
|
+
//#region src/agents/workspace.ts
|
|
1200
|
+
function resolveDefaultAgentWorkspaceDir(env = process.env, homedir = os.homedir) {
|
|
1201
|
+
const profile = env.OPENCLAW_PROFILE?.trim();
|
|
1202
|
+
if (profile && profile.toLowerCase() !== "default") return path.join(homedir(), ".openclaw", `workspace-${profile}`);
|
|
1203
|
+
return path.join(homedir(), ".openclaw", "workspace");
|
|
1204
|
+
}
|
|
1205
|
+
const DEFAULT_AGENT_WORKSPACE_DIR = resolveDefaultAgentWorkspaceDir();
|
|
1206
|
+
|
|
1207
|
+
//#endregion
|
|
1208
|
+
//#region src/agents/agent-scope.ts
|
|
1209
|
+
let defaultAgentWarned = false;
|
|
1210
|
+
function listAgents(cfg) {
|
|
1211
|
+
const list = cfg.agents?.list;
|
|
1212
|
+
if (!Array.isArray(list)) return [];
|
|
1213
|
+
return list.filter((entry) => Boolean(entry && typeof entry === "object"));
|
|
1214
|
+
}
|
|
1215
|
+
function resolveDefaultAgentId(cfg) {
|
|
1216
|
+
const agents = listAgents(cfg);
|
|
1217
|
+
if (agents.length === 0) return DEFAULT_AGENT_ID;
|
|
1218
|
+
const defaults = agents.filter((agent) => agent?.default);
|
|
1219
|
+
if (defaults.length > 1 && !defaultAgentWarned) {
|
|
1220
|
+
defaultAgentWarned = true;
|
|
1221
|
+
console.warn("Multiple agents marked default=true; using the first entry as default.");
|
|
1222
|
+
}
|
|
1223
|
+
const chosen = (defaults[0] ?? agents[0])?.id?.trim();
|
|
1224
|
+
return normalizeAgentId(chosen || DEFAULT_AGENT_ID);
|
|
1225
|
+
}
|
|
1226
|
+
function resolveAgentEntry(cfg, agentId) {
|
|
1227
|
+
const id = normalizeAgentId(agentId);
|
|
1228
|
+
return listAgents(cfg).find((entry) => normalizeAgentId(entry.id) === id);
|
|
1229
|
+
}
|
|
1230
|
+
function resolveAgentConfig(cfg, agentId) {
|
|
1231
|
+
const entry = resolveAgentEntry(cfg, normalizeAgentId(agentId));
|
|
1232
|
+
if (!entry) return;
|
|
1233
|
+
return {
|
|
1234
|
+
name: typeof entry.name === "string" ? entry.name : void 0,
|
|
1235
|
+
workspace: typeof entry.workspace === "string" ? entry.workspace : void 0,
|
|
1236
|
+
agentDir: typeof entry.agentDir === "string" ? entry.agentDir : void 0,
|
|
1237
|
+
model: typeof entry.model === "string" || entry.model && typeof entry.model === "object" ? entry.model : void 0,
|
|
1238
|
+
skills: Array.isArray(entry.skills) ? entry.skills : void 0,
|
|
1239
|
+
memorySearch: entry.memorySearch,
|
|
1240
|
+
humanDelay: entry.humanDelay,
|
|
1241
|
+
heartbeat: entry.heartbeat,
|
|
1242
|
+
identity: entry.identity,
|
|
1243
|
+
groupChat: entry.groupChat,
|
|
1244
|
+
subagents: typeof entry.subagents === "object" && entry.subagents ? entry.subagents : void 0,
|
|
1245
|
+
sandbox: entry.sandbox,
|
|
1246
|
+
tools: entry.tools
|
|
1247
|
+
};
|
|
1248
|
+
}
|
|
1249
|
+
function resolveAgentWorkspaceDir(cfg, agentId) {
|
|
1250
|
+
const id = normalizeAgentId(agentId);
|
|
1251
|
+
const configured = resolveAgentConfig(cfg, id)?.workspace?.trim();
|
|
1252
|
+
if (configured) return resolveUserPath(configured);
|
|
1253
|
+
if (id === resolveDefaultAgentId(cfg)) {
|
|
1254
|
+
const fallback = cfg.agents?.defaults?.workspace?.trim();
|
|
1255
|
+
if (fallback) return resolveUserPath(fallback);
|
|
1256
|
+
return DEFAULT_AGENT_WORKSPACE_DIR;
|
|
1257
|
+
}
|
|
1258
|
+
return path.join(os.homedir(), ".openclaw", `workspace-${id}`);
|
|
1259
|
+
}
|
|
1260
|
+
|
|
1261
|
+
//#endregion
|
|
1262
|
+
//#region src/utils/boolean.ts
|
|
1263
|
+
const DEFAULT_TRUTHY = [
|
|
1264
|
+
"true",
|
|
1265
|
+
"1",
|
|
1266
|
+
"yes",
|
|
1267
|
+
"on"
|
|
1268
|
+
];
|
|
1269
|
+
const DEFAULT_FALSY = [
|
|
1270
|
+
"false",
|
|
1271
|
+
"0",
|
|
1272
|
+
"no",
|
|
1273
|
+
"off"
|
|
1274
|
+
];
|
|
1275
|
+
const DEFAULT_TRUTHY_SET = new Set(DEFAULT_TRUTHY);
|
|
1276
|
+
const DEFAULT_FALSY_SET = new Set(DEFAULT_FALSY);
|
|
1277
|
+
function parseBooleanValue(value, options = {}) {
|
|
1278
|
+
if (typeof value === "boolean") return value;
|
|
1279
|
+
if (typeof value !== "string") return;
|
|
1280
|
+
const normalized = value.trim().toLowerCase();
|
|
1281
|
+
if (!normalized) return;
|
|
1282
|
+
const truthy = options.truthy ?? DEFAULT_TRUTHY;
|
|
1283
|
+
const falsy = options.falsy ?? DEFAULT_FALSY;
|
|
1284
|
+
const truthySet = truthy === DEFAULT_TRUTHY ? DEFAULT_TRUTHY_SET : new Set(truthy);
|
|
1285
|
+
const falsySet = falsy === DEFAULT_FALSY ? DEFAULT_FALSY_SET : new Set(falsy);
|
|
1286
|
+
if (truthySet.has(normalized)) return true;
|
|
1287
|
+
if (falsySet.has(normalized)) return false;
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
//#endregion
|
|
1291
|
+
//#region src/infra/env.ts
|
|
1292
|
+
const log$2 = createSubsystemLogger("env");
|
|
1293
|
+
function isTruthyEnvValue(value) {
|
|
1294
|
+
return parseBooleanValue(value) === true;
|
|
1295
|
+
}
|
|
1296
|
+
|
|
1297
|
+
//#endregion
|
|
1298
|
+
//#region src/branding/clawbrah.ts
|
|
1299
|
+
/**
|
|
1300
|
+
* ClawBrah branding configuration
|
|
1301
|
+
* This file is fork-specific and should never conflict with upstream
|
|
1302
|
+
*/
|
|
1303
|
+
const BRANDING$1 = {
|
|
1304
|
+
productName: "ClawBrah",
|
|
1305
|
+
productNameLower: "clawbrah",
|
|
1306
|
+
productNameKebab: "claw-brah",
|
|
1307
|
+
cliName: "clawbrah",
|
|
1308
|
+
cliNameKebab: "claw-brah",
|
|
1309
|
+
packageName: "clawbrah",
|
|
1310
|
+
displayName: "ClawBrah",
|
|
1311
|
+
displayNameShort: "ClawBrah",
|
|
1312
|
+
bundleIdPrefix: "ai.clawbrah",
|
|
1313
|
+
bundleIdMacos: "ai.clawbrah.mac",
|
|
1314
|
+
bundleIdIos: "ai.clawbrah.ios",
|
|
1315
|
+
bundleIdAndroid: "ai.clawbrah.android",
|
|
1316
|
+
gatewayServiceName: "clawbrah-gateway",
|
|
1317
|
+
nodeServiceName: "clawbrah-node",
|
|
1318
|
+
gatewayServiceMarker: "clawbrah",
|
|
1319
|
+
nodeServiceMarker: "clawbrah",
|
|
1320
|
+
gatewayLaunchAgentLabel: "ai.clawbrah.gateway",
|
|
1321
|
+
nodeLaunchAgentLabel: "ai.clawbrah.node",
|
|
1322
|
+
gatewaySystemdServiceName: "clawbrah-gateway",
|
|
1323
|
+
nodeSystemdServiceName: "clawbrah-node",
|
|
1324
|
+
gatewayWindowsTaskName: "ClawBrah Gateway",
|
|
1325
|
+
nodeWindowsTaskName: "ClawBrah Node",
|
|
1326
|
+
stateDir: ".clawbrah",
|
|
1327
|
+
configDir: ".clawbrah",
|
|
1328
|
+
workspaceDir: ".clawbrah/workspace",
|
|
1329
|
+
website: "https://clawbrah.com",
|
|
1330
|
+
docs: "https://docs.clawbrah.com",
|
|
1331
|
+
legacyNames: [
|
|
1332
|
+
"openclaw",
|
|
1333
|
+
"clawd",
|
|
1334
|
+
"moltbot"
|
|
1335
|
+
]
|
|
1336
|
+
};
|
|
1337
|
+
const { productName: productName$1, productNameLower: productNameLower$1, cliName: cliName$1, packageName: packageName$1, displayName: displayName$1, bundleIdPrefix: bundleIdPrefix$1, gatewayServiceName: gatewayServiceName$1, nodeServiceName: nodeServiceName$1, gatewayLaunchAgentLabel: gatewayLaunchAgentLabel$1, nodeLaunchAgentLabel: nodeLaunchAgentLabel$1, gatewaySystemdServiceName: gatewaySystemdServiceName$1, nodeSystemdServiceName: nodeSystemdServiceName$1, gatewayWindowsTaskName: gatewayWindowsTaskName$1, nodeWindowsTaskName: nodeWindowsTaskName$1, stateDir: stateDir$1, gatewayServiceMarker: gatewayServiceMarker$1, nodeServiceMarker: nodeServiceMarker$1 } = BRANDING$1;
|
|
1338
|
+
|
|
1339
|
+
//#endregion
|
|
1340
|
+
//#region src/branding/index.ts
|
|
1341
|
+
/**
|
|
1342
|
+
* Branding abstraction layer
|
|
1343
|
+
* Uses ClawBrah branding when available, falls back to OpenClaw for compatibility
|
|
1344
|
+
*/
|
|
1345
|
+
const IS_CLAWBRAH_FORK = process.env.CLAWBRAH_BRANDING === "true" || process.env.npm_package_name?.includes("clawbrah") || false;
|
|
1346
|
+
const BRANDING = IS_CLAWBRAH_FORK ? BRANDING$1 : {
|
|
1347
|
+
productName: "OpenClaw",
|
|
1348
|
+
productNameLower: "openclaw",
|
|
1349
|
+
productNameKebab: "openclaw",
|
|
1350
|
+
cliName: "openclaw",
|
|
1351
|
+
cliNameKebab: "openclaw",
|
|
1352
|
+
packageName: "openclaw",
|
|
1353
|
+
displayName: "OpenClaw",
|
|
1354
|
+
displayNameShort: "OpenClaw",
|
|
1355
|
+
bundleIdPrefix: "ai.openclaw",
|
|
1356
|
+
bundleIdMacos: "ai.openclaw.mac",
|
|
1357
|
+
bundleIdIos: "ai.openclaw.ios",
|
|
1358
|
+
bundleIdAndroid: "ai.openclaw.android",
|
|
1359
|
+
gatewayServiceName: "openclaw-gateway",
|
|
1360
|
+
nodeServiceName: "openclaw-node",
|
|
1361
|
+
gatewayServiceMarker: "openclaw",
|
|
1362
|
+
nodeServiceMarker: "openclaw",
|
|
1363
|
+
gatewayLaunchAgentLabel: "ai.openclaw.gateway",
|
|
1364
|
+
nodeLaunchAgentLabel: "ai.openclaw.node",
|
|
1365
|
+
gatewaySystemdServiceName: "openclaw-gateway",
|
|
1366
|
+
nodeSystemdServiceName: "openclaw-node",
|
|
1367
|
+
gatewayWindowsTaskName: "OpenClaw Gateway",
|
|
1368
|
+
nodeWindowsTaskName: "OpenClaw Node",
|
|
1369
|
+
stateDir: ".openclaw",
|
|
1370
|
+
configDir: ".openclaw",
|
|
1371
|
+
workspaceDir: ".openclaw/workspace",
|
|
1372
|
+
website: "https://openclaw.ai",
|
|
1373
|
+
docs: "https://docs.openclaw.ai",
|
|
1374
|
+
legacyNames: []
|
|
1375
|
+
};
|
|
1376
|
+
const { productName, productNameLower, cliName, packageName, displayName, bundleIdPrefix, gatewayServiceName, nodeServiceName, gatewayLaunchAgentLabel, nodeLaunchAgentLabel, gatewaySystemdServiceName, nodeSystemdServiceName, gatewayWindowsTaskName, nodeWindowsTaskName, stateDir, gatewayServiceMarker, nodeServiceMarker } = BRANDING;
|
|
1377
|
+
|
|
1378
|
+
//#endregion
|
|
1379
|
+
//#region src/cli/cli-name.ts
|
|
1380
|
+
const DEFAULT_CLI_NAME = cliName;
|
|
1381
|
+
const KNOWN_CLI_NAMES = new Set([cliName, "openclaw"]);
|
|
1382
|
+
const CLI_PREFIX_RE$1 = /^(?:((?:pnpm|npm|bunx|npx)\s+))?(clawbrah|openclaw)\b/;
|
|
1383
|
+
function resolveCliName(argv = process.argv) {
|
|
1384
|
+
const argv1 = argv[1];
|
|
1385
|
+
if (!argv1) return DEFAULT_CLI_NAME;
|
|
1386
|
+
const base = path.basename(argv1).trim();
|
|
1387
|
+
if (KNOWN_CLI_NAMES.has(base)) return base;
|
|
1388
|
+
return DEFAULT_CLI_NAME;
|
|
1389
|
+
}
|
|
1390
|
+
function replaceCliName(command, cliName = resolveCliName()) {
|
|
1391
|
+
if (!command.trim()) return command;
|
|
1392
|
+
if (!CLI_PREFIX_RE$1.test(command)) return command;
|
|
1393
|
+
return command.replace(CLI_PREFIX_RE$1, (_match, runner) => {
|
|
1394
|
+
return `${runner ?? ""}${cliName}`;
|
|
1395
|
+
});
|
|
1396
|
+
}
|
|
1397
|
+
|
|
1398
|
+
//#endregion
|
|
1399
|
+
//#region src/cli/profile-utils.ts
|
|
1400
|
+
const PROFILE_NAME_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/i;
|
|
1401
|
+
function isValidProfileName(value) {
|
|
1402
|
+
if (!value) return false;
|
|
1403
|
+
return PROFILE_NAME_RE.test(value);
|
|
1404
|
+
}
|
|
1405
|
+
function normalizeProfileName(raw) {
|
|
1406
|
+
const profile = raw?.trim();
|
|
1407
|
+
if (!profile) return null;
|
|
1408
|
+
if (profile.toLowerCase() === "default") return null;
|
|
1409
|
+
if (!isValidProfileName(profile)) return null;
|
|
1410
|
+
return profile;
|
|
1411
|
+
}
|
|
1412
|
+
|
|
1413
|
+
//#endregion
|
|
1414
|
+
//#region src/cli/command-format.ts
|
|
1415
|
+
const CLI_PREFIX_RE = /^(?:pnpm|npm|bunx|npx)\s+openclaw\b|^openclaw\b/;
|
|
1416
|
+
const PROFILE_FLAG_RE = /(?:^|\s)--profile(?:\s|=|$)/;
|
|
1417
|
+
const DEV_FLAG_RE = /(?:^|\s)--dev(?:\s|$)/;
|
|
1418
|
+
function formatCliCommand(command, env = process.env) {
|
|
1419
|
+
const normalizedCommand = replaceCliName(command, resolveCliName());
|
|
1420
|
+
const profile = normalizeProfileName(env.OPENCLAW_PROFILE);
|
|
1421
|
+
if (!profile) return normalizedCommand;
|
|
1422
|
+
if (!CLI_PREFIX_RE.test(normalizedCommand)) return normalizedCommand;
|
|
1423
|
+
if (PROFILE_FLAG_RE.test(normalizedCommand) || DEV_FLAG_RE.test(normalizedCommand)) return normalizedCommand;
|
|
1424
|
+
return normalizedCommand.replace(CLI_PREFIX_RE, (match) => `${match} --profile ${profile}`);
|
|
1425
|
+
}
|
|
1426
|
+
|
|
1427
|
+
//#endregion
|
|
1428
|
+
//#region src/infra/shell-env.ts
|
|
1429
|
+
const DEFAULT_TIMEOUT_MS = 15e3;
|
|
1430
|
+
const DEFAULT_MAX_BUFFER_BYTES = 2 * 1024 * 1024;
|
|
1431
|
+
let lastAppliedKeys = [];
|
|
1432
|
+
let cachedShellPath;
|
|
1433
|
+
function resolveShell(env) {
|
|
1434
|
+
const shell = env.SHELL?.trim();
|
|
1435
|
+
return shell && shell.length > 0 ? shell : "/bin/sh";
|
|
1436
|
+
}
|
|
1437
|
+
function parseShellEnv(stdout) {
|
|
1438
|
+
const shellEnv = /* @__PURE__ */ new Map();
|
|
1439
|
+
const parts = stdout.toString("utf8").split("\0");
|
|
1440
|
+
for (const part of parts) {
|
|
1441
|
+
if (!part) continue;
|
|
1442
|
+
const eq = part.indexOf("=");
|
|
1443
|
+
if (eq <= 0) continue;
|
|
1444
|
+
const key = part.slice(0, eq);
|
|
1445
|
+
const value = part.slice(eq + 1);
|
|
1446
|
+
if (!key) continue;
|
|
1447
|
+
shellEnv.set(key, value);
|
|
1448
|
+
}
|
|
1449
|
+
return shellEnv;
|
|
1450
|
+
}
|
|
1451
|
+
function loadShellEnvFallback(opts) {
|
|
1452
|
+
const logger = opts.logger ?? console;
|
|
1453
|
+
const exec = opts.exec ?? execFileSync;
|
|
1454
|
+
if (!opts.enabled) {
|
|
1455
|
+
lastAppliedKeys = [];
|
|
1456
|
+
return {
|
|
1457
|
+
ok: true,
|
|
1458
|
+
applied: [],
|
|
1459
|
+
skippedReason: "disabled"
|
|
1460
|
+
};
|
|
1461
|
+
}
|
|
1462
|
+
if (opts.expectedKeys.some((key) => Boolean(opts.env[key]?.trim()))) {
|
|
1463
|
+
lastAppliedKeys = [];
|
|
1464
|
+
return {
|
|
1465
|
+
ok: true,
|
|
1466
|
+
applied: [],
|
|
1467
|
+
skippedReason: "already-has-keys"
|
|
1468
|
+
};
|
|
1469
|
+
}
|
|
1470
|
+
const timeoutMs = typeof opts.timeoutMs === "number" && Number.isFinite(opts.timeoutMs) ? Math.max(0, opts.timeoutMs) : DEFAULT_TIMEOUT_MS;
|
|
1471
|
+
const shell = resolveShell(opts.env);
|
|
1472
|
+
let stdout;
|
|
1473
|
+
try {
|
|
1474
|
+
stdout = exec(shell, [
|
|
1475
|
+
"-l",
|
|
1476
|
+
"-c",
|
|
1477
|
+
"env -0"
|
|
1478
|
+
], {
|
|
1479
|
+
encoding: "buffer",
|
|
1480
|
+
timeout: timeoutMs,
|
|
1481
|
+
maxBuffer: DEFAULT_MAX_BUFFER_BYTES,
|
|
1482
|
+
env: opts.env,
|
|
1483
|
+
stdio: [
|
|
1484
|
+
"ignore",
|
|
1485
|
+
"pipe",
|
|
1486
|
+
"pipe"
|
|
1487
|
+
]
|
|
1488
|
+
});
|
|
1489
|
+
} catch (err) {
|
|
1490
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
1491
|
+
logger.warn(`[openclaw] shell env fallback failed: ${msg}`);
|
|
1492
|
+
lastAppliedKeys = [];
|
|
1493
|
+
return {
|
|
1494
|
+
ok: false,
|
|
1495
|
+
error: msg,
|
|
1496
|
+
applied: []
|
|
1497
|
+
};
|
|
1498
|
+
}
|
|
1499
|
+
const shellEnv = parseShellEnv(stdout);
|
|
1500
|
+
const applied = [];
|
|
1501
|
+
for (const key of opts.expectedKeys) {
|
|
1502
|
+
if (opts.env[key]?.trim()) continue;
|
|
1503
|
+
const value = shellEnv.get(key);
|
|
1504
|
+
if (!value?.trim()) continue;
|
|
1505
|
+
opts.env[key] = value;
|
|
1506
|
+
applied.push(key);
|
|
1507
|
+
}
|
|
1508
|
+
lastAppliedKeys = applied;
|
|
1509
|
+
return {
|
|
1510
|
+
ok: true,
|
|
1511
|
+
applied
|
|
1512
|
+
};
|
|
1513
|
+
}
|
|
1514
|
+
function shouldEnableShellEnvFallback(env) {
|
|
1515
|
+
return isTruthyEnvValue(env.OPENCLAW_LOAD_SHELL_ENV);
|
|
1516
|
+
}
|
|
1517
|
+
function shouldDeferShellEnvFallback(env) {
|
|
1518
|
+
return isTruthyEnvValue(env.OPENCLAW_DEFER_SHELL_ENV_FALLBACK);
|
|
1519
|
+
}
|
|
1520
|
+
function resolveShellEnvFallbackTimeoutMs(env) {
|
|
1521
|
+
const raw = env.OPENCLAW_SHELL_ENV_TIMEOUT_MS?.trim();
|
|
1522
|
+
if (!raw) return DEFAULT_TIMEOUT_MS;
|
|
1523
|
+
const parsed = Number.parseInt(raw, 10);
|
|
1524
|
+
if (!Number.isFinite(parsed)) return DEFAULT_TIMEOUT_MS;
|
|
1525
|
+
return Math.max(0, parsed);
|
|
1526
|
+
}
|
|
1527
|
+
function getShellPathFromLoginShell(opts) {
|
|
1528
|
+
if (cachedShellPath !== void 0) return cachedShellPath;
|
|
1529
|
+
if (process.platform === "win32") {
|
|
1530
|
+
cachedShellPath = null;
|
|
1531
|
+
return cachedShellPath;
|
|
1532
|
+
}
|
|
1533
|
+
const exec = opts.exec ?? execFileSync;
|
|
1534
|
+
const timeoutMs = typeof opts.timeoutMs === "number" && Number.isFinite(opts.timeoutMs) ? Math.max(0, opts.timeoutMs) : DEFAULT_TIMEOUT_MS;
|
|
1535
|
+
const shell = resolveShell(opts.env);
|
|
1536
|
+
let stdout;
|
|
1537
|
+
try {
|
|
1538
|
+
stdout = exec(shell, [
|
|
1539
|
+
"-l",
|
|
1540
|
+
"-c",
|
|
1541
|
+
"env -0"
|
|
1542
|
+
], {
|
|
1543
|
+
encoding: "buffer",
|
|
1544
|
+
timeout: timeoutMs,
|
|
1545
|
+
maxBuffer: DEFAULT_MAX_BUFFER_BYTES,
|
|
1546
|
+
env: opts.env,
|
|
1547
|
+
stdio: [
|
|
1548
|
+
"ignore",
|
|
1549
|
+
"pipe",
|
|
1550
|
+
"pipe"
|
|
1551
|
+
]
|
|
1552
|
+
});
|
|
1553
|
+
} catch {
|
|
1554
|
+
cachedShellPath = null;
|
|
1555
|
+
return cachedShellPath;
|
|
1556
|
+
}
|
|
1557
|
+
const shellPath = parseShellEnv(stdout).get("PATH")?.trim();
|
|
1558
|
+
cachedShellPath = shellPath && shellPath.length > 0 ? shellPath : null;
|
|
1559
|
+
return cachedShellPath;
|
|
1560
|
+
}
|
|
1561
|
+
function getShellEnvAppliedKeys() {
|
|
1562
|
+
return [...lastAppliedKeys];
|
|
1563
|
+
}
|
|
1564
|
+
|
|
1565
|
+
//#endregion
|
|
1566
|
+
//#region src/agents/defaults.ts
|
|
1567
|
+
const DEFAULT_CONTEXT_TOKENS = 2e5;
|
|
1568
|
+
|
|
1569
|
+
//#endregion
|
|
1570
|
+
//#region src/infra/json-file.ts
|
|
1571
|
+
function loadJsonFile(pathname) {
|
|
1572
|
+
try {
|
|
1573
|
+
if (!fs.existsSync(pathname)) return;
|
|
1574
|
+
const raw = fs.readFileSync(pathname, "utf8");
|
|
1575
|
+
return JSON.parse(raw);
|
|
1576
|
+
} catch {
|
|
1577
|
+
return;
|
|
1578
|
+
}
|
|
1579
|
+
}
|
|
1580
|
+
function saveJsonFile(pathname, data) {
|
|
1581
|
+
const dir = path.dirname(pathname);
|
|
1582
|
+
if (!fs.existsSync(dir)) fs.mkdirSync(dir, {
|
|
1583
|
+
recursive: true,
|
|
1584
|
+
mode: 448
|
|
1585
|
+
});
|
|
1586
|
+
fs.writeFileSync(pathname, `${JSON.stringify(data, null, 2)}\n`, "utf8");
|
|
1587
|
+
fs.chmodSync(pathname, 384);
|
|
1588
|
+
}
|
|
1589
|
+
|
|
1590
|
+
//#endregion
|
|
1591
|
+
//#region src/providers/github-copilot-token.ts
|
|
1592
|
+
const COPILOT_TOKEN_URL = "https://api.github.com/copilot_internal/v2/token";
|
|
1593
|
+
function resolveCopilotTokenCachePath(env = process.env) {
|
|
1594
|
+
return path.join(resolveStateDir(env), "credentials", "github-copilot.token.json");
|
|
1595
|
+
}
|
|
1596
|
+
function isTokenUsable(cache, now = Date.now()) {
|
|
1597
|
+
return cache.expiresAt - now > 300 * 1e3;
|
|
1598
|
+
}
|
|
1599
|
+
function parseCopilotTokenResponse(value) {
|
|
1600
|
+
if (!value || typeof value !== "object") throw new Error("Unexpected response from GitHub Copilot token endpoint");
|
|
1601
|
+
const asRecord = value;
|
|
1602
|
+
const token = asRecord.token;
|
|
1603
|
+
const expiresAt = asRecord.expires_at;
|
|
1604
|
+
if (typeof token !== "string" || token.trim().length === 0) throw new Error("Copilot token response missing token");
|
|
1605
|
+
let expiresAtMs;
|
|
1606
|
+
if (typeof expiresAt === "number" && Number.isFinite(expiresAt)) expiresAtMs = expiresAt > 1e10 ? expiresAt : expiresAt * 1e3;
|
|
1607
|
+
else if (typeof expiresAt === "string" && expiresAt.trim().length > 0) {
|
|
1608
|
+
const parsed = Number.parseInt(expiresAt, 10);
|
|
1609
|
+
if (!Number.isFinite(parsed)) throw new Error("Copilot token response has invalid expires_at");
|
|
1610
|
+
expiresAtMs = parsed > 1e10 ? parsed : parsed * 1e3;
|
|
1611
|
+
} else throw new Error("Copilot token response missing expires_at");
|
|
1612
|
+
return {
|
|
1613
|
+
token,
|
|
1614
|
+
expiresAt: expiresAtMs
|
|
1615
|
+
};
|
|
1616
|
+
}
|
|
1617
|
+
const DEFAULT_COPILOT_API_BASE_URL = "https://api.individual.githubcopilot.com";
|
|
1618
|
+
function deriveCopilotApiBaseUrlFromToken(token) {
|
|
1619
|
+
const trimmed = token.trim();
|
|
1620
|
+
if (!trimmed) return null;
|
|
1621
|
+
const proxyEp = trimmed.match(/(?:^|;)\s*proxy-ep=([^;\s]+)/i)?.[1]?.trim();
|
|
1622
|
+
if (!proxyEp) return null;
|
|
1623
|
+
const host = proxyEp.replace(/^https?:\/\//, "").replace(/^proxy\./i, "api.");
|
|
1624
|
+
if (!host) return null;
|
|
1625
|
+
return `https://${host}`;
|
|
1626
|
+
}
|
|
1627
|
+
async function resolveCopilotApiToken(params) {
|
|
1628
|
+
const cachePath = resolveCopilotTokenCachePath(params.env ?? process.env);
|
|
1629
|
+
const cached = loadJsonFile(cachePath);
|
|
1630
|
+
if (cached && typeof cached.token === "string" && typeof cached.expiresAt === "number") {
|
|
1631
|
+
if (isTokenUsable(cached)) return {
|
|
1632
|
+
token: cached.token,
|
|
1633
|
+
expiresAt: cached.expiresAt,
|
|
1634
|
+
source: `cache:${cachePath}`,
|
|
1635
|
+
baseUrl: deriveCopilotApiBaseUrlFromToken(cached.token) ?? DEFAULT_COPILOT_API_BASE_URL
|
|
1636
|
+
};
|
|
1637
|
+
}
|
|
1638
|
+
const res = await (params.fetchImpl ?? fetch)(COPILOT_TOKEN_URL, {
|
|
1639
|
+
method: "GET",
|
|
1640
|
+
headers: {
|
|
1641
|
+
Accept: "application/json",
|
|
1642
|
+
Authorization: `Bearer ${params.githubToken}`
|
|
1643
|
+
}
|
|
1644
|
+
});
|
|
1645
|
+
if (!res.ok) throw new Error(`Copilot token exchange failed: HTTP ${res.status}`);
|
|
1646
|
+
const json = parseCopilotTokenResponse(await res.json());
|
|
1647
|
+
const payload = {
|
|
1648
|
+
token: json.token,
|
|
1649
|
+
expiresAt: json.expiresAt,
|
|
1650
|
+
updatedAt: Date.now()
|
|
1651
|
+
};
|
|
1652
|
+
saveJsonFile(cachePath, payload);
|
|
1653
|
+
return {
|
|
1654
|
+
token: payload.token,
|
|
1655
|
+
expiresAt: payload.expiresAt,
|
|
1656
|
+
source: `fetched:${COPILOT_TOKEN_URL}`,
|
|
1657
|
+
baseUrl: deriveCopilotApiBaseUrlFromToken(payload.token) ?? DEFAULT_COPILOT_API_BASE_URL
|
|
1658
|
+
};
|
|
1659
|
+
}
|
|
1660
|
+
|
|
1661
|
+
//#endregion
|
|
1662
|
+
//#region src/agents/auth-profiles/constants.ts
|
|
1663
|
+
const AUTH_STORE_VERSION = 1;
|
|
1664
|
+
const AUTH_PROFILE_FILENAME = "auth-profiles.json";
|
|
1665
|
+
const LEGACY_AUTH_FILENAME = "auth.json";
|
|
1666
|
+
const QWEN_CLI_PROFILE_ID = "qwen-portal:qwen-cli";
|
|
1667
|
+
const MINIMAX_CLI_PROFILE_ID = "minimax-portal:minimax-cli";
|
|
1668
|
+
const EXTERNAL_CLI_SYNC_TTL_MS = 900 * 1e3;
|
|
1669
|
+
const EXTERNAL_CLI_NEAR_EXPIRY_MS = 600 * 1e3;
|
|
1670
|
+
const log$1 = createSubsystemLogger("agents/auth-profiles");
|
|
1671
|
+
|
|
1672
|
+
//#endregion
|
|
1673
|
+
//#region src/agents/cli-credentials.ts
|
|
1674
|
+
const log = createSubsystemLogger("agents/auth-profiles");
|
|
1675
|
+
const QWEN_CLI_CREDENTIALS_RELATIVE_PATH = ".qwen/oauth_creds.json";
|
|
1676
|
+
const MINIMAX_CLI_CREDENTIALS_RELATIVE_PATH = ".minimax/oauth_creds.json";
|
|
1677
|
+
let qwenCliCache = null;
|
|
1678
|
+
let minimaxCliCache = null;
|
|
1679
|
+
function resolveQwenCliCredentialsPath(homeDir) {
|
|
1680
|
+
const baseDir = homeDir ?? resolveUserPath("~");
|
|
1681
|
+
return path.join(baseDir, QWEN_CLI_CREDENTIALS_RELATIVE_PATH);
|
|
1682
|
+
}
|
|
1683
|
+
function resolveMiniMaxCliCredentialsPath(homeDir) {
|
|
1684
|
+
const baseDir = homeDir ?? resolveUserPath("~");
|
|
1685
|
+
return path.join(baseDir, MINIMAX_CLI_CREDENTIALS_RELATIVE_PATH);
|
|
1686
|
+
}
|
|
1687
|
+
function readQwenCliCredentials(options) {
|
|
1688
|
+
const raw = loadJsonFile(resolveQwenCliCredentialsPath(options?.homeDir));
|
|
1689
|
+
if (!raw || typeof raw !== "object") return null;
|
|
1690
|
+
const data = raw;
|
|
1691
|
+
const accessToken = data.access_token;
|
|
1692
|
+
const refreshToken = data.refresh_token;
|
|
1693
|
+
const expiresAt = data.expiry_date;
|
|
1694
|
+
if (typeof accessToken !== "string" || !accessToken) return null;
|
|
1695
|
+
if (typeof refreshToken !== "string" || !refreshToken) return null;
|
|
1696
|
+
if (typeof expiresAt !== "number" || !Number.isFinite(expiresAt)) return null;
|
|
1697
|
+
return {
|
|
1698
|
+
type: "oauth",
|
|
1699
|
+
provider: "qwen-portal",
|
|
1700
|
+
access: accessToken,
|
|
1701
|
+
refresh: refreshToken,
|
|
1702
|
+
expires: expiresAt
|
|
1703
|
+
};
|
|
1704
|
+
}
|
|
1705
|
+
function readMiniMaxCliCredentials(options) {
|
|
1706
|
+
const raw = loadJsonFile(resolveMiniMaxCliCredentialsPath(options?.homeDir));
|
|
1707
|
+
if (!raw || typeof raw !== "object") return null;
|
|
1708
|
+
const data = raw;
|
|
1709
|
+
const accessToken = data.access_token;
|
|
1710
|
+
const refreshToken = data.refresh_token;
|
|
1711
|
+
const expiresAt = data.expiry_date;
|
|
1712
|
+
if (typeof accessToken !== "string" || !accessToken) return null;
|
|
1713
|
+
if (typeof refreshToken !== "string" || !refreshToken) return null;
|
|
1714
|
+
if (typeof expiresAt !== "number" || !Number.isFinite(expiresAt)) return null;
|
|
1715
|
+
return {
|
|
1716
|
+
type: "oauth",
|
|
1717
|
+
provider: "minimax-portal",
|
|
1718
|
+
access: accessToken,
|
|
1719
|
+
refresh: refreshToken,
|
|
1720
|
+
expires: expiresAt
|
|
1721
|
+
};
|
|
1722
|
+
}
|
|
1723
|
+
function readQwenCliCredentialsCached(options) {
|
|
1724
|
+
const ttlMs = options?.ttlMs ?? 0;
|
|
1725
|
+
const now = Date.now();
|
|
1726
|
+
const cacheKey = resolveQwenCliCredentialsPath(options?.homeDir);
|
|
1727
|
+
if (ttlMs > 0 && qwenCliCache && qwenCliCache.cacheKey === cacheKey && now - qwenCliCache.readAt < ttlMs) return qwenCliCache.value;
|
|
1728
|
+
const value = readQwenCliCredentials({ homeDir: options?.homeDir });
|
|
1729
|
+
if (ttlMs > 0) qwenCliCache = {
|
|
1730
|
+
value,
|
|
1731
|
+
readAt: now,
|
|
1732
|
+
cacheKey
|
|
1733
|
+
};
|
|
1734
|
+
return value;
|
|
1735
|
+
}
|
|
1736
|
+
function readMiniMaxCliCredentialsCached(options) {
|
|
1737
|
+
const ttlMs = options?.ttlMs ?? 0;
|
|
1738
|
+
const now = Date.now();
|
|
1739
|
+
const cacheKey = resolveMiniMaxCliCredentialsPath(options?.homeDir);
|
|
1740
|
+
if (ttlMs > 0 && minimaxCliCache && minimaxCliCache.cacheKey === cacheKey && now - minimaxCliCache.readAt < ttlMs) return minimaxCliCache.value;
|
|
1741
|
+
const value = readMiniMaxCliCredentials({ homeDir: options?.homeDir });
|
|
1742
|
+
if (ttlMs > 0) minimaxCliCache = {
|
|
1743
|
+
value,
|
|
1744
|
+
readAt: now,
|
|
1745
|
+
cacheKey
|
|
1746
|
+
};
|
|
1747
|
+
return value;
|
|
1748
|
+
}
|
|
1749
|
+
|
|
1750
|
+
//#endregion
|
|
1751
|
+
//#region src/agents/auth-profiles/external-cli-sync.ts
|
|
1752
|
+
function shallowEqualOAuthCredentials(a, b) {
|
|
1753
|
+
if (!a) return false;
|
|
1754
|
+
if (a.type !== "oauth") return false;
|
|
1755
|
+
return a.provider === b.provider && a.access === b.access && a.refresh === b.refresh && a.expires === b.expires && a.email === b.email && a.enterpriseUrl === b.enterpriseUrl && a.projectId === b.projectId && a.accountId === b.accountId;
|
|
1756
|
+
}
|
|
1757
|
+
function isExternalProfileFresh(cred, now) {
|
|
1758
|
+
if (!cred) return false;
|
|
1759
|
+
if (cred.type !== "oauth" && cred.type !== "token") return false;
|
|
1760
|
+
if (cred.provider !== "qwen-portal" && cred.provider !== "minimax-portal") return false;
|
|
1761
|
+
if (typeof cred.expires !== "number") return true;
|
|
1762
|
+
return cred.expires > now + EXTERNAL_CLI_NEAR_EXPIRY_MS;
|
|
1763
|
+
}
|
|
1764
|
+
/** Sync external CLI credentials into the store for a given provider. */
|
|
1765
|
+
function syncExternalCliCredentialsForProvider(store, profileId, provider, readCredentials, now) {
|
|
1766
|
+
const existing = store.profiles[profileId];
|
|
1767
|
+
const creds = !existing || existing.provider !== provider || !isExternalProfileFresh(existing, now) ? readCredentials() : null;
|
|
1768
|
+
if (!creds) return false;
|
|
1769
|
+
const existingOAuth = existing?.type === "oauth" ? existing : void 0;
|
|
1770
|
+
if ((!existingOAuth || existingOAuth.provider !== provider || existingOAuth.expires <= now || creds.expires > existingOAuth.expires) && !shallowEqualOAuthCredentials(existingOAuth, creds)) {
|
|
1771
|
+
store.profiles[profileId] = creds;
|
|
1772
|
+
log$1.info(`synced ${provider} credentials from external cli`, {
|
|
1773
|
+
profileId,
|
|
1774
|
+
expires: new Date(creds.expires).toISOString()
|
|
1775
|
+
});
|
|
1776
|
+
return true;
|
|
1777
|
+
}
|
|
1778
|
+
return false;
|
|
1779
|
+
}
|
|
1780
|
+
/**
|
|
1781
|
+
* Sync OAuth credentials from external CLI tools (Qwen Code CLI, MiniMax CLI) into the store.
|
|
1782
|
+
*
|
|
1783
|
+
* Returns true if any credentials were updated.
|
|
1784
|
+
*/
|
|
1785
|
+
function syncExternalCliCredentials(store) {
|
|
1786
|
+
let mutated = false;
|
|
1787
|
+
const now = Date.now();
|
|
1788
|
+
const existingQwen = store.profiles[QWEN_CLI_PROFILE_ID];
|
|
1789
|
+
const qwenCreds = !existingQwen || existingQwen.provider !== "qwen-portal" || !isExternalProfileFresh(existingQwen, now) ? readQwenCliCredentialsCached({ ttlMs: EXTERNAL_CLI_SYNC_TTL_MS }) : null;
|
|
1790
|
+
if (qwenCreds) {
|
|
1791
|
+
const existing = store.profiles[QWEN_CLI_PROFILE_ID];
|
|
1792
|
+
const existingOAuth = existing?.type === "oauth" ? existing : void 0;
|
|
1793
|
+
if ((!existingOAuth || existingOAuth.provider !== "qwen-portal" || existingOAuth.expires <= now || qwenCreds.expires > existingOAuth.expires) && !shallowEqualOAuthCredentials(existingOAuth, qwenCreds)) {
|
|
1794
|
+
store.profiles[QWEN_CLI_PROFILE_ID] = qwenCreds;
|
|
1795
|
+
mutated = true;
|
|
1796
|
+
log$1.info("synced qwen credentials from qwen cli", {
|
|
1797
|
+
profileId: QWEN_CLI_PROFILE_ID,
|
|
1798
|
+
expires: new Date(qwenCreds.expires).toISOString()
|
|
1799
|
+
});
|
|
1800
|
+
}
|
|
1801
|
+
}
|
|
1802
|
+
if (syncExternalCliCredentialsForProvider(store, MINIMAX_CLI_PROFILE_ID, "minimax-portal", () => readMiniMaxCliCredentialsCached({ ttlMs: EXTERNAL_CLI_SYNC_TTL_MS }), now)) mutated = true;
|
|
1803
|
+
return mutated;
|
|
1804
|
+
}
|
|
1805
|
+
|
|
1806
|
+
//#endregion
|
|
1807
|
+
//#region src/agents/agent-paths.ts
|
|
1808
|
+
function resolveOpenClawAgentDir() {
|
|
1809
|
+
const override = process.env.OPENCLAW_AGENT_DIR?.trim() || process.env.PI_CODING_AGENT_DIR?.trim();
|
|
1810
|
+
if (override) return resolveUserPath(override);
|
|
1811
|
+
return resolveUserPath(path.join(resolveStateDir(), "agents", DEFAULT_AGENT_ID, "agent"));
|
|
1812
|
+
}
|
|
1813
|
+
|
|
1814
|
+
//#endregion
|
|
1815
|
+
//#region src/agents/auth-profiles/paths.ts
|
|
1816
|
+
function resolveAuthStorePath(agentDir) {
|
|
1817
|
+
const resolved = resolveUserPath(agentDir ?? resolveOpenClawAgentDir());
|
|
1818
|
+
return path.join(resolved, AUTH_PROFILE_FILENAME);
|
|
1819
|
+
}
|
|
1820
|
+
function resolveLegacyAuthStorePath(agentDir) {
|
|
1821
|
+
const resolved = resolveUserPath(agentDir ?? resolveOpenClawAgentDir());
|
|
1822
|
+
return path.join(resolved, LEGACY_AUTH_FILENAME);
|
|
1823
|
+
}
|
|
1824
|
+
|
|
1825
|
+
//#endregion
|
|
1826
|
+
//#region src/agents/auth-profiles/store.ts
|
|
1827
|
+
function coerceLegacyStore(raw) {
|
|
1828
|
+
if (!raw || typeof raw !== "object") return null;
|
|
1829
|
+
const record = raw;
|
|
1830
|
+
if ("profiles" in record) return null;
|
|
1831
|
+
const entries = {};
|
|
1832
|
+
for (const [key, value] of Object.entries(record)) {
|
|
1833
|
+
if (!value || typeof value !== "object") continue;
|
|
1834
|
+
const typed = value;
|
|
1835
|
+
if (typed.type !== "api_key" && typed.type !== "oauth" && typed.type !== "token") continue;
|
|
1836
|
+
entries[key] = {
|
|
1837
|
+
...typed,
|
|
1838
|
+
provider: String(typed.provider ?? key)
|
|
1839
|
+
};
|
|
1840
|
+
}
|
|
1841
|
+
return Object.keys(entries).length > 0 ? entries : null;
|
|
1842
|
+
}
|
|
1843
|
+
function coerceAuthStore(raw) {
|
|
1844
|
+
if (!raw || typeof raw !== "object") return null;
|
|
1845
|
+
const record = raw;
|
|
1846
|
+
if (!record.profiles || typeof record.profiles !== "object") return null;
|
|
1847
|
+
const profiles = record.profiles;
|
|
1848
|
+
const normalized = {};
|
|
1849
|
+
for (const [key, value] of Object.entries(profiles)) {
|
|
1850
|
+
if (!value || typeof value !== "object") continue;
|
|
1851
|
+
const typed = value;
|
|
1852
|
+
if (typed.type !== "api_key" && typed.type !== "oauth" && typed.type !== "token") continue;
|
|
1853
|
+
if (!typed.provider) continue;
|
|
1854
|
+
normalized[key] = typed;
|
|
1855
|
+
}
|
|
1856
|
+
const order = record.order && typeof record.order === "object" ? Object.entries(record.order).reduce((acc, [provider, value]) => {
|
|
1857
|
+
if (!Array.isArray(value)) return acc;
|
|
1858
|
+
const list = value.map((entry) => typeof entry === "string" ? entry.trim() : "").filter(Boolean);
|
|
1859
|
+
if (list.length === 0) return acc;
|
|
1860
|
+
acc[provider] = list;
|
|
1861
|
+
return acc;
|
|
1862
|
+
}, {}) : void 0;
|
|
1863
|
+
return {
|
|
1864
|
+
version: Number(record.version ?? AUTH_STORE_VERSION),
|
|
1865
|
+
profiles: normalized,
|
|
1866
|
+
order,
|
|
1867
|
+
lastGood: record.lastGood && typeof record.lastGood === "object" ? record.lastGood : void 0,
|
|
1868
|
+
usageStats: record.usageStats && typeof record.usageStats === "object" ? record.usageStats : void 0
|
|
1869
|
+
};
|
|
1870
|
+
}
|
|
1871
|
+
function mergeRecord(base, override) {
|
|
1872
|
+
if (!base && !override) return;
|
|
1873
|
+
if (!base) return { ...override };
|
|
1874
|
+
if (!override) return { ...base };
|
|
1875
|
+
return {
|
|
1876
|
+
...base,
|
|
1877
|
+
...override
|
|
1878
|
+
};
|
|
1879
|
+
}
|
|
1880
|
+
function mergeAuthProfileStores(base, override) {
|
|
1881
|
+
if (Object.keys(override.profiles).length === 0 && !override.order && !override.lastGood && !override.usageStats) return base;
|
|
1882
|
+
return {
|
|
1883
|
+
version: Math.max(base.version, override.version ?? base.version),
|
|
1884
|
+
profiles: {
|
|
1885
|
+
...base.profiles,
|
|
1886
|
+
...override.profiles
|
|
1887
|
+
},
|
|
1888
|
+
order: mergeRecord(base.order, override.order),
|
|
1889
|
+
lastGood: mergeRecord(base.lastGood, override.lastGood),
|
|
1890
|
+
usageStats: mergeRecord(base.usageStats, override.usageStats)
|
|
1891
|
+
};
|
|
1892
|
+
}
|
|
1893
|
+
function mergeOAuthFileIntoStore(store) {
|
|
1894
|
+
const oauthRaw = loadJsonFile(resolveOAuthPath());
|
|
1895
|
+
if (!oauthRaw || typeof oauthRaw !== "object") return false;
|
|
1896
|
+
const oauthEntries = oauthRaw;
|
|
1897
|
+
let mutated = false;
|
|
1898
|
+
for (const [provider, creds] of Object.entries(oauthEntries)) {
|
|
1899
|
+
if (!creds || typeof creds !== "object") continue;
|
|
1900
|
+
const profileId = `${provider}:default`;
|
|
1901
|
+
if (store.profiles[profileId]) continue;
|
|
1902
|
+
store.profiles[profileId] = {
|
|
1903
|
+
type: "oauth",
|
|
1904
|
+
provider,
|
|
1905
|
+
...creds
|
|
1906
|
+
};
|
|
1907
|
+
mutated = true;
|
|
1908
|
+
}
|
|
1909
|
+
return mutated;
|
|
1910
|
+
}
|
|
1911
|
+
function loadAuthProfileStoreForAgent(agentDir, _options) {
|
|
1912
|
+
const authPath = resolveAuthStorePath(agentDir);
|
|
1913
|
+
const asStore = coerceAuthStore(loadJsonFile(authPath));
|
|
1914
|
+
if (asStore) {
|
|
1915
|
+
if (syncExternalCliCredentials(asStore)) saveJsonFile(authPath, asStore);
|
|
1916
|
+
return asStore;
|
|
1917
|
+
}
|
|
1918
|
+
if (agentDir) {
|
|
1919
|
+
const mainStore = coerceAuthStore(loadJsonFile(resolveAuthStorePath()));
|
|
1920
|
+
if (mainStore && Object.keys(mainStore.profiles).length > 0) {
|
|
1921
|
+
saveJsonFile(authPath, mainStore);
|
|
1922
|
+
log$1.info("inherited auth-profiles from main agent", { agentDir });
|
|
1923
|
+
return mainStore;
|
|
1924
|
+
}
|
|
1925
|
+
}
|
|
1926
|
+
const legacy = coerceLegacyStore(loadJsonFile(resolveLegacyAuthStorePath(agentDir)));
|
|
1927
|
+
const store = {
|
|
1928
|
+
version: AUTH_STORE_VERSION,
|
|
1929
|
+
profiles: {}
|
|
1930
|
+
};
|
|
1931
|
+
if (legacy) for (const [provider, cred] of Object.entries(legacy)) {
|
|
1932
|
+
const profileId = `${provider}:default`;
|
|
1933
|
+
if (cred.type === "api_key") store.profiles[profileId] = {
|
|
1934
|
+
type: "api_key",
|
|
1935
|
+
provider: String(cred.provider ?? provider),
|
|
1936
|
+
key: cred.key,
|
|
1937
|
+
...cred.email ? { email: cred.email } : {}
|
|
1938
|
+
};
|
|
1939
|
+
else if (cred.type === "token") store.profiles[profileId] = {
|
|
1940
|
+
type: "token",
|
|
1941
|
+
provider: String(cred.provider ?? provider),
|
|
1942
|
+
token: cred.token,
|
|
1943
|
+
...typeof cred.expires === "number" ? { expires: cred.expires } : {},
|
|
1944
|
+
...cred.email ? { email: cred.email } : {}
|
|
1945
|
+
};
|
|
1946
|
+
else store.profiles[profileId] = {
|
|
1947
|
+
type: "oauth",
|
|
1948
|
+
provider: String(cred.provider ?? provider),
|
|
1949
|
+
access: cred.access,
|
|
1950
|
+
refresh: cred.refresh,
|
|
1951
|
+
expires: cred.expires,
|
|
1952
|
+
...cred.enterpriseUrl ? { enterpriseUrl: cred.enterpriseUrl } : {},
|
|
1953
|
+
...cred.projectId ? { projectId: cred.projectId } : {},
|
|
1954
|
+
...cred.accountId ? { accountId: cred.accountId } : {},
|
|
1955
|
+
...cred.email ? { email: cred.email } : {}
|
|
1956
|
+
};
|
|
1957
|
+
}
|
|
1958
|
+
const mergedOAuth = mergeOAuthFileIntoStore(store);
|
|
1959
|
+
const syncedCli = syncExternalCliCredentials(store);
|
|
1960
|
+
const shouldWrite = legacy !== null || mergedOAuth || syncedCli;
|
|
1961
|
+
if (shouldWrite) saveJsonFile(authPath, store);
|
|
1962
|
+
if (shouldWrite && legacy !== null) {
|
|
1963
|
+
const legacyPath = resolveLegacyAuthStorePath(agentDir);
|
|
1964
|
+
try {
|
|
1965
|
+
fs.unlinkSync(legacyPath);
|
|
1966
|
+
} catch (err) {
|
|
1967
|
+
if (err?.code !== "ENOENT") log$1.warn("failed to delete legacy auth.json after migration", {
|
|
1968
|
+
err,
|
|
1969
|
+
legacyPath
|
|
1970
|
+
});
|
|
1971
|
+
}
|
|
1972
|
+
}
|
|
1973
|
+
return store;
|
|
1974
|
+
}
|
|
1975
|
+
function ensureAuthProfileStore(agentDir, options) {
|
|
1976
|
+
const store = loadAuthProfileStoreForAgent(agentDir, options);
|
|
1977
|
+
const authPath = resolveAuthStorePath(agentDir);
|
|
1978
|
+
const mainAuthPath = resolveAuthStorePath();
|
|
1979
|
+
if (!agentDir || authPath === mainAuthPath) return store;
|
|
1980
|
+
return mergeAuthProfileStores(loadAuthProfileStoreForAgent(void 0, options), store);
|
|
1981
|
+
}
|
|
1982
|
+
|
|
1983
|
+
//#endregion
|
|
1984
|
+
//#region src/agents/auth-profiles/profiles.ts
|
|
1985
|
+
function listProfilesForProvider(store, provider) {
|
|
1986
|
+
const providerKey = normalizeProviderId(provider);
|
|
1987
|
+
return Object.entries(store.profiles).filter(([, cred]) => normalizeProviderId(cred.provider) === providerKey).map(([id]) => id);
|
|
1988
|
+
}
|
|
1989
|
+
|
|
1990
|
+
//#endregion
|
|
1991
|
+
//#region src/agents/chutes-oauth.ts
|
|
1992
|
+
const CHUTES_OAUTH_ISSUER = "https://api.chutes.ai";
|
|
1993
|
+
const CHUTES_AUTHORIZE_ENDPOINT = `${CHUTES_OAUTH_ISSUER}/idp/authorize`;
|
|
1994
|
+
const CHUTES_TOKEN_ENDPOINT = `${CHUTES_OAUTH_ISSUER}/idp/token`;
|
|
1995
|
+
const CHUTES_USERINFO_ENDPOINT = `${CHUTES_OAUTH_ISSUER}/idp/userinfo`;
|
|
1996
|
+
const DEFAULT_EXPIRES_BUFFER_MS = 300 * 1e3;
|
|
1997
|
+
|
|
1998
|
+
//#endregion
|
|
1999
|
+
//#region src/agents/auth-profiles/oauth.ts
|
|
2000
|
+
const OAUTH_PROVIDER_IDS = new Set(getOAuthProviders().map((provider) => provider.id));
|
|
2001
|
+
|
|
2002
|
+
//#endregion
|
|
2003
|
+
//#region src/agents/bedrock-discovery.ts
|
|
2004
|
+
const DEFAULT_REFRESH_INTERVAL_SECONDS = 3600;
|
|
2005
|
+
const DEFAULT_CONTEXT_WINDOW = 32e3;
|
|
2006
|
+
const DEFAULT_MAX_TOKENS = 4096;
|
|
2007
|
+
const DEFAULT_COST = {
|
|
2008
|
+
input: 0,
|
|
2009
|
+
output: 0,
|
|
2010
|
+
cacheRead: 0,
|
|
2011
|
+
cacheWrite: 0
|
|
2012
|
+
};
|
|
2013
|
+
const discoveryCache = /* @__PURE__ */ new Map();
|
|
2014
|
+
let hasLoggedBedrockError = false;
|
|
2015
|
+
function normalizeProviderFilter(filter) {
|
|
2016
|
+
if (!filter || filter.length === 0) return [];
|
|
2017
|
+
const normalized = new Set(filter.map((entry) => entry.trim().toLowerCase()).filter((entry) => entry.length > 0));
|
|
2018
|
+
return Array.from(normalized).toSorted();
|
|
2019
|
+
}
|
|
2020
|
+
function buildCacheKey(params) {
|
|
2021
|
+
return JSON.stringify(params);
|
|
2022
|
+
}
|
|
2023
|
+
function includesTextModalities(modalities) {
|
|
2024
|
+
return (modalities ?? []).some((entry) => entry.toLowerCase() === "text");
|
|
2025
|
+
}
|
|
2026
|
+
function isActive(summary) {
|
|
2027
|
+
const status = summary.modelLifecycle?.status;
|
|
2028
|
+
return typeof status === "string" ? status.toUpperCase() === "ACTIVE" : false;
|
|
2029
|
+
}
|
|
2030
|
+
function mapInputModalities(summary) {
|
|
2031
|
+
const inputs = summary.inputModalities ?? [];
|
|
2032
|
+
const mapped = /* @__PURE__ */ new Set();
|
|
2033
|
+
for (const modality of inputs) {
|
|
2034
|
+
const lower = modality.toLowerCase();
|
|
2035
|
+
if (lower === "text") mapped.add("text");
|
|
2036
|
+
if (lower === "image") mapped.add("image");
|
|
2037
|
+
}
|
|
2038
|
+
if (mapped.size === 0) mapped.add("text");
|
|
2039
|
+
return Array.from(mapped);
|
|
2040
|
+
}
|
|
2041
|
+
function inferReasoningSupport(summary) {
|
|
2042
|
+
const haystack = `${summary.modelId ?? ""} ${summary.modelName ?? ""}`.toLowerCase();
|
|
2043
|
+
return haystack.includes("reasoning") || haystack.includes("thinking");
|
|
2044
|
+
}
|
|
2045
|
+
function resolveDefaultContextWindow(config) {
|
|
2046
|
+
const value = Math.floor(config?.defaultContextWindow ?? DEFAULT_CONTEXT_WINDOW);
|
|
2047
|
+
return value > 0 ? value : DEFAULT_CONTEXT_WINDOW;
|
|
2048
|
+
}
|
|
2049
|
+
function resolveDefaultMaxTokens(config) {
|
|
2050
|
+
const value = Math.floor(config?.defaultMaxTokens ?? DEFAULT_MAX_TOKENS);
|
|
2051
|
+
return value > 0 ? value : DEFAULT_MAX_TOKENS;
|
|
2052
|
+
}
|
|
2053
|
+
function matchesProviderFilter(summary, filter) {
|
|
2054
|
+
if (filter.length === 0) return true;
|
|
2055
|
+
const normalized = (summary.providerName ?? (typeof summary.modelId === "string" ? summary.modelId.split(".")[0] : void 0))?.trim().toLowerCase();
|
|
2056
|
+
if (!normalized) return false;
|
|
2057
|
+
return filter.includes(normalized);
|
|
2058
|
+
}
|
|
2059
|
+
function shouldIncludeSummary(summary, filter) {
|
|
2060
|
+
if (!summary.modelId?.trim()) return false;
|
|
2061
|
+
if (!matchesProviderFilter(summary, filter)) return false;
|
|
2062
|
+
if (summary.responseStreamingSupported !== true) return false;
|
|
2063
|
+
if (!includesTextModalities(summary.outputModalities)) return false;
|
|
2064
|
+
if (!isActive(summary)) return false;
|
|
2065
|
+
return true;
|
|
2066
|
+
}
|
|
2067
|
+
function toModelDefinition(summary, defaults) {
|
|
2068
|
+
const id = summary.modelId?.trim() ?? "";
|
|
2069
|
+
return {
|
|
2070
|
+
id,
|
|
2071
|
+
name: summary.modelName?.trim() || id,
|
|
2072
|
+
reasoning: inferReasoningSupport(summary),
|
|
2073
|
+
input: mapInputModalities(summary),
|
|
2074
|
+
cost: DEFAULT_COST,
|
|
2075
|
+
contextWindow: defaults.contextWindow,
|
|
2076
|
+
maxTokens: defaults.maxTokens
|
|
2077
|
+
};
|
|
2078
|
+
}
|
|
2079
|
+
async function discoverBedrockModels(params) {
|
|
2080
|
+
const refreshIntervalSeconds = Math.max(0, Math.floor(params.config?.refreshInterval ?? DEFAULT_REFRESH_INTERVAL_SECONDS));
|
|
2081
|
+
const providerFilter = normalizeProviderFilter(params.config?.providerFilter);
|
|
2082
|
+
const defaultContextWindow = resolveDefaultContextWindow(params.config);
|
|
2083
|
+
const defaultMaxTokens = resolveDefaultMaxTokens(params.config);
|
|
2084
|
+
const cacheKey = buildCacheKey({
|
|
2085
|
+
region: params.region,
|
|
2086
|
+
providerFilter,
|
|
2087
|
+
refreshIntervalSeconds,
|
|
2088
|
+
defaultContextWindow,
|
|
2089
|
+
defaultMaxTokens
|
|
2090
|
+
});
|
|
2091
|
+
const now = params.now?.() ?? Date.now();
|
|
2092
|
+
if (refreshIntervalSeconds > 0) {
|
|
2093
|
+
const cached = discoveryCache.get(cacheKey);
|
|
2094
|
+
if (cached?.value && cached.expiresAt > now) return cached.value;
|
|
2095
|
+
if (cached?.inFlight) return cached.inFlight;
|
|
2096
|
+
}
|
|
2097
|
+
const client = (params.clientFactory ?? ((region) => new BedrockClient({ region })))(params.region);
|
|
2098
|
+
const discoveryPromise = (async () => {
|
|
2099
|
+
const response = await client.send(new ListFoundationModelsCommand({}));
|
|
2100
|
+
const discovered = [];
|
|
2101
|
+
for (const summary of response.modelSummaries ?? []) {
|
|
2102
|
+
if (!shouldIncludeSummary(summary, providerFilter)) continue;
|
|
2103
|
+
discovered.push(toModelDefinition(summary, {
|
|
2104
|
+
contextWindow: defaultContextWindow,
|
|
2105
|
+
maxTokens: defaultMaxTokens
|
|
2106
|
+
}));
|
|
2107
|
+
}
|
|
2108
|
+
return discovered.toSorted((a, b) => a.name.localeCompare(b.name));
|
|
2109
|
+
})();
|
|
2110
|
+
if (refreshIntervalSeconds > 0) discoveryCache.set(cacheKey, {
|
|
2111
|
+
expiresAt: now + refreshIntervalSeconds * 1e3,
|
|
2112
|
+
inFlight: discoveryPromise
|
|
2113
|
+
});
|
|
2114
|
+
try {
|
|
2115
|
+
const value = await discoveryPromise;
|
|
2116
|
+
if (refreshIntervalSeconds > 0) discoveryCache.set(cacheKey, {
|
|
2117
|
+
expiresAt: now + refreshIntervalSeconds * 1e3,
|
|
2118
|
+
value
|
|
2119
|
+
});
|
|
2120
|
+
return value;
|
|
2121
|
+
} catch (error) {
|
|
2122
|
+
if (refreshIntervalSeconds > 0) discoveryCache.delete(cacheKey);
|
|
2123
|
+
if (!hasLoggedBedrockError) {
|
|
2124
|
+
hasLoggedBedrockError = true;
|
|
2125
|
+
console.warn(`[bedrock-discovery] Failed to list models: ${String(error)}`);
|
|
2126
|
+
}
|
|
2127
|
+
return [];
|
|
2128
|
+
}
|
|
2129
|
+
}
|
|
2130
|
+
|
|
2131
|
+
//#endregion
|
|
2132
|
+
//#region src/agents/cloudflare-ai-gateway.ts
|
|
2133
|
+
const CLOUDFLARE_AI_GATEWAY_PROVIDER_ID = "cloudflare-ai-gateway";
|
|
2134
|
+
const CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_ID = "claude-sonnet-4-5";
|
|
2135
|
+
const CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF = `${CLOUDFLARE_AI_GATEWAY_PROVIDER_ID}/${CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_ID}`;
|
|
2136
|
+
const CLOUDFLARE_AI_GATEWAY_DEFAULT_CONTEXT_WINDOW = 2e5;
|
|
2137
|
+
const CLOUDFLARE_AI_GATEWAY_DEFAULT_MAX_TOKENS = 64e3;
|
|
2138
|
+
const CLOUDFLARE_AI_GATEWAY_DEFAULT_COST = {
|
|
2139
|
+
input: 3,
|
|
2140
|
+
output: 15,
|
|
2141
|
+
cacheRead: .3,
|
|
2142
|
+
cacheWrite: 3.75
|
|
2143
|
+
};
|
|
2144
|
+
function buildCloudflareAiGatewayModelDefinition(params) {
|
|
2145
|
+
return {
|
|
2146
|
+
id: params?.id?.trim() || CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_ID,
|
|
2147
|
+
name: params?.name ?? "Claude Sonnet 4.5",
|
|
2148
|
+
reasoning: params?.reasoning ?? true,
|
|
2149
|
+
input: params?.input ?? ["text", "image"],
|
|
2150
|
+
cost: CLOUDFLARE_AI_GATEWAY_DEFAULT_COST,
|
|
2151
|
+
contextWindow: CLOUDFLARE_AI_GATEWAY_DEFAULT_CONTEXT_WINDOW,
|
|
2152
|
+
maxTokens: CLOUDFLARE_AI_GATEWAY_DEFAULT_MAX_TOKENS
|
|
2153
|
+
};
|
|
2154
|
+
}
|
|
2155
|
+
function resolveCloudflareAiGatewayBaseUrl(params) {
|
|
2156
|
+
const accountId = params.accountId.trim();
|
|
2157
|
+
const gatewayId = params.gatewayId.trim();
|
|
2158
|
+
if (!accountId || !gatewayId) return "";
|
|
2159
|
+
return `https://gateway.ai.cloudflare.com/v1/${accountId}/${gatewayId}/anthropic`;
|
|
2160
|
+
}
|
|
2161
|
+
|
|
2162
|
+
//#endregion
|
|
2163
|
+
//#region src/agents/model-auth.ts
|
|
2164
|
+
const AWS_BEARER_ENV = "AWS_BEARER_TOKEN_BEDROCK";
|
|
2165
|
+
const AWS_ACCESS_KEY_ENV = "AWS_ACCESS_KEY_ID";
|
|
2166
|
+
const AWS_SECRET_KEY_ENV = "AWS_SECRET_ACCESS_KEY";
|
|
2167
|
+
const AWS_PROFILE_ENV = "AWS_PROFILE";
|
|
2168
|
+
function resolveAwsSdkEnvVarName(env = process.env) {
|
|
2169
|
+
if (env[AWS_BEARER_ENV]?.trim()) return AWS_BEARER_ENV;
|
|
2170
|
+
if (env[AWS_ACCESS_KEY_ENV]?.trim() && env[AWS_SECRET_KEY_ENV]?.trim()) return AWS_ACCESS_KEY_ENV;
|
|
2171
|
+
if (env[AWS_PROFILE_ENV]?.trim()) return AWS_PROFILE_ENV;
|
|
2172
|
+
}
|
|
2173
|
+
function resolveEnvApiKey(provider) {
|
|
2174
|
+
const normalized = normalizeProviderId(provider);
|
|
2175
|
+
const applied = new Set(getShellEnvAppliedKeys());
|
|
2176
|
+
const pick = (envVar) => {
|
|
2177
|
+
const value = process.env[envVar]?.trim();
|
|
2178
|
+
if (!value) return null;
|
|
2179
|
+
return {
|
|
2180
|
+
apiKey: value,
|
|
2181
|
+
source: applied.has(envVar) ? `shell env: ${envVar}` : `env: ${envVar}`
|
|
2182
|
+
};
|
|
2183
|
+
};
|
|
2184
|
+
if (normalized === "github-copilot") return pick("COPILOT_GITHUB_TOKEN") ?? pick("GH_TOKEN") ?? pick("GITHUB_TOKEN");
|
|
2185
|
+
if (normalized === "anthropic") return pick("ANTHROPIC_OAUTH_TOKEN") ?? pick("ANTHROPIC_API_KEY");
|
|
2186
|
+
if (normalized === "chutes") return pick("CHUTES_OAUTH_TOKEN") ?? pick("CHUTES_API_KEY");
|
|
2187
|
+
if (normalized === "zai") return pick("ZAI_API_KEY") ?? pick("Z_AI_API_KEY");
|
|
2188
|
+
if (normalized === "google-vertex") {
|
|
2189
|
+
const envKey = getEnvApiKey(normalized);
|
|
2190
|
+
if (!envKey) return null;
|
|
2191
|
+
return {
|
|
2192
|
+
apiKey: envKey,
|
|
2193
|
+
source: "gcloud adc"
|
|
2194
|
+
};
|
|
2195
|
+
}
|
|
2196
|
+
if (normalized === "opencode") return pick("OPENCODE_API_KEY") ?? pick("OPENCODE_ZEN_API_KEY");
|
|
2197
|
+
if (normalized === "qwen-portal") return pick("QWEN_OAUTH_TOKEN") ?? pick("QWEN_PORTAL_API_KEY");
|
|
2198
|
+
if (normalized === "minimax-portal") return pick("MINIMAX_OAUTH_TOKEN") ?? pick("MINIMAX_API_KEY");
|
|
2199
|
+
if (normalized === "kimi-coding") return pick("KIMI_API_KEY") ?? pick("KIMICODE_API_KEY");
|
|
2200
|
+
const envVar = {
|
|
2201
|
+
openai: "OPENAI_API_KEY",
|
|
2202
|
+
google: "GEMINI_API_KEY",
|
|
2203
|
+
groq: "GROQ_API_KEY",
|
|
2204
|
+
deepgram: "DEEPGRAM_API_KEY",
|
|
2205
|
+
cerebras: "CEREBRAS_API_KEY",
|
|
2206
|
+
xai: "XAI_API_KEY",
|
|
2207
|
+
openrouter: "OPENROUTER_API_KEY",
|
|
2208
|
+
"vercel-ai-gateway": "AI_GATEWAY_API_KEY",
|
|
2209
|
+
"cloudflare-ai-gateway": "CLOUDFLARE_AI_GATEWAY_API_KEY",
|
|
2210
|
+
moonshot: "MOONSHOT_API_KEY",
|
|
2211
|
+
minimax: "MINIMAX_API_KEY",
|
|
2212
|
+
xiaomi: "XIAOMI_API_KEY",
|
|
2213
|
+
synthetic: "SYNTHETIC_API_KEY",
|
|
2214
|
+
venice: "VENICE_API_KEY",
|
|
2215
|
+
mistral: "MISTRAL_API_KEY",
|
|
2216
|
+
opencode: "OPENCODE_API_KEY",
|
|
2217
|
+
ollama: "OLLAMA_API_KEY"
|
|
2218
|
+
}[normalized];
|
|
2219
|
+
if (!envVar) return null;
|
|
2220
|
+
return pick(envVar);
|
|
2221
|
+
}
|
|
2222
|
+
|
|
2223
|
+
//#endregion
|
|
2224
|
+
//#region src/agents/synthetic-models.ts
|
|
2225
|
+
const SYNTHETIC_BASE_URL = "https://api.synthetic.new/anthropic";
|
|
2226
|
+
const SYNTHETIC_DEFAULT_MODEL_ID = "hf:MiniMaxAI/MiniMax-M2.1";
|
|
2227
|
+
const SYNTHETIC_DEFAULT_MODEL_REF = `synthetic/${SYNTHETIC_DEFAULT_MODEL_ID}`;
|
|
2228
|
+
const SYNTHETIC_DEFAULT_COST = {
|
|
2229
|
+
input: 0,
|
|
2230
|
+
output: 0,
|
|
2231
|
+
cacheRead: 0,
|
|
2232
|
+
cacheWrite: 0
|
|
2233
|
+
};
|
|
2234
|
+
const SYNTHETIC_MODEL_CATALOG = [
|
|
2235
|
+
{
|
|
2236
|
+
id: SYNTHETIC_DEFAULT_MODEL_ID,
|
|
2237
|
+
name: "MiniMax M2.1",
|
|
2238
|
+
reasoning: false,
|
|
2239
|
+
input: ["text"],
|
|
2240
|
+
contextWindow: 192e3,
|
|
2241
|
+
maxTokens: 65536
|
|
2242
|
+
},
|
|
2243
|
+
{
|
|
2244
|
+
id: "hf:moonshotai/Kimi-K2-Thinking",
|
|
2245
|
+
name: "Kimi K2 Thinking",
|
|
2246
|
+
reasoning: true,
|
|
2247
|
+
input: ["text"],
|
|
2248
|
+
contextWindow: 256e3,
|
|
2249
|
+
maxTokens: 8192
|
|
2250
|
+
},
|
|
2251
|
+
{
|
|
2252
|
+
id: "hf:zai-org/GLM-4.7",
|
|
2253
|
+
name: "GLM-4.7",
|
|
2254
|
+
reasoning: false,
|
|
2255
|
+
input: ["text"],
|
|
2256
|
+
contextWindow: 198e3,
|
|
2257
|
+
maxTokens: 128e3
|
|
2258
|
+
},
|
|
2259
|
+
{
|
|
2260
|
+
id: "hf:deepseek-ai/DeepSeek-R1-0528",
|
|
2261
|
+
name: "DeepSeek R1 0528",
|
|
2262
|
+
reasoning: false,
|
|
2263
|
+
input: ["text"],
|
|
2264
|
+
contextWindow: 128e3,
|
|
2265
|
+
maxTokens: 8192
|
|
2266
|
+
},
|
|
2267
|
+
{
|
|
2268
|
+
id: "hf:deepseek-ai/DeepSeek-V3-0324",
|
|
2269
|
+
name: "DeepSeek V3 0324",
|
|
2270
|
+
reasoning: false,
|
|
2271
|
+
input: ["text"],
|
|
2272
|
+
contextWindow: 128e3,
|
|
2273
|
+
maxTokens: 8192
|
|
2274
|
+
},
|
|
2275
|
+
{
|
|
2276
|
+
id: "hf:deepseek-ai/DeepSeek-V3.1",
|
|
2277
|
+
name: "DeepSeek V3.1",
|
|
2278
|
+
reasoning: false,
|
|
2279
|
+
input: ["text"],
|
|
2280
|
+
contextWindow: 128e3,
|
|
2281
|
+
maxTokens: 8192
|
|
2282
|
+
},
|
|
2283
|
+
{
|
|
2284
|
+
id: "hf:deepseek-ai/DeepSeek-V3.1-Terminus",
|
|
2285
|
+
name: "DeepSeek V3.1 Terminus",
|
|
2286
|
+
reasoning: false,
|
|
2287
|
+
input: ["text"],
|
|
2288
|
+
contextWindow: 128e3,
|
|
2289
|
+
maxTokens: 8192
|
|
2290
|
+
},
|
|
2291
|
+
{
|
|
2292
|
+
id: "hf:deepseek-ai/DeepSeek-V3.2",
|
|
2293
|
+
name: "DeepSeek V3.2",
|
|
2294
|
+
reasoning: false,
|
|
2295
|
+
input: ["text"],
|
|
2296
|
+
contextWindow: 159e3,
|
|
2297
|
+
maxTokens: 8192
|
|
2298
|
+
},
|
|
2299
|
+
{
|
|
2300
|
+
id: "hf:meta-llama/Llama-3.3-70B-Instruct",
|
|
2301
|
+
name: "Llama 3.3 70B Instruct",
|
|
2302
|
+
reasoning: false,
|
|
2303
|
+
input: ["text"],
|
|
2304
|
+
contextWindow: 128e3,
|
|
2305
|
+
maxTokens: 8192
|
|
2306
|
+
},
|
|
2307
|
+
{
|
|
2308
|
+
id: "hf:meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8",
|
|
2309
|
+
name: "Llama 4 Maverick 17B 128E Instruct FP8",
|
|
2310
|
+
reasoning: false,
|
|
2311
|
+
input: ["text"],
|
|
2312
|
+
contextWindow: 524e3,
|
|
2313
|
+
maxTokens: 8192
|
|
2314
|
+
},
|
|
2315
|
+
{
|
|
2316
|
+
id: "hf:moonshotai/Kimi-K2-Instruct-0905",
|
|
2317
|
+
name: "Kimi K2 Instruct 0905",
|
|
2318
|
+
reasoning: false,
|
|
2319
|
+
input: ["text"],
|
|
2320
|
+
contextWindow: 256e3,
|
|
2321
|
+
maxTokens: 8192
|
|
2322
|
+
},
|
|
2323
|
+
{
|
|
2324
|
+
id: "hf:moonshotai/Kimi-K2.5",
|
|
2325
|
+
name: "Kimi K2.5",
|
|
2326
|
+
reasoning: true,
|
|
2327
|
+
input: ["text"],
|
|
2328
|
+
contextWindow: 256e3,
|
|
2329
|
+
maxTokens: 8192
|
|
2330
|
+
},
|
|
2331
|
+
{
|
|
2332
|
+
id: "hf:openai/gpt-oss-120b",
|
|
2333
|
+
name: "GPT OSS 120B",
|
|
2334
|
+
reasoning: false,
|
|
2335
|
+
input: ["text"],
|
|
2336
|
+
contextWindow: 128e3,
|
|
2337
|
+
maxTokens: 8192
|
|
2338
|
+
},
|
|
2339
|
+
{
|
|
2340
|
+
id: "hf:Qwen/Qwen3-235B-A22B-Instruct-2507",
|
|
2341
|
+
name: "Qwen3 235B A22B Instruct 2507",
|
|
2342
|
+
reasoning: false,
|
|
2343
|
+
input: ["text"],
|
|
2344
|
+
contextWindow: 256e3,
|
|
2345
|
+
maxTokens: 8192
|
|
2346
|
+
},
|
|
2347
|
+
{
|
|
2348
|
+
id: "hf:Qwen/Qwen3-Coder-480B-A35B-Instruct",
|
|
2349
|
+
name: "Qwen3 Coder 480B A35B Instruct",
|
|
2350
|
+
reasoning: false,
|
|
2351
|
+
input: ["text"],
|
|
2352
|
+
contextWindow: 256e3,
|
|
2353
|
+
maxTokens: 8192
|
|
2354
|
+
},
|
|
2355
|
+
{
|
|
2356
|
+
id: "hf:Qwen/Qwen3-VL-235B-A22B-Instruct",
|
|
2357
|
+
name: "Qwen3 VL 235B A22B Instruct",
|
|
2358
|
+
reasoning: false,
|
|
2359
|
+
input: ["text", "image"],
|
|
2360
|
+
contextWindow: 25e4,
|
|
2361
|
+
maxTokens: 8192
|
|
2362
|
+
},
|
|
2363
|
+
{
|
|
2364
|
+
id: "hf:zai-org/GLM-4.5",
|
|
2365
|
+
name: "GLM-4.5",
|
|
2366
|
+
reasoning: false,
|
|
2367
|
+
input: ["text"],
|
|
2368
|
+
contextWindow: 128e3,
|
|
2369
|
+
maxTokens: 128e3
|
|
2370
|
+
},
|
|
2371
|
+
{
|
|
2372
|
+
id: "hf:zai-org/GLM-4.6",
|
|
2373
|
+
name: "GLM-4.6",
|
|
2374
|
+
reasoning: false,
|
|
2375
|
+
input: ["text"],
|
|
2376
|
+
contextWindow: 198e3,
|
|
2377
|
+
maxTokens: 128e3
|
|
2378
|
+
},
|
|
2379
|
+
{
|
|
2380
|
+
id: "hf:deepseek-ai/DeepSeek-V3",
|
|
2381
|
+
name: "DeepSeek V3",
|
|
2382
|
+
reasoning: false,
|
|
2383
|
+
input: ["text"],
|
|
2384
|
+
contextWindow: 128e3,
|
|
2385
|
+
maxTokens: 8192
|
|
2386
|
+
},
|
|
2387
|
+
{
|
|
2388
|
+
id: "hf:Qwen/Qwen3-235B-A22B-Thinking-2507",
|
|
2389
|
+
name: "Qwen3 235B A22B Thinking 2507",
|
|
2390
|
+
reasoning: true,
|
|
2391
|
+
input: ["text"],
|
|
2392
|
+
contextWindow: 256e3,
|
|
2393
|
+
maxTokens: 8192
|
|
2394
|
+
}
|
|
2395
|
+
];
|
|
2396
|
+
function buildSyntheticModelDefinition(entry) {
|
|
2397
|
+
return {
|
|
2398
|
+
id: entry.id,
|
|
2399
|
+
name: entry.name,
|
|
2400
|
+
reasoning: entry.reasoning,
|
|
2401
|
+
input: [...entry.input],
|
|
2402
|
+
cost: SYNTHETIC_DEFAULT_COST,
|
|
2403
|
+
contextWindow: entry.contextWindow,
|
|
2404
|
+
maxTokens: entry.maxTokens
|
|
2405
|
+
};
|
|
2406
|
+
}
|
|
2407
|
+
|
|
2408
|
+
//#endregion
|
|
2409
|
+
//#region src/agents/venice-models.ts
|
|
2410
|
+
const VENICE_BASE_URL = "https://api.venice.ai/api/v1";
|
|
2411
|
+
const VENICE_DEFAULT_MODEL_ID = "llama-3.3-70b";
|
|
2412
|
+
const VENICE_DEFAULT_MODEL_REF = `venice/${VENICE_DEFAULT_MODEL_ID}`;
|
|
2413
|
+
const VENICE_DEFAULT_COST = {
|
|
2414
|
+
input: 0,
|
|
2415
|
+
output: 0,
|
|
2416
|
+
cacheRead: 0,
|
|
2417
|
+
cacheWrite: 0
|
|
2418
|
+
};
|
|
2419
|
+
/**
|
|
2420
|
+
* Complete catalog of Venice AI models.
|
|
2421
|
+
*
|
|
2422
|
+
* Venice provides two privacy modes:
|
|
2423
|
+
* - "private": Fully private inference, no logging, ephemeral
|
|
2424
|
+
* - "anonymized": Proxied through Venice with metadata stripped (for proprietary models)
|
|
2425
|
+
*
|
|
2426
|
+
* Note: The `privacy` field is included for documentation purposes but is not
|
|
2427
|
+
* propagated to ModelDefinitionConfig as it's not part of the core model schema.
|
|
2428
|
+
* Privacy mode is determined by the model itself, not configurable at runtime.
|
|
2429
|
+
*
|
|
2430
|
+
* This catalog serves as a fallback when the Venice API is unreachable.
|
|
2431
|
+
*/
|
|
2432
|
+
const VENICE_MODEL_CATALOG = [
|
|
2433
|
+
{
|
|
2434
|
+
id: "llama-3.3-70b",
|
|
2435
|
+
name: "Llama 3.3 70B",
|
|
2436
|
+
reasoning: false,
|
|
2437
|
+
input: ["text"],
|
|
2438
|
+
contextWindow: 131072,
|
|
2439
|
+
maxTokens: 8192,
|
|
2440
|
+
privacy: "private"
|
|
2441
|
+
},
|
|
2442
|
+
{
|
|
2443
|
+
id: "llama-3.2-3b",
|
|
2444
|
+
name: "Llama 3.2 3B",
|
|
2445
|
+
reasoning: false,
|
|
2446
|
+
input: ["text"],
|
|
2447
|
+
contextWindow: 131072,
|
|
2448
|
+
maxTokens: 8192,
|
|
2449
|
+
privacy: "private"
|
|
2450
|
+
},
|
|
2451
|
+
{
|
|
2452
|
+
id: "hermes-3-llama-3.1-405b",
|
|
2453
|
+
name: "Hermes 3 Llama 3.1 405B",
|
|
2454
|
+
reasoning: false,
|
|
2455
|
+
input: ["text"],
|
|
2456
|
+
contextWindow: 131072,
|
|
2457
|
+
maxTokens: 8192,
|
|
2458
|
+
privacy: "private"
|
|
2459
|
+
},
|
|
2460
|
+
{
|
|
2461
|
+
id: "qwen3-235b-a22b-thinking-2507",
|
|
2462
|
+
name: "Qwen3 235B Thinking",
|
|
2463
|
+
reasoning: true,
|
|
2464
|
+
input: ["text"],
|
|
2465
|
+
contextWindow: 131072,
|
|
2466
|
+
maxTokens: 8192,
|
|
2467
|
+
privacy: "private"
|
|
2468
|
+
},
|
|
2469
|
+
{
|
|
2470
|
+
id: "qwen3-235b-a22b-instruct-2507",
|
|
2471
|
+
name: "Qwen3 235B Instruct",
|
|
2472
|
+
reasoning: false,
|
|
2473
|
+
input: ["text"],
|
|
2474
|
+
contextWindow: 131072,
|
|
2475
|
+
maxTokens: 8192,
|
|
2476
|
+
privacy: "private"
|
|
2477
|
+
},
|
|
2478
|
+
{
|
|
2479
|
+
id: "qwen3-coder-480b-a35b-instruct",
|
|
2480
|
+
name: "Qwen3 Coder 480B",
|
|
2481
|
+
reasoning: false,
|
|
2482
|
+
input: ["text"],
|
|
2483
|
+
contextWindow: 262144,
|
|
2484
|
+
maxTokens: 8192,
|
|
2485
|
+
privacy: "private"
|
|
2486
|
+
},
|
|
2487
|
+
{
|
|
2488
|
+
id: "qwen3-next-80b",
|
|
2489
|
+
name: "Qwen3 Next 80B",
|
|
2490
|
+
reasoning: false,
|
|
2491
|
+
input: ["text"],
|
|
2492
|
+
contextWindow: 262144,
|
|
2493
|
+
maxTokens: 8192,
|
|
2494
|
+
privacy: "private"
|
|
2495
|
+
},
|
|
2496
|
+
{
|
|
2497
|
+
id: "qwen3-vl-235b-a22b",
|
|
2498
|
+
name: "Qwen3 VL 235B (Vision)",
|
|
2499
|
+
reasoning: false,
|
|
2500
|
+
input: ["text", "image"],
|
|
2501
|
+
contextWindow: 262144,
|
|
2502
|
+
maxTokens: 8192,
|
|
2503
|
+
privacy: "private"
|
|
2504
|
+
},
|
|
2505
|
+
{
|
|
2506
|
+
id: "qwen3-4b",
|
|
2507
|
+
name: "Venice Small (Qwen3 4B)",
|
|
2508
|
+
reasoning: true,
|
|
2509
|
+
input: ["text"],
|
|
2510
|
+
contextWindow: 32768,
|
|
2511
|
+
maxTokens: 8192,
|
|
2512
|
+
privacy: "private"
|
|
2513
|
+
},
|
|
2514
|
+
{
|
|
2515
|
+
id: "deepseek-v3.2",
|
|
2516
|
+
name: "DeepSeek V3.2",
|
|
2517
|
+
reasoning: true,
|
|
2518
|
+
input: ["text"],
|
|
2519
|
+
contextWindow: 163840,
|
|
2520
|
+
maxTokens: 8192,
|
|
2521
|
+
privacy: "private"
|
|
2522
|
+
},
|
|
2523
|
+
{
|
|
2524
|
+
id: "venice-uncensored",
|
|
2525
|
+
name: "Venice Uncensored (Dolphin-Mistral)",
|
|
2526
|
+
reasoning: false,
|
|
2527
|
+
input: ["text"],
|
|
2528
|
+
contextWindow: 32768,
|
|
2529
|
+
maxTokens: 8192,
|
|
2530
|
+
privacy: "private"
|
|
2531
|
+
},
|
|
2532
|
+
{
|
|
2533
|
+
id: "mistral-31-24b",
|
|
2534
|
+
name: "Venice Medium (Mistral)",
|
|
2535
|
+
reasoning: false,
|
|
2536
|
+
input: ["text", "image"],
|
|
2537
|
+
contextWindow: 131072,
|
|
2538
|
+
maxTokens: 8192,
|
|
2539
|
+
privacy: "private"
|
|
2540
|
+
},
|
|
2541
|
+
{
|
|
2542
|
+
id: "google-gemma-3-27b-it",
|
|
2543
|
+
name: "Google Gemma 3 27B Instruct",
|
|
2544
|
+
reasoning: false,
|
|
2545
|
+
input: ["text", "image"],
|
|
2546
|
+
contextWindow: 202752,
|
|
2547
|
+
maxTokens: 8192,
|
|
2548
|
+
privacy: "private"
|
|
2549
|
+
},
|
|
2550
|
+
{
|
|
2551
|
+
id: "openai-gpt-oss-120b",
|
|
2552
|
+
name: "OpenAI GPT OSS 120B",
|
|
2553
|
+
reasoning: false,
|
|
2554
|
+
input: ["text"],
|
|
2555
|
+
contextWindow: 131072,
|
|
2556
|
+
maxTokens: 8192,
|
|
2557
|
+
privacy: "private"
|
|
2558
|
+
},
|
|
2559
|
+
{
|
|
2560
|
+
id: "zai-org-glm-4.7",
|
|
2561
|
+
name: "GLM 4.7",
|
|
2562
|
+
reasoning: true,
|
|
2563
|
+
input: ["text"],
|
|
2564
|
+
contextWindow: 202752,
|
|
2565
|
+
maxTokens: 8192,
|
|
2566
|
+
privacy: "private"
|
|
2567
|
+
},
|
|
2568
|
+
{
|
|
2569
|
+
id: "claude-opus-45",
|
|
2570
|
+
name: "Claude Opus 4.5 (via Venice)",
|
|
2571
|
+
reasoning: true,
|
|
2572
|
+
input: ["text", "image"],
|
|
2573
|
+
contextWindow: 202752,
|
|
2574
|
+
maxTokens: 8192,
|
|
2575
|
+
privacy: "anonymized"
|
|
2576
|
+
},
|
|
2577
|
+
{
|
|
2578
|
+
id: "claude-sonnet-45",
|
|
2579
|
+
name: "Claude Sonnet 4.5 (via Venice)",
|
|
2580
|
+
reasoning: true,
|
|
2581
|
+
input: ["text", "image"],
|
|
2582
|
+
contextWindow: 202752,
|
|
2583
|
+
maxTokens: 8192,
|
|
2584
|
+
privacy: "anonymized"
|
|
2585
|
+
},
|
|
2586
|
+
{
|
|
2587
|
+
id: "openai-gpt-52",
|
|
2588
|
+
name: "GPT-5.2 (via Venice)",
|
|
2589
|
+
reasoning: true,
|
|
2590
|
+
input: ["text"],
|
|
2591
|
+
contextWindow: 262144,
|
|
2592
|
+
maxTokens: 8192,
|
|
2593
|
+
privacy: "anonymized"
|
|
2594
|
+
},
|
|
2595
|
+
{
|
|
2596
|
+
id: "openai-gpt-52-codex",
|
|
2597
|
+
name: "GPT-5.2 Codex (via Venice)",
|
|
2598
|
+
reasoning: true,
|
|
2599
|
+
input: ["text", "image"],
|
|
2600
|
+
contextWindow: 262144,
|
|
2601
|
+
maxTokens: 8192,
|
|
2602
|
+
privacy: "anonymized"
|
|
2603
|
+
},
|
|
2604
|
+
{
|
|
2605
|
+
id: "gemini-3-pro-preview",
|
|
2606
|
+
name: "Gemini 3 Pro (via Venice)",
|
|
2607
|
+
reasoning: true,
|
|
2608
|
+
input: ["text", "image"],
|
|
2609
|
+
contextWindow: 202752,
|
|
2610
|
+
maxTokens: 8192,
|
|
2611
|
+
privacy: "anonymized"
|
|
2612
|
+
},
|
|
2613
|
+
{
|
|
2614
|
+
id: "gemini-3-flash-preview",
|
|
2615
|
+
name: "Gemini 3 Flash (via Venice)",
|
|
2616
|
+
reasoning: true,
|
|
2617
|
+
input: ["text", "image"],
|
|
2618
|
+
contextWindow: 262144,
|
|
2619
|
+
maxTokens: 8192,
|
|
2620
|
+
privacy: "anonymized"
|
|
2621
|
+
},
|
|
2622
|
+
{
|
|
2623
|
+
id: "grok-41-fast",
|
|
2624
|
+
name: "Grok 4.1 Fast (via Venice)",
|
|
2625
|
+
reasoning: true,
|
|
2626
|
+
input: ["text", "image"],
|
|
2627
|
+
contextWindow: 262144,
|
|
2628
|
+
maxTokens: 8192,
|
|
2629
|
+
privacy: "anonymized"
|
|
2630
|
+
},
|
|
2631
|
+
{
|
|
2632
|
+
id: "grok-code-fast-1",
|
|
2633
|
+
name: "Grok Code Fast 1 (via Venice)",
|
|
2634
|
+
reasoning: true,
|
|
2635
|
+
input: ["text"],
|
|
2636
|
+
contextWindow: 262144,
|
|
2637
|
+
maxTokens: 8192,
|
|
2638
|
+
privacy: "anonymized"
|
|
2639
|
+
},
|
|
2640
|
+
{
|
|
2641
|
+
id: "kimi-k2-thinking",
|
|
2642
|
+
name: "Kimi K2 Thinking (via Venice)",
|
|
2643
|
+
reasoning: true,
|
|
2644
|
+
input: ["text"],
|
|
2645
|
+
contextWindow: 262144,
|
|
2646
|
+
maxTokens: 8192,
|
|
2647
|
+
privacy: "anonymized"
|
|
2648
|
+
},
|
|
2649
|
+
{
|
|
2650
|
+
id: "minimax-m21",
|
|
2651
|
+
name: "MiniMax M2.1 (via Venice)",
|
|
2652
|
+
reasoning: true,
|
|
2653
|
+
input: ["text"],
|
|
2654
|
+
contextWindow: 202752,
|
|
2655
|
+
maxTokens: 8192,
|
|
2656
|
+
privacy: "anonymized"
|
|
2657
|
+
}
|
|
2658
|
+
];
|
|
2659
|
+
/**
|
|
2660
|
+
* Build a ModelDefinitionConfig from a Venice catalog entry.
|
|
2661
|
+
*
|
|
2662
|
+
* Note: The `privacy` field from the catalog is not included in the output
|
|
2663
|
+
* as ModelDefinitionConfig doesn't support custom metadata fields. Privacy
|
|
2664
|
+
* mode is inherent to each model and documented in the catalog/docs.
|
|
2665
|
+
*/
|
|
2666
|
+
function buildVeniceModelDefinition(entry) {
|
|
2667
|
+
return {
|
|
2668
|
+
id: entry.id,
|
|
2669
|
+
name: entry.name,
|
|
2670
|
+
reasoning: entry.reasoning,
|
|
2671
|
+
input: [...entry.input],
|
|
2672
|
+
cost: VENICE_DEFAULT_COST,
|
|
2673
|
+
contextWindow: entry.contextWindow,
|
|
2674
|
+
maxTokens: entry.maxTokens
|
|
2675
|
+
};
|
|
2676
|
+
}
|
|
2677
|
+
/**
|
|
2678
|
+
* Discover models from Venice API with fallback to static catalog.
|
|
2679
|
+
* The /models endpoint is public and doesn't require authentication.
|
|
2680
|
+
*/
|
|
2681
|
+
async function discoverVeniceModels() {
|
|
2682
|
+
if (process.env.VITEST) return VENICE_MODEL_CATALOG.map(buildVeniceModelDefinition);
|
|
2683
|
+
try {
|
|
2684
|
+
const response = await fetch(`${VENICE_BASE_URL}/models`, { signal: AbortSignal.timeout(5e3) });
|
|
2685
|
+
if (!response.ok) {
|
|
2686
|
+
console.warn(`[venice-models] Failed to discover models: HTTP ${response.status}, using static catalog`);
|
|
2687
|
+
return VENICE_MODEL_CATALOG.map(buildVeniceModelDefinition);
|
|
2688
|
+
}
|
|
2689
|
+
const data = await response.json();
|
|
2690
|
+
if (!Array.isArray(data.data) || data.data.length === 0) {
|
|
2691
|
+
console.warn("[venice-models] No models found from API, using static catalog");
|
|
2692
|
+
return VENICE_MODEL_CATALOG.map(buildVeniceModelDefinition);
|
|
2693
|
+
}
|
|
2694
|
+
const catalogById = new Map(VENICE_MODEL_CATALOG.map((m) => [m.id, m]));
|
|
2695
|
+
const models = [];
|
|
2696
|
+
for (const apiModel of data.data) {
|
|
2697
|
+
const catalogEntry = catalogById.get(apiModel.id);
|
|
2698
|
+
if (catalogEntry) models.push(buildVeniceModelDefinition(catalogEntry));
|
|
2699
|
+
else {
|
|
2700
|
+
const isReasoning = apiModel.model_spec.capabilities.supportsReasoning || apiModel.id.toLowerCase().includes("thinking") || apiModel.id.toLowerCase().includes("reason") || apiModel.id.toLowerCase().includes("r1");
|
|
2701
|
+
const hasVision = apiModel.model_spec.capabilities.supportsVision;
|
|
2702
|
+
models.push({
|
|
2703
|
+
id: apiModel.id,
|
|
2704
|
+
name: apiModel.model_spec.name || apiModel.id,
|
|
2705
|
+
reasoning: isReasoning,
|
|
2706
|
+
input: hasVision ? ["text", "image"] : ["text"],
|
|
2707
|
+
cost: VENICE_DEFAULT_COST,
|
|
2708
|
+
contextWindow: apiModel.model_spec.availableContextTokens || 128e3,
|
|
2709
|
+
maxTokens: 8192
|
|
2710
|
+
});
|
|
2711
|
+
}
|
|
2712
|
+
}
|
|
2713
|
+
return models.length > 0 ? models : VENICE_MODEL_CATALOG.map(buildVeniceModelDefinition);
|
|
2714
|
+
} catch (error) {
|
|
2715
|
+
console.warn(`[venice-models] Discovery failed: ${String(error)}, using static catalog`);
|
|
2716
|
+
return VENICE_MODEL_CATALOG.map(buildVeniceModelDefinition);
|
|
2717
|
+
}
|
|
2718
|
+
}
|
|
2719
|
+
|
|
2720
|
+
//#endregion
|
|
2721
|
+
//#region src/agents/models-config.providers.ts
|
|
2722
|
+
const MINIMAX_API_BASE_URL = "https://api.minimax.chat/v1";
|
|
2723
|
+
const MINIMAX_PORTAL_BASE_URL = "https://api.minimax.io/anthropic";
|
|
2724
|
+
const MINIMAX_DEFAULT_MODEL_ID = "MiniMax-M2.1";
|
|
2725
|
+
const MINIMAX_DEFAULT_VISION_MODEL_ID = "MiniMax-VL-01";
|
|
2726
|
+
const MINIMAX_DEFAULT_CONTEXT_WINDOW = 2e5;
|
|
2727
|
+
const MINIMAX_DEFAULT_MAX_TOKENS = 8192;
|
|
2728
|
+
const MINIMAX_OAUTH_PLACEHOLDER = "minimax-oauth";
|
|
2729
|
+
const MINIMAX_API_COST = {
|
|
2730
|
+
input: 15,
|
|
2731
|
+
output: 60,
|
|
2732
|
+
cacheRead: 2,
|
|
2733
|
+
cacheWrite: 10
|
|
2734
|
+
};
|
|
2735
|
+
const XIAOMI_BASE_URL = "https://api.xiaomimimo.com/anthropic";
|
|
2736
|
+
const XIAOMI_DEFAULT_MODEL_ID = "mimo-v2-flash";
|
|
2737
|
+
const XIAOMI_DEFAULT_CONTEXT_WINDOW = 262144;
|
|
2738
|
+
const XIAOMI_DEFAULT_MAX_TOKENS = 8192;
|
|
2739
|
+
const XIAOMI_DEFAULT_COST = {
|
|
2740
|
+
input: 0,
|
|
2741
|
+
output: 0,
|
|
2742
|
+
cacheRead: 0,
|
|
2743
|
+
cacheWrite: 0
|
|
2744
|
+
};
|
|
2745
|
+
const MOONSHOT_BASE_URL = "https://api.moonshot.ai/v1";
|
|
2746
|
+
const MOONSHOT_DEFAULT_MODEL_ID = "kimi-k2.5";
|
|
2747
|
+
const MOONSHOT_DEFAULT_CONTEXT_WINDOW = 256e3;
|
|
2748
|
+
const MOONSHOT_DEFAULT_MAX_TOKENS = 8192;
|
|
2749
|
+
const MOONSHOT_DEFAULT_COST = {
|
|
2750
|
+
input: 0,
|
|
2751
|
+
output: 0,
|
|
2752
|
+
cacheRead: 0,
|
|
2753
|
+
cacheWrite: 0
|
|
2754
|
+
};
|
|
2755
|
+
const QWEN_PORTAL_BASE_URL = "https://portal.qwen.ai/v1";
|
|
2756
|
+
const QWEN_PORTAL_OAUTH_PLACEHOLDER = "qwen-oauth";
|
|
2757
|
+
const QWEN_PORTAL_DEFAULT_CONTEXT_WINDOW = 128e3;
|
|
2758
|
+
const QWEN_PORTAL_DEFAULT_MAX_TOKENS = 8192;
|
|
2759
|
+
const QWEN_PORTAL_DEFAULT_COST = {
|
|
2760
|
+
input: 0,
|
|
2761
|
+
output: 0,
|
|
2762
|
+
cacheRead: 0,
|
|
2763
|
+
cacheWrite: 0
|
|
2764
|
+
};
|
|
2765
|
+
const OLLAMA_BASE_URL = "http://127.0.0.1:11434/v1";
|
|
2766
|
+
const OLLAMA_API_BASE_URL = "http://127.0.0.1:11434";
|
|
2767
|
+
const OLLAMA_DEFAULT_CONTEXT_WINDOW = 128e3;
|
|
2768
|
+
const OLLAMA_DEFAULT_MAX_TOKENS = 8192;
|
|
2769
|
+
const OLLAMA_DEFAULT_COST = {
|
|
2770
|
+
input: 0,
|
|
2771
|
+
output: 0,
|
|
2772
|
+
cacheRead: 0,
|
|
2773
|
+
cacheWrite: 0
|
|
2774
|
+
};
|
|
2775
|
+
async function discoverOllamaModels() {
|
|
2776
|
+
if (process.env.VITEST || false) return [];
|
|
2777
|
+
try {
|
|
2778
|
+
const response = await fetch(`${OLLAMA_API_BASE_URL}/api/tags`, { signal: AbortSignal.timeout(5e3) });
|
|
2779
|
+
if (!response.ok) {
|
|
2780
|
+
console.warn(`Failed to discover Ollama models: ${response.status}`);
|
|
2781
|
+
return [];
|
|
2782
|
+
}
|
|
2783
|
+
const data = await response.json();
|
|
2784
|
+
if (!data.models || data.models.length === 0) {
|
|
2785
|
+
console.warn("No Ollama models found on local instance");
|
|
2786
|
+
return [];
|
|
2787
|
+
}
|
|
2788
|
+
return data.models.map((model) => {
|
|
2789
|
+
const modelId = model.name;
|
|
2790
|
+
return {
|
|
2791
|
+
id: modelId,
|
|
2792
|
+
name: modelId,
|
|
2793
|
+
reasoning: modelId.toLowerCase().includes("r1") || modelId.toLowerCase().includes("reasoning"),
|
|
2794
|
+
input: ["text"],
|
|
2795
|
+
cost: OLLAMA_DEFAULT_COST,
|
|
2796
|
+
contextWindow: OLLAMA_DEFAULT_CONTEXT_WINDOW,
|
|
2797
|
+
maxTokens: OLLAMA_DEFAULT_MAX_TOKENS,
|
|
2798
|
+
params: { streaming: false }
|
|
2799
|
+
};
|
|
2800
|
+
});
|
|
2801
|
+
} catch (error) {
|
|
2802
|
+
console.warn(`Failed to discover Ollama models: ${String(error)}`);
|
|
2803
|
+
return [];
|
|
2804
|
+
}
|
|
2805
|
+
}
|
|
2806
|
+
function normalizeApiKeyConfig(value) {
|
|
2807
|
+
const trimmed = value.trim();
|
|
2808
|
+
return /^\$\{([A-Z0-9_]+)\}$/.exec(trimmed)?.[1] ?? trimmed;
|
|
2809
|
+
}
|
|
2810
|
+
function resolveEnvApiKeyVarName(provider) {
|
|
2811
|
+
const resolved = resolveEnvApiKey(provider);
|
|
2812
|
+
if (!resolved) return;
|
|
2813
|
+
const match = /^(?:env: |shell env: )([A-Z0-9_]+)$/.exec(resolved.source);
|
|
2814
|
+
return match ? match[1] : void 0;
|
|
2815
|
+
}
|
|
2816
|
+
function resolveAwsSdkApiKeyVarName() {
|
|
2817
|
+
return resolveAwsSdkEnvVarName() ?? "AWS_PROFILE";
|
|
2818
|
+
}
|
|
2819
|
+
function resolveApiKeyFromProfiles(params) {
|
|
2820
|
+
const ids = listProfilesForProvider(params.store, params.provider);
|
|
2821
|
+
for (const id of ids) {
|
|
2822
|
+
const cred = params.store.profiles[id];
|
|
2823
|
+
if (!cred) continue;
|
|
2824
|
+
if (cred.type === "api_key") return cred.key;
|
|
2825
|
+
if (cred.type === "token") return cred.token;
|
|
2826
|
+
}
|
|
2827
|
+
}
|
|
2828
|
+
function normalizeGoogleModelId(id) {
|
|
2829
|
+
if (id === "gemini-3-pro") return "gemini-3-pro-preview";
|
|
2830
|
+
if (id === "gemini-3-flash") return "gemini-3-flash-preview";
|
|
2831
|
+
return id;
|
|
2832
|
+
}
|
|
2833
|
+
function normalizeGoogleProvider(provider) {
|
|
2834
|
+
let mutated = false;
|
|
2835
|
+
const models = provider.models.map((model) => {
|
|
2836
|
+
const nextId = normalizeGoogleModelId(model.id);
|
|
2837
|
+
if (nextId === model.id) return model;
|
|
2838
|
+
mutated = true;
|
|
2839
|
+
return {
|
|
2840
|
+
...model,
|
|
2841
|
+
id: nextId
|
|
2842
|
+
};
|
|
2843
|
+
});
|
|
2844
|
+
return mutated ? {
|
|
2845
|
+
...provider,
|
|
2846
|
+
models
|
|
2847
|
+
} : provider;
|
|
2848
|
+
}
|
|
2849
|
+
function normalizeProviders(params) {
|
|
2850
|
+
const { providers } = params;
|
|
2851
|
+
if (!providers) return providers;
|
|
2852
|
+
const authStore = ensureAuthProfileStore(params.agentDir, { allowKeychainPrompt: false });
|
|
2853
|
+
let mutated = false;
|
|
2854
|
+
const next = {};
|
|
2855
|
+
for (const [key, provider] of Object.entries(providers)) {
|
|
2856
|
+
const normalizedKey = key.trim();
|
|
2857
|
+
let normalizedProvider = provider;
|
|
2858
|
+
if (normalizedProvider.apiKey && normalizeApiKeyConfig(normalizedProvider.apiKey) !== normalizedProvider.apiKey) {
|
|
2859
|
+
mutated = true;
|
|
2860
|
+
normalizedProvider = {
|
|
2861
|
+
...normalizedProvider,
|
|
2862
|
+
apiKey: normalizeApiKeyConfig(normalizedProvider.apiKey)
|
|
2863
|
+
};
|
|
2864
|
+
}
|
|
2865
|
+
if (Array.isArray(normalizedProvider.models) && normalizedProvider.models.length > 0 && !normalizedProvider.apiKey?.trim()) if ((normalizedProvider.auth ?? (normalizedKey === "amazon-bedrock" ? "aws-sdk" : void 0)) === "aws-sdk") {
|
|
2866
|
+
const apiKey = resolveAwsSdkApiKeyVarName();
|
|
2867
|
+
mutated = true;
|
|
2868
|
+
normalizedProvider = {
|
|
2869
|
+
...normalizedProvider,
|
|
2870
|
+
apiKey
|
|
2871
|
+
};
|
|
2872
|
+
} else {
|
|
2873
|
+
const fromEnv = resolveEnvApiKeyVarName(normalizedKey);
|
|
2874
|
+
const fromProfiles = resolveApiKeyFromProfiles({
|
|
2875
|
+
provider: normalizedKey,
|
|
2876
|
+
store: authStore
|
|
2877
|
+
});
|
|
2878
|
+
const apiKey = fromEnv ?? fromProfiles;
|
|
2879
|
+
if (apiKey?.trim()) {
|
|
2880
|
+
mutated = true;
|
|
2881
|
+
normalizedProvider = {
|
|
2882
|
+
...normalizedProvider,
|
|
2883
|
+
apiKey
|
|
2884
|
+
};
|
|
2885
|
+
}
|
|
2886
|
+
}
|
|
2887
|
+
if (normalizedKey === "google") {
|
|
2888
|
+
const googleNormalized = normalizeGoogleProvider(normalizedProvider);
|
|
2889
|
+
if (googleNormalized !== normalizedProvider) mutated = true;
|
|
2890
|
+
normalizedProvider = googleNormalized;
|
|
2891
|
+
}
|
|
2892
|
+
next[key] = normalizedProvider;
|
|
2893
|
+
}
|
|
2894
|
+
return mutated ? next : providers;
|
|
2895
|
+
}
|
|
2896
|
+
function buildMinimaxProvider() {
|
|
2897
|
+
return {
|
|
2898
|
+
baseUrl: MINIMAX_API_BASE_URL,
|
|
2899
|
+
api: "openai-completions",
|
|
2900
|
+
models: [{
|
|
2901
|
+
id: MINIMAX_DEFAULT_MODEL_ID,
|
|
2902
|
+
name: "MiniMax M2.1",
|
|
2903
|
+
reasoning: false,
|
|
2904
|
+
input: ["text"],
|
|
2905
|
+
cost: MINIMAX_API_COST,
|
|
2906
|
+
contextWindow: MINIMAX_DEFAULT_CONTEXT_WINDOW,
|
|
2907
|
+
maxTokens: MINIMAX_DEFAULT_MAX_TOKENS
|
|
2908
|
+
}, {
|
|
2909
|
+
id: MINIMAX_DEFAULT_VISION_MODEL_ID,
|
|
2910
|
+
name: "MiniMax VL 01",
|
|
2911
|
+
reasoning: false,
|
|
2912
|
+
input: ["text", "image"],
|
|
2913
|
+
cost: MINIMAX_API_COST,
|
|
2914
|
+
contextWindow: MINIMAX_DEFAULT_CONTEXT_WINDOW,
|
|
2915
|
+
maxTokens: MINIMAX_DEFAULT_MAX_TOKENS
|
|
2916
|
+
}]
|
|
2917
|
+
};
|
|
2918
|
+
}
|
|
2919
|
+
function buildMinimaxPortalProvider() {
|
|
2920
|
+
return {
|
|
2921
|
+
baseUrl: MINIMAX_PORTAL_BASE_URL,
|
|
2922
|
+
api: "anthropic-messages",
|
|
2923
|
+
models: [{
|
|
2924
|
+
id: MINIMAX_DEFAULT_MODEL_ID,
|
|
2925
|
+
name: "MiniMax M2.1",
|
|
2926
|
+
reasoning: false,
|
|
2927
|
+
input: ["text"],
|
|
2928
|
+
cost: MINIMAX_API_COST,
|
|
2929
|
+
contextWindow: MINIMAX_DEFAULT_CONTEXT_WINDOW,
|
|
2930
|
+
maxTokens: MINIMAX_DEFAULT_MAX_TOKENS
|
|
2931
|
+
}]
|
|
2932
|
+
};
|
|
2933
|
+
}
|
|
2934
|
+
function buildMoonshotProvider() {
|
|
2935
|
+
return {
|
|
2936
|
+
baseUrl: MOONSHOT_BASE_URL,
|
|
2937
|
+
api: "openai-completions",
|
|
2938
|
+
models: [{
|
|
2939
|
+
id: MOONSHOT_DEFAULT_MODEL_ID,
|
|
2940
|
+
name: "Kimi K2.5",
|
|
2941
|
+
reasoning: false,
|
|
2942
|
+
input: ["text"],
|
|
2943
|
+
cost: MOONSHOT_DEFAULT_COST,
|
|
2944
|
+
contextWindow: MOONSHOT_DEFAULT_CONTEXT_WINDOW,
|
|
2945
|
+
maxTokens: MOONSHOT_DEFAULT_MAX_TOKENS
|
|
2946
|
+
}]
|
|
2947
|
+
};
|
|
2948
|
+
}
|
|
2949
|
+
function buildQwenPortalProvider() {
|
|
2950
|
+
return {
|
|
2951
|
+
baseUrl: QWEN_PORTAL_BASE_URL,
|
|
2952
|
+
api: "openai-completions",
|
|
2953
|
+
models: [{
|
|
2954
|
+
id: "coder-model",
|
|
2955
|
+
name: "Qwen Coder",
|
|
2956
|
+
reasoning: false,
|
|
2957
|
+
input: ["text"],
|
|
2958
|
+
cost: QWEN_PORTAL_DEFAULT_COST,
|
|
2959
|
+
contextWindow: QWEN_PORTAL_DEFAULT_CONTEXT_WINDOW,
|
|
2960
|
+
maxTokens: QWEN_PORTAL_DEFAULT_MAX_TOKENS
|
|
2961
|
+
}, {
|
|
2962
|
+
id: "vision-model",
|
|
2963
|
+
name: "Qwen Vision",
|
|
2964
|
+
reasoning: false,
|
|
2965
|
+
input: ["text", "image"],
|
|
2966
|
+
cost: QWEN_PORTAL_DEFAULT_COST,
|
|
2967
|
+
contextWindow: QWEN_PORTAL_DEFAULT_CONTEXT_WINDOW,
|
|
2968
|
+
maxTokens: QWEN_PORTAL_DEFAULT_MAX_TOKENS
|
|
2969
|
+
}]
|
|
2970
|
+
};
|
|
2971
|
+
}
|
|
2972
|
+
function buildSyntheticProvider() {
|
|
2973
|
+
return {
|
|
2974
|
+
baseUrl: SYNTHETIC_BASE_URL,
|
|
2975
|
+
api: "anthropic-messages",
|
|
2976
|
+
models: SYNTHETIC_MODEL_CATALOG.map(buildSyntheticModelDefinition)
|
|
2977
|
+
};
|
|
2978
|
+
}
|
|
2979
|
+
function buildXiaomiProvider() {
|
|
2980
|
+
return {
|
|
2981
|
+
baseUrl: XIAOMI_BASE_URL,
|
|
2982
|
+
api: "anthropic-messages",
|
|
2983
|
+
models: [{
|
|
2984
|
+
id: XIAOMI_DEFAULT_MODEL_ID,
|
|
2985
|
+
name: "Xiaomi MiMo V2 Flash",
|
|
2986
|
+
reasoning: false,
|
|
2987
|
+
input: ["text"],
|
|
2988
|
+
cost: XIAOMI_DEFAULT_COST,
|
|
2989
|
+
contextWindow: XIAOMI_DEFAULT_CONTEXT_WINDOW,
|
|
2990
|
+
maxTokens: XIAOMI_DEFAULT_MAX_TOKENS
|
|
2991
|
+
}]
|
|
2992
|
+
};
|
|
2993
|
+
}
|
|
2994
|
+
async function buildVeniceProvider() {
|
|
2995
|
+
return {
|
|
2996
|
+
baseUrl: VENICE_BASE_URL,
|
|
2997
|
+
api: "openai-completions",
|
|
2998
|
+
models: await discoverVeniceModels()
|
|
2999
|
+
};
|
|
3000
|
+
}
|
|
3001
|
+
async function buildOllamaProvider() {
|
|
3002
|
+
return {
|
|
3003
|
+
baseUrl: OLLAMA_BASE_URL,
|
|
3004
|
+
api: "openai-completions",
|
|
3005
|
+
models: await discoverOllamaModels()
|
|
3006
|
+
};
|
|
3007
|
+
}
|
|
3008
|
+
async function resolveImplicitProviders(params) {
|
|
3009
|
+
const providers = {};
|
|
3010
|
+
const authStore = ensureAuthProfileStore(params.agentDir, { allowKeychainPrompt: false });
|
|
3011
|
+
const minimaxKey = resolveEnvApiKeyVarName("minimax") ?? resolveApiKeyFromProfiles({
|
|
3012
|
+
provider: "minimax",
|
|
3013
|
+
store: authStore
|
|
3014
|
+
});
|
|
3015
|
+
if (minimaxKey) providers.minimax = {
|
|
3016
|
+
...buildMinimaxProvider(),
|
|
3017
|
+
apiKey: minimaxKey
|
|
3018
|
+
};
|
|
3019
|
+
if (listProfilesForProvider(authStore, "minimax-portal").length > 0) providers["minimax-portal"] = {
|
|
3020
|
+
...buildMinimaxPortalProvider(),
|
|
3021
|
+
apiKey: MINIMAX_OAUTH_PLACEHOLDER
|
|
3022
|
+
};
|
|
3023
|
+
const moonshotKey = resolveEnvApiKeyVarName("moonshot") ?? resolveApiKeyFromProfiles({
|
|
3024
|
+
provider: "moonshot",
|
|
3025
|
+
store: authStore
|
|
3026
|
+
});
|
|
3027
|
+
if (moonshotKey) providers.moonshot = {
|
|
3028
|
+
...buildMoonshotProvider(),
|
|
3029
|
+
apiKey: moonshotKey
|
|
3030
|
+
};
|
|
3031
|
+
const syntheticKey = resolveEnvApiKeyVarName("synthetic") ?? resolveApiKeyFromProfiles({
|
|
3032
|
+
provider: "synthetic",
|
|
3033
|
+
store: authStore
|
|
3034
|
+
});
|
|
3035
|
+
if (syntheticKey) providers.synthetic = {
|
|
3036
|
+
...buildSyntheticProvider(),
|
|
3037
|
+
apiKey: syntheticKey
|
|
3038
|
+
};
|
|
3039
|
+
const veniceKey = resolveEnvApiKeyVarName("venice") ?? resolveApiKeyFromProfiles({
|
|
3040
|
+
provider: "venice",
|
|
3041
|
+
store: authStore
|
|
3042
|
+
});
|
|
3043
|
+
if (veniceKey) providers.venice = {
|
|
3044
|
+
...await buildVeniceProvider(),
|
|
3045
|
+
apiKey: veniceKey
|
|
3046
|
+
};
|
|
3047
|
+
if (listProfilesForProvider(authStore, "qwen-portal").length > 0) providers["qwen-portal"] = {
|
|
3048
|
+
...buildQwenPortalProvider(),
|
|
3049
|
+
apiKey: QWEN_PORTAL_OAUTH_PLACEHOLDER
|
|
3050
|
+
};
|
|
3051
|
+
const xiaomiKey = resolveEnvApiKeyVarName("xiaomi") ?? resolveApiKeyFromProfiles({
|
|
3052
|
+
provider: "xiaomi",
|
|
3053
|
+
store: authStore
|
|
3054
|
+
});
|
|
3055
|
+
if (xiaomiKey) providers.xiaomi = {
|
|
3056
|
+
...buildXiaomiProvider(),
|
|
3057
|
+
apiKey: xiaomiKey
|
|
3058
|
+
};
|
|
3059
|
+
const cloudflareProfiles = listProfilesForProvider(authStore, "cloudflare-ai-gateway");
|
|
3060
|
+
for (const profileId of cloudflareProfiles) {
|
|
3061
|
+
const cred = authStore.profiles[profileId];
|
|
3062
|
+
if (cred?.type !== "api_key") continue;
|
|
3063
|
+
const accountId = cred.metadata?.accountId?.trim();
|
|
3064
|
+
const gatewayId = cred.metadata?.gatewayId?.trim();
|
|
3065
|
+
if (!accountId || !gatewayId) continue;
|
|
3066
|
+
const baseUrl = resolveCloudflareAiGatewayBaseUrl({
|
|
3067
|
+
accountId,
|
|
3068
|
+
gatewayId
|
|
3069
|
+
});
|
|
3070
|
+
if (!baseUrl) continue;
|
|
3071
|
+
const apiKey = resolveEnvApiKeyVarName("cloudflare-ai-gateway") ?? cred.key?.trim() ?? "";
|
|
3072
|
+
if (!apiKey) continue;
|
|
3073
|
+
providers["cloudflare-ai-gateway"] = {
|
|
3074
|
+
baseUrl,
|
|
3075
|
+
api: "anthropic-messages",
|
|
3076
|
+
apiKey,
|
|
3077
|
+
models: [buildCloudflareAiGatewayModelDefinition()]
|
|
3078
|
+
};
|
|
3079
|
+
break;
|
|
3080
|
+
}
|
|
3081
|
+
const ollamaKey = resolveEnvApiKeyVarName("ollama") ?? resolveApiKeyFromProfiles({
|
|
3082
|
+
provider: "ollama",
|
|
3083
|
+
store: authStore
|
|
3084
|
+
});
|
|
3085
|
+
if (ollamaKey) providers.ollama = {
|
|
3086
|
+
...await buildOllamaProvider(),
|
|
3087
|
+
apiKey: ollamaKey
|
|
3088
|
+
};
|
|
3089
|
+
return providers;
|
|
3090
|
+
}
|
|
3091
|
+
async function resolveImplicitCopilotProvider(params) {
|
|
3092
|
+
const env = params.env ?? process.env;
|
|
3093
|
+
const authStore = ensureAuthProfileStore(params.agentDir, { allowKeychainPrompt: false });
|
|
3094
|
+
const hasProfile = listProfilesForProvider(authStore, "github-copilot").length > 0;
|
|
3095
|
+
const githubToken = (env.COPILOT_GITHUB_TOKEN ?? env.GH_TOKEN ?? env.GITHUB_TOKEN ?? "").trim();
|
|
3096
|
+
if (!hasProfile && !githubToken) return null;
|
|
3097
|
+
let selectedGithubToken = githubToken;
|
|
3098
|
+
if (!selectedGithubToken && hasProfile) {
|
|
3099
|
+
const profileId = listProfilesForProvider(authStore, "github-copilot")[0];
|
|
3100
|
+
const profile = profileId ? authStore.profiles[profileId] : void 0;
|
|
3101
|
+
if (profile && profile.type === "token") selectedGithubToken = profile.token;
|
|
3102
|
+
}
|
|
3103
|
+
let baseUrl = DEFAULT_COPILOT_API_BASE_URL;
|
|
3104
|
+
if (selectedGithubToken) try {
|
|
3105
|
+
baseUrl = (await resolveCopilotApiToken({
|
|
3106
|
+
githubToken: selectedGithubToken,
|
|
3107
|
+
env
|
|
3108
|
+
})).baseUrl;
|
|
3109
|
+
} catch {
|
|
3110
|
+
baseUrl = DEFAULT_COPILOT_API_BASE_URL;
|
|
3111
|
+
}
|
|
3112
|
+
return {
|
|
3113
|
+
baseUrl,
|
|
3114
|
+
models: []
|
|
3115
|
+
};
|
|
3116
|
+
}
|
|
3117
|
+
async function resolveImplicitBedrockProvider(params) {
|
|
3118
|
+
const env = params.env ?? process.env;
|
|
3119
|
+
const discoveryConfig = params.config?.models?.bedrockDiscovery;
|
|
3120
|
+
const enabled = discoveryConfig?.enabled;
|
|
3121
|
+
const hasAwsCreds = resolveAwsSdkEnvVarName(env) !== void 0;
|
|
3122
|
+
if (enabled === false) return null;
|
|
3123
|
+
if (enabled !== true && !hasAwsCreds) return null;
|
|
3124
|
+
const region = discoveryConfig?.region ?? env.AWS_REGION ?? env.AWS_DEFAULT_REGION ?? "us-east-1";
|
|
3125
|
+
const models = await discoverBedrockModels({
|
|
3126
|
+
region,
|
|
3127
|
+
config: discoveryConfig
|
|
3128
|
+
});
|
|
3129
|
+
if (models.length === 0) return null;
|
|
3130
|
+
return {
|
|
3131
|
+
baseUrl: `https://bedrock-runtime.${region}.amazonaws.com`,
|
|
3132
|
+
api: "bedrock-converse-stream",
|
|
3133
|
+
auth: "aws-sdk",
|
|
3134
|
+
models
|
|
3135
|
+
};
|
|
3136
|
+
}
|
|
3137
|
+
|
|
3138
|
+
//#endregion
|
|
3139
|
+
//#region src/agents/model-selection.ts
|
|
3140
|
+
const ANTHROPIC_MODEL_ALIASES = {
|
|
3141
|
+
"opus-4.6": "claude-opus-4-6",
|
|
3142
|
+
"opus-4.5": "claude-opus-4-5",
|
|
3143
|
+
"sonnet-4.5": "claude-sonnet-4-5"
|
|
3144
|
+
};
|
|
3145
|
+
function normalizeProviderId(provider) {
|
|
3146
|
+
const normalized = provider.trim().toLowerCase();
|
|
3147
|
+
if (normalized === "z.ai" || normalized === "z-ai") return "zai";
|
|
3148
|
+
if (normalized === "opencode-zen") return "opencode";
|
|
3149
|
+
if (normalized === "qwen") return "qwen-portal";
|
|
3150
|
+
if (normalized === "kimi-code") return "kimi-coding";
|
|
3151
|
+
return normalized;
|
|
3152
|
+
}
|
|
3153
|
+
function normalizeAnthropicModelId(model) {
|
|
3154
|
+
const trimmed = model.trim();
|
|
3155
|
+
if (!trimmed) return trimmed;
|
|
3156
|
+
return ANTHROPIC_MODEL_ALIASES[trimmed.toLowerCase()] ?? trimmed;
|
|
3157
|
+
}
|
|
3158
|
+
function normalizeProviderModelId(provider, model) {
|
|
3159
|
+
if (provider === "anthropic") return normalizeAnthropicModelId(model);
|
|
3160
|
+
if (provider === "google") return normalizeGoogleModelId(model);
|
|
3161
|
+
return model;
|
|
3162
|
+
}
|
|
3163
|
+
function parseModelRef(raw, defaultProvider) {
|
|
3164
|
+
const trimmed = raw.trim();
|
|
3165
|
+
if (!trimmed) return null;
|
|
3166
|
+
const slash = trimmed.indexOf("/");
|
|
3167
|
+
if (slash === -1) {
|
|
3168
|
+
const provider = normalizeProviderId(defaultProvider);
|
|
3169
|
+
return {
|
|
3170
|
+
provider,
|
|
3171
|
+
model: normalizeProviderModelId(provider, trimmed)
|
|
3172
|
+
};
|
|
3173
|
+
}
|
|
3174
|
+
const provider = normalizeProviderId(trimmed.slice(0, slash).trim());
|
|
3175
|
+
const model = trimmed.slice(slash + 1).trim();
|
|
3176
|
+
if (!provider || !model) return null;
|
|
3177
|
+
return {
|
|
3178
|
+
provider,
|
|
3179
|
+
model: normalizeProviderModelId(provider, model)
|
|
3180
|
+
};
|
|
3181
|
+
}
|
|
3182
|
+
|
|
3183
|
+
//#endregion
|
|
3184
|
+
export { resolveStateDir as $, defaultRuntime as A, danger as B, formatSpawnError as C, logInfo as D, logError as E, resolveConfigDir as F, getChildLogger as G, logVerbose as H, resolveUserPath as I, STATE_DIR as J, registerLogTransport as K, shortenHomeInString as L, ensureDir as M, formatTerminalLink as N, logWarn as O, normalizeE164 as P, resolveOAuthDir as Q, sleep as R, runExec as S, logDebug as T, shouldLogVerbose as U, info as V, success as W, resolveDefaultConfigCandidates as X, resolveConfigPath as Y, resolveGatewayPort as Z, isTruthyEnvValue as _, resolveImplicitProviders as a, parseAgentSessionKey as at, resolveDefaultAgentId as b, resolveOpenClawAgentDir as c, getChatChannelMeta as ct, loadShellEnvFallback as d, getActivePluginRegistry as dt, DEFAULT_ACCOUNT_ID as et, resolveShellEnvFallbackTimeoutMs as f, requireActivePluginRegistry as ft, productNameLower as g, formatCliCommand as h, resolveImplicitCopilotProvider as i, resolveAgentIdFromSessionKey as it, CONFIG_DIR as j, createSubsystemLogger as k, DEFAULT_CONTEXT_TOKENS as l, normalizeAnyChannelId as lt, shouldEnableShellEnvFallback as m, normalizeProviders as n, normalizeAccountId as nt, listProfilesForProvider as o, CHANNEL_IDS as ot, shouldDeferShellEnvFallback as p, toPinoLikeLogger as q, resolveImplicitBedrockProvider as r, normalizeAgentId as rt, ensureAuthProfileStore as s, CHAT_CHANNEL_ORDER as st, parseModelRef as t, DEFAULT_AGENT_ID as tt, getShellPathFromLoginShell as u, normalizeChatChannelId as ut, resolveAgentConfig as v, spawnWithFallback as w, runCommandWithTimeout as x, resolveAgentWorkspaceDir as y, sliceUtf16Safe as z };
|