@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,1564 +0,0 @@
|
|
|
1
|
-
import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
|
|
2
|
-
import { o as resolveOAuthPath, s as resolveStateDir } from "./paths-CCxa0o9c.js";
|
|
3
|
-
import { _ as DEFAULT_AGENT_ID } from "./workspace-Dcfoy5JJ.js";
|
|
4
|
-
import { l as createSubsystemLogger, z as resolveUserPath } from "./exec-BenD3A5l.js";
|
|
5
|
-
import { a as resolveAgentModelPrimary } from "./agent-scope-BVf4aSwY.js";
|
|
6
|
-
import { t as formatCliCommand } from "./command-format-SkzzRqR1.js";
|
|
7
|
-
import { t as parseBooleanValue } from "./boolean-Ce2-qkSB.js";
|
|
8
|
-
import fs from "node:fs/promises";
|
|
9
|
-
import path from "node:path";
|
|
10
|
-
import fs$1 from "node:fs";
|
|
11
|
-
import { execFileSync, execSync } from "node:child_process";
|
|
12
|
-
import { randomBytes, randomUUID } from "node:crypto";
|
|
13
|
-
import { getEnvApiKey, getOAuthApiKey, getOAuthProviders } from "@mariozechner/pi-ai";
|
|
14
|
-
|
|
15
|
-
//#region src/agents/auth-profiles/constants.ts
|
|
16
|
-
const AUTH_STORE_VERSION = 1;
|
|
17
|
-
const AUTH_PROFILE_FILENAME = "auth-profiles.json";
|
|
18
|
-
const LEGACY_AUTH_FILENAME = "auth.json";
|
|
19
|
-
const QWEN_CLI_PROFILE_ID = "qwen-portal:qwen-cli";
|
|
20
|
-
const MINIMAX_CLI_PROFILE_ID = "minimax-portal:minimax-cli";
|
|
21
|
-
const AUTH_STORE_LOCK_OPTIONS = {
|
|
22
|
-
retries: {
|
|
23
|
-
retries: 10,
|
|
24
|
-
factor: 2,
|
|
25
|
-
minTimeout: 100,
|
|
26
|
-
maxTimeout: 1e4,
|
|
27
|
-
randomize: true
|
|
28
|
-
},
|
|
29
|
-
stale: 3e4
|
|
30
|
-
};
|
|
31
|
-
const EXTERNAL_CLI_SYNC_TTL_MS = 900 * 1e3;
|
|
32
|
-
const EXTERNAL_CLI_NEAR_EXPIRY_MS = 600 * 1e3;
|
|
33
|
-
const log$2 = createSubsystemLogger("agents/auth-profiles");
|
|
34
|
-
|
|
35
|
-
//#endregion
|
|
36
|
-
//#region src/agents/auth-profiles/display.ts
|
|
37
|
-
function resolveAuthProfileDisplayLabel(params) {
|
|
38
|
-
const { cfg, store, profileId } = params;
|
|
39
|
-
const profile = store.profiles[profileId];
|
|
40
|
-
const email = cfg?.auth?.profiles?.[profileId]?.email?.trim() || (profile && "email" in profile ? profile.email?.trim() : void 0);
|
|
41
|
-
if (email) return `${profileId} (${email})`;
|
|
42
|
-
return profileId;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
//#endregion
|
|
46
|
-
//#region src/agents/defaults.ts
|
|
47
|
-
const DEFAULT_PROVIDER = "anthropic";
|
|
48
|
-
const DEFAULT_MODEL = "claude-opus-4-6";
|
|
49
|
-
const DEFAULT_CONTEXT_TOKENS = 2e5;
|
|
50
|
-
|
|
51
|
-
//#endregion
|
|
52
|
-
//#region src/agents/cloudflare-ai-gateway.ts
|
|
53
|
-
const CLOUDFLARE_AI_GATEWAY_PROVIDER_ID = "cloudflare-ai-gateway";
|
|
54
|
-
const CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_ID = "claude-sonnet-4-5";
|
|
55
|
-
const CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF = `${CLOUDFLARE_AI_GATEWAY_PROVIDER_ID}/${CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_ID}`;
|
|
56
|
-
|
|
57
|
-
//#endregion
|
|
58
|
-
//#region src/infra/env.ts
|
|
59
|
-
const log$1 = createSubsystemLogger("env");
|
|
60
|
-
function isTruthyEnvValue(value) {
|
|
61
|
-
return parseBooleanValue(value) === true;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
//#endregion
|
|
65
|
-
//#region src/infra/shell-env.ts
|
|
66
|
-
const DEFAULT_TIMEOUT_MS = 15e3;
|
|
67
|
-
const DEFAULT_MAX_BUFFER_BYTES = 2 * 1024 * 1024;
|
|
68
|
-
let lastAppliedKeys = [];
|
|
69
|
-
let cachedShellPath;
|
|
70
|
-
function resolveShell(env) {
|
|
71
|
-
const shell = env.SHELL?.trim();
|
|
72
|
-
return shell && shell.length > 0 ? shell : "/bin/sh";
|
|
73
|
-
}
|
|
74
|
-
function parseShellEnv(stdout) {
|
|
75
|
-
const shellEnv = /* @__PURE__ */ new Map();
|
|
76
|
-
const parts = stdout.toString("utf8").split("\0");
|
|
77
|
-
for (const part of parts) {
|
|
78
|
-
if (!part) continue;
|
|
79
|
-
const eq = part.indexOf("=");
|
|
80
|
-
if (eq <= 0) continue;
|
|
81
|
-
const key = part.slice(0, eq);
|
|
82
|
-
const value = part.slice(eq + 1);
|
|
83
|
-
if (!key) continue;
|
|
84
|
-
shellEnv.set(key, value);
|
|
85
|
-
}
|
|
86
|
-
return shellEnv;
|
|
87
|
-
}
|
|
88
|
-
function loadShellEnvFallback(opts) {
|
|
89
|
-
const logger = opts.logger ?? console;
|
|
90
|
-
const exec = opts.exec ?? execFileSync;
|
|
91
|
-
if (!opts.enabled) {
|
|
92
|
-
lastAppliedKeys = [];
|
|
93
|
-
return {
|
|
94
|
-
ok: true,
|
|
95
|
-
applied: [],
|
|
96
|
-
skippedReason: "disabled"
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
if (opts.expectedKeys.some((key) => Boolean(opts.env[key]?.trim()))) {
|
|
100
|
-
lastAppliedKeys = [];
|
|
101
|
-
return {
|
|
102
|
-
ok: true,
|
|
103
|
-
applied: [],
|
|
104
|
-
skippedReason: "already-has-keys"
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
const timeoutMs = typeof opts.timeoutMs === "number" && Number.isFinite(opts.timeoutMs) ? Math.max(0, opts.timeoutMs) : DEFAULT_TIMEOUT_MS;
|
|
108
|
-
const shell = resolveShell(opts.env);
|
|
109
|
-
let stdout;
|
|
110
|
-
try {
|
|
111
|
-
stdout = exec(shell, [
|
|
112
|
-
"-l",
|
|
113
|
-
"-c",
|
|
114
|
-
"env -0"
|
|
115
|
-
], {
|
|
116
|
-
encoding: "buffer",
|
|
117
|
-
timeout: timeoutMs,
|
|
118
|
-
maxBuffer: DEFAULT_MAX_BUFFER_BYTES,
|
|
119
|
-
env: opts.env,
|
|
120
|
-
stdio: [
|
|
121
|
-
"ignore",
|
|
122
|
-
"pipe",
|
|
123
|
-
"pipe"
|
|
124
|
-
]
|
|
125
|
-
});
|
|
126
|
-
} catch (err) {
|
|
127
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
128
|
-
logger.warn(`[anima] shell env fallback failed: ${msg}`);
|
|
129
|
-
lastAppliedKeys = [];
|
|
130
|
-
return {
|
|
131
|
-
ok: false,
|
|
132
|
-
error: msg,
|
|
133
|
-
applied: []
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
const shellEnv = parseShellEnv(stdout);
|
|
137
|
-
const applied = [];
|
|
138
|
-
for (const key of opts.expectedKeys) {
|
|
139
|
-
if (opts.env[key]?.trim()) continue;
|
|
140
|
-
const value = shellEnv.get(key);
|
|
141
|
-
if (!value?.trim()) continue;
|
|
142
|
-
opts.env[key] = value;
|
|
143
|
-
applied.push(key);
|
|
144
|
-
}
|
|
145
|
-
lastAppliedKeys = applied;
|
|
146
|
-
return {
|
|
147
|
-
ok: true,
|
|
148
|
-
applied
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
function shouldEnableShellEnvFallback(env) {
|
|
152
|
-
return isTruthyEnvValue(env.ANIMA_LOAD_SHELL_ENV);
|
|
153
|
-
}
|
|
154
|
-
function shouldDeferShellEnvFallback(env) {
|
|
155
|
-
return isTruthyEnvValue(env.ANIMA_DEFER_SHELL_ENV_FALLBACK);
|
|
156
|
-
}
|
|
157
|
-
function resolveShellEnvFallbackTimeoutMs(env) {
|
|
158
|
-
const raw = env.ANIMA_SHELL_ENV_TIMEOUT_MS?.trim();
|
|
159
|
-
if (!raw) return DEFAULT_TIMEOUT_MS;
|
|
160
|
-
const parsed = Number.parseInt(raw, 10);
|
|
161
|
-
if (!Number.isFinite(parsed)) return DEFAULT_TIMEOUT_MS;
|
|
162
|
-
return Math.max(0, parsed);
|
|
163
|
-
}
|
|
164
|
-
function getShellPathFromLoginShell(opts) {
|
|
165
|
-
if (cachedShellPath !== void 0) return cachedShellPath;
|
|
166
|
-
if (process.platform === "win32") {
|
|
167
|
-
cachedShellPath = null;
|
|
168
|
-
return cachedShellPath;
|
|
169
|
-
}
|
|
170
|
-
const exec = opts.exec ?? execFileSync;
|
|
171
|
-
const timeoutMs = typeof opts.timeoutMs === "number" && Number.isFinite(opts.timeoutMs) ? Math.max(0, opts.timeoutMs) : DEFAULT_TIMEOUT_MS;
|
|
172
|
-
const shell = resolveShell(opts.env);
|
|
173
|
-
let stdout;
|
|
174
|
-
try {
|
|
175
|
-
stdout = exec(shell, [
|
|
176
|
-
"-l",
|
|
177
|
-
"-c",
|
|
178
|
-
"env -0"
|
|
179
|
-
], {
|
|
180
|
-
encoding: "buffer",
|
|
181
|
-
timeout: timeoutMs,
|
|
182
|
-
maxBuffer: DEFAULT_MAX_BUFFER_BYTES,
|
|
183
|
-
env: opts.env,
|
|
184
|
-
stdio: [
|
|
185
|
-
"ignore",
|
|
186
|
-
"pipe",
|
|
187
|
-
"pipe"
|
|
188
|
-
]
|
|
189
|
-
});
|
|
190
|
-
} catch {
|
|
191
|
-
cachedShellPath = null;
|
|
192
|
-
return cachedShellPath;
|
|
193
|
-
}
|
|
194
|
-
const shellPath = parseShellEnv(stdout).get("PATH")?.trim();
|
|
195
|
-
cachedShellPath = shellPath && shellPath.length > 0 ? shellPath : null;
|
|
196
|
-
return cachedShellPath;
|
|
197
|
-
}
|
|
198
|
-
function getShellEnvAppliedKeys() {
|
|
199
|
-
return [...lastAppliedKeys];
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
//#endregion
|
|
203
|
-
//#region src/utils/normalize-secret-input.ts
|
|
204
|
-
/**
|
|
205
|
-
* Secret normalization for copy/pasted credentials.
|
|
206
|
-
*
|
|
207
|
-
* Common footgun: line breaks (especially `\r`) embedded in API keys/tokens.
|
|
208
|
-
* We strip line breaks anywhere, then trim whitespace at the ends.
|
|
209
|
-
*
|
|
210
|
-
* Intentionally does NOT remove ordinary spaces inside the string to avoid
|
|
211
|
-
* silently altering "Bearer <token>" style values.
|
|
212
|
-
*/
|
|
213
|
-
function normalizeSecretInput(value) {
|
|
214
|
-
if (typeof value !== "string") return "";
|
|
215
|
-
return value.replace(/[\r\n\u2028\u2029]+/g, "").trim();
|
|
216
|
-
}
|
|
217
|
-
function normalizeOptionalSecretInput(value) {
|
|
218
|
-
const normalized = normalizeSecretInput(value);
|
|
219
|
-
return normalized ? normalized : void 0;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
//#endregion
|
|
223
|
-
//#region src/agents/model-auth.ts
|
|
224
|
-
const AWS_BEARER_ENV = "AWS_BEARER_TOKEN_BEDROCK";
|
|
225
|
-
const AWS_ACCESS_KEY_ENV = "AWS_ACCESS_KEY_ID";
|
|
226
|
-
const AWS_SECRET_KEY_ENV = "AWS_SECRET_ACCESS_KEY";
|
|
227
|
-
const AWS_PROFILE_ENV = "AWS_PROFILE";
|
|
228
|
-
function resolveProviderConfig(cfg, provider) {
|
|
229
|
-
const providers = cfg?.models?.providers ?? {};
|
|
230
|
-
const direct = providers[provider];
|
|
231
|
-
if (direct) return direct;
|
|
232
|
-
const normalized = normalizeProviderId(provider);
|
|
233
|
-
if (normalized === provider) return Object.entries(providers).find(([key]) => normalizeProviderId(key) === normalized)?.[1];
|
|
234
|
-
return providers[normalized] ?? Object.entries(providers).find(([key]) => normalizeProviderId(key) === normalized)?.[1];
|
|
235
|
-
}
|
|
236
|
-
function getCustomProviderApiKey(cfg, provider) {
|
|
237
|
-
return normalizeOptionalSecretInput(resolveProviderConfig(cfg, provider)?.apiKey);
|
|
238
|
-
}
|
|
239
|
-
function resolveProviderAuthOverride(cfg, provider) {
|
|
240
|
-
const auth = resolveProviderConfig(cfg, provider)?.auth;
|
|
241
|
-
if (auth === "api-key" || auth === "aws-sdk" || auth === "oauth" || auth === "token") return auth;
|
|
242
|
-
}
|
|
243
|
-
function resolveEnvSourceLabel(params) {
|
|
244
|
-
return `${params.envVars.some((envVar) => params.applied.has(envVar)) ? "shell env: " : "env: "}${params.label}`;
|
|
245
|
-
}
|
|
246
|
-
function resolveAwsSdkAuthInfo() {
|
|
247
|
-
const applied = new Set(getShellEnvAppliedKeys());
|
|
248
|
-
if (process.env[AWS_BEARER_ENV]?.trim()) return {
|
|
249
|
-
mode: "aws-sdk",
|
|
250
|
-
source: resolveEnvSourceLabel({
|
|
251
|
-
applied,
|
|
252
|
-
envVars: [AWS_BEARER_ENV],
|
|
253
|
-
label: AWS_BEARER_ENV
|
|
254
|
-
})
|
|
255
|
-
};
|
|
256
|
-
if (process.env[AWS_ACCESS_KEY_ENV]?.trim() && process.env[AWS_SECRET_KEY_ENV]?.trim()) return {
|
|
257
|
-
mode: "aws-sdk",
|
|
258
|
-
source: resolveEnvSourceLabel({
|
|
259
|
-
applied,
|
|
260
|
-
envVars: [AWS_ACCESS_KEY_ENV, AWS_SECRET_KEY_ENV],
|
|
261
|
-
label: `${AWS_ACCESS_KEY_ENV} + ${AWS_SECRET_KEY_ENV}`
|
|
262
|
-
})
|
|
263
|
-
};
|
|
264
|
-
if (process.env[AWS_PROFILE_ENV]?.trim()) return {
|
|
265
|
-
mode: "aws-sdk",
|
|
266
|
-
source: resolveEnvSourceLabel({
|
|
267
|
-
applied,
|
|
268
|
-
envVars: [AWS_PROFILE_ENV],
|
|
269
|
-
label: AWS_PROFILE_ENV
|
|
270
|
-
})
|
|
271
|
-
};
|
|
272
|
-
return {
|
|
273
|
-
mode: "aws-sdk",
|
|
274
|
-
source: "aws-sdk default chain"
|
|
275
|
-
};
|
|
276
|
-
}
|
|
277
|
-
async function resolveApiKeyForProvider(params) {
|
|
278
|
-
const { provider, cfg, profileId, preferredProfile } = params;
|
|
279
|
-
const store = params.store ?? ensureAuthProfileStore(params.agentDir);
|
|
280
|
-
if (profileId) {
|
|
281
|
-
const resolved = await resolveApiKeyForProfile({
|
|
282
|
-
cfg,
|
|
283
|
-
store,
|
|
284
|
-
profileId,
|
|
285
|
-
agentDir: params.agentDir
|
|
286
|
-
});
|
|
287
|
-
if (!resolved) throw new Error(`No credentials found for profile "${profileId}".`);
|
|
288
|
-
const mode = store.profiles[profileId]?.type;
|
|
289
|
-
return {
|
|
290
|
-
apiKey: resolved.apiKey,
|
|
291
|
-
profileId,
|
|
292
|
-
source: `profile:${profileId}`,
|
|
293
|
-
mode: mode === "oauth" ? "oauth" : mode === "token" ? "token" : "api-key"
|
|
294
|
-
};
|
|
295
|
-
}
|
|
296
|
-
const authOverride = resolveProviderAuthOverride(cfg, provider);
|
|
297
|
-
if (authOverride === "aws-sdk") return resolveAwsSdkAuthInfo();
|
|
298
|
-
const order = resolveAuthProfileOrder({
|
|
299
|
-
cfg,
|
|
300
|
-
store,
|
|
301
|
-
provider,
|
|
302
|
-
preferredProfile
|
|
303
|
-
});
|
|
304
|
-
for (const candidate of order) try {
|
|
305
|
-
const resolved = await resolveApiKeyForProfile({
|
|
306
|
-
cfg,
|
|
307
|
-
store,
|
|
308
|
-
profileId: candidate,
|
|
309
|
-
agentDir: params.agentDir
|
|
310
|
-
});
|
|
311
|
-
if (resolved) {
|
|
312
|
-
const mode = store.profiles[candidate]?.type;
|
|
313
|
-
return {
|
|
314
|
-
apiKey: resolved.apiKey,
|
|
315
|
-
profileId: candidate,
|
|
316
|
-
source: `profile:${candidate}`,
|
|
317
|
-
mode: mode === "oauth" ? "oauth" : mode === "token" ? "token" : "api-key"
|
|
318
|
-
};
|
|
319
|
-
}
|
|
320
|
-
} catch {}
|
|
321
|
-
const envResolved = resolveEnvApiKey(provider);
|
|
322
|
-
if (envResolved) return {
|
|
323
|
-
apiKey: envResolved.apiKey,
|
|
324
|
-
source: envResolved.source,
|
|
325
|
-
mode: envResolved.source.includes("OAUTH_TOKEN") ? "oauth" : "api-key"
|
|
326
|
-
};
|
|
327
|
-
const customKey = getCustomProviderApiKey(cfg, provider);
|
|
328
|
-
if (customKey) return {
|
|
329
|
-
apiKey: customKey,
|
|
330
|
-
source: "models.json",
|
|
331
|
-
mode: "api-key"
|
|
332
|
-
};
|
|
333
|
-
const normalized = normalizeProviderId(provider);
|
|
334
|
-
if (authOverride === void 0 && normalized === "amazon-bedrock") return resolveAwsSdkAuthInfo();
|
|
335
|
-
if (provider === "openai") {
|
|
336
|
-
if (listProfilesForProvider(store, "openai-codex").length > 0) throw new Error("No API key found for provider \"openai\". You are authenticated with OpenAI Codex OAuth. Use openai-codex/gpt-5.3-codex (OAuth) or set OPENAI_API_KEY to use openai/gpt-5.1-codex.");
|
|
337
|
-
}
|
|
338
|
-
const authStorePath = resolveAuthStorePathForDisplay(params.agentDir);
|
|
339
|
-
const resolvedAgentDir = path.dirname(authStorePath);
|
|
340
|
-
throw new Error([
|
|
341
|
-
`No API key found for provider "${provider}".`,
|
|
342
|
-
`Auth store: ${authStorePath} (agentDir: ${resolvedAgentDir}).`,
|
|
343
|
-
`Configure auth for this agent (${formatCliCommand("anima agents add <id>")}) or copy auth-profiles.json from the main agentDir.`
|
|
344
|
-
].join(" "));
|
|
345
|
-
}
|
|
346
|
-
function resolveEnvApiKey(provider) {
|
|
347
|
-
const normalized = normalizeProviderId(provider);
|
|
348
|
-
const applied = new Set(getShellEnvAppliedKeys());
|
|
349
|
-
const pick = (envVar) => {
|
|
350
|
-
const value = normalizeOptionalSecretInput(process.env[envVar]);
|
|
351
|
-
if (!value) return null;
|
|
352
|
-
return {
|
|
353
|
-
apiKey: value,
|
|
354
|
-
source: applied.has(envVar) ? `shell env: ${envVar}` : `env: ${envVar}`
|
|
355
|
-
};
|
|
356
|
-
};
|
|
357
|
-
if (normalized === "github-copilot") return pick("COPILOT_GITHUB_TOKEN") ?? pick("GH_TOKEN") ?? pick("GITHUB_TOKEN");
|
|
358
|
-
if (normalized === "anthropic") return pick("ANTHROPIC_OAUTH_TOKEN") ?? pick("ANTHROPIC_API_KEY");
|
|
359
|
-
if (normalized === "chutes") return pick("CHUTES_OAUTH_TOKEN") ?? pick("CHUTES_API_KEY");
|
|
360
|
-
if (normalized === "zai") return pick("ZAI_API_KEY") ?? pick("Z_AI_API_KEY");
|
|
361
|
-
if (normalized === "google-vertex") {
|
|
362
|
-
const envKey = getEnvApiKey(normalized);
|
|
363
|
-
if (!envKey) return null;
|
|
364
|
-
return {
|
|
365
|
-
apiKey: envKey,
|
|
366
|
-
source: "gcloud adc"
|
|
367
|
-
};
|
|
368
|
-
}
|
|
369
|
-
if (normalized === "opencode") return pick("OPENCODE_API_KEY") ?? pick("OPENCODE_ZEN_API_KEY");
|
|
370
|
-
if (normalized === "qwen-portal") return pick("QWEN_OAUTH_TOKEN") ?? pick("QWEN_PORTAL_API_KEY");
|
|
371
|
-
if (normalized === "minimax-portal") return pick("MINIMAX_OAUTH_TOKEN") ?? pick("MINIMAX_API_KEY");
|
|
372
|
-
if (normalized === "kimi-coding") return pick("KIMI_API_KEY") ?? pick("KIMICODE_API_KEY");
|
|
373
|
-
if (normalized === "huggingface") return pick("HUGGINGFACE_HUB_TOKEN") ?? pick("HF_TOKEN");
|
|
374
|
-
const envVar = {
|
|
375
|
-
openai: "OPENAI_API_KEY",
|
|
376
|
-
google: "GEMINI_API_KEY",
|
|
377
|
-
voyage: "VOYAGE_API_KEY",
|
|
378
|
-
groq: "GROQ_API_KEY",
|
|
379
|
-
deepgram: "DEEPGRAM_API_KEY",
|
|
380
|
-
cerebras: "CEREBRAS_API_KEY",
|
|
381
|
-
xai: "XAI_API_KEY",
|
|
382
|
-
openrouter: "OPENROUTER_API_KEY",
|
|
383
|
-
litellm: "LITELLM_API_KEY",
|
|
384
|
-
"vercel-ai-gateway": "AI_GATEWAY_API_KEY",
|
|
385
|
-
"cloudflare-ai-gateway": "CLOUDFLARE_AI_GATEWAY_API_KEY",
|
|
386
|
-
moonshot: "MOONSHOT_API_KEY",
|
|
387
|
-
minimax: "MINIMAX_API_KEY",
|
|
388
|
-
nvidia: "NVIDIA_API_KEY",
|
|
389
|
-
xiaomi: "XIAOMI_API_KEY",
|
|
390
|
-
synthetic: "SYNTHETIC_API_KEY",
|
|
391
|
-
venice: "VENICE_API_KEY",
|
|
392
|
-
mistral: "MISTRAL_API_KEY",
|
|
393
|
-
opencode: "OPENCODE_API_KEY",
|
|
394
|
-
together: "TOGETHER_API_KEY",
|
|
395
|
-
qianfan: "QIANFAN_API_KEY",
|
|
396
|
-
ollama: "OLLAMA_API_KEY",
|
|
397
|
-
vllm: "VLLM_API_KEY"
|
|
398
|
-
}[normalized];
|
|
399
|
-
if (!envVar) return null;
|
|
400
|
-
return pick(envVar);
|
|
401
|
-
}
|
|
402
|
-
function resolveModelAuthMode(provider, cfg, store) {
|
|
403
|
-
const resolved = provider?.trim();
|
|
404
|
-
if (!resolved) return;
|
|
405
|
-
const authOverride = resolveProviderAuthOverride(cfg, resolved);
|
|
406
|
-
if (authOverride === "aws-sdk") return "aws-sdk";
|
|
407
|
-
const authStore = store ?? ensureAuthProfileStore();
|
|
408
|
-
const profiles = listProfilesForProvider(authStore, resolved);
|
|
409
|
-
if (profiles.length > 0) {
|
|
410
|
-
const modes = new Set(profiles.map((id) => authStore.profiles[id]?.type).filter((mode) => Boolean(mode)));
|
|
411
|
-
if ([
|
|
412
|
-
"oauth",
|
|
413
|
-
"token",
|
|
414
|
-
"api_key"
|
|
415
|
-
].filter((k) => modes.has(k)).length >= 2) return "mixed";
|
|
416
|
-
if (modes.has("oauth")) return "oauth";
|
|
417
|
-
if (modes.has("token")) return "token";
|
|
418
|
-
if (modes.has("api_key")) return "api-key";
|
|
419
|
-
}
|
|
420
|
-
if (authOverride === void 0 && normalizeProviderId(resolved) === "amazon-bedrock") return "aws-sdk";
|
|
421
|
-
const envKey = resolveEnvApiKey(resolved);
|
|
422
|
-
if (envKey?.apiKey) return envKey.source.includes("OAUTH_TOKEN") ? "oauth" : "api-key";
|
|
423
|
-
if (getCustomProviderApiKey(cfg, resolved)) return "api-key";
|
|
424
|
-
return "unknown";
|
|
425
|
-
}
|
|
426
|
-
async function getApiKeyForModel(params) {
|
|
427
|
-
return resolveApiKeyForProvider({
|
|
428
|
-
provider: params.model.provider,
|
|
429
|
-
cfg: params.cfg,
|
|
430
|
-
profileId: params.profileId,
|
|
431
|
-
preferredProfile: params.preferredProfile,
|
|
432
|
-
store: params.store,
|
|
433
|
-
agentDir: params.agentDir
|
|
434
|
-
});
|
|
435
|
-
}
|
|
436
|
-
function requireApiKey(auth, provider) {
|
|
437
|
-
const key = normalizeSecretInput(auth.apiKey);
|
|
438
|
-
if (key) return key;
|
|
439
|
-
throw new Error(`No API key resolved for provider "${provider}" (auth mode: ${auth.mode}).`);
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
//#endregion
|
|
443
|
-
//#region src/agents/synthetic-models.ts
|
|
444
|
-
const SYNTHETIC_DEFAULT_MODEL_ID = "hf:MiniMaxAI/MiniMax-M2.1";
|
|
445
|
-
const SYNTHETIC_DEFAULT_MODEL_REF = `synthetic/${SYNTHETIC_DEFAULT_MODEL_ID}`;
|
|
446
|
-
|
|
447
|
-
//#endregion
|
|
448
|
-
//#region src/agents/venice-models.ts
|
|
449
|
-
const VENICE_DEFAULT_MODEL_ID = "llama-3.3-70b";
|
|
450
|
-
const VENICE_DEFAULT_MODEL_REF = `venice/${VENICE_DEFAULT_MODEL_ID}`;
|
|
451
|
-
|
|
452
|
-
//#endregion
|
|
453
|
-
//#region src/agents/models-config.providers.ts
|
|
454
|
-
function normalizeGoogleModelId(id) {
|
|
455
|
-
if (id === "gemini-3-pro") return "gemini-3-pro-preview";
|
|
456
|
-
if (id === "gemini-3-flash") return "gemini-3-flash-preview";
|
|
457
|
-
return id;
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
//#endregion
|
|
461
|
-
//#region src/agents/model-selection.ts
|
|
462
|
-
const ANTHROPIC_MODEL_ALIASES = {
|
|
463
|
-
"opus-4.6": "claude-opus-4-6",
|
|
464
|
-
"opus-4.5": "claude-opus-4-5",
|
|
465
|
-
"sonnet-4.5": "claude-sonnet-4-5"
|
|
466
|
-
};
|
|
467
|
-
const OPENAI_CODEX_OAUTH_MODEL_PREFIXES = ["gpt-5.3-codex"];
|
|
468
|
-
function normalizeAliasKey(value) {
|
|
469
|
-
return value.trim().toLowerCase();
|
|
470
|
-
}
|
|
471
|
-
function modelKey(provider, model) {
|
|
472
|
-
return `${provider}/${model}`;
|
|
473
|
-
}
|
|
474
|
-
function normalizeProviderId(provider) {
|
|
475
|
-
const normalized = provider.trim().toLowerCase();
|
|
476
|
-
if (normalized === "z.ai" || normalized === "z-ai") return "zai";
|
|
477
|
-
if (normalized === "opencode-zen") return "opencode";
|
|
478
|
-
if (normalized === "qwen") return "qwen-portal";
|
|
479
|
-
if (normalized === "kimi-code") return "kimi-coding";
|
|
480
|
-
return normalized;
|
|
481
|
-
}
|
|
482
|
-
function isCliProvider(provider, cfg) {
|
|
483
|
-
const normalized = normalizeProviderId(provider);
|
|
484
|
-
if (normalized === "claude-cli") return true;
|
|
485
|
-
if (normalized === "codex-cli") return true;
|
|
486
|
-
const backends = cfg?.agents?.defaults?.cliBackends ?? {};
|
|
487
|
-
return Object.keys(backends).some((key) => normalizeProviderId(key) === normalized);
|
|
488
|
-
}
|
|
489
|
-
function normalizeAnthropicModelId(model) {
|
|
490
|
-
const trimmed = model.trim();
|
|
491
|
-
if (!trimmed) return trimmed;
|
|
492
|
-
return ANTHROPIC_MODEL_ALIASES[trimmed.toLowerCase()] ?? trimmed;
|
|
493
|
-
}
|
|
494
|
-
function normalizeProviderModelId(provider, model) {
|
|
495
|
-
if (provider === "anthropic") return normalizeAnthropicModelId(model);
|
|
496
|
-
if (provider === "google") return normalizeGoogleModelId(model);
|
|
497
|
-
return model;
|
|
498
|
-
}
|
|
499
|
-
function shouldUseOpenAICodexProvider(provider, model) {
|
|
500
|
-
if (provider !== "openai") return false;
|
|
501
|
-
const normalized = model.trim().toLowerCase();
|
|
502
|
-
if (!normalized) return false;
|
|
503
|
-
return OPENAI_CODEX_OAUTH_MODEL_PREFIXES.some((prefix) => normalized === prefix || normalized.startsWith(`${prefix}-`));
|
|
504
|
-
}
|
|
505
|
-
function normalizeModelRef(provider, model) {
|
|
506
|
-
const normalizedProvider = normalizeProviderId(provider);
|
|
507
|
-
const normalizedModel = normalizeProviderModelId(normalizedProvider, model.trim());
|
|
508
|
-
if (shouldUseOpenAICodexProvider(normalizedProvider, normalizedModel)) return {
|
|
509
|
-
provider: "openai-codex",
|
|
510
|
-
model: normalizedModel
|
|
511
|
-
};
|
|
512
|
-
return {
|
|
513
|
-
provider: normalizedProvider,
|
|
514
|
-
model: normalizedModel
|
|
515
|
-
};
|
|
516
|
-
}
|
|
517
|
-
function parseModelRef(raw, defaultProvider) {
|
|
518
|
-
const trimmed = raw.trim();
|
|
519
|
-
if (!trimmed) return null;
|
|
520
|
-
const slash = trimmed.indexOf("/");
|
|
521
|
-
if (slash === -1) return normalizeModelRef(defaultProvider, trimmed);
|
|
522
|
-
const providerRaw = trimmed.slice(0, slash).trim();
|
|
523
|
-
const model = trimmed.slice(slash + 1).trim();
|
|
524
|
-
if (!providerRaw || !model) return null;
|
|
525
|
-
return normalizeModelRef(providerRaw, model);
|
|
526
|
-
}
|
|
527
|
-
function resolveAllowlistModelKey(raw, defaultProvider) {
|
|
528
|
-
const parsed = parseModelRef(raw, defaultProvider);
|
|
529
|
-
if (!parsed) return null;
|
|
530
|
-
return modelKey(parsed.provider, parsed.model);
|
|
531
|
-
}
|
|
532
|
-
function buildConfiguredAllowlistKeys(params) {
|
|
533
|
-
const rawAllowlist = Object.keys(params.cfg?.agents?.defaults?.models ?? {});
|
|
534
|
-
if (rawAllowlist.length === 0) return null;
|
|
535
|
-
const keys = /* @__PURE__ */ new Set();
|
|
536
|
-
for (const raw of rawAllowlist) {
|
|
537
|
-
const key = resolveAllowlistModelKey(String(raw ?? ""), params.defaultProvider);
|
|
538
|
-
if (key) keys.add(key);
|
|
539
|
-
}
|
|
540
|
-
return keys.size > 0 ? keys : null;
|
|
541
|
-
}
|
|
542
|
-
function buildModelAliasIndex(params) {
|
|
543
|
-
const byAlias = /* @__PURE__ */ new Map();
|
|
544
|
-
const byKey = /* @__PURE__ */ new Map();
|
|
545
|
-
const rawModels = params.cfg.agents?.defaults?.models ?? {};
|
|
546
|
-
for (const [keyRaw, entryRaw] of Object.entries(rawModels)) {
|
|
547
|
-
const parsed = parseModelRef(String(keyRaw ?? ""), params.defaultProvider);
|
|
548
|
-
if (!parsed) continue;
|
|
549
|
-
const alias = String(entryRaw?.alias ?? "").trim();
|
|
550
|
-
if (!alias) continue;
|
|
551
|
-
const aliasKey = normalizeAliasKey(alias);
|
|
552
|
-
byAlias.set(aliasKey, {
|
|
553
|
-
alias,
|
|
554
|
-
ref: parsed
|
|
555
|
-
});
|
|
556
|
-
const key = modelKey(parsed.provider, parsed.model);
|
|
557
|
-
const existing = byKey.get(key) ?? [];
|
|
558
|
-
existing.push(alias);
|
|
559
|
-
byKey.set(key, existing);
|
|
560
|
-
}
|
|
561
|
-
return {
|
|
562
|
-
byAlias,
|
|
563
|
-
byKey
|
|
564
|
-
};
|
|
565
|
-
}
|
|
566
|
-
function resolveModelRefFromString(params) {
|
|
567
|
-
const trimmed = params.raw.trim();
|
|
568
|
-
if (!trimmed) return null;
|
|
569
|
-
if (!trimmed.includes("/")) {
|
|
570
|
-
const aliasKey = normalizeAliasKey(trimmed);
|
|
571
|
-
const aliasMatch = params.aliasIndex?.byAlias.get(aliasKey);
|
|
572
|
-
if (aliasMatch) return {
|
|
573
|
-
ref: aliasMatch.ref,
|
|
574
|
-
alias: aliasMatch.alias
|
|
575
|
-
};
|
|
576
|
-
}
|
|
577
|
-
const parsed = parseModelRef(trimmed, params.defaultProvider);
|
|
578
|
-
if (!parsed) return null;
|
|
579
|
-
return { ref: parsed };
|
|
580
|
-
}
|
|
581
|
-
function resolveConfiguredModelRef(params) {
|
|
582
|
-
const rawModel = (() => {
|
|
583
|
-
const raw = params.cfg.agents?.defaults?.model;
|
|
584
|
-
if (typeof raw === "string") return raw.trim();
|
|
585
|
-
return raw?.primary?.trim() ?? "";
|
|
586
|
-
})();
|
|
587
|
-
if (rawModel) {
|
|
588
|
-
const trimmed = rawModel.trim();
|
|
589
|
-
const aliasIndex = buildModelAliasIndex({
|
|
590
|
-
cfg: params.cfg,
|
|
591
|
-
defaultProvider: params.defaultProvider
|
|
592
|
-
});
|
|
593
|
-
if (!trimmed.includes("/")) {
|
|
594
|
-
const aliasKey = normalizeAliasKey(trimmed);
|
|
595
|
-
const aliasMatch = aliasIndex.byAlias.get(aliasKey);
|
|
596
|
-
if (aliasMatch) return aliasMatch.ref;
|
|
597
|
-
console.warn(`[anima] Model "${trimmed}" specified without provider. Falling back to "anthropic/${trimmed}". Please use "anthropic/${trimmed}" in your config.`);
|
|
598
|
-
return {
|
|
599
|
-
provider: "anthropic",
|
|
600
|
-
model: trimmed
|
|
601
|
-
};
|
|
602
|
-
}
|
|
603
|
-
const resolved = resolveModelRefFromString({
|
|
604
|
-
raw: trimmed,
|
|
605
|
-
defaultProvider: params.defaultProvider,
|
|
606
|
-
aliasIndex
|
|
607
|
-
});
|
|
608
|
-
if (resolved) return resolved.ref;
|
|
609
|
-
}
|
|
610
|
-
return {
|
|
611
|
-
provider: params.defaultProvider,
|
|
612
|
-
model: params.defaultModel
|
|
613
|
-
};
|
|
614
|
-
}
|
|
615
|
-
function resolveDefaultModelForAgent(params) {
|
|
616
|
-
const agentModelOverride = params.agentId ? resolveAgentModelPrimary(params.cfg, params.agentId) : void 0;
|
|
617
|
-
return resolveConfiguredModelRef({
|
|
618
|
-
cfg: agentModelOverride && agentModelOverride.length > 0 ? {
|
|
619
|
-
...params.cfg,
|
|
620
|
-
agents: {
|
|
621
|
-
...params.cfg.agents,
|
|
622
|
-
defaults: {
|
|
623
|
-
...params.cfg.agents?.defaults,
|
|
624
|
-
model: {
|
|
625
|
-
...typeof params.cfg.agents?.defaults?.model === "object" ? params.cfg.agents.defaults.model : void 0,
|
|
626
|
-
primary: agentModelOverride
|
|
627
|
-
}
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
} : params.cfg,
|
|
631
|
-
defaultProvider: DEFAULT_PROVIDER,
|
|
632
|
-
defaultModel: DEFAULT_MODEL
|
|
633
|
-
});
|
|
634
|
-
}
|
|
635
|
-
function buildAllowedModelSet(params) {
|
|
636
|
-
const rawAllowlist = (() => {
|
|
637
|
-
const modelMap = params.cfg.agents?.defaults?.models ?? {};
|
|
638
|
-
return Object.keys(modelMap);
|
|
639
|
-
})();
|
|
640
|
-
const allowAny = rawAllowlist.length === 0;
|
|
641
|
-
const defaultModel = params.defaultModel?.trim();
|
|
642
|
-
const defaultKey = defaultModel && params.defaultProvider ? modelKey(params.defaultProvider, defaultModel) : void 0;
|
|
643
|
-
const catalogKeys = new Set(params.catalog.map((entry) => modelKey(entry.provider, entry.id)));
|
|
644
|
-
if (allowAny) {
|
|
645
|
-
if (defaultKey) catalogKeys.add(defaultKey);
|
|
646
|
-
return {
|
|
647
|
-
allowAny: true,
|
|
648
|
-
allowedCatalog: params.catalog,
|
|
649
|
-
allowedKeys: catalogKeys
|
|
650
|
-
};
|
|
651
|
-
}
|
|
652
|
-
const allowedKeys = /* @__PURE__ */ new Set();
|
|
653
|
-
const configuredProviders = params.cfg.models?.providers ?? {};
|
|
654
|
-
for (const raw of rawAllowlist) {
|
|
655
|
-
const parsed = parseModelRef(String(raw), params.defaultProvider);
|
|
656
|
-
if (!parsed) continue;
|
|
657
|
-
const key = modelKey(parsed.provider, parsed.model);
|
|
658
|
-
const providerKey = normalizeProviderId(parsed.provider);
|
|
659
|
-
if (isCliProvider(parsed.provider, params.cfg)) allowedKeys.add(key);
|
|
660
|
-
else if (catalogKeys.has(key)) allowedKeys.add(key);
|
|
661
|
-
else if (configuredProviders[providerKey] != null) allowedKeys.add(key);
|
|
662
|
-
}
|
|
663
|
-
if (defaultKey) allowedKeys.add(defaultKey);
|
|
664
|
-
const allowedCatalog = params.catalog.filter((entry) => allowedKeys.has(modelKey(entry.provider, entry.id)));
|
|
665
|
-
if (allowedCatalog.length === 0 && allowedKeys.size === 0) {
|
|
666
|
-
if (defaultKey) catalogKeys.add(defaultKey);
|
|
667
|
-
return {
|
|
668
|
-
allowAny: true,
|
|
669
|
-
allowedCatalog: params.catalog,
|
|
670
|
-
allowedKeys: catalogKeys
|
|
671
|
-
};
|
|
672
|
-
}
|
|
673
|
-
return {
|
|
674
|
-
allowAny: false,
|
|
675
|
-
allowedCatalog,
|
|
676
|
-
allowedKeys
|
|
677
|
-
};
|
|
678
|
-
}
|
|
679
|
-
function resolveThinkingDefault(params) {
|
|
680
|
-
const configured = params.cfg.agents?.defaults?.thinkingDefault;
|
|
681
|
-
if (configured) return configured;
|
|
682
|
-
if ((params.catalog?.find((entry) => entry.provider === params.provider && entry.id === params.model))?.reasoning) return "low";
|
|
683
|
-
return "off";
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
//#endregion
|
|
687
|
-
//#region src/plugin-sdk/file-lock.ts
|
|
688
|
-
const HELD_LOCKS_KEY = Symbol.for("anima.fileLockHeldLocks");
|
|
689
|
-
function resolveHeldLocks() {
|
|
690
|
-
const proc = process;
|
|
691
|
-
if (!proc[HELD_LOCKS_KEY]) proc[HELD_LOCKS_KEY] = /* @__PURE__ */ new Map();
|
|
692
|
-
return proc[HELD_LOCKS_KEY];
|
|
693
|
-
}
|
|
694
|
-
const HELD_LOCKS = resolveHeldLocks();
|
|
695
|
-
function isAlive(pid) {
|
|
696
|
-
if (!Number.isFinite(pid) || pid <= 0) return false;
|
|
697
|
-
try {
|
|
698
|
-
process.kill(pid, 0);
|
|
699
|
-
return true;
|
|
700
|
-
} catch {
|
|
701
|
-
return false;
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
function computeDelayMs(retries, attempt) {
|
|
705
|
-
const base = Math.min(retries.maxTimeout, Math.max(retries.minTimeout, retries.minTimeout * retries.factor ** attempt));
|
|
706
|
-
const jitter = retries.randomize ? 1 + Math.random() : 1;
|
|
707
|
-
return Math.min(retries.maxTimeout, Math.round(base * jitter));
|
|
708
|
-
}
|
|
709
|
-
async function readLockPayload(lockPath) {
|
|
710
|
-
try {
|
|
711
|
-
const raw = await fs.readFile(lockPath, "utf8");
|
|
712
|
-
const parsed = JSON.parse(raw);
|
|
713
|
-
if (typeof parsed.pid !== "number" || typeof parsed.createdAt !== "string") return null;
|
|
714
|
-
return {
|
|
715
|
-
pid: parsed.pid,
|
|
716
|
-
createdAt: parsed.createdAt
|
|
717
|
-
};
|
|
718
|
-
} catch {
|
|
719
|
-
return null;
|
|
720
|
-
}
|
|
721
|
-
}
|
|
722
|
-
async function resolveNormalizedFilePath(filePath) {
|
|
723
|
-
const resolved = path.resolve(filePath);
|
|
724
|
-
const dir = path.dirname(resolved);
|
|
725
|
-
await fs.mkdir(dir, { recursive: true });
|
|
726
|
-
try {
|
|
727
|
-
const realDir = await fs.realpath(dir);
|
|
728
|
-
return path.join(realDir, path.basename(resolved));
|
|
729
|
-
} catch {
|
|
730
|
-
return resolved;
|
|
731
|
-
}
|
|
732
|
-
}
|
|
733
|
-
async function isStaleLock(lockPath, staleMs) {
|
|
734
|
-
const payload = await readLockPayload(lockPath);
|
|
735
|
-
if (payload?.pid && !isAlive(payload.pid)) return true;
|
|
736
|
-
if (payload?.createdAt) {
|
|
737
|
-
const createdAt = Date.parse(payload.createdAt);
|
|
738
|
-
if (!Number.isFinite(createdAt) || Date.now() - createdAt > staleMs) return true;
|
|
739
|
-
}
|
|
740
|
-
try {
|
|
741
|
-
const stat = await fs.stat(lockPath);
|
|
742
|
-
return Date.now() - stat.mtimeMs > staleMs;
|
|
743
|
-
} catch {
|
|
744
|
-
return true;
|
|
745
|
-
}
|
|
746
|
-
}
|
|
747
|
-
async function acquireFileLock(filePath, options) {
|
|
748
|
-
const normalizedFile = await resolveNormalizedFilePath(filePath);
|
|
749
|
-
const lockPath = `${normalizedFile}.lock`;
|
|
750
|
-
const held = HELD_LOCKS.get(normalizedFile);
|
|
751
|
-
if (held) {
|
|
752
|
-
held.count += 1;
|
|
753
|
-
return {
|
|
754
|
-
lockPath,
|
|
755
|
-
release: async () => {
|
|
756
|
-
const current = HELD_LOCKS.get(normalizedFile);
|
|
757
|
-
if (!current) return;
|
|
758
|
-
current.count -= 1;
|
|
759
|
-
if (current.count > 0) return;
|
|
760
|
-
HELD_LOCKS.delete(normalizedFile);
|
|
761
|
-
await current.handle.close().catch(() => void 0);
|
|
762
|
-
await fs.rm(current.lockPath, { force: true }).catch(() => void 0);
|
|
763
|
-
}
|
|
764
|
-
};
|
|
765
|
-
}
|
|
766
|
-
const attempts = Math.max(1, options.retries.retries + 1);
|
|
767
|
-
for (let attempt = 0; attempt < attempts; attempt += 1) try {
|
|
768
|
-
const handle = await fs.open(lockPath, "wx");
|
|
769
|
-
await handle.writeFile(JSON.stringify({
|
|
770
|
-
pid: process.pid,
|
|
771
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
772
|
-
}, null, 2), "utf8");
|
|
773
|
-
HELD_LOCKS.set(normalizedFile, {
|
|
774
|
-
count: 1,
|
|
775
|
-
handle,
|
|
776
|
-
lockPath
|
|
777
|
-
});
|
|
778
|
-
return {
|
|
779
|
-
lockPath,
|
|
780
|
-
release: async () => {
|
|
781
|
-
const current = HELD_LOCKS.get(normalizedFile);
|
|
782
|
-
if (!current) return;
|
|
783
|
-
current.count -= 1;
|
|
784
|
-
if (current.count > 0) return;
|
|
785
|
-
HELD_LOCKS.delete(normalizedFile);
|
|
786
|
-
await current.handle.close().catch(() => void 0);
|
|
787
|
-
await fs.rm(current.lockPath, { force: true }).catch(() => void 0);
|
|
788
|
-
}
|
|
789
|
-
};
|
|
790
|
-
} catch (err) {
|
|
791
|
-
if (err.code !== "EEXIST") throw err;
|
|
792
|
-
if (await isStaleLock(lockPath, options.stale)) {
|
|
793
|
-
await fs.rm(lockPath, { force: true }).catch(() => void 0);
|
|
794
|
-
continue;
|
|
795
|
-
}
|
|
796
|
-
if (attempt >= attempts - 1) break;
|
|
797
|
-
await new Promise((resolve) => setTimeout(resolve, computeDelayMs(options.retries, attempt)));
|
|
798
|
-
}
|
|
799
|
-
throw new Error(`file lock timeout for ${normalizedFile}`);
|
|
800
|
-
}
|
|
801
|
-
async function withFileLock(filePath, options, fn) {
|
|
802
|
-
const lock = await acquireFileLock(filePath, options);
|
|
803
|
-
try {
|
|
804
|
-
return await fn();
|
|
805
|
-
} finally {
|
|
806
|
-
await lock.release();
|
|
807
|
-
}
|
|
808
|
-
}
|
|
809
|
-
|
|
810
|
-
//#endregion
|
|
811
|
-
//#region src/infra/json-file.ts
|
|
812
|
-
function loadJsonFile(pathname) {
|
|
813
|
-
try {
|
|
814
|
-
if (!fs$1.existsSync(pathname)) return;
|
|
815
|
-
const raw = fs$1.readFileSync(pathname, "utf8");
|
|
816
|
-
return JSON.parse(raw);
|
|
817
|
-
} catch {
|
|
818
|
-
return;
|
|
819
|
-
}
|
|
820
|
-
}
|
|
821
|
-
function saveJsonFile(pathname, data) {
|
|
822
|
-
const dir = path.dirname(pathname);
|
|
823
|
-
if (!fs$1.existsSync(dir)) fs$1.mkdirSync(dir, {
|
|
824
|
-
recursive: true,
|
|
825
|
-
mode: 448
|
|
826
|
-
});
|
|
827
|
-
fs$1.writeFileSync(pathname, `${JSON.stringify(data, null, 2)}\n`, "utf8");
|
|
828
|
-
fs$1.chmodSync(pathname, 384);
|
|
829
|
-
}
|
|
830
|
-
|
|
831
|
-
//#endregion
|
|
832
|
-
//#region src/agents/cli-credentials.ts
|
|
833
|
-
const log = createSubsystemLogger("agents/auth-profiles");
|
|
834
|
-
const QWEN_CLI_CREDENTIALS_RELATIVE_PATH = ".qwen/oauth_creds.json";
|
|
835
|
-
const MINIMAX_CLI_CREDENTIALS_RELATIVE_PATH = ".minimax/oauth_creds.json";
|
|
836
|
-
let qwenCliCache = null;
|
|
837
|
-
let minimaxCliCache = null;
|
|
838
|
-
function resolveQwenCliCredentialsPath(homeDir) {
|
|
839
|
-
const baseDir = homeDir ?? resolveUserPath("~");
|
|
840
|
-
return path.join(baseDir, QWEN_CLI_CREDENTIALS_RELATIVE_PATH);
|
|
841
|
-
}
|
|
842
|
-
function resolveMiniMaxCliCredentialsPath(homeDir) {
|
|
843
|
-
const baseDir = homeDir ?? resolveUserPath("~");
|
|
844
|
-
return path.join(baseDir, MINIMAX_CLI_CREDENTIALS_RELATIVE_PATH);
|
|
845
|
-
}
|
|
846
|
-
function readQwenCliCredentials(options) {
|
|
847
|
-
return readPortalCliOauthCredentials(resolveQwenCliCredentialsPath(options?.homeDir), "qwen-portal");
|
|
848
|
-
}
|
|
849
|
-
function readPortalCliOauthCredentials(credPath, provider) {
|
|
850
|
-
const raw = loadJsonFile(credPath);
|
|
851
|
-
if (!raw || typeof raw !== "object") return null;
|
|
852
|
-
const data = raw;
|
|
853
|
-
const accessToken = data.access_token;
|
|
854
|
-
const refreshToken = data.refresh_token;
|
|
855
|
-
const expiresAt = data.expiry_date;
|
|
856
|
-
if (typeof accessToken !== "string" || !accessToken) return null;
|
|
857
|
-
if (typeof refreshToken !== "string" || !refreshToken) return null;
|
|
858
|
-
if (typeof expiresAt !== "number" || !Number.isFinite(expiresAt)) return null;
|
|
859
|
-
return {
|
|
860
|
-
type: "oauth",
|
|
861
|
-
provider,
|
|
862
|
-
access: accessToken,
|
|
863
|
-
refresh: refreshToken,
|
|
864
|
-
expires: expiresAt
|
|
865
|
-
};
|
|
866
|
-
}
|
|
867
|
-
function readMiniMaxCliCredentials(options) {
|
|
868
|
-
return readPortalCliOauthCredentials(resolveMiniMaxCliCredentialsPath(options?.homeDir), "minimax-portal");
|
|
869
|
-
}
|
|
870
|
-
function readQwenCliCredentialsCached(options) {
|
|
871
|
-
const ttlMs = options?.ttlMs ?? 0;
|
|
872
|
-
const now = Date.now();
|
|
873
|
-
const cacheKey = resolveQwenCliCredentialsPath(options?.homeDir);
|
|
874
|
-
if (ttlMs > 0 && qwenCliCache && qwenCliCache.cacheKey === cacheKey && now - qwenCliCache.readAt < ttlMs) return qwenCliCache.value;
|
|
875
|
-
const value = readQwenCliCredentials({ homeDir: options?.homeDir });
|
|
876
|
-
if (ttlMs > 0) qwenCliCache = {
|
|
877
|
-
value,
|
|
878
|
-
readAt: now,
|
|
879
|
-
cacheKey
|
|
880
|
-
};
|
|
881
|
-
return value;
|
|
882
|
-
}
|
|
883
|
-
function readMiniMaxCliCredentialsCached(options) {
|
|
884
|
-
const ttlMs = options?.ttlMs ?? 0;
|
|
885
|
-
const now = Date.now();
|
|
886
|
-
const cacheKey = resolveMiniMaxCliCredentialsPath(options?.homeDir);
|
|
887
|
-
if (ttlMs > 0 && minimaxCliCache && minimaxCliCache.cacheKey === cacheKey && now - minimaxCliCache.readAt < ttlMs) return minimaxCliCache.value;
|
|
888
|
-
const value = readMiniMaxCliCredentials({ homeDir: options?.homeDir });
|
|
889
|
-
if (ttlMs > 0) minimaxCliCache = {
|
|
890
|
-
value,
|
|
891
|
-
readAt: now,
|
|
892
|
-
cacheKey
|
|
893
|
-
};
|
|
894
|
-
return value;
|
|
895
|
-
}
|
|
896
|
-
|
|
897
|
-
//#endregion
|
|
898
|
-
//#region src/agents/auth-profiles/external-cli-sync.ts
|
|
899
|
-
function shallowEqualOAuthCredentials(a, b) {
|
|
900
|
-
if (!a) return false;
|
|
901
|
-
if (a.type !== "oauth") return false;
|
|
902
|
-
return a.provider === b.provider && a.access === b.access && a.refresh === b.refresh && a.expires === b.expires && a.email === b.email && a.enterpriseUrl === b.enterpriseUrl && a.projectId === b.projectId && a.accountId === b.accountId;
|
|
903
|
-
}
|
|
904
|
-
function isExternalProfileFresh(cred, now) {
|
|
905
|
-
if (!cred) return false;
|
|
906
|
-
if (cred.type !== "oauth" && cred.type !== "token") return false;
|
|
907
|
-
if (cred.provider !== "qwen-portal" && cred.provider !== "minimax-portal") return false;
|
|
908
|
-
if (typeof cred.expires !== "number") return true;
|
|
909
|
-
return cred.expires > now + EXTERNAL_CLI_NEAR_EXPIRY_MS;
|
|
910
|
-
}
|
|
911
|
-
/** Sync external CLI credentials into the store for a given provider. */
|
|
912
|
-
function syncExternalCliCredentialsForProvider(store, profileId, provider, readCredentials, now) {
|
|
913
|
-
const existing = store.profiles[profileId];
|
|
914
|
-
const creds = !existing || existing.provider !== provider || !isExternalProfileFresh(existing, now) ? readCredentials() : null;
|
|
915
|
-
if (!creds) return false;
|
|
916
|
-
const existingOAuth = existing?.type === "oauth" ? existing : void 0;
|
|
917
|
-
if ((!existingOAuth || existingOAuth.provider !== provider || existingOAuth.expires <= now || creds.expires > existingOAuth.expires) && !shallowEqualOAuthCredentials(existingOAuth, creds)) {
|
|
918
|
-
store.profiles[profileId] = creds;
|
|
919
|
-
log$2.info(`synced ${provider} credentials from external cli`, {
|
|
920
|
-
profileId,
|
|
921
|
-
expires: new Date(creds.expires).toISOString()
|
|
922
|
-
});
|
|
923
|
-
return true;
|
|
924
|
-
}
|
|
925
|
-
return false;
|
|
926
|
-
}
|
|
927
|
-
/**
|
|
928
|
-
* Sync OAuth credentials from external CLI tools (Qwen Code CLI, MiniMax CLI) into the store.
|
|
929
|
-
*
|
|
930
|
-
* Returns true if any credentials were updated.
|
|
931
|
-
*/
|
|
932
|
-
function syncExternalCliCredentials(store) {
|
|
933
|
-
let mutated = false;
|
|
934
|
-
const now = Date.now();
|
|
935
|
-
const existingQwen = store.profiles[QWEN_CLI_PROFILE_ID];
|
|
936
|
-
const qwenCreds = !existingQwen || existingQwen.provider !== "qwen-portal" || !isExternalProfileFresh(existingQwen, now) ? readQwenCliCredentialsCached({ ttlMs: EXTERNAL_CLI_SYNC_TTL_MS }) : null;
|
|
937
|
-
if (qwenCreds) {
|
|
938
|
-
const existing = store.profiles[QWEN_CLI_PROFILE_ID];
|
|
939
|
-
const existingOAuth = existing?.type === "oauth" ? existing : void 0;
|
|
940
|
-
if ((!existingOAuth || existingOAuth.provider !== "qwen-portal" || existingOAuth.expires <= now || qwenCreds.expires > existingOAuth.expires) && !shallowEqualOAuthCredentials(existingOAuth, qwenCreds)) {
|
|
941
|
-
store.profiles[QWEN_CLI_PROFILE_ID] = qwenCreds;
|
|
942
|
-
mutated = true;
|
|
943
|
-
log$2.info("synced qwen credentials from qwen cli", {
|
|
944
|
-
profileId: QWEN_CLI_PROFILE_ID,
|
|
945
|
-
expires: new Date(qwenCreds.expires).toISOString()
|
|
946
|
-
});
|
|
947
|
-
}
|
|
948
|
-
}
|
|
949
|
-
if (syncExternalCliCredentialsForProvider(store, MINIMAX_CLI_PROFILE_ID, "minimax-portal", () => readMiniMaxCliCredentialsCached({ ttlMs: EXTERNAL_CLI_SYNC_TTL_MS }), now)) mutated = true;
|
|
950
|
-
return mutated;
|
|
951
|
-
}
|
|
952
|
-
|
|
953
|
-
//#endregion
|
|
954
|
-
//#region src/agents/agent-paths.ts
|
|
955
|
-
function resolveAnimaAgentDir() {
|
|
956
|
-
const override = process.env.ANIMA_AGENT_DIR?.trim() || process.env.OPENCLAW_AGENT_DIR?.trim() || process.env.PI_CODING_AGENT_DIR?.trim();
|
|
957
|
-
if (override) return resolveUserPath(override);
|
|
958
|
-
return resolveUserPath(path.join(resolveStateDir(), "agents", DEFAULT_AGENT_ID, "agent"));
|
|
959
|
-
}
|
|
960
|
-
|
|
961
|
-
//#endregion
|
|
962
|
-
//#region src/agents/auth-profiles/paths.ts
|
|
963
|
-
function resolveAuthStorePath(agentDir) {
|
|
964
|
-
const resolved = resolveUserPath(agentDir ?? resolveAnimaAgentDir());
|
|
965
|
-
return path.join(resolved, AUTH_PROFILE_FILENAME);
|
|
966
|
-
}
|
|
967
|
-
function resolveLegacyAuthStorePath(agentDir) {
|
|
968
|
-
const resolved = resolveUserPath(agentDir ?? resolveAnimaAgentDir());
|
|
969
|
-
return path.join(resolved, LEGACY_AUTH_FILENAME);
|
|
970
|
-
}
|
|
971
|
-
function resolveAuthStorePathForDisplay(agentDir) {
|
|
972
|
-
const pathname = resolveAuthStorePath(agentDir);
|
|
973
|
-
return pathname.startsWith("~") ? pathname : resolveUserPath(pathname);
|
|
974
|
-
}
|
|
975
|
-
function ensureAuthStoreFile(pathname) {
|
|
976
|
-
if (fs$1.existsSync(pathname)) return;
|
|
977
|
-
saveJsonFile(pathname, {
|
|
978
|
-
version: AUTH_STORE_VERSION,
|
|
979
|
-
profiles: {}
|
|
980
|
-
});
|
|
981
|
-
}
|
|
982
|
-
|
|
983
|
-
//#endregion
|
|
984
|
-
//#region src/agents/auth-profiles/store.ts
|
|
985
|
-
function coerceLegacyStore(raw) {
|
|
986
|
-
if (!raw || typeof raw !== "object") return null;
|
|
987
|
-
const record = raw;
|
|
988
|
-
if ("profiles" in record) return null;
|
|
989
|
-
const entries = {};
|
|
990
|
-
for (const [key, value] of Object.entries(record)) {
|
|
991
|
-
if (!value || typeof value !== "object") continue;
|
|
992
|
-
const typed = value;
|
|
993
|
-
if (typed.type !== "api_key" && typed.type !== "oauth" && typed.type !== "token") continue;
|
|
994
|
-
entries[key] = {
|
|
995
|
-
...typed,
|
|
996
|
-
provider: String(typed.provider ?? key)
|
|
997
|
-
};
|
|
998
|
-
}
|
|
999
|
-
return Object.keys(entries).length > 0 ? entries : null;
|
|
1000
|
-
}
|
|
1001
|
-
function coerceAuthStore(raw) {
|
|
1002
|
-
if (!raw || typeof raw !== "object") return null;
|
|
1003
|
-
const record = raw;
|
|
1004
|
-
if (!record.profiles || typeof record.profiles !== "object") return null;
|
|
1005
|
-
const profiles = record.profiles;
|
|
1006
|
-
const normalized = {};
|
|
1007
|
-
for (const [key, value] of Object.entries(profiles)) {
|
|
1008
|
-
if (!value || typeof value !== "object") continue;
|
|
1009
|
-
const typed = value;
|
|
1010
|
-
if (typed.type !== "api_key" && typed.type !== "oauth" && typed.type !== "token") continue;
|
|
1011
|
-
if (!typed.provider) continue;
|
|
1012
|
-
normalized[key] = typed;
|
|
1013
|
-
}
|
|
1014
|
-
const order = record.order && typeof record.order === "object" ? Object.entries(record.order).reduce((acc, [provider, value]) => {
|
|
1015
|
-
if (!Array.isArray(value)) return acc;
|
|
1016
|
-
const list = value.map((entry) => typeof entry === "string" ? entry.trim() : "").filter(Boolean);
|
|
1017
|
-
if (list.length === 0) return acc;
|
|
1018
|
-
acc[provider] = list;
|
|
1019
|
-
return acc;
|
|
1020
|
-
}, {}) : void 0;
|
|
1021
|
-
return {
|
|
1022
|
-
version: Number(record.version ?? AUTH_STORE_VERSION),
|
|
1023
|
-
profiles: normalized,
|
|
1024
|
-
order,
|
|
1025
|
-
lastGood: record.lastGood && typeof record.lastGood === "object" ? record.lastGood : void 0,
|
|
1026
|
-
usageStats: record.usageStats && typeof record.usageStats === "object" ? record.usageStats : void 0
|
|
1027
|
-
};
|
|
1028
|
-
}
|
|
1029
|
-
function mergeRecord(base, override) {
|
|
1030
|
-
if (!base && !override) return;
|
|
1031
|
-
if (!base) return { ...override };
|
|
1032
|
-
if (!override) return { ...base };
|
|
1033
|
-
return {
|
|
1034
|
-
...base,
|
|
1035
|
-
...override
|
|
1036
|
-
};
|
|
1037
|
-
}
|
|
1038
|
-
function mergeAuthProfileStores(base, override) {
|
|
1039
|
-
if (Object.keys(override.profiles).length === 0 && !override.order && !override.lastGood && !override.usageStats) return base;
|
|
1040
|
-
return {
|
|
1041
|
-
version: Math.max(base.version, override.version ?? base.version),
|
|
1042
|
-
profiles: {
|
|
1043
|
-
...base.profiles,
|
|
1044
|
-
...override.profiles
|
|
1045
|
-
},
|
|
1046
|
-
order: mergeRecord(base.order, override.order),
|
|
1047
|
-
lastGood: mergeRecord(base.lastGood, override.lastGood),
|
|
1048
|
-
usageStats: mergeRecord(base.usageStats, override.usageStats)
|
|
1049
|
-
};
|
|
1050
|
-
}
|
|
1051
|
-
function mergeOAuthFileIntoStore(store) {
|
|
1052
|
-
const oauthRaw = loadJsonFile(resolveOAuthPath());
|
|
1053
|
-
if (!oauthRaw || typeof oauthRaw !== "object") return false;
|
|
1054
|
-
const oauthEntries = oauthRaw;
|
|
1055
|
-
let mutated = false;
|
|
1056
|
-
for (const [provider, creds] of Object.entries(oauthEntries)) {
|
|
1057
|
-
if (!creds || typeof creds !== "object") continue;
|
|
1058
|
-
const profileId = `${provider}:default`;
|
|
1059
|
-
if (store.profiles[profileId]) continue;
|
|
1060
|
-
store.profiles[profileId] = {
|
|
1061
|
-
type: "oauth",
|
|
1062
|
-
provider,
|
|
1063
|
-
...creds
|
|
1064
|
-
};
|
|
1065
|
-
mutated = true;
|
|
1066
|
-
}
|
|
1067
|
-
return mutated;
|
|
1068
|
-
}
|
|
1069
|
-
function applyLegacyStore(store, legacy) {
|
|
1070
|
-
for (const [provider, cred] of Object.entries(legacy)) {
|
|
1071
|
-
const profileId = `${provider}:default`;
|
|
1072
|
-
if (cred.type === "api_key") {
|
|
1073
|
-
store.profiles[profileId] = {
|
|
1074
|
-
type: "api_key",
|
|
1075
|
-
provider: String(cred.provider ?? provider),
|
|
1076
|
-
key: cred.key,
|
|
1077
|
-
...cred.email ? { email: cred.email } : {}
|
|
1078
|
-
};
|
|
1079
|
-
continue;
|
|
1080
|
-
}
|
|
1081
|
-
if (cred.type === "token") {
|
|
1082
|
-
store.profiles[profileId] = {
|
|
1083
|
-
type: "token",
|
|
1084
|
-
provider: String(cred.provider ?? provider),
|
|
1085
|
-
token: cred.token,
|
|
1086
|
-
...typeof cred.expires === "number" ? { expires: cred.expires } : {},
|
|
1087
|
-
...cred.email ? { email: cred.email } : {}
|
|
1088
|
-
};
|
|
1089
|
-
continue;
|
|
1090
|
-
}
|
|
1091
|
-
store.profiles[profileId] = {
|
|
1092
|
-
type: "oauth",
|
|
1093
|
-
provider: String(cred.provider ?? provider),
|
|
1094
|
-
access: cred.access,
|
|
1095
|
-
refresh: cred.refresh,
|
|
1096
|
-
expires: cred.expires,
|
|
1097
|
-
...cred.enterpriseUrl ? { enterpriseUrl: cred.enterpriseUrl } : {},
|
|
1098
|
-
...cred.projectId ? { projectId: cred.projectId } : {},
|
|
1099
|
-
...cred.accountId ? { accountId: cred.accountId } : {},
|
|
1100
|
-
...cred.email ? { email: cred.email } : {}
|
|
1101
|
-
};
|
|
1102
|
-
}
|
|
1103
|
-
}
|
|
1104
|
-
function loadAuthProfileStoreForAgent(agentDir, _options) {
|
|
1105
|
-
const authPath = resolveAuthStorePath(agentDir);
|
|
1106
|
-
const asStore = coerceAuthStore(loadJsonFile(authPath));
|
|
1107
|
-
if (asStore) {
|
|
1108
|
-
if (syncExternalCliCredentials(asStore)) saveJsonFile(authPath, asStore);
|
|
1109
|
-
return asStore;
|
|
1110
|
-
}
|
|
1111
|
-
if (agentDir) {
|
|
1112
|
-
const mainStore = coerceAuthStore(loadJsonFile(resolveAuthStorePath()));
|
|
1113
|
-
if (mainStore && Object.keys(mainStore.profiles).length > 0) {
|
|
1114
|
-
saveJsonFile(authPath, mainStore);
|
|
1115
|
-
log$2.info("inherited auth-profiles from main agent", { agentDir });
|
|
1116
|
-
return mainStore;
|
|
1117
|
-
}
|
|
1118
|
-
}
|
|
1119
|
-
const legacy = coerceLegacyStore(loadJsonFile(resolveLegacyAuthStorePath(agentDir)));
|
|
1120
|
-
const store = {
|
|
1121
|
-
version: AUTH_STORE_VERSION,
|
|
1122
|
-
profiles: {}
|
|
1123
|
-
};
|
|
1124
|
-
if (legacy) applyLegacyStore(store, legacy);
|
|
1125
|
-
const mergedOAuth = mergeOAuthFileIntoStore(store);
|
|
1126
|
-
const syncedCli = syncExternalCliCredentials(store);
|
|
1127
|
-
const shouldWrite = legacy !== null || mergedOAuth || syncedCli;
|
|
1128
|
-
if (shouldWrite) saveJsonFile(authPath, store);
|
|
1129
|
-
if (shouldWrite && legacy !== null) {
|
|
1130
|
-
const legacyPath = resolveLegacyAuthStorePath(agentDir);
|
|
1131
|
-
try {
|
|
1132
|
-
fs$1.unlinkSync(legacyPath);
|
|
1133
|
-
} catch (err) {
|
|
1134
|
-
if (err?.code !== "ENOENT") log$2.warn("failed to delete legacy auth.json after migration", {
|
|
1135
|
-
err,
|
|
1136
|
-
legacyPath
|
|
1137
|
-
});
|
|
1138
|
-
}
|
|
1139
|
-
}
|
|
1140
|
-
return store;
|
|
1141
|
-
}
|
|
1142
|
-
function ensureAuthProfileStore(agentDir, options) {
|
|
1143
|
-
const store = loadAuthProfileStoreForAgent(agentDir, options);
|
|
1144
|
-
const authPath = resolveAuthStorePath(agentDir);
|
|
1145
|
-
const mainAuthPath = resolveAuthStorePath();
|
|
1146
|
-
if (!agentDir || authPath === mainAuthPath) return store;
|
|
1147
|
-
return mergeAuthProfileStores(loadAuthProfileStoreForAgent(void 0, options), store);
|
|
1148
|
-
}
|
|
1149
|
-
function saveAuthProfileStore(store, agentDir) {
|
|
1150
|
-
saveJsonFile(resolveAuthStorePath(agentDir), {
|
|
1151
|
-
version: AUTH_STORE_VERSION,
|
|
1152
|
-
profiles: store.profiles,
|
|
1153
|
-
order: store.order ?? void 0,
|
|
1154
|
-
lastGood: store.lastGood ?? void 0,
|
|
1155
|
-
usageStats: store.usageStats ?? void 0
|
|
1156
|
-
});
|
|
1157
|
-
}
|
|
1158
|
-
|
|
1159
|
-
//#endregion
|
|
1160
|
-
//#region src/agents/auth-profiles/profiles.ts
|
|
1161
|
-
function listProfilesForProvider(store, provider) {
|
|
1162
|
-
const providerKey = normalizeProviderId(provider);
|
|
1163
|
-
return Object.entries(store.profiles).filter(([, cred]) => normalizeProviderId(cred.provider) === providerKey).map(([id]) => id);
|
|
1164
|
-
}
|
|
1165
|
-
|
|
1166
|
-
//#endregion
|
|
1167
|
-
//#region src/agents/auth-profiles/repair.ts
|
|
1168
|
-
function getProfileSuffix(profileId) {
|
|
1169
|
-
const idx = profileId.indexOf(":");
|
|
1170
|
-
if (idx < 0) return "";
|
|
1171
|
-
return profileId.slice(idx + 1);
|
|
1172
|
-
}
|
|
1173
|
-
function isEmailLike(value) {
|
|
1174
|
-
const trimmed = value.trim();
|
|
1175
|
-
if (!trimmed) return false;
|
|
1176
|
-
return trimmed.includes("@") && trimmed.includes(".");
|
|
1177
|
-
}
|
|
1178
|
-
function suggestOAuthProfileIdForLegacyDefault(params) {
|
|
1179
|
-
const providerKey = normalizeProviderId(params.provider);
|
|
1180
|
-
if (getProfileSuffix(params.legacyProfileId) !== "default") return null;
|
|
1181
|
-
const legacyCfg = params.cfg?.auth?.profiles?.[params.legacyProfileId];
|
|
1182
|
-
if (legacyCfg && normalizeProviderId(legacyCfg.provider) === providerKey && legacyCfg.mode !== "oauth") return null;
|
|
1183
|
-
const oauthProfiles = listProfilesForProvider(params.store, providerKey).filter((id) => params.store.profiles[id]?.type === "oauth");
|
|
1184
|
-
if (oauthProfiles.length === 0) return null;
|
|
1185
|
-
const configuredEmail = legacyCfg?.email?.trim();
|
|
1186
|
-
if (configuredEmail) {
|
|
1187
|
-
const byEmail = oauthProfiles.find((id) => {
|
|
1188
|
-
const cred = params.store.profiles[id];
|
|
1189
|
-
if (!cred || cred.type !== "oauth") return false;
|
|
1190
|
-
return cred.email?.trim() === configuredEmail || id === `${providerKey}:${configuredEmail}`;
|
|
1191
|
-
});
|
|
1192
|
-
if (byEmail) return byEmail;
|
|
1193
|
-
}
|
|
1194
|
-
const lastGood = params.store.lastGood?.[providerKey] ?? params.store.lastGood?.[params.provider];
|
|
1195
|
-
if (lastGood && oauthProfiles.includes(lastGood)) return lastGood;
|
|
1196
|
-
const nonLegacy = oauthProfiles.filter((id) => id !== params.legacyProfileId);
|
|
1197
|
-
if (nonLegacy.length === 1) return nonLegacy[0] ?? null;
|
|
1198
|
-
const emailLike = nonLegacy.filter((id) => isEmailLike(getProfileSuffix(id)));
|
|
1199
|
-
if (emailLike.length === 1) return emailLike[0] ?? null;
|
|
1200
|
-
return null;
|
|
1201
|
-
}
|
|
1202
|
-
|
|
1203
|
-
//#endregion
|
|
1204
|
-
//#region src/agents/auth-profiles/doctor.ts
|
|
1205
|
-
function formatAuthDoctorHint(params) {
|
|
1206
|
-
const providerKey = normalizeProviderId(params.provider);
|
|
1207
|
-
if (providerKey !== "anthropic") return "";
|
|
1208
|
-
const legacyProfileId = params.profileId ?? "anthropic:default";
|
|
1209
|
-
const suggested = suggestOAuthProfileIdForLegacyDefault({
|
|
1210
|
-
cfg: params.cfg,
|
|
1211
|
-
store: params.store,
|
|
1212
|
-
provider: providerKey,
|
|
1213
|
-
legacyProfileId
|
|
1214
|
-
});
|
|
1215
|
-
if (!suggested || suggested === legacyProfileId) return "";
|
|
1216
|
-
const storeOauthProfiles = listProfilesForProvider(params.store, providerKey).filter((id) => params.store.profiles[id]?.type === "oauth").join(", ");
|
|
1217
|
-
const cfgMode = params.cfg?.auth?.profiles?.[legacyProfileId]?.mode;
|
|
1218
|
-
const cfgProvider = params.cfg?.auth?.profiles?.[legacyProfileId]?.provider;
|
|
1219
|
-
return [
|
|
1220
|
-
"Doctor hint (for GitHub issue):",
|
|
1221
|
-
`- provider: ${providerKey}`,
|
|
1222
|
-
`- config: ${legacyProfileId}${cfgProvider || cfgMode ? ` (provider=${cfgProvider ?? "?"}, mode=${cfgMode ?? "?"})` : ""}`,
|
|
1223
|
-
`- auth store oauth profiles: ${storeOauthProfiles || "(none)"}`,
|
|
1224
|
-
`- suggested profile: ${suggested}`,
|
|
1225
|
-
`Fix: run "${formatCliCommand("anima doctor --yes")}"`
|
|
1226
|
-
].join("\n");
|
|
1227
|
-
}
|
|
1228
|
-
|
|
1229
|
-
//#endregion
|
|
1230
|
-
//#region src/providers/qwen-portal-oauth.ts
|
|
1231
|
-
async function refreshQwenPortalCredentials(_opts) {
|
|
1232
|
-
return null;
|
|
1233
|
-
}
|
|
1234
|
-
|
|
1235
|
-
//#endregion
|
|
1236
|
-
//#region src/agents/chutes-oauth.ts
|
|
1237
|
-
const CHUTES_OAUTH_ISSUER = "https://api.chutes.ai";
|
|
1238
|
-
const CHUTES_AUTHORIZE_ENDPOINT = `${CHUTES_OAUTH_ISSUER}/idp/authorize`;
|
|
1239
|
-
const CHUTES_TOKEN_ENDPOINT = `${CHUTES_OAUTH_ISSUER}/idp/token`;
|
|
1240
|
-
const CHUTES_USERINFO_ENDPOINT = `${CHUTES_OAUTH_ISSUER}/idp/userinfo`;
|
|
1241
|
-
const DEFAULT_EXPIRES_BUFFER_MS = 300 * 1e3;
|
|
1242
|
-
function coerceExpiresAt(expiresInSeconds, now) {
|
|
1243
|
-
const value = now + Math.max(0, Math.floor(expiresInSeconds)) * 1e3 - DEFAULT_EXPIRES_BUFFER_MS;
|
|
1244
|
-
return Math.max(value, now + 3e4);
|
|
1245
|
-
}
|
|
1246
|
-
async function refreshChutesTokens(params) {
|
|
1247
|
-
const fetchFn = params.fetchFn ?? fetch;
|
|
1248
|
-
const now = params.now ?? Date.now();
|
|
1249
|
-
const refreshToken = params.credential.refresh?.trim();
|
|
1250
|
-
if (!refreshToken) throw new Error("Chutes OAuth credential is missing refresh token");
|
|
1251
|
-
const clientId = params.credential.clientId?.trim() ?? process.env.CHUTES_CLIENT_ID?.trim();
|
|
1252
|
-
if (!clientId) throw new Error("Missing CHUTES_CLIENT_ID for Chutes OAuth refresh (set env var or re-auth).");
|
|
1253
|
-
const clientSecret = process.env.CHUTES_CLIENT_SECRET?.trim() || void 0;
|
|
1254
|
-
const body = new URLSearchParams({
|
|
1255
|
-
grant_type: "refresh_token",
|
|
1256
|
-
client_id: clientId,
|
|
1257
|
-
refresh_token: refreshToken
|
|
1258
|
-
});
|
|
1259
|
-
if (clientSecret) body.set("client_secret", clientSecret);
|
|
1260
|
-
const response = await fetchFn(CHUTES_TOKEN_ENDPOINT, {
|
|
1261
|
-
method: "POST",
|
|
1262
|
-
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
1263
|
-
body
|
|
1264
|
-
});
|
|
1265
|
-
if (!response.ok) {
|
|
1266
|
-
const text = await response.text();
|
|
1267
|
-
throw new Error(`Chutes token refresh failed: ${text}`);
|
|
1268
|
-
}
|
|
1269
|
-
const data = await response.json();
|
|
1270
|
-
const access = data.access_token?.trim();
|
|
1271
|
-
const newRefresh = data.refresh_token?.trim();
|
|
1272
|
-
const expiresIn = data.expires_in ?? 0;
|
|
1273
|
-
if (!access) throw new Error("Chutes token refresh returned no access_token");
|
|
1274
|
-
return {
|
|
1275
|
-
...params.credential,
|
|
1276
|
-
access,
|
|
1277
|
-
refresh: newRefresh || refreshToken,
|
|
1278
|
-
expires: coerceExpiresAt(expiresIn, now),
|
|
1279
|
-
clientId
|
|
1280
|
-
};
|
|
1281
|
-
}
|
|
1282
|
-
|
|
1283
|
-
//#endregion
|
|
1284
|
-
//#region src/agents/auth-profiles/oauth.ts
|
|
1285
|
-
const OAUTH_PROVIDER_IDS = new Set(getOAuthProviders().map((provider) => provider.id));
|
|
1286
|
-
const isOAuthProvider = (provider) => OAUTH_PROVIDER_IDS.has(provider);
|
|
1287
|
-
const resolveOAuthProvider = (provider) => isOAuthProvider(provider) ? provider : null;
|
|
1288
|
-
function buildOAuthApiKey(provider, credentials) {
|
|
1289
|
-
return provider === "google-gemini-cli" || provider === "google-antigravity" ? JSON.stringify({
|
|
1290
|
-
token: credentials.access,
|
|
1291
|
-
projectId: credentials.projectId
|
|
1292
|
-
}) : credentials.access;
|
|
1293
|
-
}
|
|
1294
|
-
async function refreshOAuthTokenWithLock(params) {
|
|
1295
|
-
const authPath = resolveAuthStorePath(params.agentDir);
|
|
1296
|
-
ensureAuthStoreFile(authPath);
|
|
1297
|
-
return await withFileLock(authPath, AUTH_STORE_LOCK_OPTIONS, async () => {
|
|
1298
|
-
const store = ensureAuthProfileStore(params.agentDir);
|
|
1299
|
-
const cred = store.profiles[params.profileId];
|
|
1300
|
-
if (!cred || cred.type !== "oauth") return null;
|
|
1301
|
-
if (Date.now() < cred.expires) return {
|
|
1302
|
-
apiKey: buildOAuthApiKey(cred.provider, cred),
|
|
1303
|
-
newCredentials: cred
|
|
1304
|
-
};
|
|
1305
|
-
const oauthCreds = { [cred.provider]: cred };
|
|
1306
|
-
const result = String(cred.provider) === "chutes" ? await (async () => {
|
|
1307
|
-
const newCredentials = await refreshChutesTokens({ credential: cred });
|
|
1308
|
-
return {
|
|
1309
|
-
apiKey: newCredentials.access,
|
|
1310
|
-
newCredentials
|
|
1311
|
-
};
|
|
1312
|
-
})() : String(cred.provider) === "qwen-portal" ? await (async () => {
|
|
1313
|
-
const newCredentials = await refreshQwenPortalCredentials(cred);
|
|
1314
|
-
return {
|
|
1315
|
-
apiKey: newCredentials.access,
|
|
1316
|
-
newCredentials
|
|
1317
|
-
};
|
|
1318
|
-
})() : await (async () => {
|
|
1319
|
-
const oauthProvider = resolveOAuthProvider(cred.provider);
|
|
1320
|
-
if (!oauthProvider) return null;
|
|
1321
|
-
return await getOAuthApiKey(oauthProvider, oauthCreds);
|
|
1322
|
-
})();
|
|
1323
|
-
if (!result) return null;
|
|
1324
|
-
store.profiles[params.profileId] = {
|
|
1325
|
-
...cred,
|
|
1326
|
-
...result.newCredentials,
|
|
1327
|
-
type: "oauth"
|
|
1328
|
-
};
|
|
1329
|
-
saveAuthProfileStore(store, params.agentDir);
|
|
1330
|
-
return result;
|
|
1331
|
-
});
|
|
1332
|
-
}
|
|
1333
|
-
async function tryResolveOAuthProfile(params) {
|
|
1334
|
-
const { cfg, store, profileId } = params;
|
|
1335
|
-
const cred = store.profiles[profileId];
|
|
1336
|
-
if (!cred || cred.type !== "oauth") return null;
|
|
1337
|
-
const profileConfig = cfg?.auth?.profiles?.[profileId];
|
|
1338
|
-
if (profileConfig && profileConfig.provider !== cred.provider) return null;
|
|
1339
|
-
if (profileConfig && profileConfig.mode !== cred.type) return null;
|
|
1340
|
-
if (Date.now() < cred.expires) return {
|
|
1341
|
-
apiKey: buildOAuthApiKey(cred.provider, cred),
|
|
1342
|
-
provider: cred.provider,
|
|
1343
|
-
email: cred.email
|
|
1344
|
-
};
|
|
1345
|
-
const refreshed = await refreshOAuthTokenWithLock({
|
|
1346
|
-
profileId,
|
|
1347
|
-
agentDir: params.agentDir
|
|
1348
|
-
});
|
|
1349
|
-
if (!refreshed) return null;
|
|
1350
|
-
return {
|
|
1351
|
-
apiKey: refreshed.apiKey,
|
|
1352
|
-
provider: cred.provider,
|
|
1353
|
-
email: cred.email
|
|
1354
|
-
};
|
|
1355
|
-
}
|
|
1356
|
-
async function resolveApiKeyForProfile(params) {
|
|
1357
|
-
const { cfg, store, profileId } = params;
|
|
1358
|
-
const cred = store.profiles[profileId];
|
|
1359
|
-
if (!cred) return null;
|
|
1360
|
-
const profileConfig = cfg?.auth?.profiles?.[profileId];
|
|
1361
|
-
if (profileConfig && profileConfig.provider !== cred.provider) return null;
|
|
1362
|
-
if (profileConfig && profileConfig.mode !== cred.type) {
|
|
1363
|
-
if (!(profileConfig.mode === "oauth" && cred.type === "token")) return null;
|
|
1364
|
-
}
|
|
1365
|
-
if (cred.type === "api_key") {
|
|
1366
|
-
const key = cred.key?.trim();
|
|
1367
|
-
if (!key) return null;
|
|
1368
|
-
return {
|
|
1369
|
-
apiKey: key,
|
|
1370
|
-
provider: cred.provider,
|
|
1371
|
-
email: cred.email
|
|
1372
|
-
};
|
|
1373
|
-
}
|
|
1374
|
-
if (cred.type === "token") {
|
|
1375
|
-
const token = cred.token?.trim();
|
|
1376
|
-
if (!token) return null;
|
|
1377
|
-
if (typeof cred.expires === "number" && Number.isFinite(cred.expires) && cred.expires > 0 && Date.now() >= cred.expires) return null;
|
|
1378
|
-
return {
|
|
1379
|
-
apiKey: token,
|
|
1380
|
-
provider: cred.provider,
|
|
1381
|
-
email: cred.email
|
|
1382
|
-
};
|
|
1383
|
-
}
|
|
1384
|
-
if (Date.now() < cred.expires) return {
|
|
1385
|
-
apiKey: buildOAuthApiKey(cred.provider, cred),
|
|
1386
|
-
provider: cred.provider,
|
|
1387
|
-
email: cred.email
|
|
1388
|
-
};
|
|
1389
|
-
try {
|
|
1390
|
-
const result = await refreshOAuthTokenWithLock({
|
|
1391
|
-
profileId,
|
|
1392
|
-
agentDir: params.agentDir
|
|
1393
|
-
});
|
|
1394
|
-
if (!result) return null;
|
|
1395
|
-
return {
|
|
1396
|
-
apiKey: result.apiKey,
|
|
1397
|
-
provider: cred.provider,
|
|
1398
|
-
email: cred.email
|
|
1399
|
-
};
|
|
1400
|
-
} catch (error) {
|
|
1401
|
-
const refreshedStore = ensureAuthProfileStore(params.agentDir);
|
|
1402
|
-
const refreshed = refreshedStore.profiles[profileId];
|
|
1403
|
-
if (refreshed?.type === "oauth" && Date.now() < refreshed.expires) return {
|
|
1404
|
-
apiKey: buildOAuthApiKey(refreshed.provider, refreshed),
|
|
1405
|
-
provider: refreshed.provider,
|
|
1406
|
-
email: refreshed.email ?? cred.email
|
|
1407
|
-
};
|
|
1408
|
-
const fallbackProfileId = suggestOAuthProfileIdForLegacyDefault({
|
|
1409
|
-
cfg,
|
|
1410
|
-
store: refreshedStore,
|
|
1411
|
-
provider: cred.provider,
|
|
1412
|
-
legacyProfileId: profileId
|
|
1413
|
-
});
|
|
1414
|
-
if (fallbackProfileId && fallbackProfileId !== profileId) try {
|
|
1415
|
-
const fallbackResolved = await tryResolveOAuthProfile({
|
|
1416
|
-
cfg,
|
|
1417
|
-
store: refreshedStore,
|
|
1418
|
-
profileId: fallbackProfileId,
|
|
1419
|
-
agentDir: params.agentDir
|
|
1420
|
-
});
|
|
1421
|
-
if (fallbackResolved) return fallbackResolved;
|
|
1422
|
-
} catch {}
|
|
1423
|
-
if (params.agentDir) try {
|
|
1424
|
-
const mainCred = ensureAuthProfileStore(void 0).profiles[profileId];
|
|
1425
|
-
if (mainCred?.type === "oauth" && Date.now() < mainCred.expires) {
|
|
1426
|
-
refreshedStore.profiles[profileId] = { ...mainCred };
|
|
1427
|
-
saveAuthProfileStore(refreshedStore, params.agentDir);
|
|
1428
|
-
log$2.info("inherited fresh OAuth credentials from main agent", {
|
|
1429
|
-
profileId,
|
|
1430
|
-
agentDir: params.agentDir,
|
|
1431
|
-
expires: new Date(mainCred.expires).toISOString()
|
|
1432
|
-
});
|
|
1433
|
-
return {
|
|
1434
|
-
apiKey: buildOAuthApiKey(mainCred.provider, mainCred),
|
|
1435
|
-
provider: mainCred.provider,
|
|
1436
|
-
email: mainCred.email
|
|
1437
|
-
};
|
|
1438
|
-
}
|
|
1439
|
-
} catch {}
|
|
1440
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
1441
|
-
const hint = formatAuthDoctorHint({
|
|
1442
|
-
cfg,
|
|
1443
|
-
store: refreshedStore,
|
|
1444
|
-
provider: cred.provider,
|
|
1445
|
-
profileId
|
|
1446
|
-
});
|
|
1447
|
-
throw new Error(`OAuth token refresh failed for ${cred.provider}: ${message}. Please try again or re-authenticate.` + (hint ? `\n\n${hint}` : ""), { cause: error });
|
|
1448
|
-
}
|
|
1449
|
-
}
|
|
1450
|
-
|
|
1451
|
-
//#endregion
|
|
1452
|
-
//#region src/agents/auth-profiles/usage.ts
|
|
1453
|
-
function resolveProfileUnusableUntil$1(stats) {
|
|
1454
|
-
const values = [stats.cooldownUntil, stats.disabledUntil].filter((value) => typeof value === "number").filter((value) => Number.isFinite(value) && value > 0);
|
|
1455
|
-
if (values.length === 0) return null;
|
|
1456
|
-
return Math.max(...values);
|
|
1457
|
-
}
|
|
1458
|
-
/**
|
|
1459
|
-
* Check if a profile is currently in cooldown (due to rate limiting or errors).
|
|
1460
|
-
*/
|
|
1461
|
-
function isProfileInCooldown(store, profileId) {
|
|
1462
|
-
const stats = store.usageStats?.[profileId];
|
|
1463
|
-
if (!stats) return false;
|
|
1464
|
-
const unusableUntil = resolveProfileUnusableUntil$1(stats);
|
|
1465
|
-
return unusableUntil ? Date.now() < unusableUntil : false;
|
|
1466
|
-
}
|
|
1467
|
-
|
|
1468
|
-
//#endregion
|
|
1469
|
-
//#region src/agents/auth-profiles/order.ts
|
|
1470
|
-
function resolveProfileUnusableUntil(stats) {
|
|
1471
|
-
const values = [stats.cooldownUntil, stats.disabledUntil].filter((value) => typeof value === "number").filter((value) => Number.isFinite(value) && value > 0);
|
|
1472
|
-
if (values.length === 0) return null;
|
|
1473
|
-
return Math.max(...values);
|
|
1474
|
-
}
|
|
1475
|
-
function resolveAuthProfileOrder(params) {
|
|
1476
|
-
const { cfg, store, provider, preferredProfile } = params;
|
|
1477
|
-
const providerKey = normalizeProviderId(provider);
|
|
1478
|
-
const now = Date.now();
|
|
1479
|
-
const storedOrder = (() => {
|
|
1480
|
-
const order = store.order;
|
|
1481
|
-
if (!order) return;
|
|
1482
|
-
for (const [key, value] of Object.entries(order)) if (normalizeProviderId(key) === providerKey) return value;
|
|
1483
|
-
})();
|
|
1484
|
-
const configuredOrder = (() => {
|
|
1485
|
-
const order = cfg?.auth?.order;
|
|
1486
|
-
if (!order) return;
|
|
1487
|
-
for (const [key, value] of Object.entries(order)) if (normalizeProviderId(key) === providerKey) return value;
|
|
1488
|
-
})();
|
|
1489
|
-
const explicitOrder = storedOrder ?? configuredOrder;
|
|
1490
|
-
const explicitProfiles = cfg?.auth?.profiles ? Object.entries(cfg.auth.profiles).filter(([, profile]) => normalizeProviderId(profile.provider) === providerKey).map(([profileId]) => profileId) : [];
|
|
1491
|
-
const baseOrder = explicitOrder ?? (explicitProfiles.length > 0 ? explicitProfiles : listProfilesForProvider(store, providerKey));
|
|
1492
|
-
if (baseOrder.length === 0) return [];
|
|
1493
|
-
const filtered = baseOrder.filter((profileId) => {
|
|
1494
|
-
const cred = store.profiles[profileId];
|
|
1495
|
-
if (!cred) return false;
|
|
1496
|
-
if (normalizeProviderId(cred.provider) !== providerKey) return false;
|
|
1497
|
-
const profileConfig = cfg?.auth?.profiles?.[profileId];
|
|
1498
|
-
if (profileConfig) {
|
|
1499
|
-
if (normalizeProviderId(profileConfig.provider) !== providerKey) return false;
|
|
1500
|
-
if (profileConfig.mode !== cred.type) {
|
|
1501
|
-
if (!(profileConfig.mode === "oauth" && cred.type === "token")) return false;
|
|
1502
|
-
}
|
|
1503
|
-
}
|
|
1504
|
-
if (cred.type === "api_key") return Boolean(cred.key?.trim());
|
|
1505
|
-
if (cred.type === "token") {
|
|
1506
|
-
if (!cred.token?.trim()) return false;
|
|
1507
|
-
if (typeof cred.expires === "number" && Number.isFinite(cred.expires) && cred.expires > 0 && now >= cred.expires) return false;
|
|
1508
|
-
return true;
|
|
1509
|
-
}
|
|
1510
|
-
if (cred.type === "oauth") return Boolean(cred.access?.trim() || cred.refresh?.trim());
|
|
1511
|
-
return false;
|
|
1512
|
-
});
|
|
1513
|
-
const deduped = [];
|
|
1514
|
-
for (const entry of filtered) if (!deduped.includes(entry)) deduped.push(entry);
|
|
1515
|
-
if (explicitOrder && explicitOrder.length > 0) {
|
|
1516
|
-
const available = [];
|
|
1517
|
-
const inCooldown = [];
|
|
1518
|
-
for (const profileId of deduped) {
|
|
1519
|
-
const cooldownUntil = resolveProfileUnusableUntil(store.usageStats?.[profileId] ?? {}) ?? 0;
|
|
1520
|
-
if (typeof cooldownUntil === "number" && Number.isFinite(cooldownUntil) && cooldownUntil > 0 && now < cooldownUntil) inCooldown.push({
|
|
1521
|
-
profileId,
|
|
1522
|
-
cooldownUntil
|
|
1523
|
-
});
|
|
1524
|
-
else available.push(profileId);
|
|
1525
|
-
}
|
|
1526
|
-
const cooldownSorted = inCooldown.toSorted((a, b) => a.cooldownUntil - b.cooldownUntil).map((entry) => entry.profileId);
|
|
1527
|
-
const ordered = [...available, ...cooldownSorted];
|
|
1528
|
-
if (preferredProfile && ordered.includes(preferredProfile)) return [preferredProfile, ...ordered.filter((e) => e !== preferredProfile)];
|
|
1529
|
-
return ordered;
|
|
1530
|
-
}
|
|
1531
|
-
const sorted = orderProfilesByMode(deduped, store);
|
|
1532
|
-
if (preferredProfile && sorted.includes(preferredProfile)) return [preferredProfile, ...sorted.filter((e) => e !== preferredProfile)];
|
|
1533
|
-
return sorted;
|
|
1534
|
-
}
|
|
1535
|
-
function orderProfilesByMode(order, store) {
|
|
1536
|
-
const now = Date.now();
|
|
1537
|
-
const available = [];
|
|
1538
|
-
const inCooldown = [];
|
|
1539
|
-
for (const profileId of order) if (isProfileInCooldown(store, profileId)) inCooldown.push(profileId);
|
|
1540
|
-
else available.push(profileId);
|
|
1541
|
-
const sorted = available.map((profileId) => {
|
|
1542
|
-
const type = store.profiles[profileId]?.type;
|
|
1543
|
-
return {
|
|
1544
|
-
profileId,
|
|
1545
|
-
typeScore: type === "oauth" ? 0 : type === "token" ? 1 : type === "api_key" ? 2 : 3,
|
|
1546
|
-
lastUsed: store.usageStats?.[profileId]?.lastUsed ?? 0
|
|
1547
|
-
};
|
|
1548
|
-
}).toSorted((a, b) => {
|
|
1549
|
-
if (a.typeScore !== b.typeScore) return a.typeScore - b.typeScore;
|
|
1550
|
-
return a.lastUsed - b.lastUsed;
|
|
1551
|
-
}).map((entry) => entry.profileId);
|
|
1552
|
-
const cooldownSorted = inCooldown.map((profileId) => ({
|
|
1553
|
-
profileId,
|
|
1554
|
-
cooldownUntil: resolveProfileUnusableUntil(store.usageStats?.[profileId] ?? {}) ?? now
|
|
1555
|
-
})).toSorted((a, b) => a.cooldownUntil - b.cooldownUntil).map((entry) => entry.profileId);
|
|
1556
|
-
return [...sorted, ...cooldownSorted];
|
|
1557
|
-
}
|
|
1558
|
-
|
|
1559
|
-
//#endregion
|
|
1560
|
-
//#region src/agents/auth-profiles.ts
|
|
1561
|
-
var auth_profiles_exports = /* @__PURE__ */ __exportAll({ ensureAuthProfileStore: () => ensureAuthProfileStore });
|
|
1562
|
-
|
|
1563
|
-
//#endregion
|
|
1564
|
-
export { normalizeSecretInput as A, resolveAuthProfileDisplayLabel as B, resolveThinkingDefault as C, resolveApiKeyForProvider as D, requireApiKey as E, shouldEnableShellEnvFallback as F, isTruthyEnvValue as I, DEFAULT_CONTEXT_TOKENS as L, loadShellEnvFallback as M, resolveShellEnvFallbackTimeoutMs as N, resolveEnvApiKey as O, shouldDeferShellEnvFallback as P, DEFAULT_MODEL as R, resolveModelRefFromString as S, getCustomProviderApiKey as T, normalizeModelRef as _, listProfilesForProvider as a, resolveConfiguredModelRef as b, resolveAnimaAgentDir as c, withFileLock as d, buildAllowedModelSet as f, modelKey as g, isCliProvider as h, resolveApiKeyForProfile as i, getShellPathFromLoginShell as j, resolveModelAuthMode as k, loadJsonFile as l, buildModelAliasIndex as m, resolveAuthProfileOrder as n, ensureAuthProfileStore as o, buildConfiguredAllowlistKeys as p, isProfileInCooldown as r, resolveAuthStorePathForDisplay as s, auth_profiles_exports as t, saveJsonFile as u, normalizeProviderId as v, getApiKeyForModel as w, resolveDefaultModelForAgent as x, parseModelRef as y, DEFAULT_PROVIDER as z };
|