@cleocode/cleo 2026.10.3 → 2026.10.5-rc.ci.672
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 +7 -0
- package/bin/cleo.js +11 -1
- package/dist/cli/adapter-OUQRSFZL.js +159 -0
- package/dist/cli/add-4SRRJL4U.js +443 -0
- package/dist/cli/add-batch-TSWICA5J.js +164 -0
- package/dist/cli/admin-L3F6CDYH.js +1428 -0
- package/dist/cli/admin-YMU55YCU.js +341 -0
- package/dist/cli/adr-XESRMFMP.js +172 -0
- package/dist/cli/agent-TAFPIYUU.js +2404 -0
- package/dist/cli/agent-outputs-HVJJIPS4.js +84 -0
- package/dist/cli/analyze-YQ22QVGW.js +49 -0
- package/dist/cli/archive-W5XX6AH7.js +65 -0
- package/dist/cli/archive-stats-HP2KPAJU.js +101 -0
- package/dist/cli/attention-7JBDCRZX.js +124 -0
- package/dist/cli/attention-ZXZANHKC.js +168 -0
- package/dist/cli/audit-ICA2SEFN.js +122 -0
- package/dist/cli/auth-DXIG5OG7.js +491 -0
- package/dist/cli/backfill-LBSYBWLR.js +156 -0
- package/dist/cli/backup-NUGBZ7NA.js +588 -0
- package/dist/cli/backup-inspect-PDRXI45A.js +26 -0
- package/dist/cli/backup-recover-TVKAPERB.js +29 -0
- package/dist/cli/blockers-ZOPCGHDW.js +55 -0
- package/dist/cli/brain-EJOBKL4A.js +397 -0
- package/dist/cli/briefing-RDQJ6WHS.js +213 -0
- package/dist/cli/caamp-Z3XPKEHB.js +181 -0
- package/dist/cli/cancel-S7EHLCJN.js +85 -0
- package/dist/cli/canon-NPF5RODM.js +142 -0
- package/dist/cli/canon-docs-2GTOLF7Y.js +26 -0
- package/dist/cli/cant-CHNN6O57.js +239 -0
- package/dist/cli/changeset-RYPHPN2B.js +246 -0
- package/dist/cli/check-C67YAU7W.js +759 -0
- package/dist/cli/check-DHMURGHC.js +924 -0
- package/dist/cli/checkpoint-UWDFOGYQ.js +128 -0
- package/dist/cli/chunk-22YPFZYB.js +91 -0
- package/dist/cli/chunk-2MGFDMDF.js +272 -0
- package/dist/cli/chunk-47JYZAMS.js +30 -0
- package/dist/cli/chunk-4JYHPP4C.js +76 -0
- package/dist/cli/chunk-4PEODTHY.js +278 -0
- package/dist/cli/chunk-4RGSNUUP.js +950 -0
- package/dist/cli/chunk-4VASFLUW.js +35 -0
- package/dist/cli/chunk-5PNI276X.js +124 -0
- package/dist/cli/chunk-6JSJNYH2.js +114 -0
- package/dist/cli/chunk-6N6WGLXE.js +63 -0
- package/dist/cli/chunk-75UH3BLS.js +210 -0
- package/dist/cli/chunk-7ACK4EIN.js +92 -0
- package/dist/cli/chunk-7NMKLVMI.js +107 -0
- package/dist/cli/chunk-7SINJXB6.js +110 -0
- package/dist/cli/chunk-7UARFJYS.js +46 -0
- package/dist/cli/chunk-7ZYPQV4N.js +90 -0
- package/dist/cli/chunk-AQCYT3L4.js +72 -0
- package/dist/cli/chunk-BQK6XTOH.js +57 -0
- package/dist/cli/chunk-C3B7C43W.js +16 -0
- package/dist/cli/chunk-CAPAGD5E.js +98 -0
- package/dist/cli/chunk-CHGEDCKG.js +77 -0
- package/dist/cli/chunk-COXFJ3PT.js +74 -0
- package/dist/cli/chunk-D7BAQNV2.js +55 -0
- package/dist/cli/chunk-EIUXVHNF.js +258 -0
- package/dist/cli/chunk-EUGB6P5V.js +173 -0
- package/dist/cli/chunk-EW2CKNNZ.js +304 -0
- package/dist/cli/chunk-FSKN4DWC.js +108 -0
- package/dist/cli/chunk-FVKLULL7.js +48 -0
- package/dist/cli/chunk-GAGUBU4Z.js +280 -0
- package/dist/cli/chunk-GKRFH2YG.js +171 -0
- package/dist/cli/chunk-GRU74UE4.js +270 -0
- package/dist/cli/chunk-GZFVDR44.js +320 -0
- package/dist/cli/chunk-HFLLZE6A.js +83 -0
- package/dist/cli/chunk-HXRXT3XU.js +78 -0
- package/dist/cli/chunk-IIOGUY3B.js +258 -0
- package/dist/cli/chunk-ILWWL462.js +60 -0
- package/dist/cli/chunk-J5USPJKZ.js +48 -0
- package/dist/cli/chunk-KEQS36GD.js +88 -0
- package/dist/cli/chunk-L7ONYSV6.js +2497 -0
- package/dist/cli/chunk-LVGIFMCV.js +163 -0
- package/dist/cli/chunk-NEFMQYLE.js +656 -0
- package/dist/cli/chunk-NU6CQQVB.js +4501 -0
- package/dist/cli/chunk-OILHT47L.js +252 -0
- package/dist/cli/chunk-PKKZPOOP.js +352 -0
- package/dist/cli/chunk-PN4WW5VX.js +66 -0
- package/dist/cli/chunk-PSJ33WVO.js +56 -0
- package/dist/cli/chunk-QA6T2LQ5.js +71 -0
- package/dist/cli/chunk-QJJWWCIC.js +288 -0
- package/dist/cli/chunk-QKMBWYAS.js +93 -0
- package/dist/cli/chunk-QWNKLLLG.js +84 -0
- package/dist/cli/chunk-QWUFFDL3.js +85 -0
- package/dist/cli/chunk-QY76BRUZ.js +35 -0
- package/dist/cli/chunk-R45KVF5Y.js +117 -0
- package/dist/cli/chunk-RRKP7HLU.js +66 -0
- package/dist/cli/chunk-SXXOC6KZ.js +209 -0
- package/dist/cli/chunk-T6GZJYL3.js +108 -0
- package/dist/cli/chunk-TLQ37HRE.js +67 -0
- package/dist/cli/chunk-TPTNEJZJ.js +52 -0
- package/dist/cli/chunk-TYC7G5LF.js +100 -0
- package/dist/cli/chunk-UWCZY52R.js +766 -0
- package/dist/cli/chunk-VB3LDPL5.js +46 -0
- package/dist/cli/chunk-VLEYOOPH.js +31 -0
- package/dist/cli/chunk-W3JLYKKY.js +140 -0
- package/dist/cli/chunk-WWCYZYSN.js +56 -0
- package/dist/cli/chunk-XA5WISNV.js +52 -0
- package/dist/cli/chunk-XHRZ7OYZ.js +132 -0
- package/dist/cli/chunk-XLPMIGJJ.js +148 -0
- package/dist/cli/chunk-YY66LFZF.js +29 -0
- package/dist/cli/chunk-ZMGDZMSJ.js +210 -0
- package/dist/cli/claim-IGOG2QOC.js +97 -0
- package/dist/cli/classify-MG4N7GMQ.js +117 -0
- package/dist/cli/cli-A23Q335V.js +51 -0
- package/dist/cli/cloud-SILYJVKO.js +731 -0
- package/dist/cli/cockpit-RZKLGYPN.js +790 -0
- package/dist/cli/code-H2FQCVMW.js +178 -0
- package/dist/cli/complete-JLX7NBI4.js +35 -0
- package/dist/cli/complexity-OKV7PVZH.js +57 -0
- package/dist/cli/compliance-QMGZHJNQ.js +277 -0
- package/dist/cli/conduit-4H32UYEA.js +308 -0
- package/dist/cli/conduit-EY54WTZA.js +535 -0
- package/dist/cli/config-TDYOC7XO.js +519 -0
- package/dist/cli/consensus-4XCOFPPT.js +122 -0
- package/dist/cli/context-FN4YTGHD.js +142 -0
- package/dist/cli/contribution-7RWFBJLC.js +112 -0
- package/dist/cli/curator-HKZJCVRL.js +139 -0
- package/dist/cli/current-B2NU7V3G.js +43 -0
- package/dist/cli/daemon-GBD4TVCD.js +452 -0
- package/dist/cli/dash-IGDANIE5.js +71 -0
- package/dist/cli/decide-26SXC2V6.js +416 -0
- package/dist/cli/decompose-LQ76TEZG.js +78 -0
- package/dist/cli/decomposition-WFRWNUSJ.js +122 -0
- package/dist/cli/delete-T5DUQHOX.js +69 -0
- package/dist/cli/deps-UTPZJBXL.js +462 -0
- package/dist/cli/detect-FFZSMVDT.js +46 -0
- package/dist/cli/detect-drift-TVCJOFYJ.js +408 -0
- package/dist/cli/diagnostics-GN5CVD3N.js +93 -0
- package/dist/cli/diagnostics-ZNBKH6GX.js +133 -0
- package/dist/cli/docs-CLQKEEUK.js +1710 -0
- package/dist/cli/docs-DPPDFTWR.js +3098 -0
- package/dist/cli/doctor-GPENOP4N.js +1270 -0
- package/dist/cli/doctor-ac-bindings-S3IOEFP4.js +26 -0
- package/dist/cli/doctor-acceptance-drift-VNFKPBSQ.js +26 -0
- package/dist/cli/doctor-credentials-A5H4JMTF.js +26 -0
- package/dist/cli/doctor-db-substrate-FGCISE4Z.js +27 -0
- package/dist/cli/doctor-dep-cycles-BKKKHHYG.js +26 -0
- package/dist/cli/doctor-exodus-ND2DH2KP.js +26 -0
- package/dist/cli/doctor-exodus-residue-4EMRYMEQ.js +26 -0
- package/dist/cli/doctor-fk-check-VY3RIQV3.js +26 -0
- package/dist/cli/doctor-global-delivery-JN6IGHUL.js +26 -0
- package/dist/cli/doctor-heavy-command-hook-XSN44WXU.js +26 -0
- package/dist/cli/doctor-legacy-backups-QAG5NHYP.js +26 -0
- package/dist/cli/doctor-legacy-reaper-CIRGFE6R.js +26 -0
- package/dist/cli/doctor-malformed-ids-WL7HT4TB.js +26 -0
- package/dist/cli/doctor-manifest-rows-SMQCKJ2T.js +26 -0
- package/dist/cli/doctor-memory-guard-LJDOJG76.js +26 -0
- package/dist/cli/doctor-migrations-ETQPFNUP.js +26 -0
- package/dist/cli/doctor-nexus-residency-A4JMKBEJ.js +26 -0
- package/dist/cli/doctor-project-identity-FFQJ5LNX.js +26 -0
- package/dist/cli/doctor-projects-MFUTKRHP.js +30 -0
- package/dist/cli/doctor-projects-registry-76X6VTGM.js +26 -0
- package/dist/cli/doctor-release-readiness-QJCOPFTK.js +26 -0
- package/dist/cli/doctor-repair-AU76FIKY.js +26 -0
- package/dist/cli/doctor-row-identity-KW6JYZQE.js +26 -0
- package/dist/cli/doctor-skill-fixtures-G3T7JUHS.js +26 -0
- package/dist/cli/doctor-split-brain-FUW6L7FS.js +26 -0
- package/dist/cli/doctor-superseded-store-DUHGSBLC.js +26 -0
- package/dist/cli/doctor-sync-journal-SXMUIKF7.js +26 -0
- package/dist/cli/doctor-sync-triggers-6WNJZFRM.js +26 -0
- package/dist/cli/doctor-tool-locks-66LSLUBN.js +26 -0
- package/dist/cli/doctor-twin-collapse-AYBYBFC4.js +26 -0
- package/dist/cli/doctor-worktree-stores-C5XEH5OG.js +26 -0
- package/dist/cli/done-R64XRZ32.js +196 -0
- package/dist/cli/dynamic-RR4HB7BB.js +29 -0
- package/dist/cli/entities-3JIHDIOK.js +361 -0
- package/dist/cli/event-45KEWV5H.js +372 -0
- package/dist/cli/exists-BEDZS5RI.js +65 -0
- package/dist/cli/exodus-DUX62344.js +401 -0
- package/dist/cli/export-C5PQIQ5O.js +93 -0
- package/dist/cli/export-tasks-CUXDZPJB.js +97 -0
- package/dist/cli/federation-ESM35EGG.js +145 -0
- package/dist/cli/find-5EUZHHQJ.js +178 -0
- package/dist/cli/focus-6AH4KLRO.js +368 -0
- package/dist/cli/focus-ANKAIRO5.js +56 -0
- package/dist/cli/gateway-2GW2KTK3.js +77 -0
- package/dist/cli/gateway-auto-start-EDK7XI6E.js +36 -0
- package/dist/cli/gc-CTOQLUSA.js +291 -0
- package/dist/cli/go-YJPNHHYT.js +206 -0
- package/dist/cli/goal-4GW4G77D.js +213 -0
- package/dist/cli/grade-25WSZH4X.js +57 -0
- package/dist/cli/graph-JUO3TMF3.js +879 -0
- package/dist/cli/history-NACNUQTC.js +138 -0
- package/dist/cli/hook-UF7J7R6D.js +57 -0
- package/dist/cli/hook-entry.js +244 -19
- package/dist/cli/hygiene-3QZ2NI7P.js +55 -0
- package/dist/cli/import-7ESGL5SS.js +89 -0
- package/dist/cli/import-tasks-FLE2RPBR.js +109 -0
- package/dist/cli/index.js +601 -94637
- package/dist/cli/init-AN4DZ2XO.js +40 -0
- package/dist/cli/inject-HQWA5GWY.js +83 -0
- package/dist/cli/install-global-YQV4W5OG.js +95 -0
- package/dist/cli/intelligence-OFFNQGHE.js +238 -0
- package/dist/cli/intelligence-QIC4SN4X.js +182 -0
- package/dist/cli/issue-P5RNMRDG.js +159 -0
- package/dist/cli/janitor-ZNCFQ7E3.js +111 -0
- package/dist/cli/labels-ORBM3T57.js +88 -0
- package/dist/cli/lifecycle-MHR22TVI.js +273 -0
- package/dist/cli/list-LB6GCYYU.js +109 -0
- package/dist/cli/llm-H7LZWQKX.js +130 -0
- package/dist/cli/llm-OTJWPMGI.js +704 -0
- package/dist/cli/llm-cost-MLMXEAR4.js +25 -0
- package/dist/cli/llm-stream-AAEUNKRP.js +27 -0
- package/dist/cli/log-W2A5M2NA.js +76 -0
- package/dist/cli/login-SIXFFZSP.js +45 -0
- package/dist/cli/logout-G3KVLQQM.js +74 -0
- package/dist/cli/manifest-G4T6EBSI.js +354 -0
- package/dist/cli/map-VU5M72TK.js +53 -0
- package/dist/cli/memory-2E27G2G5.js +1952 -0
- package/dist/cli/memory-IAEYKXG6.js +1895 -0
- package/dist/cli/migrate-agents-v2-A52QIYNJ.js +33 -0
- package/dist/cli/migrate-claude-mem-TPDW3R4Z.js +206 -0
- package/dist/cli/next-SVH4LIDY.js +57 -0
- package/dist/cli/nexus-FPQV2EAF.js +1059 -0
- package/dist/cli/nexus-XSFXN5E6.js +2924 -0
- package/dist/cli/ops-K6LHY5J6.js +52 -0
- package/dist/cli/orchestrate-CZ2J6W3L.js +1650 -0
- package/dist/cli/orchestrate-HURUCQFT.js +950 -0
- package/dist/cli/otel-JCNPVJLZ.js +188 -0
- package/dist/cli/phase-VDFRASSO.js +221 -0
- package/dist/cli/pipeline-TCZPOEDR.js +697 -0
- package/dist/cli/pivot-V5MSQZ7L.js +88 -0
- package/dist/cli/plan-SQUGCKSM.js +49 -0
- package/dist/cli/playbook-L47GLDQD.js +230 -0
- package/dist/cli/playbook-NJVO4R6P.js +33 -0
- package/dist/cli/project-YZEC7GYF.js +331 -0
- package/dist/cli/promote-FINF4HVK.js +53 -0
- package/dist/cli/provenance-3TUWVBFR.js +141 -0
- package/dist/cli/provenance-YZG33JGM.js +129 -0
- package/dist/cli/provider-23JVLLG3.js +213 -0
- package/dist/cli/reason-FHN54O7O.js +138 -0
- package/dist/cli/reconcile-MOM5T4AX.js +128 -0
- package/dist/cli/refresh-memory-3OSTRAVK.js +45 -0
- package/dist/cli/relates-6FWUFUS2.js +260 -0
- package/dist/cli/release-G2DPSG5M.js +347 -0
- package/dist/cli/release-URX6JHZ2.js +525 -0
- package/dist/cli/remote-VIULU2T5.js +279 -0
- package/dist/cli/renderers-TGSW77J4.js +37 -0
- package/dist/cli/reorder-UIPN6TQY.js +87 -0
- package/dist/cli/reparent-ALOWWUIU.js +59 -0
- package/dist/cli/req-RH2Y3H7A.js +130 -0
- package/dist/cli/research-G2Y72HRC.js +366 -0
- package/dist/cli/restore-VBR5XNML.js +470 -0
- package/dist/cli/revert-32LDNSGP.js +240 -0
- package/dist/cli/roadmap-LFU3AG7D.js +62 -0
- package/dist/cli/run-HXRILSR7.js +245 -0
- package/dist/cli/safestop-Z5UC7NGQ.js +89 -0
- package/dist/cli/saga-Y6FZS6AM.js +286 -0
- package/dist/cli/schema-OOOKLWUE.js +195 -0
- package/dist/cli/self-update-26SOTJMH.js +504 -0
- package/dist/cli/selfimprove-4SMOCLUV.js +89 -0
- package/dist/cli/selfimprove-EB4RQLP4.js +139 -0
- package/dist/cli/sentient-QPETVE53.js +254 -0
- package/dist/cli/sentient-RGMWR4XJ.js +1088 -0
- package/dist/cli/sequence-H7DSAJPF.js +94 -0
- package/dist/cli/service-EK5MGB2D.js +156 -0
- package/dist/cli/service-GLOMZWPQ.js +437 -0
- package/dist/cli/session-HYUXAQGC.js +708 -0
- package/dist/cli/session-N5ISU56W.js +568 -0
- package/dist/cli/setup-L3YYV53D.js +323 -0
- package/dist/cli/show-364V3KY2.js +123 -0
- package/dist/cli/skill-F2KR6HW5.js +84 -0
- package/dist/cli/skills-FS3DCP6E.js +929 -0
- package/dist/cli/smoke-provider-SKUFMZXU.js +218 -0
- package/dist/cli/snapshot-EGXEQ5PR.js +120 -0
- package/dist/cli/src-LYLXHXHH.js +80 -0
- package/dist/cli/start-6DXOCCKL.js +68 -0
- package/dist/cli/stats-UVUQEGYC.js +96 -0
- package/dist/cli/status-XLKYLN42.js +157 -0
- package/dist/cli/sticky-VSTQ2I2O.js +264 -0
- package/dist/cli/sticky-XZXZDCFW.js +339 -0
- package/dist/cli/stop-VNOAFWNB.js +43 -0
- package/dist/cli/sync-YYPARW3A.js +155 -0
- package/dist/cli/tasks-C24KHTFF.js +1118 -0
- package/dist/cli/tasks-LBJC7CZV.js +175 -0
- package/dist/cli/telemetry-CU7W5WAY.js +120 -0
- package/dist/cli/templates-G42JBUY4.js +609 -0
- package/dist/cli/testing-HSRITHEY.js +147 -0
- package/dist/cli/token-J74E7TSU.js +221 -0
- package/dist/cli/tools-BI74W7VE.js +652 -0
- package/dist/cli/transcript-RGK7RSGQ.js +440 -0
- package/dist/cli/tui-BPUFHYKK.js +51 -0
- package/dist/cli/update-2KQWA27S.js +478 -0
- package/dist/cli/update-check-entry.js +124 -0
- package/dist/cli/update-notice-6SQ6WPQG.js +68 -0
- package/dist/cli/upgrade-E2MJAPC7.js +136 -0
- package/dist/cli/upgrade-XRSQ4RWH.js +243 -0
- package/dist/cli/verify-WASRGDBA.js +191 -0
- package/dist/cli/web-NJ3P67EU.js +275 -0
- package/dist/cli/workgraph-OHJ2VKJD.js +232 -0
- package/dist/cli/worktree-FVQLORFY.js +371 -0
- package/dist/cli/worktree-ZJ6JTQNG.js +287 -0
- package/package.json +13 -13
- package/studio-dist/client/_app/immutable/chunks/{DMj27Pxj.js → AH7dIemv.js} +1 -1
- package/studio-dist/client/_app/immutable/chunks/{Dc2owyvE.js → BDgH40i3.js} +1 -1
- package/studio-dist/client/_app/immutable/chunks/BXDCSJ7U.js +1 -0
- package/studio-dist/client/_app/immutable/chunks/{qq3pe1aT.js → Gg4iYl59.js} +1 -1
- package/studio-dist/client/_app/immutable/entry/{app.CHWXLeE9.js → app.DUDNK-37.js} +2 -2
- package/studio-dist/client/_app/immutable/entry/start.DNmZ0pA4.js +1 -0
- package/studio-dist/client/_app/immutable/nodes/{0.DmKQGvFh.js → 0.DWqP3ail.js} +1 -1
- package/studio-dist/client/_app/immutable/nodes/{1.DqJk_REO.js → 1.CZGVUP5B.js} +1 -1
- package/studio-dist/client/_app/immutable/nodes/{15.GUy6kdW1.js → 15.DGaflZRS.js} +1 -1
- package/studio-dist/client/_app/immutable/nodes/{16.CcnKZ8f9.js → 16.uYlarGXl.js} +1 -1
- package/studio-dist/client/_app/immutable/nodes/{17.DAlQF3lQ.js → 17.CZMR0E47.js} +1 -1
- package/studio-dist/client/_app/immutable/nodes/{18.vQFr-vFj.js → 18.CBC-AKH_.js} +1 -1
- package/studio-dist/client/_app/immutable/nodes/{20.GVOj5j_r.js → 20.BGi43MvQ.js} +1 -1
- package/studio-dist/client/_app/immutable/nodes/{24.2-wC6DOh.js → 24.Dv8ftCyR.js} +1 -1
- package/studio-dist/client/_app/immutable/nodes/25.DQPVlTDQ.js +39 -0
- package/studio-dist/client/_app/immutable/nodes/{26.C3rNqzZF.js → 26.Cl800304.js} +1 -1
- package/studio-dist/client/_app/immutable/nodes/{3.b-7pzc3M.js → 3.D_fQKj9f.js} +1 -1
- package/studio-dist/client/_app/version.json +1 -1
- package/studio-dist/server/chunks/{0-BaCce-O1.js → 0-BpOagOst.js} +3 -3
- package/studio-dist/server/chunks/1-D0oRGR-C.js +9 -0
- package/studio-dist/server/chunks/{15-DRMOSIC9.js → 15-BcjHz7Tv.js} +3 -3
- package/studio-dist/server/chunks/{16-BulXhoZZ.js → 16-CXm8TUk7.js} +3 -3
- package/studio-dist/server/chunks/{17-DUEOCM0H.js → 17-mSgUK-cp.js} +3 -3
- package/studio-dist/server/chunks/{18-DP7Q8zPs.js → 18-BtfnIw1d.js} +3 -3
- package/studio-dist/server/chunks/{20-9ta6MI7q.js → 20-By1e4QDS.js} +3 -3
- package/studio-dist/server/chunks/{24-DysdL1ab.js → 24-0i2YLVxG.js} +3 -3
- package/studio-dist/server/chunks/{dist-CdoCt9zT.js → 25-DPsrqbrh.js} +797 -10736
- package/studio-dist/server/chunks/{26-Df4YXgg0.js → 26-P0XkOibm.js} +3 -3
- package/studio-dist/server/chunks/{3-BEhOhYpL.js → 3-WudjUK7e.js} +3 -3
- package/studio-dist/server/chunks/{_layout.svelte-CnLcXYG-.js → _layout.svelte-D9m81Rle.js} +4 -4
- package/studio-dist/server/chunks/{_page.svelte-DGhXqeRc.js → _page.svelte-2PDLOF83.js} +3 -3
- package/studio-dist/server/chunks/{_page.svelte-Dv8tmDEC.js → _page.svelte-BjE3jm2K.js} +3 -3
- package/studio-dist/server/chunks/{_page.svelte-C0qgUvzA.js → _page.svelte-Clc0vmiZ.js} +4 -4
- package/studio-dist/server/chunks/{_page.svelte-ui7LnWkL.js → _page.svelte-DABdRT3h.js} +3 -3
- package/studio-dist/server/chunks/{_page.svelte-HUqTICJR.js → _page.svelte-DG3PjiHj.js} +3 -3
- package/studio-dist/server/chunks/{_page.svelte-DzcZljiy.js → _page.svelte-Edy9CaE8.js} +20 -7
- package/studio-dist/server/chunks/{_page.svelte-DOl0DGOO.js → _page.svelte-Hrf3-ZR8.js} +3 -3
- package/studio-dist/server/chunks/{_page.svelte-Da4q5l93.js → _page.svelte-VB4O4Nl5.js} +3 -3
- package/studio-dist/server/chunks/{_page.svelte-CbyEPj2j.js → _page.svelte-d3jEgjsI.js} +3 -3
- package/studio-dist/server/chunks/{_server.ts-P4wVVksg.js → _server.ts-BcRFsyo3.js} +4 -5
- package/studio-dist/server/chunks/{_server.ts-Cr57EKWf.js → _server.ts-CEWpIFrj.js} +6 -5
- package/studio-dist/server/chunks/{_server.ts-CnKVmf_s.js → _server.ts-CLVdVIF9.js} +2 -2
- package/studio-dist/server/chunks/{_server.ts-C0evMKCk.js → _server.ts-D_j7aSy5.js} +6 -5
- package/studio-dist/server/chunks/{_server.ts-2BazvYRP.js → _server.ts-QEZF8h2q.js} +4 -5
- package/studio-dist/server/chunks/{client-CPM4LrO2.js → client-Kp1dP1od.js} +2 -2
- package/studio-dist/server/chunks/{error.svelte-ShcZo43D.js → error.svelte-WOCioJVX.js} +3 -3
- package/studio-dist/server/chunks/{hooks.server-D2qbf3Zp.js → hooks.server-DH9zkIrJ.js} +3 -1
- package/studio-dist/server/chunks/{http-BiQjEmVU.js → http-DT5kxaWk.js} +5 -4
- package/studio-dist/server/chunks/{internal-Cgsrya1j.js → internal-z0vqd5_u.js} +3 -3
- package/studio-dist/server/chunks/operations-registry-DdzmYzqX.js +10584 -0
- package/studio-dist/server/chunks/{stores-BGrpEDMK.js → stores-s2kaL315.js} +2 -2
- package/studio-dist/server/index.js +1 -1
- package/studio-dist/server/manifest.js +17 -17
- package/studio-dist/client/_app/immutable/chunks/Bw6J8NDM.js +0 -1
- package/studio-dist/client/_app/immutable/entry/start.C9bwPpvc.js +0 -1
- package/studio-dist/client/_app/immutable/nodes/25.D1vYaH8g.js +0 -39
- package/studio-dist/server/chunks/1-CVo7Nk6d.js +0 -9
- package/studio-dist/server/chunks/25-CYsps38R.js +0 -366
|
@@ -0,0 +1,766 @@
|
|
|
1
|
+
(() => {
|
|
2
|
+
const _installed = Symbol.for('cleocode.cli.sqliteWarningFilter');
|
|
3
|
+
if (globalThis[_installed]) return;
|
|
4
|
+
globalThis[_installed] = true;
|
|
5
|
+
const _origEmitWarning = process.emitWarning;
|
|
6
|
+
process.emitWarning = function(warning, type, code, ctor) {
|
|
7
|
+
if (typeof warning === 'object' && warning.name === 'ExperimentalWarning' && typeof warning.message === 'string' && /SQLite is an experimental feature/i.test(warning.message)) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (typeof warning === 'string' && /SQLite is an experimental feature/i.test(warning)) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
return _origEmitWarning.call(process, warning, type, code, ctor);
|
|
14
|
+
};
|
|
15
|
+
})();
|
|
16
|
+
import {
|
|
17
|
+
ReadlineWizardIO
|
|
18
|
+
} from "./chunk-GZFVDR44.js";
|
|
19
|
+
import {
|
|
20
|
+
NEXUS_API_URL_ARG,
|
|
21
|
+
emitNexusResult,
|
|
22
|
+
failNexus,
|
|
23
|
+
nexusLoginSummary,
|
|
24
|
+
runNexusLogin,
|
|
25
|
+
terminalSafe,
|
|
26
|
+
writeDeviceCodeApproved,
|
|
27
|
+
writeDeviceCodeInterrupted,
|
|
28
|
+
writeDeviceCodePending,
|
|
29
|
+
writeDeviceCodePrompt
|
|
30
|
+
} from "./chunk-GRU74UE4.js";
|
|
31
|
+
import {
|
|
32
|
+
defineCommand
|
|
33
|
+
} from "./chunk-PKKZPOOP.js";
|
|
34
|
+
import {
|
|
35
|
+
cliError,
|
|
36
|
+
cliOutput,
|
|
37
|
+
humanLine,
|
|
38
|
+
isHumanOutput
|
|
39
|
+
} from "./chunk-4RGSNUUP.js";
|
|
40
|
+
|
|
41
|
+
// packages/cleo/src/cli/commands/login.ts
|
|
42
|
+
import { WHOAMI_ROLE_IDS } from "@cleocode/contracts/llm/system-of-use.js";
|
|
43
|
+
import { NEXUS_LOGIN_TARGET } from "@cleocode/contracts/nexus-account.js";
|
|
44
|
+
|
|
45
|
+
// packages/cleo/src/cli/lib/nexus-first-run-cli.ts
|
|
46
|
+
var STEP_LINES = {
|
|
47
|
+
link: "Linking this project to Cleo Nexus...",
|
|
48
|
+
backup: "Backing it up (encrypted)...",
|
|
49
|
+
restore: "Restoring its backup from Cleo Nexus...",
|
|
50
|
+
projects: "Looking up your Cleo Nexus projects..."
|
|
51
|
+
};
|
|
52
|
+
function consentOf(args, env = process.env, tty = process.stdin.isTTY === true && process.stderr.isTTY === true) {
|
|
53
|
+
if (args["yes"] === true) return "yes";
|
|
54
|
+
const ci = (env["CI"] ?? "") !== "" && env["CI"] !== "false";
|
|
55
|
+
if (ci) return "never";
|
|
56
|
+
return tty ? "prompt" : "unattended";
|
|
57
|
+
}
|
|
58
|
+
async function runNexusFirstRunCli(args, login) {
|
|
59
|
+
const { nexusFirstRunResult, runNexusFirstRun } = await import(
|
|
60
|
+
/* webpackIgnore: true */
|
|
61
|
+
"@cleocode/core/cloud/nexus-first-run.js"
|
|
62
|
+
);
|
|
63
|
+
const consent = consentOf(args);
|
|
64
|
+
const io = consent === "prompt" ? new ReadlineWizardIO(process.stdin, process.stderr) : null;
|
|
65
|
+
try {
|
|
66
|
+
return await runNexusFirstRun({
|
|
67
|
+
apiUrl: login.apiUrl,
|
|
68
|
+
consent,
|
|
69
|
+
...io ? {
|
|
70
|
+
confirm: (question, defaultYes) => io.confirm(question, defaultYes)
|
|
71
|
+
} : {},
|
|
72
|
+
deviceId: login.device?.deviceId ?? null,
|
|
73
|
+
readOnly: args["read-only"] === true,
|
|
74
|
+
onStep: (step) => process.stderr.write(`${STEP_LINES[step]}
|
|
75
|
+
`)
|
|
76
|
+
});
|
|
77
|
+
} catch (err) {
|
|
78
|
+
return nexusFirstRunResult("skipped", {
|
|
79
|
+
reason: "the guided first run failed",
|
|
80
|
+
warnings: [
|
|
81
|
+
{
|
|
82
|
+
code: "W_NEXUS_FIRST_RUN_FAILED",
|
|
83
|
+
message: err instanceof Error ? err.message : String(err)
|
|
84
|
+
}
|
|
85
|
+
]
|
|
86
|
+
});
|
|
87
|
+
} finally {
|
|
88
|
+
io?.close();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function projectLine(p) {
|
|
92
|
+
const where = p.onThisDevice ? "already on this machine" : p.hasBackup === false ? "no backup yet" : p.lastSyncAt ? `last sync ${p.lastSyncAt}` : "backed up";
|
|
93
|
+
const command = p.restoreByNameCommand ?? p.restoreCommand;
|
|
94
|
+
return ` ${p.name} (${where})${command ? `: ${command}` : ""}`;
|
|
95
|
+
}
|
|
96
|
+
function projectsBlock(r) {
|
|
97
|
+
if (r.projects.length === 0) {
|
|
98
|
+
return r.warnings.length > 0 ? " Your Cleo Nexus projects could not be listed (see warnings)." : " This account has no Cleo Nexus projects yet: run `cleo login nexus` inside a CLEO project to link and back it up.";
|
|
99
|
+
}
|
|
100
|
+
return [
|
|
101
|
+
" Your Cleo Nexus projects (run a restore inside the folder it belongs in, e.g. a clone of its repository):",
|
|
102
|
+
...r.projects.map(projectLine)
|
|
103
|
+
].join("\n");
|
|
104
|
+
}
|
|
105
|
+
function nexusFirstRunSummary(login, r) {
|
|
106
|
+
const signedIn = nexusLoginSummary(login);
|
|
107
|
+
const name = r.link?.label ? `"${r.link.label}"` : "this project";
|
|
108
|
+
switch (r.state) {
|
|
109
|
+
case "backed-up": {
|
|
110
|
+
const snap = r.backup?.snapshot;
|
|
111
|
+
const what = r.backup?.status === "up-to-date" ? `the cloud already holds this state (snapshot ${snap?.checkpointId ?? "none"})` : `snapshot ${snap?.checkpointId ?? "unknown"}, ${snap?.rows ?? 0} rows`;
|
|
112
|
+
return `Signed in, linked, backed up. ${signedIn} Project ${name} is linked and backed up (${what}).`;
|
|
113
|
+
}
|
|
114
|
+
case "restored": {
|
|
115
|
+
const what = r.restore?.status === "up-to-date" ? "this copy already held its newest backup" : `snapshot ${r.restore?.snapshot?.checkpointId ?? "unknown"}, ${r.restore?.tables ?? 0} tables verified${r.restore?.safetyBackup ? `; the previous state is saved at ${r.restore.safetyBackup}` : ""}`;
|
|
116
|
+
return `Signed in, restored, linked. ${signedIn} Project ${name} was restored from Cleo Nexus (${what}).`;
|
|
117
|
+
}
|
|
118
|
+
case "restore-failed":
|
|
119
|
+
return r.choices.length > 0 ? `${signedIn} This copy has rows it never synced, so the backup was not restored. Choose one:
|
|
120
|
+
${r.choices.map((c) => ` ${c.command} (${c.effect})`).join("\n")}` : `${signedIn} Restoring this project's backup failed (see warnings). Next: ${r.nextCommand}`;
|
|
121
|
+
case "link-failed":
|
|
122
|
+
return `${signedIn} Linking this project failed (see warnings). Next: ${r.nextCommand}`;
|
|
123
|
+
case "backup-failed":
|
|
124
|
+
return `${signedIn} Project ${name} is linked, but the backup failed (see warnings). Next: ${r.nextCommand}`;
|
|
125
|
+
case "offered":
|
|
126
|
+
return r.offer === "restore" ? `${signedIn} Cleo Nexus holds a backup of this project that this copy never synced. To restore it here: ${r.nextCommand}` : `${signedIn} This project is not linked to Cleo Nexus. To link and back it up: ${r.nextCommand}`;
|
|
127
|
+
case "declined":
|
|
128
|
+
return r.offer === "restore" ? `${signedIn} Not restored. To restore its backup later: ${r.nextCommand}` : `${signedIn} Not linked. To link and back up later: ${r.nextCommand}`;
|
|
129
|
+
case "projects":
|
|
130
|
+
return `${signedIn}${projectsBlock(r)}`;
|
|
131
|
+
default:
|
|
132
|
+
return signedIn;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async function runNexusLoginCommand(args, operation, openBrowser) {
|
|
136
|
+
let login;
|
|
137
|
+
try {
|
|
138
|
+
login = await runNexusLogin(args, openBrowser);
|
|
139
|
+
} catch (err) {
|
|
140
|
+
failNexus(err, operation);
|
|
141
|
+
}
|
|
142
|
+
const firstRun = await runNexusFirstRunCli(args, login);
|
|
143
|
+
for (const w of firstRun.warnings)
|
|
144
|
+
process.stderr.write(`warning: ${terminalSafe(w.message)} (${w.code})
|
|
145
|
+
`);
|
|
146
|
+
if (!isHumanOutput()) {
|
|
147
|
+
if (firstRun.nextCommand) process.stderr.write(`next: ${firstRun.nextCommand}
|
|
148
|
+
`);
|
|
149
|
+
for (const c of firstRun.choices) process.stderr.write(`choice: ${c.command} (${c.effect})
|
|
150
|
+
`);
|
|
151
|
+
}
|
|
152
|
+
emitNexusResult(
|
|
153
|
+
{ ...login, firstRun },
|
|
154
|
+
nexusFirstRunSummary(login, firstRun),
|
|
155
|
+
"login",
|
|
156
|
+
operation
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// packages/cleo/src/cli/commands/llm-login.ts
|
|
161
|
+
import { spawn } from "node:child_process";
|
|
162
|
+
import { createServer } from "node:http";
|
|
163
|
+
import { addCredential } from "@cleocode/core/llm/credentials-store.js";
|
|
164
|
+
import {
|
|
165
|
+
DeviceCodeAuthError,
|
|
166
|
+
DeviceCodeTimeoutError,
|
|
167
|
+
getKimiCodeDeviceCodeConfig,
|
|
168
|
+
pollForToken,
|
|
169
|
+
startDeviceCodeFlow
|
|
170
|
+
} from "@cleocode/core/llm/oauth/device-code.js";
|
|
171
|
+
import {
|
|
172
|
+
buildAuthorizationUrl,
|
|
173
|
+
exchangePkceCode,
|
|
174
|
+
generatePkcePair,
|
|
175
|
+
parseAuthorizationInput,
|
|
176
|
+
refreshPkceToken
|
|
177
|
+
} from "@cleocode/core/llm/oauth/pkce.js";
|
|
178
|
+
import { getKimiCodeMshHeaders } from "@cleocode/core/llm/provider-registry/builtin/kimi-code.js";
|
|
179
|
+
import { getProviderProfile, listProviders } from "@cleocode/core/llm/provider-registry/index.js";
|
|
180
|
+
function _errorResult(code, message, meta) {
|
|
181
|
+
return { success: false, error: { code, codeName: code, message }, meta };
|
|
182
|
+
}
|
|
183
|
+
async function runLlmLogin(provider, opts) {
|
|
184
|
+
const meta = { operation: "llm.login", timestamp: (/* @__PURE__ */ new Date()).toISOString() };
|
|
185
|
+
const profile = await getProviderProfile(provider);
|
|
186
|
+
const oauthMode = profile?.oauth?.mode;
|
|
187
|
+
if (provider === "kimi-code" || oauthMode === "device-code") {
|
|
188
|
+
return _runKimiCodeLogin(opts, meta);
|
|
189
|
+
}
|
|
190
|
+
if (oauthMode === "pkce") {
|
|
191
|
+
return _runPkceLogin(profile.name, profile.oauth, opts, meta);
|
|
192
|
+
}
|
|
193
|
+
return _errorResult(
|
|
194
|
+
"E_NOT_IMPLEMENTED",
|
|
195
|
+
`OAuth login for '${provider}' is not yet wired. ${await _supportedOauthProvidersHint()} For any other provider, add an API key with 'cleo llm add <provider> --api-key-stdin'.`,
|
|
196
|
+
meta
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
async function _supportedOauthProvidersHint() {
|
|
200
|
+
try {
|
|
201
|
+
const profiles = await listProviders();
|
|
202
|
+
const oauthable = profiles.flatMap((p) => p.oauth ? [`'${p.name}' (${p.oauth.mode})`] : []);
|
|
203
|
+
return oauthable.length > 0 ? `Providers with OAuth login: ${oauthable.join(", ")}.` : "No providers currently expose OAuth login.";
|
|
204
|
+
} catch {
|
|
205
|
+
return "Providers with OAuth login: 'anthropic' (pkce), 'openai' (pkce), 'kimi-code' (device-code).";
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
async function _runPkceLogin(provider, oauthCfg, opts, meta) {
|
|
209
|
+
const { codeVerifier, codeChallenge } = await generatePkcePair();
|
|
210
|
+
const state = _generateState();
|
|
211
|
+
const isHeadless = opts.headless || process.env["CLEO_HEADLESS"] === "1";
|
|
212
|
+
const fixedPort = isHeadless ? null : _parseFixedLoopbackPort(oauthCfg.redirectUri);
|
|
213
|
+
const isNonLoopbackPasteBack = !isHeadless && fixedPort === null && !_isLoopbackUri(oauthCfg.redirectUri);
|
|
214
|
+
const effectiveHeadless = isHeadless || isNonLoopbackPasteBack;
|
|
215
|
+
const port = effectiveHeadless ? 0 : fixedPort ?? await _findFreePort();
|
|
216
|
+
const randomRedirect = `http://localhost:${port}/callback`;
|
|
217
|
+
const redirectUri = effectiveHeadless ? oauthCfg.redirectUri ?? "http://localhost" : fixedPort != null ? oauthCfg.redirectUri ?? randomRedirect : randomRedirect;
|
|
218
|
+
const authUrl = buildAuthorizationUrl({
|
|
219
|
+
authorizationEndpoint: oauthCfg.authorizationEndpoint ?? "",
|
|
220
|
+
clientId: oauthCfg.clientId,
|
|
221
|
+
redirectUri,
|
|
222
|
+
scope: oauthCfg.scope ?? "",
|
|
223
|
+
codeChallenge,
|
|
224
|
+
state,
|
|
225
|
+
extraParams: oauthCfg.extraAuthParams
|
|
226
|
+
});
|
|
227
|
+
let code;
|
|
228
|
+
if (effectiveHeadless) {
|
|
229
|
+
try {
|
|
230
|
+
code = await _headlessPkceFlow(provider, authUrl, state);
|
|
231
|
+
} catch (err) {
|
|
232
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
233
|
+
return _errorResult("E_PKCE_INVALID_CALLBACK", msg, meta);
|
|
234
|
+
}
|
|
235
|
+
} else {
|
|
236
|
+
const result = await _localCallbackPkceFlow(provider, authUrl, state, port);
|
|
237
|
+
if ("error" in result) {
|
|
238
|
+
return { success: false, error: result.error, meta };
|
|
239
|
+
}
|
|
240
|
+
code = result.code;
|
|
241
|
+
}
|
|
242
|
+
let tokens;
|
|
243
|
+
try {
|
|
244
|
+
tokens = await exchangePkceCode({
|
|
245
|
+
provider,
|
|
246
|
+
clientId: oauthCfg.clientId,
|
|
247
|
+
code,
|
|
248
|
+
codeVerifier,
|
|
249
|
+
redirectUri,
|
|
250
|
+
tokenEndpoint: oauthCfg.tokenEndpoint,
|
|
251
|
+
state,
|
|
252
|
+
bodyFormat: oauthCfg.tokenBodyFormat
|
|
253
|
+
});
|
|
254
|
+
} catch (err) {
|
|
255
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
256
|
+
return _errorResult("E_PKCE_EXCHANGE_FAILED", `PKCE code exchange failed: ${msg}`, meta);
|
|
257
|
+
}
|
|
258
|
+
process.stderr.write("\r Authorization approved. \n\n");
|
|
259
|
+
const label = opts.label ?? "oauth-login";
|
|
260
|
+
const expiresAt = typeof tokens.expiresIn === "number" ? Date.now() + tokens.expiresIn * 1e3 : void 0;
|
|
261
|
+
const oauthExtraHeaders = provider === "anthropic" ? { "anthropic-beta": "oauth-2025-04-20" } : void 0;
|
|
262
|
+
try {
|
|
263
|
+
await addCredential({
|
|
264
|
+
provider,
|
|
265
|
+
label,
|
|
266
|
+
authType: "oauth",
|
|
267
|
+
accessToken: tokens.accessToken,
|
|
268
|
+
refreshToken: tokens.refreshToken,
|
|
269
|
+
expiresAt,
|
|
270
|
+
priority: 10,
|
|
271
|
+
source: "oauth-pkce",
|
|
272
|
+
...oauthExtraHeaders ? { extraHeaders: oauthExtraHeaders } : {}
|
|
273
|
+
});
|
|
274
|
+
} catch (err) {
|
|
275
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
276
|
+
return _errorResult(
|
|
277
|
+
"E_CREDENTIAL_STORE_FAILED",
|
|
278
|
+
`Failed to store credential in pool: ${msg}`,
|
|
279
|
+
meta
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
return {
|
|
283
|
+
success: true,
|
|
284
|
+
data: { provider, label, expiresIn: tokens.expiresIn },
|
|
285
|
+
meta
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
function _parseFixedLoopbackPort(redirectUri) {
|
|
289
|
+
if (!redirectUri) return null;
|
|
290
|
+
try {
|
|
291
|
+
const u = new URL(redirectUri);
|
|
292
|
+
const isLoopback = u.hostname === "localhost" || u.hostname === "127.0.0.1";
|
|
293
|
+
if (!isLoopback || !u.port) return null;
|
|
294
|
+
const port = Number(u.port);
|
|
295
|
+
return Number.isInteger(port) && port > 0 ? port : null;
|
|
296
|
+
} catch {
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
function _isLoopbackUri(redirectUri) {
|
|
301
|
+
if (!redirectUri) return false;
|
|
302
|
+
try {
|
|
303
|
+
const u = new URL(redirectUri);
|
|
304
|
+
return u.hostname === "localhost" || u.hostname === "127.0.0.1";
|
|
305
|
+
} catch {
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
async function _headlessPkceFlow(provider, authUrl, expectedState) {
|
|
310
|
+
process.stderr.write(
|
|
311
|
+
`
|
|
312
|
+
Provider: ${provider}
|
|
313
|
+
Open this URL in your browser to authorize:
|
|
314
|
+
|
|
315
|
+
${authUrl}
|
|
316
|
+
|
|
317
|
+
After approving, paste the full redirect URL (\u2026?code=\u2026&state=\u2026) or the code shown:
|
|
318
|
+
`
|
|
319
|
+
);
|
|
320
|
+
return new Promise((resolve, reject) => {
|
|
321
|
+
process.stdin.setEncoding("utf8");
|
|
322
|
+
process.stdin.once("data", (chunk) => {
|
|
323
|
+
process.stdin.pause();
|
|
324
|
+
const parsed = parseAuthorizationInput(String(chunk));
|
|
325
|
+
if (!parsed.code) {
|
|
326
|
+
reject(new Error('Pasted input is missing the authorization "code" parameter'));
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
if (parsed.state && parsed.state !== expectedState) {
|
|
330
|
+
reject(new Error("OAuth state mismatch \u2014 pasted redirect does not match this login"));
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
resolve(parsed.code);
|
|
334
|
+
});
|
|
335
|
+
process.stdin.resume();
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
async function _localCallbackPkceFlow(provider, authUrl, expectedState, port) {
|
|
339
|
+
return new Promise((resolve) => {
|
|
340
|
+
const server = createServer((req, res) => {
|
|
341
|
+
const url = new URL(req.url ?? "/", `http://localhost:${port}`);
|
|
342
|
+
const code = url.searchParams.get("code");
|
|
343
|
+
const state = url.searchParams.get("state");
|
|
344
|
+
const error = url.searchParams.get("error");
|
|
345
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
346
|
+
if (error) {
|
|
347
|
+
res.end(`<h1>Authorization failed</h1><p>${error}</p><p>You may close this tab.</p>`);
|
|
348
|
+
server.close();
|
|
349
|
+
resolve({
|
|
350
|
+
error: {
|
|
351
|
+
code: "E_PKCE_AUTH_DENIED",
|
|
352
|
+
codeName: "E_PKCE_AUTH_DENIED",
|
|
353
|
+
message: `OAuth authorization denied for '${provider}': ${error}`
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
if (!code || state !== expectedState) {
|
|
359
|
+
res.end("<h1>Invalid callback</h1><p>You may close this tab.</p>");
|
|
360
|
+
server.close();
|
|
361
|
+
resolve({
|
|
362
|
+
error: {
|
|
363
|
+
code: "E_PKCE_INVALID_CALLBACK",
|
|
364
|
+
codeName: "E_PKCE_INVALID_CALLBACK",
|
|
365
|
+
message: "OAuth callback received invalid code or state mismatch"
|
|
366
|
+
}
|
|
367
|
+
});
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
res.end("<h1>Authorized</h1><p>You may close this tab and return to your terminal.</p>");
|
|
371
|
+
server.close();
|
|
372
|
+
resolve({ code });
|
|
373
|
+
});
|
|
374
|
+
server.listen(port, "localhost", () => {
|
|
375
|
+
process.stderr.write("\n");
|
|
376
|
+
process.stderr.write(` Provider: ${provider}
|
|
377
|
+
`);
|
|
378
|
+
process.stderr.write(` Open this URL to authorize (or it will open automatically):
|
|
379
|
+
|
|
380
|
+
`);
|
|
381
|
+
process.stderr.write(` ${authUrl}
|
|
382
|
+
|
|
383
|
+
`);
|
|
384
|
+
process.stderr.write(` Waiting for authorization callback...
|
|
385
|
+
`);
|
|
386
|
+
_tryOpenBrowser(authUrl);
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
async function _runKimiCodeLogin(opts, meta) {
|
|
391
|
+
const cfg = getKimiCodeDeviceCodeConfig();
|
|
392
|
+
let startResp;
|
|
393
|
+
try {
|
|
394
|
+
startResp = await startDeviceCodeFlow(cfg);
|
|
395
|
+
} catch (err) {
|
|
396
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
397
|
+
return _errorResult(
|
|
398
|
+
"E_DEVICE_CODE_START_FAILED",
|
|
399
|
+
`Failed to initiate Kimi Code device-code OAuth flow: ${msg}`,
|
|
400
|
+
meta
|
|
401
|
+
);
|
|
402
|
+
}
|
|
403
|
+
writeDeviceCodePrompt(startResp, "Kimi Code");
|
|
404
|
+
let tokenResp;
|
|
405
|
+
try {
|
|
406
|
+
tokenResp = await pollForToken(cfg, startResp, { onPending: writeDeviceCodePending });
|
|
407
|
+
} catch (err) {
|
|
408
|
+
writeDeviceCodeInterrupted();
|
|
409
|
+
if (err instanceof DeviceCodeTimeoutError) {
|
|
410
|
+
return _errorResult("E_DEVICE_CODE_TIMEOUT", err.message, meta);
|
|
411
|
+
}
|
|
412
|
+
if (err instanceof DeviceCodeAuthError) {
|
|
413
|
+
return _errorResult("E_DEVICE_CODE_AUTH_FAILED", err.message, meta);
|
|
414
|
+
}
|
|
415
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
416
|
+
return _errorResult(
|
|
417
|
+
"E_DEVICE_CODE_POLL_FAILED",
|
|
418
|
+
`Polling for Kimi Code device-code token failed: ${msg}`,
|
|
419
|
+
meta
|
|
420
|
+
);
|
|
421
|
+
}
|
|
422
|
+
writeDeviceCodeApproved("Kimi Code");
|
|
423
|
+
const label = opts.label ?? "oauth-login";
|
|
424
|
+
const expiresAt = typeof tokenResp.expiresIn === "number" ? Date.now() + tokenResp.expiresIn * 1e3 : void 0;
|
|
425
|
+
try {
|
|
426
|
+
await addCredential({
|
|
427
|
+
provider: "kimi-code",
|
|
428
|
+
label,
|
|
429
|
+
authType: "oauth",
|
|
430
|
+
accessToken: tokenResp.accessToken,
|
|
431
|
+
refreshToken: tokenResp.refreshToken,
|
|
432
|
+
expiresAt,
|
|
433
|
+
priority: 10,
|
|
434
|
+
source: "oauth-device-code",
|
|
435
|
+
// The six mandatory X-Msh-* headers must be carried alongside the token
|
|
436
|
+
// so every transport that picks this credential sends them automatically.
|
|
437
|
+
extraHeaders: getKimiCodeMshHeaders()
|
|
438
|
+
});
|
|
439
|
+
} catch (err) {
|
|
440
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
441
|
+
return _errorResult(
|
|
442
|
+
"E_CREDENTIAL_STORE_FAILED",
|
|
443
|
+
`Failed to store Kimi Code credential in pool: ${msg}`,
|
|
444
|
+
meta
|
|
445
|
+
);
|
|
446
|
+
}
|
|
447
|
+
return {
|
|
448
|
+
success: true,
|
|
449
|
+
data: {
|
|
450
|
+
provider: "kimi-code",
|
|
451
|
+
label,
|
|
452
|
+
expiresIn: tokenResp.expiresIn
|
|
453
|
+
},
|
|
454
|
+
meta
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
function _generateState() {
|
|
458
|
+
const bytes = crypto.getRandomValues(new Uint8Array(16));
|
|
459
|
+
return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
|
|
460
|
+
}
|
|
461
|
+
function _findFreePort() {
|
|
462
|
+
return new Promise((resolve, reject) => {
|
|
463
|
+
const srv = createServer();
|
|
464
|
+
srv.listen(0, "localhost", () => {
|
|
465
|
+
const addr = srv.address();
|
|
466
|
+
if (!addr || typeof addr === "string") {
|
|
467
|
+
srv.close();
|
|
468
|
+
reject(new Error("Could not determine callback port"));
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
471
|
+
const port = addr.port;
|
|
472
|
+
srv.close(() => resolve(port));
|
|
473
|
+
});
|
|
474
|
+
srv.on("error", reject);
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
var UNSAFE_OPEN_URL = /^-|[\u0000-\u0020\u007f-\u009f\s]/;
|
|
478
|
+
function _tryOpenBrowser(url) {
|
|
479
|
+
if (UNSAFE_OPEN_URL.test(url)) return;
|
|
480
|
+
const [cmd, args] = process.platform === "darwin" ? ["open", [url]] : process.platform === "win32" ? ["rundll32", ["url.dll,FileProtocolHandler", url]] : ["xdg-open", [url]];
|
|
481
|
+
try {
|
|
482
|
+
const child = spawn(cmd, args, { detached: true, stdio: "ignore", windowsHide: true });
|
|
483
|
+
child.on("error", () => {
|
|
484
|
+
});
|
|
485
|
+
child.unref();
|
|
486
|
+
} catch {
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
// packages/cleo/src/cli/commands/login.ts
|
|
491
|
+
async function providerRegistry() {
|
|
492
|
+
const mod = await import(
|
|
493
|
+
/* webpackIgnore: true */
|
|
494
|
+
"@cleocode/core/llm/provider-registry/index.js"
|
|
495
|
+
);
|
|
496
|
+
return {
|
|
497
|
+
getProviderProfile: mod.getProviderProfile,
|
|
498
|
+
listProviders: mod.listProviders
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
var AUTH_METHODS = ["oauth", "api_key"];
|
|
502
|
+
async function readApiKeyFromStdin() {
|
|
503
|
+
if (process.stdin.isTTY) return "";
|
|
504
|
+
process.stdin.setEncoding("utf-8");
|
|
505
|
+
let buf = "";
|
|
506
|
+
for await (const chunk of process.stdin) {
|
|
507
|
+
buf += chunk;
|
|
508
|
+
}
|
|
509
|
+
return buf.replace(/\r?\n$/, "").trim();
|
|
510
|
+
}
|
|
511
|
+
function makeOAuthAcquirer(label) {
|
|
512
|
+
return async (provider) => {
|
|
513
|
+
const result = await runLlmLogin(provider, label ? { label } : {});
|
|
514
|
+
if (!result.success || !result.data) {
|
|
515
|
+
const message = result.error?.message ?? `OAuth login failed for '${provider}'.`;
|
|
516
|
+
throw new Error(message);
|
|
517
|
+
}
|
|
518
|
+
return {
|
|
519
|
+
label: result.data.label,
|
|
520
|
+
...result.data.expiresIn != null ? { expiresIn: result.data.expiresIn } : {}
|
|
521
|
+
};
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
function parseRole(raw) {
|
|
525
|
+
if (typeof raw !== "string" || raw === "") return void 0;
|
|
526
|
+
if (WHOAMI_ROLE_IDS.includes(raw)) return raw;
|
|
527
|
+
throw new Error(`Invalid --role '${raw}'. Valid roles: ${WHOAMI_ROLE_IDS.join(", ")}.`);
|
|
528
|
+
}
|
|
529
|
+
async function runLoginFrontDoor(args) {
|
|
530
|
+
const { runFrontDoorLogin } = await import(
|
|
531
|
+
/* webpackIgnore: true */
|
|
532
|
+
"@cleocode/core/llm/onboarding/front-door.js"
|
|
533
|
+
);
|
|
534
|
+
const flags = await resolveFlags(args);
|
|
535
|
+
const acquirer = makeOAuthAcquirer(flags.label);
|
|
536
|
+
return runFrontDoorLogin(
|
|
537
|
+
flags.provider,
|
|
538
|
+
{
|
|
539
|
+
...flags.authMode !== void 0 ? { authMode: flags.authMode } : {},
|
|
540
|
+
...flags.token !== void 0 ? { token: flags.token } : {},
|
|
541
|
+
...flags.model !== void 0 ? { model: flags.model } : {},
|
|
542
|
+
...flags.role !== void 0 ? { role: flags.role } : {},
|
|
543
|
+
...flags.label !== void 0 ? { label: flags.label } : {}
|
|
544
|
+
},
|
|
545
|
+
acquirer
|
|
546
|
+
);
|
|
547
|
+
}
|
|
548
|
+
async function resolveFlags(args) {
|
|
549
|
+
const out = {};
|
|
550
|
+
const labelArg = typeof args["label"] === "string" && args["label"] ? args["label"] : void 0;
|
|
551
|
+
if (labelArg) out.label = labelArg;
|
|
552
|
+
out.model = typeof args["model"] === "string" && args["model"] ? args["model"] : void 0;
|
|
553
|
+
out.role = parseRole(args["role"]);
|
|
554
|
+
const registry = await providerRegistry();
|
|
555
|
+
const io = new ReadlineWizardIO(process.stdin, process.stderr);
|
|
556
|
+
try {
|
|
557
|
+
out.provider = await resolveProvider(args, registry, io);
|
|
558
|
+
out.authMode = await resolveAuthMethod(args, out.provider, registry, io);
|
|
559
|
+
if (out.authMode === "api_key") {
|
|
560
|
+
out.token = await resolveRequiredApiKey(args, io);
|
|
561
|
+
}
|
|
562
|
+
} finally {
|
|
563
|
+
io.close();
|
|
564
|
+
}
|
|
565
|
+
return out;
|
|
566
|
+
}
|
|
567
|
+
async function resolveProvider(args, registry, io) {
|
|
568
|
+
const provider = typeof args["provider"] === "string" ? args["provider"] : "";
|
|
569
|
+
if (provider) return provider;
|
|
570
|
+
if (!process.stdin.isTTY) {
|
|
571
|
+
throw new Error(
|
|
572
|
+
"No --provider supplied and stdin is not a TTY. Pass `--provider <name>` (e.g. anthropic, openai, gemini)."
|
|
573
|
+
);
|
|
574
|
+
}
|
|
575
|
+
const profiles = await registry.listProviders();
|
|
576
|
+
const names = profiles.map((p) => p.name).sort();
|
|
577
|
+
return io.select("Which provider do you want to log in to?", names);
|
|
578
|
+
}
|
|
579
|
+
async function resolveAuthMethod(args, provider, registry, io) {
|
|
580
|
+
const authArg = typeof args["auth"] === "string" ? args["auth"] : "";
|
|
581
|
+
if (authArg === "oauth" || authArg === "api_key") return authArg;
|
|
582
|
+
if (authArg !== "") throw new Error(`Invalid --auth '${authArg}'. Valid: oauth | api_key.`);
|
|
583
|
+
const supportsOAuth = Boolean((await registry.getProviderProfile(provider))?.oauth);
|
|
584
|
+
if (!process.stdin.isTTY) {
|
|
585
|
+
return hasApiKeyFlag(args) ? "api_key" : supportsOAuth ? "oauth" : "api_key";
|
|
586
|
+
}
|
|
587
|
+
if (supportsOAuth) return io.select("How do you want to authenticate?", AUTH_METHODS);
|
|
588
|
+
return "api_key";
|
|
589
|
+
}
|
|
590
|
+
async function resolveRequiredApiKey(args, io) {
|
|
591
|
+
const token = await resolveApiKey(args, io);
|
|
592
|
+
if (!token) {
|
|
593
|
+
throw new Error(
|
|
594
|
+
"No API key supplied. Pass `--api-key-stdin` (recommended), `--api-key <value>`, or run interactively to be prompted."
|
|
595
|
+
);
|
|
596
|
+
}
|
|
597
|
+
return token;
|
|
598
|
+
}
|
|
599
|
+
async function resolveApiKey(args, io) {
|
|
600
|
+
if (args["api-key-stdin"] === true) {
|
|
601
|
+
return readApiKeyFromStdin();
|
|
602
|
+
}
|
|
603
|
+
if (typeof args["api-key"] === "string" && args["api-key"]) {
|
|
604
|
+
return args["api-key"];
|
|
605
|
+
}
|
|
606
|
+
if (process.stdin.isTTY) {
|
|
607
|
+
return (await io.secret("API key (input hidden):")).trim();
|
|
608
|
+
}
|
|
609
|
+
return "";
|
|
610
|
+
}
|
|
611
|
+
function hasApiKeyFlag(args) {
|
|
612
|
+
return args["api-key-stdin"] === true || typeof args["api-key"] === "string" && args["api-key"] !== "";
|
|
613
|
+
}
|
|
614
|
+
var NEXUS_PICKER_LABEL = "Cleo Nexus account";
|
|
615
|
+
function loginPickerOptions(providerNames) {
|
|
616
|
+
return [NEXUS_PICKER_LABEL, ...[...providerNames].sort()];
|
|
617
|
+
}
|
|
618
|
+
var LLM_ONLY_FLAGS = ["api-key", "api-key-stdin", "model", "role", "auth", "label"];
|
|
619
|
+
function nonInteractiveLoginTarget(args, operation) {
|
|
620
|
+
if (operation !== "login.run") return void 0;
|
|
621
|
+
const llmIntent = LLM_ONLY_FLAGS.some((f) => args[f] !== void 0 && args[f] !== false);
|
|
622
|
+
return llmIntent ? void 0 : NEXUS_LOGIN_TARGET;
|
|
623
|
+
}
|
|
624
|
+
async function resolveLoginTarget(args, operation) {
|
|
625
|
+
const given = typeof args["provider"] === "string" ? args["provider"] : "";
|
|
626
|
+
if (given) return given;
|
|
627
|
+
if (!process.stdin.isTTY) return nonInteractiveLoginTarget(args, operation);
|
|
628
|
+
const names = (await (await providerRegistry()).listProviders()).map((p) => p.name);
|
|
629
|
+
const io = new ReadlineWizardIO(process.stdin, process.stderr);
|
|
630
|
+
try {
|
|
631
|
+
const choice = await io.select("What do you want to log in to?", loginPickerOptions(names));
|
|
632
|
+
return choice === NEXUS_PICKER_LABEL ? NEXUS_LOGIN_TARGET : choice;
|
|
633
|
+
} finally {
|
|
634
|
+
io.close();
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
async function runLoginCommand(args, operation) {
|
|
638
|
+
let target;
|
|
639
|
+
try {
|
|
640
|
+
target = await resolveLoginTarget(args, operation);
|
|
641
|
+
} catch (err) {
|
|
642
|
+
failLogin(err, operation);
|
|
643
|
+
}
|
|
644
|
+
if (target === NEXUS_LOGIN_TARGET) {
|
|
645
|
+
await runNexusLoginCommand(args, operation, _tryOpenBrowser);
|
|
646
|
+
return;
|
|
647
|
+
}
|
|
648
|
+
let result;
|
|
649
|
+
try {
|
|
650
|
+
result = await runLoginFrontDoor(target ? { ...args, provider: target } : args);
|
|
651
|
+
} catch (err) {
|
|
652
|
+
failLogin(err, operation);
|
|
653
|
+
}
|
|
654
|
+
emitLoginResult(result, operation);
|
|
655
|
+
}
|
|
656
|
+
function failLogin(err, operation) {
|
|
657
|
+
cliError(
|
|
658
|
+
err instanceof Error ? err.message : String(err),
|
|
659
|
+
1,
|
|
660
|
+
{ name: "E_LOGIN_FAILED" },
|
|
661
|
+
{ operation }
|
|
662
|
+
);
|
|
663
|
+
process.exit(1);
|
|
664
|
+
}
|
|
665
|
+
function emitLoginResult(result, operation) {
|
|
666
|
+
if (!result.validated) {
|
|
667
|
+
emitLoginFailure(result, operation);
|
|
668
|
+
return;
|
|
669
|
+
}
|
|
670
|
+
if (isHumanOutput()) {
|
|
671
|
+
humanLine(
|
|
672
|
+
`Logged in to ${result.provider} as '${result.accountLabel}' \u2014 bound ${result.profileName ?? "default"} \u2192 ${result.provider}/${result.modelId}.`
|
|
673
|
+
);
|
|
674
|
+
} else {
|
|
675
|
+
cliOutput(result, { command: "login", operation });
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
function emitLoginFailure(result, operation) {
|
|
679
|
+
const failed = result.steps.find((s) => s.status === "failed");
|
|
680
|
+
cliError(
|
|
681
|
+
failed?.detail ?? "Onboarding login did not complete.",
|
|
682
|
+
failed?.code ?? 1,
|
|
683
|
+
{ name: failed?.code ?? "E_ONBOARDING_INCOMPLETE", details: { steps: result.steps } },
|
|
684
|
+
{ operation }
|
|
685
|
+
);
|
|
686
|
+
process.exit(1);
|
|
687
|
+
}
|
|
688
|
+
var LOGIN_ARGS = {
|
|
689
|
+
provider: {
|
|
690
|
+
type: "positional",
|
|
691
|
+
description: "What to log in to: 'nexus' (Cleo Nexus account) or an LLM provider (anthropic | openai | codex | gemini | kimi-code | \u2026).",
|
|
692
|
+
required: false
|
|
693
|
+
},
|
|
694
|
+
"api-url": NEXUS_API_URL_ARG,
|
|
695
|
+
browser: {
|
|
696
|
+
type: "boolean",
|
|
697
|
+
description: "Open the verification URL in a browser (nexus). --no-browser only prints it (SSH, containers).",
|
|
698
|
+
default: true
|
|
699
|
+
},
|
|
700
|
+
"read-only": {
|
|
701
|
+
type: "boolean",
|
|
702
|
+
description: "nexus: enrol this machine with the read-only device profile (account, devices and project reads only). Refused with CLEO_NEXUS_DEVICE=0."
|
|
703
|
+
},
|
|
704
|
+
name: {
|
|
705
|
+
type: "string",
|
|
706
|
+
description: "nexus: device name shown on cleocode.dev (default: OS, arch and a short id; never the hostname). Ignored with CLEO_NEXUS_DEVICE=0."
|
|
707
|
+
},
|
|
708
|
+
yes: {
|
|
709
|
+
type: "boolean",
|
|
710
|
+
description: "nexus: inside a CLEO project this machine has not linked, link it and take the first encrypted backup without asking (or, when Cleo Nexus already backs it up from another device and this copy never synced, restore that backup here). Without it a terminal is asked; a non-interactive run outside CI (an agent) links and backs up unattended but never restores unasked; CI only prints the next command."
|
|
711
|
+
},
|
|
712
|
+
auth: {
|
|
713
|
+
type: "string",
|
|
714
|
+
description: "Auth method: 'oauth' (browser) or 'api_key'. Inferred from the provider when omitted."
|
|
715
|
+
},
|
|
716
|
+
"api-key": {
|
|
717
|
+
type: "string",
|
|
718
|
+
description: "(DEPRECATED \u2014 visible to `ps`/shell history) API key for the api_key path. Prefer --api-key-stdin."
|
|
719
|
+
},
|
|
720
|
+
"api-key-stdin": {
|
|
721
|
+
type: "boolean",
|
|
722
|
+
description: "(recommended) Read the API key from piped stdin instead of a flag."
|
|
723
|
+
},
|
|
724
|
+
model: {
|
|
725
|
+
type: "string",
|
|
726
|
+
description: "Model id to bind (default: the latest catalog model for the provider)."
|
|
727
|
+
},
|
|
728
|
+
role: {
|
|
729
|
+
type: "string",
|
|
730
|
+
description: `Bind the model to a specific role instead of the global default. Valid: ${WHOAMI_ROLE_IDS.join(" | ")}.`
|
|
731
|
+
},
|
|
732
|
+
label: {
|
|
733
|
+
type: "string",
|
|
734
|
+
description: "Credential label (default: 'oauth-login')."
|
|
735
|
+
},
|
|
736
|
+
json: {
|
|
737
|
+
type: "boolean",
|
|
738
|
+
description: "Output the result as a JSON LAFS envelope."
|
|
739
|
+
}
|
|
740
|
+
};
|
|
741
|
+
var loginCommand = defineCommand({
|
|
742
|
+
meta: {
|
|
743
|
+
name: "login",
|
|
744
|
+
// ONE quoted literal, no backticks: the manifest generator's DESC_RE
|
|
745
|
+
// captures only the first plain string literal (concatenations + backticks
|
|
746
|
+
// truncate the `cleo --help` text mid-sentence).
|
|
747
|
+
description: "Log in to a Cleo Nexus account (cleo login nexus: device code, --api-url, --no-browser) or to an LLM provider, binding a usable profile in one step. The picker lists the Cleo Nexus account first, then the providers. Without a terminal and no target, cleo login signs in to Cleo Nexus (an agent needs no extra word). After a Cleo Nexus sign-in inside an unlinked CLEO project it links the project and backs it up: a terminal is asked, --yes or a non-interactive run (an agent) does it, a restore over this copy is never done unasked, and CI only prints the next command; outside a project it lists your projects with the cleo cloud restore command for each. For a provider it picks an auth method (browser OAuth or API key), selects a model, binds it, and validates the binding. cleo auth login and cleo llm login resolve to this same flow. Prompts/URLs go to stderr; the result is a human line on a terminal or a JSON envelope when piped / --json."
|
|
748
|
+
},
|
|
749
|
+
args: LOGIN_ARGS,
|
|
750
|
+
async run({ args }) {
|
|
751
|
+
await runLoginCommand(args, "login.run");
|
|
752
|
+
}
|
|
753
|
+
});
|
|
754
|
+
|
|
755
|
+
export {
|
|
756
|
+
makeOAuthAcquirer,
|
|
757
|
+
runLoginFrontDoor,
|
|
758
|
+
NEXUS_PICKER_LABEL,
|
|
759
|
+
loginPickerOptions,
|
|
760
|
+
nonInteractiveLoginTarget,
|
|
761
|
+
runLoginCommand,
|
|
762
|
+
emitLoginResult,
|
|
763
|
+
LOGIN_ARGS,
|
|
764
|
+
loginCommand
|
|
765
|
+
};
|
|
766
|
+
//# sourceMappingURL=chunk-UWCZY52R.js.map
|