@oniroproject/oniro-app 0.16.0 → 0.17.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.
package/README.md CHANGED
@@ -148,11 +148,35 @@ Only needed for HarmonyOS signing; see [HarmonyOS apps](#harmonyos-apps).
148
148
  | `--app-privilege-capabilities <list>` | Comma-separated privileges to write into the profile's `app-privilege-capabilities`, e.g. `AllowAppUsePrivilegeExtension` for an app with a privileged extension ability (without it, install fails with `9568344 not allow use privilege extension`). |
149
149
  | `--bootstrap` | No-op if signing material is already present; otherwise generate it. |
150
150
  | `--harmonyos` | Sign a HarmonyOS project via AppGallery Connect instead of the offline flow. See [HarmonyOS apps](#harmonyos-apps). |
151
+ | `--hap <file>` | Sign a prebuilt `.hap` instead of a project and write a signed copy. See [Signing a prebuilt HAP for OpenHarmony](#signing-a-prebuilt-hap-for-openharmony), and with `--harmonyos`, [for HarmonyOS](#signing-a-prebuilt-hap). |
152
+ | `--out <file>` | With `--hap`: where to write the signed HAP (default: next to the input, named `<name>-signed.hap`, or `<name>-resigned.hap` for a `*-signed.hap` input). |
151
153
  | `--team-id <id>` | With `--harmonyos`: AGC team to sign under. |
152
154
  | `--product <name>` | With `--harmonyos`: product to sign (default `default`). |
153
155
  | `--force` | With `--harmonyos`: regenerate even when the existing material is still valid. |
154
156
  | `--store-password <pwd>` / `--key-password <pwd>` | Keystore passwords (default `123456`, the SDK keystore password). |
155
157
 
158
+ #### Signing a prebuilt HAP for OpenHarmony
159
+
160
+ `sign --hap <file>` signs a HAP you have no project for: an unsigned build output, or a HAP signed
161
+ with other material (its signature is replaced). It uses the same SDK development certificate as a
162
+ project, with a profile for the bundle name in the HAP's `module.json`. `--apl`, `--app-feature`,
163
+ `--acls`, `--app-privilege-capabilities` and the password flags apply as for a project; the ACLs are
164
+ not read from the HAP, so pass `--acls` for a permission above the app's apl.
165
+
166
+ ```sh
167
+ oniro-app sign --hap entry-default-unsigned.hap # writes entry-default-signed.hap
168
+ oniro-app sign --hap SystemUI.hap --out SystemUI.hap --apl system_basic --acls ohos.permission.REBOOT
169
+ oniro-app app install entry-default-signed.hap
170
+ ```
171
+
172
+ The signed copy goes next to the input by default (`<name>-unsigned.hap` → `<name>-signed.hap`,
173
+ `<name>.hap` → `<name>-signed.hap`, `<name>-signed.hap` → `<name>-resigned.hap`); only an `--out`
174
+ naming the input re-signs it in place. `--team-id` and `--force` are refused here. Signing is
175
+ offline and needs only `java` and an installed OpenHarmony SDK: the one the HAP's `targetAPIVersion`
176
+ names, else the newest (every release ships the same signing material). Nothing is written to a
177
+ project, and the material is made in a temporary directory that is removed afterwards. A HAP built
178
+ for HarmonyOS is refused with a pointer to `--harmonyos`.
179
+
156
180
  #### `build` — build the app via `hvigorw`
157
181
 
158
182
  `build [project-dir]` (defaults to the current directory). Modules build in parallel by default. An OpenHarmony project whose `compileSdkVersion` SDK is not installed fails before anything runs, naming the release to install. When the compiler output shows system-API errors (`'…' is not exported from Kit '…'`), the error adds a hint about the full SDK.
@@ -489,7 +513,7 @@ oniro-app auth login # once per machine
489
513
  oniro-app create --name MyApp --bundle com.example.myapp \
490
514
  --location ~/projects --sdk 24 --template HarmonyOSApp
491
515
  cd ~/projects/MyApp
492
- oniro-app sign --harmonyos # registers any connected device
516
+ oniro-app sign --harmonyos # registers each connected device that reports a UDID
493
517
  oniro-app build
494
518
  oniro-app app install && oniro-app app launch
495
519
  ```
@@ -517,7 +541,7 @@ Mirrors DevEco Studio's automatic signing:
517
541
 
518
542
  1. generates a local p12 keystore and a CSR (via the SDK's `hap-sign-tool.jar`, so a JDK is needed — DevEco Studio's bundled JBR is used when present);
519
543
  2. has AppGallery Connect issue a debug certificate for that CSR;
520
- 3. registers every connected device's UDID with the team — no device is needed when the team already has some registered (from another machine, or by DevEco Studio);
544
+ 3. registers every connected device's UDID with the team — no device is needed when the team already has some registered (from another machine, or by DevEco Studio). A device that does not report a UDID (`hdc shell bm get -u`; some OpenHarmony builds do not) cannot be registered, so the profile does not cover it;
521
545
  4. issues a debug provisioning profile naming that certificate, all of the team's registered devices, and any ACL-gated permissions the project requests;
522
546
  5. writes an encrypted `signingConfigs` entry into `build-profile.json5`, leaving other entries untouched.
523
547
 
@@ -537,6 +561,37 @@ using both on one team does not revoke the other's signing material.
537
561
  | `--team-id <id>` | AGC team to issue under (default: the account's own id) |
538
562
  | `--product <name>` | Product to sign (default `default`) |
539
563
  | `--force` | Regenerate even when the existing material is still valid |
564
+ | `--hap <file>` | Sign a prebuilt HAP instead of a project (below) |
565
+ | `--out <file>` | With `--hap`: where to write the signed HAP |
566
+
567
+ ### Signing a prebuilt HAP
568
+
569
+ `oniro-app sign --harmonyos --hap <file>` signs a HAP you have no project for: an unsigned build
570
+ output, or a HAP signed with other material (its signature is replaced). The bundle name and the
571
+ ACL-gated permissions come from the `module.json` packed in the HAP; everything else works as for
572
+ a project. AGC issues the certificate and debug profile, which name the team's registered devices.
573
+
574
+ ```sh
575
+ oniro-app sign --harmonyos --hap entry-default-unsigned.hap # writes entry-default-signed.hap
576
+ oniro-app sign --harmonyos --hap app.hap --out /tmp/app.hap
577
+ oniro-app app install entry-default-signed.hap
578
+ ```
579
+
580
+ The signed copy goes next to the input by default: `<name>-unsigned.hap` becomes
581
+ `<name>-signed.hap`, `<name>.hap` becomes `<name>-signed.hap`, and `<name>-signed.hap` becomes
582
+ `<name>-resigned.hap`, so the input is never overwritten unless `--out` names it. The output is
583
+ never left half-written either: the HAP is signed to a temporary file, then moved into place.
584
+ `--apl`, `--acls` and the other OpenHarmony profile flags are refused here, since AGC decides
585
+ the profile and the ACLs come from the HAP.
586
+
587
+ The material is kept per bundle name (`hap_<bundle>_…` in `ONIRO_HARMONYOS_SIGNING_DIR`), with its
588
+ keystore password stored encrypted next to it, and is reused while it is still valid, as for a
589
+ project. All of oniro-app's material for a team, project or HAP, shares the team's one
590
+ `oniro_debug_<team>.cer` certificate in AGC. Regenerating any of it deletes that certificate and
591
+ has a new one issued, and the other material is not told: it is still reused locally, but was
592
+ issued for a certificate AGC no longer has. If it then stops installing, regenerate it with
593
+ `--force`. Only stage-model HAPs are supported, and a HAP built for OpenHarmony is refused, since
594
+ a HarmonyOS device would not run it.
540
595
 
541
596
  ### Account regions
542
597
 
package/dist/oniro-app.js CHANGED
@@ -362,6 +362,8 @@ import {
362
362
  detectRuntimeOs,
363
363
  generateSigningConfigs,
364
364
  harmonyOsAutoSign,
365
+ harmonyOsSignHap,
366
+ signOpenHarmonyHap,
365
367
  prepareSigning,
366
368
  getOhosBaseSdkHome
367
369
  } from "@oniroproject/core";
@@ -376,7 +378,8 @@ function registerSignCommand(program) {
376
378
  "cert (issuer=pki_internal) and its bundled validity window \u2014 dev/local builds only.",
377
379
  "Overwrites the `signingConfigs` block in build-profile.json5 (other keys preserved).",
378
380
  "HarmonyOS projects need --harmonyos instead, which has AppGallery Connect issue the",
379
- "certificate and profile for a signed-in Huawei account (`oniro-app auth login`)."
381
+ "certificate and profile for a signed-in Huawei account (`oniro-app auth login`).",
382
+ "With --hap <file>, signs a prebuilt HAP instead of a project (with --harmonyos, for HarmonyOS)."
380
383
  ].join(" ")
381
384
  ).addOption(
382
385
  new Option(
@@ -400,11 +403,65 @@ function registerSignCommand(program) {
400
403
  ).argParser(parseAclsList)
401
404
  ).option(
402
405
  "--harmonyos",
403
- "Sign a HarmonyOS project through AppGallery Connect. Needs `oniro-app auth login`, and a connected device unless the team already has devices registered."
406
+ "Sign a HarmonyOS project through AppGallery Connect. Needs `oniro-app auth login`, and a device registered to the team: a connected device is registered if it reports a UDID (`hdc shell bm get -u`)."
407
+ ).option(
408
+ "--hap <file>",
409
+ "Sign this prebuilt .hap (unsigned, or signed with other material) instead of a project, and write a signed copy (see --out). The bundle name is read from the HAP. For OpenHarmony, --apl, --app-feature, --acls and --app-privilege-capabilities apply as for a project; with --harmonyos, the ACL permissions are read from the HAP too."
410
+ ).option(
411
+ "--out <file>",
412
+ "With --hap: where to write the signed HAP. Default: next to the input, `<name>-unsigned.hap` \u2192 `<name>-signed.hap`, `<name>.hap` \u2192 `<name>-signed.hap`, `<name>-signed.hap` \u2192 `<name>-resigned.hap`. Name the input itself to re-sign it in place."
404
413
  ).option("--team-id <id>", "With --harmonyos: the AGC team to sign under. Default: the account's own (`oniro-app auth team list`).").option("--product <name>", "With --harmonyos: the product to sign. Default `default`.").option("--force", "With --harmonyos: regenerate the certificate and profile even when they are still valid.").option("--bootstrap", "No-op if signing material is already present; otherwise generate it.").option("--store-password <pwd>", "Keystore store password (default 123456 \u2014 the SDK keystore password).").option("--key-password <pwd>", "Keystore key password (default 123456 \u2014 the SDK keystore password).").action(
405
414
  async (projectDir, opts) => {
406
415
  const { config, logger } = getRuntime();
407
416
  const dir = path3.resolve(projectDir ?? process.cwd());
417
+ const passwords = opts.storePassword || opts.keyPassword ? { store: opts.storePassword ?? "123456", key: opts.keyPassword ?? "123456" } : void 0;
418
+ if (opts.out && !opts.hap) throw new OniroError("--out names where `--hap` writes the signed HAP; pass --hap too.");
419
+ if (opts.hap) {
420
+ if (projectDir) throw new OniroError("Pass either a project directory or --hap, not both.");
421
+ if (opts.product || opts.bootstrap) {
422
+ throw new OniroError(`--${opts.product ? "product" : "bootstrap"} applies to a project, not to --hap.`);
423
+ }
424
+ const ignored = opts.harmonyos ? [
425
+ opts.apl !== "normal" && "--apl",
426
+ opts.appFeature && "--app-feature",
427
+ opts.acls && "--acls (the ACLs are read from the HAP)",
428
+ opts.appPrivilegeCapabilities && "--app-privilege-capabilities",
429
+ (opts.storePassword || opts.keyPassword) && "--store-password/--key-password"
430
+ ] : [opts.teamId && "--team-id", opts.force && "--force"];
431
+ const unsupported = ignored.filter((flag) => typeof flag === "string");
432
+ if (unsupported.length > 0) {
433
+ throw new OniroError(
434
+ `${unsupported.join(", ")} ${unsupported.length > 1 ? "do" : "does"} not apply to ${opts.harmonyos ? "--harmonyos --hap" : "--hap without --harmonyos"}.`
435
+ );
436
+ }
437
+ if (!opts.harmonyos) {
438
+ const result2 = await signOpenHarmonyHap({
439
+ hapPath: opts.hap,
440
+ outPath: opts.out,
441
+ sdkHome: getOhosBaseSdkHome(config),
442
+ apl: opts.apl,
443
+ appFeature: opts.appFeature,
444
+ acls: opts.acls,
445
+ appPrivilegeCapabilities: opts.appPrivilegeCapabilities,
446
+ passwords,
447
+ applicationCertPath: config.get("applicationCertPath", "") || void 0,
448
+ logger
449
+ });
450
+ logger.info(`Signed ${result2.bundleName} into ${result2.outPath}.`);
451
+ return;
452
+ }
453
+ const result = await harmonyOsSignHap({
454
+ config,
455
+ session: createHarmonyOsSession({ config, logger }),
456
+ hapPath: opts.hap,
457
+ outPath: opts.out,
458
+ teamId: opts.teamId,
459
+ force: opts.force,
460
+ logger
461
+ });
462
+ logger.info(`Signed ${result.bundleName} into ${result.outPath} (profile names ${result.deviceIds.length} device(s)).`);
463
+ return;
464
+ }
408
465
  if (opts.harmonyos) {
409
466
  const result = await harmonyOsAutoSign({
410
467
  config,
@@ -423,7 +480,6 @@ function registerSignCommand(program) {
423
480
  `${dir} targets HarmonyOS, which needs a certificate from AppGallery Connect: run \`oniro-app auth login\` once, then \`oniro-app sign --harmonyos\`.`
424
481
  );
425
482
  }
426
- const passwords = opts.storePassword || opts.keyPassword ? { store: opts.storePassword ?? "123456", key: opts.keyPassword ?? "123456" } : void 0;
427
483
  if (opts.bootstrap) {
428
484
  const result = prepareSigning({
429
485
  config,
@@ -2015,7 +2071,7 @@ function registerHdcCommand(program) {
2015
2071
  }
2016
2072
 
2017
2073
  // src/bin/oniro-app.ts
2018
- var CLI_VERSION = "0.16.0";
2074
+ var CLI_VERSION = "0.17.0";
2019
2075
  function buildProgram() {
2020
2076
  const program = new Command4().name("oniro-app").description(
2021
2077
  "Cross-platform CLI for Oniro/OpenHarmony app development.\n\nDesigned for non-interactive use (CI, scripts, agents): every command\ntakes explicit flags, results go to stdout, progress/logs go to stderr,\nand a non-zero exit code indicates failure."
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin/oniro-app.ts","../src/commands/sdk.ts","../src/adapters/logger.ts","../src/adapters/progress.ts","../src/adapters/config.ts","../src/lib/runtime.ts","../src/commands/cmdtools.ts","../src/commands/emulator.ts","../src/commands/build.ts","../src/commands/sign.ts","../src/commands/auth.ts","../src/commands/app.ts","../src/commands/create.ts","../src/lib/templateRoot.ts","../src/commands/templates.ts","../src/commands/reboot.ts","../src/commands/wait.ts","../src/lib/target.ts","../src/lib/logSince.ts","../src/commands/watch.ts","../src/commands/screenshot.ts","../src/lib/screenshotImage.ts","../src/commands/dump.ts","../src/lib/layoutText.ts","../src/commands/devices.ts","../src/commands/file.ts","../src/commands/lint.ts","../src/commands/input.ts","../src/commands/logs.ts","../src/lib/logBundle.ts","../src/commands/hdc.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { OniroError } from '@oniroproject/core';\nimport { registerSdkCommand } from '../commands/sdk.js';\nimport { registerCmdToolsCommand } from '../commands/cmdtools.js';\nimport { registerEmulatorCommand } from '../commands/emulator.js';\nimport { registerBuildCommand } from '../commands/build.js';\nimport { registerSignCommand } from '../commands/sign.js';\nimport { registerAuthCommand } from '../commands/auth.js';\nimport { registerAppCommand } from '../commands/app.js';\nimport { registerCreateCommand } from '../commands/create.js';\nimport { registerTemplatesCommand } from '../commands/templates.js';\nimport { registerRebootCommand } from '../commands/reboot.js';\nimport { registerWaitCommand } from '../commands/wait.js';\nimport { registerWatchCommand } from '../commands/watch.js';\nimport { registerScreenshotCommand } from '../commands/screenshot.js';\nimport { registerDumpCommand } from '../commands/dump.js';\nimport { registerDevicesCommand } from '../commands/devices.js';\nimport { registerFileCommand } from '../commands/file.js';\nimport { registerLintCommand } from '../commands/lint.js';\nimport { registerInputCommand } from '../commands/input.js';\nimport { registerLogsCommand } from '../commands/logs.js';\nimport { registerHdcCommand } from '../commands/hdc.js';\n\ndeclare const __CLI_VERSION__: string;\nconst CLI_VERSION = __CLI_VERSION__;\n\nfunction buildProgram(): Command {\n const program = new Command()\n .name('oniro-app')\n .description(\n 'Cross-platform CLI for Oniro/OpenHarmony app development.\\n\\n' +\n 'Designed for non-interactive use (CI, scripts, agents): every command\\n' +\n 'takes explicit flags, results go to stdout, progress/logs go to stderr,\\n' +\n 'and a non-zero exit code indicates failure.',\n )\n .version(CLI_VERSION)\n .showHelpAfterError()\n // Lets `hdc` pass its arguments through untouched; global options go before the command.\n .enablePositionalOptions();\n\n registerSdkCommand(program);\n registerCmdToolsCommand(program);\n registerEmulatorCommand(program);\n registerBuildCommand(program);\n registerSignCommand(program);\n registerAuthCommand(program);\n registerAppCommand(program);\n registerCreateCommand(program);\n registerTemplatesCommand(program);\n registerRebootCommand(program);\n registerWaitCommand(program);\n registerWatchCommand(program);\n registerScreenshotCommand(program);\n registerDumpCommand(program);\n registerDevicesCommand(program);\n registerFileCommand(program);\n registerLintCommand(program);\n registerInputCommand(program);\n registerLogsCommand(program);\n registerHdcCommand(program);\n\n return program;\n}\n\nasync function main(): Promise<void> {\n const program = buildProgram();\n try {\n await program.parseAsync(process.argv);\n } catch (err) {\n const message = err instanceof OniroError ? err.message : err instanceof Error ? err.message : String(err);\n process.stderr.write(`[error] ${message}\\n`);\n if (process.env.ONIRO_DEBUG === '1' && err instanceof Error && err.stack) {\n process.stderr.write(`${err.stack}\\n`);\n }\n process.exit(1);\n }\n}\n\nvoid main();\n","import { Command } from 'commander';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport {\n ALL_SDKS,\n OHOS_DAILY_BUILDS_URL,\n downloadAndInstallSdk,\n getOsFolder,\n getSdkRootDir,\n getSupportedSdksForUi,\n installSdkFromArchive,\n removeSdk,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nconst FULL_SDK_TIP =\n 'Tip: the full SDK (with system APIs) is not on the release mirror. Download an ohos-sdk-full archive ' +\n `from the OpenHarmony daily builds, ${OHOS_DAILY_BUILDS_URL}, and install it with ` +\n '`oniro-app sdk install --from-archive <archive>`.';\n\nexport function registerSdkCommand(program: Command): void {\n const sdk = program.command('sdk').description('Manage OpenHarmony SDK installs.');\n\n sdk\n .command('install [version]')\n .description(\n 'Download and install an OpenHarmony SDK (skips if already installed), or install one from a local ' +\n 'archive with --from-archive.',\n )\n .option(\n '--from-archive <path>',\n 'Install from a local SDK .tar.gz instead of downloading, e.g. the full SDK. The API level is read ' +\n 'from the archive.',\n )\n .option('--force', 'Reinstall even if the SDK is already present.')\n .option(\n '--tmp-dir <path>',\n 'Directory for download/extract temporaries (default: ONIRO_TMP_DIR, else .oniro-tmp next to ' +\n 'the install target). Use this when that filesystem is short on space.',\n )\n .addHelpText('after', `\\n${FULL_SDK_TIP}`)\n .action(async (version: string | undefined, opts: { fromArchive?: string; force?: boolean; tmpDir?: string }) => {\n const { config, logger, progress } = getRuntime();\n if (opts.fromArchive) {\n if (version) throw new Error('Pass either a version or --from-archive, not both.');\n const archivePath = path.resolve(opts.fromArchive);\n logger.info(`Installing OpenHarmony SDK from ${archivePath}...`);\n const installed = await installSdkFromArchive({\n config,\n archivePath,\n force: opts.force,\n progress,\n logger,\n tmpDir: opts.tmpDir,\n });\n const label = installed.version ? `SDK ${installed.version} (api ${installed.api})` : `SDK api ${installed.api}`;\n logger.info(`${label} installed at ${installed.dir}.`);\n return;\n }\n if (!version) {\n throw new Error(\n `Name an SDK version (${ALL_SDKS.map((s) => s.version).join(', ')}) or pass --from-archive <path>.\\n` +\n FULL_SDK_TIP,\n );\n }\n const release = ALL_SDKS.find((s) => s.version === version);\n if (!release) {\n throw new Error(\n `Unknown SDK version \"${version}\". Known: ${ALL_SDKS.map((s) => s.version).join(', ')}`,\n );\n }\n const sdkInstallDir = path.join(getSdkRootDir(config), getOsFolder(), release.api);\n if (fs.existsSync(sdkInstallDir) && !opts.force) {\n logger.info(\n `SDK ${release.version} (api ${release.api}) already installed at ${sdkInstallDir}; pass --force to reinstall.`,\n );\n return;\n }\n logger.info(`Installing OpenHarmony SDK ${release.version} (api ${release.api})...`);\n await downloadAndInstallSdk({\n config,\n version: release.version,\n api: release.api,\n progress,\n logger,\n tmpDir: opts.tmpDir,\n });\n logger.info('SDK installed.');\n });\n\n sdk\n .command('list')\n .description('List known SDK versions and whether they are installed on this machine.')\n .option('--json', 'Emit machine-readable JSON instead of a table.')\n .action((opts: { json?: boolean }) => {\n const { config } = getRuntime();\n const sdks = getSupportedSdksForUi(config);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(sdks, null, 2)}\\n`);\n return;\n }\n const rows = sdks.map((s) => `${s.installed ? '*' : ' '} ${s.version.padEnd(8)} api ${s.api}`);\n process.stdout.write(`${rows.join('\\n')}\\n`);\n });\n\n sdk\n .command('remove <api>')\n .description('Remove an installed SDK by API level (e.g. 18, 20).')\n .action((api: string) => {\n const { config, logger } = getRuntime();\n const removed = removeSdk(config, api);\n if (!removed) {\n logger.warn(`No SDK with api ${api} found under the configured SDK root.`);\n process.exit(1);\n }\n logger.info(`Removed SDK api ${api}.`);\n });\n}\n","import type { Logger } from '@oniroproject/core';\n\n/**\n * Stderr-only logger. All diagnostic output goes to stderr so command stdout\n * stays clean for machine consumers (json results, paths, etc.).\n *\n * Debug lines are suppressed unless `ONIRO_DEBUG=1`.\n */\nexport function createCliLogger(): Logger {\n const debugEnabled = process.env.ONIRO_DEBUG === '1' || process.env.ONIRO_DEBUG === 'true';\n return {\n debug(m) {\n if (debugEnabled) process.stderr.write(`[debug] ${m}\\n`);\n },\n info(m) {\n process.stderr.write(`${m}\\n`);\n },\n warn(m) {\n process.stderr.write(`[warn] ${m}\\n`);\n },\n error(m) {\n process.stderr.write(`[error] ${m}\\n`);\n },\n };\n}\n","import type { ProgressReporter } from '@oniroproject/core';\n\n/**\n * Line-per-update progress reporter, designed for machine consumers and log scrapers.\n * Format: `[progress NN%] message` (or `[progress] message` if no percent is known).\n * Updates that don't change the percent and don't carry a message are suppressed\n * to keep output volume reasonable on chatty downloads.\n */\nexport function createCliProgress(): ProgressReporter {\n let total = 0;\n let lastEmitted = -1;\n let lastMessage = '';\n return {\n report({ message, increment }) {\n if (typeof increment === 'number') total = Math.min(100, total + increment);\n const pct = total > 0 ? Math.round(total) : null;\n const msg = message ?? lastMessage;\n // Drop redundant updates: same message, same percent.\n if (pct === lastEmitted && msg === lastMessage) return;\n const prefix = pct === null ? '[progress]' : `[progress ${pct}%]`;\n process.stderr.write(`${prefix} ${msg}\\n`);\n lastEmitted = pct ?? lastEmitted;\n if (message) lastMessage = message;\n },\n };\n}\n","import * as os from 'node:os';\nimport type { ConfigKey, ConfigProvider } from '@oniroproject/core';\n\n/**\n * Maps a core ConfigKey to its environment variable name.\n * Convention: ONIRO_<UPPER_SNAKE>.\n */\nconst ENV_VAR_BY_KEY: Record<ConfigKey, string> = {\n sdkRootDir: 'ONIRO_SDK_ROOT_DIR',\n cmdToolsPath: 'ONIRO_CMD_TOOLS_PATH',\n hdcPath: 'ONIRO_HDC',\n emulatorDir: 'ONIRO_EMULATOR_DIR',\n hapPath: 'ONIRO_HAP_PATH',\n cmdToolsUrlLinux: 'ONIRO_CMD_TOOLS_URL_LINUX',\n cmdToolsUrlWindows: 'ONIRO_CMD_TOOLS_URL_WINDOWS',\n cmdToolsUrlMac: 'ONIRO_CMD_TOOLS_URL_MAC',\n emulatorUrl: 'ONIRO_EMULATOR_URL',\n tmpDir: 'ONIRO_TMP_DIR',\n sdkUrlBase: 'ONIRO_SDK_URL_BASE',\n applicationCertPath: 'ONIRO_APPLICATION_CERT_PATH',\n harmonyosSdkPath: 'ONIRO_HARMONYOS_SDK_PATH',\n harmonyosAuthDir: 'ONIRO_HARMONYOS_AUTH_DIR',\n harmonyosSigningDir: 'ONIRO_HARMONYOS_SIGNING_DIR',\n};\n\n/**\n * Reads configuration from environment variables (ONIRO_*). Returns the fallback\n * when the variable is unset or empty. Expands `${userHome}` to the user's home\n * directory for parity with the VS Code extension's `${userHome}` expansion.\n */\nexport function createEnvConfig(env: NodeJS.ProcessEnv = process.env): ConfigProvider {\n return {\n get<T extends string | number | boolean>(key: ConfigKey, fallback: T): T {\n const envName = ENV_VAR_BY_KEY[key];\n const raw = env[envName];\n if (raw === undefined || raw === '') return fallback;\n const expanded = raw.includes('${userHome}')\n ? raw.replace(/\\$\\{userHome\\}/g, os.homedir())\n : raw;\n return expanded as unknown as T;\n },\n };\n}\n","import type { ConfigProvider, Logger, ProgressReporter } from '@oniroproject/core';\nimport { createCliLogger } from '../adapters/logger.js';\nimport { createCliProgress } from '../adapters/progress.js';\nimport { createEnvConfig } from '../adapters/config.js';\n\nexport interface CliRuntime {\n logger: Logger;\n config: ConfigProvider;\n progress: ProgressReporter;\n}\n\nlet cached: CliRuntime | null = null;\n\n/**\n * Build (and cache) the per-process runtime used by every command. Tests can\n * override the cached runtime via `setRuntime` to inject mocks.\n */\nexport function getRuntime(): CliRuntime {\n if (!cached) {\n cached = {\n logger: createCliLogger(),\n config: createEnvConfig(),\n progress: createCliProgress(),\n };\n }\n return cached;\n}\n\nexport function setRuntime(runtime: CliRuntime | null): void {\n cached = runtime;\n}\n","import { Command } from 'commander';\nimport { getCmdToolsStatus, installCmdTools, isCmdToolsInstalled, removeCmdTools } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerCmdToolsCommand(program: Command): void {\n const cmdtools = program.command('cmdtools').description('Manage OpenHarmony command-line tools.');\n\n cmdtools\n .command('install')\n .description('Install the OpenHarmony command-line tools (hvigorw, ohpm, hdc). Skips if already installed.')\n .option('--from-zip <path>', 'Install from a local ZIP instead of downloading.')\n .option('--force', 'Reinstall even if the tools are already present.')\n .option(\n '--tmp-dir <path>',\n 'Directory for download/extract temporaries (default: ONIRO_TMP_DIR, else .oniro-tmp next to ' +\n 'the install target). Use this when that filesystem is short on space.',\n )\n .action(async (opts: { fromZip?: string; force?: boolean; tmpDir?: string }) => {\n const { config, logger, progress } = getRuntime();\n if (isCmdToolsInstalled(config) && !opts.force) {\n logger.info('Command-line tools already installed; pass --force to reinstall.');\n return;\n }\n logger.info('Installing OpenHarmony command-line tools...');\n await installCmdTools({ config, progress, logger, localZipPath: opts.fromZip, tmpDir: opts.tmpDir });\n logger.info('Command-line tools installed.');\n });\n\n cmdtools\n .command('status')\n .description(\n 'Report whether the command-line tools are installed, their version and flavour (HarmonyOS or ' +\n 'OpenHarmony), and the hdc binary every device command uses.',\n )\n .option('--json', 'Emit machine-readable JSON.')\n .action((opts: { json?: boolean }) => {\n const { config } = getRuntime();\n const status = getCmdToolsStatus(config);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(status, null, 2)}\\n`);\n return;\n }\n process.stdout.write(`${status.status}\\n`);\n process.stdout.write(`path: ${status.path}\\n`);\n if (status.flavour) process.stdout.write(`flavour: ${status.flavour}\\n`);\n process.stdout.write(`hdc: ${status.hdc.path}${status.hdc.exists ? '' : ' (missing)'}\\n`);\n if (!status.installed) process.exit(1);\n });\n\n cmdtools\n .command('remove')\n .description('Delete the configured command-line tools directory.')\n .action(() => {\n const { config, logger } = getRuntime();\n removeCmdTools(config);\n logger.info('Command-line tools removed.');\n });\n}\n","import { Command } from 'commander';\nimport {\n attemptHdcConnection,\n getEmulatorStatus,\n installEmulator,\n isEmulatorInstalled,\n removeEmulator,\n startEmulator,\n stopEmulator,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerEmulatorCommand(program: Command): void {\n const emu = program.command('emulator').description('Manage the Oniro emulator.');\n\n emu\n .command('install')\n .description('Download and install the Oniro emulator (QEMU-based). Skips if already installed.')\n .option('--force', 'Reinstall even if the emulator is already present.')\n .option(\n '--tmp-dir <path>',\n 'Directory for the downloaded ZIP (default: ONIRO_TMP_DIR, else .oniro-tmp next to the ' +\n 'install target). Use this when that filesystem is short on space.',\n )\n .action(async (opts: { force?: boolean; tmpDir?: string }) => {\n const { config, logger, progress } = getRuntime();\n if (isEmulatorInstalled(config) && !opts.force) {\n logger.info('Emulator already installed; pass --force to reinstall.');\n return;\n }\n logger.info('Installing Oniro emulator...');\n await installEmulator({ config, progress, logger, tmpDir: opts.tmpDir });\n logger.info('Emulator installed.');\n });\n\n emu\n .command('start')\n .description('Start the Oniro emulator via the bundled launcher (run.sh / run.bat). Detaches so the CLI can exit while the emulator keeps running.')\n .option('--headless', 'Launch headless (VNC + telnet serial, no local window). Required in CI.')\n .option('--log <path>', 'Redirect launcher stdout/stderr to this file. Defaults to discarding output.')\n .option('--wait-for-hdc <seconds>', 'Wait up to N seconds for hdc to connect. 0 = do not wait.', (v) => parseInt(v, 10), 0)\n .option('--connect <host:port>', 'Override the launcher\\'s hdc port-forward bind address. Pass 0.0.0.0:55555 on hosts where QEMU refuses to bind 127.0.0.1 (some CI runners).')\n .action(async (opts: { headless?: boolean; log?: string; waitForHdc: number; connect?: string }) => {\n const { config, logger } = getRuntime();\n await startEmulator({\n config,\n logger,\n headless: opts.headless === true,\n logFile: opts.log,\n waitForHdcSeconds: opts.waitForHdc,\n connect: opts.connect,\n });\n logger.info('Emulator start command complete.');\n });\n\n emu\n .command('status')\n .description(\n 'Report whether the Oniro emulator is installed, running, and connected to hdc, without starting it. ' +\n 'Exits 1 when it is not installed.',\n )\n .option('--address <addr>', 'hdc address the emulator listens on', '127.0.0.1:55555')\n .option('--json', 'Emit machine-readable JSON.')\n .action(async (opts: { address: string; json?: boolean }) => {\n const { config, logger } = getRuntime();\n const status = await getEmulatorStatus(config, { address: opts.address, logger });\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(status, null, 2)}\\n`);\n } else {\n process.stdout.write(\n `installed: ${status.installed ? 'yes' : 'no'} (${status.dir})\\n` +\n `running: ${status.running ? 'yes' : 'no'}\\n` +\n `connected: ${status.connected ? 'yes' : 'no'} (${status.address})\\n`,\n );\n }\n if (!status.installed) process.exitCode = 1;\n });\n\n emu\n .command('stop')\n .description('Kill running emulator processes.')\n .action(async () => {\n const { logger } = getRuntime();\n await stopEmulator(logger);\n logger.info('Emulator stopped.');\n });\n\n emu\n .command('connect')\n .description('Attempt to connect hdc to the emulator.')\n .option('--address <addr>', 'hdc address to connect to', '127.0.0.1:55555')\n .action(async (opts: { address: string }) => {\n const { config, logger } = getRuntime();\n const ok = await attemptHdcConnection(config, opts.address, logger);\n if (!ok) {\n logger.error(`Could not connect hdc to ${opts.address}.`);\n process.exit(1);\n }\n logger.info(`hdc connected to ${opts.address}.`);\n });\n\n emu\n .command('remove')\n .description('Delete the configured emulator directory.')\n .action(() => {\n const { config, logger } = getRuntime();\n removeEmulator(config);\n logger.info('Emulator removed.');\n });\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport { SdkNotInstalledError, buildHap, downloadAndInstallSdk } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\ninterface BuildOpts {\n product: string;\n module?: string;\n mode?: string;\n task: string;\n deps: boolean;\n parallel: boolean;\n installSdk?: boolean;\n json?: boolean;\n}\n\nexport function registerBuildCommand(program: Command): void {\n program\n .command('build [project-dir]')\n .description(\n 'Build an OpenHarmony or HarmonyOS app via hvigorw. Defaults to the current directory. ' +\n 'Projects declaring runtimeOS \"HarmonyOS\" build against the HarmonyOS SDK (ONIRO_HARMONYOS_SDK_PATH or an installed DevEco Studio). ' +\n 'An OpenHarmony project fails early, naming the release to install, when the SDK for its compileSdkVersion is missing.',\n )\n .option('--product <product>', 'hvigor product name', 'default')\n .option('--module <module>', 'restrict the build to a specific module')\n .option('--mode <mode>', 'hvigor build mode (e.g. release, debug)')\n .option('--task <task>', 'hvigor task to run', 'assembleHap')\n .option('--no-deps', 'skip the automatic `ohpm install --all` when oh_modules/ is missing')\n .option('--no-parallel', 'build modules serially (default: parallel)')\n .option('--install-sdk', 'install the OpenHarmony SDK the project compiles against when it is missing, then build')\n .option('--json', 'emit the build result (discovered HAPs, warnings) as JSON')\n .action(async (projectDir: string | undefined, opts: BuildOpts) => {\n const { config, logger, progress } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n logger.info(`Building project at ${dir}...`);\n const build = () =>\n buildHap({\n config,\n projectDir: dir,\n product: opts.product,\n module: opts.module,\n mode: opts.mode,\n task: opts.task,\n autoInstallDeps: opts.deps,\n parallel: opts.parallel,\n logger,\n // The logger already echoes spawn output; this hook is for streaming to other UIs.\n onOutput: () => {},\n });\n let result;\n try {\n result = await build();\n } catch (err) {\n if (!(err instanceof SdkNotInstalledError && err.version && opts.installSdk)) throw err;\n logger.info(`Installing OpenHarmony SDK ${err.version} (api ${err.api}), which the project compiles against...`);\n await downloadAndInstallSdk({ config, version: err.version, api: err.api, progress, logger });\n result = await build();\n }\n for (const w of result.warnings) logger.warn(w);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n }\n logger.info('Build complete.');\n });\n}\n","import { Command, Option } from 'commander';\nimport * as path from 'node:path';\nimport {\n APL_VALUES,\n APP_FEATURE_VALUES,\n OniroError,\n createHarmonyOsSession,\n detectRuntimeOs,\n generateSigningConfigs,\n harmonyOsAutoSign,\n prepareSigning,\n getOhosBaseSdkHome,\n type Apl,\n type AppFeature,\n type SigningPasswords,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nfunction parseAclsList(value: string): string[] {\n return value\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n}\n\nexport function registerSignCommand(program: Command): void {\n program\n .command('sign [project-dir]')\n .description(\n [\n 'Generate signing keys, certificates, and signingConfigs for an OpenHarmony project.',\n 'Requires java on PATH. The generated profile uses the SDK\\'s built-in development',\n 'cert (issuer=pki_internal) and its bundled validity window — dev/local builds only.',\n 'Overwrites the `signingConfigs` block in build-profile.json5 (other keys preserved).',\n 'HarmonyOS projects need --harmonyos instead, which has AppGallery Connect issue the',\n 'certificate and profile for a signed-in Huawei account (`oniro-app auth login`).',\n ].join(' '),\n )\n .addOption(\n new Option(\n '--apl <level>',\n 'Ability Privilege Level written into the profile. Apps that request permissions above `normal` (e.g. ohos.permission.GET_WIFI_INFO_INTERNAL) need system_basic or system_core, which also switches the HAP-signing key to \"OpenHarmony Application Release\".',\n )\n .choices([...APL_VALUES])\n .default('normal'),\n )\n .addOption(\n new Option(\n '--app-feature <feature>',\n 'App feature written into the profile. Defaults: hos_normal_app for apl=normal; hos_system_app for apl=system_basic/system_core.',\n ).choices([...APP_FEATURE_VALUES]),\n )\n .addOption(\n new Option(\n '--acls <list>',\n 'Comma-separated permission names to write into the profile\\'s acls.allowed-acls. Required for apps that request permissions above their apl (e.g. a system_basic app requesting ohos.permission.CAPTURE_SCREEN). Example: --acls ohos.permission.REBOOT,ohos.permission.INJECT_INPUT_EVENT',\n ).argParser(parseAclsList),\n )\n .addOption(\n new Option(\n '--app-privilege-capabilities <list>',\n 'Comma-separated privileges to write into the profile\\'s app-privilege-capabilities. An app that declares a privileged extension ability (e.g. an AccessibilityExtensionAbility) needs AllowAppUsePrivilegeExtension, else install fails with 9568344 \"not allow use privilege extension\". Others include AllowAppMultiProcess and AllowAppDesktopIconHide.',\n ).argParser(parseAclsList),\n )\n .option(\n '--harmonyos',\n 'Sign a HarmonyOS project through AppGallery Connect. Needs `oniro-app auth login`, and a connected device unless the team already has devices registered.',\n )\n .option('--team-id <id>', 'With --harmonyos: the AGC team to sign under. Default: the account\\'s own (`oniro-app auth team list`).')\n .option('--product <name>', 'With --harmonyos: the product to sign. Default `default`.')\n .option('--force', 'With --harmonyos: regenerate the certificate and profile even when they are still valid.')\n .option('--bootstrap', 'No-op if signing material is already present; otherwise generate it.')\n .option('--store-password <pwd>', 'Keystore store password (default 123456 — the SDK keystore password).')\n .option('--key-password <pwd>', 'Keystore key password (default 123456 — the SDK keystore password).')\n .action(\n async (\n projectDir: string | undefined,\n opts: {\n apl: Apl;\n appFeature?: AppFeature;\n acls?: string[];\n appPrivilegeCapabilities?: string[];\n bootstrap?: boolean;\n storePassword?: string;\n keyPassword?: string;\n harmonyos?: boolean;\n teamId?: string;\n product?: string;\n force?: boolean;\n },\n ) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n\n if (opts.harmonyos) {\n const result = await harmonyOsAutoSign({\n config,\n session: createHarmonyOsSession({ config, logger }),\n projectDir: dir,\n productName: opts.product,\n teamId: opts.teamId,\n force: opts.force,\n logger,\n });\n logger.info(`Signing configs ready for ${result.bundleName} (profile names ${result.deviceIds.length} device(s)).`);\n return;\n }\n // The OpenHarmony development certificate cannot sign for a HarmonyOS device.\n if (detectRuntimeOs(dir, opts.product) === 'HarmonyOS') {\n throw new OniroError(\n `${dir} targets HarmonyOS, which needs a certificate from AppGallery Connect: run \\`oniro-app auth login\\` once, then \\`oniro-app sign --harmonyos\\`.`,\n );\n }\n const passwords: SigningPasswords | undefined =\n opts.storePassword || opts.keyPassword\n ? { store: opts.storePassword ?? '123456', key: opts.keyPassword ?? '123456' }\n : undefined;\n\n if (opts.bootstrap) {\n const result = prepareSigning({\n config,\n projectDir: dir,\n apl: opts.apl,\n appFeature: opts.appFeature,\n acls: opts.acls,\n appPrivilegeCapabilities: opts.appPrivilegeCapabilities,\n passwords,\n logger,\n });\n logger.info(result.source === 'present' ? 'Signing material already present.' : 'Signing configs generated.');\n return;\n }\n\n const sdkHome = getOhosBaseSdkHome(config);\n logger.info(`Generating signing configs in ${dir} using SDK at ${sdkHome}...`);\n generateSigningConfigs({\n projectDir: dir,\n sdkHome,\n apl: opts.apl,\n appFeature: opts.appFeature,\n acls: opts.acls,\n appPrivilegeCapabilities: opts.appPrivilegeCapabilities,\n passwords,\n logger,\n });\n logger.info('Signing configs generated.');\n },\n );\n}\n","import { Command } from 'commander';\nimport { HUAWEI_SITES, createHarmonyOsSession, type HarmonyOsSession } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\n/** A session bound to the CLI runtime. The sign-in URL goes to stderr for headless hosts. */\nfunction session(): HarmonyOsSession {\n const { config, logger } = getRuntime();\n return createHarmonyOsSession({\n config,\n logger,\n onLoginUrl: (url) => process.stderr.write(`Opening the Huawei sign-in page. If no browser opens, visit:\\n ${url}\\n`),\n });\n}\n\nexport function registerAuthCommand(program: Command): void {\n const auth = program\n .command('auth')\n .description(\n 'Sign in to a Huawei developer account, which HarmonyOS signing (`oniro-app sign --harmonyos`) needs. ' +\n 'OpenHarmony signing needs no account. The token is stored encrypted under ONIRO_HARMONYOS_AUTH_DIR ' +\n '(default ~/.oniro/harmonyos).',\n );\n\n auth\n .command('login')\n .description('Sign in through the browser, which redirects back to a loopback port on this machine.')\n .option('--timeout <seconds>', 'How long to wait for the browser sign-in. Default 600.', (v) => Number(v))\n .action(async (opts: { timeout?: number }) => {\n const user = await session().login(opts.timeout ? { timeoutMs: Math.max(1, opts.timeout) * 1000 } : undefined);\n process.stdout.write(`${user.userName || user.userId}\\n`);\n });\n\n auth\n .command('logout')\n .description('Sign out and delete the stored token.')\n .action(async () => {\n const signedOut = await session().logout();\n getRuntime().logger.info(signedOut ? 'Signed out.' : 'Not signed in; nothing to do.');\n });\n\n auth\n .command('status')\n .description('Show the signed-in account. Exits non-zero when not signed in.')\n .option('--json', 'Emit the account details as JSON.')\n .action(async (opts: { json?: boolean }) => {\n const s = session();\n // Refreshed: a stale access token makes the agreement check fail.\n const user = await s.getUserInfo({ refresh: true });\n if (!user) {\n process.stderr.write('Not signed in. Run `oniro-app auth login`.\\n');\n process.exitCode = 1;\n return;\n }\n // Without real-name verification, the developer agreement is what allows signing.\n const agreement = user.isRealName ? null : await s.getDeveloperAgreement(user);\n if (opts.json) {\n const { userId, userName, countryCode, siteCode, isRealName } = user;\n const agcBaseUrl = HUAWEI_SITES[siteCode].agcBaseUrl;\n const status = { userId, userName, countryCode, site: siteCode, agcBaseUrl, isRealName, developerAgreement: agreement, tokenPath: s.tokenPath };\n process.stdout.write(`${JSON.stringify(status, null, 2)}\\n`);\n return;\n }\n process.stdout.write(`${user.userName || user.userId} (${user.userId}) [${user.siteCode}]\\n`);\n if (agreement && !(agreement.signed && agreement.latest)) {\n process.stderr.write(\n '[warn] This account has neither real-name verification nor the current HUAWEI Developer Basic Service Agreement accepted, so AppGallery Connect will not issue signing material. Accept the agreement in AppGallery Connect or DevEco Studio.\\n',\n );\n }\n });\n\n auth\n .command('team')\n .description('AGC teams this account belongs to.')\n .command('list')\n .description('List the AGC teams this account belongs to, for `oniro-app sign --harmonyos --team-id <id>`.')\n .option('--json', 'Emit the team list as JSON.')\n .action(async (opts: { json?: boolean }) => {\n const teams = await session().listTeams();\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(teams, null, 2)}\\n`);\n return;\n }\n for (const t of teams) process.stdout.write(`${t.id}\\t${t.name}\\n`);\n });\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport {\n installApp,\n launchApp,\n uninstallApp,\n forceStop,\n applyChanges,\n existingHapOrUnsigned,\n getBundleName,\n readHapBundleName,\n OniroError,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\ninterface ApplyOpts {\n bundle?: string;\n module?: string;\n hap?: string;\n installedHap?: string;\n system?: boolean;\n allowUninstall?: boolean;\n device?: string;\n json?: boolean;\n}\n\nexport function registerAppCommand(program: Command): void {\n const app = program.command('app').description('Install, launch, and manage built apps on a connected device/emulator.');\n\n app\n .command('install [project-dir-or-hap]')\n .description(\n 'Install a built .hap on the connected device/emulator via hdc. Takes a project dir (default: the ' +\n 'current one), whose newest signed HAP is installed, else its unsigned one, or a .hap file. Fails ' +\n 'when the bundle manager rejects the HAP, and says how to sign when a target refuses an unsigned one.',\n )\n .option('--hap <path>', 'Override the .hap path (relative to project-dir or absolute).')\n .option('--device <serial>', 'Target device serial.')\n .action(async (target: string | undefined, opts: { hap?: string; device?: string }) => {\n const { config, logger } = getRuntime();\n const isHap = target !== undefined && /\\.hap$/i.test(target);\n const dir = isHap ? process.cwd() : path.resolve(target ?? process.cwd());\n const hapPath = isHap ? path.resolve(target) : opts.hap;\n logger.info(`Installing ${hapPath ?? `app from ${dir}`}...`);\n const result = await installApp({ config, projectDir: dir, hapPath, deviceSerial: opts.device, logger });\n logger.info(`Installed ${result.hapPath}.`);\n });\n\n app\n .command('launch [project-dir]')\n .description(\n 'Launch an app on the connected device/emulator. Project mode (default): resolves ' +\n 'bundle + main ability from the project. Bundle mode (--bundle): launch an ' +\n 'already-installed app by bundle name, no project needed.',\n )\n .option('--bundle <bundle>', 'Launch an already-installed app by bundle name (no project needed).')\n .option('--module <module>', 'Module folder name (project mode).', 'entry')\n .option('--ability <name>', 'Explicit ability to launch (defaults to the module mainElement in project mode, or the installed bundle main ability in --bundle mode).')\n .option('--device <serial>', 'Target device serial.')\n .action(async (projectDir: string | undefined, opts: { bundle?: string; module: string; ability?: string; device?: string }) => {\n const { config, logger } = getRuntime();\n if (opts.bundle) {\n logger.info(`Launching installed bundle ${opts.bundle}...`);\n await launchApp({ config, bundleName: opts.bundle, abilityName: opts.ability, deviceSerial: opts.device, logger });\n } else {\n const dir = path.resolve(projectDir ?? process.cwd());\n logger.info(`Launching app from ${dir}...`);\n await launchApp({ config, projectDir: dir, moduleName: opts.module, abilityName: opts.ability, deviceSerial: opts.device, logger });\n }\n logger.info('App launched.');\n });\n\n app\n .command('apply [project-dir-or-hap]')\n .description(\n 'Install a HAP (a project dir, default the current one, or a .hap file) and verify the running process ' +\n 'took the change. Refuses a HAP of another bundle. Handles sign-info mismatch, asset-cache invalidation, ' +\n 'and persistent-bundle restart.',\n )\n .option(\n '--bundle <bundle>',\n 'Bundle name to apply changes to. Defaults to the bundleName in the .hap file, else in the project AppScope/app.json5.',\n )\n .option('--module <module>', 'Module to resolve the HAP from (multi-module projects).')\n .option('--hap <path>', 'Explicit .hap path (relative to project-dir or absolute).')\n .option('--installed-hap <path>', 'Local path to the currently-installed HAP, to enable the asset-cache reboot.')\n .option('--system', 'Treat as a persistent/system bundle (refuses uninstall on sign-info mismatch).')\n .option('--allow-uninstall', 'Permit uninstalling a system bundle on sign-info mismatch (dangerous).')\n .option('--device <serial>', 'Target device serial.')\n .option('--json', 'Emit the result as JSON.')\n .action(async (target: string | undefined, opts: ApplyOpts) => {\n const { config, logger } = getRuntime();\n const isHap = target !== undefined && /\\.hap$/i.test(target);\n if (isHap && opts.hap) throw new OniroError('Pass the HAP either as the argument or with --hap, not both.');\n const dir = isHap ? process.cwd() : path.resolve(target ?? process.cwd());\n const hapPath = isHap ? path.resolve(target) : opts.hap;\n let bundle = opts.bundle;\n if (!bundle && isHap) {\n // The same signed-to-unsigned fallback applyChanges applies when it installs.\n const hap = existingHapOrUnsigned(hapPath!);\n if (!hap) throw new OniroError(`HAP not found at ${hapPath}.`);\n bundle = (await readHapBundleName(hap.path).catch(() => null)) ?? undefined;\n if (!bundle) throw new OniroError(`Could not read the bundle name from ${hap.path}. Pass --bundle.`);\n }\n bundle ??= getBundleName(dir);\n const result = await applyChanges({\n config,\n bundle,\n hapPath,\n projectDir: dir,\n module: opts.module,\n installedHapPath: opts.installedHap,\n isSystemBundle: opts.system,\n allowUninstall: opts.allowUninstall,\n deviceSerial: opts.device,\n logger,\n });\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } else {\n logger.info(\n `apply: method=${result.method} pid ${result.preInstallPid ?? '-'} -> ${result.postInstallPid ?? '-'}` +\n `${result.cacheCleared ? ' (cache cleared)' : ''}`,\n );\n }\n });\n\n app\n .command('uninstall <bundle>')\n .description('Uninstall an app by bundle name.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (bundle: string, opts: { device?: string }) => {\n const { config, logger } = getRuntime();\n await uninstallApp({ config, bundle, deviceSerial: opts.device, logger });\n logger.info(`Uninstalled ${bundle}.`);\n });\n\n app\n .command('stop <bundle>')\n .description('Force-stop an app by bundle name.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (bundle: string, opts: { device?: string }) => {\n const { config, logger } = getRuntime();\n await forceStop({ config, bundle, deviceSerial: opts.device, logger });\n logger.info(`Stopped ${bundle}.`);\n });\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport {\n ALL_SDKS,\n createScaffold,\n isValidBundleName,\n isValidProjectName,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport { getBundledTemplateRoot } from '../lib/templateRoot.js';\n\ninterface CreateOpts {\n name: string;\n bundle: string;\n location: string;\n sdk: string;\n template: string;\n module?: string;\n overwrite?: boolean;\n}\n\nexport function registerCreateCommand(program: Command): void {\n program\n .command('create')\n .description('Scaffold a new Oniro/OpenHarmony or HarmonyOS app from a template. All flags are required (non-interactive).')\n .requiredOption('--name <name>', 'Project folder name (letters, digits, ._- only)')\n .requiredOption('--bundle <bundleName>', 'Bundle name in reverse-DNS form, e.g. com.example.myapp')\n .requiredOption('--location <dir>', 'Parent directory where the new project folder will be created')\n .requiredOption('--sdk <api>', 'Target SDK API level (e.g. 18, 20)')\n .option('--template <id>', 'Template id', 'EmptyAbility')\n .option('--module <name>', 'Module folder name (defaults to the template default, usually `entry`)')\n .option('--overwrite', 'Replace the destination if it already exists')\n .action(async (opts: CreateOpts) => {\n const { config, logger } = getRuntime();\n\n if (!isValidProjectName(opts.name)) {\n throw new Error(`Invalid --name '${opts.name}'. Use letters/numbers/._- and no slashes.`);\n }\n if (!isValidBundleName(opts.bundle)) {\n throw new Error(`Invalid --bundle '${opts.bundle}'. Example: com.example.myapp`);\n }\n const sdkApi = Number(opts.sdk);\n if (!Number.isFinite(sdkApi)) {\n throw new Error(`--sdk must be a numeric api level. Known: ${ALL_SDKS.map((s) => s.api).join(', ')}`);\n }\n\n const templateRoot = getBundledTemplateRoot();\n const result = await createScaffold({\n config,\n templateId: opts.template,\n projectName: opts.name,\n bundleName: opts.bundle,\n location: path.resolve(opts.location),\n sdkApi,\n moduleName: opts.module,\n templateRoot,\n overwrite: opts.overwrite,\n logger,\n });\n\n logger.info(`Project created at ${result.projectDir}`);\n process.stdout.write(`${result.projectDir}\\n`);\n });\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * Resolve the bundled `templates/` directory shipped inside this CLI package.\n *\n * The CLI's `dist/oniro-app.js` lives at `<pkg>/dist/oniro-app.js` after build\n * and the templates ship at `<pkg>/templates/`. During development the entrypoint\n * lives at `<pkg>/src/bin/oniro-app.ts` so we also try `../../templates` from there.\n */\nexport function getBundledTemplateRoot(): string {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(here, '../templates'), // dist/oniro-app.js → ../templates\n path.resolve(here, '../../templates'), // src/bin/oniro-app.ts → ../../templates\n ];\n for (const c of candidates) {\n if (fs.existsSync(c)) return c;\n }\n // Return the most likely path even if it doesn't exist yet; createScaffold will\n // surface a clear error from there.\n return candidates[0]!;\n}\n","import { Command } from 'commander';\nimport { listTemplates } from '@oniroproject/core';\nimport { getBundledTemplateRoot } from '../lib/templateRoot.js';\n\nexport function registerTemplatesCommand(program: Command): void {\n const templates = program.command('templates').description('Inspect the templates bundled with this CLI.');\n\n templates\n .command('list')\n .description('List available project templates.')\n .option('--json', 'Emit machine-readable JSON.')\n .action((opts: { json?: boolean }) => {\n const root = getBundledTemplateRoot();\n const list = listTemplates(root);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(list, null, 2)}\\n`);\n return;\n }\n if (list.length === 0) {\n process.stdout.write('No templates available.\\n');\n return;\n }\n const rows = list.map((t) => `${t.id.padEnd(20)} ${t.label.padEnd(24)} ${t.description}`);\n process.stdout.write(`${rows.join('\\n')}\\n`);\n });\n}\n","import { Command, Option } from 'commander';\nimport { reboot } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerRebootCommand(program: Command): void {\n program\n .command('reboot')\n .description('Reboot the connected device/emulator.')\n .addOption(\n new Option('--mode <mode>', 'Reboot target.').choices(['system', 'bootloader', 'recovery']).default('system'),\n )\n .option('--wait-bundle <bundle>', 'After a system reboot, wait until this bundle is running again.')\n .option('--timeout <ms>', 'Max time to wait for the bundle, ms.', '180000')\n .option('--device <serial>', 'Target device serial.')\n .action(\n async (opts: {\n mode: 'system' | 'bootloader' | 'recovery';\n waitBundle?: string;\n timeout: string;\n device?: string;\n }) => {\n const { config, logger } = getRuntime();\n logger.info(`Rebooting device (${opts.mode})...`);\n await reboot({\n config,\n mode: opts.mode,\n waitForBundle: opts.waitBundle,\n timeoutMs: Number(opts.timeout),\n deviceSerial: opts.device,\n logger,\n });\n logger.info('Reboot complete.');\n },\n );\n}\n","import { Command } from 'commander';\nimport { waitForLog, waitForBoot, waitForBundle, waitForTarget, describeLayoutNode } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport { addTargetOptions, selectorFrom, type TargetOpts } from '../lib/target.js';\nimport { parseSince } from '../lib/logSince.js';\n\ninterface WaitOpts extends TargetOpts {\n log?: string;\n since?: string;\n boot?: boolean;\n bundle?: string;\n pidOf?: string;\n domain?: string;\n gone?: boolean;\n interval: string;\n timeout: string;\n device?: string;\n json?: boolean;\n}\n\nexport function registerWaitCommand(program: Command): void {\n const wait = program\n .command('wait')\n .description(\n 'Wait for a device condition: a log line (--log), boot (--boot), a bundle to start (--bundle), ' +\n 'or an on-screen element (--target / --target-id / --target-type).',\n )\n .option('--log <pattern>', 'Resolve when a hilog line (tag: message) logged after the command starts matches this regex.')\n .option(\n '--since <seconds>',\n 'With --log: also match lines logged up to N seconds before the command started, ' +\n 'measured on the device clock; \"all\" matches everything still in the device log buffer.',\n )\n .option('--boot', 'Resolve when the device is reachable (optionally also --pid-of).')\n .option('--bundle <bundle>', 'With --log: filter to this bundle. Alone: wait until this bundle is running.')\n .option('--pid-of <name>', 'With --boot: also require this process to have a pid.')\n .option('--domain <domain>', 'With --log: hilog domain filter (e.g. 0xD003900).');\n addTargetOptions(wait, 'Resolve when', { index: false });\n wait\n .option('--gone', 'With --target*: resolve when no uncovered element matches any more.')\n .option('--interval <ms>', 'With --target*: poll interval, ms (each poll is a layout dump).', '500')\n .option('--timeout <ms>', 'Max wait, ms.', '30000')\n .option('--device <serial>', 'Target device serial.')\n .option('--json', 'With --log or --target*: emit the matched entry/element as JSON.')\n .action(async (opts: WaitOpts) => {\n const { config, logger } = getRuntime();\n const timeoutMs = Number(opts.timeout);\n const selector = selectorFrom(opts);\n if (opts.since !== undefined && !opts.log) throw new Error('--since applies only to --log.');\n\n if (opts.log) {\n const entry = await waitForLog({\n config,\n pattern: new RegExp(opts.log),\n timeoutMs,\n bundle: opts.bundle,\n domain: opts.domain,\n deviceSerial: opts.device,\n lookbackMs: parseSince(opts.since),\n logger,\n });\n if (opts.json) process.stdout.write(`${JSON.stringify(entry, null, 2)}\\n`);\n else logger.info(`matched: ${entry.time} ${entry.tag}: ${entry.message}`);\n return;\n }\n if (opts.boot) {\n await waitForBoot({ config, untilPidOf: opts.pidOf, timeoutMs, deviceSerial: opts.device, logger });\n logger.info('Device booted.');\n return;\n }\n if (selector) {\n const node = await waitForTarget({\n config,\n selector,\n gone: opts.gone,\n timeoutMs,\n pollMs: Number(opts.interval) || 500,\n deviceSerial: opts.device,\n logger,\n });\n if (!node) {\n logger.info('Element is gone.');\n return;\n }\n if (opts.json) process.stdout.write(`${JSON.stringify(node, null, 2)}\\n`);\n else logger.info(`found: ${describeLayoutNode(node)}`);\n return;\n }\n if (opts.bundle) {\n await waitForBundle({ config, bundle: opts.bundle, timeoutMs, deviceSerial: opts.device, logger });\n logger.info(`Bundle ${opts.bundle} is running.`);\n return;\n }\n throw new Error('Specify one of --log <pattern>, --boot, --bundle <bundle>, or --target <text> (or --target-id / --target-type).');\n });\n}\n","import type { Command } from 'commander';\nimport type { LayoutSelector } from '@oniroproject/core';\n\n/** The shared element-selector flags, as commander parses them. */\nexport interface TargetOpts {\n target?: string;\n targetId?: string;\n targetType?: string;\n targetIndex?: string;\n}\n\n/**\n * Add the element-selector flags shared by `input`, `wait`, and `screenshot`.\n * `verb` completes the `--target` help text (e.g. \"Tap\" → \"Tap the element …\").\n */\nexport function addTargetOptions(cmd: Command, verb: string, opts: { index?: boolean } = {}): Command {\n cmd\n .option(\n '--target <text>',\n `${verb} the element whose text, description, or placeholder matches ` +\n '(case-insensitive; exact matches win, else substring). Covered elements are skipped.',\n )\n .option('--target-id <id>', 'Match the element by its id or key.')\n .option('--target-type <type>', 'Restrict the match to a component type (e.g. Button, TextInput).');\n if (opts.index !== false) {\n cmd.option('--target-index <n>', 'Pick the n-th (0-based) of several matching elements.');\n }\n return cmd;\n}\n\n/** The selector built from the flags, or undefined when none was given. */\nexport function selectorFrom(opts: TargetOpts): LayoutSelector | undefined {\n if (opts.target === undefined && opts.targetId === undefined && opts.targetType === undefined) return undefined;\n return { text: opts.target, id: opts.targetId, type: opts.targetType };\n}\n\nexport function targetIndexFrom(opts: TargetOpts): number | undefined {\n if (opts.targetIndex === undefined) return undefined;\n const n = Number(opts.targetIndex);\n if (!Number.isInteger(n) || n < 0) throw new Error(`--target-index must be a non-negative integer; got ${opts.targetIndex}.`);\n return n;\n}\n","/**\n * Parse a `--since` value for `wait --log` and `watch`: how many seconds before\n * the command started a log line may be from and still count, or `all` for\n * everything still in the device buffer. Returns ms; undefined when not given.\n */\nexport function parseSince(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n if (value === 'all') return Infinity;\n const seconds = Number(value);\n if (value.trim() === '' || !Number.isFinite(seconds) || seconds < 0) {\n throw new Error(`--since takes a number of seconds or \"all\", not \"${value}\".`);\n }\n return seconds * 1000;\n}\n","import { Command } from 'commander';\nimport { watchLog } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport { parseSince } from '../lib/logSince.js';\n\ninterface WatchOpts {\n log?: string;\n for: string;\n since?: string;\n bundle?: string;\n domain?: string;\n dedup: boolean;\n device?: string;\n json?: boolean;\n}\n\nexport function registerWatchCommand(program: Command): void {\n program\n .command('watch')\n .description('Collect the hilog lines matching a pattern that are logged during a fixed duration.')\n .option('--log <pattern>', 'Regex tested against each line (tag: message).')\n .option('--for <ms>', 'Duration to watch, ms.', '10000')\n .option(\n '--since <seconds>',\n 'Also collect lines logged up to N seconds before the command started, measured on the device clock; ' +\n '\"all\" adds everything still in the device log buffer.',\n )\n .option('--bundle <bundle>', 'Filter to this bundle.')\n .option('--domain <domain>', 'hilog domain filter (e.g. 0xD003900).')\n .option('--no-dedup', 'Do not collapse consecutive duplicate lines.')\n .option('--device <serial>', 'Target device serial.')\n .option('--json', 'Emit the entries as JSON.')\n .action(async (opts: WatchOpts) => {\n const { config, logger } = getRuntime();\n if (!opts.log) throw new Error('watch requires --log <pattern>.');\n const entries = await watchLog({\n config,\n pattern: new RegExp(opts.log),\n durationMs: Number(opts.for),\n bundle: opts.bundle,\n domain: opts.domain,\n dedup: opts.dedup,\n deviceSerial: opts.device,\n lookbackMs: parseSince(opts.since),\n logger,\n });\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(entries, null, 2)}\\n`);\n } else {\n for (const e of entries) process.stdout.write(`${e.time} ${e.level} ${e.tag}: ${e.message}\\n`);\n }\n });\n}\n","import { Command } from 'commander';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { takeScreenshot, captureBurst, locateTarget, describeLayoutNode } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport {\n renderWithGrid,\n buildContactSheet,\n frameDiffs,\n cropImage,\n parseCropRect,\n padCropRect,\n type CropRect,\n} from '../lib/screenshotImage.js';\nimport { addTargetOptions, selectorFrom, targetIndexFrom, type TargetOpts } from '../lib/target.js';\n\ninterface ScreenshotOpts extends TargetOpts {\n output: string;\n grid?: boolean;\n maxDim: string;\n crop?: string;\n contactSheet?: boolean;\n burst?: string;\n interval: string;\n json?: boolean;\n device?: string;\n}\n\nconst DEFAULT_CONTACT_SHEET_FRAMES = 8;\n// Margin kept around a --target element when cropping to it, as a fraction of the display.\nconst TARGET_CROP_PAD = 0.02;\n\nfunction clampMaxDim(raw: string): number {\n const n = Number(raw);\n if (!Number.isFinite(n)) return 1024;\n return Math.max(256, Math.min(4096, Math.round(n)));\n}\n\nexport function registerScreenshotCommand(program: Command): void {\n const screenshot = program\n .command('screenshot')\n .description(\n 'Capture the screen. Default: full-resolution raw JPEG. ' +\n '--grid: downscaled JPEG with a 10x10 grid (axes 0.0-1.0) for picking tap coordinates. ' +\n '--crop / --target: a full-resolution crop of one region or element, for checking detail cheaply. ' +\n '--contact-sheet: capture a burst and tile it into one image with per-frame change diffs.',\n )\n .option('-o, --output <file>', 'Output file path.', 'screenshot.jpeg')\n .option('--grid', 'Downscale (to --max-dim) and overlay a 10x10 coordinate grid.')\n .option('--max-dim <px>', 'Longest-side cap for --grid / --crop / --target / --contact-sheet (256-4096).', '1024')\n .option('--crop <x1,y1,x2,y2>', 'Crop to this region, given as 0-1 fractions of the screen.');\n addTargetOptions(screenshot, 'Crop to');\n screenshot\n .option('--contact-sheet', 'Capture a burst and composite it into one tiled contact sheet.')\n .option('--burst <count>', 'Capture N frames; writes <base>-<i><ext> (or feeds --contact-sheet).')\n .option('--interval <ms>', 'Delay between burst frames, ms.', '50')\n .option('--json', 'Emit the full result object as JSON on stdout (with --contact-sheet).')\n .option('--device <serial>', 'Target device serial.')\n .action(async (opts: ScreenshotOpts, command: Command) => {\n const { config, logger } = getRuntime();\n const maxDim = clampMaxDim(opts.maxDim);\n const intervalMs = Number(opts.interval) || 50;\n\n // --- Crop: one region (or element) at full resolution ---\n const selector = selectorFrom(opts);\n if (opts.crop !== undefined || selector) {\n if (opts.crop !== undefined && selector) throw new Error('Use either --crop or --target*, not both.');\n if (opts.grid || opts.contactSheet || opts.burst) {\n throw new Error('--crop / --target cannot be combined with --grid, --contact-sheet, or --burst.');\n }\n let rect: CropRect;\n let label: string;\n if (selector) {\n // Leave the keyboard alone: dismissing it would change what we are capturing.\n const located = await locateTarget({\n config,\n selector,\n index: targetIndexFrom(opts),\n hideKeyboard: false,\n deviceSerial: opts.device,\n logger,\n });\n if (!located.node.b) throw new Error(`${describeLayoutNode(located.node)} has no bounds to crop to.`);\n rect = padCropRect(located.node.b, TARGET_CROP_PAD);\n label = describeLayoutNode(located.node);\n } else {\n rect = parseCropRect(opts.crop!);\n label = rect.map((n) => n.toFixed(3)).join(',');\n }\n const shot = await takeScreenshot({ config, deviceSerial: opts.device, logger });\n const cropped = await cropImage(shot.pixels, rect, { maxDim });\n fs.writeFileSync(opts.output, cropped.buf);\n logger.info(\n `Wrote ${opts.output} (${cropped.width}x${cropped.height} from a ${cropped.cropWidth}x${cropped.cropHeight} ` +\n `crop at ${cropped.left},${cropped.top}: ${label}).`,\n );\n return;\n }\n\n // --- Contact sheet: burst -> one tiled image + per-frame diffs ---\n if (opts.contactSheet) {\n const count = opts.burst ? Math.max(1, Number(opts.burst)) : DEFAULT_CONTACT_SHEET_FRAMES;\n const frames = await captureBurst({ config, count, intervalMs, deviceSerial: opts.device, logger });\n const diffs = await frameDiffs(frames);\n const sheet = await buildContactSheet(frames, { maxDim, diffs });\n fs.writeFileSync(opts.output, sheet.buf);\n\n // Only fan out the individual raw frames when --burst was also requested.\n if (opts.burst) {\n const ext = path.extname(opts.output) || '.jpeg';\n const base = opts.output.slice(0, opts.output.length - ext.length);\n frames.forEach((frame, i) => fs.writeFileSync(`${base}-${i}${ext}`, frame));\n }\n\n const perFrame = frames.map((_, i) => ({ idx: i, t_ms: i * intervalMs, diffVsPrev: diffs[i] ?? 0 }));\n if (opts.json) {\n process.stdout.write(\n `${JSON.stringify(\n {\n sheet: opts.output,\n frameCount: frames.length,\n cols: sheet.cols,\n rows: sheet.rows,\n intervalMs,\n note: 't_ms is nominal (idx*interval); diffVsPrev is 0..1 mean greyscale diff vs the previous frame.',\n frames: perFrame,\n },\n null,\n 2,\n )}\\n`,\n );\n } else {\n process.stdout.write(`${JSON.stringify(perFrame)}\\n`);\n }\n\n let peak = 0;\n for (let i = 1; i < diffs.length; i++) if ((diffs[i] ?? 0) > (diffs[peak] ?? 0)) peak = i;\n logger.info(\n `Wrote contact sheet ${opts.output} (${sheet.cols}x${sheet.rows}, ${frames.length} frames). ` +\n `Biggest change at frame ${peak} (Δ${(diffs[peak] ?? 0).toFixed(2)}).`,\n );\n return;\n }\n\n // --- Burst (raw frames) — unchanged behaviour ---\n if (opts.burst) {\n const frames = await captureBurst({\n config,\n count: Number(opts.burst),\n intervalMs,\n deviceSerial: opts.device,\n logger,\n });\n const ext = path.extname(opts.output) || '.jpeg';\n const base = opts.output.slice(0, opts.output.length - ext.length);\n frames.forEach((frame, i) => fs.writeFileSync(`${base}-${i}${ext}`, frame));\n logger.info(`Wrote ${frames.length} frames to ${base}-<0..${frames.length - 1}>${ext}.`);\n return;\n }\n\n // --- Single shot ---\n const shot = await takeScreenshot({ config, deviceSerial: opts.device, logger });\n const maxDimProvided = command.getOptionValueSource('maxDim') === 'cli';\n if (opts.grid || maxDimProvided) {\n const rendered = await renderWithGrid(shot.pixels, { maxDim, grid: !!opts.grid });\n fs.writeFileSync(opts.output, rendered.buf);\n logger.info(\n `Wrote ${opts.output} (${rendered.width}x${rendered.height} from ` +\n `${rendered.originalWidth}x${rendered.originalHeight}${opts.grid ? ', 10x10 grid' : ''}).`,\n );\n return;\n }\n fs.writeFileSync(opts.output, shot.pixels);\n logger.info(`Wrote ${opts.output} (${shot.width}x${shot.height}).`);\n });\n}\n","import sharp from 'sharp';\n\n/**\n * Agent-facing screenshot image processing for the CLI.\n *\n * `@oniroproject/core` deliberately ships no image dependency — it returns raw\n * JPEG buffers. The grid overlay / downscale and the burst contact-sheet live\n * here (the CLI is the affordance layer), so `oniro-app screenshot` can produce\n * exactly what the ohos-hdc MCP used to. The grid drawing is ported verbatim\n * from that MCP so the output is equivalent.\n */\n\nexport interface RenderResult {\n /** Encoded JPEG. */\n buf: Buffer;\n /** Rendered (post-downscale) dimensions. */\n width: number;\n height: number;\n /** Source dimensions, before downscale. */\n originalWidth: number;\n originalHeight: number;\n}\n\nexport interface RenderWithGridOptions {\n /** Longest-side cap in pixels. The image is downscaled (never upscaled) to fit. */\n maxDim: number;\n /** Overlay the 10x10 grid with 0.0–1.0 axis labels after downscaling. */\n grid?: boolean;\n}\n\n/**\n * Build an SVG overlay: a 10x10 grid with X/Y axis labels (0.0–1.0) sized to the\n * given image dimensions. Ported verbatim from the ohos-hdc MCP so the gridded\n * output matches what agents are used to.\n */\nexport function buildGridSvg(width: number, height: number): string {\n const lineColor = 'rgba(255,80,80,0.55)';\n const labelBg = 'rgba(0,0,0,0.7)';\n const labelFg = '#fff';\n const fontSize = Math.max(10, Math.round(Math.min(width, height) / 60));\n const padding = Math.round(fontSize * 0.4);\n const labels: string[] = [];\n const lines: string[] = [];\n for (let i = 0; i <= 10; i++) {\n const f = i / 10;\n const x = Math.round(f * (width - 1));\n const y = Math.round(f * (height - 1));\n // grid lines (skip 0 and 10 — those are the image edges)\n if (i > 0 && i < 10) {\n lines.push(`<line x1=\"${x}\" y1=\"0\" x2=\"${x}\" y2=\"${height}\" stroke=\"${lineColor}\" stroke-width=\"1\"/>`);\n lines.push(`<line x1=\"0\" y1=\"${y}\" x2=\"${width}\" y2=\"${y}\" stroke=\"${lineColor}\" stroke-width=\"1\"/>`);\n }\n const tag = f.toFixed(1);\n // X-axis labels along the top\n const tx = i === 0 ? padding : i === 10 ? width - padding : x;\n const anchorX = i === 0 ? 'start' : i === 10 ? 'end' : 'middle';\n labels.push(\n `<text x=\"${tx}\" y=\"${fontSize + padding}\" font-family=\"monospace\" font-size=\"${fontSize}\" font-weight=\"bold\" fill=\"${labelFg}\" stroke=\"${labelBg}\" stroke-width=\"3\" paint-order=\"stroke\" text-anchor=\"${anchorX}\">${tag}</text>`,\n );\n // Y-axis labels along the left\n const ty = i === 0 ? fontSize + padding : i === 10 ? height - padding : y + fontSize / 3;\n labels.push(\n `<text x=\"${padding}\" y=\"${ty}\" font-family=\"monospace\" font-size=\"${fontSize}\" font-weight=\"bold\" fill=\"${labelFg}\" stroke=\"${labelBg}\" stroke-width=\"3\" paint-order=\"stroke\" text-anchor=\"start\">${tag}</text>`,\n );\n }\n // Axis title markers in the corners\n labels.push(\n `<text x=\"${width / 2}\" y=\"${fontSize * 2.4 + padding}\" font-family=\"monospace\" font-size=\"${fontSize}\" font-weight=\"bold\" fill=\"${labelFg}\" stroke=\"${labelBg}\" stroke-width=\"3\" paint-order=\"stroke\" text-anchor=\"middle\">X →</text>`,\n );\n labels.push(\n `<text x=\"${padding}\" y=\"${fontSize * 2.6 + padding}\" font-family=\"monospace\" font-size=\"${fontSize}\" font-weight=\"bold\" fill=\"${labelFg}\" stroke=\"${labelBg}\" stroke-width=\"3\" paint-order=\"stroke\" text-anchor=\"start\">Y ↓</text>`,\n );\n return `<svg width=\"${width}\" height=\"${height}\" xmlns=\"http://www.w3.org/2000/svg\">${lines.join('')}${labels.join('')}</svg>`;\n}\n\n/**\n * Downscale a JPEG so its longest side is <= `maxDim` (never upscaling) and,\n * when `grid` is set, overlay the coordinate grid. Returns the encoded JPEG plus\n * rendered and original dimensions.\n */\nexport async function renderWithGrid(jpeg: Buffer, opts: RenderWithGridOptions): Promise<RenderResult> {\n const meta = await sharp(jpeg).metadata();\n const originalWidth = meta.width ?? 0;\n const originalHeight = meta.height ?? 0;\n const longest = Math.max(originalWidth, originalHeight) || 1;\n const scale = Math.min(1, opts.maxDim / longest);\n const width = Math.max(1, Math.round(originalWidth * scale));\n const height = Math.max(1, Math.round(originalHeight * scale));\n const resized = await sharp(jpeg).resize(width, height).jpeg({ quality: 80 }).toBuffer();\n if (!opts.grid) {\n return { buf: resized, width, height, originalWidth, originalHeight };\n }\n const svg = buildGridSvg(width, height);\n const buf = await sharp(resized)\n .composite([{ input: Buffer.from(svg) }])\n .jpeg({ quality: 80 })\n .toBuffer();\n return { buf, width, height, originalWidth, originalHeight };\n}\n\n/** A region as [x1, y1, x2, y2] fractions (0–1) of the image. */\nexport type CropRect = [number, number, number, number];\n\n/** Parse `\"x1,y1,x2,y2\"` (0–1 fractions, x1<x2, y1<y2) into a {@link CropRect}. */\nexport function parseCropRect(spec: string): CropRect {\n const parts = spec.split(',').map((s) => Number(s.trim()));\n if (parts.length !== 4 || parts.some((n) => !Number.isFinite(n) || n < 0 || n > 1)) {\n throw new Error(`--crop expects four 0-1 fractions \"x1,y1,x2,y2\"; got \"${spec}\".`);\n }\n const [x1, y1, x2, y2] = parts as CropRect;\n if (!(x2 > x1 && y2 > y1)) throw new Error(`--crop needs x1 < x2 and y1 < y2; got \"${spec}\".`);\n return [x1, y1, x2, y2];\n}\n\n/** Grow a rect by `pad` (a fraction) on every side, clamped to 0–1. */\nexport function padCropRect(r: CropRect, pad: number): CropRect {\n return [Math.max(0, r[0] - pad), Math.max(0, r[1] - pad), Math.min(1, r[2] + pad), Math.min(1, r[3] + pad)];\n}\n\nexport interface CropResult {\n /** Encoded JPEG. */\n buf: Buffer;\n /** Rendered (post-downscale) dimensions. */\n width: number;\n height: number;\n /** The cropped region in source pixels. */\n left: number;\n top: number;\n cropWidth: number;\n cropHeight: number;\n}\n\n/**\n * Crop a JPEG to a 0–1 region at full resolution, then downscale so the longest\n * side is <= `maxDim` (never upscaling). Detail where it is needed, at a\n * fraction of a full-resolution screenshot's size.\n */\nexport async function cropImage(jpeg: Buffer, rect: CropRect, opts: { maxDim: number }): Promise<CropResult> {\n const meta = await sharp(jpeg).metadata();\n const w = meta.width ?? 1;\n const h = meta.height ?? 1;\n const left = Math.min(w - 1, Math.floor(rect[0] * w));\n const top = Math.min(h - 1, Math.floor(rect[1] * h));\n const cropWidth = Math.max(1, Math.min(w, Math.ceil(rect[2] * w)) - left);\n const cropHeight = Math.max(1, Math.min(h, Math.ceil(rect[3] * h)) - top);\n const scale = Math.min(1, opts.maxDim / Math.max(cropWidth, cropHeight));\n const width = Math.max(1, Math.round(cropWidth * scale));\n const height = Math.max(1, Math.round(cropHeight * scale));\n const buf = await sharp(jpeg)\n .extract({ left, top, width: cropWidth, height: cropHeight })\n .resize(width, height)\n .jpeg({ quality: 85 })\n .toBuffer();\n return { buf, width, height, left, top, cropWidth, cropHeight };\n}\n\nexport interface ContactSheetOptions {\n /** Longest-side cap for the whole sheet; per-tile size derives from this. */\n maxDim: number;\n /** Tiles per row. Defaults to ceil(sqrt(N)). */\n cols?: number;\n /** Per-frame diff (0..1), index-aligned with `frames`; printed on each tile. */\n diffs?: number[];\n /** Gap between tiles, px. */\n gap?: number;\n}\n\nexport interface ContactSheetResult {\n buf: Buffer;\n width: number;\n height: number;\n cols: number;\n rows: number;\n tileWidth: number;\n tileHeight: number;\n count: number;\n}\n\nfunction buildTileLabelSvg(width: number, height: number, idx: number, diff?: number): string {\n const fontSize = Math.max(12, Math.round(Math.min(width, height) / 16));\n const pad = Math.round(fontSize * 0.4);\n let label = `#${idx}`;\n if (typeof diff === 'number') label += ` Δ${diff.toFixed(2)}`;\n const boxW = Math.round(label.length * fontSize * 0.62) + pad * 2;\n const boxH = fontSize + pad * 2;\n return (\n `<svg width=\"${width}\" height=\"${height}\" xmlns=\"http://www.w3.org/2000/svg\">` +\n `<rect x=\"0\" y=\"0\" width=\"${boxW}\" height=\"${boxH}\" fill=\"rgba(0,0,0,0.6)\"/>` +\n `<text x=\"${pad}\" y=\"${fontSize + pad - 1}\" font-family=\"monospace\" font-size=\"${fontSize}\" font-weight=\"bold\" fill=\"#fff\" stroke=\"rgba(0,0,0,0.85)\" stroke-width=\"3\" paint-order=\"stroke\" text-anchor=\"start\">${label}</text>` +\n `</svg>`\n );\n}\n\n/**\n * Composite a burst of JPEG frames into a single tiled contact sheet, each tile\n * labelled with its frame index (and per-frame diff when provided). One image\n * replaces N — a large token saving when verifying transient UI.\n */\nexport async function buildContactSheet(frames: Buffer[], opts: ContactSheetOptions): Promise<ContactSheetResult> {\n if (frames.length === 0) throw new Error('buildContactSheet: no frames');\n const count = frames.length;\n const cols = Math.max(1, opts.cols ?? Math.ceil(Math.sqrt(count)));\n const rows = Math.ceil(count / cols);\n const gap = opts.gap ?? 8;\n\n const meta0 = await sharp(frames[0]).metadata();\n const fw = meta0.width ?? 1;\n const fh = meta0.height ?? 1;\n const longest = Math.max(fw, fh) || 1;\n const tileScale = Math.min(1, opts.maxDim / cols / longest);\n const tileWidth = Math.max(1, Math.round(fw * tileScale));\n const tileHeight = Math.max(1, Math.round(fh * tileScale));\n\n const tiles = await Promise.all(\n frames.map((frame, i) => {\n const label = Buffer.from(buildTileLabelSvg(tileWidth, tileHeight, i, opts.diffs?.[i]));\n return sharp(frame)\n .resize(tileWidth, tileHeight, { fit: 'fill' })\n .composite([{ input: label, top: 0, left: 0 }])\n .png()\n .toBuffer();\n }),\n );\n\n const width = cols * tileWidth + (cols + 1) * gap;\n const height = rows * tileHeight + (rows + 1) * gap;\n const placements = tiles.map((input, i) => {\n const r = Math.floor(i / cols);\n const c = i % cols;\n return { input, left: gap + c * (tileWidth + gap), top: gap + r * (tileHeight + gap) };\n });\n\n const buf = await sharp({\n create: { width, height, channels: 3, background: { r: 20, g: 20, b: 20 } },\n })\n .composite(placements)\n .jpeg({ quality: 80 })\n .toBuffer();\n\n return { buf, width, height, cols, rows, tileWidth, tileHeight, count };\n}\n\n/**\n * Per-frame change metric: mean absolute difference of a downscaled greyscale\n * thumbnail vs. the previous frame, normalised to 0..1. Frame 0 is 0 (no\n * predecessor). Cheap, deterministic, and device-free.\n */\nexport async function frameDiffs(frames: Buffer[], opts: { sample?: number } = {}): Promise<number[]> {\n if (frames.length === 0) return [];\n const sample = opts.sample ?? 32;\n const thumbs = await Promise.all(\n frames.map((f) => sharp(f).greyscale().resize(sample, sample, { fit: 'fill' }).raw().toBuffer()),\n );\n const out: number[] = [0];\n for (let i = 1; i < thumbs.length; i++) {\n const a = thumbs[i - 1];\n const b = thumbs[i];\n if (!a || !b) {\n out.push(0);\n continue;\n }\n const n = Math.min(a.length, b.length) || 1;\n let s = 0;\n for (let k = 0; k < n; k++) s += Math.abs((a[k] ?? 0) - (b[k] ?? 0));\n out.push(+(s / n / 255).toFixed(4));\n }\n return out;\n}\n","import { Command } from 'commander';\nimport { dumpLayout } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport { formatFlatLayout } from '../lib/layoutText.js';\n\ninterface DumpOpts {\n bundle?: string;\n raw?: boolean;\n flat?: boolean;\n device?: string;\n}\n\nexport function registerDumpCommand(program: Command): void {\n program\n .command('dump [target]')\n .description(\n 'Dump device state. Currently supports `dump layout` (the default target): JSON by default, ' +\n 'or one line per element with --flat.',\n )\n .option('--bundle <bundle>', 'Filter the layout to a single window/bundle.')\n .option('--raw', 'Return the unpruned layout tree.')\n .option('--flat', 'One line per element (type, label, center as 0-1 fractions, flags) instead of a JSON tree.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (target: string | undefined, opts: DumpOpts) => {\n const { config, logger } = getRuntime();\n const what = target ?? 'layout';\n if (what !== 'layout') throw new Error(`Unknown dump target \"${what}\". Supported: layout.`);\n if (opts.raw && opts.flat) throw new Error('--raw and --flat cannot be combined.');\n const result = await dumpLayout({\n config,\n bundleName: opts.bundle,\n prune: !opts.raw,\n detectKeyboard: !opts.raw,\n deviceSerial: opts.device,\n logger,\n });\n process.stdout.write(opts.flat ? formatFlatLayout(result) : `${JSON.stringify(result, null, 2)}\\n`);\n });\n}\n","import { flattenLayout, type DumpLayoutResult, type FlatLayoutNode } from '@oniroproject/core';\n\nconst MAX_TEXT = 80;\n\nfunction quote(s: string): string {\n return JSON.stringify(s.length > MAX_TEXT ? `${s.slice(0, MAX_TEXT - 1)}…` : s);\n}\n\nfunction flags(n: FlatLayoutNode): string[] {\n const out: string[] = [];\n if (n.click) out.push('click');\n if (n.longClick) out.push('longClick');\n if (n.scroll) out.push('scroll');\n if (n.checked) out.push('checked');\n else if (n.check) out.push('checkable');\n if (n.sel) out.push('selected');\n if (n.focus) out.push('focus');\n if (n.disabled) out.push('disabled');\n if (n.covered) out.push('covered');\n return out;\n}\n\n/** One line per element: type, label, center (0–1 fractions), and state flags. */\nexport function formatLayoutLine(n: FlatLayoutNode): string {\n const parts: string[] = [n.type ?? 'node'];\n if (n.text !== undefined) parts.push(quote(n.text));\n if (n.desc !== undefined) parts.push(`desc=${quote(n.desc)}`);\n if (n.hint !== undefined) parts.push(`hint=${quote(n.hint)}`);\n if (n.id !== undefined) parts.push(`#${n.id}`);\n if (n.key !== undefined) parts.push(`key=${n.key}`);\n if (n.c) parts.push(`c=${n.c[0].toFixed(3)},${n.c[1].toFixed(3)}`);\n parts.push(...flags(n));\n return parts.join(' ');\n}\n\n/** Worth a line: it has a label to read or match, or it can be interacted with. */\nfunction isListed(n: FlatLayoutNode): boolean {\n const labelled = n.text !== undefined || n.desc !== undefined || n.hint !== undefined;\n return labelled || !!(n.click || n.longClick || n.scroll || n.check || n.focus);\n}\n\n/**\n * Render a pruned layout as compact text for agents: a `[window <bundle>]`\n * header per window, then one line per labelled or interactive element in\n * paint order (decorative images and id-only wrappers are left to the JSON\n * output). The soft keyboard collapses to a single `[keyboard <bundle>]` line\n * instead of listing every key.\n */\nexport function formatFlatLayout(result: DumpLayoutResult): string {\n const lines: string[] = [];\n const d = result.display;\n lines.push(\n `# display ${d ? `${d.width}x${d.height}` : 'unknown'}; c = element center as 0-1 fractions ` +\n '(input --fx/--fy), or act by label with input --target \"<text>\"',\n );\n const keyboardBundle = result.keyboard?.shown ? result.keyboard.bundle : undefined;\n let window: string | undefined;\n for (const n of flattenLayout(result.tree)) {\n if (n.window !== window) {\n window = n.window;\n if (window !== undefined && window === keyboardBundle) {\n lines.push(`[keyboard ${window}] up — dismiss with input --type hideKeyboard`);\n } else if (window !== undefined) {\n lines.push(`[window ${window}]`);\n }\n }\n if (window !== undefined && window === keyboardBundle) continue;\n if (n.bundle !== undefined && n.text === undefined && !n.click) continue; // the window root itself\n if (isListed(n)) lines.push(formatLayoutLine(n));\n }\n return `${lines.join('\\n')}\\n`;\n}\n","import { Command } from 'commander';\nimport { getDeviceInfo, listDevices, type DeviceFullInfo, type DeviceInfo } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\n/** One `devices --long` line: the target-list columns, then what the device reports about itself. */\nexport function formatLongDevice(d: DeviceInfo, info: DeviceFullInfo | undefined): string {\n const head = `${d.serial}\\t${d.connection ?? ''}\\t${d.status}`;\n if (!info) return head;\n const os = [info.osFamily, info.osFamily === 'HarmonyOS' ? info.osDistVersion : undefined].filter(Boolean).join(' ');\n const fields: Array<[string, string | undefined]> = [\n ['os', os || undefined],\n ['api', info.sdkApiVersion],\n ['abi', info.abi],\n ['type', info.deviceType],\n ['model', info.model],\n ['fullname', info.osFullName],\n ];\n const rest = fields.filter(([, v]) => v).map(([k, v]) => `${k}=${/\\s/.test(v!) ? JSON.stringify(v) : v}`);\n return [head, ...rest].join('\\t');\n}\n\nexport function registerDevicesCommand(program: Command): void {\n program\n .command('devices')\n .description('List connected hdc devices.')\n .option(\n '--long',\n 'Also ask each connected device for its OS family (HarmonyOS / OpenHarmony), version, API level, ' +\n 'CPU ABI, device type and model.',\n )\n .option('--json', 'Emit machine-readable JSON.')\n .action(async (opts: { long?: boolean; json?: boolean }) => {\n const { config, logger } = getRuntime();\n const devices = await listDevices(config);\n const infos = new Map<string, DeviceFullInfo>();\n if (opts.long) {\n for (const d of devices.filter((x) => x.status === 'Connected')) {\n try {\n infos.set(d.serial, await getDeviceInfo({ config, deviceSerial: d.serial, logger }));\n } catch (err) {\n logger.warn(`Could not query ${d.serial}: ${(err as Error).message}`);\n }\n }\n }\n if (opts.json) {\n const out = opts.long ? devices.map((d) => ({ ...d, info: infos.get(d.serial) ?? null })) : devices;\n process.stdout.write(`${JSON.stringify(out, null, 2)}\\n`);\n return;\n }\n if (devices.length === 0) {\n process.stdout.write('(no devices)\\n');\n return;\n }\n for (const d of devices) {\n process.stdout.write(`${opts.long ? formatLongDevice(d, infos.get(d.serial)) : `${d.serial}\\t${d.connection ?? ''}\\t${d.status}`}\\n`);\n }\n });\n}\n","import { Command } from 'commander';\nimport { sendFile, recvFile } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerFileCommand(program: Command): void {\n const file = program.command('file').description('Transfer files to/from the device (hdc file send/recv).');\n\n file\n .command('send <local> <remote>')\n .description(\n 'Push a local file to the device. With --bundle, <remote> may be relative to that app\\'s sandbox ' +\n '(files/x is its filesDir, haps/entry/files/x the entry module\\'s), and the file is chowned to the app ' +\n 'so it can read it. Prints the device path.',\n )\n .option('--bundle <bundle>', 'Push into this app\\'s sandbox and give the file to the app\\'s user.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (local: string, remote: string, opts: { bundle?: string; device?: string }) => {\n const { config, logger } = getRuntime();\n const written = await sendFile({ config, local, remote, bundle: opts.bundle, deviceSerial: opts.device, logger });\n logger.info(`Sent ${local} -> ${written}${opts.bundle ? ` (owned by ${opts.bundle})` : ''}.`);\n process.stdout.write(`${written}\\n`);\n });\n\n file\n .command('recv <remote> <local>')\n .description('Pull a file from the device.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (remote: string, local: string, opts: { device?: string }) => {\n const { config, logger } = getRuntime();\n await recvFile({ config, remote, local, deviceSerial: opts.device, logger });\n logger.info(`Received ${remote} -> ${local}.`);\n });\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport {\n detectCmdToolsFlavour,\n detectRuntimeOs,\n getCmdToolsPath,\n missingProjectRootFiles,\n runCodelinter,\n type CodelinterResult,\n type CodelinterSummary,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\ninterface LintOpts {\n files?: string[];\n json?: boolean;\n}\n\n/** codelinter's totals, or totals counted from the findings when it printed none. */\nexport function lintTotals(result: Pick<CodelinterResult, 'findings' | 'summary'>): CodelinterSummary {\n if (result.summary) return result.summary;\n const count = (s: string): number => result.findings.filter((f) => f.severity === s).length;\n return {\n defects: result.findings.length,\n errors: count('error'),\n warnings: count('warning'),\n suggestions: count('suggestion'),\n };\n}\n\n/**\n * The exit code for a lint run: 1 when there is an error-severity finding, or when\n * codelinter exited non-zero without printing a report (so it did not really run).\n * Warnings and suggestions alone exit 0, although codelinter itself exits 1 for them.\n */\nexport function lintExitCode(result: Pick<CodelinterResult, 'code' | 'findings' | 'summary'>): number {\n if (lintTotals(result).errors > 0) return 1;\n return lintFailed(result) ? result.code : 0;\n}\n\n/** True when codelinter exited non-zero without printing a report, so it did not really run. */\nexport function lintFailed(result: Pick<CodelinterResult, 'code' | 'findings' | 'summary'>): boolean {\n return result.summary === null && result.findings.length === 0 && result.code !== 0;\n}\n\nexport function registerLintCommand(program: Command): void {\n program\n .command('lint [project-dir]')\n .description(\n 'Run the OpenHarmony codelinter on a project. Defaults to the current directory. ' +\n 'Exits 1 on error-severity findings or when codelinter fails to run; warnings alone exit 0.',\n )\n .option('--files <globs...>', 'Specific files/globs to lint (default: the whole project).')\n .option('--json', 'Emit the report (findings, summary, notices, incomplete) as JSON.')\n .action(async (projectDir: string | undefined, opts: LintOpts) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n const result = await runCodelinter({ config, projectDir: dir, files: opts.files, logger });\n const totals = lintTotals(result);\n const failed = lintFailed(result);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } else if (!failed) {\n for (const f of result.findings) {\n const at = `${f.file}:${f.line}${f.column ? `:${f.column}` : ''}`;\n process.stdout.write(`${at} ${f.severity} ${f.message}${f.code ? ` [${f.code}]` : ''}\\n`);\n }\n process.stdout.write(\n totals.defects === 0\n ? 'No defects found.\\n'\n : `${totals.defects} defects: ${totals.errors} errors, ${totals.warnings} warnings, ` +\n `${totals.suggestions} suggestions.\\n`,\n );\n }\n\n if (failed) {\n const missing = missingProjectRootFiles(dir);\n const why = missing.length ? ` It needs a DevEco project root, and ${dir} has no ${missing.join(', ')}.` : '';\n logger.error(\n `codelinter exited ${result.code} without a report, so nothing was linted.${why}\\n` +\n result.raw.trim().split('\\n').slice(-15).join('\\n'),\n );\n }\n if (result.incomplete) {\n for (const n of result.notices) logger.warn(`codelinter: ${n}`);\n const cmdToolsPath = getCmdToolsPath(config);\n const flavour = detectCmdToolsFlavour(cmdToolsPath);\n const projectOs = detectRuntimeOs(dir);\n if (flavour !== projectOs) {\n logger.warn(\n `The command-line tools at ${cmdToolsPath} are the ${flavour} flavour, but the project targets ` +\n `${projectOs} (runtimeOS in build-profile.json5), so codelinter skipped part of its checks: treat the ` +\n `counts as a lower bound. For a complete report, point ONIRO_CMD_TOOLS_PATH at ${projectOs} ` +\n \"command-line tools. The build's ArkTS compiler checks are not affected.\",\n );\n }\n }\n // Let output flush before exiting non-zero.\n process.exitCode = lintExitCode(result);\n });\n}\n","import { Command, Option } from 'commander';\nimport {\n performInput,\n sendGesture,\n getDisplaySize,\n describeLayoutNode,\n type UiInputType,\n type Waypoint,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport { addTargetOptions, selectorFrom, targetIndexFrom, type TargetOpts } from '../lib/target.js';\n\nconst INPUT_TYPES: UiInputType[] = [\n 'click',\n 'doubleClick',\n 'longClick',\n 'swipe',\n 'drag',\n 'fling',\n 'keyEvent',\n 'inputText',\n 'clearText',\n 'hideKeyboard',\n];\n\nconst num = (v: string | undefined): number | undefined => (v === undefined ? undefined : Number(v));\n\ninterface InputOpts extends TargetOpts {\n type: UiInputType;\n x?: string;\n y?: string;\n x2?: string;\n y2?: string;\n fx?: string;\n fy?: string;\n fx2?: string;\n fy2?: string;\n speed?: string;\n key?: string;\n text?: string;\n clear?: boolean;\n hideKeyboard?: boolean;\n device?: string;\n}\n\ninterface GestureOpts {\n waypoints: string;\n fractions?: boolean;\n holdStart?: string;\n holdEnd?: string;\n device?: string;\n}\n\nexport function registerInputCommand(program: Command): void {\n const input = program\n .command('input')\n .description(\n 'Inject a UI input event via uitest uiInput. Position it with --target (an on-screen element), ' +\n '--fx/--fy (0-1 fractions of the display, as in `dump layout` and the screenshot grid), or --x/--y (pixels).',\n )\n .addOption(new Option('--type <type>', 'Input type.').choices(INPUT_TYPES).makeOptionMandatory());\n addTargetOptions(input, 'Act on');\n input\n .option('--fx <fraction>', 'Start X as a 0-1 fraction of the display width.')\n .option('--fy <fraction>', 'Start Y as a 0-1 fraction of the display height.')\n .option('--fx2 <fraction>', 'End X fraction (swipe/drag/fling).')\n .option('--fy2 <fraction>', 'End Y fraction (swipe/drag/fling).')\n .option('--x <px>', 'X pixel (click/swipe start).')\n .option('--y <px>', 'Y pixel (click/swipe start).')\n .option('--x2 <px>', 'End X pixel (swipe/drag/fling).')\n .option('--y2 <px>', 'End Y pixel (swipe/drag/fling).')\n .option('--speed <px-per-s>', 'Velocity for swipe/drag/fling.')\n .option(\n '--key <key>',\n 'Key for keyEvent: Back/Home/Power, a name (Delete, Enter, Tab, Escape, MoveHome, MoveEnd, …), ' +\n 'a letter, a KeyCode id, or a combo like Ctrl+A.',\n )\n .option('--text <text>', 'Text for inputText.')\n .option('--clear', 'inputText: clear the field (Ctrl+A, Delete) before typing.')\n .option('--hide-keyboard', 'Dismiss the soft keyboard afterwards, if it is up.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (opts: InputOpts) => {\n const { config, logger } = getRuntime();\n const result = await performInput({\n config,\n type: opts.type,\n target: selectorFrom(opts),\n targetIndex: targetIndexFrom(opts),\n fx: num(opts.fx),\n fy: num(opts.fy),\n fx2: num(opts.fx2),\n fy2: num(opts.fy2),\n pxX: num(opts.x),\n pxY: num(opts.y),\n pxX2: num(opts.x2),\n pxY2: num(opts.y2),\n speed: num(opts.speed),\n key: opts.key,\n text: opts.text,\n clear: opts.clear,\n hideKeyboard: opts.hideKeyboard,\n deviceSerial: opts.device,\n logger,\n });\n if (opts.type === 'hideKeyboard') {\n logger.info(result.keyboardHidden ? 'Dismissed the keyboard.' : 'The keyboard was not shown.');\n return;\n }\n const at = result.x !== undefined ? ` at ${result.x},${result.y}` : '';\n const on = result.target ? ` on ${describeLayoutNode(result.target)}` : '';\n const kb = result.keyboardHidden ? ' (dismissed the keyboard)' : '';\n logger.info(`Sent ${opts.type}${at}${on}${kb}.`);\n });\n\n program\n .command('gesture')\n .description('Inject a multi-waypoint gesture. Waypoints are JSON: [{\"x\":..,\"y\":..,\"t\":..}] in pixels (or fractions with --fractions).')\n .requiredOption('--waypoints <json>', 'JSON array of {x,y,t} waypoints (t = ms from start).')\n .option('--fractions', 'Waypoint x/y are 0-1 fractions of the display instead of pixels.')\n .option('--hold-start <ms>', 'Leading press-hold before moving (best-effort: uses `uitest drag`).')\n .option('--hold-end <ms>', 'Trailing hold before lifting (no uitest equivalent; ignored).')\n .option('--device <serial>', 'Target device serial.')\n .action(async (opts: GestureOpts) => {\n const { config, logger } = getRuntime();\n let waypoints = JSON.parse(opts.waypoints) as Waypoint[];\n if (opts.fractions) {\n const bad = waypoints.find((w) => !(w.x >= 0 && w.x <= 1 && w.y >= 0 && w.y <= 1));\n if (bad) throw new Error(`With --fractions, waypoint x and y must be 0-1; got ${bad.x},${bad.y}.`);\n const display = await getDisplaySize(config, { deviceSerial: opts.device, logger });\n if (!display) throw new Error('Could not read the display size to convert fractions to pixels.');\n // 1.0 maps to the last pixel, not one past the edge.\n const px = (f: number, size: number): number => Math.min(size - 1, Math.round(f * size));\n waypoints = waypoints.map((w) => ({ ...w, x: px(w.x, display.width), y: px(w.y, display.height) }));\n }\n await sendGesture({\n config,\n waypoints,\n holdStartMs: num(opts.holdStart),\n holdEndMs: num(opts.holdEnd),\n deviceSerial: opts.device,\n logger,\n });\n logger.info('Gesture sent.');\n });\n}\n","import { Command } from 'commander';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { captureLog } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport { collectLogBundle } from '../lib/logBundle.js';\n\ninterface LogsOpts {\n output?: string;\n for?: string;\n grep?: string;\n clear?: boolean;\n domain?: string;\n device?: string;\n}\n\ninterface CollectOptions {\n output: string;\n device?: string;\n package?: string;\n pid?: string;\n tag?: string;\n level?: string;\n duration: string;\n redact: boolean;\n json?: boolean;\n}\n\nexport function registerLogsCommand(program: Command): void {\n const logs = program\n .command('logs')\n .description(\n 'Capture hilog to a file for a whole session: the device\\'s small log buffer wraps within ' +\n 'seconds under chatty components, so a dump at the end loses lines. Runs until --for elapses ' +\n 'or the process is interrupted; start it in the background, e.g. `oniro-app logs --clear -o ' +\n 'hilog_full.txt &`. Every line is flushed as it arrives and the stream reconnects after a reboot.',\n )\n // Not requiredOption: commander checks a parent's mandatory options for its\n // subcommands too, so `logs collect` would demand it.\n .option('-o, --output <file>', 'File to append the lines to (required).')\n .option('--for <ms>', 'Stop after this many ms (default: run until interrupted).')\n .option('--grep <regex>', 'Keep only lines matching this regex (default: all).')\n .option('--clear', 'Clear the device log buffer first (hilog -r), so the file covers only this session.')\n .option('--domain <domain>', 'hilog domain filter (e.g. 0xD003900).')\n .option('--device <serial>', 'Target device serial.')\n .action(async (opts: LogsOpts) => {\n if (!opts.output) logs.error(\"error: required option '-o, --output <file>' not specified\");\n const { config, logger } = getRuntime();\n const file = path.resolve(opts.output!);\n const abort = new AbortController();\n const stop = (): void => abort.abort();\n process.once('SIGINT', stop);\n process.once('SIGTERM', stop);\n logger.info(`Capturing hilog to ${file}${opts.for ? ` for ${opts.for} ms` : ' until interrupted'}...`);\n const result = await captureLog({\n config,\n file,\n durationMs: opts.for !== undefined ? Number(opts.for) : undefined,\n pattern: opts.grep ? new RegExp(opts.grep) : undefined,\n clear: opts.clear,\n domain: opts.domain,\n deviceSerial: opts.device,\n abortSignal: abort.signal,\n logger,\n });\n logger.info(`Wrote ${result.lines} lines to ${result.file} (${result.reconnects} reconnects).`);\n process.stdout.write(`${result.file}\\n`);\n });\n\n logs\n .command('collect')\n .description('Create a diagnostic bundle from a connected device.')\n .allowExcessArguments(false)\n .option('-o, --output <directory>', 'Parent directory for incident bundles.', path.join(os.homedir(), '.oniro', 'incident-bundles'))\n .option('--device <serial>', 'Target device serial.')\n .option('--package <bundle>', 'Collect faultlog entries for this application bundle.')\n .option('--pid <pid>', 'Create a filtered HiLog view for this process.')\n .option('--tag <tag>', 'Create a filtered HiLog view for this tag.')\n .option('--level <level>', 'Create a filtered HiLog view for this level (V/D/I/W/E/F).')\n .option('--duration <seconds>', 'Keep HiLog records from the last N seconds (default 600).', '600')\n .option('--redact', 'Redact sensitive values and archive only the redacted bundle.')\n .option('--json', 'Emit bundle paths and status as JSON.')\n .action(async (opts: CollectOptions) => {\n const { config } = getRuntime();\n const result = await collectLogBundle({\n config,\n outputDirectory: opts.output,\n deviceSerial: opts.device,\n packageName: opts.package,\n pid: opts.pid,\n tag: opts.tag,\n level: opts.level,\n durationSeconds: Number(opts.duration),\n redact: Boolean(opts.redact),\n });\n const output = opts.json\n ? `${JSON.stringify({ ...result, status: result.complete ? 'complete' : 'partial' }, null, 2)}\\n`\n : `${result.archivePath ?? result.bundleDirectory}\\n`;\n process.stdout.write(output);\n if (!result.complete) {\n throw new Error(`Bundle is partial; inspect manifest.json. ${result.error ?? 'One or more collectors failed.'}`);\n }\n });\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { deflateRawSync } from 'node:zlib';\nimport {\n VERSION, hdcExec, parseDeviceList, resolveDeviceSerial, shellChecked, type ConfigProvider, type HdcExecResult,\n} from '@oniroproject/core';\n\nexport interface CollectLogBundleOptions {\n config: ConfigProvider;\n outputDirectory: string;\n deviceSerial?: string;\n packageName?: string;\n pid?: string;\n tag?: string;\n level?: string;\n durationSeconds?: number;\n redact: boolean;\n execute?: (args: readonly string[], deviceSerial?: string) => Promise<HdcExecResult>;\n}\n\nexport interface LogBundleResult {\n bundleDirectory: string;\n archivePath: string | null;\n redactedDirectory: string | null;\n complete: boolean;\n error?: string;\n}\n\ninterface CommandRecord {\n name: string;\n status: 'success' | 'failed';\n output: string | null;\n stderr: string | null;\n exitCode: number | null;\n error: string | null;\n}\n\nconst LEVELS: Record<string, string> = {\n V: 'V', VERBOSE: 'V', D: 'D', DEBUG: 'D', I: 'I', INFO: 'I',\n W: 'W', WARN: 'W', WARNING: 'W', E: 'E', ERROR: 'E', F: 'F', FATAL: 'F',\n};\nconst HILOG_RECORD = /^(?<date>\\d{2}-\\d{2})[ \\t]+(?<time>\\d{2}:\\d{2}:\\d{2}\\.\\d{3})[ \\t]+(?<pid>\\d+)[ \\t]+\\d+[ \\t]+(?<level>[VDIWEF])[ \\t]+(?<tag>\\S+?)(?:[ \\t]+[NH](?::(?:[ \\t]+.*)?|[ \\t]+.*)?|:(?:[ \\t]+.*)?)$/;\nconst FAILURE_TEXT = /^(?:\\s*(?:\\[(?:fail|error)\\]|(?:error|failed|failure):|permission denied\\b|no devices? connected\\b|too many arguments\\b|unknown option\\b|invalid option\\b|command not found\\b)|\\s*(?:hdc|device)\\b.*\\b(?:error|failed|no device|not connected|offline)\\b)/im;\n\nfunction validateDate(date: string, time: string): boolean {\n const [, monthText, dayText] = /^(\\d{2})-(\\d{2})$/.exec(date) ?? [];\n const [, hourText, minuteText, secondText, millisecondText] = /^(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3})$/.exec(time) ?? [];\n if (!monthText || !dayText || !hourText || !minuteText || !secondText || !millisecondText) return false;\n const value = new Date(Date.UTC(2000, Number(monthText) - 1, Number(dayText), Number(hourText), Number(minuteText), Number(secondText), Number(millisecondText)));\n return value.getUTCMonth() === Number(monthText) - 1 && value.getUTCDate() === Number(dayText) &&\n Number(hourText) < 24 && Number(minuteText) < 60 && Number(secondText) < 60;\n}\n\nexport function filterHilog(\n input: string,\n filters: { pid?: string; tag?: string; level?: string },\n): { text: string; applied: string[] } | null {\n const criteria: Record<string, string> = {};\n if (filters.pid) criteria.pid = filters.pid.replace(/^0+(?=\\d)/, '');\n if (filters.tag) criteria.tag = filters.tag;\n if (filters.level) criteria.level = LEVELS[filters.level.toUpperCase()] ?? filters.level.toUpperCase();\n if (Object.keys(criteria).length === 0) return null;\n\n let sawRecord = false;\n let keep = false;\n let output = '';\n for (const line of input.match(/[^\\n]*\\n|[^\\n]+$/g) ?? []) {\n const content = line.replace(/[\\r\\n]+$/, '');\n const match = HILOG_RECORD.exec(content);\n if (match?.groups) {\n if (!validateDate(match.groups.date!, match.groups.time!)) return null;\n sawRecord = true;\n keep = Object.entries(criteria).every(([key, value]) => {\n const field = key === 'tag'\n ? match.groups!.tag!.slice(match.groups!.tag!.lastIndexOf('/') + 1)\n : match.groups![key];\n return key === 'pid' ? field?.replace(/^0+(?=\\d)/, '') === value : field === value;\n });\n } else if (/^\\s*\\[?\\d{1,4}[-/]/.test(content) || (!sawRecord && content.trim())) {\n return null;\n }\n if (keep) output += line;\n }\n return sawRecord ? { text: output, applied: Object.keys(criteria) } : null;\n}\n\nexport function redactLogText(value: string, deviceSerials: readonly string[] = []): string {\n let result = value\n .replace(/(\\bBearer\\s+)[A-Za-z0-9._~+/=-]+/gi, '$1[REDACTED]')\n .replace(/(\\bBasic\\s+)[A-Za-z0-9+/=]+/gi, '$1[REDACTED]')\n .replace(/((?:token|password|passwd|secret|api[_-]?key)\\s*[=:]\\s*)[^\\s,;]+/gi, '$1[REDACTED]')\n .replace(/(cookie\\s*[=:]\\s*)[^\\r\\n]+/gi, '$1[REDACTED]')\n .replace(/\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/gi, '[REDACTED_EMAIL]')\n .replace(/((?:phone|mobile|telephone|tel)(?:number)?\\s*[=:]\\s*)\\+?[\\d ()-]{8,}\\d/gi, '$1[REDACTED_PHONE]')\n .replace(/(?<![\\w.])(?:\\+\\d{1,3}[ -]?)?\\(?\\d{2,4}\\)?[ -]\\d{3,4}[ -]\\d{3,4}(?![\\w.])/g, '[REDACTED_PHONE]')\n .replace(/\\b(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}\\b/g, '[REDACTED_MAC]')\n .replace(/([A-Z]:\\\\Users\\\\)[^\\\\\\r\\n \"']+/gi, '$1[REDACTED_USER]')\n .replace(/(\\/(?:Users|home)\\/)[^/\\r\\n \"']+/gi, '$1[REDACTED_USER]')\n .replace(/(\"(?:target|deviceSerial)\"\\s*:\\s*\")[^\"]+(\")/gi, '$1[REDACTED_DEVICE]$2')\n .replace(/(--device\\s+|-t\\s+)([A-Za-z0-9._:-]+)/gi, '$1[REDACTED_DEVICE]');\n\n for (const serial of deviceSerials) {\n if (serial) result = result.split(serial).join('[REDACTED_DEVICE]');\n }\n\n const ipv4 = /\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b/g;\n result = result.replace(ipv4, (address, offset: number, whole: string) => {\n const prefix = whole.slice(Math.max(0, offset - 48), offset);\n const suffix = whole.slice(offset + address.length);\n const contextual = /(?:ip|addr(?:ess)?|host|peer|remote|local|endpoint|server|client|target|device(?:id)?|serial)[^\\r\\n]{0,24}$/i.test(prefix);\n const hasPort = /^:\\d{1,5}(?!\\d)/.test(suffix);\n const octets = address.split('.').map(Number);\n return octets.every((part: number) => part <= 255) && (contextual || hasPort) ? '[REDACTED_IP]' : address;\n });\n return result;\n}\n\nfunction decodeText(data: Buffer, relativePath: string): string {\n let text: string;\n if (data.subarray(0, 2).equals(Buffer.from([0xff, 0xfe]))) text = data.toString('utf16le').slice(1);\n else if (data.subarray(0, 2).equals(Buffer.from([0xfe, 0xff]))) {\n const swapped = Buffer.from(data.subarray(2));\n for (let i = 0; i + 1 < swapped.length; i += 2) [swapped[i], swapped[i + 1]] = [swapped[i + 1]!, swapped[i]!];\n text = swapped.toString('utf16le');\n } else {\n const utf8 = data.subarray(0, 3).equals(Buffer.from([0xef, 0xbb, 0xbf])) ? data.subarray(3) : data;\n if (utf8.includes(0)) throw new Error(`Binary data cannot be safely redacted: ${relativePath}`);\n try {\n text = new TextDecoder('utf-8', { fatal: true }).decode(utf8);\n } catch {\n throw new Error(`Non-UTF-8 data cannot be safely redacted: ${relativePath}`);\n }\n }\n if (text.includes('\\u0000')) throw new Error(`Binary data cannot be safely redacted: ${relativePath}`);\n return text;\n}\n\nasync function redactTree(\n source: string,\n destination: string,\n serials: readonly string[],\n boundedHilog: string | null,\n): Promise<void> {\n await fs.mkdir(destination, { recursive: false, mode: 0o700 });\n try {\n const visit = async (directory: string): Promise<void> => {\n for (const entry of await fs.readdir(directory, { withFileTypes: true })) {\n const sourcePath = path.join(directory, entry.name);\n const relative = path.relative(source, sourcePath);\n const portableRelative = relative.split(path.sep).join('/');\n const destinationPath = path.join(destination, relative);\n if (entry.isDirectory()) {\n await fs.mkdir(destinationPath, { recursive: true, mode: 0o700 });\n await visit(sourcePath);\n } else if (entry.isFile()) {\n if (portableRelative === 'logs/hilog.txt') {\n const text = boundedHilog ?? 'HiLog omitted from this archive because the requested duration could not be reliably applied.\\n';\n await fs.mkdir(path.dirname(destinationPath), { recursive: true, mode: 0o700 });\n await fs.writeFile(destinationPath, redactLogText(text, serials), { encoding: 'utf8', mode: 0o600 });\n continue;\n }\n if (portableRelative === 'logs/hilog-filtered.txt' && boundedHilog === null) continue;\n const text = decodeText(await fs.readFile(sourcePath), relative);\n await fs.mkdir(path.dirname(destinationPath), { recursive: true, mode: 0o700 });\n await fs.writeFile(destinationPath, redactLogText(text, serials), { encoding: 'utf8', mode: 0o600 });\n }\n }\n };\n await visit(source);\n } catch (error) {\n await fs.rm(destination, { recursive: true, force: true });\n throw error;\n }\n}\n\nconst CRC_TABLE = new Uint32Array(256);\nfor (let i = 0; i < CRC_TABLE.length; i++) {\n let value = i;\n for (let bit = 0; bit < 8; bit++) value = value & 1 ? 0xedb88320 ^ (value >>> 1) : value >>> 1;\n CRC_TABLE[i] = value >>> 0;\n}\n\nfunction crc32(data: Buffer): number {\n let crc = 0xffffffff;\n for (const byte of data) crc = CRC_TABLE[(crc ^ byte) & 0xff]! ^ (crc >>> 8);\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nfunction dosDateTime(date: Date): { date: number; time: number } {\n const year = Math.max(1980, date.getFullYear());\n return {\n date: ((year - 1980) << 9) | ((date.getMonth() + 1) << 5) | date.getDate(),\n time: (date.getHours() << 11) | (date.getMinutes() << 5) | Math.floor(date.getSeconds() / 2),\n };\n}\n\nasync function writeZip(source: string, archivePath: string): Promise<void> {\n const files: string[] = [];\n const visit = async (directory: string): Promise<void> => {\n for (const entry of await fs.readdir(directory, { withFileTypes: true })) {\n const filePath = path.join(directory, entry.name);\n if (entry.isDirectory()) await visit(filePath);\n else if (entry.isFile()) files.push(filePath);\n }\n };\n await visit(source);\n const localParts: Buffer[] = [];\n const centralParts: Buffer[] = [];\n let offset = 0;\n const stamp = dosDateTime(new Date());\n\n for (const filePath of files) {\n const name = Buffer.from(path.relative(source, filePath).split(path.sep).join('/'), 'utf8');\n const data = await fs.readFile(filePath);\n const compressed = deflateRawSync(data);\n const checksum = crc32(data);\n const local = Buffer.alloc(30);\n local.writeUInt32LE(0x04034b50, 0); local.writeUInt16LE(20, 4); local.writeUInt16LE(0x0800, 6);\n local.writeUInt16LE(8, 8); local.writeUInt16LE(stamp.time, 10); local.writeUInt16LE(stamp.date, 12);\n local.writeUInt32LE(checksum, 14); local.writeUInt32LE(compressed.length, 18); local.writeUInt32LE(data.length, 22);\n local.writeUInt16LE(name.length, 26); local.writeUInt16LE(0, 28);\n localParts.push(local, name, compressed);\n\n const central = Buffer.alloc(46);\n central.writeUInt32LE(0x02014b50, 0); central.writeUInt16LE(20, 4); central.writeUInt16LE(20, 6);\n central.writeUInt16LE(0x0800, 8); central.writeUInt16LE(8, 10); central.writeUInt16LE(stamp.time, 12);\n central.writeUInt16LE(stamp.date, 14); central.writeUInt32LE(checksum, 16);\n central.writeUInt32LE(compressed.length, 20); central.writeUInt32LE(data.length, 24);\n central.writeUInt16LE(name.length, 28); central.writeUInt16LE(0, 30); central.writeUInt16LE(0, 32);\n central.writeUInt16LE(0, 34); central.writeUInt16LE(0, 36); central.writeUInt32LE(0, 38);\n central.writeUInt32LE(offset, 42);\n centralParts.push(central, name);\n offset += local.length + name.length + compressed.length;\n }\n\n const centralDirectory = Buffer.concat(centralParts);\n const end = Buffer.alloc(22);\n end.writeUInt32LE(0x06054b50, 0); end.writeUInt16LE(0, 4); end.writeUInt16LE(0, 6);\n end.writeUInt16LE(files.length, 8); end.writeUInt16LE(files.length, 10);\n end.writeUInt32LE(centralDirectory.length, 12); end.writeUInt32LE(offset, 16); end.writeUInt16LE(0, 20);\n await fs.writeFile(archivePath, Buffer.concat([...localParts, centralDirectory, end]), { flag: 'wx', mode: 0o600 });\n}\n\nfunction commandFailure(result: HdcExecResult): string | null {\n if (result.code !== 0) return `hdc exited with code ${result.code}`;\n if (result.stderr.trim()) return 'hdc wrote to stderr';\n const contentError = result.stdout.split(/\\r?\\n/).find((line) => FAILURE_TEXT.test(line))?.trim() ?? null;\n return contentError ? `command output indicates failure: ${contentError}` : null;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nasync function uniqueBundleDirectory(outputDirectory: string, stamp: string): Promise<string> {\n await fs.mkdir(outputDirectory, { recursive: true, mode: 0o700 });\n for (let suffix = 0; ; suffix++) {\n const name = `incident-${stamp}${suffix ? `-${suffix}` : ''}`;\n const directory = path.join(outputDirectory, name);\n try {\n await fs.mkdir(directory, { mode: 0o700 });\n return directory;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'EEXIST') throw error;\n }\n }\n}\n\nexport async function collectLogBundle(options: CollectLogBundleOptions): Promise<LogBundleResult> {\n if (options.packageName && !/^[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)+$/.test(options.packageName)) {\n throw new Error('packageName must be a reverse-DNS bundle name.');\n }\n if (options.pid && !/^[1-9]\\d*$/.test(options.pid)) throw new Error('pid must be a positive integer.');\n if (options.tag && !/^[^\\s/\\x00-\\x1f\\x7f]+$/.test(options.tag)) throw new Error('tag must be a single HiLog tag.');\n if (options.level && !LEVELS[options.level.toUpperCase()]) throw new Error('level is not a recognized HiLog level.');\n const durationSeconds = options.durationSeconds ?? 600;\n if (!Number.isSafeInteger(durationSeconds) || durationSeconds < 1 || durationSeconds > 31_536_000) {\n throw new Error('durationSeconds must be an integer between 1 and 31536000.');\n }\n\n const started = new Date();\n const stamp = started.toISOString().replace(/[-:]/g, '').replace(/\\.\\d{3}Z$/, 'Z');\n const bundleDirectory = await uniqueBundleDirectory(path.resolve(options.outputDirectory), stamp);\n const records: CommandRecord[] = [];\n const serials: string[] = [];\n let replacementWarning = false;\n const execute = options.execute ?? ((args, deviceSerial) => args[0] === 'shell'\n ? shellChecked({ config: options.config, command: args.slice(1).join(' '), deviceSerial })\n : hdcExec({ config: options.config, args, deviceSerial }));\n const manifest: Record<string, unknown> = {\n schemaVersion: '1.0',\n collectorVersion: VERSION,\n collectionStartUtc: started.toISOString(),\n collectionEndUtc: null,\n host: { os: process.platform },\n target: null,\n packageName: options.packageName ?? null,\n pid: options.pid ?? null,\n filters: {\n tag: options.tag ?? null,\n level: options.level ?? null,\n pid: options.pid ?? null,\n packageName: options.packageName ?? null,\n durationSeconds,\n },\n filterStatus: {\n duration: 'not-applied',\n packageName: options.packageName ? 'failed' : 'not-requested',\n pid: options.pid ? 'not-applied' : 'not-requested',\n tag: options.tag ? 'not-applied' : 'not-requested',\n level: options.level ? 'not-applied' : 'not-requested',\n },\n hilogWindowApplied: false,\n redactionRequested: options.redact,\n redactionStatus: options.redact ? 'pending' : 'not-requested',\n archiveStatus: { status: 'pending', path: null },\n commands: records,\n files: [],\n notes: [\n 'Collection is read-only on the target device.',\n 'hilog -x captures the current device buffer; duration is applied locally against device time when log timestamps are recognized.',\n 'Redaction is heuristic and does not guarantee that a bundle is safe to publish.',\n ],\n };\n\n const run = async (name: string, relativeOutput: string, args: readonly string[], deviceSerial?: string): Promise<CommandRecord> => {\n const outputPath = path.join(bundleDirectory, relativeOutput);\n await fs.mkdir(path.dirname(outputPath), { recursive: true, mode: 0o700 });\n let result: HdcExecResult | null = null;\n let failure: string | null = null;\n try {\n result = await execute(args, deviceSerial);\n await fs.writeFile(outputPath, result.stdout, { encoding: 'utf8', mode: 0o600 });\n if (result.stderr) await fs.writeFile(`${outputPath}.stderr.txt`, result.stderr, { encoding: 'utf8', mode: 0o600 });\n if (result.stdout.includes('\\ufffd') || result.stderr.includes('\\ufffd')) {\n replacementWarning = true;\n (manifest.notes as string[]).push(`${name} output contains Unicode replacement characters; review the redacted evidence before sharing.`);\n }\n failure = commandFailure(result);\n } catch (error) {\n failure = errorMessage(error);\n await fs.writeFile(outputPath, '', { encoding: 'utf8', mode: 0o600 });\n }\n const record: CommandRecord = {\n name,\n status: failure ? 'failed' : 'success',\n output: relativeOutput,\n stderr: result?.stderr ? `${relativeOutput}.stderr.txt` : null,\n exitCode: result?.code ?? null,\n error: failure,\n };\n records.push(record);\n return record;\n };\n\n const targetRecord = await run('list-targets', 'device/targets.txt', ['list', 'targets', '-v']);\n const targetOutput = await fs.readFile(path.join(bundleDirectory, 'device/targets.txt'), 'utf8').catch(() => '');\n const targets = parseDeviceList(targetOutput).filter((target) => target.status === 'Connected' || target.status === 'Unknown');\n serials.push(...parseDeviceList(targetOutput).map((target) => target.serial));\n const requestedDevice = resolveDeviceSerial(options.deviceSerial);\n let selectedDevice: string | null = null;\n let targetError: string | null = null;\n if (targetRecord.status !== 'success') targetError = targetRecord.error ?? 'hdc target discovery failed';\n else if (requestedDevice) {\n selectedDevice = targets.find((target) => target.serial === requestedDevice)?.serial ?? null;\n if (!selectedDevice) targetError = 'selected device was not discovered as connected';\n } else if (targets.length === 0) targetError = 'hdc did not discover a connected device';\n else if (targets.length > 1) targetError = 'multiple devices are connected; specify --device';\n else selectedDevice = targets[0]!.serial;\n\n let boundedHilog: string | null = null;\n let durationApplied = false;\n let durationFailureReason = 'device clock or HiLog collection failed';\n if (targetError) {\n targetRecord.status = 'failed';\n targetRecord.error = targetError;\n (manifest.notes as string[]).push('Device collection stopped because target discovery did not identify exactly one selected connected device.');\n } else {\n manifest.target = selectedDevice;\n const shell = (args: readonly string[]) => run(args[0]!, args[1]!, args.slice(2), selectedDevice!);\n const captureStartedHostMs = Date.now();\n const deviceTimeBefore = await shell([\n 'device-time-before', 'device/device-time-before.txt', 'shell', 'date', '+%Y-%m-%dT%H:%M:%S',\n ]);\n const hilog = await shell(['hilog-snapshot', 'logs/hilog.txt', 'shell', 'hilog', '-x']);\n const deviceTimeAfter = await shell([\n 'device-time-after', 'device/device-time-after.txt', 'shell', 'date', '+%Y-%m-%dT%H:%M:%S',\n ]);\n const hostElapsedMs = Date.now() - captureStartedHostMs;\n if (deviceTimeBefore.status === 'success' && hilog.status === 'success' && deviceTimeAfter.status === 'success') {\n const [beforeText, afterText, fullHilog] = await Promise.all([\n fs.readFile(path.join(bundleDirectory, 'device/device-time-before.txt'), 'utf8'),\n fs.readFile(path.join(bundleDirectory, 'device/device-time-after.txt'), 'utf8'),\n fs.readFile(path.join(bundleDirectory, 'logs/hilog.txt'), 'utf8'),\n ]);\n const window = filterHilogWindow(fullHilog, beforeText, afterText, durationSeconds, hostElapsedMs);\n if (window.text === null) durationFailureReason = window.reason;\n else boundedHilog = window.text;\n } else if (deviceTimeBefore.status !== 'success' || deviceTimeAfter.status !== 'success') {\n durationFailureReason = 'device clock could not be read';\n } else if (hilog.status !== 'success') {\n durationFailureReason = 'HiLog snapshot collection failed';\n }\n durationApplied = boundedHilog !== null;\n manifest.hilogWindowApplied = durationApplied;\n const faultArgs = options.packageName\n ? ['faultlog', 'logs/faultlog.txt', 'shell', 'hidumper', '-e', '--print', options.packageName, '-n', '5']\n : ['faultlog', 'logs/faultlog.txt', 'shell', 'hidumper', '-e', '--list', '-n', '20'];\n const faultlog = await shell(faultArgs);\n manifest.filterStatus = {\n duration: durationApplied ? 'applied' : 'not-applied',\n packageName: options.packageName ? (faultlog.status === 'success' ? 'applied' : 'failed') : 'not-requested',\n pid: options.pid ? 'not-applied' : 'not-requested',\n tag: options.tag ? 'not-applied' : 'not-requested',\n level: options.level ? 'not-applied' : 'not-requested',\n };\n if (!durationApplied) {\n (manifest.notes as string[]).push(\n `HiLog duration was not applied (${durationFailureReason}); the full snapshot is kept only in the local raw bundle and omitted from the redacted archive.`,\n );\n } else if (boundedHilog !== null && (options.pid || options.tag || options.level)) {\n const filtered = filterHilog(boundedHilog, { pid: options.pid, tag: options.tag, level: options.level });\n if (filtered) {\n await fs.writeFile(path.join(bundleDirectory, 'logs/hilog-filtered.txt'), filtered.text, { encoding: 'utf8', mode: 0o600 });\n const status = manifest.filterStatus as Record<string, string>;\n for (const key of filtered.applied) status[key] = 'applied';\n } else {\n (manifest.notes as string[]).push('Requested HiLog PID/tag/level filters were not applied because the windowed snapshot format could not be parsed reliably.');\n }\n }\n await shell(['device-name', 'device/device-info.txt', 'shell', 'param', 'get', 'const.product.name']);\n await shell(['process-list', 'device/process-list.txt', 'shell', 'ps', '-ef']);\n await shell(['memory', 'device/memory.txt', 'shell', 'hidumper', '--mem']);\n await shell(['threads', 'device/threads.txt', 'shell', 'hidumper', '-p']);\n }\n\n const ended = new Date();\n manifest.collectionEndUtc = ended.toISOString();\n const files = records.flatMap((record) => [record.output, record.stderr].filter((file): file is string => Boolean(file)));\n files.push('manifest.json', 'notes.txt');\n if (await fs.access(path.join(bundleDirectory, 'logs/hilog-filtered.txt')).then(() => true, () => false)) {\n files.push('logs/hilog-filtered.txt');\n }\n manifest.files = files;\n await fs.writeFile(path.join(bundleDirectory, 'notes.txt'), 'Add reproduction steps and precise event timestamps here.\\n', { encoding: 'utf8', mode: 0o600 });\n\n const durationFailure = !durationApplied;\n const criticalFailure = Boolean(targetError) || records.some((record) => record.name === 'hilog-snapshot' && record.status !== 'success');\n const anyCommandFailure = records.some((record) => record.status !== 'success');\n let redactedDirectory: string | null = null;\n let archivePath: string | null = null;\n let bundleError: string | undefined;\n\n try {\n if (options.redact) {\n redactedDirectory = `${bundleDirectory}-redacted`;\n manifest.redactionStatus = replacementWarning ? 'review-required' : 'success';\n manifest.archiveStatus = { status: 'success', path: `${path.basename(redactedDirectory)}.zip` };\n await fs.writeFile(path.join(bundleDirectory, 'manifest.json'), `${JSON.stringify(manifest, null, 2)}\\n`, { encoding: 'utf8', mode: 0o600 });\n await redactTree(bundleDirectory, redactedDirectory, serials, boundedHilog);\n archivePath = `${redactedDirectory}.zip`;\n await writeZip(redactedDirectory, archivePath);\n } else {\n archivePath = `${bundleDirectory}.zip`;\n manifest.archiveStatus = { status: 'success', path: path.basename(archivePath) };\n await fs.writeFile(path.join(bundleDirectory, 'manifest.json'), `${JSON.stringify(manifest, null, 2)}\\n`, { encoding: 'utf8', mode: 0o600 });\n await writeZip(bundleDirectory, archivePath);\n }\n } catch (error) {\n bundleError = options.redact ? `redaction or archive creation failed: ${errorMessage(error)}` : `archive creation failed: ${errorMessage(error)}`;\n archivePath = null;\n manifest.redactionStatus = options.redact ? 'failed' : 'not-requested';\n manifest.archiveStatus = { status: 'failed', path: null };\n (manifest.notes as string[]).push(bundleError);\n await fs.rm(`${redactedDirectory ?? bundleDirectory}.zip`, { force: true }).catch(() => undefined);\n if (redactedDirectory) await fs.rm(redactedDirectory, { recursive: true, force: true }).catch(() => undefined);\n await fs.writeFile(path.join(bundleDirectory, 'manifest.json'), `${JSON.stringify(manifest, null, 2)}\\n`, { encoding: 'utf8', mode: 0o600 });\n redactedDirectory = null;\n }\n\n return {\n bundleDirectory,\n archivePath,\n redactedDirectory,\n complete: !criticalFailure && !anyCommandFailure && !bundleError && !replacementWarning && !durationFailure,\n error: bundleError ?? (criticalFailure ? targetError ?? 'HiLog collection failed' : replacementWarning\n ? 'Captured output contains Unicode replacement characters; review the manifest before sharing.'\n : durationFailure ? `HiLog duration was not applied (${durationFailureReason}); the redacted archive omits the full snapshot.`\n : undefined),\n };\n}\n\nfunction parseDeviceClock(value: string): number | null {\n const match = /^\\s*(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})\\s*$/.exec(value);\n if (!match) return null;\n const [, year, month, day, hour, minute, second] = match;\n const timestamp = Date.UTC(Number(year), Number(month) - 1, Number(day), Number(hour), Number(minute), Number(second));\n const date = new Date(timestamp);\n return date.getUTCFullYear() === Number(year) && date.getUTCMonth() === Number(month) - 1 &&\n date.getUTCDate() === Number(day) && Number(hour) < 24 && Number(minute) < 60 && Number(second) < 60\n ? timestamp\n : null;\n}\n\nfunction parseHilogTimestamp(datePart: string, timePart: string, referenceMs: number): number | null {\n if (!validateDate(datePart, timePart)) return null;\n const [month, day] = datePart.split('-').map(Number);\n const [hour, minute, second, millisecond] = timePart.split(/[:.]/).map(Number);\n const referenceYear = new Date(referenceMs).getUTCFullYear();\n const candidates = [referenceYear - 1, referenceYear, referenceYear + 1]\n .map((year) => Date.UTC(year, month! - 1, day!, hour!, minute!, second!, millisecond!))\n .filter((timestamp) => {\n const candidate = new Date(timestamp);\n return candidate.getUTCMonth() === month! - 1 && candidate.getUTCDate() === day;\n })\n .sort((left, right) => Math.abs(left - referenceMs) - Math.abs(right - referenceMs));\n const closest = candidates[0];\n return closest !== undefined && closest <= referenceMs + 2_000 ? closest : null;\n}\n\nexport type HilogWindowResult = { text: string; reason?: undefined } | { text: null; reason: string };\n\nexport function filterHilogWindow(\n input: string,\n deviceClockBefore: string,\n deviceClockAfter: string,\n durationSeconds: number,\n hostElapsedMs: number,\n): HilogWindowResult {\n if (!Number.isSafeInteger(durationSeconds) || durationSeconds < 1 || durationSeconds > 31_536_000) {\n return { text: null, reason: 'requested duration is invalid' };\n }\n const beforeMs = parseDeviceClock(deviceClockBefore);\n const afterMs = parseDeviceClock(deviceClockAfter);\n if (beforeMs === null || afterMs === null) return { text: null, reason: 'device clock output was not recognized' };\n const deviceElapsedMs = afterMs - beforeMs;\n if (deviceElapsedMs < -1_000 || deviceElapsedMs > Math.max(0, hostElapsedMs) + 5_000) {\n return { text: null, reason: 'device clock changed inconsistently during capture' };\n }\n\n const windowEnd = afterMs + 999;\n const windowStart = windowEnd - durationSeconds * 1_000;\n let sawRecord = false;\n let keep = false;\n let output = '';\n for (const line of input.match(/[^\\n]*\\n|[^\\n]+$/g) ?? []) {\n const content = line.replace(/[\\r\\n]+$/, '');\n const match = HILOG_RECORD.exec(content);\n if (match?.groups) {\n if (!validateDate(match.groups.date!, match.groups.time!)) {\n return { text: null, reason: 'HiLog contains an invalid timestamp' };\n }\n const timestamp = parseHilogTimestamp(match.groups.date!, match.groups.time!, afterMs);\n if (timestamp === null || timestamp > windowEnd) {\n return { text: null, reason: 'HiLog timestamps do not agree with the device clock' };\n }\n sawRecord = true;\n keep = timestamp >= windowStart;\n } else if (/^-{3,}\\s*beginning of\\b/i.test(content.trim())) {\n continue;\n } else if (/^\\s*\\[?\\d{1,4}[-/]/.test(content) || /^\\s*\\d{2}:\\d{2}:\\d{2}/.test(content)) {\n return { text: null, reason: 'HiLog contains timestamped lines in an unrecognized format' };\n } else if (!sawRecord && content.trim()) {\n return { text: null, reason: 'HiLog contains unclassified lines before the first record' };\n }\n if (keep) output += line;\n }\n return sawRecord ? { text: output } : { text: null, reason: 'no recognized timestamped HiLog records were found' };\n}\n","import { Command } from 'commander';\nimport { getHdcPath, hdcTargetArgsFor, spawnCompat } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\n/** The argv for the passthrough: verbatim when the caller already picked a target with `-t`. */\nexport function hdcPassthroughArgv(args: readonly string[], device?: string): string[] {\n return args[0] === '-t' ? [...args] : [...hdcTargetArgsFor(args, device), ...args];\n}\n\nexport function registerHdcCommand(program: Command): void {\n program\n .command('hdc')\n .description(\n 'Run the hdc binary oniro-app itself uses (see `cmdtools status`), addressed at --device or ' +\n 'ONIRO_DEVICE_SERIAL, with stdio passed through. Exits with hdc\\'s own code, which is 0 even for ' +\n 'a `[Fail]` line. Example: oniro-app hdc shell param get const.ohos.apiversion',\n )\n .argument('[args...]', 'hdc arguments, passed through verbatim')\n .option('--device <serial>', 'Target device serial.')\n .option('--path', 'Print the hdc binary path and exit.')\n .passThroughOptions()\n .allowUnknownOption()\n .action(async (args: string[], opts: { device?: string; path?: boolean }) => {\n const { config } = getRuntime();\n const hdc = getHdcPath(config);\n if (opts.path) {\n process.stdout.write(`${hdc}\\n`);\n return;\n }\n await new Promise<void>((resolve, reject) => {\n const child = spawnCompat(hdc, hdcPassthroughArgv(args, opts.device), { stdio: 'inherit' });\n child.on('error', (err) => reject(new Error(`Failed to run ${hdc}: ${err.message}`)));\n child.on('close', (code) => {\n process.exitCode = code ?? 1;\n resolve();\n });\n });\n });\n}\n"],"mappings":"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","names":["Command","OniroError","path","downloadAndInstallSdk","downloadAndInstallSdk","path","createHarmonyOsSession","createHarmonyOsSession","path","OniroError","OniroError","path","ALL_SDKS","fs","path","ALL_SDKS","Option","Option","fs","path","describeLayoutNode","describeLayoutNode","shot","os","path","detectRuntimeOs","detectRuntimeOs","Option","describeLayoutNode","Option","describeLayoutNode","os","path","fs","path","relative","text","resolve","Command","OniroError"]}
1
+ {"version":3,"sources":["../src/bin/oniro-app.ts","../src/commands/sdk.ts","../src/adapters/logger.ts","../src/adapters/progress.ts","../src/adapters/config.ts","../src/lib/runtime.ts","../src/commands/cmdtools.ts","../src/commands/emulator.ts","../src/commands/build.ts","../src/commands/sign.ts","../src/commands/auth.ts","../src/commands/app.ts","../src/commands/create.ts","../src/lib/templateRoot.ts","../src/commands/templates.ts","../src/commands/reboot.ts","../src/commands/wait.ts","../src/lib/target.ts","../src/lib/logSince.ts","../src/commands/watch.ts","../src/commands/screenshot.ts","../src/lib/screenshotImage.ts","../src/commands/dump.ts","../src/lib/layoutText.ts","../src/commands/devices.ts","../src/commands/file.ts","../src/commands/lint.ts","../src/commands/input.ts","../src/commands/logs.ts","../src/lib/logBundle.ts","../src/commands/hdc.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { OniroError } from '@oniroproject/core';\nimport { registerSdkCommand } from '../commands/sdk.js';\nimport { registerCmdToolsCommand } from '../commands/cmdtools.js';\nimport { registerEmulatorCommand } from '../commands/emulator.js';\nimport { registerBuildCommand } from '../commands/build.js';\nimport { registerSignCommand } from '../commands/sign.js';\nimport { registerAuthCommand } from '../commands/auth.js';\nimport { registerAppCommand } from '../commands/app.js';\nimport { registerCreateCommand } from '../commands/create.js';\nimport { registerTemplatesCommand } from '../commands/templates.js';\nimport { registerRebootCommand } from '../commands/reboot.js';\nimport { registerWaitCommand } from '../commands/wait.js';\nimport { registerWatchCommand } from '../commands/watch.js';\nimport { registerScreenshotCommand } from '../commands/screenshot.js';\nimport { registerDumpCommand } from '../commands/dump.js';\nimport { registerDevicesCommand } from '../commands/devices.js';\nimport { registerFileCommand } from '../commands/file.js';\nimport { registerLintCommand } from '../commands/lint.js';\nimport { registerInputCommand } from '../commands/input.js';\nimport { registerLogsCommand } from '../commands/logs.js';\nimport { registerHdcCommand } from '../commands/hdc.js';\n\ndeclare const __CLI_VERSION__: string;\nconst CLI_VERSION = __CLI_VERSION__;\n\nfunction buildProgram(): Command {\n const program = new Command()\n .name('oniro-app')\n .description(\n 'Cross-platform CLI for Oniro/OpenHarmony app development.\\n\\n' +\n 'Designed for non-interactive use (CI, scripts, agents): every command\\n' +\n 'takes explicit flags, results go to stdout, progress/logs go to stderr,\\n' +\n 'and a non-zero exit code indicates failure.',\n )\n .version(CLI_VERSION)\n .showHelpAfterError()\n // Lets `hdc` pass its arguments through untouched; global options go before the command.\n .enablePositionalOptions();\n\n registerSdkCommand(program);\n registerCmdToolsCommand(program);\n registerEmulatorCommand(program);\n registerBuildCommand(program);\n registerSignCommand(program);\n registerAuthCommand(program);\n registerAppCommand(program);\n registerCreateCommand(program);\n registerTemplatesCommand(program);\n registerRebootCommand(program);\n registerWaitCommand(program);\n registerWatchCommand(program);\n registerScreenshotCommand(program);\n registerDumpCommand(program);\n registerDevicesCommand(program);\n registerFileCommand(program);\n registerLintCommand(program);\n registerInputCommand(program);\n registerLogsCommand(program);\n registerHdcCommand(program);\n\n return program;\n}\n\nasync function main(): Promise<void> {\n const program = buildProgram();\n try {\n await program.parseAsync(process.argv);\n } catch (err) {\n const message = err instanceof OniroError ? err.message : err instanceof Error ? err.message : String(err);\n process.stderr.write(`[error] ${message}\\n`);\n if (process.env.ONIRO_DEBUG === '1' && err instanceof Error && err.stack) {\n process.stderr.write(`${err.stack}\\n`);\n }\n process.exit(1);\n }\n}\n\nvoid main();\n","import { Command } from 'commander';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport {\n ALL_SDKS,\n OHOS_DAILY_BUILDS_URL,\n downloadAndInstallSdk,\n getOsFolder,\n getSdkRootDir,\n getSupportedSdksForUi,\n installSdkFromArchive,\n removeSdk,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nconst FULL_SDK_TIP =\n 'Tip: the full SDK (with system APIs) is not on the release mirror. Download an ohos-sdk-full archive ' +\n `from the OpenHarmony daily builds, ${OHOS_DAILY_BUILDS_URL}, and install it with ` +\n '`oniro-app sdk install --from-archive <archive>`.';\n\nexport function registerSdkCommand(program: Command): void {\n const sdk = program.command('sdk').description('Manage OpenHarmony SDK installs.');\n\n sdk\n .command('install [version]')\n .description(\n 'Download and install an OpenHarmony SDK (skips if already installed), or install one from a local ' +\n 'archive with --from-archive.',\n )\n .option(\n '--from-archive <path>',\n 'Install from a local SDK .tar.gz instead of downloading, e.g. the full SDK. The API level is read ' +\n 'from the archive.',\n )\n .option('--force', 'Reinstall even if the SDK is already present.')\n .option(\n '--tmp-dir <path>',\n 'Directory for download/extract temporaries (default: ONIRO_TMP_DIR, else .oniro-tmp next to ' +\n 'the install target). Use this when that filesystem is short on space.',\n )\n .addHelpText('after', `\\n${FULL_SDK_TIP}`)\n .action(async (version: string | undefined, opts: { fromArchive?: string; force?: boolean; tmpDir?: string }) => {\n const { config, logger, progress } = getRuntime();\n if (opts.fromArchive) {\n if (version) throw new Error('Pass either a version or --from-archive, not both.');\n const archivePath = path.resolve(opts.fromArchive);\n logger.info(`Installing OpenHarmony SDK from ${archivePath}...`);\n const installed = await installSdkFromArchive({\n config,\n archivePath,\n force: opts.force,\n progress,\n logger,\n tmpDir: opts.tmpDir,\n });\n const label = installed.version ? `SDK ${installed.version} (api ${installed.api})` : `SDK api ${installed.api}`;\n logger.info(`${label} installed at ${installed.dir}.`);\n return;\n }\n if (!version) {\n throw new Error(\n `Name an SDK version (${ALL_SDKS.map((s) => s.version).join(', ')}) or pass --from-archive <path>.\\n` +\n FULL_SDK_TIP,\n );\n }\n const release = ALL_SDKS.find((s) => s.version === version);\n if (!release) {\n throw new Error(\n `Unknown SDK version \"${version}\". Known: ${ALL_SDKS.map((s) => s.version).join(', ')}`,\n );\n }\n const sdkInstallDir = path.join(getSdkRootDir(config), getOsFolder(), release.api);\n if (fs.existsSync(sdkInstallDir) && !opts.force) {\n logger.info(\n `SDK ${release.version} (api ${release.api}) already installed at ${sdkInstallDir}; pass --force to reinstall.`,\n );\n return;\n }\n logger.info(`Installing OpenHarmony SDK ${release.version} (api ${release.api})...`);\n await downloadAndInstallSdk({\n config,\n version: release.version,\n api: release.api,\n progress,\n logger,\n tmpDir: opts.tmpDir,\n });\n logger.info('SDK installed.');\n });\n\n sdk\n .command('list')\n .description('List known SDK versions and whether they are installed on this machine.')\n .option('--json', 'Emit machine-readable JSON instead of a table.')\n .action((opts: { json?: boolean }) => {\n const { config } = getRuntime();\n const sdks = getSupportedSdksForUi(config);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(sdks, null, 2)}\\n`);\n return;\n }\n const rows = sdks.map((s) => `${s.installed ? '*' : ' '} ${s.version.padEnd(8)} api ${s.api}`);\n process.stdout.write(`${rows.join('\\n')}\\n`);\n });\n\n sdk\n .command('remove <api>')\n .description('Remove an installed SDK by API level (e.g. 18, 20).')\n .action((api: string) => {\n const { config, logger } = getRuntime();\n const removed = removeSdk(config, api);\n if (!removed) {\n logger.warn(`No SDK with api ${api} found under the configured SDK root.`);\n process.exit(1);\n }\n logger.info(`Removed SDK api ${api}.`);\n });\n}\n","import type { Logger } from '@oniroproject/core';\n\n/**\n * Stderr-only logger. All diagnostic output goes to stderr so command stdout\n * stays clean for machine consumers (json results, paths, etc.).\n *\n * Debug lines are suppressed unless `ONIRO_DEBUG=1`.\n */\nexport function createCliLogger(): Logger {\n const debugEnabled = process.env.ONIRO_DEBUG === '1' || process.env.ONIRO_DEBUG === 'true';\n return {\n debug(m) {\n if (debugEnabled) process.stderr.write(`[debug] ${m}\\n`);\n },\n info(m) {\n process.stderr.write(`${m}\\n`);\n },\n warn(m) {\n process.stderr.write(`[warn] ${m}\\n`);\n },\n error(m) {\n process.stderr.write(`[error] ${m}\\n`);\n },\n };\n}\n","import type { ProgressReporter } from '@oniroproject/core';\n\n/**\n * Line-per-update progress reporter, designed for machine consumers and log scrapers.\n * Format: `[progress NN%] message` (or `[progress] message` if no percent is known).\n * Updates that don't change the percent and don't carry a message are suppressed\n * to keep output volume reasonable on chatty downloads.\n */\nexport function createCliProgress(): ProgressReporter {\n let total = 0;\n let lastEmitted = -1;\n let lastMessage = '';\n return {\n report({ message, increment }) {\n if (typeof increment === 'number') total = Math.min(100, total + increment);\n const pct = total > 0 ? Math.round(total) : null;\n const msg = message ?? lastMessage;\n // Drop redundant updates: same message, same percent.\n if (pct === lastEmitted && msg === lastMessage) return;\n const prefix = pct === null ? '[progress]' : `[progress ${pct}%]`;\n process.stderr.write(`${prefix} ${msg}\\n`);\n lastEmitted = pct ?? lastEmitted;\n if (message) lastMessage = message;\n },\n };\n}\n","import * as os from 'node:os';\nimport type { ConfigKey, ConfigProvider } from '@oniroproject/core';\n\n/**\n * Maps a core ConfigKey to its environment variable name.\n * Convention: ONIRO_<UPPER_SNAKE>.\n */\nconst ENV_VAR_BY_KEY: Record<ConfigKey, string> = {\n sdkRootDir: 'ONIRO_SDK_ROOT_DIR',\n cmdToolsPath: 'ONIRO_CMD_TOOLS_PATH',\n hdcPath: 'ONIRO_HDC',\n emulatorDir: 'ONIRO_EMULATOR_DIR',\n hapPath: 'ONIRO_HAP_PATH',\n cmdToolsUrlLinux: 'ONIRO_CMD_TOOLS_URL_LINUX',\n cmdToolsUrlWindows: 'ONIRO_CMD_TOOLS_URL_WINDOWS',\n cmdToolsUrlMac: 'ONIRO_CMD_TOOLS_URL_MAC',\n emulatorUrl: 'ONIRO_EMULATOR_URL',\n tmpDir: 'ONIRO_TMP_DIR',\n sdkUrlBase: 'ONIRO_SDK_URL_BASE',\n applicationCertPath: 'ONIRO_APPLICATION_CERT_PATH',\n harmonyosSdkPath: 'ONIRO_HARMONYOS_SDK_PATH',\n harmonyosAuthDir: 'ONIRO_HARMONYOS_AUTH_DIR',\n harmonyosSigningDir: 'ONIRO_HARMONYOS_SIGNING_DIR',\n};\n\n/**\n * Reads configuration from environment variables (ONIRO_*). Returns the fallback\n * when the variable is unset or empty. Expands `${userHome}` to the user's home\n * directory for parity with the VS Code extension's `${userHome}` expansion.\n */\nexport function createEnvConfig(env: NodeJS.ProcessEnv = process.env): ConfigProvider {\n return {\n get<T extends string | number | boolean>(key: ConfigKey, fallback: T): T {\n const envName = ENV_VAR_BY_KEY[key];\n const raw = env[envName];\n if (raw === undefined || raw === '') return fallback;\n const expanded = raw.includes('${userHome}')\n ? raw.replace(/\\$\\{userHome\\}/g, os.homedir())\n : raw;\n return expanded as unknown as T;\n },\n };\n}\n","import type { ConfigProvider, Logger, ProgressReporter } from '@oniroproject/core';\nimport { createCliLogger } from '../adapters/logger.js';\nimport { createCliProgress } from '../adapters/progress.js';\nimport { createEnvConfig } from '../adapters/config.js';\n\nexport interface CliRuntime {\n logger: Logger;\n config: ConfigProvider;\n progress: ProgressReporter;\n}\n\nlet cached: CliRuntime | null = null;\n\n/**\n * Build (and cache) the per-process runtime used by every command. Tests can\n * override the cached runtime via `setRuntime` to inject mocks.\n */\nexport function getRuntime(): CliRuntime {\n if (!cached) {\n cached = {\n logger: createCliLogger(),\n config: createEnvConfig(),\n progress: createCliProgress(),\n };\n }\n return cached;\n}\n\nexport function setRuntime(runtime: CliRuntime | null): void {\n cached = runtime;\n}\n","import { Command } from 'commander';\nimport { getCmdToolsStatus, installCmdTools, isCmdToolsInstalled, removeCmdTools } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerCmdToolsCommand(program: Command): void {\n const cmdtools = program.command('cmdtools').description('Manage OpenHarmony command-line tools.');\n\n cmdtools\n .command('install')\n .description('Install the OpenHarmony command-line tools (hvigorw, ohpm, hdc). Skips if already installed.')\n .option('--from-zip <path>', 'Install from a local ZIP instead of downloading.')\n .option('--force', 'Reinstall even if the tools are already present.')\n .option(\n '--tmp-dir <path>',\n 'Directory for download/extract temporaries (default: ONIRO_TMP_DIR, else .oniro-tmp next to ' +\n 'the install target). Use this when that filesystem is short on space.',\n )\n .action(async (opts: { fromZip?: string; force?: boolean; tmpDir?: string }) => {\n const { config, logger, progress } = getRuntime();\n if (isCmdToolsInstalled(config) && !opts.force) {\n logger.info('Command-line tools already installed; pass --force to reinstall.');\n return;\n }\n logger.info('Installing OpenHarmony command-line tools...');\n await installCmdTools({ config, progress, logger, localZipPath: opts.fromZip, tmpDir: opts.tmpDir });\n logger.info('Command-line tools installed.');\n });\n\n cmdtools\n .command('status')\n .description(\n 'Report whether the command-line tools are installed, their version and flavour (HarmonyOS or ' +\n 'OpenHarmony), and the hdc binary every device command uses.',\n )\n .option('--json', 'Emit machine-readable JSON.')\n .action((opts: { json?: boolean }) => {\n const { config } = getRuntime();\n const status = getCmdToolsStatus(config);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(status, null, 2)}\\n`);\n return;\n }\n process.stdout.write(`${status.status}\\n`);\n process.stdout.write(`path: ${status.path}\\n`);\n if (status.flavour) process.stdout.write(`flavour: ${status.flavour}\\n`);\n process.stdout.write(`hdc: ${status.hdc.path}${status.hdc.exists ? '' : ' (missing)'}\\n`);\n if (!status.installed) process.exit(1);\n });\n\n cmdtools\n .command('remove')\n .description('Delete the configured command-line tools directory.')\n .action(() => {\n const { config, logger } = getRuntime();\n removeCmdTools(config);\n logger.info('Command-line tools removed.');\n });\n}\n","import { Command } from 'commander';\nimport {\n attemptHdcConnection,\n getEmulatorStatus,\n installEmulator,\n isEmulatorInstalled,\n removeEmulator,\n startEmulator,\n stopEmulator,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerEmulatorCommand(program: Command): void {\n const emu = program.command('emulator').description('Manage the Oniro emulator.');\n\n emu\n .command('install')\n .description('Download and install the Oniro emulator (QEMU-based). Skips if already installed.')\n .option('--force', 'Reinstall even if the emulator is already present.')\n .option(\n '--tmp-dir <path>',\n 'Directory for the downloaded ZIP (default: ONIRO_TMP_DIR, else .oniro-tmp next to the ' +\n 'install target). Use this when that filesystem is short on space.',\n )\n .action(async (opts: { force?: boolean; tmpDir?: string }) => {\n const { config, logger, progress } = getRuntime();\n if (isEmulatorInstalled(config) && !opts.force) {\n logger.info('Emulator already installed; pass --force to reinstall.');\n return;\n }\n logger.info('Installing Oniro emulator...');\n await installEmulator({ config, progress, logger, tmpDir: opts.tmpDir });\n logger.info('Emulator installed.');\n });\n\n emu\n .command('start')\n .description('Start the Oniro emulator via the bundled launcher (run.sh / run.bat). Detaches so the CLI can exit while the emulator keeps running.')\n .option('--headless', 'Launch headless (VNC + telnet serial, no local window). Required in CI.')\n .option('--log <path>', 'Redirect launcher stdout/stderr to this file. Defaults to discarding output.')\n .option('--wait-for-hdc <seconds>', 'Wait up to N seconds for hdc to connect. 0 = do not wait.', (v) => parseInt(v, 10), 0)\n .option('--connect <host:port>', 'Override the launcher\\'s hdc port-forward bind address. Pass 0.0.0.0:55555 on hosts where QEMU refuses to bind 127.0.0.1 (some CI runners).')\n .action(async (opts: { headless?: boolean; log?: string; waitForHdc: number; connect?: string }) => {\n const { config, logger } = getRuntime();\n await startEmulator({\n config,\n logger,\n headless: opts.headless === true,\n logFile: opts.log,\n waitForHdcSeconds: opts.waitForHdc,\n connect: opts.connect,\n });\n logger.info('Emulator start command complete.');\n });\n\n emu\n .command('status')\n .description(\n 'Report whether the Oniro emulator is installed, running, and connected to hdc, without starting it. ' +\n 'Exits 1 when it is not installed.',\n )\n .option('--address <addr>', 'hdc address the emulator listens on', '127.0.0.1:55555')\n .option('--json', 'Emit machine-readable JSON.')\n .action(async (opts: { address: string; json?: boolean }) => {\n const { config, logger } = getRuntime();\n const status = await getEmulatorStatus(config, { address: opts.address, logger });\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(status, null, 2)}\\n`);\n } else {\n process.stdout.write(\n `installed: ${status.installed ? 'yes' : 'no'} (${status.dir})\\n` +\n `running: ${status.running ? 'yes' : 'no'}\\n` +\n `connected: ${status.connected ? 'yes' : 'no'} (${status.address})\\n`,\n );\n }\n if (!status.installed) process.exitCode = 1;\n });\n\n emu\n .command('stop')\n .description('Kill running emulator processes.')\n .action(async () => {\n const { logger } = getRuntime();\n await stopEmulator(logger);\n logger.info('Emulator stopped.');\n });\n\n emu\n .command('connect')\n .description('Attempt to connect hdc to the emulator.')\n .option('--address <addr>', 'hdc address to connect to', '127.0.0.1:55555')\n .action(async (opts: { address: string }) => {\n const { config, logger } = getRuntime();\n const ok = await attemptHdcConnection(config, opts.address, logger);\n if (!ok) {\n logger.error(`Could not connect hdc to ${opts.address}.`);\n process.exit(1);\n }\n logger.info(`hdc connected to ${opts.address}.`);\n });\n\n emu\n .command('remove')\n .description('Delete the configured emulator directory.')\n .action(() => {\n const { config, logger } = getRuntime();\n removeEmulator(config);\n logger.info('Emulator removed.');\n });\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport { SdkNotInstalledError, buildHap, downloadAndInstallSdk } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\ninterface BuildOpts {\n product: string;\n module?: string;\n mode?: string;\n task: string;\n deps: boolean;\n parallel: boolean;\n installSdk?: boolean;\n json?: boolean;\n}\n\nexport function registerBuildCommand(program: Command): void {\n program\n .command('build [project-dir]')\n .description(\n 'Build an OpenHarmony or HarmonyOS app via hvigorw. Defaults to the current directory. ' +\n 'Projects declaring runtimeOS \"HarmonyOS\" build against the HarmonyOS SDK (ONIRO_HARMONYOS_SDK_PATH or an installed DevEco Studio). ' +\n 'An OpenHarmony project fails early, naming the release to install, when the SDK for its compileSdkVersion is missing.',\n )\n .option('--product <product>', 'hvigor product name', 'default')\n .option('--module <module>', 'restrict the build to a specific module')\n .option('--mode <mode>', 'hvigor build mode (e.g. release, debug)')\n .option('--task <task>', 'hvigor task to run', 'assembleHap')\n .option('--no-deps', 'skip the automatic `ohpm install --all` when oh_modules/ is missing')\n .option('--no-parallel', 'build modules serially (default: parallel)')\n .option('--install-sdk', 'install the OpenHarmony SDK the project compiles against when it is missing, then build')\n .option('--json', 'emit the build result (discovered HAPs, warnings) as JSON')\n .action(async (projectDir: string | undefined, opts: BuildOpts) => {\n const { config, logger, progress } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n logger.info(`Building project at ${dir}...`);\n const build = () =>\n buildHap({\n config,\n projectDir: dir,\n product: opts.product,\n module: opts.module,\n mode: opts.mode,\n task: opts.task,\n autoInstallDeps: opts.deps,\n parallel: opts.parallel,\n logger,\n // The logger already echoes spawn output; this hook is for streaming to other UIs.\n onOutput: () => {},\n });\n let result;\n try {\n result = await build();\n } catch (err) {\n if (!(err instanceof SdkNotInstalledError && err.version && opts.installSdk)) throw err;\n logger.info(`Installing OpenHarmony SDK ${err.version} (api ${err.api}), which the project compiles against...`);\n await downloadAndInstallSdk({ config, version: err.version, api: err.api, progress, logger });\n result = await build();\n }\n for (const w of result.warnings) logger.warn(w);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n }\n logger.info('Build complete.');\n });\n}\n","import { Command, Option } from 'commander';\nimport * as path from 'node:path';\nimport {\n APL_VALUES,\n APP_FEATURE_VALUES,\n OniroError,\n createHarmonyOsSession,\n detectRuntimeOs,\n generateSigningConfigs,\n harmonyOsAutoSign,\n harmonyOsSignHap,\n signOpenHarmonyHap,\n prepareSigning,\n getOhosBaseSdkHome,\n type Apl,\n type AppFeature,\n type SigningPasswords,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nfunction parseAclsList(value: string): string[] {\n return value\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n}\n\nexport function registerSignCommand(program: Command): void {\n program\n .command('sign [project-dir]')\n .description(\n [\n 'Generate signing keys, certificates, and signingConfigs for an OpenHarmony project.',\n 'Requires java on PATH. The generated profile uses the SDK\\'s built-in development',\n 'cert (issuer=pki_internal) and its bundled validity window — dev/local builds only.',\n 'Overwrites the `signingConfigs` block in build-profile.json5 (other keys preserved).',\n 'HarmonyOS projects need --harmonyos instead, which has AppGallery Connect issue the',\n 'certificate and profile for a signed-in Huawei account (`oniro-app auth login`).',\n 'With --hap <file>, signs a prebuilt HAP instead of a project (with --harmonyos, for HarmonyOS).',\n ].join(' '),\n )\n .addOption(\n new Option(\n '--apl <level>',\n 'Ability Privilege Level written into the profile. Apps that request permissions above `normal` (e.g. ohos.permission.GET_WIFI_INFO_INTERNAL) need system_basic or system_core, which also switches the HAP-signing key to \"OpenHarmony Application Release\".',\n )\n .choices([...APL_VALUES])\n .default('normal'),\n )\n .addOption(\n new Option(\n '--app-feature <feature>',\n 'App feature written into the profile. Defaults: hos_normal_app for apl=normal; hos_system_app for apl=system_basic/system_core.',\n ).choices([...APP_FEATURE_VALUES]),\n )\n .addOption(\n new Option(\n '--acls <list>',\n 'Comma-separated permission names to write into the profile\\'s acls.allowed-acls. Required for apps that request permissions above their apl (e.g. a system_basic app requesting ohos.permission.CAPTURE_SCREEN). Example: --acls ohos.permission.REBOOT,ohos.permission.INJECT_INPUT_EVENT',\n ).argParser(parseAclsList),\n )\n .addOption(\n new Option(\n '--app-privilege-capabilities <list>',\n 'Comma-separated privileges to write into the profile\\'s app-privilege-capabilities. An app that declares a privileged extension ability (e.g. an AccessibilityExtensionAbility) needs AllowAppUsePrivilegeExtension, else install fails with 9568344 \"not allow use privilege extension\". Others include AllowAppMultiProcess and AllowAppDesktopIconHide.',\n ).argParser(parseAclsList),\n )\n .option(\n '--harmonyos',\n 'Sign a HarmonyOS project through AppGallery Connect. Needs `oniro-app auth login`, and a device registered to the team: a connected device is registered if it reports a UDID (`hdc shell bm get -u`).',\n )\n .option(\n '--hap <file>',\n 'Sign this prebuilt .hap (unsigned, or signed with other material) instead of a project, and write a signed copy (see --out). The bundle name is read from the HAP. For OpenHarmony, --apl, --app-feature, --acls and --app-privilege-capabilities apply as for a project; with --harmonyos, the ACL permissions are read from the HAP too.',\n )\n .option(\n '--out <file>',\n 'With --hap: where to write the signed HAP. Default: next to the input, `<name>-unsigned.hap` → `<name>-signed.hap`, `<name>.hap` → `<name>-signed.hap`, `<name>-signed.hap` → `<name>-resigned.hap`. Name the input itself to re-sign it in place.',\n )\n .option('--team-id <id>', 'With --harmonyos: the AGC team to sign under. Default: the account\\'s own (`oniro-app auth team list`).')\n .option('--product <name>', 'With --harmonyos: the product to sign. Default `default`.')\n .option('--force', 'With --harmonyos: regenerate the certificate and profile even when they are still valid.')\n .option('--bootstrap', 'No-op if signing material is already present; otherwise generate it.')\n .option('--store-password <pwd>', 'Keystore store password (default 123456 — the SDK keystore password).')\n .option('--key-password <pwd>', 'Keystore key password (default 123456 — the SDK keystore password).')\n .action(\n async (\n projectDir: string | undefined,\n opts: {\n apl: Apl;\n appFeature?: AppFeature;\n acls?: string[];\n appPrivilegeCapabilities?: string[];\n bootstrap?: boolean;\n storePassword?: string;\n keyPassword?: string;\n harmonyos?: boolean;\n teamId?: string;\n product?: string;\n force?: boolean;\n hap?: string;\n out?: string;\n },\n ) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n const passwords: SigningPasswords | undefined =\n opts.storePassword || opts.keyPassword\n ? { store: opts.storePassword ?? '123456', key: opts.keyPassword ?? '123456' }\n : undefined;\n\n if (opts.out && !opts.hap) throw new OniroError('--out names where `--hap` writes the signed HAP; pass --hap too.');\n if (opts.hap) {\n if (projectDir) throw new OniroError('Pass either a project directory or --hap, not both.');\n if (opts.product || opts.bootstrap) {\n throw new OniroError(`--${opts.product ? 'product' : 'bootstrap'} applies to a project, not to --hap.`);\n }\n // Each signing path honours only its own flags; say so rather than drop one.\n const ignored = opts.harmonyos\n ? [\n opts.apl !== 'normal' && '--apl',\n opts.appFeature && '--app-feature',\n opts.acls && '--acls (the ACLs are read from the HAP)',\n opts.appPrivilegeCapabilities && '--app-privilege-capabilities',\n (opts.storePassword || opts.keyPassword) && '--store-password/--key-password',\n ]\n : [opts.teamId && '--team-id', opts.force && '--force'];\n const unsupported = ignored.filter((flag): flag is string => typeof flag === 'string');\n if (unsupported.length > 0) {\n throw new OniroError(\n `${unsupported.join(', ')} ${unsupported.length > 1 ? 'do' : 'does'} not apply to ${opts.harmonyos ? '--harmonyos --hap' : '--hap without --harmonyos'}.`,\n );\n }\n if (!opts.harmonyos) {\n const result = await signOpenHarmonyHap({\n hapPath: opts.hap,\n outPath: opts.out,\n sdkHome: getOhosBaseSdkHome(config),\n apl: opts.apl,\n appFeature: opts.appFeature,\n acls: opts.acls,\n appPrivilegeCapabilities: opts.appPrivilegeCapabilities,\n passwords,\n applicationCertPath: config.get('applicationCertPath', '') || undefined,\n logger,\n });\n logger.info(`Signed ${result.bundleName} into ${result.outPath}.`);\n return;\n }\n const result = await harmonyOsSignHap({\n config,\n session: createHarmonyOsSession({ config, logger }),\n hapPath: opts.hap,\n outPath: opts.out,\n teamId: opts.teamId,\n force: opts.force,\n logger,\n });\n logger.info(`Signed ${result.bundleName} into ${result.outPath} (profile names ${result.deviceIds.length} device(s)).`);\n return;\n }\n\n if (opts.harmonyos) {\n const result = await harmonyOsAutoSign({\n config,\n session: createHarmonyOsSession({ config, logger }),\n projectDir: dir,\n productName: opts.product,\n teamId: opts.teamId,\n force: opts.force,\n logger,\n });\n logger.info(`Signing configs ready for ${result.bundleName} (profile names ${result.deviceIds.length} device(s)).`);\n return;\n }\n // The OpenHarmony development certificate cannot sign for a HarmonyOS device.\n if (detectRuntimeOs(dir, opts.product) === 'HarmonyOS') {\n throw new OniroError(\n `${dir} targets HarmonyOS, which needs a certificate from AppGallery Connect: run \\`oniro-app auth login\\` once, then \\`oniro-app sign --harmonyos\\`.`,\n );\n }\n\n if (opts.bootstrap) {\n const result = prepareSigning({\n config,\n projectDir: dir,\n apl: opts.apl,\n appFeature: opts.appFeature,\n acls: opts.acls,\n appPrivilegeCapabilities: opts.appPrivilegeCapabilities,\n passwords,\n logger,\n });\n logger.info(result.source === 'present' ? 'Signing material already present.' : 'Signing configs generated.');\n return;\n }\n\n const sdkHome = getOhosBaseSdkHome(config);\n logger.info(`Generating signing configs in ${dir} using SDK at ${sdkHome}...`);\n generateSigningConfigs({\n projectDir: dir,\n sdkHome,\n apl: opts.apl,\n appFeature: opts.appFeature,\n acls: opts.acls,\n appPrivilegeCapabilities: opts.appPrivilegeCapabilities,\n passwords,\n logger,\n });\n logger.info('Signing configs generated.');\n },\n );\n}\n","import { Command } from 'commander';\nimport { HUAWEI_SITES, createHarmonyOsSession, type HarmonyOsSession } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\n/** A session bound to the CLI runtime. The sign-in URL goes to stderr for headless hosts. */\nfunction session(): HarmonyOsSession {\n const { config, logger } = getRuntime();\n return createHarmonyOsSession({\n config,\n logger,\n onLoginUrl: (url) => process.stderr.write(`Opening the Huawei sign-in page. If no browser opens, visit:\\n ${url}\\n`),\n });\n}\n\nexport function registerAuthCommand(program: Command): void {\n const auth = program\n .command('auth')\n .description(\n 'Sign in to a Huawei developer account, which HarmonyOS signing (`oniro-app sign --harmonyos`) needs. ' +\n 'OpenHarmony signing needs no account. The token is stored encrypted under ONIRO_HARMONYOS_AUTH_DIR ' +\n '(default ~/.oniro/harmonyos).',\n );\n\n auth\n .command('login')\n .description('Sign in through the browser, which redirects back to a loopback port on this machine.')\n .option('--timeout <seconds>', 'How long to wait for the browser sign-in. Default 600.', (v) => Number(v))\n .action(async (opts: { timeout?: number }) => {\n const user = await session().login(opts.timeout ? { timeoutMs: Math.max(1, opts.timeout) * 1000 } : undefined);\n process.stdout.write(`${user.userName || user.userId}\\n`);\n });\n\n auth\n .command('logout')\n .description('Sign out and delete the stored token.')\n .action(async () => {\n const signedOut = await session().logout();\n getRuntime().logger.info(signedOut ? 'Signed out.' : 'Not signed in; nothing to do.');\n });\n\n auth\n .command('status')\n .description('Show the signed-in account. Exits non-zero when not signed in.')\n .option('--json', 'Emit the account details as JSON.')\n .action(async (opts: { json?: boolean }) => {\n const s = session();\n // Refreshed: a stale access token makes the agreement check fail.\n const user = await s.getUserInfo({ refresh: true });\n if (!user) {\n process.stderr.write('Not signed in. Run `oniro-app auth login`.\\n');\n process.exitCode = 1;\n return;\n }\n // Without real-name verification, the developer agreement is what allows signing.\n const agreement = user.isRealName ? null : await s.getDeveloperAgreement(user);\n if (opts.json) {\n const { userId, userName, countryCode, siteCode, isRealName } = user;\n const agcBaseUrl = HUAWEI_SITES[siteCode].agcBaseUrl;\n const status = { userId, userName, countryCode, site: siteCode, agcBaseUrl, isRealName, developerAgreement: agreement, tokenPath: s.tokenPath };\n process.stdout.write(`${JSON.stringify(status, null, 2)}\\n`);\n return;\n }\n process.stdout.write(`${user.userName || user.userId} (${user.userId}) [${user.siteCode}]\\n`);\n if (agreement && !(agreement.signed && agreement.latest)) {\n process.stderr.write(\n '[warn] This account has neither real-name verification nor the current HUAWEI Developer Basic Service Agreement accepted, so AppGallery Connect will not issue signing material. Accept the agreement in AppGallery Connect or DevEco Studio.\\n',\n );\n }\n });\n\n auth\n .command('team')\n .description('AGC teams this account belongs to.')\n .command('list')\n .description('List the AGC teams this account belongs to, for `oniro-app sign --harmonyos --team-id <id>`.')\n .option('--json', 'Emit the team list as JSON.')\n .action(async (opts: { json?: boolean }) => {\n const teams = await session().listTeams();\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(teams, null, 2)}\\n`);\n return;\n }\n for (const t of teams) process.stdout.write(`${t.id}\\t${t.name}\\n`);\n });\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport {\n installApp,\n launchApp,\n uninstallApp,\n forceStop,\n applyChanges,\n existingHapOrUnsigned,\n getBundleName,\n readHapBundleName,\n OniroError,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\ninterface ApplyOpts {\n bundle?: string;\n module?: string;\n hap?: string;\n installedHap?: string;\n system?: boolean;\n allowUninstall?: boolean;\n device?: string;\n json?: boolean;\n}\n\nexport function registerAppCommand(program: Command): void {\n const app = program.command('app').description('Install, launch, and manage built apps on a connected device/emulator.');\n\n app\n .command('install [project-dir-or-hap]')\n .description(\n 'Install a built .hap on the connected device/emulator via hdc. Takes a project dir (default: the ' +\n 'current one), whose newest signed HAP is installed, else its unsigned one, or a .hap file. Fails ' +\n 'when the bundle manager rejects the HAP, and says how to sign when a target refuses an unsigned one.',\n )\n .option('--hap <path>', 'Override the .hap path (relative to project-dir or absolute).')\n .option('--device <serial>', 'Target device serial.')\n .action(async (target: string | undefined, opts: { hap?: string; device?: string }) => {\n const { config, logger } = getRuntime();\n const isHap = target !== undefined && /\\.hap$/i.test(target);\n const dir = isHap ? process.cwd() : path.resolve(target ?? process.cwd());\n const hapPath = isHap ? path.resolve(target) : opts.hap;\n logger.info(`Installing ${hapPath ?? `app from ${dir}`}...`);\n const result = await installApp({ config, projectDir: dir, hapPath, deviceSerial: opts.device, logger });\n logger.info(`Installed ${result.hapPath}.`);\n });\n\n app\n .command('launch [project-dir]')\n .description(\n 'Launch an app on the connected device/emulator. Project mode (default): resolves ' +\n 'bundle + main ability from the project. Bundle mode (--bundle): launch an ' +\n 'already-installed app by bundle name, no project needed.',\n )\n .option('--bundle <bundle>', 'Launch an already-installed app by bundle name (no project needed).')\n .option('--module <module>', 'Module folder name (project mode).', 'entry')\n .option('--ability <name>', 'Explicit ability to launch (defaults to the module mainElement in project mode, or the installed bundle main ability in --bundle mode).')\n .option('--device <serial>', 'Target device serial.')\n .action(async (projectDir: string | undefined, opts: { bundle?: string; module: string; ability?: string; device?: string }) => {\n const { config, logger } = getRuntime();\n if (opts.bundle) {\n logger.info(`Launching installed bundle ${opts.bundle}...`);\n await launchApp({ config, bundleName: opts.bundle, abilityName: opts.ability, deviceSerial: opts.device, logger });\n } else {\n const dir = path.resolve(projectDir ?? process.cwd());\n logger.info(`Launching app from ${dir}...`);\n await launchApp({ config, projectDir: dir, moduleName: opts.module, abilityName: opts.ability, deviceSerial: opts.device, logger });\n }\n logger.info('App launched.');\n });\n\n app\n .command('apply [project-dir-or-hap]')\n .description(\n 'Install a HAP (a project dir, default the current one, or a .hap file) and verify the running process ' +\n 'took the change. Refuses a HAP of another bundle. Handles sign-info mismatch, asset-cache invalidation, ' +\n 'and persistent-bundle restart.',\n )\n .option(\n '--bundle <bundle>',\n 'Bundle name to apply changes to. Defaults to the bundleName in the .hap file, else in the project AppScope/app.json5.',\n )\n .option('--module <module>', 'Module to resolve the HAP from (multi-module projects).')\n .option('--hap <path>', 'Explicit .hap path (relative to project-dir or absolute).')\n .option('--installed-hap <path>', 'Local path to the currently-installed HAP, to enable the asset-cache reboot.')\n .option('--system', 'Treat as a persistent/system bundle (refuses uninstall on sign-info mismatch).')\n .option('--allow-uninstall', 'Permit uninstalling a system bundle on sign-info mismatch (dangerous).')\n .option('--device <serial>', 'Target device serial.')\n .option('--json', 'Emit the result as JSON.')\n .action(async (target: string | undefined, opts: ApplyOpts) => {\n const { config, logger } = getRuntime();\n const isHap = target !== undefined && /\\.hap$/i.test(target);\n if (isHap && opts.hap) throw new OniroError('Pass the HAP either as the argument or with --hap, not both.');\n const dir = isHap ? process.cwd() : path.resolve(target ?? process.cwd());\n const hapPath = isHap ? path.resolve(target) : opts.hap;\n let bundle = opts.bundle;\n if (!bundle && isHap) {\n // The same signed-to-unsigned fallback applyChanges applies when it installs.\n const hap = existingHapOrUnsigned(hapPath!);\n if (!hap) throw new OniroError(`HAP not found at ${hapPath}.`);\n bundle = (await readHapBundleName(hap.path).catch(() => null)) ?? undefined;\n if (!bundle) throw new OniroError(`Could not read the bundle name from ${hap.path}. Pass --bundle.`);\n }\n bundle ??= getBundleName(dir);\n const result = await applyChanges({\n config,\n bundle,\n hapPath,\n projectDir: dir,\n module: opts.module,\n installedHapPath: opts.installedHap,\n isSystemBundle: opts.system,\n allowUninstall: opts.allowUninstall,\n deviceSerial: opts.device,\n logger,\n });\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } else {\n logger.info(\n `apply: method=${result.method} pid ${result.preInstallPid ?? '-'} -> ${result.postInstallPid ?? '-'}` +\n `${result.cacheCleared ? ' (cache cleared)' : ''}`,\n );\n }\n });\n\n app\n .command('uninstall <bundle>')\n .description('Uninstall an app by bundle name.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (bundle: string, opts: { device?: string }) => {\n const { config, logger } = getRuntime();\n await uninstallApp({ config, bundle, deviceSerial: opts.device, logger });\n logger.info(`Uninstalled ${bundle}.`);\n });\n\n app\n .command('stop <bundle>')\n .description('Force-stop an app by bundle name.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (bundle: string, opts: { device?: string }) => {\n const { config, logger } = getRuntime();\n await forceStop({ config, bundle, deviceSerial: opts.device, logger });\n logger.info(`Stopped ${bundle}.`);\n });\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport {\n ALL_SDKS,\n createScaffold,\n isValidBundleName,\n isValidProjectName,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport { getBundledTemplateRoot } from '../lib/templateRoot.js';\n\ninterface CreateOpts {\n name: string;\n bundle: string;\n location: string;\n sdk: string;\n template: string;\n module?: string;\n overwrite?: boolean;\n}\n\nexport function registerCreateCommand(program: Command): void {\n program\n .command('create')\n .description('Scaffold a new Oniro/OpenHarmony or HarmonyOS app from a template. All flags are required (non-interactive).')\n .requiredOption('--name <name>', 'Project folder name (letters, digits, ._- only)')\n .requiredOption('--bundle <bundleName>', 'Bundle name in reverse-DNS form, e.g. com.example.myapp')\n .requiredOption('--location <dir>', 'Parent directory where the new project folder will be created')\n .requiredOption('--sdk <api>', 'Target SDK API level (e.g. 18, 20)')\n .option('--template <id>', 'Template id', 'EmptyAbility')\n .option('--module <name>', 'Module folder name (defaults to the template default, usually `entry`)')\n .option('--overwrite', 'Replace the destination if it already exists')\n .action(async (opts: CreateOpts) => {\n const { config, logger } = getRuntime();\n\n if (!isValidProjectName(opts.name)) {\n throw new Error(`Invalid --name '${opts.name}'. Use letters/numbers/._- and no slashes.`);\n }\n if (!isValidBundleName(opts.bundle)) {\n throw new Error(`Invalid --bundle '${opts.bundle}'. Example: com.example.myapp`);\n }\n const sdkApi = Number(opts.sdk);\n if (!Number.isFinite(sdkApi)) {\n throw new Error(`--sdk must be a numeric api level. Known: ${ALL_SDKS.map((s) => s.api).join(', ')}`);\n }\n\n const templateRoot = getBundledTemplateRoot();\n const result = await createScaffold({\n config,\n templateId: opts.template,\n projectName: opts.name,\n bundleName: opts.bundle,\n location: path.resolve(opts.location),\n sdkApi,\n moduleName: opts.module,\n templateRoot,\n overwrite: opts.overwrite,\n logger,\n });\n\n logger.info(`Project created at ${result.projectDir}`);\n process.stdout.write(`${result.projectDir}\\n`);\n });\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * Resolve the bundled `templates/` directory shipped inside this CLI package.\n *\n * The CLI's `dist/oniro-app.js` lives at `<pkg>/dist/oniro-app.js` after build\n * and the templates ship at `<pkg>/templates/`. During development the entrypoint\n * lives at `<pkg>/src/bin/oniro-app.ts` so we also try `../../templates` from there.\n */\nexport function getBundledTemplateRoot(): string {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(here, '../templates'), // dist/oniro-app.js → ../templates\n path.resolve(here, '../../templates'), // src/bin/oniro-app.ts → ../../templates\n ];\n for (const c of candidates) {\n if (fs.existsSync(c)) return c;\n }\n // Return the most likely path even if it doesn't exist yet; createScaffold will\n // surface a clear error from there.\n return candidates[0]!;\n}\n","import { Command } from 'commander';\nimport { listTemplates } from '@oniroproject/core';\nimport { getBundledTemplateRoot } from '../lib/templateRoot.js';\n\nexport function registerTemplatesCommand(program: Command): void {\n const templates = program.command('templates').description('Inspect the templates bundled with this CLI.');\n\n templates\n .command('list')\n .description('List available project templates.')\n .option('--json', 'Emit machine-readable JSON.')\n .action((opts: { json?: boolean }) => {\n const root = getBundledTemplateRoot();\n const list = listTemplates(root);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(list, null, 2)}\\n`);\n return;\n }\n if (list.length === 0) {\n process.stdout.write('No templates available.\\n');\n return;\n }\n const rows = list.map((t) => `${t.id.padEnd(20)} ${t.label.padEnd(24)} ${t.description}`);\n process.stdout.write(`${rows.join('\\n')}\\n`);\n });\n}\n","import { Command, Option } from 'commander';\nimport { reboot } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerRebootCommand(program: Command): void {\n program\n .command('reboot')\n .description('Reboot the connected device/emulator.')\n .addOption(\n new Option('--mode <mode>', 'Reboot target.').choices(['system', 'bootloader', 'recovery']).default('system'),\n )\n .option('--wait-bundle <bundle>', 'After a system reboot, wait until this bundle is running again.')\n .option('--timeout <ms>', 'Max time to wait for the bundle, ms.', '180000')\n .option('--device <serial>', 'Target device serial.')\n .action(\n async (opts: {\n mode: 'system' | 'bootloader' | 'recovery';\n waitBundle?: string;\n timeout: string;\n device?: string;\n }) => {\n const { config, logger } = getRuntime();\n logger.info(`Rebooting device (${opts.mode})...`);\n await reboot({\n config,\n mode: opts.mode,\n waitForBundle: opts.waitBundle,\n timeoutMs: Number(opts.timeout),\n deviceSerial: opts.device,\n logger,\n });\n logger.info('Reboot complete.');\n },\n );\n}\n","import { Command } from 'commander';\nimport { waitForLog, waitForBoot, waitForBundle, waitForTarget, describeLayoutNode } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport { addTargetOptions, selectorFrom, type TargetOpts } from '../lib/target.js';\nimport { parseSince } from '../lib/logSince.js';\n\ninterface WaitOpts extends TargetOpts {\n log?: string;\n since?: string;\n boot?: boolean;\n bundle?: string;\n pidOf?: string;\n domain?: string;\n gone?: boolean;\n interval: string;\n timeout: string;\n device?: string;\n json?: boolean;\n}\n\nexport function registerWaitCommand(program: Command): void {\n const wait = program\n .command('wait')\n .description(\n 'Wait for a device condition: a log line (--log), boot (--boot), a bundle to start (--bundle), ' +\n 'or an on-screen element (--target / --target-id / --target-type).',\n )\n .option('--log <pattern>', 'Resolve when a hilog line (tag: message) logged after the command starts matches this regex.')\n .option(\n '--since <seconds>',\n 'With --log: also match lines logged up to N seconds before the command started, ' +\n 'measured on the device clock; \"all\" matches everything still in the device log buffer.',\n )\n .option('--boot', 'Resolve when the device is reachable (optionally also --pid-of).')\n .option('--bundle <bundle>', 'With --log: filter to this bundle. Alone: wait until this bundle is running.')\n .option('--pid-of <name>', 'With --boot: also require this process to have a pid.')\n .option('--domain <domain>', 'With --log: hilog domain filter (e.g. 0xD003900).');\n addTargetOptions(wait, 'Resolve when', { index: false });\n wait\n .option('--gone', 'With --target*: resolve when no uncovered element matches any more.')\n .option('--interval <ms>', 'With --target*: poll interval, ms (each poll is a layout dump).', '500')\n .option('--timeout <ms>', 'Max wait, ms.', '30000')\n .option('--device <serial>', 'Target device serial.')\n .option('--json', 'With --log or --target*: emit the matched entry/element as JSON.')\n .action(async (opts: WaitOpts) => {\n const { config, logger } = getRuntime();\n const timeoutMs = Number(opts.timeout);\n const selector = selectorFrom(opts);\n if (opts.since !== undefined && !opts.log) throw new Error('--since applies only to --log.');\n\n if (opts.log) {\n const entry = await waitForLog({\n config,\n pattern: new RegExp(opts.log),\n timeoutMs,\n bundle: opts.bundle,\n domain: opts.domain,\n deviceSerial: opts.device,\n lookbackMs: parseSince(opts.since),\n logger,\n });\n if (opts.json) process.stdout.write(`${JSON.stringify(entry, null, 2)}\\n`);\n else logger.info(`matched: ${entry.time} ${entry.tag}: ${entry.message}`);\n return;\n }\n if (opts.boot) {\n await waitForBoot({ config, untilPidOf: opts.pidOf, timeoutMs, deviceSerial: opts.device, logger });\n logger.info('Device booted.');\n return;\n }\n if (selector) {\n const node = await waitForTarget({\n config,\n selector,\n gone: opts.gone,\n timeoutMs,\n pollMs: Number(opts.interval) || 500,\n deviceSerial: opts.device,\n logger,\n });\n if (!node) {\n logger.info('Element is gone.');\n return;\n }\n if (opts.json) process.stdout.write(`${JSON.stringify(node, null, 2)}\\n`);\n else logger.info(`found: ${describeLayoutNode(node)}`);\n return;\n }\n if (opts.bundle) {\n await waitForBundle({ config, bundle: opts.bundle, timeoutMs, deviceSerial: opts.device, logger });\n logger.info(`Bundle ${opts.bundle} is running.`);\n return;\n }\n throw new Error('Specify one of --log <pattern>, --boot, --bundle <bundle>, or --target <text> (or --target-id / --target-type).');\n });\n}\n","import type { Command } from 'commander';\nimport type { LayoutSelector } from '@oniroproject/core';\n\n/** The shared element-selector flags, as commander parses them. */\nexport interface TargetOpts {\n target?: string;\n targetId?: string;\n targetType?: string;\n targetIndex?: string;\n}\n\n/**\n * Add the element-selector flags shared by `input`, `wait`, and `screenshot`.\n * `verb` completes the `--target` help text (e.g. \"Tap\" → \"Tap the element …\").\n */\nexport function addTargetOptions(cmd: Command, verb: string, opts: { index?: boolean } = {}): Command {\n cmd\n .option(\n '--target <text>',\n `${verb} the element whose text, description, or placeholder matches ` +\n '(case-insensitive; exact matches win, else substring). Covered elements are skipped.',\n )\n .option('--target-id <id>', 'Match the element by its id or key.')\n .option('--target-type <type>', 'Restrict the match to a component type (e.g. Button, TextInput).');\n if (opts.index !== false) {\n cmd.option('--target-index <n>', 'Pick the n-th (0-based) of several matching elements.');\n }\n return cmd;\n}\n\n/** The selector built from the flags, or undefined when none was given. */\nexport function selectorFrom(opts: TargetOpts): LayoutSelector | undefined {\n if (opts.target === undefined && opts.targetId === undefined && opts.targetType === undefined) return undefined;\n return { text: opts.target, id: opts.targetId, type: opts.targetType };\n}\n\nexport function targetIndexFrom(opts: TargetOpts): number | undefined {\n if (opts.targetIndex === undefined) return undefined;\n const n = Number(opts.targetIndex);\n if (!Number.isInteger(n) || n < 0) throw new Error(`--target-index must be a non-negative integer; got ${opts.targetIndex}.`);\n return n;\n}\n","/**\n * Parse a `--since` value for `wait --log` and `watch`: how many seconds before\n * the command started a log line may be from and still count, or `all` for\n * everything still in the device buffer. Returns ms; undefined when not given.\n */\nexport function parseSince(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n if (value === 'all') return Infinity;\n const seconds = Number(value);\n if (value.trim() === '' || !Number.isFinite(seconds) || seconds < 0) {\n throw new Error(`--since takes a number of seconds or \"all\", not \"${value}\".`);\n }\n return seconds * 1000;\n}\n","import { Command } from 'commander';\nimport { watchLog } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport { parseSince } from '../lib/logSince.js';\n\ninterface WatchOpts {\n log?: string;\n for: string;\n since?: string;\n bundle?: string;\n domain?: string;\n dedup: boolean;\n device?: string;\n json?: boolean;\n}\n\nexport function registerWatchCommand(program: Command): void {\n program\n .command('watch')\n .description('Collect the hilog lines matching a pattern that are logged during a fixed duration.')\n .option('--log <pattern>', 'Regex tested against each line (tag: message).')\n .option('--for <ms>', 'Duration to watch, ms.', '10000')\n .option(\n '--since <seconds>',\n 'Also collect lines logged up to N seconds before the command started, measured on the device clock; ' +\n '\"all\" adds everything still in the device log buffer.',\n )\n .option('--bundle <bundle>', 'Filter to this bundle.')\n .option('--domain <domain>', 'hilog domain filter (e.g. 0xD003900).')\n .option('--no-dedup', 'Do not collapse consecutive duplicate lines.')\n .option('--device <serial>', 'Target device serial.')\n .option('--json', 'Emit the entries as JSON.')\n .action(async (opts: WatchOpts) => {\n const { config, logger } = getRuntime();\n if (!opts.log) throw new Error('watch requires --log <pattern>.');\n const entries = await watchLog({\n config,\n pattern: new RegExp(opts.log),\n durationMs: Number(opts.for),\n bundle: opts.bundle,\n domain: opts.domain,\n dedup: opts.dedup,\n deviceSerial: opts.device,\n lookbackMs: parseSince(opts.since),\n logger,\n });\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(entries, null, 2)}\\n`);\n } else {\n for (const e of entries) process.stdout.write(`${e.time} ${e.level} ${e.tag}: ${e.message}\\n`);\n }\n });\n}\n","import { Command } from 'commander';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { takeScreenshot, captureBurst, locateTarget, describeLayoutNode } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport {\n renderWithGrid,\n buildContactSheet,\n frameDiffs,\n cropImage,\n parseCropRect,\n padCropRect,\n type CropRect,\n} from '../lib/screenshotImage.js';\nimport { addTargetOptions, selectorFrom, targetIndexFrom, type TargetOpts } from '../lib/target.js';\n\ninterface ScreenshotOpts extends TargetOpts {\n output: string;\n grid?: boolean;\n maxDim: string;\n crop?: string;\n contactSheet?: boolean;\n burst?: string;\n interval: string;\n json?: boolean;\n device?: string;\n}\n\nconst DEFAULT_CONTACT_SHEET_FRAMES = 8;\n// Margin kept around a --target element when cropping to it, as a fraction of the display.\nconst TARGET_CROP_PAD = 0.02;\n\nfunction clampMaxDim(raw: string): number {\n const n = Number(raw);\n if (!Number.isFinite(n)) return 1024;\n return Math.max(256, Math.min(4096, Math.round(n)));\n}\n\nexport function registerScreenshotCommand(program: Command): void {\n const screenshot = program\n .command('screenshot')\n .description(\n 'Capture the screen. Default: full-resolution raw JPEG. ' +\n '--grid: downscaled JPEG with a 10x10 grid (axes 0.0-1.0) for picking tap coordinates. ' +\n '--crop / --target: a full-resolution crop of one region or element, for checking detail cheaply. ' +\n '--contact-sheet: capture a burst and tile it into one image with per-frame change diffs.',\n )\n .option('-o, --output <file>', 'Output file path.', 'screenshot.jpeg')\n .option('--grid', 'Downscale (to --max-dim) and overlay a 10x10 coordinate grid.')\n .option('--max-dim <px>', 'Longest-side cap for --grid / --crop / --target / --contact-sheet (256-4096).', '1024')\n .option('--crop <x1,y1,x2,y2>', 'Crop to this region, given as 0-1 fractions of the screen.');\n addTargetOptions(screenshot, 'Crop to');\n screenshot\n .option('--contact-sheet', 'Capture a burst and composite it into one tiled contact sheet.')\n .option('--burst <count>', 'Capture N frames; writes <base>-<i><ext> (or feeds --contact-sheet).')\n .option('--interval <ms>', 'Delay between burst frames, ms.', '50')\n .option('--json', 'Emit the full result object as JSON on stdout (with --contact-sheet).')\n .option('--device <serial>', 'Target device serial.')\n .action(async (opts: ScreenshotOpts, command: Command) => {\n const { config, logger } = getRuntime();\n const maxDim = clampMaxDim(opts.maxDim);\n const intervalMs = Number(opts.interval) || 50;\n\n // --- Crop: one region (or element) at full resolution ---\n const selector = selectorFrom(opts);\n if (opts.crop !== undefined || selector) {\n if (opts.crop !== undefined && selector) throw new Error('Use either --crop or --target*, not both.');\n if (opts.grid || opts.contactSheet || opts.burst) {\n throw new Error('--crop / --target cannot be combined with --grid, --contact-sheet, or --burst.');\n }\n let rect: CropRect;\n let label: string;\n if (selector) {\n // Leave the keyboard alone: dismissing it would change what we are capturing.\n const located = await locateTarget({\n config,\n selector,\n index: targetIndexFrom(opts),\n hideKeyboard: false,\n deviceSerial: opts.device,\n logger,\n });\n if (!located.node.b) throw new Error(`${describeLayoutNode(located.node)} has no bounds to crop to.`);\n rect = padCropRect(located.node.b, TARGET_CROP_PAD);\n label = describeLayoutNode(located.node);\n } else {\n rect = parseCropRect(opts.crop!);\n label = rect.map((n) => n.toFixed(3)).join(',');\n }\n const shot = await takeScreenshot({ config, deviceSerial: opts.device, logger });\n const cropped = await cropImage(shot.pixels, rect, { maxDim });\n fs.writeFileSync(opts.output, cropped.buf);\n logger.info(\n `Wrote ${opts.output} (${cropped.width}x${cropped.height} from a ${cropped.cropWidth}x${cropped.cropHeight} ` +\n `crop at ${cropped.left},${cropped.top}: ${label}).`,\n );\n return;\n }\n\n // --- Contact sheet: burst -> one tiled image + per-frame diffs ---\n if (opts.contactSheet) {\n const count = opts.burst ? Math.max(1, Number(opts.burst)) : DEFAULT_CONTACT_SHEET_FRAMES;\n const frames = await captureBurst({ config, count, intervalMs, deviceSerial: opts.device, logger });\n const diffs = await frameDiffs(frames);\n const sheet = await buildContactSheet(frames, { maxDim, diffs });\n fs.writeFileSync(opts.output, sheet.buf);\n\n // Only fan out the individual raw frames when --burst was also requested.\n if (opts.burst) {\n const ext = path.extname(opts.output) || '.jpeg';\n const base = opts.output.slice(0, opts.output.length - ext.length);\n frames.forEach((frame, i) => fs.writeFileSync(`${base}-${i}${ext}`, frame));\n }\n\n const perFrame = frames.map((_, i) => ({ idx: i, t_ms: i * intervalMs, diffVsPrev: diffs[i] ?? 0 }));\n if (opts.json) {\n process.stdout.write(\n `${JSON.stringify(\n {\n sheet: opts.output,\n frameCount: frames.length,\n cols: sheet.cols,\n rows: sheet.rows,\n intervalMs,\n note: 't_ms is nominal (idx*interval); diffVsPrev is 0..1 mean greyscale diff vs the previous frame.',\n frames: perFrame,\n },\n null,\n 2,\n )}\\n`,\n );\n } else {\n process.stdout.write(`${JSON.stringify(perFrame)}\\n`);\n }\n\n let peak = 0;\n for (let i = 1; i < diffs.length; i++) if ((diffs[i] ?? 0) > (diffs[peak] ?? 0)) peak = i;\n logger.info(\n `Wrote contact sheet ${opts.output} (${sheet.cols}x${sheet.rows}, ${frames.length} frames). ` +\n `Biggest change at frame ${peak} (Δ${(diffs[peak] ?? 0).toFixed(2)}).`,\n );\n return;\n }\n\n // --- Burst (raw frames) — unchanged behaviour ---\n if (opts.burst) {\n const frames = await captureBurst({\n config,\n count: Number(opts.burst),\n intervalMs,\n deviceSerial: opts.device,\n logger,\n });\n const ext = path.extname(opts.output) || '.jpeg';\n const base = opts.output.slice(0, opts.output.length - ext.length);\n frames.forEach((frame, i) => fs.writeFileSync(`${base}-${i}${ext}`, frame));\n logger.info(`Wrote ${frames.length} frames to ${base}-<0..${frames.length - 1}>${ext}.`);\n return;\n }\n\n // --- Single shot ---\n const shot = await takeScreenshot({ config, deviceSerial: opts.device, logger });\n const maxDimProvided = command.getOptionValueSource('maxDim') === 'cli';\n if (opts.grid || maxDimProvided) {\n const rendered = await renderWithGrid(shot.pixels, { maxDim, grid: !!opts.grid });\n fs.writeFileSync(opts.output, rendered.buf);\n logger.info(\n `Wrote ${opts.output} (${rendered.width}x${rendered.height} from ` +\n `${rendered.originalWidth}x${rendered.originalHeight}${opts.grid ? ', 10x10 grid' : ''}).`,\n );\n return;\n }\n fs.writeFileSync(opts.output, shot.pixels);\n logger.info(`Wrote ${opts.output} (${shot.width}x${shot.height}).`);\n });\n}\n","import sharp from 'sharp';\n\n/**\n * Agent-facing screenshot image processing for the CLI.\n *\n * `@oniroproject/core` deliberately ships no image dependency — it returns raw\n * JPEG buffers. The grid overlay / downscale and the burst contact-sheet live\n * here (the CLI is the affordance layer), so `oniro-app screenshot` can produce\n * exactly what the ohos-hdc MCP used to. The grid drawing is ported verbatim\n * from that MCP so the output is equivalent.\n */\n\nexport interface RenderResult {\n /** Encoded JPEG. */\n buf: Buffer;\n /** Rendered (post-downscale) dimensions. */\n width: number;\n height: number;\n /** Source dimensions, before downscale. */\n originalWidth: number;\n originalHeight: number;\n}\n\nexport interface RenderWithGridOptions {\n /** Longest-side cap in pixels. The image is downscaled (never upscaled) to fit. */\n maxDim: number;\n /** Overlay the 10x10 grid with 0.0–1.0 axis labels after downscaling. */\n grid?: boolean;\n}\n\n/**\n * Build an SVG overlay: a 10x10 grid with X/Y axis labels (0.0–1.0) sized to the\n * given image dimensions. Ported verbatim from the ohos-hdc MCP so the gridded\n * output matches what agents are used to.\n */\nexport function buildGridSvg(width: number, height: number): string {\n const lineColor = 'rgba(255,80,80,0.55)';\n const labelBg = 'rgba(0,0,0,0.7)';\n const labelFg = '#fff';\n const fontSize = Math.max(10, Math.round(Math.min(width, height) / 60));\n const padding = Math.round(fontSize * 0.4);\n const labels: string[] = [];\n const lines: string[] = [];\n for (let i = 0; i <= 10; i++) {\n const f = i / 10;\n const x = Math.round(f * (width - 1));\n const y = Math.round(f * (height - 1));\n // grid lines (skip 0 and 10 — those are the image edges)\n if (i > 0 && i < 10) {\n lines.push(`<line x1=\"${x}\" y1=\"0\" x2=\"${x}\" y2=\"${height}\" stroke=\"${lineColor}\" stroke-width=\"1\"/>`);\n lines.push(`<line x1=\"0\" y1=\"${y}\" x2=\"${width}\" y2=\"${y}\" stroke=\"${lineColor}\" stroke-width=\"1\"/>`);\n }\n const tag = f.toFixed(1);\n // X-axis labels along the top\n const tx = i === 0 ? padding : i === 10 ? width - padding : x;\n const anchorX = i === 0 ? 'start' : i === 10 ? 'end' : 'middle';\n labels.push(\n `<text x=\"${tx}\" y=\"${fontSize + padding}\" font-family=\"monospace\" font-size=\"${fontSize}\" font-weight=\"bold\" fill=\"${labelFg}\" stroke=\"${labelBg}\" stroke-width=\"3\" paint-order=\"stroke\" text-anchor=\"${anchorX}\">${tag}</text>`,\n );\n // Y-axis labels along the left\n const ty = i === 0 ? fontSize + padding : i === 10 ? height - padding : y + fontSize / 3;\n labels.push(\n `<text x=\"${padding}\" y=\"${ty}\" font-family=\"monospace\" font-size=\"${fontSize}\" font-weight=\"bold\" fill=\"${labelFg}\" stroke=\"${labelBg}\" stroke-width=\"3\" paint-order=\"stroke\" text-anchor=\"start\">${tag}</text>`,\n );\n }\n // Axis title markers in the corners\n labels.push(\n `<text x=\"${width / 2}\" y=\"${fontSize * 2.4 + padding}\" font-family=\"monospace\" font-size=\"${fontSize}\" font-weight=\"bold\" fill=\"${labelFg}\" stroke=\"${labelBg}\" stroke-width=\"3\" paint-order=\"stroke\" text-anchor=\"middle\">X →</text>`,\n );\n labels.push(\n `<text x=\"${padding}\" y=\"${fontSize * 2.6 + padding}\" font-family=\"monospace\" font-size=\"${fontSize}\" font-weight=\"bold\" fill=\"${labelFg}\" stroke=\"${labelBg}\" stroke-width=\"3\" paint-order=\"stroke\" text-anchor=\"start\">Y ↓</text>`,\n );\n return `<svg width=\"${width}\" height=\"${height}\" xmlns=\"http://www.w3.org/2000/svg\">${lines.join('')}${labels.join('')}</svg>`;\n}\n\n/**\n * Downscale a JPEG so its longest side is <= `maxDim` (never upscaling) and,\n * when `grid` is set, overlay the coordinate grid. Returns the encoded JPEG plus\n * rendered and original dimensions.\n */\nexport async function renderWithGrid(jpeg: Buffer, opts: RenderWithGridOptions): Promise<RenderResult> {\n const meta = await sharp(jpeg).metadata();\n const originalWidth = meta.width ?? 0;\n const originalHeight = meta.height ?? 0;\n const longest = Math.max(originalWidth, originalHeight) || 1;\n const scale = Math.min(1, opts.maxDim / longest);\n const width = Math.max(1, Math.round(originalWidth * scale));\n const height = Math.max(1, Math.round(originalHeight * scale));\n const resized = await sharp(jpeg).resize(width, height).jpeg({ quality: 80 }).toBuffer();\n if (!opts.grid) {\n return { buf: resized, width, height, originalWidth, originalHeight };\n }\n const svg = buildGridSvg(width, height);\n const buf = await sharp(resized)\n .composite([{ input: Buffer.from(svg) }])\n .jpeg({ quality: 80 })\n .toBuffer();\n return { buf, width, height, originalWidth, originalHeight };\n}\n\n/** A region as [x1, y1, x2, y2] fractions (0–1) of the image. */\nexport type CropRect = [number, number, number, number];\n\n/** Parse `\"x1,y1,x2,y2\"` (0–1 fractions, x1<x2, y1<y2) into a {@link CropRect}. */\nexport function parseCropRect(spec: string): CropRect {\n const parts = spec.split(',').map((s) => Number(s.trim()));\n if (parts.length !== 4 || parts.some((n) => !Number.isFinite(n) || n < 0 || n > 1)) {\n throw new Error(`--crop expects four 0-1 fractions \"x1,y1,x2,y2\"; got \"${spec}\".`);\n }\n const [x1, y1, x2, y2] = parts as CropRect;\n if (!(x2 > x1 && y2 > y1)) throw new Error(`--crop needs x1 < x2 and y1 < y2; got \"${spec}\".`);\n return [x1, y1, x2, y2];\n}\n\n/** Grow a rect by `pad` (a fraction) on every side, clamped to 0–1. */\nexport function padCropRect(r: CropRect, pad: number): CropRect {\n return [Math.max(0, r[0] - pad), Math.max(0, r[1] - pad), Math.min(1, r[2] + pad), Math.min(1, r[3] + pad)];\n}\n\nexport interface CropResult {\n /** Encoded JPEG. */\n buf: Buffer;\n /** Rendered (post-downscale) dimensions. */\n width: number;\n height: number;\n /** The cropped region in source pixels. */\n left: number;\n top: number;\n cropWidth: number;\n cropHeight: number;\n}\n\n/**\n * Crop a JPEG to a 0–1 region at full resolution, then downscale so the longest\n * side is <= `maxDim` (never upscaling). Detail where it is needed, at a\n * fraction of a full-resolution screenshot's size.\n */\nexport async function cropImage(jpeg: Buffer, rect: CropRect, opts: { maxDim: number }): Promise<CropResult> {\n const meta = await sharp(jpeg).metadata();\n const w = meta.width ?? 1;\n const h = meta.height ?? 1;\n const left = Math.min(w - 1, Math.floor(rect[0] * w));\n const top = Math.min(h - 1, Math.floor(rect[1] * h));\n const cropWidth = Math.max(1, Math.min(w, Math.ceil(rect[2] * w)) - left);\n const cropHeight = Math.max(1, Math.min(h, Math.ceil(rect[3] * h)) - top);\n const scale = Math.min(1, opts.maxDim / Math.max(cropWidth, cropHeight));\n const width = Math.max(1, Math.round(cropWidth * scale));\n const height = Math.max(1, Math.round(cropHeight * scale));\n const buf = await sharp(jpeg)\n .extract({ left, top, width: cropWidth, height: cropHeight })\n .resize(width, height)\n .jpeg({ quality: 85 })\n .toBuffer();\n return { buf, width, height, left, top, cropWidth, cropHeight };\n}\n\nexport interface ContactSheetOptions {\n /** Longest-side cap for the whole sheet; per-tile size derives from this. */\n maxDim: number;\n /** Tiles per row. Defaults to ceil(sqrt(N)). */\n cols?: number;\n /** Per-frame diff (0..1), index-aligned with `frames`; printed on each tile. */\n diffs?: number[];\n /** Gap between tiles, px. */\n gap?: number;\n}\n\nexport interface ContactSheetResult {\n buf: Buffer;\n width: number;\n height: number;\n cols: number;\n rows: number;\n tileWidth: number;\n tileHeight: number;\n count: number;\n}\n\nfunction buildTileLabelSvg(width: number, height: number, idx: number, diff?: number): string {\n const fontSize = Math.max(12, Math.round(Math.min(width, height) / 16));\n const pad = Math.round(fontSize * 0.4);\n let label = `#${idx}`;\n if (typeof diff === 'number') label += ` Δ${diff.toFixed(2)}`;\n const boxW = Math.round(label.length * fontSize * 0.62) + pad * 2;\n const boxH = fontSize + pad * 2;\n return (\n `<svg width=\"${width}\" height=\"${height}\" xmlns=\"http://www.w3.org/2000/svg\">` +\n `<rect x=\"0\" y=\"0\" width=\"${boxW}\" height=\"${boxH}\" fill=\"rgba(0,0,0,0.6)\"/>` +\n `<text x=\"${pad}\" y=\"${fontSize + pad - 1}\" font-family=\"monospace\" font-size=\"${fontSize}\" font-weight=\"bold\" fill=\"#fff\" stroke=\"rgba(0,0,0,0.85)\" stroke-width=\"3\" paint-order=\"stroke\" text-anchor=\"start\">${label}</text>` +\n `</svg>`\n );\n}\n\n/**\n * Composite a burst of JPEG frames into a single tiled contact sheet, each tile\n * labelled with its frame index (and per-frame diff when provided). One image\n * replaces N — a large token saving when verifying transient UI.\n */\nexport async function buildContactSheet(frames: Buffer[], opts: ContactSheetOptions): Promise<ContactSheetResult> {\n if (frames.length === 0) throw new Error('buildContactSheet: no frames');\n const count = frames.length;\n const cols = Math.max(1, opts.cols ?? Math.ceil(Math.sqrt(count)));\n const rows = Math.ceil(count / cols);\n const gap = opts.gap ?? 8;\n\n const meta0 = await sharp(frames[0]).metadata();\n const fw = meta0.width ?? 1;\n const fh = meta0.height ?? 1;\n const longest = Math.max(fw, fh) || 1;\n const tileScale = Math.min(1, opts.maxDim / cols / longest);\n const tileWidth = Math.max(1, Math.round(fw * tileScale));\n const tileHeight = Math.max(1, Math.round(fh * tileScale));\n\n const tiles = await Promise.all(\n frames.map((frame, i) => {\n const label = Buffer.from(buildTileLabelSvg(tileWidth, tileHeight, i, opts.diffs?.[i]));\n return sharp(frame)\n .resize(tileWidth, tileHeight, { fit: 'fill' })\n .composite([{ input: label, top: 0, left: 0 }])\n .png()\n .toBuffer();\n }),\n );\n\n const width = cols * tileWidth + (cols + 1) * gap;\n const height = rows * tileHeight + (rows + 1) * gap;\n const placements = tiles.map((input, i) => {\n const r = Math.floor(i / cols);\n const c = i % cols;\n return { input, left: gap + c * (tileWidth + gap), top: gap + r * (tileHeight + gap) };\n });\n\n const buf = await sharp({\n create: { width, height, channels: 3, background: { r: 20, g: 20, b: 20 } },\n })\n .composite(placements)\n .jpeg({ quality: 80 })\n .toBuffer();\n\n return { buf, width, height, cols, rows, tileWidth, tileHeight, count };\n}\n\n/**\n * Per-frame change metric: mean absolute difference of a downscaled greyscale\n * thumbnail vs. the previous frame, normalised to 0..1. Frame 0 is 0 (no\n * predecessor). Cheap, deterministic, and device-free.\n */\nexport async function frameDiffs(frames: Buffer[], opts: { sample?: number } = {}): Promise<number[]> {\n if (frames.length === 0) return [];\n const sample = opts.sample ?? 32;\n const thumbs = await Promise.all(\n frames.map((f) => sharp(f).greyscale().resize(sample, sample, { fit: 'fill' }).raw().toBuffer()),\n );\n const out: number[] = [0];\n for (let i = 1; i < thumbs.length; i++) {\n const a = thumbs[i - 1];\n const b = thumbs[i];\n if (!a || !b) {\n out.push(0);\n continue;\n }\n const n = Math.min(a.length, b.length) || 1;\n let s = 0;\n for (let k = 0; k < n; k++) s += Math.abs((a[k] ?? 0) - (b[k] ?? 0));\n out.push(+(s / n / 255).toFixed(4));\n }\n return out;\n}\n","import { Command } from 'commander';\nimport { dumpLayout } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport { formatFlatLayout } from '../lib/layoutText.js';\n\ninterface DumpOpts {\n bundle?: string;\n raw?: boolean;\n flat?: boolean;\n device?: string;\n}\n\nexport function registerDumpCommand(program: Command): void {\n program\n .command('dump [target]')\n .description(\n 'Dump device state. Currently supports `dump layout` (the default target): JSON by default, ' +\n 'or one line per element with --flat.',\n )\n .option('--bundle <bundle>', 'Filter the layout to a single window/bundle.')\n .option('--raw', 'Return the unpruned layout tree.')\n .option('--flat', 'One line per element (type, label, center as 0-1 fractions, flags) instead of a JSON tree.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (target: string | undefined, opts: DumpOpts) => {\n const { config, logger } = getRuntime();\n const what = target ?? 'layout';\n if (what !== 'layout') throw new Error(`Unknown dump target \"${what}\". Supported: layout.`);\n if (opts.raw && opts.flat) throw new Error('--raw and --flat cannot be combined.');\n const result = await dumpLayout({\n config,\n bundleName: opts.bundle,\n prune: !opts.raw,\n detectKeyboard: !opts.raw,\n deviceSerial: opts.device,\n logger,\n });\n process.stdout.write(opts.flat ? formatFlatLayout(result) : `${JSON.stringify(result, null, 2)}\\n`);\n });\n}\n","import { flattenLayout, type DumpLayoutResult, type FlatLayoutNode } from '@oniroproject/core';\n\nconst MAX_TEXT = 80;\n\nfunction quote(s: string): string {\n return JSON.stringify(s.length > MAX_TEXT ? `${s.slice(0, MAX_TEXT - 1)}…` : s);\n}\n\nfunction flags(n: FlatLayoutNode): string[] {\n const out: string[] = [];\n if (n.click) out.push('click');\n if (n.longClick) out.push('longClick');\n if (n.scroll) out.push('scroll');\n if (n.checked) out.push('checked');\n else if (n.check) out.push('checkable');\n if (n.sel) out.push('selected');\n if (n.focus) out.push('focus');\n if (n.disabled) out.push('disabled');\n if (n.covered) out.push('covered');\n return out;\n}\n\n/** One line per element: type, label, center (0–1 fractions), and state flags. */\nexport function formatLayoutLine(n: FlatLayoutNode): string {\n const parts: string[] = [n.type ?? 'node'];\n if (n.text !== undefined) parts.push(quote(n.text));\n if (n.desc !== undefined) parts.push(`desc=${quote(n.desc)}`);\n if (n.hint !== undefined) parts.push(`hint=${quote(n.hint)}`);\n if (n.id !== undefined) parts.push(`#${n.id}`);\n if (n.key !== undefined) parts.push(`key=${n.key}`);\n if (n.c) parts.push(`c=${n.c[0].toFixed(3)},${n.c[1].toFixed(3)}`);\n parts.push(...flags(n));\n return parts.join(' ');\n}\n\n/** Worth a line: it has a label to read or match, or it can be interacted with. */\nfunction isListed(n: FlatLayoutNode): boolean {\n const labelled = n.text !== undefined || n.desc !== undefined || n.hint !== undefined;\n return labelled || !!(n.click || n.longClick || n.scroll || n.check || n.focus);\n}\n\n/**\n * Render a pruned layout as compact text for agents: a `[window <bundle>]`\n * header per window, then one line per labelled or interactive element in\n * paint order (decorative images and id-only wrappers are left to the JSON\n * output). The soft keyboard collapses to a single `[keyboard <bundle>]` line\n * instead of listing every key.\n */\nexport function formatFlatLayout(result: DumpLayoutResult): string {\n const lines: string[] = [];\n const d = result.display;\n lines.push(\n `# display ${d ? `${d.width}x${d.height}` : 'unknown'}; c = element center as 0-1 fractions ` +\n '(input --fx/--fy), or act by label with input --target \"<text>\"',\n );\n const keyboardBundle = result.keyboard?.shown ? result.keyboard.bundle : undefined;\n let window: string | undefined;\n for (const n of flattenLayout(result.tree)) {\n if (n.window !== window) {\n window = n.window;\n if (window !== undefined && window === keyboardBundle) {\n lines.push(`[keyboard ${window}] up — dismiss with input --type hideKeyboard`);\n } else if (window !== undefined) {\n lines.push(`[window ${window}]`);\n }\n }\n if (window !== undefined && window === keyboardBundle) continue;\n if (n.bundle !== undefined && n.text === undefined && !n.click) continue; // the window root itself\n if (isListed(n)) lines.push(formatLayoutLine(n));\n }\n return `${lines.join('\\n')}\\n`;\n}\n","import { Command } from 'commander';\nimport { getDeviceInfo, listDevices, type DeviceFullInfo, type DeviceInfo } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\n/** One `devices --long` line: the target-list columns, then what the device reports about itself. */\nexport function formatLongDevice(d: DeviceInfo, info: DeviceFullInfo | undefined): string {\n const head = `${d.serial}\\t${d.connection ?? ''}\\t${d.status}`;\n if (!info) return head;\n const os = [info.osFamily, info.osFamily === 'HarmonyOS' ? info.osDistVersion : undefined].filter(Boolean).join(' ');\n const fields: Array<[string, string | undefined]> = [\n ['os', os || undefined],\n ['api', info.sdkApiVersion],\n ['abi', info.abi],\n ['type', info.deviceType],\n ['model', info.model],\n ['fullname', info.osFullName],\n ];\n const rest = fields.filter(([, v]) => v).map(([k, v]) => `${k}=${/\\s/.test(v!) ? JSON.stringify(v) : v}`);\n return [head, ...rest].join('\\t');\n}\n\nexport function registerDevicesCommand(program: Command): void {\n program\n .command('devices')\n .description('List connected hdc devices.')\n .option(\n '--long',\n 'Also ask each connected device for its OS family (HarmonyOS / OpenHarmony), version, API level, ' +\n 'CPU ABI, device type and model.',\n )\n .option('--json', 'Emit machine-readable JSON.')\n .action(async (opts: { long?: boolean; json?: boolean }) => {\n const { config, logger } = getRuntime();\n const devices = await listDevices(config);\n const infos = new Map<string, DeviceFullInfo>();\n if (opts.long) {\n for (const d of devices.filter((x) => x.status === 'Connected')) {\n try {\n infos.set(d.serial, await getDeviceInfo({ config, deviceSerial: d.serial, logger }));\n } catch (err) {\n logger.warn(`Could not query ${d.serial}: ${(err as Error).message}`);\n }\n }\n }\n if (opts.json) {\n const out = opts.long ? devices.map((d) => ({ ...d, info: infos.get(d.serial) ?? null })) : devices;\n process.stdout.write(`${JSON.stringify(out, null, 2)}\\n`);\n return;\n }\n if (devices.length === 0) {\n process.stdout.write('(no devices)\\n');\n return;\n }\n for (const d of devices) {\n process.stdout.write(`${opts.long ? formatLongDevice(d, infos.get(d.serial)) : `${d.serial}\\t${d.connection ?? ''}\\t${d.status}`}\\n`);\n }\n });\n}\n","import { Command } from 'commander';\nimport { sendFile, recvFile } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerFileCommand(program: Command): void {\n const file = program.command('file').description('Transfer files to/from the device (hdc file send/recv).');\n\n file\n .command('send <local> <remote>')\n .description(\n 'Push a local file to the device. With --bundle, <remote> may be relative to that app\\'s sandbox ' +\n '(files/x is its filesDir, haps/entry/files/x the entry module\\'s), and the file is chowned to the app ' +\n 'so it can read it. Prints the device path.',\n )\n .option('--bundle <bundle>', 'Push into this app\\'s sandbox and give the file to the app\\'s user.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (local: string, remote: string, opts: { bundle?: string; device?: string }) => {\n const { config, logger } = getRuntime();\n const written = await sendFile({ config, local, remote, bundle: opts.bundle, deviceSerial: opts.device, logger });\n logger.info(`Sent ${local} -> ${written}${opts.bundle ? ` (owned by ${opts.bundle})` : ''}.`);\n process.stdout.write(`${written}\\n`);\n });\n\n file\n .command('recv <remote> <local>')\n .description('Pull a file from the device.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (remote: string, local: string, opts: { device?: string }) => {\n const { config, logger } = getRuntime();\n await recvFile({ config, remote, local, deviceSerial: opts.device, logger });\n logger.info(`Received ${remote} -> ${local}.`);\n });\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport {\n detectCmdToolsFlavour,\n detectRuntimeOs,\n getCmdToolsPath,\n missingProjectRootFiles,\n runCodelinter,\n type CodelinterResult,\n type CodelinterSummary,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\ninterface LintOpts {\n files?: string[];\n json?: boolean;\n}\n\n/** codelinter's totals, or totals counted from the findings when it printed none. */\nexport function lintTotals(result: Pick<CodelinterResult, 'findings' | 'summary'>): CodelinterSummary {\n if (result.summary) return result.summary;\n const count = (s: string): number => result.findings.filter((f) => f.severity === s).length;\n return {\n defects: result.findings.length,\n errors: count('error'),\n warnings: count('warning'),\n suggestions: count('suggestion'),\n };\n}\n\n/**\n * The exit code for a lint run: 1 when there is an error-severity finding, or when\n * codelinter exited non-zero without printing a report (so it did not really run).\n * Warnings and suggestions alone exit 0, although codelinter itself exits 1 for them.\n */\nexport function lintExitCode(result: Pick<CodelinterResult, 'code' | 'findings' | 'summary'>): number {\n if (lintTotals(result).errors > 0) return 1;\n return lintFailed(result) ? result.code : 0;\n}\n\n/** True when codelinter exited non-zero without printing a report, so it did not really run. */\nexport function lintFailed(result: Pick<CodelinterResult, 'code' | 'findings' | 'summary'>): boolean {\n return result.summary === null && result.findings.length === 0 && result.code !== 0;\n}\n\nexport function registerLintCommand(program: Command): void {\n program\n .command('lint [project-dir]')\n .description(\n 'Run the OpenHarmony codelinter on a project. Defaults to the current directory. ' +\n 'Exits 1 on error-severity findings or when codelinter fails to run; warnings alone exit 0.',\n )\n .option('--files <globs...>', 'Specific files/globs to lint (default: the whole project).')\n .option('--json', 'Emit the report (findings, summary, notices, incomplete) as JSON.')\n .action(async (projectDir: string | undefined, opts: LintOpts) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n const result = await runCodelinter({ config, projectDir: dir, files: opts.files, logger });\n const totals = lintTotals(result);\n const failed = lintFailed(result);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } else if (!failed) {\n for (const f of result.findings) {\n const at = `${f.file}:${f.line}${f.column ? `:${f.column}` : ''}`;\n process.stdout.write(`${at} ${f.severity} ${f.message}${f.code ? ` [${f.code}]` : ''}\\n`);\n }\n process.stdout.write(\n totals.defects === 0\n ? 'No defects found.\\n'\n : `${totals.defects} defects: ${totals.errors} errors, ${totals.warnings} warnings, ` +\n `${totals.suggestions} suggestions.\\n`,\n );\n }\n\n if (failed) {\n const missing = missingProjectRootFiles(dir);\n const why = missing.length ? ` It needs a DevEco project root, and ${dir} has no ${missing.join(', ')}.` : '';\n logger.error(\n `codelinter exited ${result.code} without a report, so nothing was linted.${why}\\n` +\n result.raw.trim().split('\\n').slice(-15).join('\\n'),\n );\n }\n if (result.incomplete) {\n for (const n of result.notices) logger.warn(`codelinter: ${n}`);\n const cmdToolsPath = getCmdToolsPath(config);\n const flavour = detectCmdToolsFlavour(cmdToolsPath);\n const projectOs = detectRuntimeOs(dir);\n if (flavour !== projectOs) {\n logger.warn(\n `The command-line tools at ${cmdToolsPath} are the ${flavour} flavour, but the project targets ` +\n `${projectOs} (runtimeOS in build-profile.json5), so codelinter skipped part of its checks: treat the ` +\n `counts as a lower bound. For a complete report, point ONIRO_CMD_TOOLS_PATH at ${projectOs} ` +\n \"command-line tools. The build's ArkTS compiler checks are not affected.\",\n );\n }\n }\n // Let output flush before exiting non-zero.\n process.exitCode = lintExitCode(result);\n });\n}\n","import { Command, Option } from 'commander';\nimport {\n performInput,\n sendGesture,\n getDisplaySize,\n describeLayoutNode,\n type UiInputType,\n type Waypoint,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport { addTargetOptions, selectorFrom, targetIndexFrom, type TargetOpts } from '../lib/target.js';\n\nconst INPUT_TYPES: UiInputType[] = [\n 'click',\n 'doubleClick',\n 'longClick',\n 'swipe',\n 'drag',\n 'fling',\n 'keyEvent',\n 'inputText',\n 'clearText',\n 'hideKeyboard',\n];\n\nconst num = (v: string | undefined): number | undefined => (v === undefined ? undefined : Number(v));\n\ninterface InputOpts extends TargetOpts {\n type: UiInputType;\n x?: string;\n y?: string;\n x2?: string;\n y2?: string;\n fx?: string;\n fy?: string;\n fx2?: string;\n fy2?: string;\n speed?: string;\n key?: string;\n text?: string;\n clear?: boolean;\n hideKeyboard?: boolean;\n device?: string;\n}\n\ninterface GestureOpts {\n waypoints: string;\n fractions?: boolean;\n holdStart?: string;\n holdEnd?: string;\n device?: string;\n}\n\nexport function registerInputCommand(program: Command): void {\n const input = program\n .command('input')\n .description(\n 'Inject a UI input event via uitest uiInput. Position it with --target (an on-screen element), ' +\n '--fx/--fy (0-1 fractions of the display, as in `dump layout` and the screenshot grid), or --x/--y (pixels).',\n )\n .addOption(new Option('--type <type>', 'Input type.').choices(INPUT_TYPES).makeOptionMandatory());\n addTargetOptions(input, 'Act on');\n input\n .option('--fx <fraction>', 'Start X as a 0-1 fraction of the display width.')\n .option('--fy <fraction>', 'Start Y as a 0-1 fraction of the display height.')\n .option('--fx2 <fraction>', 'End X fraction (swipe/drag/fling).')\n .option('--fy2 <fraction>', 'End Y fraction (swipe/drag/fling).')\n .option('--x <px>', 'X pixel (click/swipe start).')\n .option('--y <px>', 'Y pixel (click/swipe start).')\n .option('--x2 <px>', 'End X pixel (swipe/drag/fling).')\n .option('--y2 <px>', 'End Y pixel (swipe/drag/fling).')\n .option('--speed <px-per-s>', 'Velocity for swipe/drag/fling.')\n .option(\n '--key <key>',\n 'Key for keyEvent: Back/Home/Power, a name (Delete, Enter, Tab, Escape, MoveHome, MoveEnd, …), ' +\n 'a letter, a KeyCode id, or a combo like Ctrl+A.',\n )\n .option('--text <text>', 'Text for inputText.')\n .option('--clear', 'inputText: clear the field (Ctrl+A, Delete) before typing.')\n .option('--hide-keyboard', 'Dismiss the soft keyboard afterwards, if it is up.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (opts: InputOpts) => {\n const { config, logger } = getRuntime();\n const result = await performInput({\n config,\n type: opts.type,\n target: selectorFrom(opts),\n targetIndex: targetIndexFrom(opts),\n fx: num(opts.fx),\n fy: num(opts.fy),\n fx2: num(opts.fx2),\n fy2: num(opts.fy2),\n pxX: num(opts.x),\n pxY: num(opts.y),\n pxX2: num(opts.x2),\n pxY2: num(opts.y2),\n speed: num(opts.speed),\n key: opts.key,\n text: opts.text,\n clear: opts.clear,\n hideKeyboard: opts.hideKeyboard,\n deviceSerial: opts.device,\n logger,\n });\n if (opts.type === 'hideKeyboard') {\n logger.info(result.keyboardHidden ? 'Dismissed the keyboard.' : 'The keyboard was not shown.');\n return;\n }\n const at = result.x !== undefined ? ` at ${result.x},${result.y}` : '';\n const on = result.target ? ` on ${describeLayoutNode(result.target)}` : '';\n const kb = result.keyboardHidden ? ' (dismissed the keyboard)' : '';\n logger.info(`Sent ${opts.type}${at}${on}${kb}.`);\n });\n\n program\n .command('gesture')\n .description('Inject a multi-waypoint gesture. Waypoints are JSON: [{\"x\":..,\"y\":..,\"t\":..}] in pixels (or fractions with --fractions).')\n .requiredOption('--waypoints <json>', 'JSON array of {x,y,t} waypoints (t = ms from start).')\n .option('--fractions', 'Waypoint x/y are 0-1 fractions of the display instead of pixels.')\n .option('--hold-start <ms>', 'Leading press-hold before moving (best-effort: uses `uitest drag`).')\n .option('--hold-end <ms>', 'Trailing hold before lifting (no uitest equivalent; ignored).')\n .option('--device <serial>', 'Target device serial.')\n .action(async (opts: GestureOpts) => {\n const { config, logger } = getRuntime();\n let waypoints = JSON.parse(opts.waypoints) as Waypoint[];\n if (opts.fractions) {\n const bad = waypoints.find((w) => !(w.x >= 0 && w.x <= 1 && w.y >= 0 && w.y <= 1));\n if (bad) throw new Error(`With --fractions, waypoint x and y must be 0-1; got ${bad.x},${bad.y}.`);\n const display = await getDisplaySize(config, { deviceSerial: opts.device, logger });\n if (!display) throw new Error('Could not read the display size to convert fractions to pixels.');\n // 1.0 maps to the last pixel, not one past the edge.\n const px = (f: number, size: number): number => Math.min(size - 1, Math.round(f * size));\n waypoints = waypoints.map((w) => ({ ...w, x: px(w.x, display.width), y: px(w.y, display.height) }));\n }\n await sendGesture({\n config,\n waypoints,\n holdStartMs: num(opts.holdStart),\n holdEndMs: num(opts.holdEnd),\n deviceSerial: opts.device,\n logger,\n });\n logger.info('Gesture sent.');\n });\n}\n","import { Command } from 'commander';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { captureLog } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport { collectLogBundle } from '../lib/logBundle.js';\n\ninterface LogsOpts {\n output?: string;\n for?: string;\n grep?: string;\n clear?: boolean;\n domain?: string;\n device?: string;\n}\n\ninterface CollectOptions {\n output: string;\n device?: string;\n package?: string;\n pid?: string;\n tag?: string;\n level?: string;\n duration: string;\n redact: boolean;\n json?: boolean;\n}\n\nexport function registerLogsCommand(program: Command): void {\n const logs = program\n .command('logs')\n .description(\n 'Capture hilog to a file for a whole session: the device\\'s small log buffer wraps within ' +\n 'seconds under chatty components, so a dump at the end loses lines. Runs until --for elapses ' +\n 'or the process is interrupted; start it in the background, e.g. `oniro-app logs --clear -o ' +\n 'hilog_full.txt &`. Every line is flushed as it arrives and the stream reconnects after a reboot.',\n )\n // Not requiredOption: commander checks a parent's mandatory options for its\n // subcommands too, so `logs collect` would demand it.\n .option('-o, --output <file>', 'File to append the lines to (required).')\n .option('--for <ms>', 'Stop after this many ms (default: run until interrupted).')\n .option('--grep <regex>', 'Keep only lines matching this regex (default: all).')\n .option('--clear', 'Clear the device log buffer first (hilog -r), so the file covers only this session.')\n .option('--domain <domain>', 'hilog domain filter (e.g. 0xD003900).')\n .option('--device <serial>', 'Target device serial.')\n .action(async (opts: LogsOpts) => {\n if (!opts.output) logs.error(\"error: required option '-o, --output <file>' not specified\");\n const { config, logger } = getRuntime();\n const file = path.resolve(opts.output!);\n const abort = new AbortController();\n const stop = (): void => abort.abort();\n process.once('SIGINT', stop);\n process.once('SIGTERM', stop);\n logger.info(`Capturing hilog to ${file}${opts.for ? ` for ${opts.for} ms` : ' until interrupted'}...`);\n const result = await captureLog({\n config,\n file,\n durationMs: opts.for !== undefined ? Number(opts.for) : undefined,\n pattern: opts.grep ? new RegExp(opts.grep) : undefined,\n clear: opts.clear,\n domain: opts.domain,\n deviceSerial: opts.device,\n abortSignal: abort.signal,\n logger,\n });\n logger.info(`Wrote ${result.lines} lines to ${result.file} (${result.reconnects} reconnects).`);\n process.stdout.write(`${result.file}\\n`);\n });\n\n logs\n .command('collect')\n .description('Create a diagnostic bundle from a connected device.')\n .allowExcessArguments(false)\n .option('-o, --output <directory>', 'Parent directory for incident bundles.', path.join(os.homedir(), '.oniro', 'incident-bundles'))\n .option('--device <serial>', 'Target device serial.')\n .option('--package <bundle>', 'Collect faultlog entries for this application bundle.')\n .option('--pid <pid>', 'Create a filtered HiLog view for this process.')\n .option('--tag <tag>', 'Create a filtered HiLog view for this tag.')\n .option('--level <level>', 'Create a filtered HiLog view for this level (V/D/I/W/E/F).')\n .option('--duration <seconds>', 'Keep HiLog records from the last N seconds (default 600).', '600')\n .option('--redact', 'Redact sensitive values and archive only the redacted bundle.')\n .option('--json', 'Emit bundle paths and status as JSON.')\n .action(async (opts: CollectOptions) => {\n const { config } = getRuntime();\n const result = await collectLogBundle({\n config,\n outputDirectory: opts.output,\n deviceSerial: opts.device,\n packageName: opts.package,\n pid: opts.pid,\n tag: opts.tag,\n level: opts.level,\n durationSeconds: Number(opts.duration),\n redact: Boolean(opts.redact),\n });\n const output = opts.json\n ? `${JSON.stringify({ ...result, status: result.complete ? 'complete' : 'partial' }, null, 2)}\\n`\n : `${result.archivePath ?? result.bundleDirectory}\\n`;\n process.stdout.write(output);\n if (!result.complete) {\n throw new Error(`Bundle is partial; inspect manifest.json. ${result.error ?? 'One or more collectors failed.'}`);\n }\n });\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { deflateRawSync } from 'node:zlib';\nimport {\n VERSION, hdcExec, parseDeviceList, resolveDeviceSerial, shellChecked, type ConfigProvider, type HdcExecResult,\n} from '@oniroproject/core';\n\nexport interface CollectLogBundleOptions {\n config: ConfigProvider;\n outputDirectory: string;\n deviceSerial?: string;\n packageName?: string;\n pid?: string;\n tag?: string;\n level?: string;\n durationSeconds?: number;\n redact: boolean;\n execute?: (args: readonly string[], deviceSerial?: string) => Promise<HdcExecResult>;\n}\n\nexport interface LogBundleResult {\n bundleDirectory: string;\n archivePath: string | null;\n redactedDirectory: string | null;\n complete: boolean;\n error?: string;\n}\n\ninterface CommandRecord {\n name: string;\n status: 'success' | 'failed';\n output: string | null;\n stderr: string | null;\n exitCode: number | null;\n error: string | null;\n}\n\nconst LEVELS: Record<string, string> = {\n V: 'V', VERBOSE: 'V', D: 'D', DEBUG: 'D', I: 'I', INFO: 'I',\n W: 'W', WARN: 'W', WARNING: 'W', E: 'E', ERROR: 'E', F: 'F', FATAL: 'F',\n};\nconst HILOG_RECORD = /^(?<date>\\d{2}-\\d{2})[ \\t]+(?<time>\\d{2}:\\d{2}:\\d{2}\\.\\d{3})[ \\t]+(?<pid>\\d+)[ \\t]+\\d+[ \\t]+(?<level>[VDIWEF])[ \\t]+(?<tag>\\S+?)(?:[ \\t]+[NH](?::(?:[ \\t]+.*)?|[ \\t]+.*)?|:(?:[ \\t]+.*)?)$/;\nconst FAILURE_TEXT = /^(?:\\s*(?:\\[(?:fail|error)\\]|(?:error|failed|failure):|permission denied\\b|no devices? connected\\b|too many arguments\\b|unknown option\\b|invalid option\\b|command not found\\b)|\\s*(?:hdc|device)\\b.*\\b(?:error|failed|no device|not connected|offline)\\b)/im;\n\nfunction validateDate(date: string, time: string): boolean {\n const [, monthText, dayText] = /^(\\d{2})-(\\d{2})$/.exec(date) ?? [];\n const [, hourText, minuteText, secondText, millisecondText] = /^(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3})$/.exec(time) ?? [];\n if (!monthText || !dayText || !hourText || !minuteText || !secondText || !millisecondText) return false;\n const value = new Date(Date.UTC(2000, Number(monthText) - 1, Number(dayText), Number(hourText), Number(minuteText), Number(secondText), Number(millisecondText)));\n return value.getUTCMonth() === Number(monthText) - 1 && value.getUTCDate() === Number(dayText) &&\n Number(hourText) < 24 && Number(minuteText) < 60 && Number(secondText) < 60;\n}\n\nexport function filterHilog(\n input: string,\n filters: { pid?: string; tag?: string; level?: string },\n): { text: string; applied: string[] } | null {\n const criteria: Record<string, string> = {};\n if (filters.pid) criteria.pid = filters.pid.replace(/^0+(?=\\d)/, '');\n if (filters.tag) criteria.tag = filters.tag;\n if (filters.level) criteria.level = LEVELS[filters.level.toUpperCase()] ?? filters.level.toUpperCase();\n if (Object.keys(criteria).length === 0) return null;\n\n let sawRecord = false;\n let keep = false;\n let output = '';\n for (const line of input.match(/[^\\n]*\\n|[^\\n]+$/g) ?? []) {\n const content = line.replace(/[\\r\\n]+$/, '');\n const match = HILOG_RECORD.exec(content);\n if (match?.groups) {\n if (!validateDate(match.groups.date!, match.groups.time!)) return null;\n sawRecord = true;\n keep = Object.entries(criteria).every(([key, value]) => {\n const field = key === 'tag'\n ? match.groups!.tag!.slice(match.groups!.tag!.lastIndexOf('/') + 1)\n : match.groups![key];\n return key === 'pid' ? field?.replace(/^0+(?=\\d)/, '') === value : field === value;\n });\n } else if (/^\\s*\\[?\\d{1,4}[-/]/.test(content) || (!sawRecord && content.trim())) {\n return null;\n }\n if (keep) output += line;\n }\n return sawRecord ? { text: output, applied: Object.keys(criteria) } : null;\n}\n\nexport function redactLogText(value: string, deviceSerials: readonly string[] = []): string {\n let result = value\n .replace(/(\\bBearer\\s+)[A-Za-z0-9._~+/=-]+/gi, '$1[REDACTED]')\n .replace(/(\\bBasic\\s+)[A-Za-z0-9+/=]+/gi, '$1[REDACTED]')\n .replace(/((?:token|password|passwd|secret|api[_-]?key)\\s*[=:]\\s*)[^\\s,;]+/gi, '$1[REDACTED]')\n .replace(/(cookie\\s*[=:]\\s*)[^\\r\\n]+/gi, '$1[REDACTED]')\n .replace(/\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/gi, '[REDACTED_EMAIL]')\n .replace(/((?:phone|mobile|telephone|tel)(?:number)?\\s*[=:]\\s*)\\+?[\\d ()-]{8,}\\d/gi, '$1[REDACTED_PHONE]')\n .replace(/(?<![\\w.])(?:\\+\\d{1,3}[ -]?)?\\(?\\d{2,4}\\)?[ -]\\d{3,4}[ -]\\d{3,4}(?![\\w.])/g, '[REDACTED_PHONE]')\n .replace(/\\b(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}\\b/g, '[REDACTED_MAC]')\n .replace(/([A-Z]:\\\\Users\\\\)[^\\\\\\r\\n \"']+/gi, '$1[REDACTED_USER]')\n .replace(/(\\/(?:Users|home)\\/)[^/\\r\\n \"']+/gi, '$1[REDACTED_USER]')\n .replace(/(\"(?:target|deviceSerial)\"\\s*:\\s*\")[^\"]+(\")/gi, '$1[REDACTED_DEVICE]$2')\n .replace(/(--device\\s+|-t\\s+)([A-Za-z0-9._:-]+)/gi, '$1[REDACTED_DEVICE]');\n\n for (const serial of deviceSerials) {\n if (serial) result = result.split(serial).join('[REDACTED_DEVICE]');\n }\n\n const ipv4 = /\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b/g;\n result = result.replace(ipv4, (address, offset: number, whole: string) => {\n const prefix = whole.slice(Math.max(0, offset - 48), offset);\n const suffix = whole.slice(offset + address.length);\n const contextual = /(?:ip|addr(?:ess)?|host|peer|remote|local|endpoint|server|client|target|device(?:id)?|serial)[^\\r\\n]{0,24}$/i.test(prefix);\n const hasPort = /^:\\d{1,5}(?!\\d)/.test(suffix);\n const octets = address.split('.').map(Number);\n return octets.every((part: number) => part <= 255) && (contextual || hasPort) ? '[REDACTED_IP]' : address;\n });\n return result;\n}\n\nfunction decodeText(data: Buffer, relativePath: string): string {\n let text: string;\n if (data.subarray(0, 2).equals(Buffer.from([0xff, 0xfe]))) text = data.toString('utf16le').slice(1);\n else if (data.subarray(0, 2).equals(Buffer.from([0xfe, 0xff]))) {\n const swapped = Buffer.from(data.subarray(2));\n for (let i = 0; i + 1 < swapped.length; i += 2) [swapped[i], swapped[i + 1]] = [swapped[i + 1]!, swapped[i]!];\n text = swapped.toString('utf16le');\n } else {\n const utf8 = data.subarray(0, 3).equals(Buffer.from([0xef, 0xbb, 0xbf])) ? data.subarray(3) : data;\n if (utf8.includes(0)) throw new Error(`Binary data cannot be safely redacted: ${relativePath}`);\n try {\n text = new TextDecoder('utf-8', { fatal: true }).decode(utf8);\n } catch {\n throw new Error(`Non-UTF-8 data cannot be safely redacted: ${relativePath}`);\n }\n }\n if (text.includes('\\u0000')) throw new Error(`Binary data cannot be safely redacted: ${relativePath}`);\n return text;\n}\n\nasync function redactTree(\n source: string,\n destination: string,\n serials: readonly string[],\n boundedHilog: string | null,\n): Promise<void> {\n await fs.mkdir(destination, { recursive: false, mode: 0o700 });\n try {\n const visit = async (directory: string): Promise<void> => {\n for (const entry of await fs.readdir(directory, { withFileTypes: true })) {\n const sourcePath = path.join(directory, entry.name);\n const relative = path.relative(source, sourcePath);\n const portableRelative = relative.split(path.sep).join('/');\n const destinationPath = path.join(destination, relative);\n if (entry.isDirectory()) {\n await fs.mkdir(destinationPath, { recursive: true, mode: 0o700 });\n await visit(sourcePath);\n } else if (entry.isFile()) {\n if (portableRelative === 'logs/hilog.txt') {\n const text = boundedHilog ?? 'HiLog omitted from this archive because the requested duration could not be reliably applied.\\n';\n await fs.mkdir(path.dirname(destinationPath), { recursive: true, mode: 0o700 });\n await fs.writeFile(destinationPath, redactLogText(text, serials), { encoding: 'utf8', mode: 0o600 });\n continue;\n }\n if (portableRelative === 'logs/hilog-filtered.txt' && boundedHilog === null) continue;\n const text = decodeText(await fs.readFile(sourcePath), relative);\n await fs.mkdir(path.dirname(destinationPath), { recursive: true, mode: 0o700 });\n await fs.writeFile(destinationPath, redactLogText(text, serials), { encoding: 'utf8', mode: 0o600 });\n }\n }\n };\n await visit(source);\n } catch (error) {\n await fs.rm(destination, { recursive: true, force: true });\n throw error;\n }\n}\n\nconst CRC_TABLE = new Uint32Array(256);\nfor (let i = 0; i < CRC_TABLE.length; i++) {\n let value = i;\n for (let bit = 0; bit < 8; bit++) value = value & 1 ? 0xedb88320 ^ (value >>> 1) : value >>> 1;\n CRC_TABLE[i] = value >>> 0;\n}\n\nfunction crc32(data: Buffer): number {\n let crc = 0xffffffff;\n for (const byte of data) crc = CRC_TABLE[(crc ^ byte) & 0xff]! ^ (crc >>> 8);\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nfunction dosDateTime(date: Date): { date: number; time: number } {\n const year = Math.max(1980, date.getFullYear());\n return {\n date: ((year - 1980) << 9) | ((date.getMonth() + 1) << 5) | date.getDate(),\n time: (date.getHours() << 11) | (date.getMinutes() << 5) | Math.floor(date.getSeconds() / 2),\n };\n}\n\nasync function writeZip(source: string, archivePath: string): Promise<void> {\n const files: string[] = [];\n const visit = async (directory: string): Promise<void> => {\n for (const entry of await fs.readdir(directory, { withFileTypes: true })) {\n const filePath = path.join(directory, entry.name);\n if (entry.isDirectory()) await visit(filePath);\n else if (entry.isFile()) files.push(filePath);\n }\n };\n await visit(source);\n const localParts: Buffer[] = [];\n const centralParts: Buffer[] = [];\n let offset = 0;\n const stamp = dosDateTime(new Date());\n\n for (const filePath of files) {\n const name = Buffer.from(path.relative(source, filePath).split(path.sep).join('/'), 'utf8');\n const data = await fs.readFile(filePath);\n const compressed = deflateRawSync(data);\n const checksum = crc32(data);\n const local = Buffer.alloc(30);\n local.writeUInt32LE(0x04034b50, 0); local.writeUInt16LE(20, 4); local.writeUInt16LE(0x0800, 6);\n local.writeUInt16LE(8, 8); local.writeUInt16LE(stamp.time, 10); local.writeUInt16LE(stamp.date, 12);\n local.writeUInt32LE(checksum, 14); local.writeUInt32LE(compressed.length, 18); local.writeUInt32LE(data.length, 22);\n local.writeUInt16LE(name.length, 26); local.writeUInt16LE(0, 28);\n localParts.push(local, name, compressed);\n\n const central = Buffer.alloc(46);\n central.writeUInt32LE(0x02014b50, 0); central.writeUInt16LE(20, 4); central.writeUInt16LE(20, 6);\n central.writeUInt16LE(0x0800, 8); central.writeUInt16LE(8, 10); central.writeUInt16LE(stamp.time, 12);\n central.writeUInt16LE(stamp.date, 14); central.writeUInt32LE(checksum, 16);\n central.writeUInt32LE(compressed.length, 20); central.writeUInt32LE(data.length, 24);\n central.writeUInt16LE(name.length, 28); central.writeUInt16LE(0, 30); central.writeUInt16LE(0, 32);\n central.writeUInt16LE(0, 34); central.writeUInt16LE(0, 36); central.writeUInt32LE(0, 38);\n central.writeUInt32LE(offset, 42);\n centralParts.push(central, name);\n offset += local.length + name.length + compressed.length;\n }\n\n const centralDirectory = Buffer.concat(centralParts);\n const end = Buffer.alloc(22);\n end.writeUInt32LE(0x06054b50, 0); end.writeUInt16LE(0, 4); end.writeUInt16LE(0, 6);\n end.writeUInt16LE(files.length, 8); end.writeUInt16LE(files.length, 10);\n end.writeUInt32LE(centralDirectory.length, 12); end.writeUInt32LE(offset, 16); end.writeUInt16LE(0, 20);\n await fs.writeFile(archivePath, Buffer.concat([...localParts, centralDirectory, end]), { flag: 'wx', mode: 0o600 });\n}\n\nfunction commandFailure(result: HdcExecResult): string | null {\n if (result.code !== 0) return `hdc exited with code ${result.code}`;\n if (result.stderr.trim()) return 'hdc wrote to stderr';\n const contentError = result.stdout.split(/\\r?\\n/).find((line) => FAILURE_TEXT.test(line))?.trim() ?? null;\n return contentError ? `command output indicates failure: ${contentError}` : null;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nasync function uniqueBundleDirectory(outputDirectory: string, stamp: string): Promise<string> {\n await fs.mkdir(outputDirectory, { recursive: true, mode: 0o700 });\n for (let suffix = 0; ; suffix++) {\n const name = `incident-${stamp}${suffix ? `-${suffix}` : ''}`;\n const directory = path.join(outputDirectory, name);\n try {\n await fs.mkdir(directory, { mode: 0o700 });\n return directory;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'EEXIST') throw error;\n }\n }\n}\n\nexport async function collectLogBundle(options: CollectLogBundleOptions): Promise<LogBundleResult> {\n if (options.packageName && !/^[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)+$/.test(options.packageName)) {\n throw new Error('packageName must be a reverse-DNS bundle name.');\n }\n if (options.pid && !/^[1-9]\\d*$/.test(options.pid)) throw new Error('pid must be a positive integer.');\n if (options.tag && !/^[^\\s/\\x00-\\x1f\\x7f]+$/.test(options.tag)) throw new Error('tag must be a single HiLog tag.');\n if (options.level && !LEVELS[options.level.toUpperCase()]) throw new Error('level is not a recognized HiLog level.');\n const durationSeconds = options.durationSeconds ?? 600;\n if (!Number.isSafeInteger(durationSeconds) || durationSeconds < 1 || durationSeconds > 31_536_000) {\n throw new Error('durationSeconds must be an integer between 1 and 31536000.');\n }\n\n const started = new Date();\n const stamp = started.toISOString().replace(/[-:]/g, '').replace(/\\.\\d{3}Z$/, 'Z');\n const bundleDirectory = await uniqueBundleDirectory(path.resolve(options.outputDirectory), stamp);\n const records: CommandRecord[] = [];\n const serials: string[] = [];\n let replacementWarning = false;\n const execute = options.execute ?? ((args, deviceSerial) => args[0] === 'shell'\n ? shellChecked({ config: options.config, command: args.slice(1).join(' '), deviceSerial })\n : hdcExec({ config: options.config, args, deviceSerial }));\n const manifest: Record<string, unknown> = {\n schemaVersion: '1.0',\n collectorVersion: VERSION,\n collectionStartUtc: started.toISOString(),\n collectionEndUtc: null,\n host: { os: process.platform },\n target: null,\n packageName: options.packageName ?? null,\n pid: options.pid ?? null,\n filters: {\n tag: options.tag ?? null,\n level: options.level ?? null,\n pid: options.pid ?? null,\n packageName: options.packageName ?? null,\n durationSeconds,\n },\n filterStatus: {\n duration: 'not-applied',\n packageName: options.packageName ? 'failed' : 'not-requested',\n pid: options.pid ? 'not-applied' : 'not-requested',\n tag: options.tag ? 'not-applied' : 'not-requested',\n level: options.level ? 'not-applied' : 'not-requested',\n },\n hilogWindowApplied: false,\n redactionRequested: options.redact,\n redactionStatus: options.redact ? 'pending' : 'not-requested',\n archiveStatus: { status: 'pending', path: null },\n commands: records,\n files: [],\n notes: [\n 'Collection is read-only on the target device.',\n 'hilog -x captures the current device buffer; duration is applied locally against device time when log timestamps are recognized.',\n 'Redaction is heuristic and does not guarantee that a bundle is safe to publish.',\n ],\n };\n\n const run = async (name: string, relativeOutput: string, args: readonly string[], deviceSerial?: string): Promise<CommandRecord> => {\n const outputPath = path.join(bundleDirectory, relativeOutput);\n await fs.mkdir(path.dirname(outputPath), { recursive: true, mode: 0o700 });\n let result: HdcExecResult | null = null;\n let failure: string | null = null;\n try {\n result = await execute(args, deviceSerial);\n await fs.writeFile(outputPath, result.stdout, { encoding: 'utf8', mode: 0o600 });\n if (result.stderr) await fs.writeFile(`${outputPath}.stderr.txt`, result.stderr, { encoding: 'utf8', mode: 0o600 });\n if (result.stdout.includes('\\ufffd') || result.stderr.includes('\\ufffd')) {\n replacementWarning = true;\n (manifest.notes as string[]).push(`${name} output contains Unicode replacement characters; review the redacted evidence before sharing.`);\n }\n failure = commandFailure(result);\n } catch (error) {\n failure = errorMessage(error);\n await fs.writeFile(outputPath, '', { encoding: 'utf8', mode: 0o600 });\n }\n const record: CommandRecord = {\n name,\n status: failure ? 'failed' : 'success',\n output: relativeOutput,\n stderr: result?.stderr ? `${relativeOutput}.stderr.txt` : null,\n exitCode: result?.code ?? null,\n error: failure,\n };\n records.push(record);\n return record;\n };\n\n const targetRecord = await run('list-targets', 'device/targets.txt', ['list', 'targets', '-v']);\n const targetOutput = await fs.readFile(path.join(bundleDirectory, 'device/targets.txt'), 'utf8').catch(() => '');\n const targets = parseDeviceList(targetOutput).filter((target) => target.status === 'Connected' || target.status === 'Unknown');\n serials.push(...parseDeviceList(targetOutput).map((target) => target.serial));\n const requestedDevice = resolveDeviceSerial(options.deviceSerial);\n let selectedDevice: string | null = null;\n let targetError: string | null = null;\n if (targetRecord.status !== 'success') targetError = targetRecord.error ?? 'hdc target discovery failed';\n else if (requestedDevice) {\n selectedDevice = targets.find((target) => target.serial === requestedDevice)?.serial ?? null;\n if (!selectedDevice) targetError = 'selected device was not discovered as connected';\n } else if (targets.length === 0) targetError = 'hdc did not discover a connected device';\n else if (targets.length > 1) targetError = 'multiple devices are connected; specify --device';\n else selectedDevice = targets[0]!.serial;\n\n let boundedHilog: string | null = null;\n let durationApplied = false;\n let durationFailureReason = 'device clock or HiLog collection failed';\n if (targetError) {\n targetRecord.status = 'failed';\n targetRecord.error = targetError;\n (manifest.notes as string[]).push('Device collection stopped because target discovery did not identify exactly one selected connected device.');\n } else {\n manifest.target = selectedDevice;\n const shell = (args: readonly string[]) => run(args[0]!, args[1]!, args.slice(2), selectedDevice!);\n const captureStartedHostMs = Date.now();\n const deviceTimeBefore = await shell([\n 'device-time-before', 'device/device-time-before.txt', 'shell', 'date', '+%Y-%m-%dT%H:%M:%S',\n ]);\n const hilog = await shell(['hilog-snapshot', 'logs/hilog.txt', 'shell', 'hilog', '-x']);\n const deviceTimeAfter = await shell([\n 'device-time-after', 'device/device-time-after.txt', 'shell', 'date', '+%Y-%m-%dT%H:%M:%S',\n ]);\n const hostElapsedMs = Date.now() - captureStartedHostMs;\n if (deviceTimeBefore.status === 'success' && hilog.status === 'success' && deviceTimeAfter.status === 'success') {\n const [beforeText, afterText, fullHilog] = await Promise.all([\n fs.readFile(path.join(bundleDirectory, 'device/device-time-before.txt'), 'utf8'),\n fs.readFile(path.join(bundleDirectory, 'device/device-time-after.txt'), 'utf8'),\n fs.readFile(path.join(bundleDirectory, 'logs/hilog.txt'), 'utf8'),\n ]);\n const window = filterHilogWindow(fullHilog, beforeText, afterText, durationSeconds, hostElapsedMs);\n if (window.text === null) durationFailureReason = window.reason;\n else boundedHilog = window.text;\n } else if (deviceTimeBefore.status !== 'success' || deviceTimeAfter.status !== 'success') {\n durationFailureReason = 'device clock could not be read';\n } else if (hilog.status !== 'success') {\n durationFailureReason = 'HiLog snapshot collection failed';\n }\n durationApplied = boundedHilog !== null;\n manifest.hilogWindowApplied = durationApplied;\n const faultArgs = options.packageName\n ? ['faultlog', 'logs/faultlog.txt', 'shell', 'hidumper', '-e', '--print', options.packageName, '-n', '5']\n : ['faultlog', 'logs/faultlog.txt', 'shell', 'hidumper', '-e', '--list', '-n', '20'];\n const faultlog = await shell(faultArgs);\n manifest.filterStatus = {\n duration: durationApplied ? 'applied' : 'not-applied',\n packageName: options.packageName ? (faultlog.status === 'success' ? 'applied' : 'failed') : 'not-requested',\n pid: options.pid ? 'not-applied' : 'not-requested',\n tag: options.tag ? 'not-applied' : 'not-requested',\n level: options.level ? 'not-applied' : 'not-requested',\n };\n if (!durationApplied) {\n (manifest.notes as string[]).push(\n `HiLog duration was not applied (${durationFailureReason}); the full snapshot is kept only in the local raw bundle and omitted from the redacted archive.`,\n );\n } else if (boundedHilog !== null && (options.pid || options.tag || options.level)) {\n const filtered = filterHilog(boundedHilog, { pid: options.pid, tag: options.tag, level: options.level });\n if (filtered) {\n await fs.writeFile(path.join(bundleDirectory, 'logs/hilog-filtered.txt'), filtered.text, { encoding: 'utf8', mode: 0o600 });\n const status = manifest.filterStatus as Record<string, string>;\n for (const key of filtered.applied) status[key] = 'applied';\n } else {\n (manifest.notes as string[]).push('Requested HiLog PID/tag/level filters were not applied because the windowed snapshot format could not be parsed reliably.');\n }\n }\n await shell(['device-name', 'device/device-info.txt', 'shell', 'param', 'get', 'const.product.name']);\n await shell(['process-list', 'device/process-list.txt', 'shell', 'ps', '-ef']);\n await shell(['memory', 'device/memory.txt', 'shell', 'hidumper', '--mem']);\n await shell(['threads', 'device/threads.txt', 'shell', 'hidumper', '-p']);\n }\n\n const ended = new Date();\n manifest.collectionEndUtc = ended.toISOString();\n const files = records.flatMap((record) => [record.output, record.stderr].filter((file): file is string => Boolean(file)));\n files.push('manifest.json', 'notes.txt');\n if (await fs.access(path.join(bundleDirectory, 'logs/hilog-filtered.txt')).then(() => true, () => false)) {\n files.push('logs/hilog-filtered.txt');\n }\n manifest.files = files;\n await fs.writeFile(path.join(bundleDirectory, 'notes.txt'), 'Add reproduction steps and precise event timestamps here.\\n', { encoding: 'utf8', mode: 0o600 });\n\n const durationFailure = !durationApplied;\n const criticalFailure = Boolean(targetError) || records.some((record) => record.name === 'hilog-snapshot' && record.status !== 'success');\n const anyCommandFailure = records.some((record) => record.status !== 'success');\n let redactedDirectory: string | null = null;\n let archivePath: string | null = null;\n let bundleError: string | undefined;\n\n try {\n if (options.redact) {\n redactedDirectory = `${bundleDirectory}-redacted`;\n manifest.redactionStatus = replacementWarning ? 'review-required' : 'success';\n manifest.archiveStatus = { status: 'success', path: `${path.basename(redactedDirectory)}.zip` };\n await fs.writeFile(path.join(bundleDirectory, 'manifest.json'), `${JSON.stringify(manifest, null, 2)}\\n`, { encoding: 'utf8', mode: 0o600 });\n await redactTree(bundleDirectory, redactedDirectory, serials, boundedHilog);\n archivePath = `${redactedDirectory}.zip`;\n await writeZip(redactedDirectory, archivePath);\n } else {\n archivePath = `${bundleDirectory}.zip`;\n manifest.archiveStatus = { status: 'success', path: path.basename(archivePath) };\n await fs.writeFile(path.join(bundleDirectory, 'manifest.json'), `${JSON.stringify(manifest, null, 2)}\\n`, { encoding: 'utf8', mode: 0o600 });\n await writeZip(bundleDirectory, archivePath);\n }\n } catch (error) {\n bundleError = options.redact ? `redaction or archive creation failed: ${errorMessage(error)}` : `archive creation failed: ${errorMessage(error)}`;\n archivePath = null;\n manifest.redactionStatus = options.redact ? 'failed' : 'not-requested';\n manifest.archiveStatus = { status: 'failed', path: null };\n (manifest.notes as string[]).push(bundleError);\n await fs.rm(`${redactedDirectory ?? bundleDirectory}.zip`, { force: true }).catch(() => undefined);\n if (redactedDirectory) await fs.rm(redactedDirectory, { recursive: true, force: true }).catch(() => undefined);\n await fs.writeFile(path.join(bundleDirectory, 'manifest.json'), `${JSON.stringify(manifest, null, 2)}\\n`, { encoding: 'utf8', mode: 0o600 });\n redactedDirectory = null;\n }\n\n return {\n bundleDirectory,\n archivePath,\n redactedDirectory,\n complete: !criticalFailure && !anyCommandFailure && !bundleError && !replacementWarning && !durationFailure,\n error: bundleError ?? (criticalFailure ? targetError ?? 'HiLog collection failed' : replacementWarning\n ? 'Captured output contains Unicode replacement characters; review the manifest before sharing.'\n : durationFailure ? `HiLog duration was not applied (${durationFailureReason}); the redacted archive omits the full snapshot.`\n : undefined),\n };\n}\n\nfunction parseDeviceClock(value: string): number | null {\n const match = /^\\s*(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})\\s*$/.exec(value);\n if (!match) return null;\n const [, year, month, day, hour, minute, second] = match;\n const timestamp = Date.UTC(Number(year), Number(month) - 1, Number(day), Number(hour), Number(minute), Number(second));\n const date = new Date(timestamp);\n return date.getUTCFullYear() === Number(year) && date.getUTCMonth() === Number(month) - 1 &&\n date.getUTCDate() === Number(day) && Number(hour) < 24 && Number(minute) < 60 && Number(second) < 60\n ? timestamp\n : null;\n}\n\nfunction parseHilogTimestamp(datePart: string, timePart: string, referenceMs: number): number | null {\n if (!validateDate(datePart, timePart)) return null;\n const [month, day] = datePart.split('-').map(Number);\n const [hour, minute, second, millisecond] = timePart.split(/[:.]/).map(Number);\n const referenceYear = new Date(referenceMs).getUTCFullYear();\n const candidates = [referenceYear - 1, referenceYear, referenceYear + 1]\n .map((year) => Date.UTC(year, month! - 1, day!, hour!, minute!, second!, millisecond!))\n .filter((timestamp) => {\n const candidate = new Date(timestamp);\n return candidate.getUTCMonth() === month! - 1 && candidate.getUTCDate() === day;\n })\n .sort((left, right) => Math.abs(left - referenceMs) - Math.abs(right - referenceMs));\n const closest = candidates[0];\n return closest !== undefined && closest <= referenceMs + 2_000 ? closest : null;\n}\n\nexport type HilogWindowResult = { text: string; reason?: undefined } | { text: null; reason: string };\n\nexport function filterHilogWindow(\n input: string,\n deviceClockBefore: string,\n deviceClockAfter: string,\n durationSeconds: number,\n hostElapsedMs: number,\n): HilogWindowResult {\n if (!Number.isSafeInteger(durationSeconds) || durationSeconds < 1 || durationSeconds > 31_536_000) {\n return { text: null, reason: 'requested duration is invalid' };\n }\n const beforeMs = parseDeviceClock(deviceClockBefore);\n const afterMs = parseDeviceClock(deviceClockAfter);\n if (beforeMs === null || afterMs === null) return { text: null, reason: 'device clock output was not recognized' };\n const deviceElapsedMs = afterMs - beforeMs;\n if (deviceElapsedMs < -1_000 || deviceElapsedMs > Math.max(0, hostElapsedMs) + 5_000) {\n return { text: null, reason: 'device clock changed inconsistently during capture' };\n }\n\n const windowEnd = afterMs + 999;\n const windowStart = windowEnd - durationSeconds * 1_000;\n let sawRecord = false;\n let keep = false;\n let output = '';\n for (const line of input.match(/[^\\n]*\\n|[^\\n]+$/g) ?? []) {\n const content = line.replace(/[\\r\\n]+$/, '');\n const match = HILOG_RECORD.exec(content);\n if (match?.groups) {\n if (!validateDate(match.groups.date!, match.groups.time!)) {\n return { text: null, reason: 'HiLog contains an invalid timestamp' };\n }\n const timestamp = parseHilogTimestamp(match.groups.date!, match.groups.time!, afterMs);\n if (timestamp === null || timestamp > windowEnd) {\n return { text: null, reason: 'HiLog timestamps do not agree with the device clock' };\n }\n sawRecord = true;\n keep = timestamp >= windowStart;\n } else if (/^-{3,}\\s*beginning of\\b/i.test(content.trim())) {\n continue;\n } else if (/^\\s*\\[?\\d{1,4}[-/]/.test(content) || /^\\s*\\d{2}:\\d{2}:\\d{2}/.test(content)) {\n return { text: null, reason: 'HiLog contains timestamped lines in an unrecognized format' };\n } else if (!sawRecord && content.trim()) {\n return { text: null, reason: 'HiLog contains unclassified lines before the first record' };\n }\n if (keep) output += line;\n }\n return sawRecord ? { text: output } : { text: null, reason: 'no recognized timestamped HiLog records were found' };\n}\n","import { Command } from 'commander';\nimport { getHdcPath, hdcTargetArgsFor, spawnCompat } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\n/** The argv for the passthrough: verbatim when the caller already picked a target with `-t`. */\nexport function hdcPassthroughArgv(args: readonly string[], device?: string): string[] {\n return args[0] === '-t' ? [...args] : [...hdcTargetArgsFor(args, device), ...args];\n}\n\nexport function registerHdcCommand(program: Command): void {\n program\n .command('hdc')\n .description(\n 'Run the hdc binary oniro-app itself uses (see `cmdtools status`), addressed at --device or ' +\n 'ONIRO_DEVICE_SERIAL, with stdio passed through. Exits with hdc\\'s own code, which is 0 even for ' +\n 'a `[Fail]` line. Example: oniro-app hdc shell param get const.ohos.apiversion',\n )\n .argument('[args...]', 'hdc arguments, passed through verbatim')\n .option('--device <serial>', 'Target device serial.')\n .option('--path', 'Print the hdc binary path and exit.')\n .passThroughOptions()\n .allowUnknownOption()\n .action(async (args: string[], opts: { device?: string; path?: boolean }) => {\n const { config } = getRuntime();\n const hdc = getHdcPath(config);\n if (opts.path) {\n process.stdout.write(`${hdc}\\n`);\n return;\n }\n await new Promise<void>((resolve, reject) => {\n const child = spawnCompat(hdc, hdcPassthroughArgv(args, opts.device), { stdio: 'inherit' });\n child.on('error', (err) => reject(new Error(`Failed to run ${hdc}: ${err.message}`)));\n child.on('close', (code) => {\n process.exitCode = code ?? 1;\n resolve();\n });\n });\n });\n}\n"],"mappings":"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","names":["Command","OniroError","path","downloadAndInstallSdk","downloadAndInstallSdk","path","result","createHarmonyOsSession","createHarmonyOsSession","path","OniroError","OniroError","path","ALL_SDKS","fs","path","ALL_SDKS","Option","Option","fs","path","describeLayoutNode","describeLayoutNode","shot","os","path","detectRuntimeOs","detectRuntimeOs","Option","describeLayoutNode","Option","describeLayoutNode","os","path","fs","path","relative","text","resolve","Command","OniroError"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oniroproject/oniro-app",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "description": "Cross-platform CLI for Oniro/OpenHarmony application development.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -24,7 +24,7 @@
24
24
  "clean": "rm -rf dist"
25
25
  },
26
26
  "dependencies": {
27
- "@oniroproject/core": "0.15.0",
27
+ "@oniroproject/core": "0.16.0",
28
28
  "commander": "^12.1.0",
29
29
  "sharp": "^0.34.5"
30
30
  },