opkg 0.9.2 → 0.9.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/.claude/agents/code-reviewer.md +171 -0
- package/.claude/commands/commit-push-pr.md +20 -0
- package/.claude/commands/{specs/read.md → read-specs.md} +1 -1
- package/.claude/commands/{specs/update.md → update-specs.md} +4 -0
- package/.claude/skills/code-review-excellence/SKILL.md +538 -0
- package/README.md +2 -2
- package/package.json +3 -1
- package/packages/cli/dist/add-IJAPFHIX.js +624 -0
- package/packages/cli/dist/add-IJAPFHIX.js.map +7 -0
- package/packages/cli/dist/add-LLUNFLJI.js +624 -0
- package/packages/cli/dist/add-LLUNFLJI.js.map +7 -0
- package/packages/cli/dist/add-U44SL3OR.js +624 -0
- package/packages/cli/dist/add-U44SL3OR.js.map +7 -0
- package/packages/cli/dist/chunk-23VBP5L6.js +371 -0
- package/packages/cli/dist/chunk-23VBP5L6.js.map +7 -0
- package/packages/cli/dist/chunk-2SVHLF5C.js +1419 -0
- package/packages/cli/dist/chunk-2SVHLF5C.js.map +7 -0
- package/packages/cli/dist/chunk-37256POU.js +99 -0
- package/packages/cli/dist/chunk-37256POU.js.map +7 -0
- package/packages/cli/dist/chunk-3PZRVA6O.js +196 -0
- package/packages/cli/dist/chunk-3PZRVA6O.js.map +7 -0
- package/packages/cli/dist/chunk-427DCURL.js +155 -0
- package/packages/cli/dist/chunk-427DCURL.js.map +7 -0
- package/packages/cli/dist/chunk-4B5HJLP2.js +48 -0
- package/packages/cli/dist/chunk-4B5HJLP2.js.map +7 -0
- package/packages/cli/dist/chunk-4OWT3YEG.js +413 -0
- package/packages/cli/dist/chunk-4OWT3YEG.js.map +7 -0
- package/packages/cli/dist/chunk-4RIBTBXI.js +568 -0
- package/packages/cli/dist/chunk-4RIBTBXI.js.map +7 -0
- package/packages/cli/dist/chunk-4X2EJHJN.js +63 -0
- package/packages/cli/dist/chunk-4X2EJHJN.js.map +7 -0
- package/packages/cli/dist/chunk-6CYW66HD.js +1136 -0
- package/packages/cli/dist/chunk-6CYW66HD.js.map +7 -0
- package/packages/cli/dist/chunk-6DITYAFA.js +172 -0
- package/packages/cli/dist/chunk-6DITYAFA.js.map +7 -0
- package/packages/cli/dist/chunk-7KEAKEVZ.js +568 -0
- package/packages/cli/dist/chunk-7KEAKEVZ.js.map +7 -0
- package/packages/cli/dist/chunk-ABFUD25D.js +61 -0
- package/packages/cli/dist/chunk-ABFUD25D.js.map +7 -0
- package/packages/cli/dist/chunk-AR7GJCG6.js +274 -0
- package/packages/cli/dist/chunk-AR7GJCG6.js.map +7 -0
- package/packages/cli/dist/chunk-AYTGQCXH.js +86 -0
- package/packages/cli/dist/chunk-AYTGQCXH.js.map +7 -0
- package/packages/cli/dist/chunk-BROJ6OUT.js +631 -0
- package/packages/cli/dist/chunk-BROJ6OUT.js.map +7 -0
- package/packages/cli/dist/chunk-BVVSU7QD.js +23 -0
- package/packages/cli/dist/chunk-BVVSU7QD.js.map +7 -0
- package/packages/cli/dist/chunk-C6FY55UP.js +108 -0
- package/packages/cli/dist/chunk-C6FY55UP.js.map +7 -0
- package/packages/cli/dist/chunk-CVA64SXK.js +1136 -0
- package/packages/cli/dist/chunk-CVA64SXK.js.map +7 -0
- package/packages/cli/dist/chunk-D3O7LY2Q.js +1151 -0
- package/packages/cli/dist/chunk-D3O7LY2Q.js.map +7 -0
- package/packages/cli/dist/chunk-D6LEPODL.js +413 -0
- package/packages/cli/dist/chunk-D6LEPODL.js.map +7 -0
- package/packages/cli/dist/chunk-DEC24S7E.js +186 -0
- package/packages/cli/dist/chunk-DEC24S7E.js.map +7 -0
- package/packages/cli/dist/chunk-FMVVJH5M.js +371 -0
- package/packages/cli/dist/chunk-FMVVJH5M.js.map +7 -0
- package/packages/cli/dist/chunk-GDVFS3YP.js +130 -0
- package/packages/cli/dist/chunk-GDVFS3YP.js.map +7 -0
- package/packages/cli/dist/chunk-GEP2G5HF.js +31 -0
- package/packages/cli/dist/chunk-GEP2G5HF.js.map +7 -0
- package/packages/cli/dist/chunk-GSWHZBT2.js +62 -0
- package/packages/cli/dist/chunk-GSWHZBT2.js.map +7 -0
- package/packages/cli/dist/chunk-HTYHJA3B.js +61 -0
- package/packages/cli/dist/chunk-HTYHJA3B.js.map +7 -0
- package/packages/cli/dist/chunk-HYKYECAE.js +222 -0
- package/packages/cli/dist/chunk-HYKYECAE.js.map +7 -0
- package/packages/cli/dist/chunk-I7FEAHB4.js +100 -0
- package/packages/cli/dist/chunk-I7FEAHB4.js.map +7 -0
- package/packages/cli/dist/chunk-IHVZ5AUJ.js +107 -0
- package/packages/cli/dist/chunk-IHVZ5AUJ.js.map +7 -0
- package/packages/cli/dist/chunk-KI7FDU3H.js +99 -0
- package/packages/cli/dist/chunk-KI7FDU3H.js.map +7 -0
- package/packages/cli/dist/chunk-L5GRJQBS.js +32 -0
- package/packages/cli/dist/chunk-L5GRJQBS.js.map +7 -0
- package/packages/cli/dist/chunk-LHEAUDJL.js +302 -0
- package/packages/cli/dist/chunk-LHEAUDJL.js.map +7 -0
- package/packages/cli/dist/chunk-MIURCESJ.js +48 -0
- package/packages/cli/dist/chunk-MIURCESJ.js.map +7 -0
- package/packages/cli/dist/chunk-N43IXOND.js +732 -0
- package/packages/cli/dist/chunk-N43IXOND.js.map +7 -0
- package/packages/cli/dist/chunk-OUZRMGPV.js +274 -0
- package/packages/cli/dist/chunk-OUZRMGPV.js.map +7 -0
- package/packages/cli/dist/chunk-PSQXKAL4.js +371 -0
- package/packages/cli/dist/chunk-PSQXKAL4.js.map +7 -0
- package/packages/cli/dist/chunk-PUDRKDVZ.js +1419 -0
- package/packages/cli/dist/chunk-PUDRKDVZ.js.map +7 -0
- package/packages/cli/dist/chunk-RAKMX654.js +631 -0
- package/packages/cli/dist/chunk-RAKMX654.js.map +7 -0
- package/packages/cli/dist/chunk-RSFLK2TP.js +195 -0
- package/packages/cli/dist/chunk-RSFLK2TP.js.map +7 -0
- package/packages/cli/dist/chunk-S26PR2BS.js +99 -0
- package/packages/cli/dist/chunk-S26PR2BS.js.map +7 -0
- package/packages/cli/dist/chunk-U7FW7SXX.js +568 -0
- package/packages/cli/dist/chunk-U7FW7SXX.js.map +7 -0
- package/packages/cli/dist/chunk-VKM6K5TN.js +413 -0
- package/packages/cli/dist/chunk-VKM6K5TN.js.map +7 -0
- package/packages/cli/dist/chunk-VKNJG4JN.js +253 -0
- package/packages/cli/dist/chunk-VKNJG4JN.js.map +7 -0
- package/packages/cli/dist/chunk-VQ2KY6CK.js +113 -0
- package/packages/cli/dist/chunk-VQ2KY6CK.js.map +7 -0
- package/packages/cli/dist/chunk-VQDTXLOX.js +1312 -0
- package/packages/cli/dist/chunk-VQDTXLOX.js.map +7 -0
- package/packages/cli/dist/chunk-VXNS3X5O.js +60 -0
- package/packages/cli/dist/chunk-VXNS3X5O.js.map +7 -0
- package/packages/cli/dist/chunk-WF7H2YDU.js +376 -0
- package/packages/cli/dist/chunk-WF7H2YDU.js.map +7 -0
- package/packages/cli/dist/chunk-WNRXZLWW.js +266 -0
- package/packages/cli/dist/chunk-WNRXZLWW.js.map +7 -0
- package/packages/cli/dist/chunk-WT4VVCXM.js +1121 -0
- package/packages/cli/dist/chunk-WT4VVCXM.js.map +7 -0
- package/packages/cli/dist/configure-3AZUMDJZ.js +107 -0
- package/packages/cli/dist/configure-3AZUMDJZ.js.map +7 -0
- package/packages/cli/dist/configure-D722JQOD.js +107 -0
- package/packages/cli/dist/configure-D722JQOD.js.map +7 -0
- package/packages/cli/dist/configure-IU5H7XD6.js +107 -0
- package/packages/cli/dist/configure-IU5H7XD6.js.map +7 -0
- package/packages/cli/dist/file-format-detector-PXCIAKTK.js +22 -0
- package/packages/cli/dist/file-format-detector-PXCIAKTK.js.map +7 -0
- package/packages/cli/dist/index.js +17 -17
- package/packages/cli/dist/install-EZNWMLJR.js +7581 -0
- package/packages/cli/dist/install-EZNWMLJR.js.map +7 -0
- package/packages/cli/dist/install-F5ANFUBX.js +7577 -0
- package/packages/cli/dist/install-F5ANFUBX.js.map +7 -0
- package/packages/cli/dist/install-JSXEPPC2.js +7104 -0
- package/packages/cli/dist/install-JSXEPPC2.js.map +7 -0
- package/packages/cli/dist/install-QHEBX7JH.js +7101 -0
- package/packages/cli/dist/install-QHEBX7JH.js.map +7 -0
- package/packages/cli/dist/list-DMOUATYI.js +327 -0
- package/packages/cli/dist/list-DMOUATYI.js.map +7 -0
- package/packages/cli/dist/list-UESSCB7Y.js +327 -0
- package/packages/cli/dist/list-UESSCB7Y.js.map +7 -0
- package/packages/cli/dist/list-XR7RSJFS.js +327 -0
- package/packages/cli/dist/list-XR7RSJFS.js.map +7 -0
- package/packages/cli/dist/login-EYZ2SOYZ.js +150 -0
- package/packages/cli/dist/login-EYZ2SOYZ.js.map +7 -0
- package/packages/cli/dist/login-JWCSTAEU.js +150 -0
- package/packages/cli/dist/login-JWCSTAEU.js.map +7 -0
- package/packages/cli/dist/login-NRKHXZKM.js +150 -0
- package/packages/cli/dist/login-NRKHXZKM.js.map +7 -0
- package/packages/cli/dist/logout-HDMYRXIE.js +40 -0
- package/packages/cli/dist/logout-HDMYRXIE.js.map +7 -0
- package/packages/cli/dist/logout-SYHXCVCQ.js +40 -0
- package/packages/cli/dist/logout-SYHXCVCQ.js.map +7 -0
- package/packages/cli/dist/logout-X3XUUOH5.js +40 -0
- package/packages/cli/dist/logout-X3XUUOH5.js.map +7 -0
- package/packages/cli/dist/new-3LTFKDTQ.js +277 -0
- package/packages/cli/dist/new-3LTFKDTQ.js.map +7 -0
- package/packages/cli/dist/new-F46OSD72.js +277 -0
- package/packages/cli/dist/new-F46OSD72.js.map +7 -0
- package/packages/cli/dist/new-OPCCLNL2.js +277 -0
- package/packages/cli/dist/new-OPCCLNL2.js.map +7 -0
- package/packages/cli/dist/package-marker-detector-T5O5YD2E.js +80 -0
- package/packages/cli/dist/package-marker-detector-T5O5YD2E.js.map +7 -0
- package/packages/cli/dist/package-yml-QWZIJDYU.js +16 -0
- package/packages/cli/dist/package-yml-QWZIJDYU.js.map +7 -0
- package/packages/cli/dist/plugin-naming-YP2I4NPA.js +29 -0
- package/packages/cli/dist/plugin-naming-YP2I4NPA.js.map +7 -0
- package/packages/cli/dist/publish-4H43PCSG.js +619 -0
- package/packages/cli/dist/publish-4H43PCSG.js.map +7 -0
- package/packages/cli/dist/publish-RULKLNUX.js +619 -0
- package/packages/cli/dist/publish-RULKLNUX.js.map +7 -0
- package/packages/cli/dist/publish-URWY2P3E.js +619 -0
- package/packages/cli/dist/publish-URWY2P3E.js.map +7 -0
- package/packages/cli/dist/remove-BD52BHR2.js +542 -0
- package/packages/cli/dist/remove-BD52BHR2.js.map +7 -0
- package/packages/cli/dist/remove-G5NRC7LD.js +542 -0
- package/packages/cli/dist/remove-G5NRC7LD.js.map +7 -0
- package/packages/cli/dist/remove-TC3FQUYQ.js +542 -0
- package/packages/cli/dist/remove-TC3FQUYQ.js.map +7 -0
- package/packages/cli/dist/resource-discoverer-4X4RY43E.js +17 -0
- package/packages/cli/dist/resource-discoverer-4X4RY43E.js.map +7 -0
- package/packages/cli/dist/save-24TESYKI.js +1728 -0
- package/packages/cli/dist/save-24TESYKI.js.map +7 -0
- package/packages/cli/dist/save-N3QWF2WN.js +1728 -0
- package/packages/cli/dist/save-N3QWF2WN.js.map +7 -0
- package/packages/cli/dist/save-P2U67DTV.js +1728 -0
- package/packages/cli/dist/save-P2U67DTV.js.map +7 -0
- package/packages/cli/dist/search-ABROK3UO.js +157 -0
- package/packages/cli/dist/search-ABROK3UO.js.map +7 -0
- package/packages/cli/dist/search-WVFXFNAV.js +157 -0
- package/packages/cli/dist/search-WVFXFNAV.js.map +7 -0
- package/packages/cli/dist/search-YQN2Q2SO.js +157 -0
- package/packages/cli/dist/search-YQN2Q2SO.js.map +7 -0
- package/packages/cli/dist/set-DCWF73F6.js +251 -0
- package/packages/cli/dist/set-DCWF73F6.js.map +7 -0
- package/packages/cli/dist/set-GJEG2F6Y.js +251 -0
- package/packages/cli/dist/set-GJEG2F6Y.js.map +7 -0
- package/packages/cli/dist/set-NGM2FIKF.js +251 -0
- package/packages/cli/dist/set-NGM2FIKF.js.map +7 -0
- package/packages/cli/dist/uninstall-3CJQMTYH.js +539 -0
- package/packages/cli/dist/uninstall-3CJQMTYH.js.map +7 -0
- package/packages/cli/dist/uninstall-Q3CP4UN5.js +539 -0
- package/packages/cli/dist/uninstall-Q3CP4UN5.js.map +7 -0
- package/packages/cli/dist/uninstall-QU5OMEEC.js +539 -0
- package/packages/cli/dist/uninstall-QU5OMEEC.js.map +7 -0
- package/packages/cli/dist/unpublish-GHJQYC4S.js +245 -0
- package/packages/cli/dist/unpublish-GHJQYC4S.js.map +7 -0
- package/packages/cli/dist/unpublish-L2CYMK4B.js +245 -0
- package/packages/cli/dist/unpublish-L2CYMK4B.js.map +7 -0
- package/packages/cli/dist/unpublish-VBTNTMS5.js +245 -0
- package/packages/cli/dist/unpublish-VBTNTMS5.js.map +7 -0
- package/packages/cli/dist/view-MXRBMXOG.js +488 -0
- package/packages/cli/dist/view-MXRBMXOG.js.map +7 -0
- package/packages/cli/dist/view-NMND7SAW.js +488 -0
- package/packages/cli/dist/view-NMND7SAW.js.map +7 -0
- package/packages/cli/dist/view-RPQRDSYB.js +488 -0
- package/packages/cli/dist/view-RPQRDSYB.js.map +7 -0
- package/packages/cli/package.json +2 -0
- package/packages/core/dist/constants/index.d.ts +9 -0
- package/packages/core/dist/constants/index.d.ts.map +1 -1
- package/packages/core/dist/constants/index.js +12 -0
- package/packages/core/dist/constants/index.js.map +1 -1
- package/packages/core/dist/core/dependency-resolver/index.d.ts +2 -10
- package/packages/core/dist/core/dependency-resolver/index.d.ts.map +1 -1
- package/packages/core/dist/core/dependency-resolver/index.js +3 -14
- package/packages/core/dist/core/dependency-resolver/index.js.map +1 -1
- package/packages/core/dist/core/install/base-detector.d.ts +2 -1
- package/packages/core/dist/core/install/base-detector.d.ts.map +1 -1
- package/packages/core/dist/core/install/base-detector.js +54 -1
- package/packages/core/dist/core/install/base-detector.js.map +1 -1
- package/packages/core/dist/core/install/conflicts/file-conflict-resolver.d.ts +7 -5
- package/packages/core/dist/core/install/conflicts/file-conflict-resolver.d.ts.map +1 -1
- package/packages/core/dist/core/install/conflicts/file-conflict-resolver.js +25 -9
- package/packages/core/dist/core/install/conflicts/file-conflict-resolver.js.map +1 -1
- package/packages/core/dist/core/install/flow-index-installer.d.ts +2 -1
- package/packages/core/dist/core/install/flow-index-installer.d.ts.map +1 -1
- package/packages/core/dist/core/install/flow-index-installer.js +19 -4
- package/packages/core/dist/core/install/flow-index-installer.js.map +1 -1
- package/packages/core/dist/core/install/input-classifier-base.js +3 -3
- package/packages/core/dist/core/install/input-classifier-base.js.map +1 -1
- package/packages/core/dist/core/install/install-reporting.d.ts.map +1 -1
- package/packages/core/dist/core/install/install-reporting.js +7 -9
- package/packages/core/dist/core/install/install-reporting.js.map +1 -1
- package/packages/core/dist/core/install/list-handler.d.ts.map +1 -1
- package/packages/core/dist/core/install/list-handler.js +3 -0
- package/packages/core/dist/core/install/list-handler.js.map +1 -1
- package/packages/core/dist/core/install/marketplace-handler.d.ts.map +1 -1
- package/packages/core/dist/core/install/marketplace-handler.js.map +1 -1
- package/packages/core/dist/core/install/operations/conflict-handler.d.ts +2 -1
- package/packages/core/dist/core/install/operations/conflict-handler.d.ts.map +1 -1
- package/packages/core/dist/core/install/operations/conflict-handler.js +2 -2
- package/packages/core/dist/core/install/operations/conflict-handler.js.map +1 -1
- package/packages/core/dist/core/install/operations/installation-executor.d.ts +3 -0
- package/packages/core/dist/core/install/operations/installation-executor.d.ts.map +1 -1
- package/packages/core/dist/core/install/operations/installation-executor.js +39 -22
- package/packages/core/dist/core/install/operations/installation-executor.js.map +1 -1
- package/packages/core/dist/core/install/orchestrator/orchestrator.d.ts +7 -3
- package/packages/core/dist/core/install/orchestrator/orchestrator.d.ts.map +1 -1
- package/packages/core/dist/core/install/orchestrator/orchestrator.js +193 -93
- package/packages/core/dist/core/install/orchestrator/orchestrator.js.map +1 -1
- package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.d.ts +1 -0
- package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.d.ts.map +1 -1
- package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.js +11 -24
- package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.js.map +1 -1
- package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.d.ts +2 -0
- package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.d.ts.map +1 -1
- package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.js +14 -14
- package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.js.map +1 -1
- package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.d.ts +7 -0
- package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.d.ts.map +1 -1
- package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.js +28 -0
- package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.js.map +1 -1
- package/packages/core/dist/core/install/orchestrator/types.d.ts +2 -0
- package/packages/core/dist/core/install/orchestrator/types.d.ts.map +1 -1
- package/packages/core/dist/core/install/path-package-loader.d.ts.map +1 -1
- package/packages/core/dist/core/install/path-package-loader.js +20 -1
- package/packages/core/dist/core/install/path-package-loader.js.map +1 -1
- package/packages/core/dist/core/install/platform-resolution.d.ts +3 -0
- package/packages/core/dist/core/install/platform-resolution.d.ts.map +1 -1
- package/packages/core/dist/core/install/platform-resolution.js +5 -2
- package/packages/core/dist/core/install/platform-resolution.js.map +1 -1
- package/packages/core/dist/core/install/preprocessing/context-population.d.ts +18 -0
- package/packages/core/dist/core/install/preprocessing/context-population.d.ts.map +1 -0
- package/packages/core/dist/core/install/preprocessing/context-population.js +36 -0
- package/packages/core/dist/core/install/preprocessing/context-population.js.map +1 -0
- package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.d.ts +23 -0
- package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.d.ts.map +1 -1
- package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.js +44 -0
- package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.js.map +1 -1
- package/packages/core/dist/core/install/sources/git-source.d.ts.map +1 -1
- package/packages/core/dist/core/install/sources/git-source.js +67 -4
- package/packages/core/dist/core/install/sources/git-source.js.map +1 -1
- package/packages/core/dist/core/install/sources/path-source.d.ts.map +1 -1
- package/packages/core/dist/core/install/sources/path-source.js +8 -0
- package/packages/core/dist/core/install/sources/path-source.js.map +1 -1
- package/packages/core/dist/core/install/strategies/flow-based-strategy.d.ts.map +1 -1
- package/packages/core/dist/core/install/strategies/flow-based-strategy.js +12 -5
- package/packages/core/dist/core/install/strategies/flow-based-strategy.js.map +1 -1
- package/packages/core/dist/core/install/strategies/types.d.ts +11 -1
- package/packages/core/dist/core/install/strategies/types.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/context-builders.d.ts +5 -0
- package/packages/core/dist/core/install/unified/context-builders.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/context-builders.js +12 -0
- package/packages/core/dist/core/install/unified/context-builders.js.map +1 -1
- package/packages/core/dist/core/install/unified/context-helpers.d.ts +0 -4
- package/packages/core/dist/core/install/unified/context-helpers.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/context-helpers.js +0 -24
- package/packages/core/dist/core/install/unified/context-helpers.js.map +1 -1
- package/packages/core/dist/core/install/unified/index.d.ts +1 -1
- package/packages/core/dist/core/install/unified/index.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/index.js +1 -1
- package/packages/core/dist/core/install/unified/index.js.map +1 -1
- package/packages/core/dist/core/install/unified/multi-context-pipeline.d.ts +6 -0
- package/packages/core/dist/core/install/unified/multi-context-pipeline.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/multi-context-pipeline.js +11 -4
- package/packages/core/dist/core/install/unified/multi-context-pipeline.js.map +1 -1
- package/packages/core/dist/core/install/unified/phases/conflicts.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/phases/conflicts.js +1 -1
- package/packages/core/dist/core/install/unified/phases/conflicts.js.map +1 -1
- package/packages/core/dist/core/install/unified/phases/execute.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/phases/execute.js +5 -5
- package/packages/core/dist/core/install/unified/phases/execute.js.map +1 -1
- package/packages/core/dist/core/install/unified/phases/load-package.js +3 -3
- package/packages/core/dist/core/install/unified/phases/load-package.js.map +1 -1
- package/packages/core/dist/core/install/unified/phases/report.js +1 -1
- package/packages/core/dist/core/install/unified/phases/report.js.map +1 -1
- package/packages/core/dist/core/install/unified/pipeline.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/pipeline.js +7 -10
- package/packages/core/dist/core/install/unified/pipeline.js.map +1 -1
- package/packages/core/dist/core/install/wave-resolver/content-root-cache.d.ts +24 -0
- package/packages/core/dist/core/install/wave-resolver/content-root-cache.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/content-root-cache.js +71 -0
- package/packages/core/dist/core/install/wave-resolver/content-root-cache.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/context-builder.d.ts +39 -0
- package/packages/core/dist/core/install/wave-resolver/context-builder.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/context-builder.js +148 -0
- package/packages/core/dist/core/install/wave-resolver/context-builder.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/fetcher.d.ts +49 -0
- package/packages/core/dist/core/install/wave-resolver/fetcher.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/fetcher.js +221 -0
- package/packages/core/dist/core/install/wave-resolver/fetcher.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/index-updater.d.ts +23 -0
- package/packages/core/dist/core/install/wave-resolver/index-updater.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/index-updater.js +87 -0
- package/packages/core/dist/core/install/wave-resolver/index-updater.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/index-write-collector.d.ts +101 -0
- package/packages/core/dist/core/install/wave-resolver/index-write-collector.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/index-write-collector.js +194 -0
- package/packages/core/dist/core/install/wave-resolver/index-write-collector.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/index.d.ts +17 -0
- package/packages/core/dist/core/install/wave-resolver/index.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/index.js +16 -0
- package/packages/core/dist/core/install/wave-resolver/index.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/manifest-reader.d.ts +34 -0
- package/packages/core/dist/core/install/wave-resolver/manifest-reader.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/manifest-reader.js +112 -0
- package/packages/core/dist/core/install/wave-resolver/manifest-reader.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/types.d.ts +210 -0
- package/packages/core/dist/core/install/wave-resolver/types.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/types.js +6 -0
- package/packages/core/dist/core/install/wave-resolver/types.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/version-solver.d.ts +65 -0
- package/packages/core/dist/core/install/wave-resolver/version-solver.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/version-solver.js +166 -0
- package/packages/core/dist/core/install/wave-resolver/version-solver.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/wave-engine.d.ts +16 -0
- package/packages/core/dist/core/install/wave-resolver/wave-engine.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/wave-engine.js +337 -0
- package/packages/core/dist/core/install/wave-resolver/wave-engine.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/wave-installer.d.ts +50 -0
- package/packages/core/dist/core/install/wave-resolver/wave-installer.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/wave-installer.js +246 -0
- package/packages/core/dist/core/install/wave-resolver/wave-installer.js.map +1 -0
- package/packages/core/dist/core/ports/buffered-output.d.ts +36 -0
- package/packages/core/dist/core/ports/buffered-output.d.ts.map +1 -0
- package/packages/core/dist/core/ports/buffered-output.js +89 -0
- package/packages/core/dist/core/ports/buffered-output.js.map +1 -0
- package/packages/core/dist/core/ports/resolve.d.ts +0 -13
- package/packages/core/dist/core/ports/resolve.d.ts.map +1 -1
- package/packages/core/dist/core/ports/resolve.js +0 -28
- package/packages/core/dist/core/ports/resolve.js.map +1 -1
- package/packages/core/dist/core/remove/removal-confirmation.d.ts +4 -1
- package/packages/core/dist/core/remove/removal-confirmation.d.ts.map +1 -1
- package/packages/core/dist/core/remove/removal-confirmation.js +5 -4
- package/packages/core/dist/core/remove/removal-confirmation.js.map +1 -1
- package/packages/core/dist/core/remove/remove-from-source-pipeline.d.ts.map +1 -1
- package/packages/core/dist/core/remove/remove-from-source-pipeline.js +1 -10
- package/packages/core/dist/core/remove/remove-from-source-pipeline.js.map +1 -1
- package/packages/core/dist/core/uninstall/uninstall-executor.js +1 -1
- package/packages/core/dist/core/uninstall/uninstall-executor.js.map +1 -1
- package/packages/core/dist/core/uninstall/uninstall-reporter.d.ts +2 -2
- package/packages/core/dist/core/uninstall/uninstall-reporter.d.ts.map +1 -1
- package/packages/core/dist/core/uninstall/uninstall-reporter.js +4 -4
- package/packages/core/dist/core/uninstall/uninstall-reporter.js.map +1 -1
- package/packages/core/dist/index.d.ts +1 -1
- package/packages/core/dist/index.d.ts.map +1 -1
- package/packages/core/dist/types/execution-context.d.ts +40 -10
- package/packages/core/dist/types/execution-context.d.ts.map +1 -1
- package/packages/core/dist/utils/concurrency-pool.d.ts +34 -0
- package/packages/core/dist/utils/concurrency-pool.d.ts.map +1 -0
- package/packages/core/dist/utils/concurrency-pool.js +58 -0
- package/packages/core/dist/utils/concurrency-pool.js.map +1 -0
- package/packages/core/dist/utils/plugin-naming.d.ts +11 -3
- package/packages/core/dist/utils/plugin-naming.d.ts.map +1 -1
- package/packages/core/dist/utils/plugin-naming.js +27 -7
- package/packages/core/dist/utils/plugin-naming.js.map +1 -1
- package/plans/wave-resolver.md +254 -0
- package/.claude/agents/essentials/code-simplifier.md +0 -52
- package/.claude/commands/essentials/cleanup.md +0 -1
- package/.claude/commands/essentials/review.md +0 -8
- package/.claude/commands/git/commit.md +0 -5
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
getCurrentUsername
|
|
4
|
+
} from "./chunk-EGAP6GNA.js";
|
|
5
|
+
import {
|
|
6
|
+
createHttpClient
|
|
7
|
+
} from "./chunk-ATYT3SA6.js";
|
|
8
|
+
import {
|
|
9
|
+
authManager
|
|
10
|
+
} from "./chunk-UR6VJWA3.js";
|
|
11
|
+
import {
|
|
12
|
+
profileManager
|
|
13
|
+
} from "./chunk-S6OARUVQ.js";
|
|
14
|
+
import "./chunk-PXL2RUMX.js";
|
|
15
|
+
import {
|
|
16
|
+
createCliExecutionContext,
|
|
17
|
+
resolveOutput
|
|
18
|
+
} from "./chunk-RAKMX654.js";
|
|
19
|
+
import "./chunk-XEPVYZO3.js";
|
|
20
|
+
import "./chunk-VN22A7NW.js";
|
|
21
|
+
import "./chunk-J4IFFBLP.js";
|
|
22
|
+
import "./chunk-S47F4OG4.js";
|
|
23
|
+
import {
|
|
24
|
+
UserCancellationError
|
|
25
|
+
} from "./chunk-ID4SVDQZ.js";
|
|
26
|
+
import {
|
|
27
|
+
logger
|
|
28
|
+
} from "./chunk-5EFWGD33.js";
|
|
29
|
+
|
|
30
|
+
// ../core/src/core/device-auth.ts
|
|
31
|
+
import { spawn } from "child_process";
|
|
32
|
+
var POLL_SLOWDOWN_SECONDS = 5;
|
|
33
|
+
async function startDeviceAuthorization() {
|
|
34
|
+
let response = await (await createHttpClient()).post(
|
|
35
|
+
"/auth/device/authorize",
|
|
36
|
+
{ clientId: "opkg-cli", scope: "openid", deviceName: "opkg-cli" },
|
|
37
|
+
{ headers: { "Content-Type": "application/json" }, skipAuth: !0, timeout: 3e4 }
|
|
38
|
+
);
|
|
39
|
+
return {
|
|
40
|
+
deviceCode: response.device_code,
|
|
41
|
+
userCode: response.user_code,
|
|
42
|
+
verificationUri: response.verification_uri,
|
|
43
|
+
verificationUriComplete: response.verification_uri_complete,
|
|
44
|
+
expiresIn: response.expires_in,
|
|
45
|
+
interval: response.interval
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async function pollForDeviceToken(params) {
|
|
49
|
+
let client = await createHttpClient(), expiresAt = Date.now() + params.expiresInSeconds * 1e3, intervalMs = params.intervalSeconds * 1e3;
|
|
50
|
+
for (; Date.now() < expiresAt; ) {
|
|
51
|
+
if (params.signal?.aborted)
|
|
52
|
+
throw new Error("Login cancelled.");
|
|
53
|
+
try {
|
|
54
|
+
let tokenResponse = await client.post(
|
|
55
|
+
"/auth/device/token",
|
|
56
|
+
{ deviceCode: params.deviceCode },
|
|
57
|
+
{ headers: { "Content-Type": "application/json" }, skipAuth: !0, timeout: 3e4 }
|
|
58
|
+
);
|
|
59
|
+
return {
|
|
60
|
+
apiKey: tokenResponse.apiKey,
|
|
61
|
+
keyPrefix: tokenResponse.keyPrefix,
|
|
62
|
+
expiresAt: tokenResponse.expiresAt,
|
|
63
|
+
userId: tokenResponse.userId,
|
|
64
|
+
username: tokenResponse.username
|
|
65
|
+
};
|
|
66
|
+
} catch (error) {
|
|
67
|
+
let code = error?.apiError?.error || "authorization_pending";
|
|
68
|
+
if (code !== "authorization_pending")
|
|
69
|
+
if (code === "slow_down")
|
|
70
|
+
intervalMs += POLL_SLOWDOWN_SECONDS * 1e3;
|
|
71
|
+
else throw code === "expired_token" ? new Error('Device code expired. Please run "opkg login" again.') : code === "access_denied" ? new Error("Access denied. Please restart the login flow.") : error;
|
|
72
|
+
}
|
|
73
|
+
await wait(intervalMs, params.signal);
|
|
74
|
+
}
|
|
75
|
+
throw new Error('Device code expired. Please run "opkg login" again.');
|
|
76
|
+
}
|
|
77
|
+
async function persistTokens(profileName, tokens) {
|
|
78
|
+
await profileManager.setProfileCredentials(profileName, { api_key: tokens.apiKey });
|
|
79
|
+
}
|
|
80
|
+
function openBrowser(url) {
|
|
81
|
+
let platform = process.platform, command = "";
|
|
82
|
+
platform === "darwin" ? command = "open" : platform === "win32" ? command = "start" : command = "xdg-open";
|
|
83
|
+
try {
|
|
84
|
+
spawn(command, [url], { stdio: "ignore", detached: !0 }).unref();
|
|
85
|
+
} catch (error) {
|
|
86
|
+
logger.debug("Failed to open browser automatically", { error, url });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function wait(ms, signal) {
|
|
90
|
+
return new Promise((resolve, reject) => {
|
|
91
|
+
if (signal?.aborted) {
|
|
92
|
+
reject(new Error("Login cancelled."));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
let timer = setTimeout(resolve, ms), onAbort = () => {
|
|
96
|
+
clearTimeout(timer), reject(new Error("Login cancelled."));
|
|
97
|
+
};
|
|
98
|
+
signal?.addEventListener("abort", onAbort, { once: !0 });
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// src/commands/login.ts
|
|
103
|
+
async function setupLoginCommand(args) {
|
|
104
|
+
let [options] = args, ctx = await createCliExecutionContext(), out = resolveOutput(ctx), profileName = authManager.getCurrentProfile({
|
|
105
|
+
profile: options.profile
|
|
106
|
+
});
|
|
107
|
+
out.info(`Using profile: ${profileName}`);
|
|
108
|
+
let authorization = await startDeviceAuthorization();
|
|
109
|
+
out.info(`A browser will open for you to confirm sign-in.
|
|
110
|
+
|
|
111
|
+
User code: ${authorization.userCode}
|
|
112
|
+
Verification URL: ${authorization.verificationUri}`), out.info("If the browser does not open, visit the URL and enter the code above."), openBrowser(authorization.verificationUriComplete);
|
|
113
|
+
let abortController = new AbortController(), cleanupKeyListener = setupCancelListener(abortController);
|
|
114
|
+
try {
|
|
115
|
+
let tokens = await pollForDeviceToken({
|
|
116
|
+
deviceCode: authorization.deviceCode,
|
|
117
|
+
intervalSeconds: authorization.interval,
|
|
118
|
+
expiresInSeconds: authorization.expiresIn,
|
|
119
|
+
signal: abortController.signal
|
|
120
|
+
});
|
|
121
|
+
cleanupKeyListener(), await persistTokens(profileName, tokens);
|
|
122
|
+
let username = tokens.username ?? await resolveUsername(tokens.apiKey);
|
|
123
|
+
username ? (await profileManager.setProfileDefaultScope(profileName, `@${username}`), out.success(`Default scope set to @${username} for profile "${profileName}".`)) : logger.debug("Could not derive username from API key; default scope not set"), out.success("Login successful."), out.success(`API key stored for profile "${profileName}".`);
|
|
124
|
+
} catch (error) {
|
|
125
|
+
throw cleanupKeyListener(), abortController.signal.aborted ? (out.warn("Operation cancelled."), new UserCancellationError("Operation cancelled by user")) : (logger.debug("Device login failed", { error }), error);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function setupCancelListener(abortController) {
|
|
129
|
+
let stdin = process.stdin, wasRaw = stdin.isRaw, wasListening = stdin.listenerCount("data") > 0;
|
|
130
|
+
stdin.isTTY && (stdin.setRawMode(!0), stdin.resume());
|
|
131
|
+
let onData = (data) => {
|
|
132
|
+
let key = data.toString();
|
|
133
|
+
(key === "\x1B" || key === "") && abortController.abort();
|
|
134
|
+
};
|
|
135
|
+
return stdin.on("data", onData), () => {
|
|
136
|
+
stdin.off("data", onData), stdin.isTTY && (stdin.setRawMode(wasRaw ?? !1), wasListening || stdin.pause());
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
async function resolveUsername(apiKey) {
|
|
140
|
+
try {
|
|
141
|
+
return await getCurrentUsername({ apiKey });
|
|
142
|
+
} catch (error) {
|
|
143
|
+
logger.debug("Unable to resolve username from API key", { error });
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
export {
|
|
148
|
+
setupLoginCommand
|
|
149
|
+
};
|
|
150
|
+
//# sourceMappingURL=login-JWCSTAEU.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../core/src/core/device-auth.ts", "../src/commands/login.ts"],
|
|
4
|
+
"sourcesContent": ["import { spawn } from 'child_process';\nimport { logger } from '../utils/logger.js';\nimport { createHttpClient } from './http-client.js';\nimport { profileManager } from './profiles.js';\n\nexport type DeviceAuthorizationStart = {\n\tdeviceCode: string;\n\tuserCode: string;\n\tverificationUri: string;\n\tverificationUriComplete: string;\n\texpiresIn: number;\n\tinterval: number;\n};\n\nexport type DeviceTokenResult = {\n\tapiKey: string;\n\tkeyPrefix?: string;\n\texpiresAt?: string;\n\tuserId: string;\n\tusername?: string;\n};\n\nconst POLL_SLOWDOWN_SECONDS = 5;\n\nexport async function startDeviceAuthorization(): Promise<DeviceAuthorizationStart> {\n\tconst client = await createHttpClient();\n\tconst response = await client.post<{\n\t\tdevice_code: string;\n\t\tuser_code: string;\n\t\tverification_uri: string;\n\t\tverification_uri_complete: string;\n\t\texpires_in: number;\n\t\tinterval: number;\n\t}>(\n\t\t'/auth/device/authorize',\n\t\t{ clientId: 'opkg-cli', scope: 'openid', deviceName: 'opkg-cli' },\n\t\t{ headers: { 'Content-Type': 'application/json' }, skipAuth: true, timeout: 30000 }\n\t);\n\n\treturn {\n\t\tdeviceCode: response.device_code,\n\t\tuserCode: response.user_code,\n\t\tverificationUri: response.verification_uri,\n\t\tverificationUriComplete: response.verification_uri_complete,\n\t\texpiresIn: response.expires_in,\n\t\tinterval: response.interval,\n\t};\n}\n\nexport async function pollForDeviceToken(params: {\n\tdeviceCode: string;\n\tintervalSeconds: number;\n\texpiresInSeconds: number;\n\tsignal?: AbortSignal;\n}): Promise<DeviceTokenResult> {\n\tconst client = await createHttpClient();\n\tconst expiresAt = Date.now() + params.expiresInSeconds * 1000;\n\tlet intervalMs = params.intervalSeconds * 1000;\n\n\twhile (Date.now() < expiresAt) {\n\t\tif (params.signal?.aborted) {\n\t\t\tthrow new Error('Login cancelled.');\n\t\t}\n\n\t\ttry {\n\t\t\tconst tokenResponse = await client.post<{\n\t\t\t\tapiKey: string;\n\t\t\t\tkeyPrefix?: string;\n\t\t\t\texpiresAt?: string;\n\t\t\t\tuserId: string;\n\t\t\t\tusername?: string;\n\t\t\t}>(\n\t\t\t\t'/auth/device/token',\n\t\t\t\t{ deviceCode: params.deviceCode },\n\t\t\t\t{ headers: { 'Content-Type': 'application/json' }, skipAuth: true, timeout: 30000 }\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tapiKey: tokenResponse.apiKey,\n\t\t\t\tkeyPrefix: tokenResponse.keyPrefix,\n\t\t\t\texpiresAt: tokenResponse.expiresAt,\n\t\t\t\tuserId: tokenResponse.userId,\n\t\t\t\tusername: tokenResponse.username,\n\t\t\t};\n\t\t} catch (error: any) {\n\t\t\tconst apiError = error?.apiError?.error as string | undefined;\n\t\t\tconst code = apiError || 'authorization_pending';\n\t\t\tif (code === 'authorization_pending') {\n\t\t\t\t// continue polling\n\t\t\t} else if (code === 'slow_down') {\n\t\t\t\tintervalMs += POLL_SLOWDOWN_SECONDS * 1000;\n\t\t\t} else if (code === 'expired_token') {\n\t\t\t\tthrow new Error('Device code expired. Please run \"opkg login\" again.');\n\t\t\t} else if (code === 'access_denied') {\n\t\t\t\tthrow new Error('Access denied. Please restart the login flow.');\n\t\t\t} else {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tawait wait(intervalMs, params.signal);\n\t}\n\n\tthrow new Error('Device code expired. Please run \"opkg login\" again.');\n}\n\nexport async function persistTokens(\n\tprofileName: string,\n\ttokens: DeviceTokenResult\n): Promise<void> {\n\tawait profileManager.setProfileCredentials(profileName, { api_key: tokens.apiKey });\n}\n\nexport function openBrowser(url: string): void {\n\tconst platform = process.platform;\n\tlet command = '';\n\n\tif (platform === 'darwin') {\n\t\tcommand = 'open';\n\t} else if (platform === 'win32') {\n\t\tcommand = 'start';\n\t} else {\n\t\tcommand = 'xdg-open';\n\t}\n\n\ttry {\n\t\tspawn(command, [url], { stdio: 'ignore', detached: true }).unref();\n\t} catch (error) {\n\t\tlogger.debug('Failed to open browser automatically', { error, url });\n\t}\n}\n\nfunction wait(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(new Error('Login cancelled.'));\n\t\t\treturn;\n\t\t}\n\n\t\tconst timer = setTimeout(resolve, ms);\n\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timer);\n\t\t\treject(new Error('Login cancelled.'));\n\t\t};\n\n\t\tsignal?.addEventListener('abort', onAbort, { once: true });\n\t});\n}\n\n", "import { authManager } from '@opkg/core/core/auth.js';\nimport {\n\tstartDeviceAuthorization,\n\tpollForDeviceToken,\n\tpersistTokens,\n\topenBrowser,\n} from '@opkg/core/core/device-auth.js';\nimport { profileManager } from '@opkg/core/core/profiles.js';\nimport { logger } from '@opkg/core/utils/logger.js';\nimport { UserCancellationError } from '@opkg/core/utils/errors.js';\nimport { getCurrentUsername } from '@opkg/core/core/api-keys.js';\nimport { createCliExecutionContext } from '../cli/context.js';\nimport { resolveOutput } from '@opkg/core/core/ports/resolve.js';\n\ntype LoginOptions = {\n\tprofile?: string;\n};\n\nexport async function setupLoginCommand(args: any[]): Promise<void> {\n\tconst [options] = args as [LoginOptions];\n\tconst ctx = await createCliExecutionContext();\n\tconst out = resolveOutput(ctx);\n\n\tconst profileName = authManager.getCurrentProfile({\n\t\tprofile: options.profile,\n\t});\n\n\tout.info(`Using profile: ${profileName}`);\n\n\tconst authorization = await startDeviceAuthorization();\n\n\tout.info(`A browser will open for you to confirm sign-in.\\n\\nUser code: ${authorization.userCode}\\nVerification URL: ${authorization.verificationUri}`);\n\tout.info('If the browser does not open, visit the URL and enter the code above.');\n\n\topenBrowser(authorization.verificationUriComplete);\n\n\tconst abortController = new AbortController();\n\tconst cleanupKeyListener = setupCancelListener(abortController);\n\n\ttry {\n\t\tconst tokens = await pollForDeviceToken({\n\t\t\tdeviceCode: authorization.deviceCode,\n\t\t\tintervalSeconds: authorization.interval,\n\t\t\texpiresInSeconds: authorization.expiresIn,\n\t\t\tsignal: abortController.signal,\n\t\t});\n\n\t\tcleanupKeyListener();\n\n\t\tawait persistTokens(profileName, tokens);\n\n\t\tconst username = tokens.username ?? (await resolveUsername(tokens.apiKey));\n\t\tif (username) {\n\t\t\tawait profileManager.setProfileDefaultScope(profileName, `@${username}`);\n\t\t\tout.success(`Default scope set to @${username} for profile \"${profileName}\".`);\n\t\t} else {\n\t\t\tlogger.debug('Could not derive username from API key; default scope not set');\n\t\t}\n\n\t\tout.success('Login successful.');\n\t\tout.success(`API key stored for profile \"${profileName}\".`);\n\t} catch (error: any) {\n\t\tcleanupKeyListener();\n\t\tif (abortController.signal.aborted) {\n\t\t\tout.warn('Operation cancelled.');\n\t\t\tthrow new UserCancellationError('Operation cancelled by user');\n\t\t}\n\t\tlogger.debug('Device login failed', { error });\n\t\tthrow error;\n\t}\n}\n\nfunction setupCancelListener(abortController: AbortController): () => void {\n\tconst stdin = process.stdin;\n\tconst wasRaw = stdin.isRaw;\n\tconst wasListening = stdin.listenerCount('data') > 0;\n\n\tif (stdin.isTTY) {\n\t\tstdin.setRawMode(true);\n\t\tstdin.resume();\n\t}\n\n\tconst onData = (data: Buffer) => {\n\t\tconst key = data.toString();\n\t\t// Escape key (\\x1b without [ following, i.e. bare escape)\n\t\tif (key === '\\x1b' || key === '\\x03') {\n\t\t\tabortController.abort();\n\t\t}\n\t};\n\n\tstdin.on('data', onData);\n\n\treturn () => {\n\t\tstdin.off('data', onData);\n\t\tif (stdin.isTTY) {\n\t\t\tstdin.setRawMode(wasRaw ?? false);\n\t\t\tif (!wasListening) {\n\t\t\t\tstdin.pause();\n\t\t\t}\n\t\t}\n\t};\n}\n\nasync function resolveUsername(apiKey: string): Promise<string | undefined> {\n\ttry {\n\t\treturn await getCurrentUsername({ apiKey });\n\t} catch (error) {\n\t\tlogger.debug('Unable to resolve username from API key', { error });\n\t\treturn undefined;\n\t}\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAa;AAsBtB,IAAM,wBAAwB;AAE9B,eAAsB,2BAA8D;AAEnF,MAAM,WAAW,OADF,MAAM,iBAAiB,GACR;AAAA,IAQ7B;AAAA,IACA,EAAE,UAAU,YAAY,OAAO,UAAU,YAAY,WAAW;AAAA,IAChE,EAAE,SAAS,EAAE,gBAAgB,mBAAmB,GAAG,UAAU,IAAM,SAAS,IAAM;AAAA,EACnF;AAEA,SAAO;AAAA,IACN,YAAY,SAAS;AAAA,IACrB,UAAU,SAAS;AAAA,IACnB,iBAAiB,SAAS;AAAA,IAC1B,yBAAyB,SAAS;AAAA,IAClC,WAAW,SAAS;AAAA,IACpB,UAAU,SAAS;AAAA,EACpB;AACD;AAEA,eAAsB,mBAAmB,QAKV;AAC9B,MAAM,SAAS,MAAM,iBAAiB,GAChC,YAAY,KAAK,IAAI,IAAI,OAAO,mBAAmB,KACrD,aAAa,OAAO,kBAAkB;AAE1C,SAAO,KAAK,IAAI,IAAI,aAAW;AAC9B,QAAI,OAAO,QAAQ;AAClB,YAAM,IAAI,MAAM,kBAAkB;AAGnC,QAAI;AACH,UAAM,gBAAgB,MAAM,OAAO;AAAA,QAOlC;AAAA,QACA,EAAE,YAAY,OAAO,WAAW;AAAA,QAChC,EAAE,SAAS,EAAE,gBAAgB,mBAAmB,GAAG,UAAU,IAAM,SAAS,IAAM;AAAA,MACnF;AAEA,aAAO;AAAA,QACN,QAAQ,cAAc;AAAA,QACtB,WAAW,cAAc;AAAA,QACzB,WAAW,cAAc;AAAA,QACzB,QAAQ,cAAc;AAAA,QACtB,UAAU,cAAc;AAAA,MACzB;AAAA,IACD,SAAS,OAAY;AAEpB,UAAM,OADW,OAAO,UAAU,SACT;AACzB,UAAI,SAAS;AAEN,YAAI,SAAS;AACnB,wBAAc,wBAAwB;AAAA,YAChC,OAAI,SAAS,kBACb,IAAI,MAAM,qDAAqD,IAC3D,SAAS,kBACb,IAAI,MAAM,+CAA+C,IAEzD;AAAA,IAER;AAEA,UAAM,KAAK,YAAY,OAAO,MAAM;AAAA,EACrC;AAEA,QAAM,IAAI,MAAM,qDAAqD;AACtE;AAEA,eAAsB,cACrB,aACA,QACgB;AAChB,QAAM,eAAe,sBAAsB,aAAa,EAAE,SAAS,OAAO,OAAO,CAAC;AACnF;AAEO,SAAS,YAAY,KAAmB;AAC9C,MAAM,WAAW,QAAQ,UACrB,UAAU;AAEd,EAAI,aAAa,WAChB,UAAU,SACA,aAAa,UACvB,UAAU,UAEV,UAAU;AAGX,MAAI;AACH,UAAM,SAAS,CAAC,GAAG,GAAG,EAAE,OAAO,UAAU,UAAU,GAAK,CAAC,EAAE,MAAM;AAAA,EAClE,SAAS,OAAO;AACf,WAAO,MAAM,wCAAwC,EAAE,OAAO,IAAI,CAAC;AAAA,EACpE;AACD;AAEA,SAAS,KAAK,IAAY,QAAqC;AAC9D,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACvC,QAAI,QAAQ,SAAS;AACpB,aAAO,IAAI,MAAM,kBAAkB,CAAC;AACpC;AAAA,IACD;AAEA,QAAM,QAAQ,WAAW,SAAS,EAAE,GAE9B,UAAU,MAAM;AACrB,mBAAa,KAAK,GAClB,OAAO,IAAI,MAAM,kBAAkB,CAAC;AAAA,IACrC;AAEA,YAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,GAAK,CAAC;AAAA,EAC1D,CAAC;AACF;;;AClIA,eAAsB,kBAAkB,MAA4B;AACnE,MAAM,CAAC,OAAO,IAAI,MACZ,MAAM,MAAM,0BAA0B,GACtC,MAAM,cAAc,GAAG,GAEvB,cAAc,YAAY,kBAAkB;AAAA,IACjD,SAAS,QAAQ;AAAA,EAClB,CAAC;AAED,MAAI,KAAK,kBAAkB,WAAW,EAAE;AAExC,MAAM,gBAAgB,MAAM,yBAAyB;AAErD,MAAI,KAAK;AAAA;AAAA,aAAiE,cAAc,QAAQ;AAAA,oBAAuB,cAAc,eAAe,EAAE,GACtJ,IAAI,KAAK,uEAAuE,GAEhF,YAAY,cAAc,uBAAuB;AAEjD,MAAM,kBAAkB,IAAI,gBAAgB,GACtC,qBAAqB,oBAAoB,eAAe;AAE9D,MAAI;AACH,QAAM,SAAS,MAAM,mBAAmB;AAAA,MACvC,YAAY,cAAc;AAAA,MAC1B,iBAAiB,cAAc;AAAA,MAC/B,kBAAkB,cAAc;AAAA,MAChC,QAAQ,gBAAgB;AAAA,IACzB,CAAC;AAED,uBAAmB,GAEnB,MAAM,cAAc,aAAa,MAAM;AAEvC,QAAM,WAAW,OAAO,YAAa,MAAM,gBAAgB,OAAO,MAAM;AACxE,IAAI,YACH,MAAM,eAAe,uBAAuB,aAAa,IAAI,QAAQ,EAAE,GACvE,IAAI,QAAQ,yBAAyB,QAAQ,iBAAiB,WAAW,IAAI,KAE7E,OAAO,MAAM,+DAA+D,GAG7E,IAAI,QAAQ,mBAAmB,GAC/B,IAAI,QAAQ,+BAA+B,WAAW,IAAI;AAAA,EAC3D,SAAS,OAAY;AAEpB,UADA,mBAAmB,GACf,gBAAgB,OAAO,WAC1B,IAAI,KAAK,sBAAsB,GACzB,IAAI,sBAAsB,6BAA6B,MAE9D,OAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,GACvC;AAAA,EACP;AACD;AAEA,SAAS,oBAAoB,iBAA8C;AAC1E,MAAM,QAAQ,QAAQ,OAChB,SAAS,MAAM,OACf,eAAe,MAAM,cAAc,MAAM,IAAI;AAEnD,EAAI,MAAM,UACT,MAAM,WAAW,EAAI,GACrB,MAAM,OAAO;AAGd,MAAM,SAAS,CAAC,SAAiB;AAChC,QAAM,MAAM,KAAK,SAAS;AAE1B,KAAI,QAAQ,UAAU,QAAQ,QAC7B,gBAAgB,MAAM;AAAA,EAExB;AAEA,eAAM,GAAG,QAAQ,MAAM,GAEhB,MAAM;AACZ,UAAM,IAAI,QAAQ,MAAM,GACpB,MAAM,UACT,MAAM,WAAW,UAAU,EAAK,GAC3B,gBACJ,MAAM,MAAM;AAAA,EAGf;AACD;AAEA,eAAe,gBAAgB,QAA6C;AAC3E,MAAI;AACH,WAAO,MAAM,mBAAmB,EAAE,OAAO,CAAC;AAAA,EAC3C,SAAS,OAAO;AACf,WAAO,MAAM,2CAA2C,EAAE,MAAM,CAAC;AACjE;AAAA,EACD;AACD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
getCurrentUsername
|
|
4
|
+
} from "./chunk-EGAP6GNA.js";
|
|
5
|
+
import {
|
|
6
|
+
createHttpClient
|
|
7
|
+
} from "./chunk-ATYT3SA6.js";
|
|
8
|
+
import {
|
|
9
|
+
authManager
|
|
10
|
+
} from "./chunk-UR6VJWA3.js";
|
|
11
|
+
import {
|
|
12
|
+
profileManager
|
|
13
|
+
} from "./chunk-S6OARUVQ.js";
|
|
14
|
+
import "./chunk-PXL2RUMX.js";
|
|
15
|
+
import {
|
|
16
|
+
createCliExecutionContext,
|
|
17
|
+
resolveOutput
|
|
18
|
+
} from "./chunk-BROJ6OUT.js";
|
|
19
|
+
import "./chunk-XEPVYZO3.js";
|
|
20
|
+
import "./chunk-VN22A7NW.js";
|
|
21
|
+
import "./chunk-J4IFFBLP.js";
|
|
22
|
+
import "./chunk-S47F4OG4.js";
|
|
23
|
+
import {
|
|
24
|
+
UserCancellationError
|
|
25
|
+
} from "./chunk-ID4SVDQZ.js";
|
|
26
|
+
import {
|
|
27
|
+
logger
|
|
28
|
+
} from "./chunk-5EFWGD33.js";
|
|
29
|
+
|
|
30
|
+
// ../core/src/core/device-auth.ts
|
|
31
|
+
import { spawn } from "child_process";
|
|
32
|
+
var POLL_SLOWDOWN_SECONDS = 5;
|
|
33
|
+
async function startDeviceAuthorization() {
|
|
34
|
+
let response = await (await createHttpClient()).post(
|
|
35
|
+
"/auth/device/authorize",
|
|
36
|
+
{ clientId: "opkg-cli", scope: "openid", deviceName: "opkg-cli" },
|
|
37
|
+
{ headers: { "Content-Type": "application/json" }, skipAuth: !0, timeout: 3e4 }
|
|
38
|
+
);
|
|
39
|
+
return {
|
|
40
|
+
deviceCode: response.device_code,
|
|
41
|
+
userCode: response.user_code,
|
|
42
|
+
verificationUri: response.verification_uri,
|
|
43
|
+
verificationUriComplete: response.verification_uri_complete,
|
|
44
|
+
expiresIn: response.expires_in,
|
|
45
|
+
interval: response.interval
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async function pollForDeviceToken(params) {
|
|
49
|
+
let client = await createHttpClient(), expiresAt = Date.now() + params.expiresInSeconds * 1e3, intervalMs = params.intervalSeconds * 1e3;
|
|
50
|
+
for (; Date.now() < expiresAt; ) {
|
|
51
|
+
if (params.signal?.aborted)
|
|
52
|
+
throw new Error("Login cancelled.");
|
|
53
|
+
try {
|
|
54
|
+
let tokenResponse = await client.post(
|
|
55
|
+
"/auth/device/token",
|
|
56
|
+
{ deviceCode: params.deviceCode },
|
|
57
|
+
{ headers: { "Content-Type": "application/json" }, skipAuth: !0, timeout: 3e4 }
|
|
58
|
+
);
|
|
59
|
+
return {
|
|
60
|
+
apiKey: tokenResponse.apiKey,
|
|
61
|
+
keyPrefix: tokenResponse.keyPrefix,
|
|
62
|
+
expiresAt: tokenResponse.expiresAt,
|
|
63
|
+
userId: tokenResponse.userId,
|
|
64
|
+
username: tokenResponse.username
|
|
65
|
+
};
|
|
66
|
+
} catch (error) {
|
|
67
|
+
let code = error?.apiError?.error || "authorization_pending";
|
|
68
|
+
if (code !== "authorization_pending")
|
|
69
|
+
if (code === "slow_down")
|
|
70
|
+
intervalMs += POLL_SLOWDOWN_SECONDS * 1e3;
|
|
71
|
+
else throw code === "expired_token" ? new Error('Device code expired. Please run "opkg login" again.') : code === "access_denied" ? new Error("Access denied. Please restart the login flow.") : error;
|
|
72
|
+
}
|
|
73
|
+
await wait(intervalMs, params.signal);
|
|
74
|
+
}
|
|
75
|
+
throw new Error('Device code expired. Please run "opkg login" again.');
|
|
76
|
+
}
|
|
77
|
+
async function persistTokens(profileName, tokens) {
|
|
78
|
+
await profileManager.setProfileCredentials(profileName, { api_key: tokens.apiKey });
|
|
79
|
+
}
|
|
80
|
+
function openBrowser(url) {
|
|
81
|
+
let platform = process.platform, command = "";
|
|
82
|
+
platform === "darwin" ? command = "open" : platform === "win32" ? command = "start" : command = "xdg-open";
|
|
83
|
+
try {
|
|
84
|
+
spawn(command, [url], { stdio: "ignore", detached: !0 }).unref();
|
|
85
|
+
} catch (error) {
|
|
86
|
+
logger.debug("Failed to open browser automatically", { error, url });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function wait(ms, signal) {
|
|
90
|
+
return new Promise((resolve, reject) => {
|
|
91
|
+
if (signal?.aborted) {
|
|
92
|
+
reject(new Error("Login cancelled."));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
let timer = setTimeout(resolve, ms), onAbort = () => {
|
|
96
|
+
clearTimeout(timer), reject(new Error("Login cancelled."));
|
|
97
|
+
};
|
|
98
|
+
signal?.addEventListener("abort", onAbort, { once: !0 });
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// src/commands/login.ts
|
|
103
|
+
async function setupLoginCommand(args) {
|
|
104
|
+
let [options] = args, ctx = await createCliExecutionContext(), out = resolveOutput(ctx), profileName = authManager.getCurrentProfile({
|
|
105
|
+
profile: options.profile
|
|
106
|
+
});
|
|
107
|
+
out.info(`Using profile: ${profileName}`);
|
|
108
|
+
let authorization = await startDeviceAuthorization();
|
|
109
|
+
out.info(`A browser will open for you to confirm sign-in.
|
|
110
|
+
|
|
111
|
+
User code: ${authorization.userCode}
|
|
112
|
+
Verification URL: ${authorization.verificationUri}`), out.info("If the browser does not open, visit the URL and enter the code above."), openBrowser(authorization.verificationUriComplete);
|
|
113
|
+
let abortController = new AbortController(), cleanupKeyListener = setupCancelListener(abortController);
|
|
114
|
+
try {
|
|
115
|
+
let tokens = await pollForDeviceToken({
|
|
116
|
+
deviceCode: authorization.deviceCode,
|
|
117
|
+
intervalSeconds: authorization.interval,
|
|
118
|
+
expiresInSeconds: authorization.expiresIn,
|
|
119
|
+
signal: abortController.signal
|
|
120
|
+
});
|
|
121
|
+
cleanupKeyListener(), await persistTokens(profileName, tokens);
|
|
122
|
+
let username = tokens.username ?? await resolveUsername(tokens.apiKey);
|
|
123
|
+
username ? (await profileManager.setProfileDefaultScope(profileName, `@${username}`), out.success(`Default scope set to @${username} for profile "${profileName}".`)) : logger.debug("Could not derive username from API key; default scope not set"), out.success("Login successful."), out.success(`API key stored for profile "${profileName}".`);
|
|
124
|
+
} catch (error) {
|
|
125
|
+
throw cleanupKeyListener(), abortController.signal.aborted ? (out.warn("Operation cancelled."), new UserCancellationError("Operation cancelled by user")) : (logger.debug("Device login failed", { error }), error);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function setupCancelListener(abortController) {
|
|
129
|
+
let stdin = process.stdin, wasRaw = stdin.isRaw, wasListening = stdin.listenerCount("data") > 0;
|
|
130
|
+
stdin.isTTY && (stdin.setRawMode(!0), stdin.resume());
|
|
131
|
+
let onData = (data) => {
|
|
132
|
+
let key = data.toString();
|
|
133
|
+
(key === "\x1B" || key === "") && abortController.abort();
|
|
134
|
+
};
|
|
135
|
+
return stdin.on("data", onData), () => {
|
|
136
|
+
stdin.off("data", onData), stdin.isTTY && (stdin.setRawMode(wasRaw ?? !1), wasListening || stdin.pause());
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
async function resolveUsername(apiKey) {
|
|
140
|
+
try {
|
|
141
|
+
return await getCurrentUsername({ apiKey });
|
|
142
|
+
} catch (error) {
|
|
143
|
+
logger.debug("Unable to resolve username from API key", { error });
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
export {
|
|
148
|
+
setupLoginCommand
|
|
149
|
+
};
|
|
150
|
+
//# sourceMappingURL=login-NRKHXZKM.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../core/src/core/device-auth.ts", "../src/commands/login.ts"],
|
|
4
|
+
"sourcesContent": ["import { spawn } from 'child_process';\nimport { logger } from '../utils/logger.js';\nimport { createHttpClient } from './http-client.js';\nimport { profileManager } from './profiles.js';\n\nexport type DeviceAuthorizationStart = {\n\tdeviceCode: string;\n\tuserCode: string;\n\tverificationUri: string;\n\tverificationUriComplete: string;\n\texpiresIn: number;\n\tinterval: number;\n};\n\nexport type DeviceTokenResult = {\n\tapiKey: string;\n\tkeyPrefix?: string;\n\texpiresAt?: string;\n\tuserId: string;\n\tusername?: string;\n};\n\nconst POLL_SLOWDOWN_SECONDS = 5;\n\nexport async function startDeviceAuthorization(): Promise<DeviceAuthorizationStart> {\n\tconst client = await createHttpClient();\n\tconst response = await client.post<{\n\t\tdevice_code: string;\n\t\tuser_code: string;\n\t\tverification_uri: string;\n\t\tverification_uri_complete: string;\n\t\texpires_in: number;\n\t\tinterval: number;\n\t}>(\n\t\t'/auth/device/authorize',\n\t\t{ clientId: 'opkg-cli', scope: 'openid', deviceName: 'opkg-cli' },\n\t\t{ headers: { 'Content-Type': 'application/json' }, skipAuth: true, timeout: 30000 }\n\t);\n\n\treturn {\n\t\tdeviceCode: response.device_code,\n\t\tuserCode: response.user_code,\n\t\tverificationUri: response.verification_uri,\n\t\tverificationUriComplete: response.verification_uri_complete,\n\t\texpiresIn: response.expires_in,\n\t\tinterval: response.interval,\n\t};\n}\n\nexport async function pollForDeviceToken(params: {\n\tdeviceCode: string;\n\tintervalSeconds: number;\n\texpiresInSeconds: number;\n\tsignal?: AbortSignal;\n}): Promise<DeviceTokenResult> {\n\tconst client = await createHttpClient();\n\tconst expiresAt = Date.now() + params.expiresInSeconds * 1000;\n\tlet intervalMs = params.intervalSeconds * 1000;\n\n\twhile (Date.now() < expiresAt) {\n\t\tif (params.signal?.aborted) {\n\t\t\tthrow new Error('Login cancelled.');\n\t\t}\n\n\t\ttry {\n\t\t\tconst tokenResponse = await client.post<{\n\t\t\t\tapiKey: string;\n\t\t\t\tkeyPrefix?: string;\n\t\t\t\texpiresAt?: string;\n\t\t\t\tuserId: string;\n\t\t\t\tusername?: string;\n\t\t\t}>(\n\t\t\t\t'/auth/device/token',\n\t\t\t\t{ deviceCode: params.deviceCode },\n\t\t\t\t{ headers: { 'Content-Type': 'application/json' }, skipAuth: true, timeout: 30000 }\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tapiKey: tokenResponse.apiKey,\n\t\t\t\tkeyPrefix: tokenResponse.keyPrefix,\n\t\t\t\texpiresAt: tokenResponse.expiresAt,\n\t\t\t\tuserId: tokenResponse.userId,\n\t\t\t\tusername: tokenResponse.username,\n\t\t\t};\n\t\t} catch (error: any) {\n\t\t\tconst apiError = error?.apiError?.error as string | undefined;\n\t\t\tconst code = apiError || 'authorization_pending';\n\t\t\tif (code === 'authorization_pending') {\n\t\t\t\t// continue polling\n\t\t\t} else if (code === 'slow_down') {\n\t\t\t\tintervalMs += POLL_SLOWDOWN_SECONDS * 1000;\n\t\t\t} else if (code === 'expired_token') {\n\t\t\t\tthrow new Error('Device code expired. Please run \"opkg login\" again.');\n\t\t\t} else if (code === 'access_denied') {\n\t\t\t\tthrow new Error('Access denied. Please restart the login flow.');\n\t\t\t} else {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tawait wait(intervalMs, params.signal);\n\t}\n\n\tthrow new Error('Device code expired. Please run \"opkg login\" again.');\n}\n\nexport async function persistTokens(\n\tprofileName: string,\n\ttokens: DeviceTokenResult\n): Promise<void> {\n\tawait profileManager.setProfileCredentials(profileName, { api_key: tokens.apiKey });\n}\n\nexport function openBrowser(url: string): void {\n\tconst platform = process.platform;\n\tlet command = '';\n\n\tif (platform === 'darwin') {\n\t\tcommand = 'open';\n\t} else if (platform === 'win32') {\n\t\tcommand = 'start';\n\t} else {\n\t\tcommand = 'xdg-open';\n\t}\n\n\ttry {\n\t\tspawn(command, [url], { stdio: 'ignore', detached: true }).unref();\n\t} catch (error) {\n\t\tlogger.debug('Failed to open browser automatically', { error, url });\n\t}\n}\n\nfunction wait(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(new Error('Login cancelled.'));\n\t\t\treturn;\n\t\t}\n\n\t\tconst timer = setTimeout(resolve, ms);\n\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timer);\n\t\t\treject(new Error('Login cancelled.'));\n\t\t};\n\n\t\tsignal?.addEventListener('abort', onAbort, { once: true });\n\t});\n}\n\n", "import { authManager } from '@opkg/core/core/auth.js';\nimport {\n\tstartDeviceAuthorization,\n\tpollForDeviceToken,\n\tpersistTokens,\n\topenBrowser,\n} from '@opkg/core/core/device-auth.js';\nimport { profileManager } from '@opkg/core/core/profiles.js';\nimport { logger } from '@opkg/core/utils/logger.js';\nimport { UserCancellationError } from '@opkg/core/utils/errors.js';\nimport { getCurrentUsername } from '@opkg/core/core/api-keys.js';\nimport { createCliExecutionContext } from '../cli/context.js';\nimport { resolveOutput } from '@opkg/core/core/ports/resolve.js';\n\ntype LoginOptions = {\n\tprofile?: string;\n};\n\nexport async function setupLoginCommand(args: any[]): Promise<void> {\n\tconst [options] = args as [LoginOptions];\n\tconst ctx = await createCliExecutionContext();\n\tconst out = resolveOutput(ctx);\n\n\tconst profileName = authManager.getCurrentProfile({\n\t\tprofile: options.profile,\n\t});\n\n\tout.info(`Using profile: ${profileName}`);\n\n\tconst authorization = await startDeviceAuthorization();\n\n\tout.info(`A browser will open for you to confirm sign-in.\\n\\nUser code: ${authorization.userCode}\\nVerification URL: ${authorization.verificationUri}`);\n\tout.info('If the browser does not open, visit the URL and enter the code above.');\n\n\topenBrowser(authorization.verificationUriComplete);\n\n\tconst abortController = new AbortController();\n\tconst cleanupKeyListener = setupCancelListener(abortController);\n\n\ttry {\n\t\tconst tokens = await pollForDeviceToken({\n\t\t\tdeviceCode: authorization.deviceCode,\n\t\t\tintervalSeconds: authorization.interval,\n\t\t\texpiresInSeconds: authorization.expiresIn,\n\t\t\tsignal: abortController.signal,\n\t\t});\n\n\t\tcleanupKeyListener();\n\n\t\tawait persistTokens(profileName, tokens);\n\n\t\tconst username = tokens.username ?? (await resolveUsername(tokens.apiKey));\n\t\tif (username) {\n\t\t\tawait profileManager.setProfileDefaultScope(profileName, `@${username}`);\n\t\t\tout.success(`Default scope set to @${username} for profile \"${profileName}\".`);\n\t\t} else {\n\t\t\tlogger.debug('Could not derive username from API key; default scope not set');\n\t\t}\n\n\t\tout.success('Login successful.');\n\t\tout.success(`API key stored for profile \"${profileName}\".`);\n\t} catch (error: any) {\n\t\tcleanupKeyListener();\n\t\tif (abortController.signal.aborted) {\n\t\t\tout.warn('Operation cancelled.');\n\t\t\tthrow new UserCancellationError('Operation cancelled by user');\n\t\t}\n\t\tlogger.debug('Device login failed', { error });\n\t\tthrow error;\n\t}\n}\n\nfunction setupCancelListener(abortController: AbortController): () => void {\n\tconst stdin = process.stdin;\n\tconst wasRaw = stdin.isRaw;\n\tconst wasListening = stdin.listenerCount('data') > 0;\n\n\tif (stdin.isTTY) {\n\t\tstdin.setRawMode(true);\n\t\tstdin.resume();\n\t}\n\n\tconst onData = (data: Buffer) => {\n\t\tconst key = data.toString();\n\t\t// Escape key (\\x1b without [ following, i.e. bare escape)\n\t\tif (key === '\\x1b' || key === '\\x03') {\n\t\t\tabortController.abort();\n\t\t}\n\t};\n\n\tstdin.on('data', onData);\n\n\treturn () => {\n\t\tstdin.off('data', onData);\n\t\tif (stdin.isTTY) {\n\t\t\tstdin.setRawMode(wasRaw ?? false);\n\t\t\tif (!wasListening) {\n\t\t\t\tstdin.pause();\n\t\t\t}\n\t\t}\n\t};\n}\n\nasync function resolveUsername(apiKey: string): Promise<string | undefined> {\n\ttry {\n\t\treturn await getCurrentUsername({ apiKey });\n\t} catch (error) {\n\t\tlogger.debug('Unable to resolve username from API key', { error });\n\t\treturn undefined;\n\t}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
authManager
|
|
4
|
+
} from "./chunk-C6FY55UP.js";
|
|
5
|
+
import {
|
|
6
|
+
profileManager
|
|
7
|
+
} from "./chunk-WF7H2YDU.js";
|
|
8
|
+
import "./chunk-PXL2RUMX.js";
|
|
9
|
+
import {
|
|
10
|
+
createCliExecutionContext,
|
|
11
|
+
resolveOutput
|
|
12
|
+
} from "./chunk-RAKMX654.js";
|
|
13
|
+
import "./chunk-GDVFS3YP.js";
|
|
14
|
+
import "./chunk-VN22A7NW.js";
|
|
15
|
+
import "./chunk-IHVZ5AUJ.js";
|
|
16
|
+
import "./chunk-S47F4OG4.js";
|
|
17
|
+
import "./chunk-ID4SVDQZ.js";
|
|
18
|
+
import {
|
|
19
|
+
logger
|
|
20
|
+
} from "./chunk-5EFWGD33.js";
|
|
21
|
+
|
|
22
|
+
// src/commands/logout.ts
|
|
23
|
+
async function setupLogoutCommand(args) {
|
|
24
|
+
let [options] = args, ctx = await createCliExecutionContext(), out = resolveOutput(ctx), profileName = authManager.getCurrentProfile({
|
|
25
|
+
profile: options.profile
|
|
26
|
+
});
|
|
27
|
+
if (profileName === "<api-key>") {
|
|
28
|
+
out.info("No stored credentials when using --api-key directly.");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
await profileManager.clearProfileCredentials(profileName), out.success(`Credentials removed for profile "${profileName}".`);
|
|
33
|
+
} catch (error) {
|
|
34
|
+
throw logger.debug("Failed to clear credentials during logout", { error }), error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
setupLogoutCommand
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=logout-HDMYRXIE.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/commands/logout.ts"],
|
|
4
|
+
"sourcesContent": ["import { authManager } from '@opkg/core/core/auth.js'\nimport { profileManager } from '@opkg/core/core/profiles.js'\nimport { logger } from '@opkg/core/utils/logger.js'\nimport { createCliExecutionContext } from '../cli/context.js'\nimport { resolveOutput } from '@opkg/core/core/ports/resolve.js'\n\ntype LogoutOptions = {\n\tprofile?: string\n}\n\nexport async function setupLogoutCommand(args: any[]): Promise<void> {\n\tconst [options] = args as [LogoutOptions]\n\tconst ctx = await createCliExecutionContext()\n\tconst out = resolveOutput(ctx)\n\n\tconst profileName = authManager.getCurrentProfile({\n\t\tprofile: options.profile,\n\t})\n\n\tif (profileName === '<api-key>') {\n\t\tout.info('No stored credentials when using --api-key directly.')\n\t\treturn\n\t}\n\n\ttry {\n\t\tawait profileManager.clearProfileCredentials(profileName)\n\t\tout.success(`Credentials removed for profile \"${profileName}\".`)\n\t} catch (error) {\n\t\tlogger.debug('Failed to clear credentials during logout', { error })\n\t\tthrow error\n\t}\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;AAUA,eAAsB,mBAAmB,MAA4B;AACpE,MAAM,CAAC,OAAO,IAAI,MACZ,MAAM,MAAM,0BAA0B,GACtC,MAAM,cAAc,GAAG,GAEvB,cAAc,YAAY,kBAAkB;AAAA,IACjD,SAAS,QAAQ;AAAA,EAClB,CAAC;AAED,MAAI,gBAAgB,aAAa;AAChC,QAAI,KAAK,sDAAsD;AAC/D;AAAA,EACD;AAEA,MAAI;AACH,UAAM,eAAe,wBAAwB,WAAW,GACxD,IAAI,QAAQ,oCAAoC,WAAW,IAAI;AAAA,EAChE,SAAS,OAAO;AACf,iBAAO,MAAM,6CAA6C,EAAE,MAAM,CAAC,GAC7D;AAAA,EACP;AACD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
authManager
|
|
4
|
+
} from "./chunk-UR6VJWA3.js";
|
|
5
|
+
import {
|
|
6
|
+
profileManager
|
|
7
|
+
} from "./chunk-S6OARUVQ.js";
|
|
8
|
+
import "./chunk-PXL2RUMX.js";
|
|
9
|
+
import {
|
|
10
|
+
createCliExecutionContext,
|
|
11
|
+
resolveOutput
|
|
12
|
+
} from "./chunk-BROJ6OUT.js";
|
|
13
|
+
import "./chunk-XEPVYZO3.js";
|
|
14
|
+
import "./chunk-VN22A7NW.js";
|
|
15
|
+
import "./chunk-J4IFFBLP.js";
|
|
16
|
+
import "./chunk-S47F4OG4.js";
|
|
17
|
+
import "./chunk-ID4SVDQZ.js";
|
|
18
|
+
import {
|
|
19
|
+
logger
|
|
20
|
+
} from "./chunk-5EFWGD33.js";
|
|
21
|
+
|
|
22
|
+
// src/commands/logout.ts
|
|
23
|
+
async function setupLogoutCommand(args) {
|
|
24
|
+
let [options] = args, ctx = await createCliExecutionContext(), out = resolveOutput(ctx), profileName = authManager.getCurrentProfile({
|
|
25
|
+
profile: options.profile
|
|
26
|
+
});
|
|
27
|
+
if (profileName === "<api-key>") {
|
|
28
|
+
out.info("No stored credentials when using --api-key directly.");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
await profileManager.clearProfileCredentials(profileName), out.success(`Credentials removed for profile "${profileName}".`);
|
|
33
|
+
} catch (error) {
|
|
34
|
+
throw logger.debug("Failed to clear credentials during logout", { error }), error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
setupLogoutCommand
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=logout-SYHXCVCQ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/commands/logout.ts"],
|
|
4
|
+
"sourcesContent": ["import { authManager } from '@opkg/core/core/auth.js'\nimport { profileManager } from '@opkg/core/core/profiles.js'\nimport { logger } from '@opkg/core/utils/logger.js'\nimport { createCliExecutionContext } from '../cli/context.js'\nimport { resolveOutput } from '@opkg/core/core/ports/resolve.js'\n\ntype LogoutOptions = {\n\tprofile?: string\n}\n\nexport async function setupLogoutCommand(args: any[]): Promise<void> {\n\tconst [options] = args as [LogoutOptions]\n\tconst ctx = await createCliExecutionContext()\n\tconst out = resolveOutput(ctx)\n\n\tconst profileName = authManager.getCurrentProfile({\n\t\tprofile: options.profile,\n\t})\n\n\tif (profileName === '<api-key>') {\n\t\tout.info('No stored credentials when using --api-key directly.')\n\t\treturn\n\t}\n\n\ttry {\n\t\tawait profileManager.clearProfileCredentials(profileName)\n\t\tout.success(`Credentials removed for profile \"${profileName}\".`)\n\t} catch (error) {\n\t\tlogger.debug('Failed to clear credentials during logout', { error })\n\t\tthrow error\n\t}\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;AAUA,eAAsB,mBAAmB,MAA4B;AACpE,MAAM,CAAC,OAAO,IAAI,MACZ,MAAM,MAAM,0BAA0B,GACtC,MAAM,cAAc,GAAG,GAEvB,cAAc,YAAY,kBAAkB;AAAA,IACjD,SAAS,QAAQ;AAAA,EAClB,CAAC;AAED,MAAI,gBAAgB,aAAa;AAChC,QAAI,KAAK,sDAAsD;AAC/D;AAAA,EACD;AAEA,MAAI;AACH,UAAM,eAAe,wBAAwB,WAAW,GACxD,IAAI,QAAQ,oCAAoC,WAAW,IAAI;AAAA,EAChE,SAAS,OAAO;AACf,iBAAO,MAAM,6CAA6C,EAAE,MAAM,CAAC,GAC7D;AAAA,EACP;AACD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
authManager
|
|
4
|
+
} from "./chunk-UR6VJWA3.js";
|
|
5
|
+
import {
|
|
6
|
+
profileManager
|
|
7
|
+
} from "./chunk-S6OARUVQ.js";
|
|
8
|
+
import "./chunk-PXL2RUMX.js";
|
|
9
|
+
import {
|
|
10
|
+
createCliExecutionContext,
|
|
11
|
+
resolveOutput
|
|
12
|
+
} from "./chunk-RAKMX654.js";
|
|
13
|
+
import "./chunk-XEPVYZO3.js";
|
|
14
|
+
import "./chunk-VN22A7NW.js";
|
|
15
|
+
import "./chunk-J4IFFBLP.js";
|
|
16
|
+
import "./chunk-S47F4OG4.js";
|
|
17
|
+
import "./chunk-ID4SVDQZ.js";
|
|
18
|
+
import {
|
|
19
|
+
logger
|
|
20
|
+
} from "./chunk-5EFWGD33.js";
|
|
21
|
+
|
|
22
|
+
// src/commands/logout.ts
|
|
23
|
+
async function setupLogoutCommand(args) {
|
|
24
|
+
let [options] = args, ctx = await createCliExecutionContext(), out = resolveOutput(ctx), profileName = authManager.getCurrentProfile({
|
|
25
|
+
profile: options.profile
|
|
26
|
+
});
|
|
27
|
+
if (profileName === "<api-key>") {
|
|
28
|
+
out.info("No stored credentials when using --api-key directly.");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
await profileManager.clearProfileCredentials(profileName), out.success(`Credentials removed for profile "${profileName}".`);
|
|
33
|
+
} catch (error) {
|
|
34
|
+
throw logger.debug("Failed to clear credentials during logout", { error }), error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
setupLogoutCommand
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=logout-X3XUUOH5.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/commands/logout.ts"],
|
|
4
|
+
"sourcesContent": ["import { authManager } from '@opkg/core/core/auth.js'\nimport { profileManager } from '@opkg/core/core/profiles.js'\nimport { logger } from '@opkg/core/utils/logger.js'\nimport { createCliExecutionContext } from '../cli/context.js'\nimport { resolveOutput } from '@opkg/core/core/ports/resolve.js'\n\ntype LogoutOptions = {\n\tprofile?: string\n}\n\nexport async function setupLogoutCommand(args: any[]): Promise<void> {\n\tconst [options] = args as [LogoutOptions]\n\tconst ctx = await createCliExecutionContext()\n\tconst out = resolveOutput(ctx)\n\n\tconst profileName = authManager.getCurrentProfile({\n\t\tprofile: options.profile,\n\t})\n\n\tif (profileName === '<api-key>') {\n\t\tout.info('No stored credentials when using --api-key directly.')\n\t\treturn\n\t}\n\n\ttry {\n\t\tawait profileManager.clearProfileCredentials(profileName)\n\t\tout.success(`Credentials removed for profile \"${profileName}\".`)\n\t} catch (error) {\n\t\tlogger.debug('Failed to clear credentials during logout', { error })\n\t\tthrow error\n\t}\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;AAUA,eAAsB,mBAAmB,MAA4B;AACpE,MAAM,CAAC,OAAO,IAAI,MACZ,MAAM,MAAM,0BAA0B,GACtC,MAAM,cAAc,GAAG,GAEvB,cAAc,YAAY,kBAAkB;AAAA,IACjD,SAAS,QAAQ;AAAA,EAClB,CAAC;AAED,MAAI,gBAAgB,aAAa;AAChC,QAAI,KAAK,sDAAsD;AAC/D;AAAA,EACD;AAEA,MAAI;AACH,UAAM,eAAe,wBAAwB,WAAW,GACxD,IAAI,QAAQ,oCAAoC,WAAW,IAAI;AAAA,EAChE,SAAS,OAAO;AACf,iBAAO,MAAM,6CAA6C,EAAE,MAAM,CAAC,GAC7D;AAAA,EACP;AACD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|