@@ -14,13 +14,27 @@ const desktopRoot = join(import.meta.dir, '..');
1414const defaultRepoRoot = join ( desktopRoot , '..' , '..' ) ;
1515const electronDir = join ( desktopRoot , 'apps' , 'electron' ) ;
1616const vendorDir = join ( electronDir , 'vendor' , 'qwen-code' ) ;
17+ const qwenCodePackageName = '@qwen-code/qwen-code' ;
18+ const qwenCodeMetadataUrl = `https://registry.npmjs.org/${ encodeURIComponent ( qwenCodePackageName ) } ` ;
1719
1820interface DesktopPackageJson {
1921 qwenCodeRuntime ?: {
2022 version ?: string ;
2123 } ;
2224}
2325
26+ interface NpmPackageMetadata {
27+ 'dist-tags' ?: Record < string , string > ;
28+ versions ?: Record <
29+ string ,
30+ {
31+ dist ?: {
32+ tarball ?: string ;
33+ } ;
34+ }
35+ > ;
36+ }
37+
2438function npmCommand ( ) : string {
2539 return process . platform === 'win32' ? 'npm.cmd' : 'npm' ;
2640}
@@ -106,17 +120,59 @@ async function vendorLocalCheckout(repoRoot: string): Promise<void> {
106120 console . log ( `Vendored local Qwen Code CLI into ${ vendorDir } ` ) ;
107121}
108122
109- async function vendorNpmVersion ( version : string ) : Promise < void > {
110- console . log ( `Downloading Qwen Code ${ version } from npm...` ) ;
123+ async function readNpmPackageMetadata ( ) : Promise < NpmPackageMetadata > {
124+ const response = await fetch ( qwenCodeMetadataUrl ) ;
125+ if ( ! response . ok ) {
126+ throw new Error (
127+ `Failed to read ${ qwenCodePackageName } metadata from npm: HTTP ${ response . status } ` ,
128+ ) ;
129+ }
130+ return ( await response . json ( ) ) as NpmPackageMetadata ;
131+ }
132+
133+ async function resolveNpmVersionOrTag (
134+ versionOrTag : string ,
135+ ) : Promise < { tarballUrl : string ; version : string } > {
136+ const requested = versionOrTag . trim ( ) ;
137+ if ( ! requested ) {
138+ throw new Error ( 'Qwen Code npm version or dist-tag is required.' ) ;
139+ }
140+
141+ const metadata = await readNpmPackageMetadata ( ) ;
142+ const version = metadata . versions ?. [ requested ]
143+ ? requested
144+ : metadata [ 'dist-tags' ] ?. [ requested ] ;
145+ if ( ! version ) {
146+ throw new Error (
147+ `Could not resolve ${ qwenCodePackageName } @${ requested } from npm.` ,
148+ ) ;
149+ }
150+
151+ const tarballUrl = metadata . versions ?. [ version ] ?. dist ?. tarball ;
152+ if ( ! tarballUrl ) {
153+ throw new Error (
154+ `Could not find npm tarball for ${ qwenCodePackageName } @${ version } .` ,
155+ ) ;
156+ }
157+
158+ return { tarballUrl, version } ;
159+ }
160+
161+ async function vendorNpmVersion ( versionOrTag : string ) : Promise < void > {
162+ const { tarballUrl, version } = await resolveNpmVersionOrTag ( versionOrTag ) ;
163+ const sourceLabel =
164+ versionOrTag === version ? version : `${ versionOrTag } (${ version } )` ;
165+ console . log ( `Downloading Qwen Code ${ sourceLabel } from npm...` ) ;
111166
112167 const tempDir = mkdtempSync ( join ( tmpdir ( ) , 'qwen-code-vendor-' ) ) ;
113168 const tarballPath = join ( tempDir , `qwen-code-${ version } .tgz` ) ;
114- const url = `https://registry.npmjs.org/@qwen-code/qwen-code/-/qwen-code-${ version } .tgz` ;
115169
116170 try {
117- const response = await fetch ( url ) ;
171+ const response = await fetch ( tarballUrl ) ;
118172 if ( ! response . ok ) {
119- throw new Error ( `Failed to download ${ url } : HTTP ${ response . status } ` ) ;
173+ throw new Error (
174+ `Failed to download ${ tarballUrl } : HTTP ${ response . status } ` ,
175+ ) ;
120176 }
121177 await Bun . write ( tarballPath , await response . arrayBuffer ( ) ) ;
122178
@@ -130,7 +186,7 @@ async function vendorNpmVersion(version: string): Promise<void> {
130186 ) ;
131187
132188 verifyVendoredCli ( ) ;
133- console . log ( `Vendored @qwen-code/qwen-code @${ version } into ${ vendorDir } ` ) ;
189+ console . log ( `Vendored ${ qwenCodePackageName } @${ version } into ${ vendorDir } ` ) ;
134190 } finally {
135191 rmSync ( tempDir , { recursive : true , force : true } ) ;
136192 }
0 commit comments