agc-api-cli 1.0.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/index.ts","../src/services/auth.ts","../src/config/index.ts","../src/core/auth-mgr.ts","../src/core/http.ts","../src/services/publish.ts","../src/services/provision.ts","../src/services/upload.ts","../src/services/domain.ts","../src/services/sign.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport * as fs from 'fs';\nimport { AuthManager } from '../core/auth-mgr';\nimport { PublishService } from '../services/publish';\nimport { ProvisionService } from '../services/provision';\nimport { UploadService } from '../services/upload';\nimport { DomainService } from '../services/domain';\nimport { SignService } from '../services/sign';\n\nconst program = new Command();\n\nprogram\n .name('agc-cli')\n .description('AppGallery Connect API CLI Tool')\n .version('1.0.0');\n\n// ==== Auth Commands ====\nconst authCmd = program.command('auth').description('Authentication management');\n\nauthCmd.command('login')\n .description('Login to AGC API and cache the access token')\n .action(async () => {\n try {\n const token = await AuthManager.getAccessToken();\n console.log('Successfully logged in. Token generated and cached.');\n // 避免输出完整的Token影响安全\n console.log(`Token snippet: ${token.substring(0, 10)}...`);\n } catch (e: any) {\n console.error('Login failed:', e.message);\n }\n });\n\nauthCmd.command('logout')\n .description('Logout and clear cached access token')\n .action(() => {\n const cleared = AuthManager.clearCache();\n if (cleared) {\n console.log('Successfully logged out. Token cache cleared.');\n } else {\n console.log('Already logged out. No token cache found.');\n }\n });\n\n// ==== Publish Commands ====\nconst publishCmd = program.command('publish').description('Publishing API commands');\n\npublishCmd.command('app-id')\n .description('Get App ID by package name')\n .requiredOption('-p, --package-name <packageName>', 'Package name')\n .action(async (options) => {\n try {\n const res = await PublishService.getAppIdList(options.packageName);\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\npublishCmd.command('app-info')\n .description('Get App Info by App ID')\n .requiredOption('-a, --app-id <appId>', 'App ID')\n .option('-l, --lang <lang>', 'Language, e.g. zh-CN')\n .action(async (options) => {\n try {\n const res = await PublishService.getAppInfo(options.appId, options.lang);\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\n// ==== Upload Commands ====\nconst uploadCmd = program.command('upload').description('Upload Management API commands');\n\nuploadCmd.command('file')\n .description('Upload a file (APP, APK, images, etc.)')\n .requiredOption('-a, --app-id <appId>', 'App ID')\n .requiredOption('-f, --file-path <filePath>', 'Path to the local file to upload')\n .option('-r, --release-type <releaseType>', 'Release type: 1 for Full, 6 for HarmonyOS Test')\n .option('-c, --chinese-mainland <flag>', 'Chinese mainland flag: 0 or 1')\n .action(async (options) => {\n try {\n console.log(`Uploading file ${options.filePath}...`);\n await UploadService.uploadFile({\n appId: options.appId,\n filePath: options.filePath,\n releaseType: options.releaseType ? Number(options.releaseType) : undefined,\n chineseMainlandFlag: options.chineseMainland ? Number(options.chineseMainland) : undefined\n });\n console.log('Upload successful.');\n } catch (e: any) {\n console.error('Upload failed:', e.message);\n }\n });\n\n// ==== Provision Commands ====\nconst provisionCmd = program.command('provision').description('Provisioning API commands');\n\n// -- Certificates --\nprovisionCmd.command('csr-generate')\n .description('Generate a new keypair and CSR file')\n .requiredOption('--alias <alias>', 'Key alias')\n .option('--pwd <pwd>', 'Key password (default: 123456)')\n .option('--out-dir <outDir>', 'Output directory (default: ./sign_keys)')\n .option('--filename <filename>', 'Base filename for generated files')\n .option('--sdk-path <sdkPath>', 'Path to HarmonyOS SDK (or set HARMONYOS_SDK_PATH env var)')\n .option('--java-path <javaPath>', 'Path to java executable (default: java)')\n .action(async (options) => {\n try {\n const res = await SignService.createSignP12AndCsr({\n alias: options.alias,\n pwd: options.pwd,\n outDir: options.outDir,\n filename: options.filename,\n sdkPath: options.sdkPath,\n javaPath: options.javaPath\n });\n console.log('CSR generation successful.');\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('CSR generation failed:', e.message);\n }\n });\n\nprovisionCmd.command('encrypt-pwd')\n .description('加密 P12 密码,生成 build-profile.json5 所需的 keyPassword / storePassword')\n .requiredOption('--pwd <password>', 'P12 密码明文')\n .option('--config-dir <configDir>', 'DevEco Studio 配置目录 (默认 ~/.ohos/config)')\n .action(async (options) => {\n try {\n const res = SignService.encryptPassword(options.pwd, options.configDir);\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('加密失败:', e.message);\n }\n });\n\nprovisionCmd.command('cert-create')\n .description('Create a certificate')\n .requiredOption('--csr <csrFile>', 'Path to CSR file')\n .requiredOption('--cert-name <certName>', 'Certificate name')\n .requiredOption('--cert-type <certType>', 'Certificate type (1: debug, 2: release, 3: in-house, 4: binary)')\n .action(async (options) => {\n try {\n const csrContent = fs.readFileSync(options.csr, 'utf8');\n const res = await ProvisionService.createCert({\n csr: csrContent,\n certName: options.certName,\n certType: Number(options.certType)\n });\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\nprovisionCmd.command('cert-list')\n .description('List certificates')\n .option('-t, --cert-type <certType>', 'Certificate type')\n .option('--cert-ids <certIds>', 'Comma separated certificate IDs')\n .action(async (options) => {\n try {\n const req: any = {};\n if (options.certType) req.certType = Number(options.certType);\n if (options.certIds) req.certIds = options.certIds.split(',');\n const res = await ProvisionService.getCertList(req);\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\nprovisionCmd.command('cert-delete')\n .description('Delete certificates')\n .requiredOption('--cert-ids <certIds>', 'Comma separated certificate IDs to delete')\n .action(async (options) => {\n try {\n const res = await ProvisionService.deleteCert({\n certIds: options.certIds.split(',')\n });\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\n// -- Devices --\nprovisionCmd.command('device-add')\n .description('Add new devices')\n .requiredOption('--devices <devicesFile>', 'Path to JSON file containing devices array [{\"deviceName\":\"name\",\"udid\":\"udid\",\"deviceType\":1}]')\n .action(async (options) => {\n try {\n const fileContent = fs.readFileSync(options.devices, 'utf8');\n const deviceList = JSON.parse(fileContent);\n const res = await ProvisionService.addDevice({ deviceList });\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\nprovisionCmd.command('device-list')\n .description('List devices')\n .option('--device-name <deviceName>', 'Device name to search')\n .option('--from <fromRecCount>', 'Starting page')\n .option('--max <maxReqCount>', 'Max items per page')\n .option('--order <order>', '1: create time desc, 2: name asc')\n .action(async (options) => {\n try {\n const req: any = {};\n if (options.deviceName) req.deviceName = options.deviceName;\n if (options.from) req.fromRecCount = Number(options.from);\n if (options.max) req.maxReqCount = Number(options.max);\n if (options.order) req.order = Number(options.order);\n const res = await ProvisionService.getDeviceList(req);\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\nprovisionCmd.command('device-delete')\n .description('Delete devices')\n .requiredOption('--device-ids <deviceIdList>', 'Comma separated device IDs to delete')\n .action(async (options) => {\n try {\n const res = await ProvisionService.deleteDevice({\n deviceIdList: options.deviceIds.split(',')\n });\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\n// -- Profile / Provision --\nprovisionCmd.command('profile-create')\n .description('Create a profile')\n .requiredOption('--name <provisionName>', 'Profile name')\n .requiredOption('--type <provisionType>', 'Profile type (1:debug, 2:release, 3:in-house, 6:specific device)')\n .requiredOption('--cert <certId>', 'Certificate ID')\n .requiredOption('-a, --app-id <appId>', 'App ID')\n .option('--device-ids <deviceIdList>', 'Comma separated device IDs')\n .option('--acls <aclPermissionList>', 'Comma separated ACL permissions')\n .action(async (options) => {\n try {\n const req: any = {\n provisionName: options.name,\n provisionType: Number(options.type),\n certId: options.cert,\n appId: options.appId\n };\n if (options.deviceIds) req.deviceIdList = options.deviceIds.split(',');\n if (options.acls) req.aclPermissionList = options.acls.split(',');\n const res = await ProvisionService.createProvision(req);\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\nprovisionCmd.command('profile-list')\n .description('List profiles')\n .requiredOption('-a, --app-id <appId>', 'App ID')\n .option('--profile-id <provisionId>', 'Profile ID')\n .option('--from <fromRecCount>', 'Starting page')\n .option('--max <maxReqCount>', 'Max items per page')\n .action(async (options) => {\n try {\n const req: any = { appId: options.appId };\n if (options.profileId) req.provisionId = options.profileId;\n if (options.from) req.fromRecCount = Number(options.from);\n if (options.max) req.maxReqCount = Number(options.max);\n const res = await ProvisionService.getProvisionList(req);\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\nprovisionCmd.command('profile-update')\n .description('Update profile devices')\n .requiredOption('--id <provisionId>', 'Profile ID')\n .requiredOption('--device-ids <deviceIdList>', 'Comma separated device IDs')\n .action(async (options) => {\n try {\n const res = await ProvisionService.updateProvision({\n provisionId: options.id,\n deviceIdList: options.deviceIds.split(',')\n });\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\nprovisionCmd.command('profile-delete')\n .description('Delete a profile')\n .requiredOption('--id <id>', 'Profile ID to delete')\n .action(async (options) => {\n try {\n const res = await ProvisionService.deleteProvision({ id: options.id });\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\n// -- Fingerprints --\nprovisionCmd.command('fp-add')\n .description('Add certificate fingerprints')\n .requiredOption('-a, --app-id <appId>', 'App ID')\n .requiredOption('--fps <fingerprintList>', 'Comma separated fingerprints')\n .action(async (options) => {\n try {\n const res = await ProvisionService.addFingerprint({\n appId: options.appId,\n fingerprintList: options.fps.split(',')\n });\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\nprovisionCmd.command('fp-list')\n .description('List certificate fingerprints')\n .requiredOption('-a, --app-id <appId>', 'App ID')\n .action(async (options) => {\n try {\n const res = await ProvisionService.getFingerprintList({ appId: options.appId });\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\nprovisionCmd.command('fp-delete')\n .description('Delete certificate fingerprints')\n .requiredOption('-a, --app-id <appId>', 'App ID')\n .requiredOption('--fps <fingerprintList>', 'Comma separated fingerprints to delete')\n .action(async (options) => {\n try {\n const res = await ProvisionService.deleteFingerprint({\n appId: options.appId,\n fingerprintList: options.fps.split(',')\n });\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\n// -- ACL Permissions --\nprovisionCmd.command('acl-apply')\n .description('Apply for restricted ACL permissions')\n .requiredOption('-a, --app-id <appId>', 'App ID')\n .requiredOption('--acls <aclsFile>', 'Path to JSON file containing ACL permissions [{\"name\":\"name\",\"reason\":\"reason\"}]')\n .option('--attachment <attachment>', 'Attachment object ID')\n .action(async (options) => {\n try {\n const fileContent = fs.readFileSync(options.acls, 'utf8');\n const aclPermissionList = JSON.parse(fileContent);\n const req: any = { appId: options.appId, aclPermissionList };\n if (options.attachment) req.attachment = options.attachment;\n const res = await ProvisionService.applyACL(req);\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\nprovisionCmd.command('acl-status')\n .description('Check ACL permission apply status')\n .requiredOption('-a, --app-id <appId>', 'App ID')\n .action(async (options) => {\n try {\n const res = await ProvisionService.getACLStatus({ appId: options.appId });\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\nprovisionCmd.command('acl-query')\n .description('Query granted ACL permissions')\n .requiredOption('-a, --app-id <appId>', 'App ID')\n .action(async (options) => {\n try {\n const res = await ProvisionService.getACLQuery({ appId: options.appId });\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\n// ==== Domain Commands ====\nconst domainCmd = program.command('domain').description('Domain Management API commands');\n\ndomainCmd.command('query')\n .description('Query domain configuration')\n .requiredOption('-a, --app-id <appId>', 'App ID')\n .requiredOption('-c, --category <category>', 'Category: server or business')\n .action(async (options) => {\n try {\n const res = await DomainService.queryDomain({\n appId: options.appId,\n category: options.category\n });\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\ndomainCmd.command('update')\n .description('Add or update domain configuration')\n .requiredOption('-a, --app-id <appId>', 'App ID')\n .requiredOption('-c, --category <category>', 'Category: server or business')\n .requiredOption('--domains <domainsFile>', 'Path to JSON file containing domains array [{\"type\":\"httpRequest\",\"value\":\"https://...\"}]')\n .action(async (options) => {\n try {\n const fileContent = fs.readFileSync(options.domains, 'utf8');\n const domains = JSON.parse(fileContent);\n const res = await DomainService.updateDomain({\n appId: options.appId,\n category: options.category,\n domains\n });\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\ndomainCmd.command('config')\n .description('Query domain modification counts and limits')\n .requiredOption('-a, --app-id <appId>', 'App ID')\n .action(async (options) => {\n try {\n const res = await DomainService.queryDomainConfig({\n appId: options.appId\n });\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\ndomainCmd.command('verify-file')\n .description('Download domain verify file')\n .requiredOption('-a, --app-id <appId>', 'App ID')\n .requiredOption('-o, --output <outputPath>', 'Output file path')\n .action(async (options) => {\n try {\n console.log(`Downloading verify file to ${options.output}...`);\n await DomainService.verifyFile({\n appId: options.appId\n }, options.output);\n console.log('Download successful.');\n } catch (e: any) {\n console.error('Download failed:', e.message);\n }\n });\n\ndomainCmd.command('pre-check')\n .description('Pre-check business domain configuration')\n .requiredOption('-a, --app-id <appId>', 'App ID')\n .requiredOption('--domain <domainFile>', 'Path to JSON file containing domain object {\"type\":\"webView\",\"value\":\"https://...\"}')\n .action(async (options) => {\n try {\n const fileContent = fs.readFileSync(options.domain, 'utf8');\n const domain = JSON.parse(fileContent);\n const res = await DomainService.preCheckDomain({\n appId: options.appId,\n domain\n });\n console.log(JSON.stringify(res, null, 2));\n } catch (e: any) {\n console.error('Request failed:', e.message);\n }\n });\n\nprogram.parse(process.argv);\n","import axios from 'axios';\nimport { TokenRequest, TokenResponse } from '../types/auth';\nimport { getConfig } from '../config';\n\nexport class AuthService {\n /**\n * 获取访问API的Token\n */\n static async getToken(): Promise<TokenResponse> {\n const config = getConfig();\n const url = `https://${config.domain}/api/oauth2/v1/token`;\n \n const payload: TokenRequest = {\n grant_type: 'client_credentials',\n client_id: config.clientId,\n client_secret: config.clientSecret,\n };\n\n const response = await axios.post<TokenResponse>(url, payload, {\n headers: {\n 'Content-Type': 'application/json'\n }\n });\n\n return response.data;\n }\n}\n","import * as dotenv from 'dotenv';\nimport path from 'path';\nimport fs from 'fs';\n\n// 尝试从当前目录加载 .env\nconst envPath = path.resolve(process.cwd(), '.env');\nif (fs.existsSync(envPath)) {\n dotenv.config({ path: envPath });\n} else {\n dotenv.config();\n}\n\nexport interface AgcConfig {\n clientId: string;\n clientSecret: string;\n domain: string;\n}\n\nexport function getConfig(): AgcConfig {\n const clientId = process.env.AGC_CLIENT_ID;\n const clientSecret = process.env.AGC_CLIENT_SECRET;\n \n if (!clientId || !clientSecret) {\n throw new Error('Missing AGC credentials. Please set AGC_CLIENT_ID and AGC_CLIENT_SECRET environment variables.');\n }\n\n return {\n clientId,\n clientSecret,\n domain: process.env.AGC_DOMAIN || 'connect-api.cloud.huawei.com',\n };\n}\n","import { AuthService } from '../services/auth';\nimport fs from 'fs';\nimport path from 'path';\nimport os from 'os';\n\nexport interface TokenCache {\n accessToken: string;\n expiresAt: number;\n}\n\nexport class AuthManager {\n private static cacheFile = path.join(os.homedir(), '.agc-cli-token.json');\n\n static async getAccessToken(): Promise<string> {\n const cache = this.readCache();\n // 提前5分钟判断过期,避免临界情况\n if (cache && cache.expiresAt > Date.now() + 5 * 60 * 1000) {\n return cache.accessToken;\n }\n\n // Token不存在或已过期,重新获取\n const res = await AuthService.getToken();\n if (res.access_token && res.expires_in) {\n const expiresAt = Date.now() + res.expires_in * 1000;\n this.writeCache({ accessToken: res.access_token, expiresAt });\n return res.access_token;\n }\n\n throw new Error(`Failed to get token: ${JSON.stringify(res.ret)}`);\n }\n\n private static readCache(): TokenCache | null {\n try {\n if (fs.existsSync(this.cacheFile)) {\n const data = fs.readFileSync(this.cacheFile, 'utf8');\n return JSON.parse(data);\n }\n } catch (e) {\n // 忽略读取错误\n }\n return null;\n }\n\n private static writeCache(cache: TokenCache) {\n try {\n fs.writeFileSync(this.cacheFile, JSON.stringify(cache, null, 2), 'utf8');\n } catch (e) {\n // 忽略写入错误\n }\n }\n\n /**\n * 清除缓存的 Token(登出)\n */\n static clearCache(): boolean {\n try {\n if (fs.existsSync(this.cacheFile)) {\n fs.unlinkSync(this.cacheFile);\n return true;\n }\n return false;\n } catch (e) {\n return false;\n }\n }\n}\n","import axios from 'axios';\nimport { AuthManager } from './auth-mgr';\nimport { getConfig } from '../config';\n\nexport const agcClient = axios.create();\n\n// 请求拦截器:自动补充BaseURL、鉴权Token和client_id\nagcClient.interceptors.request.use(async (config) => {\n const cfg = getConfig();\n \n if (!config.baseURL) {\n config.baseURL = `https://${cfg.domain}`;\n }\n \n const token = await AuthManager.getAccessToken();\n \n if (!config.headers) {\n config.headers = {} as any;\n }\n \n if (!config.headers.Authorization) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n \n if (!config.headers.client_id) {\n config.headers.client_id = cfg.clientId;\n }\n\n // POST/PUT 等带 Body 的请求需显式设置 Content-Type(文档要求)\n if (config.data !== undefined && !config.headers['Content-Type']) {\n config.headers['Content-Type'] = 'application/json';\n }\n\n return config;\n}, (error) => {\n return Promise.reject(error);\n});\n\n// 响应拦截器:403 时输出完整错误信息便于调试\nagcClient.interceptors.response.use(\n (res) => res,\n (err) => {\n if (err.response?.status === 403) {\n const body = err.response?.data;\n const msg = typeof body === 'object' ? JSON.stringify(body, null, 2) : body;\n err.message = err.message + (msg ? `\\nAPI 响应: ${msg}` : '');\n }\n return Promise.reject(err);\n }\n);\n","import { agcClient } from '../core/http';\nimport { AppIdListResponse, AppInfoResponse } from '../types/publish';\n\nexport class PublishService {\n /**\n * 查询应用包名对应的appid\n * @param packageName 需要查询的应用包名,多个包名以逗号分隔,最多支持50个\n */\n static async getAppIdList(packageName: string): Promise<AppIdListResponse> {\n const response = await agcClient.get<AppIdListResponse>('/api/publish/v2/appid-list', {\n params: { packageName }\n });\n return response.data;\n }\n\n /**\n * 查询应用信息\n * @param appId 需要查询的应用ID\n * @param lang 需要查询的语言 (例如: 'zh-CN'),不传则查询全部语言\n */\n static async getAppInfo(appId: string, lang?: string): Promise<AppInfoResponse> {\n const params: any = { appId };\n if (lang) {\n params.lang = lang;\n }\n \n const response = await agcClient.get<AppInfoResponse>('/api/publish/v3/app-info', {\n params\n });\n return response.data;\n }\n}\n","import { agcClient } from '../core/http';\nimport {\n CertCreateRequest, CertCreateResponse,\n CertListRequest, CertListResponse,\n CertDeleteRequest, CertDeleteResponse,\n DeviceAddRequest, DeviceAddResponse,\n DeviceListRequest, DeviceListResponse,\n DeviceDeleteRequest, DeviceDeleteResponse,\n ProvisionCreateRequest, ProvisionCreateResponse,\n ProvisionListRequest, ProvisionListResponse,\n ProvisionUpdateRequest, ProvisionUpdateResponse,\n ProvisionDeleteRequest, ProvisionDeleteResponse,\n FingerprintAddRequest, FingerprintAddResponse,\n FingerprintListRequest, FingerprintListResponse,\n FingerprintDeleteRequest, FingerprintDeleteResponse,\n ACLApplyRequest, ACLApplyResponse,\n ACLStatusRequest, ACLStatusResponse,\n ACLQueryRequest, ACLQueryResponse\n} from '../types/provision';\n\nexport class ProvisionService {\n // ================= Certificates =================\n static async createCert(req: CertCreateRequest): Promise<CertCreateResponse> {\n const response = await agcClient.post<CertCreateResponse>('/api/publish/v3/cert', req);\n return response.data;\n }\n\n static async getCertList(req: CertListRequest): Promise<CertListResponse> {\n const response = await agcClient.post<CertListResponse>('/api/publish/v3/cert/list', req);\n return response.data;\n }\n\n static async deleteCert(req: CertDeleteRequest): Promise<CertDeleteResponse> {\n const response = await agcClient.post<CertDeleteResponse>('/api/publish/v2/cert/delete', req);\n return response.data;\n }\n\n // ================= Devices =================\n static async addDevice(req: DeviceAddRequest): Promise<DeviceAddResponse> {\n const response = await agcClient.post<DeviceAddResponse>('/api/publish/v2/device', req);\n return response.data;\n }\n\n static async getDeviceList(req: DeviceListRequest): Promise<DeviceListResponse> {\n const params = new URLSearchParams();\n if (req.deviceName) params.append('deviceName', req.deviceName);\n if (req.fromRecCount) params.append('fromRecCount', String(req.fromRecCount));\n if (req.maxReqCount) params.append('maxReqCount', String(req.maxReqCount));\n if (req.order) params.append('order', String(req.order));\n \n const url = `/api/publish/v2/device/list?${params.toString()}`;\n const response = await agcClient.get<DeviceListResponse>(url);\n return response.data;\n }\n\n static async deleteDevice(req: DeviceDeleteRequest): Promise<DeviceDeleteResponse> {\n const response = await agcClient.post<DeviceDeleteResponse>('/api/publish/v2/device/delete', req);\n return response.data;\n }\n\n // ================= Profile / Provision =================\n static async createProvision(req: ProvisionCreateRequest): Promise<ProvisionCreateResponse> {\n const response = await agcClient.post<ProvisionCreateResponse>('/api/publish/v3/provision', req);\n return response.data;\n }\n\n static async getProvisionList(req: ProvisionListRequest): Promise<ProvisionListResponse> {\n const params = new URLSearchParams();\n if (req.fromRecCount) params.append('fromRecCount', String(req.fromRecCount));\n if (req.maxReqCount) params.append('maxReqCount', String(req.maxReqCount));\n \n // Some parameters like appId and provisionId are sent via headers in the API, we need to pass them in config\n const headers: Record<string, string> = {\n appId: req.appId\n };\n if (req.provisionId) {\n headers.provisionId = req.provisionId;\n }\n\n const url = `/api/publish/v3/provision/list?${params.toString()}`;\n const response = await agcClient.get<ProvisionListResponse>(url, { headers });\n return response.data;\n }\n\n static async updateProvision(req: ProvisionUpdateRequest): Promise<ProvisionUpdateResponse> {\n const response = await agcClient.put<ProvisionUpdateResponse>('/api/publish/v3/provision', req);\n return response.data;\n }\n\n static async deleteProvision(req: ProvisionDeleteRequest): Promise<ProvisionDeleteResponse> {\n const params = new URLSearchParams();\n if (req.id) params.append('id', req.id);\n const url = `/api/publish/v2/provision?${params.toString()}`;\n const response = await agcClient.delete<ProvisionDeleteResponse>(url);\n return response.data;\n }\n\n // ================= Fingerprint =================\n static async addFingerprint(req: FingerprintAddRequest): Promise<FingerprintAddResponse> {\n const { appId, ...body } = req;\n const headers = { appId };\n const response = await agcClient.post<FingerprintAddResponse>('/api/provision/v1/fingerprints', body, { headers });\n return response.data;\n }\n\n static async getFingerprintList(req: FingerprintListRequest): Promise<FingerprintListResponse> {\n const headers = { appId: req.appId };\n const response = await agcClient.get<FingerprintListResponse>('/api/provision/v1/fingerprints', { headers });\n return response.data;\n }\n\n static async deleteFingerprint(req: FingerprintDeleteRequest): Promise<FingerprintDeleteResponse> {\n const { appId, ...body } = req;\n const headers = { appId };\n // Axios delete with body requires 'data' config property\n const response = await agcClient.delete<FingerprintDeleteResponse>('/api/provision/v1/fingerprints', { headers, data: body });\n return response.data;\n }\n\n // ================= ACL Permission =================\n static async applyACL(req: ACLApplyRequest): Promise<ACLApplyResponse> {\n const { appId, ...body } = req;\n const headers = { appId };\n const response = await agcClient.post<ACLApplyResponse>('/api/provision/v1/user/permission/apply', body, { headers });\n return response.data;\n }\n\n static async getACLStatus(req: ACLStatusRequest): Promise<ACLStatusResponse> {\n const headers = { appId: req.appId };\n const response = await agcClient.get<ACLStatusResponse>('/api/provision/v1/user/permission/apply/status', { headers });\n return response.data;\n }\n\n static async getACLQuery(req: ACLQueryRequest): Promise<ACLQueryResponse> {\n const headers = { appId: req.appId };\n const response = await agcClient.get<ACLQueryResponse>('/api/provision/v1/user/permission', { headers });\n return response.data;\n }\n}\n","import { agcClient } from '../core/http';\nimport axios from 'axios';\nimport fs from 'fs';\nimport {\n UploadUrlRequest, UploadUrlResponse,\n MultipartInitRequest, MultipartInitResponse,\n MultipartPartsRequest, MultipartPartsResponse,\n MultipartComposeRequest, MultipartComposeResponse,\n UploadFileOptions\n} from '../types/upload';\n\nexport class UploadService {\n // ================= Raw APIs =================\n\n static async getUploadUrl(req: UploadUrlRequest): Promise<UploadUrlResponse> {\n const response = await agcClient.get<UploadUrlResponse>('/api/publish/v2/upload-url/for-obs', {\n params: req\n });\n return response.data;\n }\n\n static async initMultipart(req: MultipartInitRequest): Promise<MultipartInitResponse> {\n const response = await agcClient.post<MultipartInitResponse>('/api/publish/v2/upload/multipart/init', null, {\n params: req\n });\n return response.data;\n }\n\n static async getMultipartParts(req: MultipartPartsRequest): Promise<MultipartPartsResponse> {\n const { objectId, nspUploadId, parts } = req;\n const response = await agcClient.post<MultipartPartsResponse>('/api/publish/v2/upload/multipart/parts', parts, {\n params: { objectId, nspUploadId }\n });\n return response.data;\n }\n\n static async composeMultipart(req: MultipartComposeRequest): Promise<MultipartComposeResponse> {\n const { objectId, nspUploadId, parts } = req;\n const response = await agcClient.post<MultipartComposeResponse>('/api/publish/v2/upload/multipart/compose', parts, {\n params: { objectId, nspUploadId }\n });\n return response.data;\n }\n\n // ================= High-level Operations =================\n\n /**\n * 封装好的上传文件核心流程(支持根据文件大小自动单文件或分片上传)\n * 文件大小 < 5MB 时使用单文件上传,否则使用分片上传\n */\n static async uploadFile(options: UploadFileOptions): Promise<void> {\n const stat = fs.statSync(options.filePath);\n const fileName = options.filePath.split('/').pop() || 'unknown';\n \n // 如果小于 5MB,可以直接使用单文件上传\n if (stat.size < 5 * 1024 * 1024) {\n await this.uploadSingleFile(options, fileName, stat.size);\n } else {\n await this.uploadMultipartFile(options, fileName, stat.size);\n }\n }\n\n /**\n * 单文件上传流程\n */\n private static async uploadSingleFile(\n options: UploadFileOptions,\n fileName: string,\n contentLength: number\n ): Promise<void> {\n // 1. 获取上传文件地址\n const urlRes = await this.getUploadUrl({\n appId: options.appId,\n fileName,\n contentLength,\n releaseType: options.releaseType,\n chineseMainlandFlag: options.chineseMainlandFlag\n });\n\n if (!urlRes.urlInfo) {\n throw new Error(`Failed to get upload URL: ${JSON.stringify(urlRes.ret)}`);\n }\n\n const { url, headers } = urlRes.urlInfo;\n\n // 2. 上传文件\n const fileStream = fs.createReadStream(options.filePath);\n await axios.put(url, fileStream, {\n headers: {\n ...headers,\n 'Content-Type': 'application/octet-stream',\n },\n maxBodyLength: Infinity,\n maxContentLength: Infinity\n });\n }\n\n /**\n * 分片上传流程\n */\n private static async uploadMultipartFile(\n options: UploadFileOptions,\n fileName: string,\n fileSize: number\n ): Promise<void> {\n // 1. 初始化分片上传\n const initRes = await this.initMultipart({\n appId: options.appId,\n fileName,\n releaseType: options.releaseType,\n chineseMainlandFlag: options.chineseMainlandFlag\n });\n\n const { objectId, nspUploadId, nspPartMinSize = 5242880 } = initRes;\n if (!objectId || !nspUploadId) {\n throw new Error(`Failed to init multipart upload: ${JSON.stringify(initRes.ret)}`);\n }\n\n const partSize = Number(nspPartMinSize);\n const partsCount = Math.ceil(fileSize / partSize);\n\n // 2. 构造分片请求信息以获取各分片的上传地址\n const partsReqBody: Record<string, { length: number }> = {};\n for (let i = 1; i <= partsCount; i++) {\n const start = (i - 1) * partSize;\n const end = Math.min(start + partSize, fileSize);\n partsReqBody[`additionalProp${i}`] = {\n length: end - start\n };\n }\n\n const partsRes = await this.getMultipartParts({\n objectId,\n nspUploadId,\n parts: partsReqBody\n });\n\n const uploadInfoMap = partsRes.uploadInfoMap;\n if (!uploadInfoMap) {\n throw new Error(`Failed to get parts upload URL: ${JSON.stringify(partsRes.ret)}`);\n }\n\n // 3. 上传各分片\n const fd = fs.openSync(options.filePath, 'r');\n const composeReqBody: Record<string, { partObjectId: string; etag: string }> = {};\n\n for (let i = 1; i <= partsCount; i++) {\n const propKey = `additionalProp${i}`;\n const uploadInfo = uploadInfoMap[propKey];\n \n const start = (i - 1) * partSize;\n const end = Math.min(start + partSize, fileSize);\n const length = end - start;\n const buffer = Buffer.alloc(length);\n fs.readSync(fd, buffer, 0, length, start);\n\n const res = await axios.put(uploadInfo.url, buffer, {\n headers: {\n ...uploadInfo.headers,\n 'Content-Type': 'application/octet-stream'\n },\n maxBodyLength: Infinity,\n maxContentLength: Infinity\n });\n\n // 记录ETag供合并分片使用\n const etag = res.headers['etag'];\n composeReqBody[propKey] = {\n partObjectId: uploadInfo.partObjectId || \"\",\n etag: etag\n };\n }\n fs.closeSync(fd);\n\n // 4. 合并分片\n await this.composeMultipart({\n objectId,\n nspUploadId,\n parts: composeReqBody\n });\n }\n}\n","import { agcClient } from '../core/http';\nimport {\n QueryDomainRequest,\n QueryDomainResponse,\n UpdateDomainRequest,\n UpdateDomainResponse,\n QueryDomainConfigRequest,\n QueryDomainConfigResponse,\n VerifyFileRequest,\n PreCheckDomainRequest,\n PreCheckDomainResponse\n} from '../types/domain';\nimport fs from 'fs';\n\nexport class DomainService {\n /**\n * 查询元服务的域名配置信息\n */\n static async queryDomain(req: QueryDomainRequest): Promise<QueryDomainResponse> {\n const response = await agcClient.get<QueryDomainResponse>(\n '/api/dms/domain-manage/v1/app/domain',\n {\n params: { category: req.category },\n headers: { appId: req.appId }\n }\n );\n return response.data;\n }\n\n /**\n * 新增/更新元服务的域名配置信息\n */\n static async updateDomain(req: UpdateDomainRequest): Promise<UpdateDomainResponse> {\n const response = await agcClient.post<UpdateDomainResponse>(\n '/api/dms/domain-manage/v1/app/domain',\n { domains: req.domains },\n {\n params: { category: req.category },\n headers: { appId: req.appId }\n }\n );\n return response.data;\n }\n\n /**\n * 查询域名修改次数/配置上限\n */\n static async queryDomainConfig(req: QueryDomainConfigRequest): Promise<QueryDomainConfigResponse> {\n const response = await agcClient.get<QueryDomainConfigResponse>(\n '/api/dms/domain-manage/v1/app/domain/config',\n {\n params: { appId: req.appId }\n }\n );\n return response.data;\n }\n\n /**\n * 下载域名配置文件\n */\n static async verifyFile(req: VerifyFileRequest, outputPath: string): Promise<void> {\n const response = await agcClient.get(\n '/api/dms/domain-manage/v1/app/domain/verify-file',\n {\n headers: { appId: req.appId },\n responseType: 'stream'\n }\n );\n \n return new Promise((resolve, reject) => {\n const writer = fs.createWriteStream(outputPath);\n response.data.pipe(writer);\n let error: Error | null = null;\n writer.on('error', err => {\n error = err;\n writer.close();\n reject(err);\n });\n writer.on('close', () => {\n if (!error) {\n resolve();\n }\n });\n });\n }\n\n /**\n * 预检查业务域名配置\n */\n static async preCheckDomain(req: PreCheckDomainRequest): Promise<PreCheckDomainResponse> {\n const response = await agcClient.post<PreCheckDomainResponse>(\n '/api/dms/domain-manage/v1/app/domain/pre-check',\n { domain: req.domain },\n {\n headers: { appId: req.appId }\n }\n );\n return response.data;\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { execFileSync } from 'child_process';\nimport crypto from 'crypto';\n\nexport interface SignKeyResult {\n alias: string;\n p12Path: string;\n csrPath: string;\n csrContent: string;\n storePath: string;\n cerPath: string;\n p7bPath: string;\n}\n\nexport interface CreateCsrOptions {\n outDir?: string;\n filename?: string;\n alias: string;\n pwd?: string;\n sdkPath?: string;\n javaPath?: string;\n}\n\nexport class SignService {\n public static async createSignP12AndCsr(options: CreateCsrOptions): Promise<SignKeyResult> {\n const outDir = options.outDir ? path.resolve(options.outDir) : path.join(process.cwd(), 'sign_keys');\n if (!fs.existsSync(outDir)) {\n fs.mkdirSync(outDir, { recursive: true });\n }\n\n const filename = options.filename || this.createSignDefaultFilename();\n const p12FilePath = path.join(outDir, `${filename}.p12`);\n const csrFilePath = path.join(outDir, `${filename}.csr`);\n \n const javaPath = options.javaPath || 'java';\n const sdkPath = options.sdkPath || process.env.HARMONYOS_SDK_PATH;\n if (!sdkPath) {\n throw new Error('sdkPath is required. Provide it via --sdk-path or HARMONYOS_SDK_PATH env var.');\n }\n\n const signToolPath = path.join(sdkPath, 'default', 'openharmony', 'toolchains', 'lib', 'hap-sign-tool.jar');\n\n if (!fs.existsSync(signToolPath)) {\n throw new Error(`hap-sign-tool.jar not found at ${signToolPath}`);\n }\n\n const alias = options.alias;\n const pwd = options.pwd || '123456'; // Default password if not provided\n\n // 1. Generate .p12 file\n this.doCreateSignFileP12(javaPath, signToolPath, alias, pwd, p12FilePath);\n\n // 2. Generate .csr file\n this.doCreateSignFileCsr(javaPath, signToolPath, alias, pwd, p12FilePath, csrFilePath);\n\n // 3. Read .csr file content\n const csrContent = fs.readFileSync(csrFilePath, 'utf8');\n\n const cerPath = path.join(outDir, `${filename}.cer`);\n const p7bPath = path.join(outDir, `${filename}.p7b`);\n\n return {\n alias,\n p12Path: p12FilePath,\n csrPath: csrFilePath,\n csrContent,\n storePath: outDir,\n cerPath,\n p7bPath\n };\n }\n\n private static createSignDefaultFilename(): string {\n const timestamp = Date.now().toString();\n const substring = timestamp.substring(timestamp.length - 5);\n const randomString = crypto.randomInt(100, 1000);\n return `agc-cli-${substring}-${randomString}`;\n }\n\n private static doCreateSignFileP12(javaPath: string, signToolPath: string, alias: string, pwd: string, outFilePath: string) {\n const args = [\n '-jar', signToolPath,\n 'generate-keypair',\n '-keyAlias', alias,\n '-keyPwd', pwd,\n '-keyAlg', 'ECC',\n '-keySize', 'NIST-P-256',\n '-keystoreFile', outFilePath,\n '-keystorePwd', pwd\n ];\n console.log(`Executing: ${javaPath} ${args.join(' ')}`);\n execFileSync(javaPath, args, { stdio: 'inherit' });\n }\n\n private static doCreateSignFileCsr(javaPath: string, signToolPath: string, alias: string, pwd: string, p12Path: string, outFilePath: string) {\n const args = [\n '-jar', signToolPath,\n 'generate-csr',\n '-keyAlias', alias,\n '-keyPwd', pwd,\n '-subject', 'C=CN,O=OpenHarmony,OU=OpenHarmony Community,CN=App Release',\n '-signAlg', 'SHA256withECDSA',\n '-keystoreFile', p12Path,\n '-keystorePwd', pwd,\n '-outFile', outFilePath\n ];\n console.log(`Executing: ${javaPath} ${args.join(' ')}`);\n execFileSync(javaPath, args, { stdio: 'inherit' });\n }\n\n private static readonly COMPONENT = new Int8Array([49,243,9,115,214,175,91,184,211,190,177,88,101,131,192,119]);\n\n private static readDirBytes(dirPath: string): Int8Array {\n const entries = fs.readdirSync(dirPath).filter(f => f !== '.DS_Store');\n return new Int8Array(fs.readFileSync(path.resolve(dirPath, entries[0])));\n }\n\n private static readFd(materialPath: string): Int8Array[] {\n const fdDir = path.resolve(materialPath, 'fd');\n return fs.readdirSync(fdDir)\n .filter(f => f !== '.DS_Store')\n .map(e => this.readDirBytes(path.resolve(fdDir, e)));\n }\n\n private static xorBuffers(a: Int8Array, b: Int8Array): Int8Array {\n const result = new Int8Array(a.byteLength);\n for (let i = 0; i < a.byteLength; i++) result[i] = a[i] ^ b[i];\n return result;\n }\n\n private static xorAll(components: Int8Array[]): Buffer {\n let result = this.xorBuffers(components[0], components[1]);\n for (let i = 2; i < components.length; i++) result = this.xorBuffers(result, components[i]);\n return Buffer.from(result);\n }\n\n private static aesDecrypt(key: Int8Array | Buffer, data: Int8Array | Buffer): Buffer {\n const d = Buffer.from(data);\n const tagLen = (255 & d[0]) << 24 | (255 & d[1]) << 16 | (255 & d[2]) << 8 | 255 & d[3];\n const ivLen = d.length - 4 - tagLen;\n const iv = d.subarray(4, 4 + ivLen);\n const decipher = crypto.createDecipheriv('aes-128-gcm', key, iv);\n decipher.setAuthTag(d.subarray(d.length - 16));\n return Buffer.concat([decipher.update(d.subarray(4 + ivLen, d.length - 16)), decipher.final()]);\n }\n\n private static aesEncrypt(key: Int8Array | Buffer, plaintext: string): string {\n const iv = crypto.randomBytes(12);\n const cipher = crypto.createCipheriv('aes-128-gcm', key, iv);\n const enc = Buffer.concat([cipher.update(plaintext, 'utf-8'), cipher.final()]);\n const tag = cipher.getAuthTag();\n const header = Buffer.alloc(4);\n header.writeUInt32BE(enc.length + 16, 0);\n return Buffer.concat([header, iv, enc, tag]).toString('hex').toUpperCase();\n }\n\n private static deriveEncryptionKey(configDir: string): Int8Array {\n const materialDir = path.resolve(configDir, 'material');\n const fd = this.readFd(materialDir);\n const salt = this.readDirBytes(path.resolve(materialDir, 'ac'));\n const rawKey = new Int8Array(\n crypto.pbkdf2Sync(this.xorAll(fd.concat(this.COMPONENT)).toString(), salt, 10000, 16, 'sha256')\n );\n return new Int8Array(this.aesDecrypt(rawKey, this.readDirBytes(path.resolve(materialDir, 'ce'))));\n }\n\n /**\n * 使用 DevEco Studio 的加密密钥对密码进行 AES-128-GCM 加密,\n * 生成 build-profile.json5 中 signingConfigs 所需的加密密码。\n */\n public static encryptPassword(password: string, configDir?: string): { keyPassword: string; storePassword: string } {\n const dir = configDir || path.join(process.env.HOME || '', '.ohos', 'config');\n if (!fs.existsSync(path.resolve(dir, 'material'))) {\n throw new Error(`未找到加密密钥目录: ${path.resolve(dir, 'material')}。请确认 DevEco Studio 已安装并生成过签名配置。`);\n }\n const key = this.deriveEncryptionKey(dir);\n return {\n keyPassword: this.aesEncrypt(key, password),\n storePassword: this.aesEncrypt(key, password),\n };\n }\n}\n"],"mappings":"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","names":["fs","path","fs","config","axios","import_fs","import_path","path","os","fs","import_axios","axios","config","import_axios","import_fs","fs","axios","import_fs","fs","import_fs","import_path","path","fs","crypto"]}