@oniroproject/oniro-app 0.8.1 → 0.9.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 +32 -3
- package/dist/oniro-app.js +24 -7
- package/dist/oniro-app.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -60,7 +60,7 @@ Install commands are idempotent (they skip when already present); pass `--force`
|
|
|
60
60
|
|
|
61
61
|
| Command | Description |
|
|
62
62
|
| --- | --- |
|
|
63
|
-
| `sdk install <version> [--force]` | Download and install an OpenHarmony SDK (e.g. `6.1`). |
|
|
63
|
+
| `sdk install <version> [--force] [--tmp-dir <path>]` | Download and install an OpenHarmony SDK (e.g. `6.1`). `--tmp-dir` overrides where download/extract temporaries go (see [Temporary space](#temporary-space)). |
|
|
64
64
|
| `sdk list [--json]` | List known SDK versions; an `*` marks installed ones. |
|
|
65
65
|
| `sdk remove <api>` | Remove an installed SDK by API level (e.g. `18`, `20`). |
|
|
66
66
|
|
|
@@ -68,7 +68,7 @@ Install commands are idempotent (they skip when already present); pass `--force`
|
|
|
68
68
|
|
|
69
69
|
| Command | Description |
|
|
70
70
|
| --- | --- |
|
|
71
|
-
| `cmdtools install [--from-zip <path>] [--force]` | Install the tools. `--from-zip` installs from a local archive instead of downloading (required on Windows/macOS — see [Configuration](#configuration)). |
|
|
71
|
+
| `cmdtools install [--from-zip <path>] [--force] [--tmp-dir <path>]` | Install the tools. `--from-zip` installs from a local archive instead of downloading (required on Windows/macOS — see [Configuration](#configuration)); `--tmp-dir` overrides where download/extract temporaries go (see [Temporary space](#temporary-space)). |
|
|
72
72
|
| `cmdtools status [--json]` | Report whether the tools are installed and their version. Exits non-zero when not installed. |
|
|
73
73
|
| `cmdtools remove` | Delete the configured command-line-tools directory. |
|
|
74
74
|
|
|
@@ -76,7 +76,7 @@ Install commands are idempotent (they skip when already present); pass `--force`
|
|
|
76
76
|
|
|
77
77
|
| Command | Description |
|
|
78
78
|
| --- | --- |
|
|
79
|
-
| `emulator install [--force]` | Download and install the emulator. |
|
|
79
|
+
| `emulator install [--force] [--tmp-dir <path>]` | Download and install the emulator. `--tmp-dir` overrides where the downloaded ZIP goes (see [Temporary space](#temporary-space)). |
|
|
80
80
|
| `emulator start [options]` | Start the emulator via the bundled launcher and detach, so the CLI can exit while it keeps running. |
|
|
81
81
|
| `emulator stop` | Kill running emulator processes. |
|
|
82
82
|
| `emulator connect [--address <host:port>]` | Attempt an `hdc` connection (default `127.0.0.1:55555`). |
|
|
@@ -297,9 +297,38 @@ The CLI reads paths and URLs from environment variables. All are optional; defau
|
|
|
297
297
|
| `ONIRO_CMD_TOOLS_URL_WINDOWS` | (unset) | Self-hosted Windows cmd-tools URL |
|
|
298
298
|
| `ONIRO_CMD_TOOLS_URL_MAC` | (unset) | Self-hosted macOS cmd-tools URL |
|
|
299
299
|
| `ONIRO_EMULATOR_URL` | Latest `oniro_emulator.zip` | Emulator download URL |
|
|
300
|
+
| `ONIRO_TMP_DIR` | `<install root>/.oniro-tmp` | Scratch directory for download/extract temporaries (see [Temporary space](#temporary-space)) |
|
|
300
301
|
| `ONIRO_APPLICATION_CERT_PATH` | (unset) | External application-cert chain to use when signing system apps |
|
|
301
302
|
| `ONIRO_DEBUG` | (unset) | Set to `1` for full stack traces on error |
|
|
302
303
|
|
|
304
|
+
### Temporary space
|
|
305
|
+
|
|
306
|
+
`sdk install`, `cmdtools install`, and `emulator install` download a multi-GB archive and
|
|
307
|
+
extract it in a scratch directory before moving the result into place. That scratch directory
|
|
308
|
+
lives **next to the install target** — `.oniro-tmp` beside the SDK root, the command-line-tools
|
|
309
|
+
directory, or the emulator directory — for two reasons:
|
|
310
|
+
|
|
311
|
+
- The system temp dir is not involved. On many Linux systems `/tmp` is a **RAM-backed `tmpfs`**
|
|
312
|
+
sized from available memory, so a machine with plenty of disk but little free RAM would run
|
|
313
|
+
out of "disk" mid-download.
|
|
314
|
+
- Temporaries and their destination share a filesystem, so finishing an install is a rename
|
|
315
|
+
rather than a multi-GB copy across a device boundary.
|
|
316
|
+
|
|
317
|
+
Override it per command or globally when the install target's filesystem is the cramped one:
|
|
318
|
+
|
|
319
|
+
```bash
|
|
320
|
+
oniro-app cmdtools install --tmp-dir ~/.cache/oniro-tmp
|
|
321
|
+
export ONIRO_TMP_DIR=~/.cache/oniro-tmp # applies to all three install commands
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
Precedence is `--tmp-dir` → `ONIRO_TMP_DIR` → `<install root>/.oniro-tmp`. The directory is
|
|
325
|
+
created if it does not exist; the per-run folder inside it is removed afterwards, and so is
|
|
326
|
+
`.oniro-tmp` itself once empty. If the install target's parent cannot be written to at all
|
|
327
|
+
(a root-owned prefix, a read-only mount), the system temp dir is used instead and the CLI says
|
|
328
|
+
so. When space runs short, the install fails with a message naming the directory, how much room
|
|
329
|
+
it needed, whether that directory is RAM-backed, and this flag — rather than crashing part-way
|
|
330
|
+
through.
|
|
331
|
+
|
|
303
332
|
**Command-line tools on Windows / macOS.** The Huawei mirror only publishes a Linux build of the command-line tools. On Windows and macOS you must either download the ZIP manually from the Huawei developer portal and install it with `oniro-app cmdtools install --from-zip path/to/commandline-tools-<platform>.zip`, or host the archive yourself and set `ONIRO_CMD_TOOLS_URL_WINDOWS` / `ONIRO_CMD_TOOLS_URL_MAC` so `cmdtools install` can fetch it.
|
|
304
333
|
|
|
305
334
|
## Signing apps that need system permissions
|
package/dist/oniro-app.js
CHANGED
|
@@ -71,6 +71,7 @@ var ENV_VAR_BY_KEY = {
|
|
|
71
71
|
cmdToolsUrlWindows: "ONIRO_CMD_TOOLS_URL_WINDOWS",
|
|
72
72
|
cmdToolsUrlMac: "ONIRO_CMD_TOOLS_URL_MAC",
|
|
73
73
|
emulatorUrl: "ONIRO_EMULATOR_URL",
|
|
74
|
+
tmpDir: "ONIRO_TMP_DIR",
|
|
74
75
|
sdkUrlBase: "ONIRO_SDK_URL_BASE",
|
|
75
76
|
applicationCertPath: "ONIRO_APPLICATION_CERT_PATH"
|
|
76
77
|
};
|
|
@@ -102,7 +103,10 @@ function getRuntime() {
|
|
|
102
103
|
// src/commands/sdk.ts
|
|
103
104
|
function registerSdkCommand(program) {
|
|
104
105
|
const sdk = program.command("sdk").description("Manage OpenHarmony SDK installs.");
|
|
105
|
-
sdk.command("install <version>").description("Download and install an OpenHarmony SDK. Skips if already installed.").option("--force", "Reinstall even if the SDK is already present.").
|
|
106
|
+
sdk.command("install <version>").description("Download and install an OpenHarmony SDK. Skips if already installed.").option("--force", "Reinstall even if the SDK is already present.").option(
|
|
107
|
+
"--tmp-dir <path>",
|
|
108
|
+
"Directory for download/extract temporaries (default: ONIRO_TMP_DIR, else .oniro-tmp next to the install target). Use this when that filesystem is short on space."
|
|
109
|
+
).action(async (version, opts) => {
|
|
106
110
|
const { config, logger, progress } = getRuntime();
|
|
107
111
|
const release = ALL_SDKS.find((s) => s.version === version);
|
|
108
112
|
if (!release) {
|
|
@@ -118,7 +122,14 @@ function registerSdkCommand(program) {
|
|
|
118
122
|
return;
|
|
119
123
|
}
|
|
120
124
|
logger.info(`Installing OpenHarmony SDK ${release.version} (api ${release.api})...`);
|
|
121
|
-
await downloadAndInstallSdk({
|
|
125
|
+
await downloadAndInstallSdk({
|
|
126
|
+
config,
|
|
127
|
+
version: release.version,
|
|
128
|
+
api: release.api,
|
|
129
|
+
progress,
|
|
130
|
+
logger,
|
|
131
|
+
tmpDir: opts.tmpDir
|
|
132
|
+
});
|
|
122
133
|
logger.info("SDK installed.");
|
|
123
134
|
});
|
|
124
135
|
sdk.command("list").description("List known SDK versions and whether they are installed on this machine.").option("--json", "Emit machine-readable JSON instead of a table.").action((opts) => {
|
|
@@ -148,14 +159,17 @@ function registerSdkCommand(program) {
|
|
|
148
159
|
import { getCmdToolsStatus, installCmdTools, isCmdToolsInstalled, removeCmdTools } from "@oniroproject/core";
|
|
149
160
|
function registerCmdToolsCommand(program) {
|
|
150
161
|
const cmdtools = program.command("cmdtools").description("Manage OpenHarmony command-line tools.");
|
|
151
|
-
cmdtools.command("install").description("Install the OpenHarmony command-line tools (hvigorw, ohpm, hdc). Skips if already installed.").option("--from-zip <path>", "Install from a local ZIP instead of downloading.").option("--force", "Reinstall even if the tools are already present.").
|
|
162
|
+
cmdtools.command("install").description("Install the OpenHarmony command-line tools (hvigorw, ohpm, hdc). Skips if already installed.").option("--from-zip <path>", "Install from a local ZIP instead of downloading.").option("--force", "Reinstall even if the tools are already present.").option(
|
|
163
|
+
"--tmp-dir <path>",
|
|
164
|
+
"Directory for download/extract temporaries (default: ONIRO_TMP_DIR, else .oniro-tmp next to the install target). Use this when that filesystem is short on space."
|
|
165
|
+
).action(async (opts) => {
|
|
152
166
|
const { config, logger, progress } = getRuntime();
|
|
153
167
|
if (isCmdToolsInstalled(config) && !opts.force) {
|
|
154
168
|
logger.info("Command-line tools already installed; pass --force to reinstall.");
|
|
155
169
|
return;
|
|
156
170
|
}
|
|
157
171
|
logger.info("Installing OpenHarmony command-line tools...");
|
|
158
|
-
await installCmdTools({ config, progress, logger, localZipPath: opts.fromZip });
|
|
172
|
+
await installCmdTools({ config, progress, logger, localZipPath: opts.fromZip, tmpDir: opts.tmpDir });
|
|
159
173
|
logger.info("Command-line tools installed.");
|
|
160
174
|
});
|
|
161
175
|
cmdtools.command("status").description("Report whether the command-line tools are installed and their version.").option("--json", "Emit machine-readable JSON.").action((opts) => {
|
|
@@ -188,14 +202,17 @@ import {
|
|
|
188
202
|
} from "@oniroproject/core";
|
|
189
203
|
function registerEmulatorCommand(program) {
|
|
190
204
|
const emu = program.command("emulator").description("Manage the Oniro emulator.");
|
|
191
|
-
emu.command("install").description("Download and install the Oniro emulator (QEMU-based). Skips if already installed.").option("--force", "Reinstall even if the emulator is already present.").
|
|
205
|
+
emu.command("install").description("Download and install the Oniro emulator (QEMU-based). Skips if already installed.").option("--force", "Reinstall even if the emulator is already present.").option(
|
|
206
|
+
"--tmp-dir <path>",
|
|
207
|
+
"Directory for the downloaded ZIP (default: ONIRO_TMP_DIR, else .oniro-tmp next to the install target). Use this when that filesystem is short on space."
|
|
208
|
+
).action(async (opts) => {
|
|
192
209
|
const { config, logger, progress } = getRuntime();
|
|
193
210
|
if (isEmulatorInstalled(config) && !opts.force) {
|
|
194
211
|
logger.info("Emulator already installed; pass --force to reinstall.");
|
|
195
212
|
return;
|
|
196
213
|
}
|
|
197
214
|
logger.info("Installing Oniro emulator...");
|
|
198
|
-
await installEmulator({ config, progress, logger });
|
|
215
|
+
await installEmulator({ config, progress, logger, tmpDir: opts.tmpDir });
|
|
199
216
|
logger.info("Emulator installed.");
|
|
200
217
|
});
|
|
201
218
|
emu.command("start").description("Start the Oniro emulator via the bundled launcher (run.sh / run.bat). Detaches so the CLI can exit while the emulator keeps running.").option("--headless", "Launch headless (VNC + telnet serial, no local window). Required in CI.").option("--log <path>", "Redirect launcher stdout/stderr to this file. Defaults to discarding output.").option("--wait-for-hdc <seconds>", "Wait up to N seconds for hdc to connect. 0 = do not wait.", (v) => parseInt(v, 10), 0).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).").action(async (opts) => {
|
|
@@ -884,7 +901,7 @@ function registerInputCommand(program) {
|
|
|
884
901
|
}
|
|
885
902
|
|
|
886
903
|
// src/bin/oniro-app.ts
|
|
887
|
-
var CLI_VERSION = "0.
|
|
904
|
+
var CLI_VERSION = "0.9.0";
|
|
888
905
|
function buildProgram() {
|
|
889
906
|
const program = new Command4().name("oniro-app").description(
|
|
890
907
|
"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."
|
package/dist/oniro-app.js.map
CHANGED
|
@@ -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/app.ts","../src/commands/create.ts","../src/lib/templateRoot.ts","../src/commands/templates.ts","../src/commands/reboot.ts","../src/commands/wait.ts","../src/commands/watch.ts","../src/commands/screenshot.ts","../src/lib/screenshotImage.ts","../src/commands/dump.ts","../src/commands/devices.ts","../src/commands/file.ts","../src/commands/lint.ts","../src/commands/input.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 { 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';\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\n registerSdkCommand(program);\n registerCmdToolsCommand(program);\n registerEmulatorCommand(program);\n registerBuildCommand(program);\n registerSignCommand(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\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 downloadAndInstallSdk,\n getOsFolder,\n getSdkRootDir,\n getSupportedSdksForUi,\n removeSdk,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\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('Download and install an OpenHarmony SDK. Skips if already installed.')\n .option('--force', 'Reinstall even if the SDK is already present.')\n .action(async (version: string, opts: { force?: boolean }) => {\n const { config, logger, progress } = getRuntime();\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({ config, version: release.version, api: release.api, progress, logger });\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 sdkUrlBase: 'ONIRO_SDK_URL_BASE',\n applicationCertPath: 'ONIRO_APPLICATION_CERT_PATH',\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 .action(async (opts: { fromZip?: string; force?: boolean }) => {\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 });\n logger.info('Command-line tools installed.');\n });\n\n cmdtools\n .command('status')\n .description('Report whether the command-line tools are installed and their version.')\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 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 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 .action(async (opts: { force?: boolean }) => {\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 });\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('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 { buildHap } 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 json?: boolean;\n}\n\nexport function registerBuildCommand(program: Command): void {\n program\n .command('build [project-dir]')\n .description('Build an OpenHarmony app via hvigorw. Defaults to the current directory.')\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('--json', 'emit the build result (discovered HAPs, warnings) as JSON')\n .action(async (projectDir: string | undefined, opts: BuildOpts) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n logger.info(`Building project at ${dir}...`);\n const result = await 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 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 generateSigningConfigs,\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 ].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 .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 (\n projectDir: string | undefined,\n opts: {\n apl: Apl;\n appFeature?: AppFeature;\n acls?: string[];\n bootstrap?: boolean;\n storePassword?: string;\n keyPassword?: 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.bootstrap) {\n const result = prepareSigning({\n config,\n projectDir: dir,\n apl: opts.apl,\n appFeature: opts.appFeature,\n acls: opts.acls,\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 passwords,\n logger,\n });\n logger.info('Signing configs generated.');\n },\n );\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport { installApp, launchApp, uninstallApp, forceStop, applyChanges, getBundleName } 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]')\n .description('Install the signed .hap on the connected device/emulator via hdc.')\n .option('--hap <path>', 'Override the .hap path (relative to project-dir or absolute).')\n .action(async (projectDir: string | undefined, opts: { hap?: string }) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n logger.info(`Installing app from ${dir}...`);\n await installApp({ config, projectDir: dir, hapPath: opts.hap, logger });\n logger.info('App installed.');\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]')\n .description(\n 'Install a HAP and verify the running process took the change. Handles sign-info mismatch, ' +\n 'asset-cache invalidation, and persistent-bundle restart.',\n )\n .option('--bundle <bundle>', 'Bundle name to apply changes to. Defaults to the bundleName in the project AppScope/app.json5.')\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 (projectDir: string | undefined, opts: ApplyOpts) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n const bundle = opts.bundle ?? getBundleName(dir);\n const result = await applyChanges({\n config,\n bundle,\n hapPath: opts.hap,\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 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 } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\ninterface WaitOpts {\n log?: string;\n boot?: boolean;\n bundle?: string;\n pidOf?: string;\n domain?: string;\n timeout: string;\n device?: string;\n json?: boolean;\n}\n\nexport function registerWaitCommand(program: Command): void {\n program\n .command('wait')\n .description('Wait for a device condition: a log line (--log), boot (--boot), or a bundle to start (--bundle).')\n .option('--log <pattern>', 'Resolve when a hilog line (tag: message) matches this regex.')\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 .option('--timeout <ms>', 'Max wait, ms.', '30000')\n .option('--device <serial>', 'Target device serial.')\n .option('--json', 'With --log: emit the matched entry as JSON.')\n .action(async (opts: WaitOpts) => {\n const { config, logger } = getRuntime();\n const timeoutMs = Number(opts.timeout);\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 logger,\n });\n if (opts.json) process.stdout.write(`${JSON.stringify(entry, null, 2)}\\n`);\n else logger.info(`matched: ${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 (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, or --bundle <bundle>.');\n });\n}\n","import { Command } from 'commander';\nimport { watchLog } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\ninterface WatchOpts {\n log?: string;\n for: 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 hilog lines matching a pattern for 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('--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 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 } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport { renderWithGrid, buildContactSheet, frameDiffs } from '../lib/screenshotImage.js';\n\ninterface ScreenshotOpts {\n output: string;\n grid?: boolean;\n maxDim: 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\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 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 '--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 / --contact-sheet (256-4096).', '1024')\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 // --- 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\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';\n\ninterface DumpOpts {\n bundle?: string;\n raw?: boolean;\n device?: string;\n}\n\nexport function registerDumpCommand(program: Command): void {\n program\n .command('dump [target]')\n .description('Dump device state as JSON. Currently supports `dump layout` (the default target).')\n .option('--bundle <bundle>', 'Filter the layout to a single window/bundle.')\n .option('--raw', 'Return the unpruned layout 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 const result = await dumpLayout({\n config,\n bundleName: opts.bundle,\n prune: !opts.raw,\n deviceSerial: opts.device,\n logger,\n });\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n });\n}\n","import { Command } from 'commander';\nimport { listDevices } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerDevicesCommand(program: Command): void {\n program\n .command('devices')\n .description('List connected hdc devices.')\n .option('--json', 'Emit machine-readable JSON.')\n .action(async (opts: { json?: boolean }) => {\n const { config } = getRuntime();\n const devices = await listDevices(config);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(devices, 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(`${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('Push a local file to the device.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (local: string, remote: string, opts: { device?: string }) => {\n const { config, logger } = getRuntime();\n await sendFile({ config, local, remote, deviceSerial: opts.device, logger });\n logger.info(`Sent ${local} -> ${remote}.`);\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 { runCodelinter } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\ninterface LintOpts {\n files?: string[];\n json?: boolean;\n}\n\nexport function registerLintCommand(program: Command): void {\n program\n .command('lint [project-dir]')\n .description('Run the OpenHarmony codelinter on a project. Defaults to the current directory.')\n .option('--files <globs...>', 'Specific files/globs to lint (default: the whole project).')\n .option('--json', 'Emit findings 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 if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } else {\n for (const f of result.findings) {\n process.stdout.write(`${f.file}:${f.line} ${f.severity} ${f.message}${f.code ? ` [${f.code}]` : ''}\\n`);\n }\n if (result.findings.length === 0) process.stdout.write('No findings.\\n');\n }\n // Surface a non-zero codelinter exit to the caller (CI), but let output flush.\n if (result.code !== 0) process.exitCode = result.code;\n });\n}\n","import { Command, Option } from 'commander';\nimport { sendInput, sendGesture, type InputType, type Waypoint } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nconst INPUT_TYPES: InputType[] = ['click', 'doubleClick', 'longClick', 'swipe', 'drag', 'fling', 'keyEvent', 'inputText'];\n\nconst num = (v: string | undefined): number | undefined => (v === undefined ? undefined : Number(v));\n\ninterface InputOpts {\n type: InputType;\n x?: string;\n y?: string;\n x2?: string;\n y2?: string;\n speed?: string;\n key?: string;\n text?: string;\n device?: string;\n}\n\ninterface GestureOpts {\n waypoints: string;\n holdStart?: string;\n holdEnd?: string;\n device?: string;\n}\n\nexport function registerInputCommand(program: Command): void {\n program\n .command('input')\n .description('Inject a UI input event (pixel coordinates) via uitest uiInput.')\n .addOption(new Option('--type <type>', 'Input type.').choices(INPUT_TYPES).makeOptionMandatory())\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('--key <key>', 'Key id or symbolic name (Back/Home/Power) for keyEvent.')\n .option('--text <text>', 'Text for inputText.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (opts: InputOpts) => {\n const { config, logger } = getRuntime();\n await sendInput({\n config,\n type: opts.type,\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 deviceSerial: opts.device,\n logger,\n });\n logger.info(`Sent ${opts.type}.`);\n });\n\n program\n .command('gesture')\n .description('Inject a multi-waypoint gesture. Waypoints are pixel JSON: [{\"x\":..,\"y\":..,\"t\":..}].')\n .requiredOption('--waypoints <json>', 'JSON array of {x,y,t} pixel waypoints (t = ms from start).')\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 const waypoints = JSON.parse(opts.waypoints) as Waypoint[];\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"],"mappings":";;;AAAA,SAAS,WAAAA,gBAAe;AACxB,SAAS,kBAAkB;;;ACA3B,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACFA,SAAS,kBAA0B;AACxC,QAAM,eAAe,QAAQ,IAAI,gBAAgB,OAAO,QAAQ,IAAI,gBAAgB;AACpF,SAAO;AAAA,IACL,MAAM,GAAG;AACP,UAAI,aAAc,SAAQ,OAAO,MAAM,WAAW,CAAC;AAAA,CAAI;AAAA,IACzD;AAAA,IACA,KAAK,GAAG;AACN,cAAQ,OAAO,MAAM,GAAG,CAAC;AAAA,CAAI;AAAA,IAC/B;AAAA,IACA,KAAK,GAAG;AACN,cAAQ,OAAO,MAAM,UAAU,CAAC;AAAA,CAAI;AAAA,IACtC;AAAA,IACA,MAAM,GAAG;AACP,cAAQ,OAAO,MAAM,WAAW,CAAC;AAAA,CAAI;AAAA,IACvC;AAAA,EACF;AACF;;;AChBO,SAAS,oBAAsC;AACpD,MAAI,QAAQ;AACZ,MAAI,cAAc;AAClB,MAAI,cAAc;AAClB,SAAO;AAAA,IACL,OAAO,EAAE,SAAS,UAAU,GAAG;AAC7B,UAAI,OAAO,cAAc,SAAU,SAAQ,KAAK,IAAI,KAAK,QAAQ,SAAS;AAC1E,YAAM,MAAM,QAAQ,IAAI,KAAK,MAAM,KAAK,IAAI;AAC5C,YAAM,MAAM,WAAW;AAEvB,UAAI,QAAQ,eAAe,QAAQ,YAAa;AAChD,YAAM,SAAS,QAAQ,OAAO,eAAe,aAAa,GAAG;AAC7D,cAAQ,OAAO,MAAM,GAAG,MAAM,IAAI,GAAG;AAAA,CAAI;AACzC,oBAAc,OAAO;AACrB,UAAI,QAAS,eAAc;AAAA,IAC7B;AAAA,EACF;AACF;;;ACzBA,YAAY,QAAQ;AAOpB,IAAM,iBAA4C;AAAA,EAChD,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,SAAS;AAAA,EACT,aAAa;AAAA,EACb,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,qBAAqB;AACvB;AAOO,SAAS,gBAAgB,MAAyB,QAAQ,KAAqB;AACpF,SAAO;AAAA,IACL,IAAyC,KAAgB,UAAgB;AACvE,YAAM,UAAU,eAAe,GAAG;AAClC,YAAM,MAAM,IAAI,OAAO;AACvB,UAAI,QAAQ,UAAa,QAAQ,GAAI,QAAO;AAC5C,YAAM,WAAW,IAAI,SAAS,aAAa,IACvC,IAAI,QAAQ,mBAAsB,WAAQ,CAAC,IAC3C;AACJ,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC3BA,IAAI,SAA4B;AAMzB,SAAS,aAAyB;AACvC,MAAI,CAAC,QAAQ;AACX,aAAS;AAAA,MACP,QAAQ,gBAAgB;AAAA,MACxB,QAAQ,gBAAgB;AAAA,MACxB,UAAU,kBAAkB;AAAA,IAC9B;AAAA,EACF;AACA,SAAO;AACT;;;AJbO,SAAS,mBAAmB,SAAwB;AACzD,QAAM,MAAM,QAAQ,QAAQ,KAAK,EAAE,YAAY,kCAAkC;AAEjF,MACG,QAAQ,mBAAmB,EAC3B,YAAY,sEAAsE,EAClF,OAAO,WAAW,+CAA+C,EACjE,OAAO,OAAO,SAAiB,SAA8B;AAC5D,UAAM,EAAE,QAAQ,QAAQ,SAAS,IAAI,WAAW;AAChD,UAAM,UAAU,SAAS,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO;AAC1D,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR,wBAAwB,OAAO,aAAa,SAAS,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACvF;AAAA,IACF;AACA,UAAM,gBAAqB,UAAK,cAAc,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG;AACjF,QAAO,cAAW,aAAa,KAAK,CAAC,KAAK,OAAO;AAC/C,aAAO;AAAA,QACL,OAAO,QAAQ,OAAO,SAAS,QAAQ,GAAG,0BAA0B,aAAa;AAAA,MACnF;AACA;AAAA,IACF;AACA,WAAO,KAAK,8BAA8B,QAAQ,OAAO,SAAS,QAAQ,GAAG,MAAM;AACnF,UAAM,sBAAsB,EAAE,QAAQ,SAAS,QAAQ,SAAS,KAAK,QAAQ,KAAK,UAAU,OAAO,CAAC;AACpG,WAAO,KAAK,gBAAgB;AAAA,EAC9B,CAAC;AAEH,MACG,QAAQ,MAAM,EACd,YAAY,yEAAyE,EACrF,OAAO,UAAU,gDAAgD,EACjE,OAAO,CAAC,SAA6B;AACpC,UAAM,EAAE,OAAO,IAAI,WAAW;AAC9B,UAAM,OAAO,sBAAsB,MAAM;AACzC,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,CAAI;AACzD;AAAA,IACF;AACA,UAAM,OAAO,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,YAAY,MAAM,GAAG,KAAK,EAAE,QAAQ,OAAO,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE;AAC9F,YAAQ,OAAO,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,EAC7C,CAAC;AAEH,MACG,QAAQ,cAAc,EACtB,YAAY,qDAAqD,EACjE,OAAO,CAAC,QAAgB;AACvB,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,UAAU,UAAU,QAAQ,GAAG;AACrC,QAAI,CAAC,SAAS;AACZ,aAAO,KAAK,mBAAmB,GAAG,uCAAuC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,WAAO,KAAK,mBAAmB,GAAG,GAAG;AAAA,EACvC,CAAC;AACL;;;AKlEA,SAAS,mBAAmB,iBAAiB,qBAAqB,sBAAsB;AAGjF,SAAS,wBAAwB,SAAwB;AAC9D,QAAM,WAAW,QAAQ,QAAQ,UAAU,EAAE,YAAY,wCAAwC;AAEjG,WACG,QAAQ,SAAS,EACjB,YAAY,8FAA8F,EAC1G,OAAO,qBAAqB,kDAAkD,EAC9E,OAAO,WAAW,kDAAkD,EACpE,OAAO,OAAO,SAAgD;AAC7D,UAAM,EAAE,QAAQ,QAAQ,SAAS,IAAI,WAAW;AAChD,QAAI,oBAAoB,MAAM,KAAK,CAAC,KAAK,OAAO;AAC9C,aAAO,KAAK,kEAAkE;AAC9E;AAAA,IACF;AACA,WAAO,KAAK,8CAA8C;AAC1D,UAAM,gBAAgB,EAAE,QAAQ,UAAU,QAAQ,cAAc,KAAK,QAAQ,CAAC;AAC9E,WAAO,KAAK,+BAA+B;AAAA,EAC7C,CAAC;AAEH,WACG,QAAQ,QAAQ,EAChB,YAAY,wEAAwE,EACpF,OAAO,UAAU,6BAA6B,EAC9C,OAAO,CAAC,SAA6B;AACpC,UAAM,EAAE,OAAO,IAAI,WAAW;AAC9B,UAAM,SAAS,kBAAkB,MAAM;AACvC,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAC3D;AAAA,IACF;AACA,YAAQ,OAAO,MAAM,GAAG,OAAO,MAAM;AAAA,CAAI;AACzC,QAAI,CAAC,OAAO,UAAW,SAAQ,KAAK,CAAC;AAAA,EACvC,CAAC;AAEH,WACG,QAAQ,QAAQ,EAChB,YAAY,qDAAqD,EACjE,OAAO,MAAM;AACZ,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,mBAAe,MAAM;AACrB,WAAO,KAAK,6BAA6B;AAAA,EAC3C,CAAC;AACL;;;AC7CA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGA,SAAS,wBAAwB,SAAwB;AAC9D,QAAM,MAAM,QAAQ,QAAQ,UAAU,EAAE,YAAY,4BAA4B;AAEhF,MACG,QAAQ,SAAS,EACjB,YAAY,mFAAmF,EAC/F,OAAO,WAAW,oDAAoD,EACtE,OAAO,OAAO,SAA8B;AAC3C,UAAM,EAAE,QAAQ,QAAQ,SAAS,IAAI,WAAW;AAChD,QAAI,oBAAoB,MAAM,KAAK,CAAC,KAAK,OAAO;AAC9C,aAAO,KAAK,wDAAwD;AACpE;AAAA,IACF;AACA,WAAO,KAAK,8BAA8B;AAC1C,UAAM,gBAAgB,EAAE,QAAQ,UAAU,OAAO,CAAC;AAClD,WAAO,KAAK,qBAAqB;AAAA,EACnC,CAAC;AAEH,MACG,QAAQ,OAAO,EACf,YAAY,sIAAsI,EAClJ,OAAO,cAAc,yEAAyE,EAC9F,OAAO,gBAAgB,8EAA8E,EACrG,OAAO,4BAA4B,6DAA6D,CAAC,MAAM,SAAS,GAAG,EAAE,GAAG,CAAC,EACzH,OAAO,yBAAyB,4IAA6I,EAC7K,OAAO,OAAO,SAAqF;AAClG,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,MACA,UAAU,KAAK,aAAa;AAAA,MAC5B,SAAS,KAAK;AAAA,MACd,mBAAmB,KAAK;AAAA,MACxB,SAAS,KAAK;AAAA,IAChB,CAAC;AACD,WAAO,KAAK,kCAAkC;AAAA,EAChD,CAAC;AAEH,MACG,QAAQ,MAAM,EACd,YAAY,kCAAkC,EAC9C,OAAO,YAAY;AAClB,UAAM,EAAE,OAAO,IAAI,WAAW;AAC9B,UAAM,aAAa,MAAM;AACzB,WAAO,KAAK,mBAAmB;AAAA,EACjC,CAAC;AAEH,MACG,QAAQ,SAAS,EACjB,YAAY,yCAAyC,EACrD,OAAO,oBAAoB,6BAA6B,iBAAiB,EACzE,OAAO,OAAO,SAA8B;AAC3C,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,KAAK,MAAM,qBAAqB,QAAQ,KAAK,SAAS,MAAM;AAClE,QAAI,CAAC,IAAI;AACP,aAAO,MAAM,4BAA4B,KAAK,OAAO,GAAG;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,WAAO,KAAK,oBAAoB,KAAK,OAAO,GAAG;AAAA,EACjD,CAAC;AAEH,MACG,QAAQ,QAAQ,EAChB,YAAY,2CAA2C,EACvD,OAAO,MAAM;AACZ,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,mBAAe,MAAM;AACrB,WAAO,KAAK,mBAAmB;AAAA,EACjC,CAAC;AACL;;;AC/EA,YAAYC,WAAU;AACtB,SAAS,gBAAgB;AAalB,SAAS,qBAAqB,SAAwB;AAC3D,UACG,QAAQ,qBAAqB,EAC7B,YAAY,0EAA0E,EACtF,OAAO,uBAAuB,uBAAuB,SAAS,EAC9D,OAAO,qBAAqB,yCAAyC,EACrE,OAAO,iBAAiB,yCAAyC,EACjE,OAAO,iBAAiB,sBAAsB,aAAa,EAC3D,OAAO,aAAa,qEAAqE,EACzF,OAAO,iBAAiB,4CAA4C,EACpE,OAAO,UAAU,2DAA2D,EAC5E,OAAO,OAAO,YAAgC,SAAoB;AACjE,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,MAAW,cAAQ,cAAc,QAAQ,IAAI,CAAC;AACpD,WAAO,KAAK,uBAAuB,GAAG,KAAK;AAC3C,UAAM,SAAS,MAAM,SAAS;AAAA,MAC5B;AAAA,MACA,YAAY;AAAA,MACZ,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,iBAAiB,KAAK;AAAA,MACtB,UAAU,KAAK;AAAA,MACf;AAAA;AAAA,MAEA,UAAU,MAAM;AAAA,MAAC;AAAA,IACnB,CAAC;AACD,eAAW,KAAK,OAAO,SAAU,QAAO,KAAK,CAAC;AAC9C,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,IAC7D;AACA,WAAO,KAAK,iBAAiB;AAAA,EAC/B,CAAC;AACL;;;ACjDA,SAAkB,cAAc;AAChC,YAAYC,WAAU;AACtB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAGP,SAAS,cAAc,OAAyB;AAC9C,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC/B;AAEO,SAAS,oBAAoB,SAAwB;AAC1D,UACG,QAAQ,oBAAoB,EAC5B;AAAA,IACC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,GAAG;AAAA,EACZ,EACC;AAAA,IACC,IAAI;AAAA,MACF;AAAA,MACA;AAAA,IACF,EACG,QAAQ,CAAC,GAAG,UAAU,CAAC,EACvB,QAAQ,QAAQ;AAAA,EACrB,EACC;AAAA,IACC,IAAI;AAAA,MACF;AAAA,MACA;AAAA,IACF,EAAE,QAAQ,CAAC,GAAG,kBAAkB,CAAC;AAAA,EACnC,EACC;AAAA,IACC,IAAI;AAAA,MACF;AAAA,MACA;AAAA,IACF,EAAE,UAAU,aAAa;AAAA,EAC3B,EACC,OAAO,eAAe,sEAAsE,EAC5F,OAAO,0BAA0B,4EAAuE,EACxG,OAAO,wBAAwB,0EAAqE,EACpG;AAAA,IACC,CACE,YACA,SAQG;AACH,YAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,YAAM,MAAW,cAAQ,cAAc,QAAQ,IAAI,CAAC;AACpD,YAAM,YACJ,KAAK,iBAAiB,KAAK,cACvB,EAAE,OAAO,KAAK,iBAAiB,UAAU,KAAK,KAAK,eAAe,SAAS,IAC3E;AAEN,UAAI,KAAK,WAAW;AAClB,cAAM,SAAS,eAAe;AAAA,UAC5B;AAAA,UACA,YAAY;AAAA,UACZ,KAAK,KAAK;AAAA,UACV,YAAY,KAAK;AAAA,UACjB,MAAM,KAAK;AAAA,UACX;AAAA,UACA;AAAA,QACF,CAAC;AACD,eAAO,KAAK,OAAO,WAAW,YAAY,sCAAsC,4BAA4B;AAC5G;AAAA,MACF;AAEA,YAAM,UAAU,mBAAmB,MAAM;AACzC,aAAO,KAAK,iCAAiC,GAAG,iBAAiB,OAAO,KAAK;AAC7E,6BAAuB;AAAA,QACrB,YAAY;AAAA,QACZ;AAAA,QACA,KAAK,KAAK;AAAA,QACV,YAAY,KAAK;AAAA,QACjB,MAAM,KAAK;AAAA,QACX;AAAA,QACA;AAAA,MACF,CAAC;AACD,aAAO,KAAK,4BAA4B;AAAA,IAC1C;AAAA,EACF;AACJ;;;ACrGA,YAAYC,WAAU;AACtB,SAAS,YAAY,WAAW,cAAc,WAAW,cAAc,qBAAqB;AAcrF,SAAS,mBAAmB,SAAwB;AACzD,QAAM,MAAM,QAAQ,QAAQ,KAAK,EAAE,YAAY,wEAAwE;AAEvH,MACG,QAAQ,uBAAuB,EAC/B,YAAY,mEAAmE,EAC/E,OAAO,gBAAgB,+DAA+D,EACtF,OAAO,OAAO,YAAgC,SAA2B;AACxE,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,MAAW,cAAQ,cAAc,QAAQ,IAAI,CAAC;AACpD,WAAO,KAAK,uBAAuB,GAAG,KAAK;AAC3C,UAAM,WAAW,EAAE,QAAQ,YAAY,KAAK,SAAS,KAAK,KAAK,OAAO,CAAC;AACvE,WAAO,KAAK,gBAAgB;AAAA,EAC9B,CAAC;AAEH,MACG,QAAQ,sBAAsB,EAC9B;AAAA,IACC;AAAA,EAGF,EACC,OAAO,qBAAqB,qEAAqE,EACjG,OAAO,qBAAqB,sCAAsC,OAAO,EACzE,OAAO,oBAAoB,yIAAyI,EACpK,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,YAAgC,SAAiF;AAC9H,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,QAAI,KAAK,QAAQ;AACf,aAAO,KAAK,8BAA8B,KAAK,MAAM,KAAK;AAC1D,YAAM,UAAU,EAAE,QAAQ,YAAY,KAAK,QAAQ,aAAa,KAAK,SAAS,cAAc,KAAK,QAAQ,OAAO,CAAC;AAAA,IACnH,OAAO;AACL,YAAM,MAAW,cAAQ,cAAc,QAAQ,IAAI,CAAC;AACpD,aAAO,KAAK,sBAAsB,GAAG,KAAK;AAC1C,YAAM,UAAU,EAAE,QAAQ,YAAY,KAAK,YAAY,KAAK,QAAQ,aAAa,KAAK,SAAS,cAAc,KAAK,QAAQ,OAAO,CAAC;AAAA,IACpI;AACA,WAAO,KAAK,eAAe;AAAA,EAC7B,CAAC;AAEH,MACG,QAAQ,qBAAqB,EAC7B;AAAA,IACC;AAAA,EAEF,EACC,OAAO,qBAAqB,gGAAgG,EAC5H,OAAO,qBAAqB,yDAAyD,EACrF,OAAO,gBAAgB,2DAA2D,EAClF,OAAO,0BAA0B,8EAA8E,EAC/G,OAAO,YAAY,gFAAgF,EACnG,OAAO,qBAAqB,wEAAwE,EACpG,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,UAAU,0BAA0B,EAC3C,OAAO,OAAO,YAAgC,SAAoB;AACjE,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,MAAW,cAAQ,cAAc,QAAQ,IAAI,CAAC;AACpD,UAAM,SAAS,KAAK,UAAU,cAAc,GAAG;AAC/C,UAAM,SAAS,MAAM,aAAa;AAAA,MAChC;AAAA,MACA;AAAA,MACA,SAAS,KAAK;AAAA,MACd,YAAY;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,kBAAkB,KAAK;AAAA,MACvB,gBAAgB,KAAK;AAAA,MACrB,gBAAgB,KAAK;AAAA,MACrB,cAAc,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AACD,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,IAC7D,OAAO;AACL,aAAO;AAAA,QACL,iBAAiB,OAAO,MAAM,QAAQ,OAAO,iBAAiB,GAAG,OAAO,OAAO,kBAAkB,GAAG,GAC/F,OAAO,eAAe,qBAAqB,EAAE;AAAA,MACpD;AAAA,IACF;AAAA,EACF,CAAC;AAEH,MACG,QAAQ,oBAAoB,EAC5B,YAAY,kCAAkC,EAC9C,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,QAAgB,SAA8B;AAC3D,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,aAAa,EAAE,QAAQ,QAAQ,cAAc,KAAK,QAAQ,OAAO,CAAC;AACxE,WAAO,KAAK,eAAe,MAAM,GAAG;AAAA,EACtC,CAAC;AAEH,MACG,QAAQ,eAAe,EACvB,YAAY,mCAAmC,EAC/C,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,QAAgB,SAA8B;AAC3D,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,UAAU,EAAE,QAAQ,QAAQ,cAAc,KAAK,QAAQ,OAAO,CAAC;AACrE,WAAO,KAAK,WAAW,MAAM,GAAG;AAAA,EAClC,CAAC;AACL;;;ACjHA,YAAYC,WAAU;AACtB;AAAA,EACE,YAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACPP,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AACtB,SAAS,qBAAqB;AASvB,SAAS,yBAAiC;AAC/C,QAAM,OAAY,cAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,QAAM,aAAa;AAAA,IACZ,cAAQ,MAAM,cAAc;AAAA;AAAA,IAC5B,cAAQ,MAAM,iBAAiB;AAAA;AAAA,EACtC;AACA,aAAW,KAAK,YAAY;AAC1B,QAAO,eAAW,CAAC,EAAG,QAAO;AAAA,EAC/B;AAGA,SAAO,WAAW,CAAC;AACrB;;;ADFO,SAAS,sBAAsB,SAAwB;AAC5D,UACG,QAAQ,QAAQ,EAChB,YAAY,iGAAiG,EAC7G,eAAe,iBAAiB,iDAAiD,EACjF,eAAe,yBAAyB,yDAAyD,EACjG,eAAe,oBAAoB,+DAA+D,EAClG,eAAe,eAAe,oCAAoC,EAClE,OAAO,mBAAmB,eAAe,cAAc,EACvD,OAAO,mBAAmB,wEAAwE,EAClG,OAAO,eAAe,8CAA8C,EACpE,OAAO,OAAO,SAAqB;AAClC,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AAEtC,QAAI,CAAC,mBAAmB,KAAK,IAAI,GAAG;AAClC,YAAM,IAAI,MAAM,mBAAmB,KAAK,IAAI,4CAA4C;AAAA,IAC1F;AACA,QAAI,CAAC,kBAAkB,KAAK,MAAM,GAAG;AACnC,YAAM,IAAI,MAAM,qBAAqB,KAAK,MAAM,+BAA+B;AAAA,IACjF;AACA,UAAM,SAAS,OAAO,KAAK,GAAG;AAC9B,QAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAC5B,YAAM,IAAI,MAAM,6CAA6CC,UAAS,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IACtG;AAEA,UAAM,eAAe,uBAAuB;AAC5C,UAAM,SAAS,MAAM,eAAe;AAAA,MAClC;AAAA,MACA,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,MACjB,UAAe,cAAQ,KAAK,QAAQ;AAAA,MACpC;AAAA,MACA,YAAY,KAAK;AAAA,MACjB;AAAA,MACA,WAAW,KAAK;AAAA,MAChB;AAAA,IACF,CAAC;AAED,WAAO,KAAK,sBAAsB,OAAO,UAAU,EAAE;AACrD,YAAQ,OAAO,MAAM,GAAG,OAAO,UAAU;AAAA,CAAI;AAAA,EAC/C,CAAC;AACL;;;AE9DA,SAAS,qBAAqB;AAGvB,SAAS,yBAAyB,SAAwB;AAC/D,QAAM,YAAY,QAAQ,QAAQ,WAAW,EAAE,YAAY,8CAA8C;AAEzG,YACG,QAAQ,MAAM,EACd,YAAY,mCAAmC,EAC/C,OAAO,UAAU,6BAA6B,EAC9C,OAAO,CAAC,SAA6B;AACpC,UAAM,OAAO,uBAAuB;AACpC,UAAM,OAAO,cAAc,IAAI;AAC/B,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,CAAI;AACzD;AAAA,IACF;AACA,QAAI,KAAK,WAAW,GAAG;AACrB,cAAQ,OAAO,MAAM,2BAA2B;AAChD;AAAA,IACF;AACA,UAAM,OAAO,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE;AACxF,YAAQ,OAAO,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,EAC7C,CAAC;AACL;;;ACzBA,SAAkB,UAAAC,eAAc;AAChC,SAAS,cAAc;AAGhB,SAAS,sBAAsB,SAAwB;AAC5D,UACG,QAAQ,QAAQ,EAChB,YAAY,uCAAuC,EACnD;AAAA,IACC,IAAIC,QAAO,iBAAiB,gBAAgB,EAAE,QAAQ,CAAC,UAAU,cAAc,UAAU,CAAC,EAAE,QAAQ,QAAQ;AAAA,EAC9G,EACC,OAAO,0BAA0B,iEAAiE,EAClG,OAAO,kBAAkB,wCAAwC,QAAQ,EACzE,OAAO,qBAAqB,uBAAuB,EACnD;AAAA,IACC,OAAO,SAKD;AACJ,YAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,aAAO,KAAK,qBAAqB,KAAK,IAAI,MAAM;AAChD,YAAM,OAAO;AAAA,QACX;AAAA,QACA,MAAM,KAAK;AAAA,QACX,eAAe,KAAK;AAAA,QACpB,WAAW,OAAO,KAAK,OAAO;AAAA,QAC9B,cAAc,KAAK;AAAA,QACnB;AAAA,MACF,CAAC;AACD,aAAO,KAAK,kBAAkB;AAAA,IAChC;AAAA,EACF;AACJ;;;ACjCA,SAAS,YAAY,aAAa,qBAAqB;AAchD,SAAS,oBAAoB,SAAwB;AAC1D,UACG,QAAQ,MAAM,EACd,YAAY,kGAAkG,EAC9G,OAAO,mBAAmB,8DAA8D,EACxF,OAAO,UAAU,kEAAkE,EACnF,OAAO,qBAAqB,8EAA8E,EAC1G,OAAO,mBAAmB,uDAAuD,EACjF,OAAO,qBAAqB,mDAAmD,EAC/E,OAAO,kBAAkB,iBAAiB,OAAO,EACjD,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,UAAU,6CAA6C,EAC9D,OAAO,OAAO,SAAmB;AAChC,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,YAAY,OAAO,KAAK,OAAO;AAErC,QAAI,KAAK,KAAK;AACZ,YAAM,QAAQ,MAAM,WAAW;AAAA,QAC7B;AAAA,QACA,SAAS,IAAI,OAAO,KAAK,GAAG;AAAA,QAC5B;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,cAAc,KAAK;AAAA,QACnB;AAAA,MACF,CAAC;AACD,UAAI,KAAK,KAAM,SAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,UACpE,QAAO,KAAK,YAAY,MAAM,GAAG,KAAK,MAAM,OAAO,EAAE;AAC1D;AAAA,IACF;AACA,QAAI,KAAK,MAAM;AACb,YAAM,YAAY,EAAE,QAAQ,YAAY,KAAK,OAAO,WAAW,cAAc,KAAK,QAAQ,OAAO,CAAC;AAClG,aAAO,KAAK,gBAAgB;AAC5B;AAAA,IACF;AACA,QAAI,KAAK,QAAQ;AACf,YAAM,cAAc,EAAE,QAAQ,QAAQ,KAAK,QAAQ,WAAW,cAAc,KAAK,QAAQ,OAAO,CAAC;AACjG,aAAO,KAAK,UAAU,KAAK,MAAM,cAAc;AAC/C;AAAA,IACF;AACA,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACjF,CAAC;AACL;;;ACxDA,SAAS,gBAAgB;AAalB,SAAS,qBAAqB,SAAwB;AAC3D,UACG,QAAQ,OAAO,EACf,YAAY,8DAA8D,EAC1E,OAAO,mBAAmB,gDAAgD,EAC1E,OAAO,cAAc,0BAA0B,OAAO,EACtD,OAAO,qBAAqB,wBAAwB,EACpD,OAAO,qBAAqB,uCAAuC,EACnE,OAAO,cAAc,8CAA8C,EACnE,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,UAAU,2BAA2B,EAC5C,OAAO,OAAO,SAAoB;AACjC,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,QAAI,CAAC,KAAK,IAAK,OAAM,IAAI,MAAM,iCAAiC;AAChE,UAAM,UAAU,MAAM,SAAS;AAAA,MAC7B;AAAA,MACA,SAAS,IAAI,OAAO,KAAK,GAAG;AAAA,MAC5B,YAAY,OAAO,KAAK,GAAG;AAAA,MAC3B,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,cAAc,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AACD,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,IAC9D,OAAO;AACL,iBAAW,KAAK,QAAS,SAAQ,OAAO,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,KAAK,KAAK,EAAE,GAAG,KAAK,EAAE,OAAO;AAAA,CAAI;AAAA,IACjG;AAAA,EACF,CAAC;AACL;;;AC3CA,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AACtB,SAAS,gBAAgB,oBAAoB;;;ACH7C,OAAO,WAAW;AAmCX,SAAS,aAAa,OAAe,QAAwB;AAClE,QAAM,YAAY;AAClB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,WAAW,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,IAAI,OAAO,MAAM,IAAI,EAAE,CAAC;AACtE,QAAM,UAAU,KAAK,MAAM,WAAW,GAAG;AACzC,QAAM,SAAmB,CAAC;AAC1B,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,KAAK,IAAI,KAAK;AAC5B,UAAM,IAAI,IAAI;AACd,UAAM,IAAI,KAAK,MAAM,KAAK,QAAQ,EAAE;AACpC,UAAM,IAAI,KAAK,MAAM,KAAK,SAAS,EAAE;AAErC,QAAI,IAAI,KAAK,IAAI,IAAI;AACnB,YAAM,KAAK,aAAa,CAAC,gBAAgB,CAAC,SAAS,MAAM,aAAa,SAAS,sBAAsB;AACrG,YAAM,KAAK,oBAAoB,CAAC,SAAS,KAAK,SAAS,CAAC,aAAa,SAAS,sBAAsB;AAAA,IACtG;AACA,UAAM,MAAM,EAAE,QAAQ,CAAC;AAEvB,UAAM,KAAK,MAAM,IAAI,UAAU,MAAM,KAAK,QAAQ,UAAU;AAC5D,UAAM,UAAU,MAAM,IAAI,UAAU,MAAM,KAAK,QAAQ;AACvD,WAAO;AAAA,MACL,YAAY,EAAE,QAAQ,WAAW,OAAO,wCAAwC,QAAQ,8BAA8B,OAAO,aAAa,OAAO,wDAAwD,OAAO,KAAK,GAAG;AAAA,IAC1N;AAEA,UAAM,KAAK,MAAM,IAAI,WAAW,UAAU,MAAM,KAAK,SAAS,UAAU,IAAI,WAAW;AACvF,WAAO;AAAA,MACL,YAAY,OAAO,QAAQ,EAAE,wCAAwC,QAAQ,8BAA8B,OAAO,aAAa,OAAO,+DAA+D,GAAG;AAAA,IAC1M;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAY,QAAQ,CAAC,QAAQ,WAAW,MAAM,OAAO,wCAAwC,QAAQ,8BAA8B,OAAO,aAAa,OAAO;AAAA,EAChK;AACA,SAAO;AAAA,IACL,YAAY,OAAO,QAAQ,WAAW,MAAM,OAAO,wCAAwC,QAAQ,8BAA8B,OAAO,aAAa,OAAO;AAAA,EAC9J;AACA,SAAO,eAAe,KAAK,aAAa,MAAM,wCAAwC,MAAM,KAAK,EAAE,CAAC,GAAG,OAAO,KAAK,EAAE,CAAC;AACxH;AAOA,eAAsB,eAAe,MAAc,MAAoD;AACrG,QAAM,OAAO,MAAM,MAAM,IAAI,EAAE,SAAS;AACxC,QAAM,gBAAgB,KAAK,SAAS;AACpC,QAAM,iBAAiB,KAAK,UAAU;AACtC,QAAM,UAAU,KAAK,IAAI,eAAe,cAAc,KAAK;AAC3D,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,SAAS,OAAO;AAC/C,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,gBAAgB,KAAK,CAAC;AAC3D,QAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,iBAAiB,KAAK,CAAC;AAC7D,QAAM,UAAU,MAAM,MAAM,IAAI,EAAE,OAAO,OAAO,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,CAAC,EAAE,SAAS;AACvF,MAAI,CAAC,KAAK,MAAM;AACd,WAAO,EAAE,KAAK,SAAS,OAAO,QAAQ,eAAe,eAAe;AAAA,EACtE;AACA,QAAM,MAAM,aAAa,OAAO,MAAM;AACtC,QAAM,MAAM,MAAM,MAAM,OAAO,EAC5B,UAAU,CAAC,EAAE,OAAO,OAAO,KAAK,GAAG,EAAE,CAAC,CAAC,EACvC,KAAK,EAAE,SAAS,GAAG,CAAC,EACpB,SAAS;AACZ,SAAO,EAAE,KAAK,OAAO,QAAQ,eAAe,eAAe;AAC7D;AAwBA,SAAS,kBAAkB,OAAe,QAAgB,KAAa,MAAuB;AAC5F,QAAM,WAAW,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,IAAI,OAAO,MAAM,IAAI,EAAE,CAAC;AACtE,QAAM,MAAM,KAAK,MAAM,WAAW,GAAG;AACrC,MAAI,QAAQ,IAAI,GAAG;AACnB,MAAI,OAAO,SAAS,SAAU,UAAS,WAAM,KAAK,QAAQ,CAAC,CAAC;AAC5D,QAAM,OAAO,KAAK,MAAM,MAAM,SAAS,WAAW,IAAI,IAAI,MAAM;AAChE,QAAM,OAAO,WAAW,MAAM;AAC9B,SACE,eAAe,KAAK,aAAa,MAAM,iEACX,IAAI,aAAa,IAAI,sCACrC,GAAG,QAAQ,WAAW,MAAM,CAAC,wCAAwC,QAAQ,wHAAwH,KAAK;AAG1N;AAOA,eAAsB,kBAAkB,QAAkB,MAAwD;AAChH,MAAI,OAAO,WAAW,EAAG,OAAM,IAAI,MAAM,8BAA8B;AACvE,QAAM,QAAQ,OAAO;AACrB,QAAM,OAAO,KAAK,IAAI,GAAG,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,CAAC,CAAC;AACjE,QAAM,OAAO,KAAK,KAAK,QAAQ,IAAI;AACnC,QAAM,MAAM,KAAK,OAAO;AAExB,QAAM,QAAQ,MAAM,MAAM,OAAO,CAAC,CAAC,EAAE,SAAS;AAC9C,QAAM,KAAK,MAAM,SAAS;AAC1B,QAAM,KAAK,MAAM,UAAU;AAC3B,QAAM,UAAU,KAAK,IAAI,IAAI,EAAE,KAAK;AACpC,QAAM,YAAY,KAAK,IAAI,GAAG,KAAK,SAAS,OAAO,OAAO;AAC1D,QAAM,YAAY,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,SAAS,CAAC;AACxD,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,SAAS,CAAC;AAEzD,QAAM,QAAQ,MAAM,QAAQ;AAAA,IAC1B,OAAO,IAAI,CAAC,OAAO,MAAM;AACvB,YAAM,QAAQ,OAAO,KAAK,kBAAkB,WAAW,YAAY,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC;AACtF,aAAO,MAAM,KAAK,EACf,OAAO,WAAW,YAAY,EAAE,KAAK,OAAO,CAAC,EAC7C,UAAU,CAAC,EAAE,OAAO,OAAO,KAAK,GAAG,MAAM,EAAE,CAAC,CAAC,EAC7C,IAAI,EACJ,SAAS;AAAA,IACd,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,OAAO,aAAa,OAAO,KAAK;AAC9C,QAAM,SAAS,OAAO,cAAc,OAAO,KAAK;AAChD,QAAM,aAAa,MAAM,IAAI,CAAC,OAAO,MAAM;AACzC,UAAM,IAAI,KAAK,MAAM,IAAI,IAAI;AAC7B,UAAM,IAAI,IAAI;AACd,WAAO,EAAE,OAAO,MAAM,MAAM,KAAK,YAAY,MAAM,KAAK,MAAM,KAAK,aAAa,KAAK;AAAA,EACvF,CAAC;AAED,QAAM,MAAM,MAAM,MAAM;AAAA,IACtB,QAAQ,EAAE,OAAO,QAAQ,UAAU,GAAG,YAAY,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE;AAAA,EAC5E,CAAC,EACE,UAAU,UAAU,EACpB,KAAK,EAAE,SAAS,GAAG,CAAC,EACpB,SAAS;AAEZ,SAAO,EAAE,KAAK,OAAO,QAAQ,MAAM,MAAM,WAAW,YAAY,MAAM;AACxE;AAOA,eAAsB,WAAW,QAAkB,OAA4B,CAAC,GAAsB;AACpG,MAAI,OAAO,WAAW,EAAG,QAAO,CAAC;AACjC,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,SAAS,MAAM,QAAQ;AAAA,IAC3B,OAAO,IAAI,CAAC,MAAM,MAAM,CAAC,EAAE,UAAU,EAAE,OAAO,QAAQ,QAAQ,EAAE,KAAK,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC;AAAA,EACjG;AACA,QAAM,MAAgB,CAAC,CAAC;AACxB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,IAAI,OAAO,IAAI,CAAC;AACtB,UAAM,IAAI,OAAO,CAAC;AAClB,QAAI,CAAC,KAAK,CAAC,GAAG;AACZ,UAAI,KAAK,CAAC;AACV;AAAA,IACF;AACA,UAAM,IAAI,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK;AAC1C,QAAI,IAAI;AACR,aAAS,IAAI,GAAG,IAAI,GAAG,IAAK,MAAK,KAAK,KAAK,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC,KAAK,EAAE;AACnE,QAAI,KAAK,EAAE,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC;AAAA,EACpC;AACA,SAAO;AACT;;;ADjMA,IAAM,+BAA+B;AAErC,SAAS,YAAY,KAAqB;AACxC,QAAM,IAAI,OAAO,GAAG;AACpB,MAAI,CAAC,OAAO,SAAS,CAAC,EAAG,QAAO;AAChC,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC;AACpD;AAEO,SAAS,0BAA0B,SAAwB;AAChE,UACG,QAAQ,YAAY,EACpB;AAAA,IACC;AAAA,EAGF,EACC,OAAO,uBAAuB,qBAAqB,iBAAiB,EACpE,OAAO,UAAU,+DAA+D,EAChF,OAAO,kBAAkB,6DAA6D,MAAM,EAC5F,OAAO,mBAAmB,gEAAgE,EAC1F,OAAO,mBAAmB,sEAAsE,EAChG,OAAO,mBAAmB,mCAAmC,IAAI,EACjE,OAAO,UAAU,uEAAuE,EACxF,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,MAAsB,YAAqB;AACxD,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,SAAS,YAAY,KAAK,MAAM;AACtC,UAAM,aAAa,OAAO,KAAK,QAAQ,KAAK;AAG5C,QAAI,KAAK,cAAc;AACrB,YAAM,QAAQ,KAAK,QAAQ,KAAK,IAAI,GAAG,OAAO,KAAK,KAAK,CAAC,IAAI;AAC7D,YAAM,SAAS,MAAM,aAAa,EAAE,QAAQ,OAAO,YAAY,cAAc,KAAK,QAAQ,OAAO,CAAC;AAClG,YAAM,QAAQ,MAAM,WAAW,MAAM;AACrC,YAAM,QAAQ,MAAM,kBAAkB,QAAQ,EAAE,QAAQ,MAAM,CAAC;AAC/D,MAAG,kBAAc,KAAK,QAAQ,MAAM,GAAG;AAGvC,UAAI,KAAK,OAAO;AACd,cAAM,MAAW,cAAQ,KAAK,MAAM,KAAK;AACzC,cAAM,OAAO,KAAK,OAAO,MAAM,GAAG,KAAK,OAAO,SAAS,IAAI,MAAM;AACjE,eAAO,QAAQ,CAAC,OAAO,MAAS,kBAAc,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC;AAAA,MAC5E;AAEA,YAAM,WAAW,OAAO,IAAI,CAAC,GAAG,OAAO,EAAE,KAAK,GAAG,MAAM,IAAI,YAAY,YAAY,MAAM,CAAC,KAAK,EAAE,EAAE;AACnG,UAAI,KAAK,MAAM;AACb,gBAAQ,OAAO;AAAA,UACb,GAAG,KAAK;AAAA,YACN;AAAA,cACE,OAAO,KAAK;AAAA,cACZ,YAAY,OAAO;AAAA,cACnB,MAAM,MAAM;AAAA,cACZ,MAAM,MAAM;AAAA,cACZ;AAAA,cACA,MAAM;AAAA,cACN,QAAQ;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA;AAAA,QACH;AAAA,MACF,OAAO;AACL,gBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,CAAC;AAAA,CAAI;AAAA,MACtD;AAEA,UAAI,OAAO;AACX,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAK,MAAK,MAAM,CAAC,KAAK,MAAM,MAAM,IAAI,KAAK,GAAI,QAAO;AACxF,aAAO;AAAA,QACL,uBAAuB,KAAK,MAAM,KAAK,MAAM,IAAI,IAAI,MAAM,IAAI,KAAK,OAAO,MAAM,qCACpD,IAAI,YAAO,MAAM,IAAI,KAAK,GAAG,QAAQ,CAAC,CAAC;AAAA,MACtE;AACA;AAAA,IACF;AAGA,QAAI,KAAK,OAAO;AACd,YAAM,SAAS,MAAM,aAAa;AAAA,QAChC;AAAA,QACA,OAAO,OAAO,KAAK,KAAK;AAAA,QACxB;AAAA,QACA,cAAc,KAAK;AAAA,QACnB;AAAA,MACF,CAAC;AACD,YAAM,MAAW,cAAQ,KAAK,MAAM,KAAK;AACzC,YAAM,OAAO,KAAK,OAAO,MAAM,GAAG,KAAK,OAAO,SAAS,IAAI,MAAM;AACjE,aAAO,QAAQ,CAAC,OAAO,MAAS,kBAAc,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC;AAC1E,aAAO,KAAK,SAAS,OAAO,MAAM,cAAc,IAAI,QAAQ,OAAO,SAAS,CAAC,IAAI,GAAG,GAAG;AACvF;AAAA,IACF;AAGA,UAAM,OAAO,MAAM,eAAe,EAAE,QAAQ,cAAc,KAAK,QAAQ,OAAO,CAAC;AAC/E,UAAM,iBAAiB,QAAQ,qBAAqB,QAAQ,MAAM;AAClE,QAAI,KAAK,QAAQ,gBAAgB;AAC/B,YAAM,WAAW,MAAM,eAAe,KAAK,QAAQ,EAAE,QAAQ,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC;AAChF,MAAG,kBAAc,KAAK,QAAQ,SAAS,GAAG;AAC1C,aAAO;AAAA,QACL,SAAS,KAAK,MAAM,KAAK,SAAS,KAAK,IAAI,SAAS,MAAM,SACrD,SAAS,aAAa,IAAI,SAAS,cAAc,GAAG,KAAK,OAAO,iBAAiB,EAAE;AAAA,MAC1F;AACA;AAAA,IACF;AACA,IAAG,kBAAc,KAAK,QAAQ,KAAK,MAAM;AACzC,WAAO,KAAK,SAAS,KAAK,MAAM,KAAK,KAAK,KAAK,IAAI,KAAK,MAAM,IAAI;AAAA,EACpE,CAAC;AACL;;;AE1HA,SAAS,kBAAkB;AASpB,SAAS,oBAAoB,SAAwB;AAC1D,UACG,QAAQ,eAAe,EACvB,YAAY,mFAAmF,EAC/F,OAAO,qBAAqB,8CAA8C,EAC1E,OAAO,SAAS,kCAAkC,EAClD,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,QAA4B,SAAmB;AAC5D,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,OAAO,UAAU;AACvB,QAAI,SAAS,SAAU,OAAM,IAAI,MAAM,wBAAwB,IAAI,uBAAuB;AAC1F,UAAM,SAAS,MAAM,WAAW;AAAA,MAC9B;AAAA,MACA,YAAY,KAAK;AAAA,MACjB,OAAO,CAAC,KAAK;AAAA,MACb,cAAc,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AACD,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,EAC7D,CAAC;AACL;;;AC7BA,SAAS,mBAAmB;AAGrB,SAAS,uBAAuB,SAAwB;AAC7D,UACG,QAAQ,SAAS,EACjB,YAAY,6BAA6B,EACzC,OAAO,UAAU,6BAA6B,EAC9C,OAAO,OAAO,SAA6B;AAC1C,UAAM,EAAE,OAAO,IAAI,WAAW;AAC9B,UAAM,UAAU,MAAM,YAAY,MAAM;AACxC,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,CAAI;AAC5D;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,OAAO,MAAM,gBAAgB;AACrC;AAAA,IACF;AACA,eAAW,KAAK,SAAS;AACvB,cAAQ,OAAO,MAAM,GAAG,EAAE,MAAM,IAAK,EAAE,cAAc,EAAE,IAAK,EAAE,MAAM;AAAA,CAAI;AAAA,IAC1E;AAAA,EACF,CAAC;AACL;;;ACvBA,SAAS,UAAU,gBAAgB;AAG5B,SAAS,oBAAoB,SAAwB;AAC1D,QAAM,OAAO,QAAQ,QAAQ,MAAM,EAAE,YAAY,yDAAyD;AAE1G,OACG,QAAQ,uBAAuB,EAC/B,YAAY,kCAAkC,EAC9C,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,OAAe,QAAgB,SAA8B;AAC1E,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,SAAS,EAAE,QAAQ,OAAO,QAAQ,cAAc,KAAK,QAAQ,OAAO,CAAC;AAC3E,WAAO,KAAK,QAAQ,KAAK,OAAO,MAAM,GAAG;AAAA,EAC3C,CAAC;AAEH,OACG,QAAQ,uBAAuB,EAC/B,YAAY,8BAA8B,EAC1C,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,QAAgB,OAAe,SAA8B;AAC1E,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,SAAS,EAAE,QAAQ,QAAQ,OAAO,cAAc,KAAK,QAAQ,OAAO,CAAC;AAC3E,WAAO,KAAK,YAAY,MAAM,OAAO,KAAK,GAAG;AAAA,EAC/C,CAAC;AACL;;;ACzBA,YAAYC,WAAU;AACtB,SAAS,qBAAqB;AAQvB,SAAS,oBAAoB,SAAwB;AAC1D,UACG,QAAQ,oBAAoB,EAC5B,YAAY,iFAAiF,EAC7F,OAAO,sBAAsB,4DAA4D,EACzF,OAAO,UAAU,wBAAwB,EACzC,OAAO,OAAO,YAAgC,SAAmB;AAChE,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,MAAW,cAAQ,cAAc,QAAQ,IAAI,CAAC;AACpD,UAAM,SAAS,MAAM,cAAc,EAAE,QAAQ,YAAY,KAAK,OAAO,KAAK,OAAO,OAAO,CAAC;AACzF,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,IAC7D,OAAO;AACL,iBAAW,KAAK,OAAO,UAAU;AAC/B,gBAAQ,OAAO,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,QAAQ,IAAI,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK,EAAE,IAAI,MAAM,EAAE;AAAA,CAAI;AAAA,MACxG;AACA,UAAI,OAAO,SAAS,WAAW,EAAG,SAAQ,OAAO,MAAM,gBAAgB;AAAA,IACzE;AAEA,QAAI,OAAO,SAAS,EAAG,SAAQ,WAAW,OAAO;AAAA,EACnD,CAAC;AACL;;;AC/BA,SAAkB,UAAAC,eAAc;AAChC,SAAS,WAAW,mBAAkD;AAGtE,IAAM,cAA2B,CAAC,SAAS,eAAe,aAAa,SAAS,QAAQ,SAAS,YAAY,WAAW;AAExH,IAAM,MAAM,CAAC,MAA+C,MAAM,SAAY,SAAY,OAAO,CAAC;AAqB3F,SAAS,qBAAqB,SAAwB;AAC3D,UACG,QAAQ,OAAO,EACf,YAAY,iEAAiE,EAC7E,UAAU,IAAIC,QAAO,iBAAiB,aAAa,EAAE,QAAQ,WAAW,EAAE,oBAAoB,CAAC,EAC/F,OAAO,YAAY,8BAA8B,EACjD,OAAO,YAAY,8BAA8B,EACjD,OAAO,aAAa,iCAAiC,EACrD,OAAO,aAAa,iCAAiC,EACrD,OAAO,sBAAsB,gCAAgC,EAC7D,OAAO,eAAe,yDAAyD,EAC/E,OAAO,iBAAiB,qBAAqB,EAC7C,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,SAAoB;AACjC,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,UAAU;AAAA,MACd;AAAA,MACA,MAAM,KAAK;AAAA,MACX,KAAK,IAAI,KAAK,CAAC;AAAA,MACf,KAAK,IAAI,KAAK,CAAC;AAAA,MACf,MAAM,IAAI,KAAK,EAAE;AAAA,MACjB,MAAM,IAAI,KAAK,EAAE;AAAA,MACjB,OAAO,IAAI,KAAK,KAAK;AAAA,MACrB,KAAK,KAAK;AAAA,MACV,MAAM,KAAK;AAAA,MACX,cAAc,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AACD,WAAO,KAAK,QAAQ,KAAK,IAAI,GAAG;AAAA,EAClC,CAAC;AAEH,UACG,QAAQ,SAAS,EACjB,YAAY,sFAAsF,EAClG,eAAe,sBAAsB,4DAA4D,EACjG,OAAO,qBAAqB,qEAAqE,EACjG,OAAO,mBAAmB,+DAA+D,EACzF,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,SAAsB;AACnC,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,YAAY,KAAK,MAAM,KAAK,SAAS;AAC3C,UAAM,YAAY;AAAA,MAChB;AAAA,MACA;AAAA,MACA,aAAa,IAAI,KAAK,SAAS;AAAA,MAC/B,WAAW,IAAI,KAAK,OAAO;AAAA,MAC3B,cAAc,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AACD,WAAO,KAAK,eAAe;AAAA,EAC7B,CAAC;AACL;;;AvBzDA,IAAM,cAAc;AAEpB,SAAS,eAAwB;AAC/B,QAAM,UAAU,IAAIC,SAAQ,EACzB,KAAK,WAAW,EAChB;AAAA,IACC;AAAA,EAIF,EACC,QAAQ,WAAW,EACnB,mBAAmB;AAEtB,qBAAmB,OAAO;AAC1B,0BAAwB,OAAO;AAC/B,0BAAwB,OAAO;AAC/B,uBAAqB,OAAO;AAC5B,sBAAoB,OAAO;AAC3B,qBAAmB,OAAO;AAC1B,wBAAsB,OAAO;AAC7B,2BAAyB,OAAO;AAChC,wBAAsB,OAAO;AAC7B,sBAAoB,OAAO;AAC3B,uBAAqB,OAAO;AAC5B,4BAA0B,OAAO;AACjC,sBAAoB,OAAO;AAC3B,yBAAuB,OAAO;AAC9B,sBAAoB,OAAO;AAC3B,sBAAoB,OAAO;AAC3B,uBAAqB,OAAO;AAE5B,SAAO;AACT;AAEA,eAAe,OAAsB;AACnC,QAAM,UAAU,aAAa;AAC7B,MAAI;AACF,UAAM,QAAQ,WAAW,QAAQ,IAAI;AAAA,EACvC,SAAS,KAAK;AACZ,UAAM,UAAU,eAAe,aAAa,IAAI,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACzG,YAAQ,OAAO,MAAM,WAAW,OAAO;AAAA,CAAI;AAC3C,QAAI,QAAQ,IAAI,gBAAgB,OAAO,eAAe,SAAS,IAAI,OAAO;AACxE,cAAQ,OAAO,MAAM,GAAG,IAAI,KAAK;AAAA,CAAI;AAAA,IACvC;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,KAAK,KAAK;","names":["Command","path","path","path","path","ALL_SDKS","fs","path","ALL_SDKS","Option","Option","fs","path","path","Option","Option","Command"]}
|
|
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/app.ts","../src/commands/create.ts","../src/lib/templateRoot.ts","../src/commands/templates.ts","../src/commands/reboot.ts","../src/commands/wait.ts","../src/commands/watch.ts","../src/commands/screenshot.ts","../src/lib/screenshotImage.ts","../src/commands/dump.ts","../src/commands/devices.ts","../src/commands/file.ts","../src/commands/lint.ts","../src/commands/input.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 { 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';\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\n registerSdkCommand(program);\n registerCmdToolsCommand(program);\n registerEmulatorCommand(program);\n registerBuildCommand(program);\n registerSignCommand(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\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 downloadAndInstallSdk,\n getOsFolder,\n getSdkRootDir,\n getSupportedSdksForUi,\n removeSdk,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\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('Download and install an OpenHarmony SDK. Skips if already installed.')\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 .action(async (version: string, opts: { force?: boolean; tmpDir?: string }) => {\n const { config, logger, progress } = getRuntime();\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};\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('Report whether the command-line tools are installed and their version.')\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 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 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('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 { buildHap } 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 json?: boolean;\n}\n\nexport function registerBuildCommand(program: Command): void {\n program\n .command('build [project-dir]')\n .description('Build an OpenHarmony app via hvigorw. Defaults to the current directory.')\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('--json', 'emit the build result (discovered HAPs, warnings) as JSON')\n .action(async (projectDir: string | undefined, opts: BuildOpts) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n logger.info(`Building project at ${dir}...`);\n const result = await 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 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 generateSigningConfigs,\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 ].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 .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 (\n projectDir: string | undefined,\n opts: {\n apl: Apl;\n appFeature?: AppFeature;\n acls?: string[];\n bootstrap?: boolean;\n storePassword?: string;\n keyPassword?: 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.bootstrap) {\n const result = prepareSigning({\n config,\n projectDir: dir,\n apl: opts.apl,\n appFeature: opts.appFeature,\n acls: opts.acls,\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 passwords,\n logger,\n });\n logger.info('Signing configs generated.');\n },\n );\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport { installApp, launchApp, uninstallApp, forceStop, applyChanges, getBundleName } 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]')\n .description('Install the signed .hap on the connected device/emulator via hdc.')\n .option('--hap <path>', 'Override the .hap path (relative to project-dir or absolute).')\n .action(async (projectDir: string | undefined, opts: { hap?: string }) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n logger.info(`Installing app from ${dir}...`);\n await installApp({ config, projectDir: dir, hapPath: opts.hap, logger });\n logger.info('App installed.');\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]')\n .description(\n 'Install a HAP and verify the running process took the change. Handles sign-info mismatch, ' +\n 'asset-cache invalidation, and persistent-bundle restart.',\n )\n .option('--bundle <bundle>', 'Bundle name to apply changes to. Defaults to the bundleName in the project AppScope/app.json5.')\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 (projectDir: string | undefined, opts: ApplyOpts) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n const bundle = opts.bundle ?? getBundleName(dir);\n const result = await applyChanges({\n config,\n bundle,\n hapPath: opts.hap,\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 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 } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\ninterface WaitOpts {\n log?: string;\n boot?: boolean;\n bundle?: string;\n pidOf?: string;\n domain?: string;\n timeout: string;\n device?: string;\n json?: boolean;\n}\n\nexport function registerWaitCommand(program: Command): void {\n program\n .command('wait')\n .description('Wait for a device condition: a log line (--log), boot (--boot), or a bundle to start (--bundle).')\n .option('--log <pattern>', 'Resolve when a hilog line (tag: message) matches this regex.')\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 .option('--timeout <ms>', 'Max wait, ms.', '30000')\n .option('--device <serial>', 'Target device serial.')\n .option('--json', 'With --log: emit the matched entry as JSON.')\n .action(async (opts: WaitOpts) => {\n const { config, logger } = getRuntime();\n const timeoutMs = Number(opts.timeout);\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 logger,\n });\n if (opts.json) process.stdout.write(`${JSON.stringify(entry, null, 2)}\\n`);\n else logger.info(`matched: ${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 (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, or --bundle <bundle>.');\n });\n}\n","import { Command } from 'commander';\nimport { watchLog } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\ninterface WatchOpts {\n log?: string;\n for: 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 hilog lines matching a pattern for 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('--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 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 } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport { renderWithGrid, buildContactSheet, frameDiffs } from '../lib/screenshotImage.js';\n\ninterface ScreenshotOpts {\n output: string;\n grid?: boolean;\n maxDim: 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\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 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 '--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 / --contact-sheet (256-4096).', '1024')\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 // --- 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\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';\n\ninterface DumpOpts {\n bundle?: string;\n raw?: boolean;\n device?: string;\n}\n\nexport function registerDumpCommand(program: Command): void {\n program\n .command('dump [target]')\n .description('Dump device state as JSON. Currently supports `dump layout` (the default target).')\n .option('--bundle <bundle>', 'Filter the layout to a single window/bundle.')\n .option('--raw', 'Return the unpruned layout 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 const result = await dumpLayout({\n config,\n bundleName: opts.bundle,\n prune: !opts.raw,\n deviceSerial: opts.device,\n logger,\n });\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n });\n}\n","import { Command } from 'commander';\nimport { listDevices } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerDevicesCommand(program: Command): void {\n program\n .command('devices')\n .description('List connected hdc devices.')\n .option('--json', 'Emit machine-readable JSON.')\n .action(async (opts: { json?: boolean }) => {\n const { config } = getRuntime();\n const devices = await listDevices(config);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(devices, 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(`${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('Push a local file to the device.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (local: string, remote: string, opts: { device?: string }) => {\n const { config, logger } = getRuntime();\n await sendFile({ config, local, remote, deviceSerial: opts.device, logger });\n logger.info(`Sent ${local} -> ${remote}.`);\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 { runCodelinter } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\ninterface LintOpts {\n files?: string[];\n json?: boolean;\n}\n\nexport function registerLintCommand(program: Command): void {\n program\n .command('lint [project-dir]')\n .description('Run the OpenHarmony codelinter on a project. Defaults to the current directory.')\n .option('--files <globs...>', 'Specific files/globs to lint (default: the whole project).')\n .option('--json', 'Emit findings 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 if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } else {\n for (const f of result.findings) {\n process.stdout.write(`${f.file}:${f.line} ${f.severity} ${f.message}${f.code ? ` [${f.code}]` : ''}\\n`);\n }\n if (result.findings.length === 0) process.stdout.write('No findings.\\n');\n }\n // Surface a non-zero codelinter exit to the caller (CI), but let output flush.\n if (result.code !== 0) process.exitCode = result.code;\n });\n}\n","import { Command, Option } from 'commander';\nimport { sendInput, sendGesture, type InputType, type Waypoint } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nconst INPUT_TYPES: InputType[] = ['click', 'doubleClick', 'longClick', 'swipe', 'drag', 'fling', 'keyEvent', 'inputText'];\n\nconst num = (v: string | undefined): number | undefined => (v === undefined ? undefined : Number(v));\n\ninterface InputOpts {\n type: InputType;\n x?: string;\n y?: string;\n x2?: string;\n y2?: string;\n speed?: string;\n key?: string;\n text?: string;\n device?: string;\n}\n\ninterface GestureOpts {\n waypoints: string;\n holdStart?: string;\n holdEnd?: string;\n device?: string;\n}\n\nexport function registerInputCommand(program: Command): void {\n program\n .command('input')\n .description('Inject a UI input event (pixel coordinates) via uitest uiInput.')\n .addOption(new Option('--type <type>', 'Input type.').choices(INPUT_TYPES).makeOptionMandatory())\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('--key <key>', 'Key id or symbolic name (Back/Home/Power) for keyEvent.')\n .option('--text <text>', 'Text for inputText.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (opts: InputOpts) => {\n const { config, logger } = getRuntime();\n await sendInput({\n config,\n type: opts.type,\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 deviceSerial: opts.device,\n logger,\n });\n logger.info(`Sent ${opts.type}.`);\n });\n\n program\n .command('gesture')\n .description('Inject a multi-waypoint gesture. Waypoints are pixel JSON: [{\"x\":..,\"y\":..,\"t\":..}].')\n .requiredOption('--waypoints <json>', 'JSON array of {x,y,t} pixel waypoints (t = ms from start).')\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 const waypoints = JSON.parse(opts.waypoints) as Waypoint[];\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"],"mappings":"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","names":["Command","path","path","path","path","ALL_SDKS","fs","path","ALL_SDKS","Option","Option","fs","path","path","Option","Option","Command"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oniroproject/oniro-app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.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.
|
|
27
|
+
"@oniroproject/core": "0.8.0",
|
|
28
28
|
"commander": "^12.1.0",
|
|
29
29
|
"sharp": "^0.34.5"
|
|
30
30
|
},
|