@noxsoft/anima 2.0.2 → 2.0.4
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/README.md +1260 -28
- package/dist/accounts-Bth3PpPD.js +260 -0
- package/dist/accounts-D8CPKNkN.js +259 -0
- package/dist/acp-cli-ByK6lS6c.js +1081 -0
- package/dist/acp-cli-CaQCjIw4.js +1084 -0
- package/dist/agent-BgIkqd3F.js +725 -0
- package/dist/agent-N5BDcge4.js +725 -0
- package/dist/agent-events-COH7NDW2.js +182 -0
- package/dist/agent-scope-CPphqq-U.js +452 -0
- package/dist/agent-scope-DZgptr9J.js +452 -0
- package/dist/agent-scope-cj2QCT6R.js +112 -0
- package/dist/agents-NEudYMdg.js +774 -0
- package/dist/agents.config-Bujs-NIy.js +182 -0
- package/dist/agents.config-jp7OLssr.js +182 -0
- package/dist/argv-BMZMiW7v.js +73 -0
- package/dist/audit-C-UJhfdv.js +2401 -0
- package/dist/audit-CeCO7SK5.js +2401 -0
- package/dist/auth-BNZsOHGF.js +648 -0
- package/dist/auth-DMPZWzEa.js +639 -0
- package/dist/auth-choice-5VnaGMD-.js +2681 -0
- package/dist/auth-choice-DA2k4vs8.js +2681 -0
- package/dist/auth-health-B7FqA26_.js +149 -0
- package/dist/auth-health-VO_MPqVX.js +149 -0
- package/dist/auth-profiles-BDrNYX_n.js +1564 -0
- package/dist/auth-profiles-CxSHydjn.js +2689 -0
- package/dist/banner-BtDZPRzi.js +294 -0
- package/dist/browser-cli-8yQMpxb8.js +1679 -0
- package/dist/browser-cli-Czg3JtDH.js +1676 -0
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +16 -16
- package/dist/bundled/bootstrap-extra-files/handler.js +4 -4
- package/dist/bundled/command-logger/handler.js +1 -1
- package/dist/bundled/session-memory/handler.js +5 -5
- package/dist/call-BIzCaKZb.js +282 -0
- package/dist/call-BYDpTVCZ.js +282 -0
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/catalog-CqKiUgu6.js +185 -0
- package/dist/catalog-DMfEg-oK.js +185 -0
- package/dist/channel-options-BrtCtyrT.js +32 -0
- package/dist/channel-options-CO21Gl8p.js +33 -0
- package/dist/channel-selection-Bbm1lq3P.js +51 -0
- package/dist/channel-selection-CqcX7Ocw.js +51 -0
- package/dist/channel-web-DrsT6OAE.js +2162 -0
- package/dist/channels-cli-Juyh1S6n.js +1304 -0
- package/dist/channels-cli-zNvi1m5c.js +1306 -0
- package/dist/channels-status-issues-CqzqshW4.js +18 -0
- package/dist/channels-status-issues-DdJdO866.js +18 -0
- package/dist/chrome-C4dOMO8z.js +1601 -0
- package/dist/chrome-DdcDzAtH.js +1629 -0
- package/dist/chrome-U3DRzjJD.js +1601 -0
- package/dist/chunk-D2nLsrEW.js +348 -0
- package/dist/clack-prompter-BI3RDW5w.js +92 -0
- package/dist/clack-prompter-Dwr1m_IZ.js +92 -0
- package/dist/cli/daemon-cli.js +1 -1
- package/dist/cli-C3cpDaz8.js +99 -0
- package/dist/cli-CjWUGdGC.js +101 -0
- package/dist/cli-session-BVjY_XrW.js +5463 -0
- package/dist/cli-session-gtuYN2Iq.js +5408 -0
- package/dist/client-Dswwze5_.js +1692 -0
- package/dist/client-LRKFjo4A.js +1692 -0
- package/dist/clipboard-BZKS9O1u.js +31 -0
- package/dist/clipboard-DES8b1AM.js +31 -0
- package/dist/command-format-CP1YTNCl.js +52 -0
- package/dist/command-format-CVL4K5cj.js +52 -0
- package/dist/command-format-G6N2zghg.js +38 -0
- package/dist/command-registry-BBvNvysr.js +248 -0
- package/dist/commands-AZ3n8Y2c.js +726 -0
- package/dist/commands-BMnD_QRY.js +726 -0
- package/dist/commands-registry-cFqZ6Ib4.js +766 -0
- package/dist/commands-registry-q13H7ng5.js +766 -0
- package/dist/common-CX5458fH.js +287 -0
- package/dist/common-DJbnT8ws.js +287 -0
- package/dist/completion-cli-BADRBcIl.js +432 -0
- package/dist/completion-cli-DMQgiObF.js +431 -0
- package/dist/config-CU-Axg8P.js +5704 -0
- package/dist/config-DaqbUdkI.js +5705 -0
- package/dist/config-cli-BPlbwiuA.js +244 -0
- package/dist/config-cli-DXgZJkPU.js +247 -0
- package/dist/config-guard-Ba49JNds.js +76 -0
- package/dist/config-guard-Cu0qMKZJ.js +93 -0
- package/dist/config-kVVm5EYV.js +6523 -0
- package/dist/config-sync-CzLnLTXt.js +91 -0
- package/dist/config-sync-DuydxPWx.js +91 -0
- package/dist/configure-CHgacLyi.js +960 -0
- package/dist/configure-DfHXDa1L.js +959 -0
- package/dist/context-DzgXOckU.js +60 -0
- package/dist/control-service-8_wKHwBa.js +72 -0
- package/dist/control-service-BtL1Jto_.js +72 -0
- package/dist/cron-cli-BCzSR2c0.js +448 -0
- package/dist/cron-cli-CCWNkykU.js +451 -0
- package/dist/daemon-cli-Bjkbu9Vy.js +565 -0
- package/dist/daemon-cli-CmlHcC1J.js +566 -0
- package/dist/daemon-cli.js +16 -16
- package/dist/daemon-runtime-C0tz7VAC.js +460 -0
- package/dist/daemon-runtime-rUTqCVwJ.js +460 -0
- package/dist/deliver-BBggsviM.js +1097 -0
- package/dist/deliver-CePITOl8.js +1162 -0
- package/dist/deliver-DFnVaetP.js +1097 -0
- package/dist/delivery-queue-BJQK3oh5.js +220 -0
- package/dist/deps-CeEKhrp7.js +42 -0
- package/dist/devices-cli-DQrDMrZH.js +198 -0
- package/dist/devices-cli-Oe-A1Dv0.js +195 -0
- package/dist/diagnostics-DxMFrBLO.js +35 -0
- package/dist/diagnostics-m79ZlMmZ.js +35 -0
- package/dist/directory-cli-BL6h8cGF.js +246 -0
- package/dist/directory-cli-Cjgmi_sj.js +243 -0
- package/dist/dispatcher-DAFbQM-c.js +100 -0
- package/dist/dispatcher-DNd40gUn.js +100 -0
- package/dist/dist-CqDI82ei.js +929 -0
- package/dist/dist-DnHRxR5U.js +929 -0
- package/dist/dns-cli-CFtV3BXK.js +200 -0
- package/dist/dns-cli-NyIHvQ5S.js +197 -0
- package/dist/dock-BdXLb5oY.js +753 -0
- package/dist/dock-jYICmNcI.js +753 -0
- package/dist/docs-cli-CrOaIK_H.js +161 -0
- package/dist/docs-cli-D_cmJDSr.js +159 -0
- package/dist/doctor-BpGxKrBl.js +1815 -0
- package/dist/doctor-D12wNQPU.js +1813 -0
- package/dist/doctor-completion-DeOfofek.js +92 -0
- package/dist/doctor-completion-DwjqdEcK.js +92 -0
- package/dist/doctor-config-flow-BI3mpkbd.js +1232 -0
- package/dist/doctor-config-flow-wMHheFkC.js +1232 -0
- package/dist/engine-BCtL-AMw.js +563 -0
- package/dist/engine-Bk_UT413.js +563 -0
- package/dist/entry.js +5 -5
- package/dist/env-v6411I8h.js +32 -0
- package/dist/exec-B7sUS164.js +1167 -0
- package/dist/exec-approvals-CroGJRUg.js +1221 -0
- package/dist/exec-approvals-cli-BTxF_RsH.js +371 -0
- package/dist/exec-approvals-cli-n1gyGwH2.js +368 -0
- package/dist/exec-mhSykkaa.js +255 -0
- package/dist/extensionAPI.js +3 -3
- package/dist/frontmatter-BmHq0vRD.js +204 -0
- package/dist/gateway-cli-DDBadlrS.js +19971 -0
- package/dist/gateway-cli-IZNkOMBe.js +19972 -0
- package/dist/gateway-rpc-Dtx8HN-n.js +28 -0
- package/dist/gateway-rpc-L2PVSqGj.js +28 -0
- package/dist/github-copilot-auth-DKyqDaGU.js +1418 -0
- package/dist/github-copilot-auth-DXpOMSd3.js +1418 -0
- package/dist/gmail-setup-utils-BKNczIJ9.js +428 -0
- package/dist/gmail-setup-utils-co0ppccC.js +428 -0
- package/dist/health-Bm8ZTvC3.js +1253 -0
- package/dist/health-DUf1gt4E.js +1258 -0
- package/dist/health-format-BksT6F68.js +208 -0
- package/dist/health-format-uzh1xYLD.js +208 -0
- package/dist/heartbeat-visibility-1TJb1Zao.js +98 -0
- package/dist/heartbeat-visibility-CwodtdcX.js +98 -0
- package/dist/help-format-C6cv_aZp.js +17 -0
- package/dist/helpers-N-uSFKOn.js +10 -0
- package/dist/hooks-cli-1POsXqOl.js +993 -0
- package/dist/hooks-cli-BGjILbze.js +991 -0
- package/dist/hooks-status-DE07n5RC.js +356 -0
- package/dist/hooks-status-Du-d1jde.js +356 -0
- package/dist/image-ops-B_AYV3tp.js +541 -0
- package/dist/image-ops-Bp0C6Mvr.js +541 -0
- package/dist/index.js +82 -82
- package/dist/init-9A0s7bWG.js +122 -0
- package/dist/init-DoyCHJDC.js +122 -0
- package/dist/installs-D1C9wHAq.js +383 -0
- package/dist/installs-Dh4dHayM.js +383 -0
- package/dist/ipv4-DCItfaJo.js +1964 -0
- package/dist/ipv4-DSOUVx0i.js +1964 -0
- package/dist/lanes-BvSnHq2h.js +232 -0
- package/dist/lifecycle-core-BY4WIf9g.js +388 -0
- package/dist/lifecycle-core-TQKyXO-6.js +387 -0
- package/dist/links-CNu_8RZl.js +15 -0
- package/dist/links-D2tt2ouh.js +15 -0
- package/dist/llm-slug-generator.js +4 -4
- package/dist/logging-BIeRw0WR.js +15 -0
- package/dist/logging-C7lb3Vjc.js +15 -0
- package/dist/login-DXWKewA2.js +59 -0
- package/dist/login-Fhh4uWmf.js +61 -0
- package/dist/login-pPs3UO38.js +61 -0
- package/dist/login-qr-CevLD8cV.js +326 -0
- package/dist/login-qr-GF2JMIy-.js +323 -0
- package/dist/login-qr-ZYYKD6Yt.js +321 -0
- package/dist/logs-cli-CzXbX8HZ.js +242 -0
- package/dist/logs-cli-D9ngH9PF.js +245 -0
- package/dist/manager-BD5rA3w0.js +3244 -0
- package/dist/manager-BDPgBQSH.js +3246 -0
- package/dist/manager-DRWMWM--.js +3244 -0
- package/dist/manifest-registry-DbvPaBXY.js +748 -0
- package/dist/manifest-registry-kHX_MFa1.js +748 -0
- package/dist/markdown-tables-CqwihY2m.js +347 -0
- package/dist/markdown-tables-DJV7eAJZ.js +348 -0
- package/dist/media-lUqN-0O9.js +1342 -0
- package/dist/memory-cli-BLXSpgnN.js +868 -0
- package/dist/memory-cli-BcGVkkRJ.js +869 -0
- package/dist/message-channel-D_jIO87f.js +110 -0
- package/dist/migrate-BpVOar4L.js +157 -0
- package/dist/migrate-CkgGDkWy.js +157 -0
- package/dist/model-selection-Cqt6aJ0G.js +2691 -0
- package/dist/models-CExsNQPH.js +2510 -0
- package/dist/models-cli-Ba3Jmwev.js +2739 -0
- package/dist/models-cli-iDAlsbL2.js +258 -0
- package/dist/net-0A_zcaQD.js +218 -0
- package/dist/node-cli-ATmwCXIk.js +1319 -0
- package/dist/node-cli-DYFR_V25.js +1322 -0
- package/dist/node-service-CN4LqR1A.js +67 -0
- package/dist/node-service-CWt3MdSC.js +67 -0
- package/dist/nodes-cli-BeVmhTz3.js +1197 -0
- package/dist/nodes-cli-QeJIfa18.js +1200 -0
- package/dist/nodes-screen-DHyWAlla.js +234 -0
- package/dist/nodes-screen-qs3jRBPk.js +234 -0
- package/dist/note-CSlg2BnB.js +73 -0
- package/dist/note-Ctvglhp1.js +73 -0
- package/dist/npm-registry-spec-DQd4M22q.js +351 -0
- package/dist/npm-registry-spec-PxisIMts.js +351 -0
- package/dist/onboard-DeruD10m.js +1166 -0
- package/dist/onboard-SAcu5N6N.js +1165 -0
- package/dist/onboard-channels-C4iSfFXR.js +672 -0
- package/dist/onboard-channels-oVTVgoyg.js +672 -0
- package/dist/onboard-helpers-B8roRwLP.js +365 -0
- package/dist/onboard-helpers-Dgh26hgP.js +365 -0
- package/dist/onboarding-Bi-ac8we.js +911 -0
- package/dist/onboarding-C2gjB2u8.js +910 -0
- package/dist/orchestrator-DlbAYMQP.js +357 -0
- package/dist/orchestrator-DlwVRVDA.js +357 -0
- package/dist/outbound-CkKgc6iR.js +2062 -0
- package/dist/outbound-Vfm5yDh3.js +214 -0
- package/dist/outbound-bs_VK51X.js +214 -0
- package/dist/outbound-send-deps-DDjiMfEL.js +55 -0
- package/dist/pairing-cli-CJYeuEik.js +118 -0
- package/dist/pairing-cli-mqopHI8s.js +121 -0
- package/dist/pairing-store-BsXzUDPv.js +388 -0
- package/dist/pairing-store-DoNj00-X.js +388 -0
- package/dist/path-env-C_xpiG8l.js +89 -0
- package/dist/path-env-DSSMHu5A.js +89 -0
- package/dist/paths-B1vRVCad.js +126 -0
- package/dist/paths-BMuHNFxg.js +238 -0
- package/dist/paths-BXQQzXGQ.js +129 -0
- package/dist/paths-Buw_geoe.js +54 -0
- package/dist/paths-DA9WYabg.js +222 -0
- package/dist/paths-DfQGx0_k.js +129 -0
- package/dist/pi-auth-json-DOPW3e4X.js +78 -0
- package/dist/pi-auth-json-MruLmI_X.js +82 -0
- package/dist/pi-auth-json-lae_wwwo.js +80 -0
- package/dist/pi-model-discovery-7q0GxMrp.js +3 -0
- package/dist/pi-tools.policy-Csmla32P.js +200 -0
- package/dist/pi-tools.policy-xYdDLEv9.js +200 -0
- package/dist/plugin-auto-enable-CViVVWgg.js +282 -0
- package/dist/plugin-auto-enable-CjZ238UI.js +282 -0
- package/dist/plugin-registry-B4Aw2hzq.js +32 -0
- package/dist/plugin-registry-DW81arxW.js +32 -0
- package/dist/plugin-sdk/cli/cli-name.d.ts +1 -1
- package/dist/plugin-sdk/config/paths.d.ts +2 -2
- package/dist/plugin-sdk/index.js +7 -7
- package/dist/plugins-DhcGAPDB.js +38 -0
- package/dist/plugins-DtghNRtM.js +168 -0
- package/dist/plugins-cli-4vWTmOAb.js +736 -0
- package/dist/plugins-cli-CdTMbP0X.js +734 -0
- package/dist/polls-D6eCdatA.js +1343 -0
- package/dist/ports-BtZx-JKD.js +96 -0
- package/dist/ports-C8bKN8s0.js +96 -0
- package/dist/ports-DHiKnPRX.js +344 -0
- package/dist/ports-vd93M_Pt.js +317 -0
- package/dist/program-CX3aUVeb.js +176 -0
- package/dist/program-context-BPos0ivo.js +496 -0
- package/dist/progress-oiAjiiNi.js +133 -0
- package/dist/prompt-style-Cm4wOtKm.js +9 -0
- package/dist/pw-ai-4QbK5YFe.js +1865 -0
- package/dist/pw-ai-BWz3Cxt7.js +1868 -0
- package/dist/pw-ai-C83HBue2.js +1867 -0
- package/dist/qmd-manager-BcMeZiGD.js +938 -0
- package/dist/qmd-manager-CPypGJ0P.js +935 -0
- package/dist/qmd-manager-CRrSkfia.js +937 -0
- package/dist/register.agent-DDY8KJhn.js +265 -0
- package/dist/register.agent-DKawm-9d.js +1003 -0
- package/dist/register.anima-CEWUo29k.js +193 -0
- package/dist/register.anima-DBWz2rk_.js +193 -0
- package/dist/register.configure-BX67qV8k.js +103 -0
- package/dist/register.configure-CWsySuiq.js +101 -0
- package/dist/register.maintenance-0k-ZNhDg.js +543 -0
- package/dist/register.maintenance-BIwx1fzX.js +543 -0
- package/dist/register.message-CXPsoakA.js +657 -0
- package/dist/register.message-DA3jvfgI.js +660 -0
- package/dist/register.onboard-C4HG7Hqv.js +170 -0
- package/dist/register.onboard-GOpdif-j.js +170 -0
- package/dist/register.setup-B17vZT7C.js +175 -0
- package/dist/register.setup-GJyUDCqh.js +175 -0
- package/dist/register.status-health-sessions-D5876dGx.js +313 -0
- package/dist/register.status-health-sessions-lOewVIZR.js +142 -0
- package/dist/register.subclis-Dwnujj5C.js +255 -0
- package/dist/reply-CR5T_oQJ.js +32212 -0
- package/dist/reply-prefix-BcrS4Umd.js +100 -0
- package/dist/reply-prefix-Btb5o2NH.js +100 -0
- package/dist/reply-r089HuRA.js +32212 -0
- package/dist/routes-B4czFzIb.js +1820 -0
- package/dist/routes-ucJWAk5O.js +1820 -0
- package/dist/rpc-BnKxnQ0v.js +70 -0
- package/dist/rpc-DgE-xnyx.js +70 -0
- package/dist/run-main-B74kv84C.js +371 -0
- package/dist/runtime-guard-CKFdts2L.js +60 -0
- package/dist/sandbox-CJTS3er6.js +858 -0
- package/dist/sandbox-DBSiVHt_.js +859 -0
- package/dist/sandbox-cli-CrkjyU5M.js +461 -0
- package/dist/sandbox-cli-D1r5y6Sz.js +458 -0
- package/dist/security-cli-BZUdnkhn.js +462 -0
- package/dist/security-cli-DS09ebvA.js +465 -0
- package/dist/server-context-C0xZbYhg.js +824 -0
- package/dist/server-context-DVh2z7om.js +824 -0
- package/dist/server-node-events-bu9lpkMH.js +233 -0
- package/dist/server-node-events-i1Rrww31.js +231 -0
- package/dist/service-CJJwLEor.js +642 -0
- package/dist/service-DxLxBhaU.js +642 -0
- package/dist/service-audit-DB4Y3Ekp.js +488 -0
- package/dist/service-audit-M8y4TXVb.js +488 -0
- package/dist/session-CGxOLFs2.js +179 -0
- package/dist/session-DTTbdKb0.js +181 -0
- package/dist/session-cost-usage-FcdJl9c3.js +600 -0
- package/dist/session-cost-usage-qdfsGU2a.js +600 -0
- package/dist/session-yOhWcsD2.js +181 -0
- package/dist/sessions-B-Cu7JZq.js +1296 -0
- package/dist/sessions-BgLN4KFr.js +180 -0
- package/dist/sessions-CnRjwdVr.js +1296 -0
- package/dist/sessions-wRKla1Qh.js +2038 -0
- package/dist/shared-DS3UaJSP.js +66 -0
- package/dist/shared-DxNHzky3.js +77 -0
- package/dist/shared-Qpt4hUDi.js +66 -0
- package/dist/shared-kzrojZ1B.js +77 -0
- package/dist/skill-scanner-DLJji5Ye.js +263 -0
- package/dist/skills-BWFIEp4j.js +807 -0
- package/dist/skills-DV4zKdCx.js +808 -0
- package/dist/skills-cli-BY53ILm2.js +289 -0
- package/dist/skills-cli-CO3gxl8A.js +286 -0
- package/dist/skills-status-DX5pcqY3.js +166 -0
- package/dist/skills-status-zhcKzGkp.js +166 -0
- package/dist/sqlite-B6MojU1I.js +321 -0
- package/dist/sqlite-CuprTGR7.js +453 -0
- package/dist/sqlite-dzD-jMjs.js +368 -0
- package/dist/start-Cu3aLoSf.js +297 -0
- package/dist/start-Dz7tMAl8.js +296 -0
- package/dist/status-CaSxhxfV.js +2132 -0
- package/dist/status-D2C0JCX3.js +2137 -0
- package/dist/status-DlFMsQzh.js +27 -0
- package/dist/status-G0CITnKR.js +27 -0
- package/dist/status.update-CHjhVxJY.js +79 -0
- package/dist/status.update-DVFelehi.js +79 -0
- package/dist/subagent-registry-3Xb4el-8.js +14 -0
- package/dist/subagent-registry-CdSjz14I.js +2760 -0
- package/dist/subagent-registry-DNDhbHWi.js +2759 -0
- package/dist/subsystem-DfKstnEK.js +860 -0
- package/dist/system-cli-B5mt0FWa.js +82 -0
- package/dist/system-cli-Dg3UQ3Zz.js +79 -0
- package/dist/systemd-B43AvOGx.js +452 -0
- package/dist/systemd-RpPE0XGg.js +452 -0
- package/dist/systemd-hints-DMJT-Bbc.js +36 -0
- package/dist/systemd-hints-vRInKcz9.js +36 -0
- package/dist/systemd-linger-Dzyxqsod.js +75 -0
- package/dist/systemd-linger-EujbmI5A.js +75 -0
- package/dist/table-DhXHfRX2.js +279 -0
- package/dist/table-bWCLW-3P.js +279 -0
- package/dist/timeout-Ddn-5kAO.js +232 -0
- package/dist/tokens-3psI_Qk2.js +14 -0
- package/dist/tokens-BaM53PEx.js +14 -0
- package/dist/trash-Bmxs1Rnm.js +23 -0
- package/dist/trash-C39a6hKA.js +23 -0
- package/dist/tui-BHgBWhHE.js +3894 -0
- package/dist/tui-cli-B9Sq5-cC.js +50 -0
- package/dist/tui-cli-Dw7v4JoJ.js +47 -0
- package/dist/tui-mUwDwqvd.js +3894 -0
- package/dist/update-DF0GHG0j.js +317 -0
- package/dist/update-DoZLVjva.js +317 -0
- package/dist/update-check-Bt1dVPVN.js +400 -0
- package/dist/update-check-D5qAKes7.js +400 -0
- package/dist/update-cli-BNu2Oi7H.js +1105 -0
- package/dist/update-cli-D36AmALA.js +1105 -0
- package/dist/update-runner-CNQQaTwA.js +894 -0
- package/dist/update-runner-CvxZmbu-.js +894 -0
- package/dist/usage-BGCwNnjk.js +4516 -0
- package/dist/utils-DZ8pnOD5.js +243 -0
- package/dist/web-B5QG839O.js +46842 -0
- package/dist/web-Cmnvk9v0.js +2203 -0
- package/dist/web-Cv2KnTnL.js +63 -0
- package/dist/webhooks-cli-B6y89Pj_.js +319 -0
- package/dist/webhooks-cli-BDzHON4w.js +316 -0
- package/dist/whatsapp-actions-C_5MwVxM.js +45 -0
- package/dist/whatsapp-actions-hgYA12To.js +53 -0
- package/dist/whatsapp-actions-zTiVOoOV.js +49 -0
- package/dist/widearea-dns-BeIdnISJ.js +127 -0
- package/dist/widearea-dns-CF1gxpJ-.js +127 -0
- package/dist/workspace-DLna1IxR.js +649 -0
- package/dist/ws-log-Q4wO1Ztb.js +267 -0
- package/dist/ws-log-xF0kxDzp.js +267 -0
- package/package.json +1 -2
- package/dist/accounts-Cc5E4IDO.js +0 -260
- package/dist/accounts-CcVrwKqv.js +0 -259
- package/dist/acp-cli-DvphOKuh.js +0 -1081
- package/dist/acp-cli-p28pQ65a.js +0 -1084
- package/dist/agent-Cj7uDJaZ.js +0 -725
- package/dist/agent-Cuj9-2sT.js +0 -725
- package/dist/agent-events-BEBQsyE5.js +0 -182
- package/dist/agent-scope-BVf4aSwY.js +0 -112
- package/dist/agent-scope-OZi7lb8S.js +0 -452
- package/dist/agent-scope-V1bi9OYL.js +0 -452
- package/dist/agents-BUWqn_Ui.js +0 -774
- package/dist/agents.config-Dvo2ULxs.js +0 -182
- package/dist/agents.config-d6H0_3oj.js +0 -182
- package/dist/argv-DqUHKf0o.js +0 -73
- package/dist/audit-C6okOOSh.js +0 -2401
- package/dist/audit-VWjIdwC7.js +0 -2401
- package/dist/auth-91o2YM96.js +0 -648
- package/dist/auth-choice-CAmACV13.js +0 -2681
- package/dist/auth-choice-p3SeHPj2.js +0 -2681
- package/dist/auth-health-B_jXrWe6.js +0 -149
- package/dist/auth-health-DCicUKYR.js +0 -149
- package/dist/auth-lZ26wsbN.js +0 -639
- package/dist/auth-profiles-CCDD56dU.js +0 -1564
- package/dist/auth-profiles-DxI8L7bs.js +0 -2689
- package/dist/banner-Cohn04J6.js +0 -294
- package/dist/browser-cli-DANzjztE.js +0 -1676
- package/dist/browser-cli-WjsVH741.js +0 -1679
- package/dist/call-BAHvlu2G.js +0 -282
- package/dist/call-Ct7EGP_L.js +0 -282
- package/dist/catalog-BAayBt1L.js +0 -185
- package/dist/catalog-BNsf97BM.js +0 -185
- package/dist/channel-options-Dx9nPlX8.js +0 -33
- package/dist/channel-options-ZdvXrTGs.js +0 -32
- package/dist/channel-selection-CujyiWGM.js +0 -51
- package/dist/channel-selection-DfGpCyh2.js +0 -51
- package/dist/channel-web-CC0hkgkR.js +0 -2162
- package/dist/channels-cli-D7lNBpIb.js +0 -1304
- package/dist/channels-cli-DUPG8WDv.js +0 -1306
- package/dist/channels-status-issues-DBc1pU_R.js +0 -18
- package/dist/channels-status-issues-DjO9MHIG.js +0 -18
- package/dist/chrome-Bi6iZ5sG.js +0 -1601
- package/dist/chrome-DNSv7Cpy.js +0 -1629
- package/dist/chrome-DScZx4Lk.js +0 -1601
- package/dist/chunk-mxPVo000.js +0 -348
- package/dist/clack-prompter-B0kl7shw.js +0 -92
- package/dist/clack-prompter-B1YxZdRy.js +0 -92
- package/dist/cli-CfHUkOD0.js +0 -101
- package/dist/cli-ClMrIh6l.js +0 -99
- package/dist/cli-session-BkPTd9Pk.js +0 -5463
- package/dist/cli-session-Dd8DKb5a.js +0 -5408
- package/dist/client-C1avc0vD.js +0 -1692
- package/dist/client-CC94YZrT.js +0 -1692
- package/dist/clipboard-B2fBy8tG.js +0 -31
- package/dist/clipboard-BbGnZskJ.js +0 -31
- package/dist/command-format-Clp46jkj.js +0 -38
- package/dist/command-format-DELazozB.js +0 -52
- package/dist/command-format-SkzzRqR1.js +0 -52
- package/dist/command-registry-DZ4hkmA0.js +0 -248
- package/dist/commands-DtYZJSPn.js +0 -568
- package/dist/commands-Dujk1JmY.js +0 -568
- package/dist/commands-registry-Bd0xbvwG.js +0 -766
- package/dist/commands-registry-DYfRSVF3.js +0 -766
- package/dist/common-D6bu0zHC.js +0 -287
- package/dist/common-zW9Y2P1B.js +0 -287
- package/dist/completion-cli-tSe7Pmqm.js +0 -431
- package/dist/completion-cli-vn4IScs5.js +0 -432
- package/dist/config-C8rUDJXY.js +0 -5704
- package/dist/config-CLZ_XGVw.js +0 -6523
- package/dist/config-SY8M0kM_.js +0 -5705
- package/dist/config-cli-1V7D2Wsw.js +0 -247
- package/dist/config-cli-CjWEC81L.js +0 -244
- package/dist/config-guard-BW2gpKj_.js +0 -93
- package/dist/config-guard-BvxuzHpo.js +0 -76
- package/dist/config-sync-CoIIbEOe.js +0 -91
- package/dist/config-sync-DvAttep0.js +0 -91
- package/dist/configure-Bf0oupCE.js +0 -959
- package/dist/configure-DRM-7zFf.js +0 -960
- package/dist/context-D5iEFzv9.js +0 -60
- package/dist/control-service-C8m8F9pr.js +0 -72
- package/dist/control-service-DKotCWCg.js +0 -72
- package/dist/cron-cli-DB_FLYHD.js +0 -448
- package/dist/cron-cli-bxm5lrrO.js +0 -451
- package/dist/daemon-cli-1LsOnICv.js +0 -566
- package/dist/daemon-cli-CC2NrJ7a.js +0 -565
- package/dist/daemon-runtime-BXZhtBL9.js +0 -460
- package/dist/daemon-runtime-DW4USC7r.js +0 -460
- package/dist/deliver-B4HuPwJA.js +0 -1162
- package/dist/deliver-LiY5oL52.js +0 -1097
- package/dist/deliver-xrmk7xjh.js +0 -1097
- package/dist/delivery-queue-TnQykYsg.js +0 -220
- package/dist/deps-CMMOiOsF.js +0 -42
- package/dist/devices-cli-Be5he2SA.js +0 -195
- package/dist/devices-cli-z6ecoFe9.js +0 -198
- package/dist/diagnostics-Dj75aEHN.js +0 -35
- package/dist/diagnostics-DlIw6fqD.js +0 -35
- package/dist/directory-cli-CEy-0nxj.js +0 -243
- package/dist/directory-cli-DpzKcigr.js +0 -246
- package/dist/dispatcher-10Shiuz3.js +0 -100
- package/dist/dispatcher-3Jae6AiW.js +0 -100
- package/dist/dns-cli-Bat1pkc-.js +0 -200
- package/dist/dns-cli-NohNyEo0.js +0 -197
- package/dist/dock-DbxBBv30.js +0 -753
- package/dist/dock-cPBY4qGl.js +0 -753
- package/dist/docs-cli-BWp6p-Tq.js +0 -161
- package/dist/docs-cli-x22FnZfL.js +0 -159
- package/dist/doctor-BrT5m_on.js +0 -1815
- package/dist/doctor-Pp2HVnjM.js +0 -1813
- package/dist/doctor-completion-DNTimX9o.js +0 -92
- package/dist/doctor-completion-ylN9QAJ6.js +0 -92
- package/dist/doctor-config-flow-D1w3700T.js +0 -1232
- package/dist/doctor-config-flow-Dq50iE1R.js +0 -1232
- package/dist/engine-B9avUJL5.js +0 -563
- package/dist/engine-BiUQ25D4.js +0 -563
- package/dist/env-0lJfCPsw.js +0 -32
- package/dist/exec-BenD3A5l.js +0 -1167
- package/dist/exec-Bv3pyjeM.js +0 -255
- package/dist/exec-approvals-CdLmKX2R.js +0 -1221
- package/dist/exec-approvals-cli-DXfV6G8H.js +0 -368
- package/dist/exec-approvals-cli-J2cZs10o.js +0 -371
- package/dist/frontmatter-YijVi0FQ.js +0 -204
- package/dist/gateway-cli-DOAbA0pc.js +0 -19972
- package/dist/gateway-cli-QpWtBhQy.js +0 -19971
- package/dist/gateway-rpc-DJKBil9s.js +0 -28
- package/dist/gateway-rpc-DVterpLP.js +0 -28
- package/dist/github-copilot-auth-4IUFp669.js +0 -1418
- package/dist/github-copilot-auth-C9E0IROs.js +0 -1418
- package/dist/gmail-setup-utils-BPo_LkKI.js +0 -428
- package/dist/gmail-setup-utils-D3Yqgor7.js +0 -428
- package/dist/health-BeZnqp6m.js +0 -1258
- package/dist/health-Cn2OoVWZ.js +0 -1253
- package/dist/health-format-CdP99j3Y.js +0 -208
- package/dist/health-format-JEChH08S.js +0 -208
- package/dist/heartbeat-visibility-BL3WAchI.js +0 -98
- package/dist/heartbeat-visibility-CQ9QimI7.js +0 -98
- package/dist/help-format-Dl4bsrLI.js +0 -17
- package/dist/helpers-ZKNRexvX.js +0 -10
- package/dist/hooks-cli-D99hXt7K.js +0 -991
- package/dist/hooks-cli-DMB8RiEO.js +0 -993
- package/dist/hooks-status-B-e96dZj.js +0 -356
- package/dist/hooks-status-C_9sE0ox.js +0 -356
- package/dist/image-ops-Dlt3T7th.js +0 -541
- package/dist/image-ops-omlvdfah.js +0 -541
- package/dist/init-Bm04RagW.js +0 -122
- package/dist/init-CaJBf4p1.js +0 -122
- package/dist/installs-C2iMRBVz.js +0 -383
- package/dist/installs-D-cPGdCw.js +0 -383
- package/dist/ipv4-Bf7NS3QU.js +0 -1964
- package/dist/ipv4-wWNs8IH_.js +0 -1964
- package/dist/lanes-CNxj3tit.js +0 -232
- package/dist/lifecycle-core-B_7XRcvF.js +0 -388
- package/dist/lifecycle-core-By83PVAK.js +0 -387
- package/dist/links-BfjHVTB_.js +0 -15
- package/dist/links-DPGe0OHw.js +0 -15
- package/dist/logging-DB6BQmhi.js +0 -15
- package/dist/logging-mcb66J0p.js +0 -15
- package/dist/login-BDCg6D0N.js +0 -61
- package/dist/login-BDfnbjnZ.js +0 -59
- package/dist/login-BqH1itcg.js +0 -61
- package/dist/login-qr-CyOw3R4r.js +0 -321
- package/dist/login-qr-D8ECtb72.js +0 -323
- package/dist/login-qr-RnR7e4Bw.js +0 -326
- package/dist/logs-cli--j89L74J.js +0 -245
- package/dist/logs-cli-DpEMg_Gq.js +0 -242
- package/dist/manager-B4OyvcxT.js +0 -3244
- package/dist/manager-Cqc1CeH7.js +0 -3246
- package/dist/manager-DUyQPFvj.js +0 -3244
- package/dist/manifest-registry-CW1zCyRF.js +0 -748
- package/dist/manifest-registry-D4lM2RdV.js +0 -748
- package/dist/markdown-tables-BT1X6jqH.js +0 -347
- package/dist/markdown-tables-DHgOK2vI.js +0 -348
- package/dist/media-THyainiE.js +0 -1342
- package/dist/memory-cli-BKocCWXM.js +0 -868
- package/dist/memory-cli-Jmma-xI_.js +0 -869
- package/dist/message-channel-dSTVVCyX.js +0 -110
- package/dist/migrate-BR6iAIjO.js +0 -157
- package/dist/migrate-D0EcMs0f.js +0 -157
- package/dist/model-selection-YcSr9CgC.js +0 -2691
- package/dist/models-1vUQBVfw.js +0 -2510
- package/dist/models-cli-BK3BwUhL.js +0 -2739
- package/dist/models-cli-DECrM8oA.js +0 -258
- package/dist/net-B5lXhYLV.js +0 -218
- package/dist/node-cli-cLHUNpPD.js +0 -1319
- package/dist/node-cli-fO7Y132S.js +0 -1322
- package/dist/node-service-BFxHJsno.js +0 -67
- package/dist/node-service-DUnan4uK.js +0 -67
- package/dist/nodes-cli-BCq35E6N.js +0 -1200
- package/dist/nodes-cli-vD7MwAKP.js +0 -1197
- package/dist/nodes-screen-1YiLkqr5.js +0 -234
- package/dist/nodes-screen-DZeD8hE5.js +0 -234
- package/dist/note-Bi8Wb8DV.js +0 -73
- package/dist/note-uiuPxhyX.js +0 -73
- package/dist/npm-registry-spec-B-XIShkB.js +0 -351
- package/dist/npm-registry-spec-za3itb5Y.js +0 -351
- package/dist/onboard-Ds6w_sWo.js +0 -1165
- package/dist/onboard-SAVx3bp4.js +0 -1166
- package/dist/onboard-channels-Cg_EkBa4.js +0 -672
- package/dist/onboard-channels-D7NbA55V.js +0 -672
- package/dist/onboard-helpers-DO_hgZb9.js +0 -365
- package/dist/onboard-helpers-_XgJgeqh.js +0 -365
- package/dist/onboarding-3hLmDd0r.js +0 -911
- package/dist/onboarding-B4LKLsbU.js +0 -910
- package/dist/orchestrator-BKzmyBWy.js +0 -357
- package/dist/orchestrator-BN3QCz2s.js +0 -357
- package/dist/outbound-BgA9hNlP.js +0 -2062
- package/dist/outbound-CjdvVhUI.js +0 -214
- package/dist/outbound-DOGe6qb2.js +0 -214
- package/dist/outbound-send-deps-Du5aBpd7.js +0 -55
- package/dist/pairing-cli-2vnyg_Nd.js +0 -118
- package/dist/pairing-cli-BH1KQtNV.js +0 -121
- package/dist/pairing-store-DJz_9Gv0.js +0 -388
- package/dist/pairing-store-DmOzxcuk.js +0 -388
- package/dist/path-env-Bu6k0jDQ.js +0 -89
- package/dist/path-env-C0zQSjw8.js +0 -89
- package/dist/paths-BTc4nk-6.js +0 -126
- package/dist/paths-BgUi2Z2G.js +0 -54
- package/dist/paths-C6VCWKo3.js +0 -238
- package/dist/paths-CCxa0o9c.js +0 -222
- package/dist/paths-CxRf2rBG.js +0 -129
- package/dist/paths-hcX1Gqg5.js +0 -129
- package/dist/pi-auth-json-B68R7q7_.js +0 -82
- package/dist/pi-auth-json-CR0jXAgq.js +0 -78
- package/dist/pi-auth-json-ZYzi3nxs.js +0 -80
- package/dist/pi-model-discovery-Cxs4pvC2.js +0 -3
- package/dist/pi-tools.policy-D81U5xy0.js +0 -200
- package/dist/pi-tools.policy-DSHkkb5b.js +0 -200
- package/dist/plugin-auto-enable-CxF4bpDN.js +0 -282
- package/dist/plugin-auto-enable-jNaAeyEh.js +0 -282
- package/dist/plugin-registry-C7XWotZG.js +0 -32
- package/dist/plugin-registry-DcUCbGax.js +0 -32
- package/dist/plugins-B362e77G.js +0 -168
- package/dist/plugins-CmSUIUNi.js +0 -38
- package/dist/plugins-cli-BsCEnoQ7.js +0 -734
- package/dist/plugins-cli-QSIsMUG7.js +0 -736
- package/dist/polls-CItfB1H8.js +0 -1343
- package/dist/ports-BVLMN1Sr.js +0 -96
- package/dist/ports-CqLSlU6Z.js +0 -317
- package/dist/ports-D94CwCrv.js +0 -344
- package/dist/ports-D_NHthOz.js +0 -96
- package/dist/program-DkJHjI0R.js +0 -176
- package/dist/program-context-DnyGM2SC.js +0 -496
- package/dist/progress-Bek_GyWS.js +0 -133
- package/dist/prompt-style-lu0clOOE.js +0 -9
- package/dist/pw-ai-BLVMuSLv.js +0 -1867
- package/dist/pw-ai-DZJWEF_f.js +0 -1865
- package/dist/pw-ai-dzf-ptcn.js +0 -1868
- package/dist/qmd-manager-Cur_Ekn0.js +0 -937
- package/dist/qmd-manager-DNAUuwjK.js +0 -938
- package/dist/qmd-manager-DepEoASu.js +0 -935
- package/dist/register.agent-CSWvzOkR.js +0 -265
- package/dist/register.agent-UeH2NXmH.js +0 -1003
- package/dist/register.anima-DOdee0dh.js +0 -193
- package/dist/register.anima-HHDWsz6r.js +0 -193
- package/dist/register.configure-CSJFxdz9.js +0 -103
- package/dist/register.configure-D84Fvcz4.js +0 -101
- package/dist/register.maintenance-B3pvNbZb.js +0 -543
- package/dist/register.maintenance-BKVOwkw6.js +0 -543
- package/dist/register.message-BAO6CPl2.js +0 -657
- package/dist/register.message-OXoOKE_6.js +0 -660
- package/dist/register.onboard-BK_ixVmD.js +0 -170
- package/dist/register.onboard-cfCaPx6j.js +0 -170
- package/dist/register.setup-BGfDnzph.js +0 -175
- package/dist/register.setup-Y-Q74M-0.js +0 -175
- package/dist/register.status-health-sessions-CT14eitH.js +0 -142
- package/dist/register.status-health-sessions-TfZMzAUn.js +0 -313
- package/dist/register.subclis-BZwdlNHC.js +0 -255
- package/dist/reply-mlsExaZm.js +0 -32212
- package/dist/reply-prefix-B0CfR4bM.js +0 -100
- package/dist/reply-prefix-w4a39ybC.js +0 -100
- package/dist/reply-qalRISe_.js +0 -32212
- package/dist/routes-CENsHJyg.js +0 -1820
- package/dist/routes-DO0HqW2e.js +0 -1820
- package/dist/rpc-C0pjNhBi.js +0 -70
- package/dist/rpc-DZ44PIXE.js +0 -70
- package/dist/run-main-BMpKw8Mp.js +0 -371
- package/dist/runtime-guard-BSUFiAQV.js +0 -60
- package/dist/sandbox-BIGfMYEI.js +0 -858
- package/dist/sandbox-DxP3IpUP.js +0 -859
- package/dist/sandbox-cli-DtLGH8sL.js +0 -461
- package/dist/sandbox-cli-_Tg7lfJ_.js +0 -458
- package/dist/security-cli-BRwgbedo.js +0 -462
- package/dist/security-cli-D3bSuyZt.js +0 -465
- package/dist/server-context-49XFFxFg.js +0 -824
- package/dist/server-context-LrlgrZzS.js +0 -824
- package/dist/server-node-events-Dm52i7NW.js +0 -231
- package/dist/server-node-events-QX523UyF.js +0 -233
- package/dist/service-BNVpYcQe.js +0 -642
- package/dist/service-D56aMXUB.js +0 -642
- package/dist/service-audit-D0X_XAB2.js +0 -488
- package/dist/service-audit-qmf6XMmP.js +0 -488
- package/dist/session-CrQQLLhx.js +0 -179
- package/dist/session-LocsOOWJ.js +0 -181
- package/dist/session-Vlce2BAT.js +0 -181
- package/dist/session-cost-usage-BwiTZuKl.js +0 -600
- package/dist/session-cost-usage-DT9YNXTJ.js +0 -600
- package/dist/sessions-BfV53TbG.js +0 -1296
- package/dist/sessions-BimpX_km.js +0 -180
- package/dist/sessions-DcXpzig0.js +0 -1296
- package/dist/sessions-Wd18dukK.js +0 -2038
- package/dist/shared-Bsr69u_7.js +0 -77
- package/dist/shared-Cgly1vPb.js +0 -66
- package/dist/shared-JOo05hST.js +0 -66
- package/dist/shared-f7dvQsi7.js +0 -77
- package/dist/skill-scanner-CkaVLABv.js +0 -263
- package/dist/skills-B-G7UHOa.js +0 -808
- package/dist/skills-B5LQx4lT.js +0 -807
- package/dist/skills-cli-DUGe2ZWW.js +0 -286
- package/dist/skills-cli-DtOk0bvK.js +0 -289
- package/dist/skills-status-Clq9ZnYu.js +0 -166
- package/dist/skills-status-JQluhU-P.js +0 -166
- package/dist/sqlite-BukcjdJa.js +0 -321
- package/dist/sqlite-CGcOZZ0C.js +0 -368
- package/dist/sqlite-Ck6f9KWc.js +0 -453
- package/dist/start--xmSFepB.js +0 -372
- package/dist/start-BdlZbqrr.js +0 -371
- package/dist/status-BgoeFm6g.js +0 -2137
- package/dist/status-BjjDrUq7.js +0 -27
- package/dist/status-Ct0DgOZ-.js +0 -2132
- package/dist/status-RA_uNmK0.js +0 -27
- package/dist/status.update-BjOH3GlS.js +0 -79
- package/dist/status.update-DLU1qBf0.js +0 -79
- package/dist/subagent-registry-9RLdKxES.js +0 -2760
- package/dist/subagent-registry-Byuex3zp.js +0 -2759
- package/dist/subagent-registry-DOBunBYS.js +0 -14
- package/dist/subsystem-Dowf8fSU.js +0 -860
- package/dist/system-cli-C5oBpzni.js +0 -79
- package/dist/system-cli-DXNKD_Id.js +0 -82
- package/dist/systemd-BSrHDyeU.js +0 -452
- package/dist/systemd-By5xdSB4.js +0 -452
- package/dist/systemd-hints-BtjL_5Rh.js +0 -36
- package/dist/systemd-hints-sJmr6cjb.js +0 -36
- package/dist/systemd-linger-CTmV2Gci.js +0 -75
- package/dist/systemd-linger-CmyqQkeC.js +0 -75
- package/dist/table-BL0lJzsm.js +0 -279
- package/dist/table-DoiRPsn0.js +0 -279
- package/dist/timeout-CswI_K-U.js +0 -232
- package/dist/tokens-C-X7wDKj.js +0 -14
- package/dist/tokens-DkvqA72p.js +0 -14
- package/dist/trash-BJLK1vMn.js +0 -23
- package/dist/trash-_x5UZ94k.js +0 -23
- package/dist/tui-BHjxDFZC.js +0 -3894
- package/dist/tui-CgOocwN8.js +0 -3894
- package/dist/tui-cli-5ANH8dE5.js +0 -47
- package/dist/tui-cli-BQ4P-JW_.js +0 -50
- package/dist/update-LFgxHHPd.js +0 -317
- package/dist/update-TxptCqk7.js +0 -317
- package/dist/update-check-CWc7YXmc.js +0 -400
- package/dist/update-check-IhlWaui6.js +0 -400
- package/dist/update-cli-PtXU62w7.js +0 -1105
- package/dist/update-cli-Va0EtETG.js +0 -1105
- package/dist/update-runner-BLeKFkiB.js +0 -894
- package/dist/update-runner-Iuzpc-_y.js +0 -894
- package/dist/usage-ApGvBLVg.js +0 -4516
- package/dist/utils-Bsw__U-F.js +0 -243
- package/dist/web-B6_Ky60G.js +0 -63
- package/dist/web-EZLQEWXY.js +0 -46842
- package/dist/web-pec8YJUX.js +0 -2203
- package/dist/webhooks-cli-BYQKTHTp.js +0 -319
- package/dist/webhooks-cli-C2_xtsUQ.js +0 -316
- package/dist/whatsapp-actions-C72VCq8f.js +0 -49
- package/dist/whatsapp-actions-Ck9Uv0Nw.js +0 -45
- package/dist/whatsapp-actions-D0reTj2k.js +0 -53
- package/dist/widearea-dns-B6ocX23x.js +0 -127
- package/dist/widearea-dns-NsEUNYwz.js +0 -127
- package/dist/workspace-Dcfoy5JJ.js +0 -649
- package/dist/ws-log-N8R5MvGE.js +0 -267
- package/dist/ws-log-gwFxPxj5.js +0 -267
- /package/dist/{auto-update-CUeF99gI.js → auto-update-CpF0fycd.js} +0 -0
- /package/dist/{auto-update-cgkp9ZTJ.js → auto-update-DNWdO7uF.js} +0 -0
- /package/dist/{brew-CVZkr0GU.js → brew-nqf_MiE4.js} +0 -0
- /package/dist/{budget-DxYQSekw.js → budget-CPedI-qW.js} +0 -0
- /package/dist/{budget-BWBp8Res.js → budget-CRpvqDRX.js} +0 -0
- /package/dist/{cli-utils-DtAxdCte.js → cli-utils-C1YHVD4o.js} +0 -0
- /package/dist/{command-options-CSbuuqHr.js → command-options-BbponVnw.js} +0 -0
- /package/dist/{command-options-Cp1tf96a.js → command-options-s0gnvXnS.js} +0 -0
- /package/dist/{constants-O8yBqCBv.js → constants-Dhb6zSIV.js} +0 -0
- /package/dist/{dangerous-tools-5ObDWy1N.js → dangerous-tools-DGTtJ_JR.js} +0 -0
- /package/dist/{dangerous-tools-Jwr7jqNw.js → dangerous-tools-DxrfTOfT.js} +0 -0
- /package/dist/{delivery-queue-B6IHz4Ry.js → delivery-queue-Bxm0nzw7.js} +0 -0
- /package/dist/{display-BDOsXu8F.js → display-Jy3UdGzA.js} +0 -0
- /package/dist/{errors-CHow2wtt.js → errors-CKaCqKga.js} +0 -0
- /package/dist/{exec-BizYYQgP.js → exec-DDmuVVNq.js} +0 -0
- /package/dist/{format-Mq6iU0_5.js → format-ByEjgyTF.js} +0 -0
- /package/dist/{format-duration-DhWzz_5b.js → format-duration-Aaj5tjJd.js} +0 -0
- /package/dist/{format-relative-C6kUHuOj.js → format-relative-79_Y1n2Y.js} +0 -0
- /package/dist/{help-format-DUBI91Ti.js → help-format-BMKzarov.js} +0 -0
- /package/dist/{helpers-eJFa4K6r.js → helpers-DpEB9Mh0.js} +0 -0
- /package/dist/{helpers-DLgbkcEn.js → helpers-FMld9sBT.js} +0 -0
- /package/dist/{input-provenance-DJBdpeKk.js → input-provenance-Cy_KnBlP.js} +0 -0
- /package/dist/{is-main-Dt9DTcH1.js → is-main-yjaVwMtJ.js} +0 -0
- /package/dist/{loader-l2OBdJ8x.js → loader-Br7Vr0zn.js} +0 -0
- /package/dist/{loader-BoYxRfcW.js → loader-CkmOrXcC.js} +0 -0
- /package/dist/{logging-BdnOSVPD.js → logging-CY-Q5cwf.js} +0 -0
- /package/dist/{message-channel-w4F2b2F6.js → message-channel-dua8OOGJ.js} +0 -0
- /package/dist/{mime-B1ZoR53M.js → mime-CBg4KybI.js} +0 -0
- /package/dist/{model-param-b-DPwyNGn8.js → model-param-b-DW9f0NN8.js} +0 -0
- /package/dist/{node-match-8XZnaid6.js → node-match-BV8bTBd4.js} +0 -0
- /package/dist/{normalize-GDK8JTNW.js → normalize-_lmlBOW9.js} +0 -0
- /package/dist/{openclaw-root-C85WMnVV.js → openclaw-root-JPvmPTf7.js} +0 -0
- /package/dist/{outbound-send-deps-ANnAhImn.js → outbound-send-deps-BfUvuWGa.js} +0 -0
- /package/dist/{parse-6-2MDhdT.js → parse-CZRwKocn.js} +0 -0
- /package/dist/{parse-log-line-Bqh1SSzC.js → parse-log-line-CvrZEK6A.js} +0 -0
- /package/dist/{parse-log-line-DUZCjXbl.js → parse-log-line-mLdat0AH.js} +0 -0
- /package/dist/{parse-port-BKB9Exlg.js → parse-port-BSOOdo7I.js} +0 -0
- /package/dist/{parse-port-DrfvwwiL.js → parse-port-Y0NK62x1.js} +0 -0
- /package/dist/{parse-timeout-Di_tcEmi.js → parse-timeout-DVPQ3n9j.js} +0 -0
- /package/dist/{paths-DcVEkYX5.js → paths-DHjlJ6cn.js} +0 -0
- /package/dist/{pi-model-discovery-DsRqYJLy.js → pi-model-discovery-DzEIEgHL.js} +0 -0
- /package/dist/{plugins-CDJw924T.js → plugins-D6PBOdkn.js} +0 -0
- /package/dist/{program-context-Bvn8046-.js → program-context-Q1hkT73c.js} +0 -0
- /package/dist/{progress-CbZ2D53A.js → progress-C9Ha1NJh.js} +0 -0
- /package/dist/{prompt-style-DKy6qQxR.js → prompt-style-DQi8j03a.js} +0 -0
- /package/dist/{prompts-BI__va99.js → prompts-BEHxUC3w.js} +0 -0
- /package/dist/{prompts-_dDWkCAz.js → prompts-CSOhuiqe.js} +0 -0
- /package/dist/{queue-D_u34pbL.js → queue-BJGo7kAB.js} +0 -0
- /package/dist/{queue-PG591iID.js → queue-DYgUbdoq.js} +0 -0
- /package/dist/{redact-ClVwO7Nn.js → redact-CyKvdFrg.js} +0 -0
- /package/dist/{registry-Bs_DJK9E.js → registry-C5MAYD4V.js} +0 -0
- /package/dist/{registry-D_zlP1U-.js → registry-CRrXXVs0.js} +0 -0
- /package/dist/{requirements-BzZxj2Wu.js → requirements-CGkxTCu4.js} +0 -0
- /package/dist/{requirements-DIW1svgA.js → requirements-CIDaOcbO.js} +0 -0
- /package/dist/{runtime-guard-DeOXA_86.js → runtime-guard-nL3Lp8T-.js} +0 -0
- /package/dist/{secret-equal-Dghy3xsA.js → secret-equal-DJpmLXlG.js} +0 -0
- /package/dist/{send-BhAfdGII.js → send-CTcxgDDU.js} +0 -0
- /package/dist/{send-ga9udK1_.js → send-DPezUR3-.js} +0 -0
- /package/dist/{send-C2t9xpXI.js → send-DZQTaG7-.js} +0 -0
- /package/dist/{send-DigO-i9j.js → send-VDff2gra.js} +0 -0
- /package/dist/{send-Dz2BDHll.js → send-bgQNV8d1.js} +0 -0
- /package/dist/{session-key-BGiG_JcT.js → session-key-CQT-NR6w.js} +0 -0
- /package/dist/{shell-argv-CAq1mLa2.js → shell-argv-n9IueeJQ.js} +0 -0
- /package/dist/{skill-scanner-Coo4QoCd.js → skill-scanner-o6NgVMD9.js} +0 -0
- /package/dist/{status-CMnlcBVc.js → status-C53kTIXF.js} +0 -0
- /package/dist/{status-tDZPwewW.js → status-CZDDA_Sy.js} +0 -0
- /package/dist/{system-run-command-X9lDJIy0.js → system-run-command-BCjUffN9.js} +0 -0
- /package/dist/{system-run-command-DGk7dwQP.js → system-run-command-CqAqKL9K.js} +0 -0
- /package/dist/{tailnet-CuiNECdL.js → tailnet-Ciwjv243.js} +0 -0
- /package/dist/{templates-CeYJjVzw.js → templates-37RKpACb.js} +0 -0
- /package/dist/{templates-I3Z0xplD.js → templates-DPalk30o.js} +0 -0
- /package/dist/{thinking-BXEswx1X.js → thinking-2hxwmvTl.js} +0 -0
- /package/dist/{transcript-events-C1hdue6u.js → transcript-events-Bp7fGnwv.js} +0 -0
- /package/dist/{transcript-tools-DuyYOkUq.js → transcript-tools-D4Lbxlka.js} +0 -0
- /package/dist/{usage-format-BAirWUSO.js → usage-format-6Uar63S0.js} +0 -0
- /package/dist/{utils-C9sj30YY.js → utils-DT8uXjFS.js} +0 -0
- /package/dist/{wsl-CqyuRvtM.js → wsl-CrPvx2kZ.js} +0 -0
- /package/dist/{wsl-ymJYvc9Q.js → wsl-UvJ5dHah.js} +0 -0
|
@@ -1,2681 +0,0 @@
|
|
|
1
|
-
import { $ as SYNTHETIC_DEFAULT_MODEL_REF, Dt as DEFAULT_PROVIDER, Et as DEFAULT_MODEL, F as resolveConfiguredModelRef, K as VENICE_DEFAULT_MODEL_REF, P as resolveAllowlistModelKey, St as CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF, b as resolveAnimaAgentDir, bt as discoverHuggingfaceModels, c as generateChutesPkce, d as listProfilesForProvider, h as ensureAuthProfileStore, l as parseOAuthCallbackInput, m as upsertAuthProfileWithLock, n as resolveAuthProfileOrder, o as CHUTES_AUTHORIZE_ENDPOINT, p as upsertAuthProfile, rt as getCustomProviderApiKey, s as exchangeChutesCodeForTokens, st as resolveEnvApiKey, xt as isHuggingfacePolicyLocked } from "./auth-profiles-DxI8L7bs.js";
|
|
2
|
-
import { c as escapeRegExp, g as resolveConfigDir } from "./utils-C9sj30YY.js";
|
|
3
|
-
import { a as resolveAgentModelPrimary, c as resolveDefaultAgentId, r as resolveAgentDir, s as resolveAgentWorkspaceDir, w as resolveDefaultAgentWorkspaceDir } from "./agent-scope-OZi7lb8S.js";
|
|
4
|
-
import { n as isLoopbackHost } from "./net-B5lXhYLV.js";
|
|
5
|
-
import { c as fetchWithTimeout } from "./media-THyainiE.js";
|
|
6
|
-
import { Yt as loadModelCatalog } from "./cli-session-Dd8DKb5a.js";
|
|
7
|
-
import { a as enablePluginInConfig } from "./onboard-channels-D7NbA55V.js";
|
|
8
|
-
import { d as openUrl } from "./onboard-helpers-DO_hgZb9.js";
|
|
9
|
-
import { $ as XIAOMI_DEFAULT_MODEL_REF, A as applySyntheticConfig, B as applyZaiConfig, C as applyMoonshotConfigCn, Ct as XAI_DEFAULT_MODEL_REF, D as applyOpenrouterProviderConfig, Dt as ZAI_GLOBAL_BASE_URL, E as applyOpenrouterConfig, Et as ZAI_CODING_GLOBAL_BASE_URL, F as applyVeniceProviderConfig, G as applyCloudflareAiGatewayProviderConfig, H as applyLitellmConfig, I as applyXaiConfig, J as HUGGINGFACE_DEFAULT_MODEL_REF, K as applyVercelAiGatewayConfig, L as applyXaiProviderConfig, M as applyTogetherConfig, N as applyTogetherProviderConfig, O as applyQianfanConfig, Ot as buildTokenProfileId, P as applyVeniceConfig, Q as VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF, R as applyXiaomiConfig, S as applyMoonshotConfig, St as QIANFAN_DEFAULT_MODEL_REF, T as applyMoonshotProviderConfigCn, Tt as ZAI_CODING_CN_BASE_URL, U as applyLitellmProviderConfig, V as applyZaiProviderConfig, W as applyCloudflareAiGatewayConfig, X as OPENROUTER_DEFAULT_MODEL_REF, Y as LITELLM_DEFAULT_MODEL_REF, Z as TOGETHER_DEFAULT_MODEL_REF, _ as applyAuthProfileConfig, _t as setXiaomiApiKey, a as resolveProviderMatch, at as setKimiCodingApiKey, b as applyKimiCodeConfig, bt as KIMI_CODING_MODEL_REF, c as resolvePluginProviders, ct as setMoonshotApiKey, d as applyMinimaxApiConfig, dt as setQianfanApiKey, et as ZAI_DEFAULT_MODEL_REF, f as applyMinimaxApiConfigCn, ft as setSyntheticApiKey, g as applyMinimaxProviderConfig, gt as setXaiApiKey, h as applyMinimaxConfig, ht as setVercelAiGatewayApiKey, i as pickAuthMethod, it as setHuggingfaceApiKey, j as applySyntheticProviderConfig, k as applyQianfanProviderConfig, kt as validateAnthropicSetupToken, l as applyOpencodeZenConfig, lt as setOpencodeZenApiKey, m as applyMinimaxApiProviderConfigCn, mt as setVeniceApiKey, n as applyDefaultModel, nt as setCloudflareAiGatewayConfig, o as createVpsAwareOAuthHandlers, ot as setLitellmApiKey, p as applyMinimaxApiProviderConfig, pt as setTogetherApiKey, q as applyVercelAiGatewayProviderConfig, r as mergeConfigPatch, rt as setGeminiApiKey, s as isRemoteEnvironment, st as setMinimaxApiKey, t as githubCopilotLoginCommand, tt as setAnthropicApiKey, u as applyOpencodeZenProviderConfig, ut as setOpenrouterApiKey, vt as setZaiApiKey, w as applyMoonshotProviderConfig, wt as ZAI_CN_BASE_URL, x as applyKimiCodeProviderConfig, xt as MOONSHOT_DEFAULT_MODEL_REF, y as applyHuggingfaceProviderConfig, yt as writeOAuthCredentials, z as applyXiaomiProviderConfig } from "./github-copilot-auth-4IUFp669.js";
|
|
10
|
-
import path from "node:path";
|
|
11
|
-
import fs from "node:fs";
|
|
12
|
-
import { loginOpenAICodex } from "@mariozechner/pi-ai";
|
|
13
|
-
import { randomBytes } from "node:crypto";
|
|
14
|
-
import { createServer } from "node:http";
|
|
15
|
-
|
|
16
|
-
//#region src/commands/auth-choice-legacy.ts
|
|
17
|
-
const AUTH_CHOICE_LEGACY_ALIASES_FOR_CLI = [
|
|
18
|
-
"setup-token",
|
|
19
|
-
"oauth",
|
|
20
|
-
"claude-cli",
|
|
21
|
-
"codex-cli",
|
|
22
|
-
"minimax-cloud",
|
|
23
|
-
"minimax"
|
|
24
|
-
];
|
|
25
|
-
function normalizeLegacyOnboardAuthChoice(authChoice) {
|
|
26
|
-
if (authChoice === "oauth" || authChoice === "claude-cli") return "setup-token";
|
|
27
|
-
if (authChoice === "codex-cli") return "openai-codex";
|
|
28
|
-
return authChoice;
|
|
29
|
-
}
|
|
30
|
-
function isDeprecatedAuthChoice(authChoice) {
|
|
31
|
-
return authChoice === "claude-cli" || authChoice === "codex-cli";
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
//#endregion
|
|
35
|
-
//#region src/commands/auth-choice-options.ts
|
|
36
|
-
const AUTH_CHOICE_GROUP_DEFS = [
|
|
37
|
-
{
|
|
38
|
-
value: "openai",
|
|
39
|
-
label: "OpenAI",
|
|
40
|
-
hint: "Codex OAuth + API key",
|
|
41
|
-
choices: ["openai-codex", "openai-api-key"]
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
value: "anthropic",
|
|
45
|
-
label: "Anthropic",
|
|
46
|
-
hint: "setup-token + API key",
|
|
47
|
-
choices: ["token", "apiKey"]
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
value: "chutes",
|
|
51
|
-
label: "Chutes",
|
|
52
|
-
hint: "OAuth",
|
|
53
|
-
choices: ["chutes"]
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
value: "vllm",
|
|
57
|
-
label: "vLLM",
|
|
58
|
-
hint: "Local/self-hosted OpenAI-compatible",
|
|
59
|
-
choices: ["vllm"]
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
value: "minimax",
|
|
63
|
-
label: "MiniMax",
|
|
64
|
-
hint: "M2.5 (recommended)",
|
|
65
|
-
choices: [
|
|
66
|
-
"minimax-portal",
|
|
67
|
-
"minimax-api",
|
|
68
|
-
"minimax-api-key-cn",
|
|
69
|
-
"minimax-api-lightning"
|
|
70
|
-
]
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
value: "moonshot",
|
|
74
|
-
label: "Moonshot AI (Kimi K2.5)",
|
|
75
|
-
hint: "Kimi K2.5 + Kimi Coding",
|
|
76
|
-
choices: [
|
|
77
|
-
"moonshot-api-key",
|
|
78
|
-
"moonshot-api-key-cn",
|
|
79
|
-
"kimi-code-api-key"
|
|
80
|
-
]
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
value: "google",
|
|
84
|
-
label: "Google",
|
|
85
|
-
hint: "Gemini API key + OAuth",
|
|
86
|
-
choices: [
|
|
87
|
-
"gemini-api-key",
|
|
88
|
-
"google-antigravity",
|
|
89
|
-
"google-gemini-cli"
|
|
90
|
-
]
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
value: "xai",
|
|
94
|
-
label: "xAI (Grok)",
|
|
95
|
-
hint: "API key",
|
|
96
|
-
choices: ["xai-api-key"]
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
value: "openrouter",
|
|
100
|
-
label: "OpenRouter",
|
|
101
|
-
hint: "API key",
|
|
102
|
-
choices: ["openrouter-api-key"]
|
|
103
|
-
},
|
|
104
|
-
{
|
|
105
|
-
value: "qwen",
|
|
106
|
-
label: "Qwen",
|
|
107
|
-
hint: "OAuth",
|
|
108
|
-
choices: ["qwen-portal"]
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
value: "zai",
|
|
112
|
-
label: "Z.AI",
|
|
113
|
-
hint: "GLM Coding Plan / Global / CN",
|
|
114
|
-
choices: [
|
|
115
|
-
"zai-coding-global",
|
|
116
|
-
"zai-coding-cn",
|
|
117
|
-
"zai-global",
|
|
118
|
-
"zai-cn"
|
|
119
|
-
]
|
|
120
|
-
},
|
|
121
|
-
{
|
|
122
|
-
value: "qianfan",
|
|
123
|
-
label: "Qianfan",
|
|
124
|
-
hint: "API key",
|
|
125
|
-
choices: ["qianfan-api-key"]
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
value: "copilot",
|
|
129
|
-
label: "Copilot",
|
|
130
|
-
hint: "GitHub + local proxy",
|
|
131
|
-
choices: ["github-copilot", "copilot-proxy"]
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
value: "ai-gateway",
|
|
135
|
-
label: "Vercel AI Gateway",
|
|
136
|
-
hint: "API key",
|
|
137
|
-
choices: ["ai-gateway-api-key"]
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
value: "opencode-zen",
|
|
141
|
-
label: "OpenCode Zen",
|
|
142
|
-
hint: "API key",
|
|
143
|
-
choices: ["opencode-zen"]
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
value: "xiaomi",
|
|
147
|
-
label: "Xiaomi",
|
|
148
|
-
hint: "API key",
|
|
149
|
-
choices: ["xiaomi-api-key"]
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
value: "synthetic",
|
|
153
|
-
label: "Synthetic",
|
|
154
|
-
hint: "Anthropic-compatible (multi-model)",
|
|
155
|
-
choices: ["synthetic-api-key"]
|
|
156
|
-
},
|
|
157
|
-
{
|
|
158
|
-
value: "together",
|
|
159
|
-
label: "Together AI",
|
|
160
|
-
hint: "API key",
|
|
161
|
-
choices: ["together-api-key"]
|
|
162
|
-
},
|
|
163
|
-
{
|
|
164
|
-
value: "huggingface",
|
|
165
|
-
label: "Hugging Face",
|
|
166
|
-
hint: "Inference API (HF token)",
|
|
167
|
-
choices: ["huggingface-api-key"]
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
value: "venice",
|
|
171
|
-
label: "Venice AI",
|
|
172
|
-
hint: "Privacy-focused (uncensored models)",
|
|
173
|
-
choices: ["venice-api-key"]
|
|
174
|
-
},
|
|
175
|
-
{
|
|
176
|
-
value: "litellm",
|
|
177
|
-
label: "LiteLLM",
|
|
178
|
-
hint: "Unified LLM gateway (100+ providers)",
|
|
179
|
-
choices: ["litellm-api-key"]
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
value: "cloudflare-ai-gateway",
|
|
183
|
-
label: "Cloudflare AI Gateway",
|
|
184
|
-
hint: "Account ID + Gateway ID + API key",
|
|
185
|
-
choices: ["cloudflare-ai-gateway-api-key"]
|
|
186
|
-
},
|
|
187
|
-
{
|
|
188
|
-
value: "custom",
|
|
189
|
-
label: "Custom Provider",
|
|
190
|
-
hint: "Any OpenAI or Anthropic compatible endpoint",
|
|
191
|
-
choices: ["custom-api-key"]
|
|
192
|
-
}
|
|
193
|
-
];
|
|
194
|
-
const BASE_AUTH_CHOICE_OPTIONS = [
|
|
195
|
-
{
|
|
196
|
-
value: "token",
|
|
197
|
-
label: "Anthropic token (paste setup-token)",
|
|
198
|
-
hint: "run `claude setup-token` elsewhere, then paste the token here"
|
|
199
|
-
},
|
|
200
|
-
{
|
|
201
|
-
value: "openai-codex",
|
|
202
|
-
label: "OpenAI Codex (ChatGPT OAuth)"
|
|
203
|
-
},
|
|
204
|
-
{
|
|
205
|
-
value: "chutes",
|
|
206
|
-
label: "Chutes (OAuth)"
|
|
207
|
-
},
|
|
208
|
-
{
|
|
209
|
-
value: "vllm",
|
|
210
|
-
label: "vLLM (custom URL + model)",
|
|
211
|
-
hint: "Local/self-hosted OpenAI-compatible server"
|
|
212
|
-
},
|
|
213
|
-
{
|
|
214
|
-
value: "openai-api-key",
|
|
215
|
-
label: "OpenAI API key"
|
|
216
|
-
},
|
|
217
|
-
{
|
|
218
|
-
value: "xai-api-key",
|
|
219
|
-
label: "xAI (Grok) API key"
|
|
220
|
-
},
|
|
221
|
-
{
|
|
222
|
-
value: "qianfan-api-key",
|
|
223
|
-
label: "Qianfan API key"
|
|
224
|
-
},
|
|
225
|
-
{
|
|
226
|
-
value: "openrouter-api-key",
|
|
227
|
-
label: "OpenRouter API key"
|
|
228
|
-
},
|
|
229
|
-
{
|
|
230
|
-
value: "litellm-api-key",
|
|
231
|
-
label: "LiteLLM API key",
|
|
232
|
-
hint: "Unified gateway for 100+ LLM providers"
|
|
233
|
-
},
|
|
234
|
-
{
|
|
235
|
-
value: "ai-gateway-api-key",
|
|
236
|
-
label: "Vercel AI Gateway API key"
|
|
237
|
-
},
|
|
238
|
-
{
|
|
239
|
-
value: "cloudflare-ai-gateway-api-key",
|
|
240
|
-
label: "Cloudflare AI Gateway",
|
|
241
|
-
hint: "Account ID + Gateway ID + API key"
|
|
242
|
-
},
|
|
243
|
-
{
|
|
244
|
-
value: "moonshot-api-key",
|
|
245
|
-
label: "Kimi API key (.ai)"
|
|
246
|
-
},
|
|
247
|
-
{
|
|
248
|
-
value: "moonshot-api-key-cn",
|
|
249
|
-
label: "Kimi API key (.cn)"
|
|
250
|
-
},
|
|
251
|
-
{
|
|
252
|
-
value: "kimi-code-api-key",
|
|
253
|
-
label: "Kimi Code API key (subscription)"
|
|
254
|
-
},
|
|
255
|
-
{
|
|
256
|
-
value: "synthetic-api-key",
|
|
257
|
-
label: "Synthetic API key"
|
|
258
|
-
},
|
|
259
|
-
{
|
|
260
|
-
value: "venice-api-key",
|
|
261
|
-
label: "Venice AI API key",
|
|
262
|
-
hint: "Privacy-focused inference (uncensored models)"
|
|
263
|
-
},
|
|
264
|
-
{
|
|
265
|
-
value: "together-api-key",
|
|
266
|
-
label: "Together AI API key",
|
|
267
|
-
hint: "Access to Llama, DeepSeek, Qwen, and more open models"
|
|
268
|
-
},
|
|
269
|
-
{
|
|
270
|
-
value: "huggingface-api-key",
|
|
271
|
-
label: "Hugging Face API key (HF token)",
|
|
272
|
-
hint: "Inference Providers — OpenAI-compatible chat"
|
|
273
|
-
},
|
|
274
|
-
{
|
|
275
|
-
value: "github-copilot",
|
|
276
|
-
label: "GitHub Copilot (GitHub device login)",
|
|
277
|
-
hint: "Uses GitHub device flow"
|
|
278
|
-
},
|
|
279
|
-
{
|
|
280
|
-
value: "gemini-api-key",
|
|
281
|
-
label: "Google Gemini API key"
|
|
282
|
-
},
|
|
283
|
-
{
|
|
284
|
-
value: "google-antigravity",
|
|
285
|
-
label: "Google Antigravity OAuth",
|
|
286
|
-
hint: "Uses the bundled Antigravity auth plugin"
|
|
287
|
-
},
|
|
288
|
-
{
|
|
289
|
-
value: "google-gemini-cli",
|
|
290
|
-
label: "Google Gemini CLI OAuth",
|
|
291
|
-
hint: "Uses the bundled Gemini CLI auth plugin"
|
|
292
|
-
},
|
|
293
|
-
{
|
|
294
|
-
value: "zai-api-key",
|
|
295
|
-
label: "Z.AI API key"
|
|
296
|
-
},
|
|
297
|
-
{
|
|
298
|
-
value: "zai-coding-global",
|
|
299
|
-
label: "Coding-Plan-Global",
|
|
300
|
-
hint: "GLM Coding Plan Global (api.z.ai)"
|
|
301
|
-
},
|
|
302
|
-
{
|
|
303
|
-
value: "zai-coding-cn",
|
|
304
|
-
label: "Coding-Plan-CN",
|
|
305
|
-
hint: "GLM Coding Plan CN (open.bigmodel.cn)"
|
|
306
|
-
},
|
|
307
|
-
{
|
|
308
|
-
value: "zai-global",
|
|
309
|
-
label: "Global",
|
|
310
|
-
hint: "Z.AI Global (api.z.ai)"
|
|
311
|
-
},
|
|
312
|
-
{
|
|
313
|
-
value: "zai-cn",
|
|
314
|
-
label: "CN",
|
|
315
|
-
hint: "Z.AI CN (open.bigmodel.cn)"
|
|
316
|
-
},
|
|
317
|
-
{
|
|
318
|
-
value: "xiaomi-api-key",
|
|
319
|
-
label: "Xiaomi API key"
|
|
320
|
-
},
|
|
321
|
-
{
|
|
322
|
-
value: "minimax-portal",
|
|
323
|
-
label: "MiniMax OAuth",
|
|
324
|
-
hint: "Oauth plugin for MiniMax"
|
|
325
|
-
},
|
|
326
|
-
{
|
|
327
|
-
value: "qwen-portal",
|
|
328
|
-
label: "Qwen OAuth"
|
|
329
|
-
},
|
|
330
|
-
{
|
|
331
|
-
value: "copilot-proxy",
|
|
332
|
-
label: "Copilot Proxy (local)",
|
|
333
|
-
hint: "Local proxy for VS Code Copilot models"
|
|
334
|
-
},
|
|
335
|
-
{
|
|
336
|
-
value: "apiKey",
|
|
337
|
-
label: "Anthropic API key"
|
|
338
|
-
},
|
|
339
|
-
{
|
|
340
|
-
value: "opencode-zen",
|
|
341
|
-
label: "OpenCode Zen (multi-model proxy)",
|
|
342
|
-
hint: "Claude, GPT, Gemini via opencode.ai/zen"
|
|
343
|
-
},
|
|
344
|
-
{
|
|
345
|
-
value: "minimax-api",
|
|
346
|
-
label: "MiniMax M2.5"
|
|
347
|
-
},
|
|
348
|
-
{
|
|
349
|
-
value: "minimax-api-key-cn",
|
|
350
|
-
label: "MiniMax M2.5 (CN)",
|
|
351
|
-
hint: "China endpoint (api.minimaxi.com)"
|
|
352
|
-
},
|
|
353
|
-
{
|
|
354
|
-
value: "minimax-api-lightning",
|
|
355
|
-
label: "MiniMax M2.5 Lightning",
|
|
356
|
-
hint: "Faster, higher output cost"
|
|
357
|
-
},
|
|
358
|
-
{
|
|
359
|
-
value: "custom-api-key",
|
|
360
|
-
label: "Custom Provider"
|
|
361
|
-
}
|
|
362
|
-
];
|
|
363
|
-
function formatAuthChoiceChoicesForCli(params) {
|
|
364
|
-
const includeSkip = params?.includeSkip ?? true;
|
|
365
|
-
const includeLegacyAliases = params?.includeLegacyAliases ?? false;
|
|
366
|
-
const values = BASE_AUTH_CHOICE_OPTIONS.map((opt) => opt.value);
|
|
367
|
-
if (includeSkip) values.push("skip");
|
|
368
|
-
if (includeLegacyAliases) values.push(...AUTH_CHOICE_LEGACY_ALIASES_FOR_CLI);
|
|
369
|
-
return values.join("|");
|
|
370
|
-
}
|
|
371
|
-
function buildAuthChoiceOptions(params) {
|
|
372
|
-
params.store;
|
|
373
|
-
const options = [...BASE_AUTH_CHOICE_OPTIONS];
|
|
374
|
-
if (params.includeSkip) options.push({
|
|
375
|
-
value: "skip",
|
|
376
|
-
label: "Skip for now"
|
|
377
|
-
});
|
|
378
|
-
return options;
|
|
379
|
-
}
|
|
380
|
-
function buildAuthChoiceGroups(params) {
|
|
381
|
-
const options = buildAuthChoiceOptions({
|
|
382
|
-
...params,
|
|
383
|
-
includeSkip: false
|
|
384
|
-
});
|
|
385
|
-
const optionByValue = new Map(options.map((opt) => [opt.value, opt]));
|
|
386
|
-
return {
|
|
387
|
-
groups: AUTH_CHOICE_GROUP_DEFS.map((group) => ({
|
|
388
|
-
...group,
|
|
389
|
-
options: group.choices.map((choice) => optionByValue.get(choice)).filter((opt) => Boolean(opt))
|
|
390
|
-
})),
|
|
391
|
-
skipOption: params.includeSkip ? {
|
|
392
|
-
value: "skip",
|
|
393
|
-
label: "Skip for now"
|
|
394
|
-
} : void 0
|
|
395
|
-
};
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
//#endregion
|
|
399
|
-
//#region src/commands/auth-choice-prompt.ts
|
|
400
|
-
const BACK_VALUE = "__back";
|
|
401
|
-
async function promptAuthChoiceGrouped(params) {
|
|
402
|
-
const { groups, skipOption } = buildAuthChoiceGroups(params);
|
|
403
|
-
const availableGroups = groups.filter((group) => group.options.length > 0);
|
|
404
|
-
while (true) {
|
|
405
|
-
const providerOptions = [...availableGroups.map((group) => ({
|
|
406
|
-
value: group.value,
|
|
407
|
-
label: group.label,
|
|
408
|
-
hint: group.hint
|
|
409
|
-
})), ...skipOption ? [skipOption] : []];
|
|
410
|
-
const providerSelection = await params.prompter.select({
|
|
411
|
-
message: "Model/auth provider",
|
|
412
|
-
options: providerOptions
|
|
413
|
-
});
|
|
414
|
-
if (providerSelection === "skip") return "skip";
|
|
415
|
-
const group = availableGroups.find((candidate) => candidate.value === providerSelection);
|
|
416
|
-
if (!group || group.options.length === 0) {
|
|
417
|
-
await params.prompter.note("No auth methods available for that provider.", "Model/auth choice");
|
|
418
|
-
continue;
|
|
419
|
-
}
|
|
420
|
-
if (group.options.length === 1) return group.options[0].value;
|
|
421
|
-
const methodSelection = await params.prompter.select({
|
|
422
|
-
message: `${group.label} auth method`,
|
|
423
|
-
options: [...group.options, {
|
|
424
|
-
value: BACK_VALUE,
|
|
425
|
-
label: "Back"
|
|
426
|
-
}]
|
|
427
|
-
});
|
|
428
|
-
if (methodSelection === BACK_VALUE) continue;
|
|
429
|
-
return methodSelection;
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
//#endregion
|
|
434
|
-
//#region src/commands/auth-choice.api-key.ts
|
|
435
|
-
const DEFAULT_KEY_PREVIEW = {
|
|
436
|
-
head: 4,
|
|
437
|
-
tail: 4
|
|
438
|
-
};
|
|
439
|
-
function normalizeApiKeyInput(raw) {
|
|
440
|
-
const trimmed = String(raw ?? "").trim();
|
|
441
|
-
if (!trimmed) return "";
|
|
442
|
-
const assignmentMatch = trimmed.match(/^(?:export\s+)?[A-Za-z_][A-Za-z0-9_]*\s*=\s*(.+)$/);
|
|
443
|
-
const valuePart = assignmentMatch ? assignmentMatch[1].trim() : trimmed;
|
|
444
|
-
const unquoted = valuePart.length >= 2 && (valuePart.startsWith("\"") && valuePart.endsWith("\"") || valuePart.startsWith("'") && valuePart.endsWith("'") || valuePart.startsWith("`") && valuePart.endsWith("`")) ? valuePart.slice(1, -1) : valuePart;
|
|
445
|
-
return (unquoted.endsWith(";") ? unquoted.slice(0, -1) : unquoted).trim();
|
|
446
|
-
}
|
|
447
|
-
const validateApiKeyInput = (value) => normalizeApiKeyInput(value).length > 0 ? void 0 : "Required";
|
|
448
|
-
function formatApiKeyPreview(raw, opts = {}) {
|
|
449
|
-
const trimmed = raw.trim();
|
|
450
|
-
if (!trimmed) return "…";
|
|
451
|
-
const head = opts.head ?? DEFAULT_KEY_PREVIEW.head;
|
|
452
|
-
const tail = opts.tail ?? DEFAULT_KEY_PREVIEW.tail;
|
|
453
|
-
if (trimmed.length <= head + tail) {
|
|
454
|
-
const shortHead = Math.min(2, trimmed.length);
|
|
455
|
-
const shortTail = Math.min(2, trimmed.length - shortHead);
|
|
456
|
-
if (shortTail <= 0) return `${trimmed.slice(0, shortHead)}…`;
|
|
457
|
-
return `${trimmed.slice(0, shortHead)}…${trimmed.slice(-shortTail)}`;
|
|
458
|
-
}
|
|
459
|
-
return `${trimmed.slice(0, head)}…${trimmed.slice(-tail)}`;
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
//#endregion
|
|
463
|
-
//#region src/commands/auth-choice.apply.anthropic.ts
|
|
464
|
-
async function applyAuthChoiceAnthropic(params) {
|
|
465
|
-
if (params.authChoice === "setup-token" || params.authChoice === "oauth" || params.authChoice === "token") {
|
|
466
|
-
let nextConfig = params.config;
|
|
467
|
-
await params.prompter.note(["Run `claude setup-token` in your terminal.", "Then paste the generated token below."].join("\n"), "Anthropic setup-token");
|
|
468
|
-
const tokenRaw = await params.prompter.text({
|
|
469
|
-
message: "Paste Anthropic setup-token",
|
|
470
|
-
validate: (value) => validateAnthropicSetupToken(String(value ?? ""))
|
|
471
|
-
});
|
|
472
|
-
const token = String(tokenRaw ?? "").trim();
|
|
473
|
-
const profileNameRaw = await params.prompter.text({
|
|
474
|
-
message: "Token name (blank = default)",
|
|
475
|
-
placeholder: "default"
|
|
476
|
-
});
|
|
477
|
-
const provider = "anthropic";
|
|
478
|
-
const namedProfileId = buildTokenProfileId({
|
|
479
|
-
provider,
|
|
480
|
-
name: String(profileNameRaw ?? "")
|
|
481
|
-
});
|
|
482
|
-
upsertAuthProfile({
|
|
483
|
-
profileId: namedProfileId,
|
|
484
|
-
agentDir: params.agentDir,
|
|
485
|
-
credential: {
|
|
486
|
-
type: "token",
|
|
487
|
-
provider,
|
|
488
|
-
token
|
|
489
|
-
}
|
|
490
|
-
});
|
|
491
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
492
|
-
profileId: namedProfileId,
|
|
493
|
-
provider,
|
|
494
|
-
mode: "token"
|
|
495
|
-
});
|
|
496
|
-
return { config: nextConfig };
|
|
497
|
-
}
|
|
498
|
-
if (params.authChoice === "apiKey") {
|
|
499
|
-
if (params.opts?.tokenProvider && params.opts.tokenProvider !== "anthropic") return null;
|
|
500
|
-
let nextConfig = params.config;
|
|
501
|
-
let hasCredential = false;
|
|
502
|
-
const envKey = process.env.ANTHROPIC_API_KEY?.trim();
|
|
503
|
-
if (params.opts?.token) {
|
|
504
|
-
await setAnthropicApiKey(normalizeApiKeyInput(params.opts.token), params.agentDir);
|
|
505
|
-
hasCredential = true;
|
|
506
|
-
}
|
|
507
|
-
if (!hasCredential && envKey) {
|
|
508
|
-
if (await params.prompter.confirm({
|
|
509
|
-
message: `Use existing ANTHROPIC_API_KEY (env, ${formatApiKeyPreview(envKey)})?`,
|
|
510
|
-
initialValue: true
|
|
511
|
-
})) {
|
|
512
|
-
await setAnthropicApiKey(envKey, params.agentDir);
|
|
513
|
-
hasCredential = true;
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
if (!hasCredential) {
|
|
517
|
-
const key = await params.prompter.text({
|
|
518
|
-
message: "Enter Anthropic API key",
|
|
519
|
-
validate: validateApiKeyInput
|
|
520
|
-
});
|
|
521
|
-
await setAnthropicApiKey(normalizeApiKeyInput(String(key ?? "")), params.agentDir);
|
|
522
|
-
}
|
|
523
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
524
|
-
profileId: "anthropic:default",
|
|
525
|
-
provider: "anthropic",
|
|
526
|
-
mode: "api_key"
|
|
527
|
-
});
|
|
528
|
-
return { config: nextConfig };
|
|
529
|
-
}
|
|
530
|
-
return null;
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
//#endregion
|
|
534
|
-
//#region src/commands/model-allowlist.ts
|
|
535
|
-
function ensureModelAllowlistEntry(params) {
|
|
536
|
-
const rawModelRef = params.modelRef.trim();
|
|
537
|
-
if (!rawModelRef) return params.cfg;
|
|
538
|
-
const models = { ...params.cfg.agents?.defaults?.models };
|
|
539
|
-
const keySet = new Set([rawModelRef]);
|
|
540
|
-
const canonicalKey = resolveAllowlistModelKey(rawModelRef, params.defaultProvider ?? DEFAULT_PROVIDER);
|
|
541
|
-
if (canonicalKey) keySet.add(canonicalKey);
|
|
542
|
-
for (const key of keySet) models[key] = { ...models[key] };
|
|
543
|
-
return {
|
|
544
|
-
...params.cfg,
|
|
545
|
-
agents: {
|
|
546
|
-
...params.cfg.agents,
|
|
547
|
-
defaults: {
|
|
548
|
-
...params.cfg.agents?.defaults,
|
|
549
|
-
models
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
};
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
//#endregion
|
|
556
|
-
//#region src/commands/auth-choice.default-model.ts
|
|
557
|
-
async function applyDefaultModelChoice(params) {
|
|
558
|
-
if (params.setDefaultModel) {
|
|
559
|
-
const next = params.applyDefaultConfig(params.config);
|
|
560
|
-
if (params.noteDefault) await params.prompter.note(`Default model set to ${params.noteDefault}`, "Model configured");
|
|
561
|
-
return { config: next };
|
|
562
|
-
}
|
|
563
|
-
const nextWithModel = ensureModelAllowlistEntry({
|
|
564
|
-
cfg: params.applyProviderConfig(params.config),
|
|
565
|
-
modelRef: params.defaultModel
|
|
566
|
-
});
|
|
567
|
-
await params.noteAgentModel(params.defaultModel);
|
|
568
|
-
return {
|
|
569
|
-
config: nextWithModel,
|
|
570
|
-
agentModelOverride: params.defaultModel
|
|
571
|
-
};
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
//#endregion
|
|
575
|
-
//#region src/commands/auth-choice.apply.huggingface.ts
|
|
576
|
-
async function applyAuthChoiceHuggingface(params) {
|
|
577
|
-
if (params.authChoice !== "huggingface-api-key") return null;
|
|
578
|
-
let nextConfig = params.config;
|
|
579
|
-
let agentModelOverride;
|
|
580
|
-
const noteAgentModel = async (model) => {
|
|
581
|
-
if (!params.agentId) return;
|
|
582
|
-
await params.prompter.note(`Default model set to ${model} for agent "${params.agentId}".`, "Model configured");
|
|
583
|
-
};
|
|
584
|
-
let hasCredential = false;
|
|
585
|
-
let hfKey = "";
|
|
586
|
-
if (!hasCredential && params.opts?.token && params.opts.tokenProvider === "huggingface") {
|
|
587
|
-
hfKey = normalizeApiKeyInput(params.opts.token);
|
|
588
|
-
await setHuggingfaceApiKey(hfKey, params.agentDir);
|
|
589
|
-
hasCredential = true;
|
|
590
|
-
}
|
|
591
|
-
if (!hasCredential) await params.prompter.note(["Hugging Face Inference Providers offer OpenAI-compatible chat completions.", "Create a token at: https://huggingface.co/settings/tokens (fine-grained, 'Make calls to Inference Providers')."].join("\n"), "Hugging Face");
|
|
592
|
-
if (!hasCredential) {
|
|
593
|
-
const envKey = resolveEnvApiKey("huggingface");
|
|
594
|
-
if (envKey) {
|
|
595
|
-
if (await params.prompter.confirm({
|
|
596
|
-
message: `Use existing Hugging Face token (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
|
|
597
|
-
initialValue: true
|
|
598
|
-
})) {
|
|
599
|
-
hfKey = envKey.apiKey;
|
|
600
|
-
await setHuggingfaceApiKey(hfKey, params.agentDir);
|
|
601
|
-
hasCredential = true;
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
if (!hasCredential) {
|
|
606
|
-
const key = await params.prompter.text({
|
|
607
|
-
message: "Enter Hugging Face API key (HF token)",
|
|
608
|
-
validate: validateApiKeyInput
|
|
609
|
-
});
|
|
610
|
-
hfKey = normalizeApiKeyInput(String(key ?? ""));
|
|
611
|
-
await setHuggingfaceApiKey(hfKey, params.agentDir);
|
|
612
|
-
}
|
|
613
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
614
|
-
profileId: "huggingface:default",
|
|
615
|
-
provider: "huggingface",
|
|
616
|
-
mode: "api_key"
|
|
617
|
-
});
|
|
618
|
-
const models = await discoverHuggingfaceModels(hfKey);
|
|
619
|
-
const modelRefPrefix = "huggingface/";
|
|
620
|
-
const options = [];
|
|
621
|
-
for (const m of models) {
|
|
622
|
-
const baseRef = `${modelRefPrefix}${m.id}`;
|
|
623
|
-
const label = m.name ?? m.id;
|
|
624
|
-
options.push({
|
|
625
|
-
value: baseRef,
|
|
626
|
-
label
|
|
627
|
-
});
|
|
628
|
-
options.push({
|
|
629
|
-
value: `${baseRef}:cheapest`,
|
|
630
|
-
label: `${label} (cheapest)`
|
|
631
|
-
});
|
|
632
|
-
options.push({
|
|
633
|
-
value: `${baseRef}:fastest`,
|
|
634
|
-
label: `${label} (fastest)`
|
|
635
|
-
});
|
|
636
|
-
}
|
|
637
|
-
const defaultRef = HUGGINGFACE_DEFAULT_MODEL_REF;
|
|
638
|
-
options.sort((a, b) => {
|
|
639
|
-
if (a.value === defaultRef) return -1;
|
|
640
|
-
if (b.value === defaultRef) return 1;
|
|
641
|
-
return a.label.localeCompare(b.label, void 0, { sensitivity: "base" });
|
|
642
|
-
});
|
|
643
|
-
const selectedModelRef = options.length === 0 ? defaultRef : options.length === 1 ? options[0].value : await params.prompter.select({
|
|
644
|
-
message: "Default Hugging Face model",
|
|
645
|
-
options,
|
|
646
|
-
initialValue: options.some((o) => o.value === defaultRef) ? defaultRef : options[0].value
|
|
647
|
-
});
|
|
648
|
-
if (isHuggingfacePolicyLocked(selectedModelRef)) await params.prompter.note("Provider locked — router will choose backend by cost or speed.", "Hugging Face");
|
|
649
|
-
const applied = await applyDefaultModelChoice({
|
|
650
|
-
config: nextConfig,
|
|
651
|
-
setDefaultModel: params.setDefaultModel,
|
|
652
|
-
defaultModel: selectedModelRef,
|
|
653
|
-
applyDefaultConfig: (config) => {
|
|
654
|
-
const withProvider = applyHuggingfaceProviderConfig(config);
|
|
655
|
-
const existingModel = withProvider.agents?.defaults?.model;
|
|
656
|
-
return ensureModelAllowlistEntry({
|
|
657
|
-
cfg: {
|
|
658
|
-
...withProvider,
|
|
659
|
-
agents: {
|
|
660
|
-
...withProvider.agents,
|
|
661
|
-
defaults: {
|
|
662
|
-
...withProvider.agents?.defaults,
|
|
663
|
-
model: {
|
|
664
|
-
...existingModel && typeof existingModel === "object" && "fallbacks" in existingModel ? { fallbacks: existingModel.fallbacks } : {},
|
|
665
|
-
primary: selectedModelRef
|
|
666
|
-
}
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
},
|
|
670
|
-
modelRef: selectedModelRef
|
|
671
|
-
});
|
|
672
|
-
},
|
|
673
|
-
applyProviderConfig: applyHuggingfaceProviderConfig,
|
|
674
|
-
noteDefault: selectedModelRef,
|
|
675
|
-
noteAgentModel,
|
|
676
|
-
prompter: params.prompter
|
|
677
|
-
});
|
|
678
|
-
nextConfig = applied.config;
|
|
679
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
680
|
-
return {
|
|
681
|
-
config: nextConfig,
|
|
682
|
-
agentModelOverride
|
|
683
|
-
};
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
//#endregion
|
|
687
|
-
//#region src/commands/auth-choice.apply.openrouter.ts
|
|
688
|
-
async function applyAuthChoiceOpenRouter(params) {
|
|
689
|
-
let nextConfig = params.config;
|
|
690
|
-
let agentModelOverride;
|
|
691
|
-
const noteAgentModel = async (model) => {
|
|
692
|
-
if (!params.agentId) return;
|
|
693
|
-
await params.prompter.note(`Default model set to ${model} for agent "${params.agentId}".`, "Model configured");
|
|
694
|
-
};
|
|
695
|
-
const store = ensureAuthProfileStore(params.agentDir, { allowKeychainPrompt: false });
|
|
696
|
-
const existingProfileId = resolveAuthProfileOrder({
|
|
697
|
-
cfg: nextConfig,
|
|
698
|
-
store,
|
|
699
|
-
provider: "openrouter"
|
|
700
|
-
}).find((profileId) => Boolean(store.profiles[profileId]));
|
|
701
|
-
const existingCred = existingProfileId ? store.profiles[existingProfileId] : void 0;
|
|
702
|
-
let profileId = "openrouter:default";
|
|
703
|
-
let mode = "api_key";
|
|
704
|
-
let hasCredential = false;
|
|
705
|
-
if (existingProfileId && existingCred?.type) {
|
|
706
|
-
profileId = existingProfileId;
|
|
707
|
-
mode = existingCred.type === "oauth" ? "oauth" : existingCred.type === "token" ? "token" : "api_key";
|
|
708
|
-
hasCredential = true;
|
|
709
|
-
}
|
|
710
|
-
if (!hasCredential && params.opts?.token && params.opts?.tokenProvider === "openrouter") {
|
|
711
|
-
await setOpenrouterApiKey(normalizeApiKeyInput(params.opts.token), params.agentDir);
|
|
712
|
-
hasCredential = true;
|
|
713
|
-
}
|
|
714
|
-
if (!hasCredential) {
|
|
715
|
-
const envKey = resolveEnvApiKey("openrouter");
|
|
716
|
-
if (envKey) {
|
|
717
|
-
if (await params.prompter.confirm({
|
|
718
|
-
message: `Use existing OPENROUTER_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
|
|
719
|
-
initialValue: true
|
|
720
|
-
})) {
|
|
721
|
-
await setOpenrouterApiKey(envKey.apiKey, params.agentDir);
|
|
722
|
-
hasCredential = true;
|
|
723
|
-
}
|
|
724
|
-
}
|
|
725
|
-
}
|
|
726
|
-
if (!hasCredential) {
|
|
727
|
-
const key = await params.prompter.text({
|
|
728
|
-
message: "Enter OpenRouter API key",
|
|
729
|
-
validate: validateApiKeyInput
|
|
730
|
-
});
|
|
731
|
-
await setOpenrouterApiKey(normalizeApiKeyInput(String(key ?? "")), params.agentDir);
|
|
732
|
-
hasCredential = true;
|
|
733
|
-
}
|
|
734
|
-
if (hasCredential) nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
735
|
-
profileId,
|
|
736
|
-
provider: "openrouter",
|
|
737
|
-
mode
|
|
738
|
-
});
|
|
739
|
-
const applied = await applyDefaultModelChoice({
|
|
740
|
-
config: nextConfig,
|
|
741
|
-
setDefaultModel: params.setDefaultModel,
|
|
742
|
-
defaultModel: OPENROUTER_DEFAULT_MODEL_REF,
|
|
743
|
-
applyDefaultConfig: applyOpenrouterConfig,
|
|
744
|
-
applyProviderConfig: applyOpenrouterProviderConfig,
|
|
745
|
-
noteDefault: OPENROUTER_DEFAULT_MODEL_REF,
|
|
746
|
-
noteAgentModel,
|
|
747
|
-
prompter: params.prompter
|
|
748
|
-
});
|
|
749
|
-
nextConfig = applied.config;
|
|
750
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
751
|
-
return {
|
|
752
|
-
config: nextConfig,
|
|
753
|
-
agentModelOverride
|
|
754
|
-
};
|
|
755
|
-
}
|
|
756
|
-
|
|
757
|
-
//#endregion
|
|
758
|
-
//#region src/commands/google-gemini-model-default.ts
|
|
759
|
-
const GOOGLE_GEMINI_DEFAULT_MODEL = "google/gemini-3-pro-preview";
|
|
760
|
-
function resolvePrimaryModel$1(model) {
|
|
761
|
-
if (typeof model === "string") return model;
|
|
762
|
-
if (model && typeof model === "object" && typeof model.primary === "string") return model.primary;
|
|
763
|
-
}
|
|
764
|
-
function applyGoogleGeminiModelDefault(cfg) {
|
|
765
|
-
if (resolvePrimaryModel$1(cfg.agents?.defaults?.model)?.trim() === GOOGLE_GEMINI_DEFAULT_MODEL) return {
|
|
766
|
-
next: cfg,
|
|
767
|
-
changed: false
|
|
768
|
-
};
|
|
769
|
-
return {
|
|
770
|
-
next: {
|
|
771
|
-
...cfg,
|
|
772
|
-
agents: {
|
|
773
|
-
...cfg.agents,
|
|
774
|
-
defaults: {
|
|
775
|
-
...cfg.agents?.defaults,
|
|
776
|
-
model: cfg.agents?.defaults?.model && typeof cfg.agents.defaults.model === "object" ? {
|
|
777
|
-
...cfg.agents.defaults.model,
|
|
778
|
-
primary: GOOGLE_GEMINI_DEFAULT_MODEL
|
|
779
|
-
} : { primary: GOOGLE_GEMINI_DEFAULT_MODEL }
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
},
|
|
783
|
-
changed: true
|
|
784
|
-
};
|
|
785
|
-
}
|
|
786
|
-
|
|
787
|
-
//#endregion
|
|
788
|
-
//#region src/commands/opencode-zen-model-default.ts
|
|
789
|
-
const OPENCODE_ZEN_DEFAULT_MODEL = "opencode/claude-opus-4-6";
|
|
790
|
-
|
|
791
|
-
//#endregion
|
|
792
|
-
//#region src/commands/zai-endpoint-detect.ts
|
|
793
|
-
async function probeZaiChatCompletions(params) {
|
|
794
|
-
try {
|
|
795
|
-
const res = await fetchWithTimeout(`${params.baseUrl}/chat/completions`, {
|
|
796
|
-
method: "POST",
|
|
797
|
-
headers: {
|
|
798
|
-
authorization: `Bearer ${params.apiKey}`,
|
|
799
|
-
"content-type": "application/json"
|
|
800
|
-
},
|
|
801
|
-
body: JSON.stringify({
|
|
802
|
-
model: params.modelId,
|
|
803
|
-
stream: false,
|
|
804
|
-
max_tokens: 1,
|
|
805
|
-
messages: [{
|
|
806
|
-
role: "user",
|
|
807
|
-
content: "ping"
|
|
808
|
-
}]
|
|
809
|
-
})
|
|
810
|
-
}, params.timeoutMs, params.fetchFn);
|
|
811
|
-
if (res.ok) return { ok: true };
|
|
812
|
-
let errorCode;
|
|
813
|
-
let errorMessage;
|
|
814
|
-
try {
|
|
815
|
-
const json = await res.json();
|
|
816
|
-
const code = json?.error?.code;
|
|
817
|
-
const msg = json?.error?.message ?? json?.msg ?? json?.message;
|
|
818
|
-
if (typeof code === "string") errorCode = code;
|
|
819
|
-
else if (typeof code === "number") errorCode = String(code);
|
|
820
|
-
if (typeof msg === "string") errorMessage = msg;
|
|
821
|
-
} catch {}
|
|
822
|
-
return {
|
|
823
|
-
ok: false,
|
|
824
|
-
status: res.status,
|
|
825
|
-
errorCode,
|
|
826
|
-
errorMessage
|
|
827
|
-
};
|
|
828
|
-
} catch {
|
|
829
|
-
return { ok: false };
|
|
830
|
-
}
|
|
831
|
-
}
|
|
832
|
-
async function detectZaiEndpoint(params) {
|
|
833
|
-
if (process.env.VITEST && !params.fetchFn) return null;
|
|
834
|
-
const timeoutMs = params.timeoutMs ?? 5e3;
|
|
835
|
-
const glm5 = [{
|
|
836
|
-
endpoint: "global",
|
|
837
|
-
baseUrl: ZAI_GLOBAL_BASE_URL
|
|
838
|
-
}, {
|
|
839
|
-
endpoint: "cn",
|
|
840
|
-
baseUrl: ZAI_CN_BASE_URL
|
|
841
|
-
}];
|
|
842
|
-
for (const candidate of glm5) if ((await probeZaiChatCompletions({
|
|
843
|
-
baseUrl: candidate.baseUrl,
|
|
844
|
-
apiKey: params.apiKey,
|
|
845
|
-
modelId: "glm-5",
|
|
846
|
-
timeoutMs,
|
|
847
|
-
fetchFn: params.fetchFn
|
|
848
|
-
})).ok) return {
|
|
849
|
-
endpoint: candidate.endpoint,
|
|
850
|
-
baseUrl: candidate.baseUrl,
|
|
851
|
-
modelId: "glm-5",
|
|
852
|
-
note: `Verified GLM-5 on ${candidate.endpoint} endpoint.`
|
|
853
|
-
};
|
|
854
|
-
const coding = [{
|
|
855
|
-
endpoint: "coding-global",
|
|
856
|
-
baseUrl: ZAI_CODING_GLOBAL_BASE_URL
|
|
857
|
-
}, {
|
|
858
|
-
endpoint: "coding-cn",
|
|
859
|
-
baseUrl: ZAI_CODING_CN_BASE_URL
|
|
860
|
-
}];
|
|
861
|
-
for (const candidate of coding) if ((await probeZaiChatCompletions({
|
|
862
|
-
baseUrl: candidate.baseUrl,
|
|
863
|
-
apiKey: params.apiKey,
|
|
864
|
-
modelId: "glm-4.7",
|
|
865
|
-
timeoutMs,
|
|
866
|
-
fetchFn: params.fetchFn
|
|
867
|
-
})).ok) return {
|
|
868
|
-
endpoint: candidate.endpoint,
|
|
869
|
-
baseUrl: candidate.baseUrl,
|
|
870
|
-
modelId: "glm-4.7",
|
|
871
|
-
note: "Coding Plan endpoint detected; GLM-5 is not available there. Defaulting to GLM-4.7."
|
|
872
|
-
};
|
|
873
|
-
return null;
|
|
874
|
-
}
|
|
875
|
-
|
|
876
|
-
//#endregion
|
|
877
|
-
//#region src/commands/auth-choice.apply.api-providers.ts
|
|
878
|
-
async function applyAuthChoiceApiProviders(params) {
|
|
879
|
-
let nextConfig = params.config;
|
|
880
|
-
let agentModelOverride;
|
|
881
|
-
const noteAgentModel = async (model) => {
|
|
882
|
-
if (!params.agentId) return;
|
|
883
|
-
await params.prompter.note(`Default model set to ${model} for agent "${params.agentId}".`, "Model configured");
|
|
884
|
-
};
|
|
885
|
-
let authChoice = params.authChoice;
|
|
886
|
-
if (authChoice === "apiKey" && params.opts?.tokenProvider && params.opts.tokenProvider !== "anthropic" && params.opts.tokenProvider !== "openai") {
|
|
887
|
-
if (params.opts.tokenProvider === "openrouter") authChoice = "openrouter-api-key";
|
|
888
|
-
else if (params.opts.tokenProvider === "litellm") authChoice = "litellm-api-key";
|
|
889
|
-
else if (params.opts.tokenProvider === "vercel-ai-gateway") authChoice = "ai-gateway-api-key";
|
|
890
|
-
else if (params.opts.tokenProvider === "cloudflare-ai-gateway") authChoice = "cloudflare-ai-gateway-api-key";
|
|
891
|
-
else if (params.opts.tokenProvider === "moonshot") authChoice = "moonshot-api-key";
|
|
892
|
-
else if (params.opts.tokenProvider === "kimi-code" || params.opts.tokenProvider === "kimi-coding") authChoice = "kimi-code-api-key";
|
|
893
|
-
else if (params.opts.tokenProvider === "google") authChoice = "gemini-api-key";
|
|
894
|
-
else if (params.opts.tokenProvider === "zai") authChoice = "zai-api-key";
|
|
895
|
-
else if (params.opts.tokenProvider === "xiaomi") authChoice = "xiaomi-api-key";
|
|
896
|
-
else if (params.opts.tokenProvider === "synthetic") authChoice = "synthetic-api-key";
|
|
897
|
-
else if (params.opts.tokenProvider === "venice") authChoice = "venice-api-key";
|
|
898
|
-
else if (params.opts.tokenProvider === "together") authChoice = "together-api-key";
|
|
899
|
-
else if (params.opts.tokenProvider === "huggingface") authChoice = "huggingface-api-key";
|
|
900
|
-
else if (params.opts.tokenProvider === "opencode") authChoice = "opencode-zen";
|
|
901
|
-
else if (params.opts.tokenProvider === "qianfan") authChoice = "qianfan-api-key";
|
|
902
|
-
}
|
|
903
|
-
async function ensureMoonshotApiKeyCredential(promptMessage) {
|
|
904
|
-
let hasCredential = false;
|
|
905
|
-
if (!hasCredential && params.opts?.token && params.opts?.tokenProvider === "moonshot") {
|
|
906
|
-
await setMoonshotApiKey(normalizeApiKeyInput(params.opts.token), params.agentDir);
|
|
907
|
-
hasCredential = true;
|
|
908
|
-
}
|
|
909
|
-
const envKey = resolveEnvApiKey("moonshot");
|
|
910
|
-
if (envKey) {
|
|
911
|
-
if (await params.prompter.confirm({
|
|
912
|
-
message: `Use existing MOONSHOT_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
|
|
913
|
-
initialValue: true
|
|
914
|
-
})) {
|
|
915
|
-
await setMoonshotApiKey(envKey.apiKey, params.agentDir);
|
|
916
|
-
hasCredential = true;
|
|
917
|
-
}
|
|
918
|
-
}
|
|
919
|
-
if (!hasCredential) {
|
|
920
|
-
const key = await params.prompter.text({
|
|
921
|
-
message: promptMessage,
|
|
922
|
-
validate: validateApiKeyInput
|
|
923
|
-
});
|
|
924
|
-
await setMoonshotApiKey(normalizeApiKeyInput(String(key ?? "")), params.agentDir);
|
|
925
|
-
}
|
|
926
|
-
}
|
|
927
|
-
if (authChoice === "openrouter-api-key") return applyAuthChoiceOpenRouter(params);
|
|
928
|
-
if (authChoice === "litellm-api-key") {
|
|
929
|
-
const store = ensureAuthProfileStore(params.agentDir, { allowKeychainPrompt: false });
|
|
930
|
-
const existingProfileId = resolveAuthProfileOrder({
|
|
931
|
-
cfg: nextConfig,
|
|
932
|
-
store,
|
|
933
|
-
provider: "litellm"
|
|
934
|
-
}).find((profileId) => Boolean(store.profiles[profileId]));
|
|
935
|
-
const existingCred = existingProfileId ? store.profiles[existingProfileId] : void 0;
|
|
936
|
-
let profileId = "litellm:default";
|
|
937
|
-
let hasCredential = false;
|
|
938
|
-
if (existingProfileId && existingCred?.type === "api_key") {
|
|
939
|
-
profileId = existingProfileId;
|
|
940
|
-
hasCredential = true;
|
|
941
|
-
}
|
|
942
|
-
if (!hasCredential && params.opts?.token && params.opts?.tokenProvider === "litellm") {
|
|
943
|
-
await setLitellmApiKey(normalizeApiKeyInput(params.opts.token), params.agentDir);
|
|
944
|
-
hasCredential = true;
|
|
945
|
-
}
|
|
946
|
-
if (!hasCredential) {
|
|
947
|
-
await params.prompter.note("LiteLLM provides a unified API to 100+ LLM providers.\nGet your API key from your LiteLLM proxy or https://litellm.ai\nDefault proxy runs on http://localhost:4000", "LiteLLM");
|
|
948
|
-
const envKey = resolveEnvApiKey("litellm");
|
|
949
|
-
if (envKey) {
|
|
950
|
-
if (await params.prompter.confirm({
|
|
951
|
-
message: `Use existing LITELLM_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
|
|
952
|
-
initialValue: true
|
|
953
|
-
})) {
|
|
954
|
-
await setLitellmApiKey(envKey.apiKey, params.agentDir);
|
|
955
|
-
hasCredential = true;
|
|
956
|
-
}
|
|
957
|
-
}
|
|
958
|
-
if (!hasCredential) {
|
|
959
|
-
const key = await params.prompter.text({
|
|
960
|
-
message: "Enter LiteLLM API key",
|
|
961
|
-
validate: validateApiKeyInput
|
|
962
|
-
});
|
|
963
|
-
await setLitellmApiKey(normalizeApiKeyInput(String(key ?? "")), params.agentDir);
|
|
964
|
-
hasCredential = true;
|
|
965
|
-
}
|
|
966
|
-
}
|
|
967
|
-
if (hasCredential) nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
968
|
-
profileId,
|
|
969
|
-
provider: "litellm",
|
|
970
|
-
mode: "api_key"
|
|
971
|
-
});
|
|
972
|
-
const applied = await applyDefaultModelChoice({
|
|
973
|
-
config: nextConfig,
|
|
974
|
-
setDefaultModel: params.setDefaultModel,
|
|
975
|
-
defaultModel: LITELLM_DEFAULT_MODEL_REF,
|
|
976
|
-
applyDefaultConfig: applyLitellmConfig,
|
|
977
|
-
applyProviderConfig: applyLitellmProviderConfig,
|
|
978
|
-
noteDefault: LITELLM_DEFAULT_MODEL_REF,
|
|
979
|
-
noteAgentModel,
|
|
980
|
-
prompter: params.prompter
|
|
981
|
-
});
|
|
982
|
-
nextConfig = applied.config;
|
|
983
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
984
|
-
return {
|
|
985
|
-
config: nextConfig,
|
|
986
|
-
agentModelOverride
|
|
987
|
-
};
|
|
988
|
-
}
|
|
989
|
-
if (authChoice === "ai-gateway-api-key") {
|
|
990
|
-
let hasCredential = false;
|
|
991
|
-
if (!hasCredential && params.opts?.token && params.opts?.tokenProvider === "vercel-ai-gateway") {
|
|
992
|
-
await setVercelAiGatewayApiKey(normalizeApiKeyInput(params.opts.token), params.agentDir);
|
|
993
|
-
hasCredential = true;
|
|
994
|
-
}
|
|
995
|
-
const envKey = resolveEnvApiKey("vercel-ai-gateway");
|
|
996
|
-
if (envKey) {
|
|
997
|
-
if (await params.prompter.confirm({
|
|
998
|
-
message: `Use existing AI_GATEWAY_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
|
|
999
|
-
initialValue: true
|
|
1000
|
-
})) {
|
|
1001
|
-
await setVercelAiGatewayApiKey(envKey.apiKey, params.agentDir);
|
|
1002
|
-
hasCredential = true;
|
|
1003
|
-
}
|
|
1004
|
-
}
|
|
1005
|
-
if (!hasCredential) {
|
|
1006
|
-
const key = await params.prompter.text({
|
|
1007
|
-
message: "Enter Vercel AI Gateway API key",
|
|
1008
|
-
validate: validateApiKeyInput
|
|
1009
|
-
});
|
|
1010
|
-
await setVercelAiGatewayApiKey(normalizeApiKeyInput(String(key ?? "")), params.agentDir);
|
|
1011
|
-
}
|
|
1012
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
1013
|
-
profileId: "vercel-ai-gateway:default",
|
|
1014
|
-
provider: "vercel-ai-gateway",
|
|
1015
|
-
mode: "api_key"
|
|
1016
|
-
});
|
|
1017
|
-
{
|
|
1018
|
-
const applied = await applyDefaultModelChoice({
|
|
1019
|
-
config: nextConfig,
|
|
1020
|
-
setDefaultModel: params.setDefaultModel,
|
|
1021
|
-
defaultModel: VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF,
|
|
1022
|
-
applyDefaultConfig: applyVercelAiGatewayConfig,
|
|
1023
|
-
applyProviderConfig: applyVercelAiGatewayProviderConfig,
|
|
1024
|
-
noteDefault: VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF,
|
|
1025
|
-
noteAgentModel,
|
|
1026
|
-
prompter: params.prompter
|
|
1027
|
-
});
|
|
1028
|
-
nextConfig = applied.config;
|
|
1029
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
1030
|
-
}
|
|
1031
|
-
return {
|
|
1032
|
-
config: nextConfig,
|
|
1033
|
-
agentModelOverride
|
|
1034
|
-
};
|
|
1035
|
-
}
|
|
1036
|
-
if (authChoice === "cloudflare-ai-gateway-api-key") {
|
|
1037
|
-
let hasCredential = false;
|
|
1038
|
-
let accountId = params.opts?.cloudflareAiGatewayAccountId?.trim() ?? "";
|
|
1039
|
-
let gatewayId = params.opts?.cloudflareAiGatewayGatewayId?.trim() ?? "";
|
|
1040
|
-
const ensureAccountGateway = async () => {
|
|
1041
|
-
if (!accountId) {
|
|
1042
|
-
const value = await params.prompter.text({
|
|
1043
|
-
message: "Enter Cloudflare Account ID",
|
|
1044
|
-
validate: (val) => String(val ?? "").trim() ? void 0 : "Account ID is required"
|
|
1045
|
-
});
|
|
1046
|
-
accountId = String(value ?? "").trim();
|
|
1047
|
-
}
|
|
1048
|
-
if (!gatewayId) {
|
|
1049
|
-
const value = await params.prompter.text({
|
|
1050
|
-
message: "Enter Cloudflare AI Gateway ID",
|
|
1051
|
-
validate: (val) => String(val ?? "").trim() ? void 0 : "Gateway ID is required"
|
|
1052
|
-
});
|
|
1053
|
-
gatewayId = String(value ?? "").trim();
|
|
1054
|
-
}
|
|
1055
|
-
};
|
|
1056
|
-
const optsApiKey = normalizeApiKeyInput(params.opts?.cloudflareAiGatewayApiKey ?? "");
|
|
1057
|
-
if (!hasCredential && accountId && gatewayId && optsApiKey) {
|
|
1058
|
-
await setCloudflareAiGatewayConfig(accountId, gatewayId, optsApiKey, params.agentDir);
|
|
1059
|
-
hasCredential = true;
|
|
1060
|
-
}
|
|
1061
|
-
const envKey = resolveEnvApiKey("cloudflare-ai-gateway");
|
|
1062
|
-
if (!hasCredential && envKey) {
|
|
1063
|
-
if (await params.prompter.confirm({
|
|
1064
|
-
message: `Use existing CLOUDFLARE_AI_GATEWAY_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
|
|
1065
|
-
initialValue: true
|
|
1066
|
-
})) {
|
|
1067
|
-
await ensureAccountGateway();
|
|
1068
|
-
await setCloudflareAiGatewayConfig(accountId, gatewayId, normalizeApiKeyInput(envKey.apiKey), params.agentDir);
|
|
1069
|
-
hasCredential = true;
|
|
1070
|
-
}
|
|
1071
|
-
}
|
|
1072
|
-
if (!hasCredential && optsApiKey) {
|
|
1073
|
-
await ensureAccountGateway();
|
|
1074
|
-
await setCloudflareAiGatewayConfig(accountId, gatewayId, optsApiKey, params.agentDir);
|
|
1075
|
-
hasCredential = true;
|
|
1076
|
-
}
|
|
1077
|
-
if (!hasCredential) {
|
|
1078
|
-
await ensureAccountGateway();
|
|
1079
|
-
const key = await params.prompter.text({
|
|
1080
|
-
message: "Enter Cloudflare AI Gateway API key",
|
|
1081
|
-
validate: validateApiKeyInput
|
|
1082
|
-
});
|
|
1083
|
-
await setCloudflareAiGatewayConfig(accountId, gatewayId, normalizeApiKeyInput(String(key ?? "")), params.agentDir);
|
|
1084
|
-
hasCredential = true;
|
|
1085
|
-
}
|
|
1086
|
-
if (hasCredential) nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
1087
|
-
profileId: "cloudflare-ai-gateway:default",
|
|
1088
|
-
provider: "cloudflare-ai-gateway",
|
|
1089
|
-
mode: "api_key"
|
|
1090
|
-
});
|
|
1091
|
-
{
|
|
1092
|
-
const applied = await applyDefaultModelChoice({
|
|
1093
|
-
config: nextConfig,
|
|
1094
|
-
setDefaultModel: params.setDefaultModel,
|
|
1095
|
-
defaultModel: CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF,
|
|
1096
|
-
applyDefaultConfig: (cfg) => applyCloudflareAiGatewayConfig(cfg, {
|
|
1097
|
-
accountId: accountId || params.opts?.cloudflareAiGatewayAccountId,
|
|
1098
|
-
gatewayId: gatewayId || params.opts?.cloudflareAiGatewayGatewayId
|
|
1099
|
-
}),
|
|
1100
|
-
applyProviderConfig: (cfg) => applyCloudflareAiGatewayProviderConfig(cfg, {
|
|
1101
|
-
accountId: accountId || params.opts?.cloudflareAiGatewayAccountId,
|
|
1102
|
-
gatewayId: gatewayId || params.opts?.cloudflareAiGatewayGatewayId
|
|
1103
|
-
}),
|
|
1104
|
-
noteDefault: CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF,
|
|
1105
|
-
noteAgentModel,
|
|
1106
|
-
prompter: params.prompter
|
|
1107
|
-
});
|
|
1108
|
-
nextConfig = applied.config;
|
|
1109
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
1110
|
-
}
|
|
1111
|
-
return {
|
|
1112
|
-
config: nextConfig,
|
|
1113
|
-
agentModelOverride
|
|
1114
|
-
};
|
|
1115
|
-
}
|
|
1116
|
-
if (authChoice === "moonshot-api-key") {
|
|
1117
|
-
await ensureMoonshotApiKeyCredential("Enter Moonshot API key");
|
|
1118
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
1119
|
-
profileId: "moonshot:default",
|
|
1120
|
-
provider: "moonshot",
|
|
1121
|
-
mode: "api_key"
|
|
1122
|
-
});
|
|
1123
|
-
{
|
|
1124
|
-
const applied = await applyDefaultModelChoice({
|
|
1125
|
-
config: nextConfig,
|
|
1126
|
-
setDefaultModel: params.setDefaultModel,
|
|
1127
|
-
defaultModel: MOONSHOT_DEFAULT_MODEL_REF,
|
|
1128
|
-
applyDefaultConfig: applyMoonshotConfig,
|
|
1129
|
-
applyProviderConfig: applyMoonshotProviderConfig,
|
|
1130
|
-
noteAgentModel,
|
|
1131
|
-
prompter: params.prompter
|
|
1132
|
-
});
|
|
1133
|
-
nextConfig = applied.config;
|
|
1134
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
1135
|
-
}
|
|
1136
|
-
return {
|
|
1137
|
-
config: nextConfig,
|
|
1138
|
-
agentModelOverride
|
|
1139
|
-
};
|
|
1140
|
-
}
|
|
1141
|
-
if (authChoice === "moonshot-api-key-cn") {
|
|
1142
|
-
await ensureMoonshotApiKeyCredential("Enter Moonshot API key (.cn)");
|
|
1143
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
1144
|
-
profileId: "moonshot:default",
|
|
1145
|
-
provider: "moonshot",
|
|
1146
|
-
mode: "api_key"
|
|
1147
|
-
});
|
|
1148
|
-
{
|
|
1149
|
-
const applied = await applyDefaultModelChoice({
|
|
1150
|
-
config: nextConfig,
|
|
1151
|
-
setDefaultModel: params.setDefaultModel,
|
|
1152
|
-
defaultModel: MOONSHOT_DEFAULT_MODEL_REF,
|
|
1153
|
-
applyDefaultConfig: applyMoonshotConfigCn,
|
|
1154
|
-
applyProviderConfig: applyMoonshotProviderConfigCn,
|
|
1155
|
-
noteAgentModel,
|
|
1156
|
-
prompter: params.prompter
|
|
1157
|
-
});
|
|
1158
|
-
nextConfig = applied.config;
|
|
1159
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
1160
|
-
}
|
|
1161
|
-
return {
|
|
1162
|
-
config: nextConfig,
|
|
1163
|
-
agentModelOverride
|
|
1164
|
-
};
|
|
1165
|
-
}
|
|
1166
|
-
if (authChoice === "kimi-code-api-key") {
|
|
1167
|
-
let hasCredential = false;
|
|
1168
|
-
const tokenProvider = params.opts?.tokenProvider?.trim().toLowerCase();
|
|
1169
|
-
if (!hasCredential && params.opts?.token && (tokenProvider === "kimi-code" || tokenProvider === "kimi-coding")) {
|
|
1170
|
-
await setKimiCodingApiKey(normalizeApiKeyInput(params.opts.token), params.agentDir);
|
|
1171
|
-
hasCredential = true;
|
|
1172
|
-
}
|
|
1173
|
-
if (!hasCredential) await params.prompter.note(["Kimi Coding uses a dedicated endpoint and API key.", "Get your API key at: https://www.kimi.com/code/en"].join("\n"), "Kimi Coding");
|
|
1174
|
-
const envKey = resolveEnvApiKey("kimi-coding");
|
|
1175
|
-
if (envKey) {
|
|
1176
|
-
if (await params.prompter.confirm({
|
|
1177
|
-
message: `Use existing KIMI_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
|
|
1178
|
-
initialValue: true
|
|
1179
|
-
})) {
|
|
1180
|
-
await setKimiCodingApiKey(envKey.apiKey, params.agentDir);
|
|
1181
|
-
hasCredential = true;
|
|
1182
|
-
}
|
|
1183
|
-
}
|
|
1184
|
-
if (!hasCredential) {
|
|
1185
|
-
const key = await params.prompter.text({
|
|
1186
|
-
message: "Enter Kimi Coding API key",
|
|
1187
|
-
validate: validateApiKeyInput
|
|
1188
|
-
});
|
|
1189
|
-
await setKimiCodingApiKey(normalizeApiKeyInput(String(key ?? "")), params.agentDir);
|
|
1190
|
-
}
|
|
1191
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
1192
|
-
profileId: "kimi-coding:default",
|
|
1193
|
-
provider: "kimi-coding",
|
|
1194
|
-
mode: "api_key"
|
|
1195
|
-
});
|
|
1196
|
-
{
|
|
1197
|
-
const applied = await applyDefaultModelChoice({
|
|
1198
|
-
config: nextConfig,
|
|
1199
|
-
setDefaultModel: params.setDefaultModel,
|
|
1200
|
-
defaultModel: KIMI_CODING_MODEL_REF,
|
|
1201
|
-
applyDefaultConfig: applyKimiCodeConfig,
|
|
1202
|
-
applyProviderConfig: applyKimiCodeProviderConfig,
|
|
1203
|
-
noteDefault: KIMI_CODING_MODEL_REF,
|
|
1204
|
-
noteAgentModel,
|
|
1205
|
-
prompter: params.prompter
|
|
1206
|
-
});
|
|
1207
|
-
nextConfig = applied.config;
|
|
1208
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
1209
|
-
}
|
|
1210
|
-
return {
|
|
1211
|
-
config: nextConfig,
|
|
1212
|
-
agentModelOverride
|
|
1213
|
-
};
|
|
1214
|
-
}
|
|
1215
|
-
if (authChoice === "gemini-api-key") {
|
|
1216
|
-
let hasCredential = false;
|
|
1217
|
-
if (!hasCredential && params.opts?.token && params.opts?.tokenProvider === "google") {
|
|
1218
|
-
await setGeminiApiKey(normalizeApiKeyInput(params.opts.token), params.agentDir);
|
|
1219
|
-
hasCredential = true;
|
|
1220
|
-
}
|
|
1221
|
-
const envKey = resolveEnvApiKey("google");
|
|
1222
|
-
if (envKey) {
|
|
1223
|
-
if (await params.prompter.confirm({
|
|
1224
|
-
message: `Use existing GEMINI_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
|
|
1225
|
-
initialValue: true
|
|
1226
|
-
})) {
|
|
1227
|
-
await setGeminiApiKey(envKey.apiKey, params.agentDir);
|
|
1228
|
-
hasCredential = true;
|
|
1229
|
-
}
|
|
1230
|
-
}
|
|
1231
|
-
if (!hasCredential) {
|
|
1232
|
-
const key = await params.prompter.text({
|
|
1233
|
-
message: "Enter Gemini API key",
|
|
1234
|
-
validate: validateApiKeyInput
|
|
1235
|
-
});
|
|
1236
|
-
await setGeminiApiKey(normalizeApiKeyInput(String(key ?? "")), params.agentDir);
|
|
1237
|
-
}
|
|
1238
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
1239
|
-
profileId: "google:default",
|
|
1240
|
-
provider: "google",
|
|
1241
|
-
mode: "api_key"
|
|
1242
|
-
});
|
|
1243
|
-
if (params.setDefaultModel) {
|
|
1244
|
-
const applied = applyGoogleGeminiModelDefault(nextConfig);
|
|
1245
|
-
nextConfig = applied.next;
|
|
1246
|
-
if (applied.changed) await params.prompter.note(`Default model set to ${GOOGLE_GEMINI_DEFAULT_MODEL}`, "Model configured");
|
|
1247
|
-
} else {
|
|
1248
|
-
agentModelOverride = GOOGLE_GEMINI_DEFAULT_MODEL;
|
|
1249
|
-
await noteAgentModel(GOOGLE_GEMINI_DEFAULT_MODEL);
|
|
1250
|
-
}
|
|
1251
|
-
return {
|
|
1252
|
-
config: nextConfig,
|
|
1253
|
-
agentModelOverride
|
|
1254
|
-
};
|
|
1255
|
-
}
|
|
1256
|
-
if (authChoice === "zai-api-key" || authChoice === "zai-coding-global" || authChoice === "zai-coding-cn" || authChoice === "zai-global" || authChoice === "zai-cn") {
|
|
1257
|
-
let endpoint;
|
|
1258
|
-
if (authChoice === "zai-coding-global") endpoint = "coding-global";
|
|
1259
|
-
else if (authChoice === "zai-coding-cn") endpoint = "coding-cn";
|
|
1260
|
-
else if (authChoice === "zai-global") endpoint = "global";
|
|
1261
|
-
else if (authChoice === "zai-cn") endpoint = "cn";
|
|
1262
|
-
let hasCredential = false;
|
|
1263
|
-
let apiKey = "";
|
|
1264
|
-
if (!hasCredential && params.opts?.token && params.opts?.tokenProvider === "zai") {
|
|
1265
|
-
apiKey = normalizeApiKeyInput(params.opts.token);
|
|
1266
|
-
await setZaiApiKey(apiKey, params.agentDir);
|
|
1267
|
-
hasCredential = true;
|
|
1268
|
-
}
|
|
1269
|
-
const envKey = resolveEnvApiKey("zai");
|
|
1270
|
-
if (envKey) {
|
|
1271
|
-
if (await params.prompter.confirm({
|
|
1272
|
-
message: `Use existing ZAI_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
|
|
1273
|
-
initialValue: true
|
|
1274
|
-
})) {
|
|
1275
|
-
apiKey = envKey.apiKey;
|
|
1276
|
-
await setZaiApiKey(apiKey, params.agentDir);
|
|
1277
|
-
hasCredential = true;
|
|
1278
|
-
}
|
|
1279
|
-
}
|
|
1280
|
-
if (!hasCredential) {
|
|
1281
|
-
const key = await params.prompter.text({
|
|
1282
|
-
message: "Enter Z.AI API key",
|
|
1283
|
-
validate: validateApiKeyInput
|
|
1284
|
-
});
|
|
1285
|
-
apiKey = normalizeApiKeyInput(String(key ?? ""));
|
|
1286
|
-
await setZaiApiKey(apiKey, params.agentDir);
|
|
1287
|
-
}
|
|
1288
|
-
let modelIdOverride;
|
|
1289
|
-
if (!endpoint) {
|
|
1290
|
-
const detected = await detectZaiEndpoint({ apiKey });
|
|
1291
|
-
if (detected) {
|
|
1292
|
-
endpoint = detected.endpoint;
|
|
1293
|
-
modelIdOverride = detected.modelId;
|
|
1294
|
-
await params.prompter.note(detected.note, "Z.AI endpoint");
|
|
1295
|
-
} else endpoint = await params.prompter.select({
|
|
1296
|
-
message: "Select Z.AI endpoint",
|
|
1297
|
-
options: [
|
|
1298
|
-
{
|
|
1299
|
-
value: "coding-global",
|
|
1300
|
-
label: "Coding-Plan-Global",
|
|
1301
|
-
hint: "GLM Coding Plan Global (api.z.ai)"
|
|
1302
|
-
},
|
|
1303
|
-
{
|
|
1304
|
-
value: "coding-cn",
|
|
1305
|
-
label: "Coding-Plan-CN",
|
|
1306
|
-
hint: "GLM Coding Plan CN (open.bigmodel.cn)"
|
|
1307
|
-
},
|
|
1308
|
-
{
|
|
1309
|
-
value: "global",
|
|
1310
|
-
label: "Global",
|
|
1311
|
-
hint: "Z.AI Global (api.z.ai)"
|
|
1312
|
-
},
|
|
1313
|
-
{
|
|
1314
|
-
value: "cn",
|
|
1315
|
-
label: "CN",
|
|
1316
|
-
hint: "Z.AI CN (open.bigmodel.cn)"
|
|
1317
|
-
}
|
|
1318
|
-
],
|
|
1319
|
-
initialValue: "global"
|
|
1320
|
-
});
|
|
1321
|
-
}
|
|
1322
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
1323
|
-
profileId: "zai:default",
|
|
1324
|
-
provider: "zai",
|
|
1325
|
-
mode: "api_key"
|
|
1326
|
-
});
|
|
1327
|
-
const defaultModel = modelIdOverride ? `zai/${modelIdOverride}` : ZAI_DEFAULT_MODEL_REF;
|
|
1328
|
-
const applied = await applyDefaultModelChoice({
|
|
1329
|
-
config: nextConfig,
|
|
1330
|
-
setDefaultModel: params.setDefaultModel,
|
|
1331
|
-
defaultModel,
|
|
1332
|
-
applyDefaultConfig: (config) => applyZaiConfig(config, {
|
|
1333
|
-
endpoint,
|
|
1334
|
-
...modelIdOverride ? { modelId: modelIdOverride } : {}
|
|
1335
|
-
}),
|
|
1336
|
-
applyProviderConfig: (config) => applyZaiProviderConfig(config, {
|
|
1337
|
-
endpoint,
|
|
1338
|
-
...modelIdOverride ? { modelId: modelIdOverride } : {}
|
|
1339
|
-
}),
|
|
1340
|
-
noteDefault: defaultModel,
|
|
1341
|
-
noteAgentModel,
|
|
1342
|
-
prompter: params.prompter
|
|
1343
|
-
});
|
|
1344
|
-
nextConfig = applied.config;
|
|
1345
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
1346
|
-
return {
|
|
1347
|
-
config: nextConfig,
|
|
1348
|
-
agentModelOverride
|
|
1349
|
-
};
|
|
1350
|
-
}
|
|
1351
|
-
if (authChoice === "xiaomi-api-key") {
|
|
1352
|
-
let hasCredential = false;
|
|
1353
|
-
if (!hasCredential && params.opts?.token && params.opts?.tokenProvider === "xiaomi") {
|
|
1354
|
-
await setXiaomiApiKey(normalizeApiKeyInput(params.opts.token), params.agentDir);
|
|
1355
|
-
hasCredential = true;
|
|
1356
|
-
}
|
|
1357
|
-
const envKey = resolveEnvApiKey("xiaomi");
|
|
1358
|
-
if (envKey) {
|
|
1359
|
-
if (await params.prompter.confirm({
|
|
1360
|
-
message: `Use existing XIAOMI_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
|
|
1361
|
-
initialValue: true
|
|
1362
|
-
})) {
|
|
1363
|
-
await setXiaomiApiKey(envKey.apiKey, params.agentDir);
|
|
1364
|
-
hasCredential = true;
|
|
1365
|
-
}
|
|
1366
|
-
}
|
|
1367
|
-
if (!hasCredential) {
|
|
1368
|
-
const key = await params.prompter.text({
|
|
1369
|
-
message: "Enter Xiaomi API key",
|
|
1370
|
-
validate: validateApiKeyInput
|
|
1371
|
-
});
|
|
1372
|
-
await setXiaomiApiKey(normalizeApiKeyInput(String(key ?? "")), params.agentDir);
|
|
1373
|
-
}
|
|
1374
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
1375
|
-
profileId: "xiaomi:default",
|
|
1376
|
-
provider: "xiaomi",
|
|
1377
|
-
mode: "api_key"
|
|
1378
|
-
});
|
|
1379
|
-
{
|
|
1380
|
-
const applied = await applyDefaultModelChoice({
|
|
1381
|
-
config: nextConfig,
|
|
1382
|
-
setDefaultModel: params.setDefaultModel,
|
|
1383
|
-
defaultModel: XIAOMI_DEFAULT_MODEL_REF,
|
|
1384
|
-
applyDefaultConfig: applyXiaomiConfig,
|
|
1385
|
-
applyProviderConfig: applyXiaomiProviderConfig,
|
|
1386
|
-
noteDefault: XIAOMI_DEFAULT_MODEL_REF,
|
|
1387
|
-
noteAgentModel,
|
|
1388
|
-
prompter: params.prompter
|
|
1389
|
-
});
|
|
1390
|
-
nextConfig = applied.config;
|
|
1391
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
1392
|
-
}
|
|
1393
|
-
return {
|
|
1394
|
-
config: nextConfig,
|
|
1395
|
-
agentModelOverride
|
|
1396
|
-
};
|
|
1397
|
-
}
|
|
1398
|
-
if (authChoice === "synthetic-api-key") {
|
|
1399
|
-
if (params.opts?.token && params.opts?.tokenProvider === "synthetic") await setSyntheticApiKey(String(params.opts.token ?? "").trim(), params.agentDir);
|
|
1400
|
-
else {
|
|
1401
|
-
const key = await params.prompter.text({
|
|
1402
|
-
message: "Enter Synthetic API key",
|
|
1403
|
-
validate: (value) => value?.trim() ? void 0 : "Required"
|
|
1404
|
-
});
|
|
1405
|
-
await setSyntheticApiKey(String(key ?? "").trim(), params.agentDir);
|
|
1406
|
-
}
|
|
1407
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
1408
|
-
profileId: "synthetic:default",
|
|
1409
|
-
provider: "synthetic",
|
|
1410
|
-
mode: "api_key"
|
|
1411
|
-
});
|
|
1412
|
-
{
|
|
1413
|
-
const applied = await applyDefaultModelChoice({
|
|
1414
|
-
config: nextConfig,
|
|
1415
|
-
setDefaultModel: params.setDefaultModel,
|
|
1416
|
-
defaultModel: SYNTHETIC_DEFAULT_MODEL_REF,
|
|
1417
|
-
applyDefaultConfig: applySyntheticConfig,
|
|
1418
|
-
applyProviderConfig: applySyntheticProviderConfig,
|
|
1419
|
-
noteDefault: SYNTHETIC_DEFAULT_MODEL_REF,
|
|
1420
|
-
noteAgentModel,
|
|
1421
|
-
prompter: params.prompter
|
|
1422
|
-
});
|
|
1423
|
-
nextConfig = applied.config;
|
|
1424
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
1425
|
-
}
|
|
1426
|
-
return {
|
|
1427
|
-
config: nextConfig,
|
|
1428
|
-
agentModelOverride
|
|
1429
|
-
};
|
|
1430
|
-
}
|
|
1431
|
-
if (authChoice === "venice-api-key") {
|
|
1432
|
-
let hasCredential = false;
|
|
1433
|
-
if (!hasCredential && params.opts?.token && params.opts?.tokenProvider === "venice") {
|
|
1434
|
-
await setVeniceApiKey(normalizeApiKeyInput(params.opts.token), params.agentDir);
|
|
1435
|
-
hasCredential = true;
|
|
1436
|
-
}
|
|
1437
|
-
if (!hasCredential) await params.prompter.note([
|
|
1438
|
-
"Venice AI provides privacy-focused inference with uncensored models.",
|
|
1439
|
-
"Get your API key at: https://venice.ai/settings/api",
|
|
1440
|
-
"Supports 'private' (fully private) and 'anonymized' (proxy) modes."
|
|
1441
|
-
].join("\n"), "Venice AI");
|
|
1442
|
-
const envKey = resolveEnvApiKey("venice");
|
|
1443
|
-
if (envKey) {
|
|
1444
|
-
if (await params.prompter.confirm({
|
|
1445
|
-
message: `Use existing VENICE_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
|
|
1446
|
-
initialValue: true
|
|
1447
|
-
})) {
|
|
1448
|
-
await setVeniceApiKey(envKey.apiKey, params.agentDir);
|
|
1449
|
-
hasCredential = true;
|
|
1450
|
-
}
|
|
1451
|
-
}
|
|
1452
|
-
if (!hasCredential) {
|
|
1453
|
-
const key = await params.prompter.text({
|
|
1454
|
-
message: "Enter Venice AI API key",
|
|
1455
|
-
validate: validateApiKeyInput
|
|
1456
|
-
});
|
|
1457
|
-
await setVeniceApiKey(normalizeApiKeyInput(String(key ?? "")), params.agentDir);
|
|
1458
|
-
}
|
|
1459
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
1460
|
-
profileId: "venice:default",
|
|
1461
|
-
provider: "venice",
|
|
1462
|
-
mode: "api_key"
|
|
1463
|
-
});
|
|
1464
|
-
{
|
|
1465
|
-
const applied = await applyDefaultModelChoice({
|
|
1466
|
-
config: nextConfig,
|
|
1467
|
-
setDefaultModel: params.setDefaultModel,
|
|
1468
|
-
defaultModel: VENICE_DEFAULT_MODEL_REF,
|
|
1469
|
-
applyDefaultConfig: applyVeniceConfig,
|
|
1470
|
-
applyProviderConfig: applyVeniceProviderConfig,
|
|
1471
|
-
noteDefault: VENICE_DEFAULT_MODEL_REF,
|
|
1472
|
-
noteAgentModel,
|
|
1473
|
-
prompter: params.prompter
|
|
1474
|
-
});
|
|
1475
|
-
nextConfig = applied.config;
|
|
1476
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
1477
|
-
}
|
|
1478
|
-
return {
|
|
1479
|
-
config: nextConfig,
|
|
1480
|
-
agentModelOverride
|
|
1481
|
-
};
|
|
1482
|
-
}
|
|
1483
|
-
if (authChoice === "opencode-zen") {
|
|
1484
|
-
let hasCredential = false;
|
|
1485
|
-
if (!hasCredential && params.opts?.token && params.opts?.tokenProvider === "opencode") {
|
|
1486
|
-
await setOpencodeZenApiKey(normalizeApiKeyInput(params.opts.token), params.agentDir);
|
|
1487
|
-
hasCredential = true;
|
|
1488
|
-
}
|
|
1489
|
-
if (!hasCredential) await params.prompter.note([
|
|
1490
|
-
"OpenCode Zen provides access to Claude, GPT, Gemini, and more models.",
|
|
1491
|
-
"Get your API key at: https://opencode.ai/auth",
|
|
1492
|
-
"OpenCode Zen bills per request. Check your OpenCode dashboard for details."
|
|
1493
|
-
].join("\n"), "OpenCode Zen");
|
|
1494
|
-
const envKey = resolveEnvApiKey("opencode");
|
|
1495
|
-
if (envKey) {
|
|
1496
|
-
if (await params.prompter.confirm({
|
|
1497
|
-
message: `Use existing OPENCODE_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
|
|
1498
|
-
initialValue: true
|
|
1499
|
-
})) {
|
|
1500
|
-
await setOpencodeZenApiKey(envKey.apiKey, params.agentDir);
|
|
1501
|
-
hasCredential = true;
|
|
1502
|
-
}
|
|
1503
|
-
}
|
|
1504
|
-
if (!hasCredential) {
|
|
1505
|
-
const key = await params.prompter.text({
|
|
1506
|
-
message: "Enter OpenCode Zen API key",
|
|
1507
|
-
validate: validateApiKeyInput
|
|
1508
|
-
});
|
|
1509
|
-
await setOpencodeZenApiKey(normalizeApiKeyInput(String(key ?? "")), params.agentDir);
|
|
1510
|
-
}
|
|
1511
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
1512
|
-
profileId: "opencode:default",
|
|
1513
|
-
provider: "opencode",
|
|
1514
|
-
mode: "api_key"
|
|
1515
|
-
});
|
|
1516
|
-
{
|
|
1517
|
-
const applied = await applyDefaultModelChoice({
|
|
1518
|
-
config: nextConfig,
|
|
1519
|
-
setDefaultModel: params.setDefaultModel,
|
|
1520
|
-
defaultModel: OPENCODE_ZEN_DEFAULT_MODEL,
|
|
1521
|
-
applyDefaultConfig: applyOpencodeZenConfig,
|
|
1522
|
-
applyProviderConfig: applyOpencodeZenProviderConfig,
|
|
1523
|
-
noteDefault: OPENCODE_ZEN_DEFAULT_MODEL,
|
|
1524
|
-
noteAgentModel,
|
|
1525
|
-
prompter: params.prompter
|
|
1526
|
-
});
|
|
1527
|
-
nextConfig = applied.config;
|
|
1528
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
1529
|
-
}
|
|
1530
|
-
return {
|
|
1531
|
-
config: nextConfig,
|
|
1532
|
-
agentModelOverride
|
|
1533
|
-
};
|
|
1534
|
-
}
|
|
1535
|
-
if (authChoice === "together-api-key") {
|
|
1536
|
-
let hasCredential = false;
|
|
1537
|
-
if (!hasCredential && params.opts?.token && params.opts?.tokenProvider === "together") {
|
|
1538
|
-
await setTogetherApiKey(normalizeApiKeyInput(params.opts.token), params.agentDir);
|
|
1539
|
-
hasCredential = true;
|
|
1540
|
-
}
|
|
1541
|
-
if (!hasCredential) await params.prompter.note(["Together AI provides access to leading open-source models including Llama, DeepSeek, Qwen, and more.", "Get your API key at: https://api.together.xyz/settings/api-keys"].join("\n"), "Together AI");
|
|
1542
|
-
const envKey = resolveEnvApiKey("together");
|
|
1543
|
-
if (envKey) {
|
|
1544
|
-
if (await params.prompter.confirm({
|
|
1545
|
-
message: `Use existing TOGETHER_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
|
|
1546
|
-
initialValue: true
|
|
1547
|
-
})) {
|
|
1548
|
-
await setTogetherApiKey(envKey.apiKey, params.agentDir);
|
|
1549
|
-
hasCredential = true;
|
|
1550
|
-
}
|
|
1551
|
-
}
|
|
1552
|
-
if (!hasCredential) {
|
|
1553
|
-
const key = await params.prompter.text({
|
|
1554
|
-
message: "Enter Together AI API key",
|
|
1555
|
-
validate: validateApiKeyInput
|
|
1556
|
-
});
|
|
1557
|
-
await setTogetherApiKey(normalizeApiKeyInput(String(key ?? "")), params.agentDir);
|
|
1558
|
-
}
|
|
1559
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
1560
|
-
profileId: "together:default",
|
|
1561
|
-
provider: "together",
|
|
1562
|
-
mode: "api_key"
|
|
1563
|
-
});
|
|
1564
|
-
{
|
|
1565
|
-
const applied = await applyDefaultModelChoice({
|
|
1566
|
-
config: nextConfig,
|
|
1567
|
-
setDefaultModel: params.setDefaultModel,
|
|
1568
|
-
defaultModel: TOGETHER_DEFAULT_MODEL_REF,
|
|
1569
|
-
applyDefaultConfig: applyTogetherConfig,
|
|
1570
|
-
applyProviderConfig: applyTogetherProviderConfig,
|
|
1571
|
-
noteDefault: TOGETHER_DEFAULT_MODEL_REF,
|
|
1572
|
-
noteAgentModel,
|
|
1573
|
-
prompter: params.prompter
|
|
1574
|
-
});
|
|
1575
|
-
nextConfig = applied.config;
|
|
1576
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
1577
|
-
}
|
|
1578
|
-
return {
|
|
1579
|
-
config: nextConfig,
|
|
1580
|
-
agentModelOverride
|
|
1581
|
-
};
|
|
1582
|
-
}
|
|
1583
|
-
if (authChoice === "huggingface-api-key") return applyAuthChoiceHuggingface({
|
|
1584
|
-
...params,
|
|
1585
|
-
authChoice
|
|
1586
|
-
});
|
|
1587
|
-
if (authChoice === "qianfan-api-key") {
|
|
1588
|
-
let hasCredential = false;
|
|
1589
|
-
if (!hasCredential && params.opts?.token && params.opts?.tokenProvider === "qianfan") {
|
|
1590
|
-
setQianfanApiKey(normalizeApiKeyInput(params.opts.token), params.agentDir);
|
|
1591
|
-
hasCredential = true;
|
|
1592
|
-
}
|
|
1593
|
-
if (!hasCredential) await params.prompter.note(["Get your API key at: https://console.bce.baidu.com/qianfan/ais/console/apiKey", "API key format: bce-v3/ALTAK-..."].join("\n"), "QIANFAN");
|
|
1594
|
-
const envKey = resolveEnvApiKey("qianfan");
|
|
1595
|
-
if (envKey) {
|
|
1596
|
-
if (await params.prompter.confirm({
|
|
1597
|
-
message: `Use existing QIANFAN_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
|
|
1598
|
-
initialValue: true
|
|
1599
|
-
})) {
|
|
1600
|
-
setQianfanApiKey(envKey.apiKey, params.agentDir);
|
|
1601
|
-
hasCredential = true;
|
|
1602
|
-
}
|
|
1603
|
-
}
|
|
1604
|
-
if (!hasCredential) {
|
|
1605
|
-
const key = await params.prompter.text({
|
|
1606
|
-
message: "Enter QIANFAN API key",
|
|
1607
|
-
validate: validateApiKeyInput
|
|
1608
|
-
});
|
|
1609
|
-
setQianfanApiKey(normalizeApiKeyInput(String(key ?? "")), params.agentDir);
|
|
1610
|
-
}
|
|
1611
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
1612
|
-
profileId: "qianfan:default",
|
|
1613
|
-
provider: "qianfan",
|
|
1614
|
-
mode: "api_key"
|
|
1615
|
-
});
|
|
1616
|
-
{
|
|
1617
|
-
const applied = await applyDefaultModelChoice({
|
|
1618
|
-
config: nextConfig,
|
|
1619
|
-
setDefaultModel: params.setDefaultModel,
|
|
1620
|
-
defaultModel: QIANFAN_DEFAULT_MODEL_REF,
|
|
1621
|
-
applyDefaultConfig: applyQianfanConfig,
|
|
1622
|
-
applyProviderConfig: applyQianfanProviderConfig,
|
|
1623
|
-
noteDefault: QIANFAN_DEFAULT_MODEL_REF,
|
|
1624
|
-
noteAgentModel,
|
|
1625
|
-
prompter: params.prompter
|
|
1626
|
-
});
|
|
1627
|
-
nextConfig = applied.config;
|
|
1628
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
1629
|
-
}
|
|
1630
|
-
return {
|
|
1631
|
-
config: nextConfig,
|
|
1632
|
-
agentModelOverride
|
|
1633
|
-
};
|
|
1634
|
-
}
|
|
1635
|
-
return null;
|
|
1636
|
-
}
|
|
1637
|
-
|
|
1638
|
-
//#endregion
|
|
1639
|
-
//#region src/commands/auth-choice.apply.plugin-provider.ts
|
|
1640
|
-
async function applyAuthChoicePluginProvider(params, options) {
|
|
1641
|
-
if (params.authChoice !== options.authChoice) return null;
|
|
1642
|
-
const enableResult = enablePluginInConfig(params.config, options.pluginId);
|
|
1643
|
-
let nextConfig = enableResult.config;
|
|
1644
|
-
if (!enableResult.enabled) {
|
|
1645
|
-
await params.prompter.note(`${options.label} plugin is disabled (${enableResult.reason ?? "blocked"}).`, options.label);
|
|
1646
|
-
return { config: nextConfig };
|
|
1647
|
-
}
|
|
1648
|
-
const agentId = params.agentId ?? resolveDefaultAgentId(nextConfig);
|
|
1649
|
-
const defaultAgentId = resolveDefaultAgentId(nextConfig);
|
|
1650
|
-
const agentDir = params.agentDir ?? (agentId === defaultAgentId ? resolveAnimaAgentDir() : resolveAgentDir(nextConfig, agentId));
|
|
1651
|
-
const workspaceDir = resolveAgentWorkspaceDir(nextConfig, agentId) ?? resolveDefaultAgentWorkspaceDir();
|
|
1652
|
-
const provider = resolveProviderMatch(resolvePluginProviders({
|
|
1653
|
-
config: nextConfig,
|
|
1654
|
-
workspaceDir
|
|
1655
|
-
}), options.providerId);
|
|
1656
|
-
if (!provider) {
|
|
1657
|
-
await params.prompter.note(`${options.label} auth plugin is not available. Enable it and re-run the wizard.`, options.label);
|
|
1658
|
-
return { config: nextConfig };
|
|
1659
|
-
}
|
|
1660
|
-
const method = pickAuthMethod(provider, options.methodId) ?? provider.auth[0];
|
|
1661
|
-
if (!method) {
|
|
1662
|
-
await params.prompter.note(`${options.label} auth method missing.`, options.label);
|
|
1663
|
-
return { config: nextConfig };
|
|
1664
|
-
}
|
|
1665
|
-
const isRemote = isRemoteEnvironment();
|
|
1666
|
-
const result = await method.run({
|
|
1667
|
-
config: nextConfig,
|
|
1668
|
-
agentDir,
|
|
1669
|
-
workspaceDir,
|
|
1670
|
-
prompter: params.prompter,
|
|
1671
|
-
runtime: params.runtime,
|
|
1672
|
-
isRemote,
|
|
1673
|
-
openUrl: async (url) => {
|
|
1674
|
-
await openUrl(url);
|
|
1675
|
-
},
|
|
1676
|
-
oauth: { createVpsAwareHandlers: (opts) => createVpsAwareOAuthHandlers(opts) }
|
|
1677
|
-
});
|
|
1678
|
-
if (result.configPatch) nextConfig = mergeConfigPatch(nextConfig, result.configPatch);
|
|
1679
|
-
for (const profile of result.profiles) {
|
|
1680
|
-
upsertAuthProfile({
|
|
1681
|
-
profileId: profile.profileId,
|
|
1682
|
-
credential: profile.credential,
|
|
1683
|
-
agentDir
|
|
1684
|
-
});
|
|
1685
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
1686
|
-
profileId: profile.profileId,
|
|
1687
|
-
provider: profile.credential.provider,
|
|
1688
|
-
mode: profile.credential.type === "token" ? "token" : profile.credential.type,
|
|
1689
|
-
..."email" in profile.credential && profile.credential.email ? { email: profile.credential.email } : {}
|
|
1690
|
-
});
|
|
1691
|
-
}
|
|
1692
|
-
let agentModelOverride;
|
|
1693
|
-
if (result.defaultModel) {
|
|
1694
|
-
if (params.setDefaultModel) {
|
|
1695
|
-
nextConfig = applyDefaultModel(nextConfig, result.defaultModel);
|
|
1696
|
-
await params.prompter.note(`Default model set to ${result.defaultModel}`, "Model configured");
|
|
1697
|
-
} else if (params.agentId) {
|
|
1698
|
-
agentModelOverride = result.defaultModel;
|
|
1699
|
-
await params.prompter.note(`Default model set to ${result.defaultModel} for agent "${params.agentId}".`, "Model configured");
|
|
1700
|
-
}
|
|
1701
|
-
}
|
|
1702
|
-
if (result.notes && result.notes.length > 0) await params.prompter.note(result.notes.join("\n"), "Provider notes");
|
|
1703
|
-
return {
|
|
1704
|
-
config: nextConfig,
|
|
1705
|
-
agentModelOverride
|
|
1706
|
-
};
|
|
1707
|
-
}
|
|
1708
|
-
|
|
1709
|
-
//#endregion
|
|
1710
|
-
//#region src/commands/auth-choice.apply.copilot-proxy.ts
|
|
1711
|
-
async function applyAuthChoiceCopilotProxy(params) {
|
|
1712
|
-
return await applyAuthChoicePluginProvider(params, {
|
|
1713
|
-
authChoice: "copilot-proxy",
|
|
1714
|
-
pluginId: "copilot-proxy",
|
|
1715
|
-
providerId: "copilot-proxy",
|
|
1716
|
-
methodId: "local",
|
|
1717
|
-
label: "Copilot Proxy"
|
|
1718
|
-
});
|
|
1719
|
-
}
|
|
1720
|
-
|
|
1721
|
-
//#endregion
|
|
1722
|
-
//#region src/commands/auth-choice.apply.github-copilot.ts
|
|
1723
|
-
async function applyAuthChoiceGitHubCopilot(params) {
|
|
1724
|
-
if (params.authChoice !== "github-copilot") return null;
|
|
1725
|
-
let nextConfig = params.config;
|
|
1726
|
-
await params.prompter.note(["This will open a GitHub device login to authorize Copilot.", "Requires an active GitHub Copilot subscription."].join("\n"), "GitHub Copilot");
|
|
1727
|
-
if (!process.stdin.isTTY) {
|
|
1728
|
-
await params.prompter.note("GitHub Copilot login requires an interactive TTY.", "GitHub Copilot");
|
|
1729
|
-
return { config: nextConfig };
|
|
1730
|
-
}
|
|
1731
|
-
try {
|
|
1732
|
-
await githubCopilotLoginCommand({ yes: true }, params.runtime);
|
|
1733
|
-
} catch (err) {
|
|
1734
|
-
await params.prompter.note(`GitHub Copilot login failed: ${String(err)}`, "GitHub Copilot");
|
|
1735
|
-
return { config: nextConfig };
|
|
1736
|
-
}
|
|
1737
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
1738
|
-
profileId: "github-copilot:github",
|
|
1739
|
-
provider: "github-copilot",
|
|
1740
|
-
mode: "token"
|
|
1741
|
-
});
|
|
1742
|
-
if (params.setDefaultModel) {
|
|
1743
|
-
const model = "github-copilot/gpt-4o";
|
|
1744
|
-
nextConfig = {
|
|
1745
|
-
...nextConfig,
|
|
1746
|
-
agents: {
|
|
1747
|
-
...nextConfig.agents,
|
|
1748
|
-
defaults: {
|
|
1749
|
-
...nextConfig.agents?.defaults,
|
|
1750
|
-
model: {
|
|
1751
|
-
...typeof nextConfig.agents?.defaults?.model === "object" ? nextConfig.agents.defaults.model : void 0,
|
|
1752
|
-
primary: model
|
|
1753
|
-
}
|
|
1754
|
-
}
|
|
1755
|
-
}
|
|
1756
|
-
};
|
|
1757
|
-
await params.prompter.note(`Default model set to ${model}`, "Model configured");
|
|
1758
|
-
}
|
|
1759
|
-
return { config: nextConfig };
|
|
1760
|
-
}
|
|
1761
|
-
|
|
1762
|
-
//#endregion
|
|
1763
|
-
//#region src/commands/auth-choice.apply.google-antigravity.ts
|
|
1764
|
-
async function applyAuthChoiceGoogleAntigravity(params) {
|
|
1765
|
-
return await applyAuthChoicePluginProvider(params, {
|
|
1766
|
-
authChoice: "google-antigravity",
|
|
1767
|
-
pluginId: "google-antigravity-auth",
|
|
1768
|
-
providerId: "google-antigravity",
|
|
1769
|
-
methodId: "oauth",
|
|
1770
|
-
label: "Google Antigravity"
|
|
1771
|
-
});
|
|
1772
|
-
}
|
|
1773
|
-
|
|
1774
|
-
//#endregion
|
|
1775
|
-
//#region src/commands/auth-choice.apply.google-gemini-cli.ts
|
|
1776
|
-
async function applyAuthChoiceGoogleGeminiCli(params) {
|
|
1777
|
-
return await applyAuthChoicePluginProvider(params, {
|
|
1778
|
-
authChoice: "google-gemini-cli",
|
|
1779
|
-
pluginId: "google-gemini-cli-auth",
|
|
1780
|
-
providerId: "google-gemini-cli",
|
|
1781
|
-
methodId: "oauth",
|
|
1782
|
-
label: "Google Gemini CLI"
|
|
1783
|
-
});
|
|
1784
|
-
}
|
|
1785
|
-
|
|
1786
|
-
//#endregion
|
|
1787
|
-
//#region src/commands/auth-choice.apply.minimax.ts
|
|
1788
|
-
async function applyAuthChoiceMiniMax(params) {
|
|
1789
|
-
let nextConfig = params.config;
|
|
1790
|
-
let agentModelOverride;
|
|
1791
|
-
const ensureMinimaxApiKey = async (opts) => {
|
|
1792
|
-
let hasCredential = false;
|
|
1793
|
-
const envKey = resolveEnvApiKey("minimax");
|
|
1794
|
-
if (envKey) {
|
|
1795
|
-
if (await params.prompter.confirm({
|
|
1796
|
-
message: `Use existing MINIMAX_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
|
|
1797
|
-
initialValue: true
|
|
1798
|
-
})) {
|
|
1799
|
-
await setMinimaxApiKey(envKey.apiKey, params.agentDir, opts.profileId);
|
|
1800
|
-
hasCredential = true;
|
|
1801
|
-
}
|
|
1802
|
-
}
|
|
1803
|
-
if (!hasCredential) {
|
|
1804
|
-
const key = await params.prompter.text({
|
|
1805
|
-
message: opts.promptMessage,
|
|
1806
|
-
validate: validateApiKeyInput
|
|
1807
|
-
});
|
|
1808
|
-
await setMinimaxApiKey(normalizeApiKeyInput(String(key)), params.agentDir, opts.profileId);
|
|
1809
|
-
}
|
|
1810
|
-
};
|
|
1811
|
-
const noteAgentModel = async (model) => {
|
|
1812
|
-
if (!params.agentId) return;
|
|
1813
|
-
await params.prompter.note(`Default model set to ${model} for agent "${params.agentId}".`, "Model configured");
|
|
1814
|
-
};
|
|
1815
|
-
if (params.authChoice === "minimax-portal") return await applyAuthChoicePluginProvider(params, {
|
|
1816
|
-
authChoice: "minimax-portal",
|
|
1817
|
-
pluginId: "minimax-portal-auth",
|
|
1818
|
-
providerId: "minimax-portal",
|
|
1819
|
-
methodId: await params.prompter.select({
|
|
1820
|
-
message: "Select MiniMax endpoint",
|
|
1821
|
-
options: [{
|
|
1822
|
-
value: "oauth",
|
|
1823
|
-
label: "Global",
|
|
1824
|
-
hint: "OAuth for international users"
|
|
1825
|
-
}, {
|
|
1826
|
-
value: "oauth-cn",
|
|
1827
|
-
label: "CN",
|
|
1828
|
-
hint: "OAuth for users in China"
|
|
1829
|
-
}]
|
|
1830
|
-
}),
|
|
1831
|
-
label: "MiniMax"
|
|
1832
|
-
});
|
|
1833
|
-
if (params.authChoice === "minimax-cloud" || params.authChoice === "minimax-api" || params.authChoice === "minimax-api-lightning") {
|
|
1834
|
-
const modelId = params.authChoice === "minimax-api-lightning" ? "MiniMax-M2.5-Lightning" : "MiniMax-M2.5";
|
|
1835
|
-
await ensureMinimaxApiKey({
|
|
1836
|
-
profileId: "minimax:default",
|
|
1837
|
-
promptMessage: "Enter MiniMax API key"
|
|
1838
|
-
});
|
|
1839
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
1840
|
-
profileId: "minimax:default",
|
|
1841
|
-
provider: "minimax",
|
|
1842
|
-
mode: "api_key"
|
|
1843
|
-
});
|
|
1844
|
-
{
|
|
1845
|
-
const modelRef = `minimax/${modelId}`;
|
|
1846
|
-
const applied = await applyDefaultModelChoice({
|
|
1847
|
-
config: nextConfig,
|
|
1848
|
-
setDefaultModel: params.setDefaultModel,
|
|
1849
|
-
defaultModel: modelRef,
|
|
1850
|
-
applyDefaultConfig: (config) => applyMinimaxApiConfig(config, modelId),
|
|
1851
|
-
applyProviderConfig: (config) => applyMinimaxApiProviderConfig(config, modelId),
|
|
1852
|
-
noteAgentModel,
|
|
1853
|
-
prompter: params.prompter
|
|
1854
|
-
});
|
|
1855
|
-
nextConfig = applied.config;
|
|
1856
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
1857
|
-
}
|
|
1858
|
-
return {
|
|
1859
|
-
config: nextConfig,
|
|
1860
|
-
agentModelOverride
|
|
1861
|
-
};
|
|
1862
|
-
}
|
|
1863
|
-
if (params.authChoice === "minimax-api-key-cn") {
|
|
1864
|
-
const modelId = "MiniMax-M2.5";
|
|
1865
|
-
await ensureMinimaxApiKey({
|
|
1866
|
-
profileId: "minimax-cn:default",
|
|
1867
|
-
promptMessage: "Enter MiniMax China API key"
|
|
1868
|
-
});
|
|
1869
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
1870
|
-
profileId: "minimax-cn:default",
|
|
1871
|
-
provider: "minimax-cn",
|
|
1872
|
-
mode: "api_key"
|
|
1873
|
-
});
|
|
1874
|
-
{
|
|
1875
|
-
const modelRef = `minimax-cn/${modelId}`;
|
|
1876
|
-
const applied = await applyDefaultModelChoice({
|
|
1877
|
-
config: nextConfig,
|
|
1878
|
-
setDefaultModel: params.setDefaultModel,
|
|
1879
|
-
defaultModel: modelRef,
|
|
1880
|
-
applyDefaultConfig: (config) => applyMinimaxApiConfigCn(config, modelId),
|
|
1881
|
-
applyProviderConfig: (config) => applyMinimaxApiProviderConfigCn(config, modelId),
|
|
1882
|
-
noteAgentModel,
|
|
1883
|
-
prompter: params.prompter
|
|
1884
|
-
});
|
|
1885
|
-
nextConfig = applied.config;
|
|
1886
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
1887
|
-
}
|
|
1888
|
-
return {
|
|
1889
|
-
config: nextConfig,
|
|
1890
|
-
agentModelOverride
|
|
1891
|
-
};
|
|
1892
|
-
}
|
|
1893
|
-
if (params.authChoice === "minimax") {
|
|
1894
|
-
const applied = await applyDefaultModelChoice({
|
|
1895
|
-
config: nextConfig,
|
|
1896
|
-
setDefaultModel: params.setDefaultModel,
|
|
1897
|
-
defaultModel: "lmstudio/minimax-m2.1-gs32",
|
|
1898
|
-
applyDefaultConfig: applyMinimaxConfig,
|
|
1899
|
-
applyProviderConfig: applyMinimaxProviderConfig,
|
|
1900
|
-
noteAgentModel,
|
|
1901
|
-
prompter: params.prompter
|
|
1902
|
-
});
|
|
1903
|
-
nextConfig = applied.config;
|
|
1904
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
1905
|
-
return {
|
|
1906
|
-
config: nextConfig,
|
|
1907
|
-
agentModelOverride
|
|
1908
|
-
};
|
|
1909
|
-
}
|
|
1910
|
-
return null;
|
|
1911
|
-
}
|
|
1912
|
-
|
|
1913
|
-
//#endregion
|
|
1914
|
-
//#region src/commands/chutes-oauth.ts
|
|
1915
|
-
function parseManualOAuthInput(input, expectedState) {
|
|
1916
|
-
const trimmed = String(input ?? "").trim();
|
|
1917
|
-
if (!trimmed) throw new Error("Missing OAuth redirect URL or authorization code.");
|
|
1918
|
-
if (!(/^https?:\/\//i.test(trimmed) || trimmed.includes("://") || trimmed.includes("?"))) return {
|
|
1919
|
-
code: trimmed,
|
|
1920
|
-
state: expectedState
|
|
1921
|
-
};
|
|
1922
|
-
const parsed = parseOAuthCallbackInput(trimmed, expectedState);
|
|
1923
|
-
if ("error" in parsed) throw new Error(parsed.error);
|
|
1924
|
-
if (parsed.state !== expectedState) throw new Error("Invalid OAuth state");
|
|
1925
|
-
return parsed;
|
|
1926
|
-
}
|
|
1927
|
-
function buildAuthorizeUrl(params) {
|
|
1928
|
-
return `${CHUTES_AUTHORIZE_ENDPOINT}?${new URLSearchParams({
|
|
1929
|
-
client_id: params.clientId,
|
|
1930
|
-
redirect_uri: params.redirectUri,
|
|
1931
|
-
response_type: "code",
|
|
1932
|
-
scope: params.scopes.join(" "),
|
|
1933
|
-
state: params.state,
|
|
1934
|
-
code_challenge: params.challenge,
|
|
1935
|
-
code_challenge_method: "S256"
|
|
1936
|
-
}).toString()}`;
|
|
1937
|
-
}
|
|
1938
|
-
async function waitForLocalCallback(params) {
|
|
1939
|
-
const redirectUrl = new URL(params.redirectUri);
|
|
1940
|
-
if (redirectUrl.protocol !== "http:") throw new Error(`Chutes OAuth redirect URI must be http:// (got ${params.redirectUri})`);
|
|
1941
|
-
const hostname = redirectUrl.hostname || "127.0.0.1";
|
|
1942
|
-
if (!isLoopbackHost(hostname)) throw new Error(`Chutes OAuth redirect hostname must be loopback (got ${hostname}). Use http://127.0.0.1:<port>/...`);
|
|
1943
|
-
const port = redirectUrl.port ? Number.parseInt(redirectUrl.port, 10) : 80;
|
|
1944
|
-
const expectedPath = redirectUrl.pathname || "/";
|
|
1945
|
-
return await new Promise((resolve, reject) => {
|
|
1946
|
-
let timeout = null;
|
|
1947
|
-
const server = createServer((req, res) => {
|
|
1948
|
-
try {
|
|
1949
|
-
const requestUrl = new URL(req.url ?? "/", redirectUrl.origin);
|
|
1950
|
-
if (requestUrl.pathname !== expectedPath) {
|
|
1951
|
-
res.statusCode = 404;
|
|
1952
|
-
res.setHeader("Content-Type", "text/plain; charset=utf-8");
|
|
1953
|
-
res.end("Not found");
|
|
1954
|
-
return;
|
|
1955
|
-
}
|
|
1956
|
-
const code = requestUrl.searchParams.get("code")?.trim();
|
|
1957
|
-
const state = requestUrl.searchParams.get("state")?.trim();
|
|
1958
|
-
if (!code) {
|
|
1959
|
-
res.statusCode = 400;
|
|
1960
|
-
res.setHeader("Content-Type", "text/plain; charset=utf-8");
|
|
1961
|
-
res.end("Missing code");
|
|
1962
|
-
return;
|
|
1963
|
-
}
|
|
1964
|
-
if (!state || state !== params.expectedState) {
|
|
1965
|
-
res.statusCode = 400;
|
|
1966
|
-
res.setHeader("Content-Type", "text/plain; charset=utf-8");
|
|
1967
|
-
res.end("Invalid state");
|
|
1968
|
-
return;
|
|
1969
|
-
}
|
|
1970
|
-
res.statusCode = 200;
|
|
1971
|
-
res.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
1972
|
-
res.end([
|
|
1973
|
-
"<!doctype html>",
|
|
1974
|
-
"<html><head><meta charset='utf-8' /></head>",
|
|
1975
|
-
"<body><h2>Chutes OAuth complete</h2>",
|
|
1976
|
-
"<p>You can close this window and return to Anima.</p></body></html>"
|
|
1977
|
-
].join(""));
|
|
1978
|
-
if (timeout) clearTimeout(timeout);
|
|
1979
|
-
server.close();
|
|
1980
|
-
resolve({
|
|
1981
|
-
code,
|
|
1982
|
-
state
|
|
1983
|
-
});
|
|
1984
|
-
} catch (err) {
|
|
1985
|
-
if (timeout) clearTimeout(timeout);
|
|
1986
|
-
server.close();
|
|
1987
|
-
reject(err);
|
|
1988
|
-
}
|
|
1989
|
-
});
|
|
1990
|
-
server.once("error", (err) => {
|
|
1991
|
-
if (timeout) clearTimeout(timeout);
|
|
1992
|
-
server.close();
|
|
1993
|
-
reject(err);
|
|
1994
|
-
});
|
|
1995
|
-
server.listen(port, hostname, () => {
|
|
1996
|
-
params.onProgress?.(`Waiting for OAuth callback on ${redirectUrl.origin}${expectedPath}…`);
|
|
1997
|
-
});
|
|
1998
|
-
timeout = setTimeout(() => {
|
|
1999
|
-
try {
|
|
2000
|
-
server.close();
|
|
2001
|
-
} catch {}
|
|
2002
|
-
reject(/* @__PURE__ */ new Error("OAuth callback timeout"));
|
|
2003
|
-
}, params.timeoutMs);
|
|
2004
|
-
});
|
|
2005
|
-
}
|
|
2006
|
-
async function loginChutes(params) {
|
|
2007
|
-
const createPkce = params.createPkce ?? generateChutesPkce;
|
|
2008
|
-
const createState = params.createState ?? (() => randomBytes(16).toString("hex"));
|
|
2009
|
-
const { verifier, challenge } = createPkce();
|
|
2010
|
-
const state = createState();
|
|
2011
|
-
const timeoutMs = params.timeoutMs ?? 180 * 1e3;
|
|
2012
|
-
const url = buildAuthorizeUrl({
|
|
2013
|
-
clientId: params.app.clientId,
|
|
2014
|
-
redirectUri: params.app.redirectUri,
|
|
2015
|
-
scopes: params.app.scopes,
|
|
2016
|
-
state,
|
|
2017
|
-
challenge
|
|
2018
|
-
});
|
|
2019
|
-
let codeAndState;
|
|
2020
|
-
if (params.manual) {
|
|
2021
|
-
await params.onAuth({ url });
|
|
2022
|
-
params.onProgress?.("Waiting for redirect URL…");
|
|
2023
|
-
codeAndState = parseManualOAuthInput(await params.onPrompt({
|
|
2024
|
-
message: "Paste the redirect URL (or authorization code)",
|
|
2025
|
-
placeholder: `${params.app.redirectUri}?code=...&state=...`
|
|
2026
|
-
}), state);
|
|
2027
|
-
} else {
|
|
2028
|
-
const callback = waitForLocalCallback({
|
|
2029
|
-
redirectUri: params.app.redirectUri,
|
|
2030
|
-
expectedState: state,
|
|
2031
|
-
timeoutMs,
|
|
2032
|
-
onProgress: params.onProgress
|
|
2033
|
-
}).catch(async () => {
|
|
2034
|
-
params.onProgress?.("OAuth callback not detected; paste redirect URL…");
|
|
2035
|
-
return parseManualOAuthInput(await params.onPrompt({
|
|
2036
|
-
message: "Paste the redirect URL (or authorization code)",
|
|
2037
|
-
placeholder: `${params.app.redirectUri}?code=...&state=...`
|
|
2038
|
-
}), state);
|
|
2039
|
-
});
|
|
2040
|
-
await params.onAuth({ url });
|
|
2041
|
-
codeAndState = await callback;
|
|
2042
|
-
}
|
|
2043
|
-
params.onProgress?.("Exchanging code for tokens…");
|
|
2044
|
-
return await exchangeChutesCodeForTokens({
|
|
2045
|
-
app: params.app,
|
|
2046
|
-
code: codeAndState.code,
|
|
2047
|
-
codeVerifier: verifier,
|
|
2048
|
-
fetchFn: params.fetchFn
|
|
2049
|
-
});
|
|
2050
|
-
}
|
|
2051
|
-
|
|
2052
|
-
//#endregion
|
|
2053
|
-
//#region src/commands/auth-choice.apply.oauth.ts
|
|
2054
|
-
async function applyAuthChoiceOAuth(params) {
|
|
2055
|
-
if (params.authChoice === "chutes") {
|
|
2056
|
-
let nextConfig = params.config;
|
|
2057
|
-
const isRemote = isRemoteEnvironment();
|
|
2058
|
-
const redirectUri = process.env.CHUTES_OAUTH_REDIRECT_URI?.trim() || "http://127.0.0.1:1456/oauth-callback";
|
|
2059
|
-
const scopes = process.env.CHUTES_OAUTH_SCOPES?.trim() || "openid profile chutes:invoke";
|
|
2060
|
-
const clientId = process.env.CHUTES_CLIENT_ID?.trim() || String(await params.prompter.text({
|
|
2061
|
-
message: "Enter Chutes OAuth client id",
|
|
2062
|
-
placeholder: "cid_xxx",
|
|
2063
|
-
validate: (value) => value?.trim() ? void 0 : "Required"
|
|
2064
|
-
})).trim();
|
|
2065
|
-
const clientSecret = process.env.CHUTES_CLIENT_SECRET?.trim() || void 0;
|
|
2066
|
-
await params.prompter.note(isRemote ? [
|
|
2067
|
-
"You are running in a remote/VPS environment.",
|
|
2068
|
-
"A URL will be shown for you to open in your LOCAL browser.",
|
|
2069
|
-
"After signing in, paste the redirect URL back here.",
|
|
2070
|
-
"",
|
|
2071
|
-
`Redirect URI: ${redirectUri}`
|
|
2072
|
-
].join("\n") : [
|
|
2073
|
-
"Browser will open for Chutes authentication.",
|
|
2074
|
-
"If the callback doesn't auto-complete, paste the redirect URL.",
|
|
2075
|
-
"",
|
|
2076
|
-
`Redirect URI: ${redirectUri}`
|
|
2077
|
-
].join("\n"), "Chutes OAuth");
|
|
2078
|
-
const spin = params.prompter.progress("Starting OAuth flow…");
|
|
2079
|
-
try {
|
|
2080
|
-
const { onAuth, onPrompt } = createVpsAwareOAuthHandlers({
|
|
2081
|
-
isRemote,
|
|
2082
|
-
prompter: params.prompter,
|
|
2083
|
-
runtime: params.runtime,
|
|
2084
|
-
spin,
|
|
2085
|
-
openUrl,
|
|
2086
|
-
localBrowserMessage: "Complete sign-in in browser…"
|
|
2087
|
-
});
|
|
2088
|
-
const creds = await loginChutes({
|
|
2089
|
-
app: {
|
|
2090
|
-
clientId,
|
|
2091
|
-
clientSecret,
|
|
2092
|
-
redirectUri,
|
|
2093
|
-
scopes: scopes.split(/\s+/).filter(Boolean)
|
|
2094
|
-
},
|
|
2095
|
-
manual: isRemote,
|
|
2096
|
-
onAuth,
|
|
2097
|
-
onPrompt,
|
|
2098
|
-
onProgress: (msg) => spin.update(msg)
|
|
2099
|
-
});
|
|
2100
|
-
spin.stop("Chutes OAuth complete");
|
|
2101
|
-
const profileId = `chutes:${typeof creds.email === "string" && creds.email.trim() ? creds.email.trim() : "default"}`;
|
|
2102
|
-
await writeOAuthCredentials("chutes", creds, params.agentDir);
|
|
2103
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
2104
|
-
profileId,
|
|
2105
|
-
provider: "chutes",
|
|
2106
|
-
mode: "oauth"
|
|
2107
|
-
});
|
|
2108
|
-
} catch (err) {
|
|
2109
|
-
spin.stop("Chutes OAuth failed");
|
|
2110
|
-
params.runtime.error(String(err));
|
|
2111
|
-
await params.prompter.note([
|
|
2112
|
-
"Trouble with OAuth?",
|
|
2113
|
-
"Verify CHUTES_CLIENT_ID (and CHUTES_CLIENT_SECRET if required).",
|
|
2114
|
-
`Verify the OAuth app redirect URI includes: ${redirectUri}`,
|
|
2115
|
-
"Chutes docs: https://chutes.ai/docs/sign-in-with-chutes/overview"
|
|
2116
|
-
].join("\n"), "OAuth help");
|
|
2117
|
-
}
|
|
2118
|
-
return { config: nextConfig };
|
|
2119
|
-
}
|
|
2120
|
-
return null;
|
|
2121
|
-
}
|
|
2122
|
-
|
|
2123
|
-
//#endregion
|
|
2124
|
-
//#region src/infra/env-file.ts
|
|
2125
|
-
function upsertSharedEnvVar(params) {
|
|
2126
|
-
const dir = resolveConfigDir(params.env ?? process.env);
|
|
2127
|
-
const filepath = path.join(dir, ".env");
|
|
2128
|
-
const key = params.key.trim();
|
|
2129
|
-
const value = params.value;
|
|
2130
|
-
let raw = "";
|
|
2131
|
-
if (fs.existsSync(filepath)) raw = fs.readFileSync(filepath, "utf8");
|
|
2132
|
-
const lines = raw.length ? raw.split(/\r?\n/) : [];
|
|
2133
|
-
const matcher = new RegExp(`^(\\s*(?:export\\s+)?)${escapeRegExp(key)}\\s*=`);
|
|
2134
|
-
let updated = false;
|
|
2135
|
-
let replaced = false;
|
|
2136
|
-
const nextLines = lines.map((line) => {
|
|
2137
|
-
const match = line.match(matcher);
|
|
2138
|
-
if (!match) return line;
|
|
2139
|
-
replaced = true;
|
|
2140
|
-
const next = `${match[1] ?? ""}${key}=${value}`;
|
|
2141
|
-
if (next !== line) updated = true;
|
|
2142
|
-
return next;
|
|
2143
|
-
});
|
|
2144
|
-
if (!replaced) {
|
|
2145
|
-
nextLines.push(`${key}=${value}`);
|
|
2146
|
-
updated = true;
|
|
2147
|
-
}
|
|
2148
|
-
if (!fs.existsSync(dir)) fs.mkdirSync(dir, {
|
|
2149
|
-
recursive: true,
|
|
2150
|
-
mode: 448
|
|
2151
|
-
});
|
|
2152
|
-
const output = `${nextLines.join("\n")}\n`;
|
|
2153
|
-
fs.writeFileSync(filepath, output, "utf8");
|
|
2154
|
-
fs.chmodSync(filepath, 384);
|
|
2155
|
-
return {
|
|
2156
|
-
path: filepath,
|
|
2157
|
-
updated,
|
|
2158
|
-
created: !raw
|
|
2159
|
-
};
|
|
2160
|
-
}
|
|
2161
|
-
|
|
2162
|
-
//#endregion
|
|
2163
|
-
//#region src/commands/openai-codex-model-default.ts
|
|
2164
|
-
const OPENAI_CODEX_DEFAULT_MODEL = "openai-codex/gpt-5.3-codex";
|
|
2165
|
-
function shouldSetOpenAICodexModel(model) {
|
|
2166
|
-
const trimmed = model?.trim();
|
|
2167
|
-
if (!trimmed) return true;
|
|
2168
|
-
const normalized = trimmed.toLowerCase();
|
|
2169
|
-
if (normalized.startsWith("openai-codex/")) return false;
|
|
2170
|
-
if (normalized.startsWith("openai/")) return true;
|
|
2171
|
-
return normalized === "gpt" || normalized === "gpt-mini";
|
|
2172
|
-
}
|
|
2173
|
-
function resolvePrimaryModel(model) {
|
|
2174
|
-
if (typeof model === "string") return model;
|
|
2175
|
-
if (model && typeof model === "object" && typeof model.primary === "string") return model.primary;
|
|
2176
|
-
}
|
|
2177
|
-
function applyOpenAICodexModelDefault(cfg) {
|
|
2178
|
-
if (!shouldSetOpenAICodexModel(resolvePrimaryModel(cfg.agents?.defaults?.model))) return {
|
|
2179
|
-
next: cfg,
|
|
2180
|
-
changed: false
|
|
2181
|
-
};
|
|
2182
|
-
return {
|
|
2183
|
-
next: {
|
|
2184
|
-
...cfg,
|
|
2185
|
-
agents: {
|
|
2186
|
-
...cfg.agents,
|
|
2187
|
-
defaults: {
|
|
2188
|
-
...cfg.agents?.defaults,
|
|
2189
|
-
model: cfg.agents?.defaults?.model && typeof cfg.agents.defaults.model === "object" ? {
|
|
2190
|
-
...cfg.agents.defaults.model,
|
|
2191
|
-
primary: OPENAI_CODEX_DEFAULT_MODEL
|
|
2192
|
-
} : { primary: OPENAI_CODEX_DEFAULT_MODEL }
|
|
2193
|
-
}
|
|
2194
|
-
}
|
|
2195
|
-
},
|
|
2196
|
-
changed: true
|
|
2197
|
-
};
|
|
2198
|
-
}
|
|
2199
|
-
|
|
2200
|
-
//#endregion
|
|
2201
|
-
//#region src/commands/openai-codex-oauth.ts
|
|
2202
|
-
async function loginOpenAICodexOAuth(params) {
|
|
2203
|
-
const { prompter, runtime, isRemote, openUrl, localBrowserMessage } = params;
|
|
2204
|
-
await prompter.note(isRemote ? [
|
|
2205
|
-
"You are running in a remote/VPS environment.",
|
|
2206
|
-
"A URL will be shown for you to open in your LOCAL browser.",
|
|
2207
|
-
"After signing in, paste the redirect URL back here."
|
|
2208
|
-
].join("\n") : [
|
|
2209
|
-
"Browser will open for OpenAI authentication.",
|
|
2210
|
-
"If the callback doesn't auto-complete, paste the redirect URL.",
|
|
2211
|
-
"OpenAI OAuth uses localhost:1455 for the callback."
|
|
2212
|
-
].join("\n"), "OpenAI Codex OAuth");
|
|
2213
|
-
const spin = prompter.progress("Starting OAuth flow…");
|
|
2214
|
-
try {
|
|
2215
|
-
const { onAuth, onPrompt } = createVpsAwareOAuthHandlers({
|
|
2216
|
-
isRemote,
|
|
2217
|
-
prompter,
|
|
2218
|
-
runtime,
|
|
2219
|
-
spin,
|
|
2220
|
-
openUrl,
|
|
2221
|
-
localBrowserMessage: localBrowserMessage ?? "Complete sign-in in browser…"
|
|
2222
|
-
});
|
|
2223
|
-
const creds = await loginOpenAICodex({
|
|
2224
|
-
onAuth,
|
|
2225
|
-
onPrompt,
|
|
2226
|
-
onProgress: (msg) => spin.update(msg)
|
|
2227
|
-
});
|
|
2228
|
-
spin.stop("OpenAI OAuth complete");
|
|
2229
|
-
return creds ?? null;
|
|
2230
|
-
} catch (err) {
|
|
2231
|
-
spin.stop("OpenAI OAuth failed");
|
|
2232
|
-
runtime.error(String(err));
|
|
2233
|
-
await prompter.note("Trouble with OAuth? See https://docs.anima.ai/start/faq", "OAuth help");
|
|
2234
|
-
throw err;
|
|
2235
|
-
}
|
|
2236
|
-
}
|
|
2237
|
-
|
|
2238
|
-
//#endregion
|
|
2239
|
-
//#region src/commands/openai-model-default.ts
|
|
2240
|
-
const OPENAI_DEFAULT_MODEL = "openai/gpt-5.1-codex";
|
|
2241
|
-
function applyOpenAIProviderConfig(cfg) {
|
|
2242
|
-
const next = ensureModelAllowlistEntry({
|
|
2243
|
-
cfg,
|
|
2244
|
-
modelRef: OPENAI_DEFAULT_MODEL
|
|
2245
|
-
});
|
|
2246
|
-
const models = { ...next.agents?.defaults?.models };
|
|
2247
|
-
models[OPENAI_DEFAULT_MODEL] = {
|
|
2248
|
-
...models[OPENAI_DEFAULT_MODEL],
|
|
2249
|
-
alias: models[OPENAI_DEFAULT_MODEL]?.alias ?? "GPT"
|
|
2250
|
-
};
|
|
2251
|
-
return {
|
|
2252
|
-
...next,
|
|
2253
|
-
agents: {
|
|
2254
|
-
...next.agents,
|
|
2255
|
-
defaults: {
|
|
2256
|
-
...next.agents?.defaults,
|
|
2257
|
-
models
|
|
2258
|
-
}
|
|
2259
|
-
}
|
|
2260
|
-
};
|
|
2261
|
-
}
|
|
2262
|
-
function applyOpenAIConfig(cfg) {
|
|
2263
|
-
const next = applyOpenAIProviderConfig(cfg);
|
|
2264
|
-
return {
|
|
2265
|
-
...next,
|
|
2266
|
-
agents: {
|
|
2267
|
-
...next.agents,
|
|
2268
|
-
defaults: {
|
|
2269
|
-
...next.agents?.defaults,
|
|
2270
|
-
model: next.agents?.defaults?.model && typeof next.agents.defaults.model === "object" ? {
|
|
2271
|
-
...next.agents.defaults.model,
|
|
2272
|
-
primary: OPENAI_DEFAULT_MODEL
|
|
2273
|
-
} : { primary: OPENAI_DEFAULT_MODEL }
|
|
2274
|
-
}
|
|
2275
|
-
}
|
|
2276
|
-
};
|
|
2277
|
-
}
|
|
2278
|
-
|
|
2279
|
-
//#endregion
|
|
2280
|
-
//#region src/commands/auth-choice.apply.openai.ts
|
|
2281
|
-
async function applyAuthChoiceOpenAI(params) {
|
|
2282
|
-
let authChoice = params.authChoice;
|
|
2283
|
-
if (authChoice === "apiKey" && params.opts?.tokenProvider === "openai") authChoice = "openai-api-key";
|
|
2284
|
-
if (authChoice === "openai-api-key") {
|
|
2285
|
-
let nextConfig = params.config;
|
|
2286
|
-
let agentModelOverride;
|
|
2287
|
-
const noteAgentModel = async (model) => {
|
|
2288
|
-
if (!params.agentId) return;
|
|
2289
|
-
await params.prompter.note(`Default model set to ${model} for agent "${params.agentId}".`, "Model configured");
|
|
2290
|
-
};
|
|
2291
|
-
const applyOpenAiDefaultModelChoice = async () => {
|
|
2292
|
-
const applied = await applyDefaultModelChoice({
|
|
2293
|
-
config: nextConfig,
|
|
2294
|
-
setDefaultModel: params.setDefaultModel,
|
|
2295
|
-
defaultModel: OPENAI_DEFAULT_MODEL,
|
|
2296
|
-
applyDefaultConfig: applyOpenAIConfig,
|
|
2297
|
-
applyProviderConfig: applyOpenAIProviderConfig,
|
|
2298
|
-
noteDefault: OPENAI_DEFAULT_MODEL,
|
|
2299
|
-
noteAgentModel,
|
|
2300
|
-
prompter: params.prompter
|
|
2301
|
-
});
|
|
2302
|
-
nextConfig = applied.config;
|
|
2303
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
2304
|
-
return {
|
|
2305
|
-
config: nextConfig,
|
|
2306
|
-
agentModelOverride
|
|
2307
|
-
};
|
|
2308
|
-
};
|
|
2309
|
-
const envKey = resolveEnvApiKey("openai");
|
|
2310
|
-
if (envKey) {
|
|
2311
|
-
if (await params.prompter.confirm({
|
|
2312
|
-
message: `Use existing OPENAI_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
|
|
2313
|
-
initialValue: true
|
|
2314
|
-
})) {
|
|
2315
|
-
const result = upsertSharedEnvVar({
|
|
2316
|
-
key: "OPENAI_API_KEY",
|
|
2317
|
-
value: envKey.apiKey
|
|
2318
|
-
});
|
|
2319
|
-
if (!process.env.OPENAI_API_KEY) process.env.OPENAI_API_KEY = envKey.apiKey;
|
|
2320
|
-
await params.prompter.note(`Copied OPENAI_API_KEY to ${result.path} for launchd compatibility.`, "OpenAI API key");
|
|
2321
|
-
return await applyOpenAiDefaultModelChoice();
|
|
2322
|
-
}
|
|
2323
|
-
}
|
|
2324
|
-
let key;
|
|
2325
|
-
if (params.opts?.token && params.opts?.tokenProvider === "openai") key = params.opts.token;
|
|
2326
|
-
else key = await params.prompter.text({
|
|
2327
|
-
message: "Enter OpenAI API key",
|
|
2328
|
-
validate: validateApiKeyInput
|
|
2329
|
-
});
|
|
2330
|
-
const trimmed = normalizeApiKeyInput(String(key));
|
|
2331
|
-
const result = upsertSharedEnvVar({
|
|
2332
|
-
key: "OPENAI_API_KEY",
|
|
2333
|
-
value: trimmed
|
|
2334
|
-
});
|
|
2335
|
-
process.env.OPENAI_API_KEY = trimmed;
|
|
2336
|
-
await params.prompter.note(`Saved OPENAI_API_KEY to ${result.path} for launchd compatibility.`, "OpenAI API key");
|
|
2337
|
-
return await applyOpenAiDefaultModelChoice();
|
|
2338
|
-
}
|
|
2339
|
-
if (params.authChoice === "openai-codex") {
|
|
2340
|
-
let nextConfig = params.config;
|
|
2341
|
-
let agentModelOverride;
|
|
2342
|
-
const noteAgentModel = async (model) => {
|
|
2343
|
-
if (!params.agentId) return;
|
|
2344
|
-
await params.prompter.note(`Default model set to ${model} for agent "${params.agentId}".`, "Model configured");
|
|
2345
|
-
};
|
|
2346
|
-
let creds;
|
|
2347
|
-
try {
|
|
2348
|
-
creds = await loginOpenAICodexOAuth({
|
|
2349
|
-
prompter: params.prompter,
|
|
2350
|
-
runtime: params.runtime,
|
|
2351
|
-
isRemote: isRemoteEnvironment(),
|
|
2352
|
-
openUrl: async (url) => {
|
|
2353
|
-
await openUrl(url);
|
|
2354
|
-
},
|
|
2355
|
-
localBrowserMessage: "Complete sign-in in browser…"
|
|
2356
|
-
});
|
|
2357
|
-
} catch {
|
|
2358
|
-
return {
|
|
2359
|
-
config: nextConfig,
|
|
2360
|
-
agentModelOverride
|
|
2361
|
-
};
|
|
2362
|
-
}
|
|
2363
|
-
if (creds) {
|
|
2364
|
-
await writeOAuthCredentials("openai-codex", creds, params.agentDir);
|
|
2365
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
2366
|
-
profileId: "openai-codex:default",
|
|
2367
|
-
provider: "openai-codex",
|
|
2368
|
-
mode: "oauth"
|
|
2369
|
-
});
|
|
2370
|
-
if (params.setDefaultModel) {
|
|
2371
|
-
const applied = applyOpenAICodexModelDefault(nextConfig);
|
|
2372
|
-
nextConfig = applied.next;
|
|
2373
|
-
if (applied.changed) await params.prompter.note(`Default model set to ${OPENAI_CODEX_DEFAULT_MODEL}`, "Model configured");
|
|
2374
|
-
} else {
|
|
2375
|
-
agentModelOverride = OPENAI_CODEX_DEFAULT_MODEL;
|
|
2376
|
-
await noteAgentModel(OPENAI_CODEX_DEFAULT_MODEL);
|
|
2377
|
-
}
|
|
2378
|
-
}
|
|
2379
|
-
return {
|
|
2380
|
-
config: nextConfig,
|
|
2381
|
-
agentModelOverride
|
|
2382
|
-
};
|
|
2383
|
-
}
|
|
2384
|
-
return null;
|
|
2385
|
-
}
|
|
2386
|
-
|
|
2387
|
-
//#endregion
|
|
2388
|
-
//#region src/commands/auth-choice.apply.qwen-portal.ts
|
|
2389
|
-
async function applyAuthChoiceQwenPortal(params) {
|
|
2390
|
-
return await applyAuthChoicePluginProvider(params, {
|
|
2391
|
-
authChoice: "qwen-portal",
|
|
2392
|
-
pluginId: "qwen-portal-auth",
|
|
2393
|
-
providerId: "qwen-portal",
|
|
2394
|
-
methodId: "device",
|
|
2395
|
-
label: "Qwen"
|
|
2396
|
-
});
|
|
2397
|
-
}
|
|
2398
|
-
|
|
2399
|
-
//#endregion
|
|
2400
|
-
//#region src/commands/vllm-setup.ts
|
|
2401
|
-
const VLLM_DEFAULT_BASE_URL = "http://127.0.0.1:8000/v1";
|
|
2402
|
-
const VLLM_DEFAULT_CONTEXT_WINDOW = 128e3;
|
|
2403
|
-
const VLLM_DEFAULT_MAX_TOKENS = 8192;
|
|
2404
|
-
const VLLM_DEFAULT_COST = {
|
|
2405
|
-
input: 0,
|
|
2406
|
-
output: 0,
|
|
2407
|
-
cacheRead: 0,
|
|
2408
|
-
cacheWrite: 0
|
|
2409
|
-
};
|
|
2410
|
-
async function promptAndConfigureVllm(params) {
|
|
2411
|
-
const baseUrlRaw = await params.prompter.text({
|
|
2412
|
-
message: "vLLM base URL",
|
|
2413
|
-
initialValue: VLLM_DEFAULT_BASE_URL,
|
|
2414
|
-
placeholder: VLLM_DEFAULT_BASE_URL,
|
|
2415
|
-
validate: (value) => value?.trim() ? void 0 : "Required"
|
|
2416
|
-
});
|
|
2417
|
-
const apiKeyRaw = await params.prompter.text({
|
|
2418
|
-
message: "vLLM API key",
|
|
2419
|
-
placeholder: "sk-... (or any non-empty string)",
|
|
2420
|
-
validate: (value) => value?.trim() ? void 0 : "Required"
|
|
2421
|
-
});
|
|
2422
|
-
const modelIdRaw = await params.prompter.text({
|
|
2423
|
-
message: "vLLM model",
|
|
2424
|
-
placeholder: "meta-llama/Meta-Llama-3-8B-Instruct",
|
|
2425
|
-
validate: (value) => value?.trim() ? void 0 : "Required"
|
|
2426
|
-
});
|
|
2427
|
-
const baseUrl = String(baseUrlRaw ?? "").trim().replace(/\/+$/, "");
|
|
2428
|
-
const apiKey = String(apiKeyRaw ?? "").trim();
|
|
2429
|
-
const modelId = String(modelIdRaw ?? "").trim();
|
|
2430
|
-
const modelRef = `vllm/${modelId}`;
|
|
2431
|
-
await upsertAuthProfileWithLock({
|
|
2432
|
-
profileId: "vllm:default",
|
|
2433
|
-
credential: {
|
|
2434
|
-
type: "api_key",
|
|
2435
|
-
provider: "vllm",
|
|
2436
|
-
key: apiKey
|
|
2437
|
-
},
|
|
2438
|
-
agentDir: params.agentDir
|
|
2439
|
-
});
|
|
2440
|
-
return {
|
|
2441
|
-
config: {
|
|
2442
|
-
...params.cfg,
|
|
2443
|
-
models: {
|
|
2444
|
-
...params.cfg.models,
|
|
2445
|
-
mode: params.cfg.models?.mode ?? "merge",
|
|
2446
|
-
providers: {
|
|
2447
|
-
...params.cfg.models?.providers,
|
|
2448
|
-
vllm: {
|
|
2449
|
-
baseUrl,
|
|
2450
|
-
api: "openai-completions",
|
|
2451
|
-
apiKey: "VLLM_API_KEY",
|
|
2452
|
-
models: [{
|
|
2453
|
-
id: modelId,
|
|
2454
|
-
name: modelId,
|
|
2455
|
-
reasoning: false,
|
|
2456
|
-
input: ["text"],
|
|
2457
|
-
cost: VLLM_DEFAULT_COST,
|
|
2458
|
-
contextWindow: VLLM_DEFAULT_CONTEXT_WINDOW,
|
|
2459
|
-
maxTokens: VLLM_DEFAULT_MAX_TOKENS
|
|
2460
|
-
}]
|
|
2461
|
-
}
|
|
2462
|
-
}
|
|
2463
|
-
}
|
|
2464
|
-
},
|
|
2465
|
-
modelId,
|
|
2466
|
-
modelRef
|
|
2467
|
-
};
|
|
2468
|
-
}
|
|
2469
|
-
|
|
2470
|
-
//#endregion
|
|
2471
|
-
//#region src/commands/auth-choice.apply.vllm.ts
|
|
2472
|
-
function applyVllmDefaultModel(cfg, modelRef) {
|
|
2473
|
-
const existingModel = cfg.agents?.defaults?.model;
|
|
2474
|
-
const fallbacks = existingModel && typeof existingModel === "object" && "fallbacks" in existingModel ? existingModel.fallbacks : void 0;
|
|
2475
|
-
return {
|
|
2476
|
-
...cfg,
|
|
2477
|
-
agents: {
|
|
2478
|
-
...cfg.agents,
|
|
2479
|
-
defaults: {
|
|
2480
|
-
...cfg.agents?.defaults,
|
|
2481
|
-
model: {
|
|
2482
|
-
...fallbacks ? { fallbacks } : void 0,
|
|
2483
|
-
primary: modelRef
|
|
2484
|
-
}
|
|
2485
|
-
}
|
|
2486
|
-
}
|
|
2487
|
-
};
|
|
2488
|
-
}
|
|
2489
|
-
async function applyAuthChoiceVllm(params) {
|
|
2490
|
-
if (params.authChoice !== "vllm") return null;
|
|
2491
|
-
const { config: nextConfig, modelRef } = await promptAndConfigureVllm({
|
|
2492
|
-
cfg: params.config,
|
|
2493
|
-
prompter: params.prompter,
|
|
2494
|
-
agentDir: params.agentDir
|
|
2495
|
-
});
|
|
2496
|
-
if (!params.setDefaultModel) return {
|
|
2497
|
-
config: nextConfig,
|
|
2498
|
-
agentModelOverride: modelRef
|
|
2499
|
-
};
|
|
2500
|
-
await params.prompter.note(`Default model set to ${modelRef}`, "Model configured");
|
|
2501
|
-
return { config: applyVllmDefaultModel(nextConfig, modelRef) };
|
|
2502
|
-
}
|
|
2503
|
-
|
|
2504
|
-
//#endregion
|
|
2505
|
-
//#region src/commands/auth-choice.apply.xai.ts
|
|
2506
|
-
async function applyAuthChoiceXAI(params) {
|
|
2507
|
-
if (params.authChoice !== "xai-api-key") return null;
|
|
2508
|
-
let nextConfig = params.config;
|
|
2509
|
-
let agentModelOverride;
|
|
2510
|
-
const noteAgentModel = async (model) => {
|
|
2511
|
-
if (!params.agentId) return;
|
|
2512
|
-
await params.prompter.note(`Default model set to ${model} for agent "${params.agentId}".`, "Model configured");
|
|
2513
|
-
};
|
|
2514
|
-
let hasCredential = false;
|
|
2515
|
-
const optsKey = params.opts?.xaiApiKey?.trim();
|
|
2516
|
-
if (optsKey) {
|
|
2517
|
-
setXaiApiKey(normalizeApiKeyInput(optsKey), params.agentDir);
|
|
2518
|
-
hasCredential = true;
|
|
2519
|
-
}
|
|
2520
|
-
if (!hasCredential) {
|
|
2521
|
-
const envKey = resolveEnvApiKey("xai");
|
|
2522
|
-
if (envKey) {
|
|
2523
|
-
if (await params.prompter.confirm({
|
|
2524
|
-
message: `Use existing XAI_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,
|
|
2525
|
-
initialValue: true
|
|
2526
|
-
})) {
|
|
2527
|
-
setXaiApiKey(envKey.apiKey, params.agentDir);
|
|
2528
|
-
hasCredential = true;
|
|
2529
|
-
}
|
|
2530
|
-
}
|
|
2531
|
-
}
|
|
2532
|
-
if (!hasCredential) {
|
|
2533
|
-
const key = await params.prompter.text({
|
|
2534
|
-
message: "Enter xAI API key",
|
|
2535
|
-
validate: validateApiKeyInput
|
|
2536
|
-
});
|
|
2537
|
-
setXaiApiKey(normalizeApiKeyInput(String(key)), params.agentDir);
|
|
2538
|
-
}
|
|
2539
|
-
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
2540
|
-
profileId: "xai:default",
|
|
2541
|
-
provider: "xai",
|
|
2542
|
-
mode: "api_key"
|
|
2543
|
-
});
|
|
2544
|
-
{
|
|
2545
|
-
const applied = await applyDefaultModelChoice({
|
|
2546
|
-
config: nextConfig,
|
|
2547
|
-
setDefaultModel: params.setDefaultModel,
|
|
2548
|
-
defaultModel: XAI_DEFAULT_MODEL_REF,
|
|
2549
|
-
applyDefaultConfig: applyXaiConfig,
|
|
2550
|
-
applyProviderConfig: applyXaiProviderConfig,
|
|
2551
|
-
noteDefault: XAI_DEFAULT_MODEL_REF,
|
|
2552
|
-
noteAgentModel,
|
|
2553
|
-
prompter: params.prompter
|
|
2554
|
-
});
|
|
2555
|
-
nextConfig = applied.config;
|
|
2556
|
-
agentModelOverride = applied.agentModelOverride ?? agentModelOverride;
|
|
2557
|
-
}
|
|
2558
|
-
return {
|
|
2559
|
-
config: nextConfig,
|
|
2560
|
-
agentModelOverride
|
|
2561
|
-
};
|
|
2562
|
-
}
|
|
2563
|
-
|
|
2564
|
-
//#endregion
|
|
2565
|
-
//#region src/commands/auth-choice.apply.ts
|
|
2566
|
-
async function applyAuthChoice(params) {
|
|
2567
|
-
const handlers = [
|
|
2568
|
-
applyAuthChoiceAnthropic,
|
|
2569
|
-
applyAuthChoiceVllm,
|
|
2570
|
-
applyAuthChoiceOpenAI,
|
|
2571
|
-
applyAuthChoiceOAuth,
|
|
2572
|
-
applyAuthChoiceApiProviders,
|
|
2573
|
-
applyAuthChoiceMiniMax,
|
|
2574
|
-
applyAuthChoiceGitHubCopilot,
|
|
2575
|
-
applyAuthChoiceGoogleAntigravity,
|
|
2576
|
-
applyAuthChoiceGoogleGeminiCli,
|
|
2577
|
-
applyAuthChoiceCopilotProxy,
|
|
2578
|
-
applyAuthChoiceQwenPortal,
|
|
2579
|
-
applyAuthChoiceXAI
|
|
2580
|
-
];
|
|
2581
|
-
for (const handler of handlers) {
|
|
2582
|
-
const result = await handler(params);
|
|
2583
|
-
if (result) return result;
|
|
2584
|
-
}
|
|
2585
|
-
return { config: params.config };
|
|
2586
|
-
}
|
|
2587
|
-
|
|
2588
|
-
//#endregion
|
|
2589
|
-
//#region src/commands/auth-choice.model-check.ts
|
|
2590
|
-
async function warnIfModelConfigLooksOff(config, prompter, options) {
|
|
2591
|
-
const agentModelOverride = options?.agentId ? resolveAgentModelPrimary(config, options.agentId) : void 0;
|
|
2592
|
-
const configWithModel = agentModelOverride && agentModelOverride.length > 0 ? {
|
|
2593
|
-
...config,
|
|
2594
|
-
agents: {
|
|
2595
|
-
...config.agents,
|
|
2596
|
-
defaults: {
|
|
2597
|
-
...config.agents?.defaults,
|
|
2598
|
-
model: {
|
|
2599
|
-
...typeof config.agents?.defaults?.model === "object" ? config.agents.defaults.model : void 0,
|
|
2600
|
-
primary: agentModelOverride
|
|
2601
|
-
}
|
|
2602
|
-
}
|
|
2603
|
-
}
|
|
2604
|
-
} : config;
|
|
2605
|
-
const ref = resolveConfiguredModelRef({
|
|
2606
|
-
cfg: configWithModel,
|
|
2607
|
-
defaultProvider: DEFAULT_PROVIDER,
|
|
2608
|
-
defaultModel: DEFAULT_MODEL
|
|
2609
|
-
});
|
|
2610
|
-
const warnings = [];
|
|
2611
|
-
const catalog = await loadModelCatalog({
|
|
2612
|
-
config: configWithModel,
|
|
2613
|
-
useCache: false
|
|
2614
|
-
});
|
|
2615
|
-
if (catalog.length > 0) {
|
|
2616
|
-
if (!catalog.some((entry) => entry.provider === ref.provider && entry.id === ref.model)) warnings.push(`Model not found: ${ref.provider}/${ref.model}. Update agents.defaults.model or run /models list.`);
|
|
2617
|
-
}
|
|
2618
|
-
const store = ensureAuthProfileStore(options?.agentDir);
|
|
2619
|
-
const hasProfile = listProfilesForProvider(store, ref.provider).length > 0;
|
|
2620
|
-
const envKey = resolveEnvApiKey(ref.provider);
|
|
2621
|
-
const customKey = getCustomProviderApiKey(config, ref.provider);
|
|
2622
|
-
if (!hasProfile && !envKey && !customKey) warnings.push(`No auth configured for provider "${ref.provider}". The agent may fail until credentials are added.`);
|
|
2623
|
-
if (ref.provider === "openai") {
|
|
2624
|
-
if (listProfilesForProvider(store, "openai-codex").length > 0) warnings.push(`Detected OpenAI Codex OAuth. Consider setting agents.defaults.model to ${OPENAI_CODEX_DEFAULT_MODEL}.`);
|
|
2625
|
-
}
|
|
2626
|
-
if (warnings.length > 0) await prompter.note(warnings.join("\n"), "Model check");
|
|
2627
|
-
}
|
|
2628
|
-
|
|
2629
|
-
//#endregion
|
|
2630
|
-
//#region src/commands/auth-choice.preferred-provider.ts
|
|
2631
|
-
const PREFERRED_PROVIDER_BY_AUTH_CHOICE = {
|
|
2632
|
-
oauth: "anthropic",
|
|
2633
|
-
"setup-token": "anthropic",
|
|
2634
|
-
"claude-cli": "anthropic",
|
|
2635
|
-
token: "anthropic",
|
|
2636
|
-
apiKey: "anthropic",
|
|
2637
|
-
vllm: "vllm",
|
|
2638
|
-
"openai-codex": "openai-codex",
|
|
2639
|
-
"codex-cli": "openai-codex",
|
|
2640
|
-
chutes: "chutes",
|
|
2641
|
-
"openai-api-key": "openai",
|
|
2642
|
-
"openrouter-api-key": "openrouter",
|
|
2643
|
-
"ai-gateway-api-key": "vercel-ai-gateway",
|
|
2644
|
-
"cloudflare-ai-gateway-api-key": "cloudflare-ai-gateway",
|
|
2645
|
-
"moonshot-api-key": "moonshot",
|
|
2646
|
-
"moonshot-api-key-cn": "moonshot",
|
|
2647
|
-
"kimi-code-api-key": "kimi-coding",
|
|
2648
|
-
"gemini-api-key": "google",
|
|
2649
|
-
"google-antigravity": "google-antigravity",
|
|
2650
|
-
"google-gemini-cli": "google-gemini-cli",
|
|
2651
|
-
"zai-api-key": "zai",
|
|
2652
|
-
"zai-coding-global": "zai",
|
|
2653
|
-
"zai-coding-cn": "zai",
|
|
2654
|
-
"zai-global": "zai",
|
|
2655
|
-
"zai-cn": "zai",
|
|
2656
|
-
"xiaomi-api-key": "xiaomi",
|
|
2657
|
-
"synthetic-api-key": "synthetic",
|
|
2658
|
-
"venice-api-key": "venice",
|
|
2659
|
-
"together-api-key": "together",
|
|
2660
|
-
"huggingface-api-key": "huggingface",
|
|
2661
|
-
"github-copilot": "github-copilot",
|
|
2662
|
-
"copilot-proxy": "copilot-proxy",
|
|
2663
|
-
"minimax-cloud": "minimax",
|
|
2664
|
-
"minimax-api": "minimax",
|
|
2665
|
-
"minimax-api-key-cn": "minimax-cn",
|
|
2666
|
-
"minimax-api-lightning": "minimax",
|
|
2667
|
-
minimax: "lmstudio",
|
|
2668
|
-
"opencode-zen": "opencode",
|
|
2669
|
-
"xai-api-key": "xai",
|
|
2670
|
-
"litellm-api-key": "litellm",
|
|
2671
|
-
"qwen-portal": "qwen-portal",
|
|
2672
|
-
"minimax-portal": "minimax-portal",
|
|
2673
|
-
"qianfan-api-key": "qianfan",
|
|
2674
|
-
"custom-api-key": "custom"
|
|
2675
|
-
};
|
|
2676
|
-
function resolvePreferredProviderForAuthChoice(choice) {
|
|
2677
|
-
return PREFERRED_PROVIDER_BY_AUTH_CHOICE[choice];
|
|
2678
|
-
}
|
|
2679
|
-
|
|
2680
|
-
//#endregion
|
|
2681
|
-
export { applyOpenAIConfig as a, detectZaiEndpoint as c, formatAuthChoiceChoicesForCli as d, isDeprecatedAuthChoice as f, promptAndConfigureVllm as i, applyGoogleGeminiModelDefault as l, warnIfModelConfigLooksOff as n, OPENAI_CODEX_DEFAULT_MODEL as o, normalizeLegacyOnboardAuthChoice as p, applyAuthChoice as r, upsertSharedEnvVar as s, resolvePreferredProviderForAuthChoice as t, promptAuthChoiceGrouped as u };
|