@tutti-os/nexight-devops 0.5.4 → 0.6.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 +3 -17
- package/dist/cli.js +690 -1640
- package/dist/cli.js.map +1 -1
- package/package.json +3 -3
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/constants/admin.ts","../src/lib/admin-computer.ts","../src/lib/errors.ts","../src/lib/admin-api.ts","../src/lib/config.ts","../src/lib/private-file.ts","../src/lib/logger.ts","../src/commands/admin/shared.ts","../src/commands/admin/app.ts","../src/lib/ui.ts","../src/commands/admin/auth.ts","../src/lib/admin-computer-logs.ts","../src/lib/progress.ts","../src/commands/admin/computer.ts","../src/commands/admin/system.ts","../src/commands/admin/index.ts","../src/lib/datafinder/errors.ts","../src/lib/datafinder/sdk-adapter.ts","../src/lib/datafinder/client.ts","../src/lib/datafinder/config.ts","../src/commands/datafinder/shared.ts","../src/commands/datafinder/auth.ts","../src/commands/datafinder/dashboard.ts","../src/lib/datafinder/builtin-queries.ts","../src/lib/datafinder/script-runner.ts","../src/commands/datafinder/query.ts","../src/commands/datafinder/report.ts","../src/commands/datafinder/index.ts","../src/diagnostics/shared-agent.ts","../src/lib/shell.ts","../src/lib/cloudwatch-logs.ts","../src/lib/aws.ts","../src/lib/github.ts","../src/constants/release-targets.ts","../src/lib/prerequisites.ts","../src/commands/diagnose/shared-agent.ts","../src/commands/diagnose/index.ts","../src/commands/doctor.ts","../src/lib/datafinder/types.ts","../src/locales/zh-CN.ts","../src/lib/i18n.ts","../src/commands/onboard.ts","../src/constants/ppe-lane-frontend-targets.ts","../src/constants/ppe-lane-repos.ts","../src/lib/ppe-lane.ts","../src/commands/ppe-lane/deploy.ts","../src/commands/ppe-lane/destroy.ts","../src/commands/ppe-lane/status.ts","../src/commands/ppe-lane/index.ts","../src/commands/release/shared.ts","../src/commands/release/approve.ts","../src/commands/release/hotfix.ts","../src/commands/release/prepare.ts","../src/commands/release/rollback.ts","../src/constants/rollback-targets.ts","../src/commands/release/rollback-local.ts","../src/commands/release/index.ts","../src/lib/package-metadata.ts","../src/lib/version-check.ts","../src/commands/update-version.ts","../src/commands/index.ts"],"sourcesContent":["import { realpathSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { Command } from 'commander';\nimport { registerCommands } from './commands/index.js';\nimport { toErrorMessage, toExitCode } from './lib/errors.js';\nimport { logger } from './lib/logger.js';\nimport { readCliVersion } from './lib/package-metadata.js';\nimport { ensureCliVersionIsUsable } from './lib/version-check.js';\n\nconst version = readCliVersion();\nconst modulePath = fileURLToPath(import.meta.url);\n\nexport const createProgram = (): Command => {\n const program = new Command();\n\n program.name('nexight-devops');\n program.description('CLI for Nexight DevOps workflows');\n program.version(version);\n\n registerCommands(program);\n\n return program;\n};\n\nexport const main = async (argv: string[] = process.argv): Promise<void> => {\n try {\n const versionCheck = await ensureCliVersionIsUsable(argv, version);\n if (versionCheck.action === 'stop') {\n if (versionCheck.exitCode !== 0) {\n process.exitCode = versionCheck.exitCode;\n }\n\n return;\n }\n\n const program = createProgram();\n if (argv.length <= 2) {\n program.outputHelp();\n return;\n }\n\n await program.parseAsync(argv);\n } catch (error: unknown) {\n logger.error(toErrorMessage(error));\n process.exitCode = toExitCode(error);\n }\n};\n\nconst isDirectExecution = (): boolean => {\n const entryPath = process.argv[1];\n\n if (!entryPath) {\n return false;\n }\n\n if (process.execArgv.includes('--eval') || process.execArgv.includes('-e')) {\n return false;\n }\n\n if (pathToFileURL(resolve(entryPath)).href === import.meta.url) {\n return true;\n }\n\n try {\n return resolve(realpathSync(entryPath)) === modulePath;\n } catch {\n return false;\n }\n};\n\nif (isDirectExecution()) {\n void main(process.argv);\n}\n","export const DEFAULT_ADMIN_API_ORIGIN = 'https://tutti.sh';\n","import { randomUUID } from 'node:crypto';\nimport { createWriteStream } from 'node:fs';\nimport { link, mkdir, rename, stat, unlink } from 'node:fs/promises';\nimport { basename, dirname, join, resolve } from 'node:path';\nimport { Readable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\nimport { CliError } from './errors.js';\n\nexport const TUTTI_COMPUTER_API_BASE_PATH = '/api/desktop/v2/admin/tutti-v2/computers';\n\nexport const TUTTI_COMPUTER_CONNECTION_WIRE_VALUE = {\n online: 1,\n offline: 2,\n} as const;\n\nexport const RUNTIME_LOG_RANGE_WIRE_VALUE = {\n '1_hour': 1,\n '3_hours': 2,\n '1_day': 3,\n '3_days': 4,\n '14_days': 5,\n} as const;\n\nexport type TuttiComputerConnectionStatus = 'online' | 'offline' | 'unknown';\n\nexport type ComputerRuntimeLogRangePreset =\n | '1_hour'\n | '3_hours'\n | '1_day'\n | '3_days'\n | '14_days'\n | 'unknown';\n\nexport type SupportedComputerRuntimeLogRangePreset = Exclude<\n ComputerRuntimeLogRangePreset,\n 'unknown'\n>;\n\nexport type ComputerRuntimeLogRecallState =\n | 'waiting_for_device'\n | 'device_processing'\n | 'downloadable'\n | 'failed'\n | 'unknown';\n\nexport type ComputerRuntimeLogUploadMode = 'single_put' | 'multipart' | 'unknown';\n\nexport type TuttiComputer = {\n computerId: string;\n displayName: string;\n reportedName: string;\n owner: {\n userId: string;\n name: string;\n email: string;\n };\n connectionStatus: TuttiComputerConnectionStatus;\n platform: string;\n arch: string;\n companionVersion: string;\n desktopdVersion: string;\n desktopdGeneration: string;\n bindingRevision: string;\n boundAt: string;\n lastSeenAt: string;\n};\n\nexport type ComputerRuntimeLogRecall = {\n taskId: string;\n computerId: string;\n boundUserId: string;\n bindingRevision: string;\n connectionId: string;\n desktopdGeneration: string;\n desktopdVersion: string;\n requestedByUserId: string;\n rangePreset: ComputerRuntimeLogRangePreset;\n requestedStartAt: string;\n requestedEndAt: string;\n state: ComputerRuntimeLogRecallState;\n uploadMode: ComputerRuntimeLogUploadMode;\n originalBytes: string;\n compressedBytes: string;\n sha256: string;\n actualStartAt: string;\n actualEndAt: string;\n unknownTimestampRows: string;\n truncated: boolean;\n collectionDurationMs: string;\n uploadDurationMs: string;\n failureCode: string;\n failureMessage: string;\n acceptedAt: string;\n uploadStartedAt: string;\n completedAt: string;\n failedAt: string;\n deadlineAt: string;\n downloadExpiresAt: string;\n createdAt: string;\n updatedAt: string;\n downloadExpired: boolean;\n};\n\nexport type ListTuttiComputersRequest = {\n nameQuery?: string;\n ownerQuery?: string;\n connectionStatus?: Exclude<TuttiComputerConnectionStatus, 'unknown'>;\n platform?: string;\n desktopdVersion?: string;\n pageSize?: number;\n pageToken?: string;\n};\n\nexport type ListTuttiComputersReply = {\n computers: TuttiComputer[];\n nextPageToken: string;\n};\n\nexport type ListComputerRuntimeLogRecallsRequest = {\n pageSize?: number;\n pageToken?: string;\n};\n\nexport type ListComputerRuntimeLogRecallsReply = {\n tasks: ComputerRuntimeLogRecall[];\n nextPageToken: string;\n};\n\nexport type ComputerRuntimeLogRecallDownload = {\n downloadUrl: string;\n expiresAt: string;\n fileName: string;\n};\n\ntype JsonObject = Record<string, unknown>;\n\ntype FetchLike = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\ntype RuntimeLogWaitDependencies = {\n now?: () => number;\n sleep?: (durationMs: number) => Promise<void>;\n};\n\ntype DownloadDependencies = {\n fetchImpl?: FetchLike;\n newId?: () => string;\n};\n\nconst objectValue = (value: unknown): JsonObject =>\n typeof value === 'object' && value !== null ? (value as JsonObject) : {};\n\nconst field = (root: JsonObject, camelName: string, snakeName: string): unknown =>\n root[camelName] ?? root[snakeName];\n\nconst stringField = (root: JsonObject, camelName: string, snakeName: string): string => {\n const value = field(root, camelName, snakeName);\n return value === undefined || value === null ? '' : String(value);\n};\n\nconst booleanField = (root: JsonObject, camelName: string, snakeName: string): boolean =>\n field(root, camelName, snakeName) === true;\n\nconst normalizedEnum = (value: unknown): string =>\n typeof value === 'string' ? value.trim().toUpperCase() : '';\n\nexport const normalizeComputerConnectionStatus = (\n value: unknown,\n): TuttiComputerConnectionStatus => {\n const name = normalizedEnum(value);\n if (value === 1 || value === '1' || name === 'ONLINE' || name.endsWith('_ONLINE')) {\n return 'online';\n }\n if (value === 2 || value === '2' || name === 'OFFLINE' || name.endsWith('_OFFLINE')) {\n return 'offline';\n }\n return 'unknown';\n};\n\nexport const normalizeRuntimeLogRangePreset = (\n value: unknown,\n): ComputerRuntimeLogRangePreset => {\n const name = normalizedEnum(value);\n if (value === 1 || value === '1' || name.endsWith('_1_HOUR')) {\n return '1_hour';\n }\n if (value === 2 || value === '2' || name.endsWith('_3_HOURS')) {\n return '3_hours';\n }\n if (value === 3 || value === '3' || name.endsWith('_1_DAY')) {\n return '1_day';\n }\n if (value === 4 || value === '4' || name.endsWith('_3_DAYS')) {\n return '3_days';\n }\n if (value === 5 || value === '5' || name.endsWith('_14_DAYS')) {\n return '14_days';\n }\n return 'unknown';\n};\n\nexport const normalizeRuntimeLogRecallState = (\n value: unknown,\n): ComputerRuntimeLogRecallState => {\n const name = normalizedEnum(value);\n if (value === 1 || value === '1' || name.endsWith('_WAITING_FOR_DEVICE')) {\n return 'waiting_for_device';\n }\n if (value === 2 || value === '2' || name.endsWith('_DEVICE_PROCESSING')) {\n return 'device_processing';\n }\n if (value === 3 || value === '3' || name.endsWith('_DOWNLOADABLE')) {\n return 'downloadable';\n }\n if (value === 4 || value === '4' || name.endsWith('_FAILED')) {\n return 'failed';\n }\n return 'unknown';\n};\n\nexport const normalizeRuntimeLogUploadMode = (\n value: unknown,\n): ComputerRuntimeLogUploadMode => {\n const name = normalizedEnum(value);\n if (value === 1 || value === '1' || name.endsWith('_SINGLE_PUT')) {\n return 'single_put';\n }\n if (value === 2 || value === '2' || name.endsWith('_MULTIPART')) {\n return 'multipart';\n }\n return 'unknown';\n};\n\nexport const isTerminalRuntimeLogRecallState = (state: ComputerRuntimeLogRecallState): boolean =>\n state === 'downloadable' || state === 'failed';\n\nexport const parseTuttiComputer = (value: unknown): TuttiComputer => {\n const root = objectValue(value);\n const owner = objectValue(root.owner);\n return {\n computerId: stringField(root, 'computerId', 'computer_id'),\n displayName: stringField(root, 'displayName', 'display_name'),\n reportedName: stringField(root, 'reportedName', 'reported_name'),\n owner: {\n userId: stringField(owner, 'userId', 'user_id'),\n name: stringField(owner, 'name', 'name'),\n email: stringField(owner, 'email', 'email'),\n },\n connectionStatus: normalizeComputerConnectionStatus(\n field(root, 'connectionStatus', 'connection_status'),\n ),\n platform: stringField(root, 'platform', 'platform'),\n arch: stringField(root, 'arch', 'arch'),\n companionVersion: stringField(root, 'companionVersion', 'companion_version'),\n desktopdVersion: stringField(root, 'desktopdVersion', 'desktopd_version'),\n desktopdGeneration: stringField(root, 'desktopdGeneration', 'desktopd_generation'),\n bindingRevision: stringField(root, 'bindingRevision', 'binding_revision'),\n boundAt: stringField(root, 'boundAt', 'bound_at'),\n lastSeenAt: stringField(root, 'lastSeenAt', 'last_seen_at'),\n };\n};\n\nexport const parseComputerRuntimeLogRecall = (value: unknown): ComputerRuntimeLogRecall => {\n const root = objectValue(value);\n return {\n taskId: stringField(root, 'taskId', 'task_id'),\n computerId: stringField(root, 'computerId', 'computer_id'),\n boundUserId: stringField(root, 'boundUserId', 'bound_user_id'),\n bindingRevision: stringField(root, 'bindingRevision', 'binding_revision'),\n connectionId: stringField(root, 'connectionId', 'connection_id'),\n desktopdGeneration: stringField(root, 'desktopdGeneration', 'desktopd_generation'),\n desktopdVersion: stringField(root, 'desktopdVersion', 'desktopd_version'),\n requestedByUserId: stringField(root, 'requestedByUserId', 'requested_by_user_id'),\n rangePreset: normalizeRuntimeLogRangePreset(field(root, 'rangePreset', 'range_preset')),\n requestedStartAt: stringField(root, 'requestedStartAt', 'requested_start_at'),\n requestedEndAt: stringField(root, 'requestedEndAt', 'requested_end_at'),\n state: normalizeRuntimeLogRecallState(field(root, 'state', 'state')),\n uploadMode: normalizeRuntimeLogUploadMode(field(root, 'uploadMode', 'upload_mode')),\n originalBytes: stringField(root, 'originalBytes', 'original_bytes'),\n compressedBytes: stringField(root, 'compressedBytes', 'compressed_bytes'),\n sha256: stringField(root, 'sha256', 'sha256'),\n actualStartAt: stringField(root, 'actualStartAt', 'actual_start_at'),\n actualEndAt: stringField(root, 'actualEndAt', 'actual_end_at'),\n unknownTimestampRows: stringField(root, 'unknownTimestampRows', 'unknown_timestamp_rows'),\n truncated: booleanField(root, 'truncated', 'truncated'),\n collectionDurationMs: stringField(root, 'collectionDurationMs', 'collection_duration_ms'),\n uploadDurationMs: stringField(root, 'uploadDurationMs', 'upload_duration_ms'),\n failureCode: stringField(root, 'failureCode', 'failure_code'),\n failureMessage: stringField(root, 'failureMessage', 'failure_message'),\n acceptedAt: stringField(root, 'acceptedAt', 'accepted_at'),\n uploadStartedAt: stringField(root, 'uploadStartedAt', 'upload_started_at'),\n completedAt: stringField(root, 'completedAt', 'completed_at'),\n failedAt: stringField(root, 'failedAt', 'failed_at'),\n deadlineAt: stringField(root, 'deadlineAt', 'deadline_at'),\n downloadExpiresAt: stringField(root, 'downloadExpiresAt', 'download_expires_at'),\n createdAt: stringField(root, 'createdAt', 'created_at'),\n updatedAt: stringField(root, 'updatedAt', 'updated_at'),\n downloadExpired: booleanField(root, 'downloadExpired', 'download_expired'),\n };\n};\n\nexport const parseTuttiComputerList = (value: unknown): ListTuttiComputersReply => {\n const root = objectValue(value);\n const computers = field(root, 'computers', 'computers');\n return {\n computers: Array.isArray(computers) ? computers.map(parseTuttiComputer) : [],\n nextPageToken: stringField(root, 'nextPageToken', 'next_page_token'),\n };\n};\n\nexport const parseComputerRuntimeLogRecallList = (\n value: unknown,\n): ListComputerRuntimeLogRecallsReply => {\n const root = objectValue(value);\n const tasks = field(root, 'tasks', 'tasks');\n return {\n tasks: Array.isArray(tasks) ? tasks.map(parseComputerRuntimeLogRecall) : [],\n nextPageToken: stringField(root, 'nextPageToken', 'next_page_token'),\n };\n};\n\nexport const parseComputerRuntimeLogRecallDownload = (\n value: unknown,\n): ComputerRuntimeLogRecallDownload => {\n const root = objectValue(value);\n return {\n downloadUrl: stringField(root, 'downloadUrl', 'download_url'),\n expiresAt: stringField(root, 'expiresAt', 'expires_at'),\n fileName: stringField(root, 'fileName', 'file_name'),\n };\n};\n\nexport const tuttiComputerPath = (computerId?: string): string =>\n computerId\n ? `${TUTTI_COMPUTER_API_BASE_PATH}/${encodeURIComponent(computerId)}`\n : TUTTI_COMPUTER_API_BASE_PATH;\n\nexport const runtimeLogRecallCollectionPath = (computerId: string): string =>\n `${tuttiComputerPath(computerId)}/runtime-log-recalls`;\n\nexport const runtimeLogRecallPath = (computerId: string, taskId: string): string =>\n `${runtimeLogRecallCollectionPath(computerId)}/${encodeURIComponent(taskId)}`;\n\nexport const runtimeLogRecallDownloadPath = (computerId: string, taskId: string): string =>\n `${runtimeLogRecallPath(computerId, taskId)}:create-download-url`;\n\nexport const appendQuery = (\n path: string,\n values: Record<string, string | number | undefined>,\n): string => {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined && value !== '') {\n query.set(key, String(value));\n }\n }\n const encoded = query.toString();\n return encoded ? `${path}?${encoded}` : path;\n};\n\nconst defaultSleep = async (durationMs: number): Promise<void> =>\n new Promise((resolveSleep) => {\n setTimeout(resolveSleep, durationMs);\n });\n\nexport const waitForRuntimeLogRecall = async (\n getTask: () => Promise<ComputerRuntimeLogRecall>,\n options: {\n initialTask?: ComputerRuntimeLogRecall;\n onUpdate?: (task: ComputerRuntimeLogRecall) => void;\n pollIntervalMs: number;\n timeoutMs: number;\n },\n dependencies: RuntimeLogWaitDependencies = {},\n): Promise<ComputerRuntimeLogRecall> => {\n const now = dependencies.now ?? Date.now;\n const sleep = dependencies.sleep ?? defaultSleep;\n const startedAt = now();\n let current = options.initialTask;\n\n if (current) {\n options.onUpdate?.(current);\n if (isTerminalRuntimeLogRecallState(current.state)) {\n return current;\n }\n }\n\n while (now() - startedAt < options.timeoutMs) {\n const remainingMs = options.timeoutMs - (now() - startedAt);\n await sleep(Math.min(options.pollIntervalMs, remainingMs));\n current = await getTask();\n options.onUpdate?.(current);\n if (isTerminalRuntimeLogRecallState(current.state)) {\n return current;\n }\n }\n\n throw new CliError(\n `日志召回任务在 ${Math.ceil(options.timeoutMs / 1_000)} 秒内未完成,可稍后使用 log-recall get 查询`,\n 1,\n );\n};\n\nexport const safeRuntimeLogFileName = (fileName: string, taskId: string): string => {\n const safeName = basename(fileName.trim());\n return safeName && safeName !== '.' ? safeName : `${taskId}.tar.gz`;\n};\n\nexport const downloadRuntimeLogArchive = async (\n downloadUrl: string,\n outputPath: string,\n options: { force?: boolean } = {},\n dependencies: DownloadDependencies = {},\n): Promise<{ bytes: number; path: string }> => {\n let url: URL;\n try {\n url = new URL(downloadUrl);\n } catch {\n throw new CliError('管理后台返回了无效的日志下载地址', 1);\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new CliError('日志下载地址必须使用 http 或 https', 1);\n }\n\n const absolutePath = resolve(outputPath);\n const outputDirectory = dirname(absolutePath);\n await mkdir(outputDirectory, { recursive: true });\n\n if (!options.force) {\n try {\n await stat(absolutePath);\n throw new CliError(`输出文件已存在: ${absolutePath};如需覆盖请添加 --force`, 1);\n } catch (error: unknown) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n }\n\n const temporaryPath = join(\n outputDirectory,\n `.${basename(absolutePath)}.${process.pid}.${(dependencies.newId ?? randomUUID)()}.tmp`,\n );\n const response = await (dependencies.fetchImpl ?? fetch)(url, {\n headers: { accept: 'application/gzip, application/octet-stream' },\n method: 'GET',\n });\n if (!response.ok) {\n throw new CliError(`日志下载失败: HTTP ${response.status} ${response.statusText}`, 1);\n }\n if (!response.body) {\n throw new CliError('日志下载失败: 响应内容为空', 1);\n }\n\n try {\n await pipeline(\n Readable.from(response.body as unknown as AsyncIterable<Uint8Array>),\n createWriteStream(temporaryPath, { flags: 'wx', mode: 0o600 }),\n );\n\n if (options.force) {\n await unlink(absolutePath).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n });\n await rename(temporaryPath, absolutePath);\n } else {\n try {\n await link(temporaryPath, absolutePath);\n } catch (error: unknown) {\n if ((error as NodeJS.ErrnoException).code === 'EEXIST') {\n throw new CliError(`输出文件已存在: ${absolutePath};如需覆盖请添加 --force`, 1);\n }\n throw error;\n }\n await unlink(temporaryPath);\n }\n\n return { bytes: (await stat(absolutePath)).size, path: absolutePath };\n } catch (error: unknown) {\n await unlink(temporaryPath).catch(() => undefined);\n throw error;\n }\n};\n","export class CliError extends Error {\n readonly exitCode: number;\n\n constructor(message: string, exitCode: number) {\n super(message);\n this.name = 'CliError';\n this.exitCode = normalizeExitCode(exitCode);\n }\n}\n\nconst normalizeExitCode = (exitCode: number): number => {\n if (!Number.isInteger(exitCode) || exitCode < 1 || exitCode > 255) {\n return 1;\n }\n\n return exitCode;\n};\n\nexport const toErrorMessage = (error: unknown): string => {\n if (error instanceof Error) {\n return error.message;\n }\n\n return 'Unknown error';\n};\n\nexport const toExitCode = (error: unknown): number => {\n if (error instanceof CliError) {\n return error.exitCode;\n }\n\n return 1;\n};\n","import { DEFAULT_ADMIN_API_ORIGIN } from '../constants/admin.js';\nimport {\n appendQuery,\n parseComputerRuntimeLogRecall,\n parseComputerRuntimeLogRecallDownload,\n parseComputerRuntimeLogRecallList,\n parseTuttiComputer,\n parseTuttiComputerList,\n RUNTIME_LOG_RANGE_WIRE_VALUE,\n runtimeLogRecallCollectionPath,\n runtimeLogRecallDownloadPath,\n runtimeLogRecallPath,\n TUTTI_COMPUTER_CONNECTION_WIRE_VALUE,\n tuttiComputerPath,\n type ComputerRuntimeLogRecall,\n type ComputerRuntimeLogRecallDownload,\n type ListComputerRuntimeLogRecallsReply,\n type ListComputerRuntimeLogRecallsRequest,\n type ListTuttiComputersReply,\n type ListTuttiComputersRequest,\n type SupportedComputerRuntimeLogRangePreset,\n type TuttiComputer,\n} from './admin-computer.js';\n\nconst ADMIN_TOKEN_INSPECT_PATH = '/api/admin/api/v1/admin/auth/token/inspect';\nconst APP_CENTER_BASE = '/api/desktop/v1/admin/app-center';\n\nexport type AdminRuntimeConfig = {\n apiOrigin: string;\n token?: string;\n};\n\nexport class AdminApiError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly body: unknown,\n ) {\n super(message);\n this.name = 'AdminApiError';\n }\n}\n\ntype FetchLike = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\nexport const normalizeAdminApiOrigin = (input?: string): string => {\n const raw = (\n input ??\n process.env.NEXIGHT_ADMIN_URL ??\n process.env.TUTTI_ADMIN_URL ??\n DEFAULT_ADMIN_API_ORIGIN\n ).trim();\n\n let url: URL;\n try {\n url = new URL(raw);\n } catch {\n throw new Error(`Invalid admin URL: ${raw}`);\n }\n\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new Error(`Admin URL must use http or https: ${raw}`);\n }\n\n if (url.hostname === 'admin.tutti.sh') {\n return 'https://tutti.sh';\n }\n\n if (url.hostname === 'admin.svenzeng.com') {\n return 'https://svenzeng.com';\n }\n\n return url.origin;\n};\n\nexport class AdminApi {\n constructor(\n private readonly runtime: AdminRuntimeConfig,\n private readonly fetchImpl: FetchLike = fetch,\n ) {}\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const headers: Record<string, string> = {\n accept: 'application/json',\n };\n\n if (this.runtime.token) {\n headers.authorization = `Bearer ${this.runtime.token}`;\n }\n\n let payload: BodyInit | undefined;\n if (body !== undefined) {\n headers['content-type'] = 'application/json';\n payload = JSON.stringify(body);\n }\n\n const response = await this.fetchImpl(`${this.runtime.apiOrigin}${path}`, {\n method,\n headers,\n body: payload,\n });\n const parsed = await parseResponseBody(response);\n\n if (!response.ok) {\n const detail = adminApiErrorDetail(parsed);\n throw new AdminApiError(\n `Admin API request failed: HTTP ${response.status} ${response.statusText}${detail ? `: ${detail}` : ''}`,\n response.status,\n parsed,\n );\n }\n\n return parsed as T;\n }\n\n get<T>(path: string): Promise<T> {\n return this.request<T>('GET', path);\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('POST', path, body);\n }\n\n inspectToken(token?: string): Promise<unknown> {\n return this.post(ADMIN_TOKEN_INSPECT_PATH, token ? { token_value: token } : {});\n }\n\n health(): Promise<unknown> {\n return this.get('/health');\n }\n\n async listApps(query?: string): Promise<unknown[]> {\n const reply = await this.get<{ apps?: unknown[] }>(`${APP_CENTER_BASE}/apps`);\n const apps = reply.apps ?? [];\n\n if (!query?.trim()) {\n return apps;\n }\n\n const needle = query.trim().toLowerCase();\n return apps.filter((app) => JSON.stringify(app).toLowerCase().includes(needle));\n }\n\n async listVersions(appId: string): Promise<unknown[]> {\n const reply = await this.get<{ versions?: unknown[] }>(\n `${APP_CENTER_BASE}/apps/${encodeURIComponent(appId)}/versions`,\n );\n\n return reply.versions ?? [];\n }\n\n async appDetail(appId: string, include: string[] = []): Promise<Record<string, unknown>> {\n const apps = await this.listApps();\n const app = apps.find((item) => getField(item, 'appId', 'app_id') === appId);\n const result: Record<string, unknown> = { app };\n\n if (include.includes('versions') || include.includes('latest')) {\n const versions = await this.listVersions(appId);\n result.versions = versions;\n\n if (include.includes('latest')) {\n const latestVersionId = getField(app, 'latestVersionId', 'latest_version_id');\n result.latest = versions.find(\n (version) => getField(version, 'versionId', 'version_id') === latestVersionId,\n );\n }\n }\n\n return result;\n }\n\n async listTuttiComputers(\n request: ListTuttiComputersRequest = {},\n ): Promise<ListTuttiComputersReply> {\n const connectionStatus = request.connectionStatus\n ? TUTTI_COMPUTER_CONNECTION_WIRE_VALUE[request.connectionStatus]\n : undefined;\n const reply = await this.get(\n appendQuery(tuttiComputerPath(), {\n nameQuery: request.nameQuery?.trim(),\n ownerQuery: request.ownerQuery?.trim(),\n connectionStatus,\n platform: request.platform?.trim(),\n desktopdVersion: request.desktopdVersion?.trim(),\n pageSize: request.pageSize,\n pageToken: request.pageToken?.trim(),\n }),\n );\n return parseTuttiComputerList(reply);\n }\n\n async getTuttiComputer(computerId: string): Promise<TuttiComputer> {\n return parseTuttiComputer(await this.get(tuttiComputerPath(computerId)));\n }\n\n async listComputerRuntimeLogRecalls(\n computerId: string,\n request: ListComputerRuntimeLogRecallsRequest = {},\n ): Promise<ListComputerRuntimeLogRecallsReply> {\n const reply = await this.get(\n appendQuery(runtimeLogRecallCollectionPath(computerId), {\n pageSize: request.pageSize,\n pageToken: request.pageToken?.trim(),\n }),\n );\n return parseComputerRuntimeLogRecallList(reply);\n }\n\n async getComputerRuntimeLogRecall(\n computerId: string,\n taskId: string,\n ): Promise<ComputerRuntimeLogRecall> {\n return parseComputerRuntimeLogRecall(await this.get(runtimeLogRecallPath(computerId, taskId)));\n }\n\n async createComputerRuntimeLogRecall(\n computerId: string,\n rangePreset: SupportedComputerRuntimeLogRangePreset,\n ): Promise<ComputerRuntimeLogRecall> {\n const reply = await this.post(runtimeLogRecallCollectionPath(computerId), {\n computerId,\n rangePreset: RUNTIME_LOG_RANGE_WIRE_VALUE[rangePreset],\n });\n return parseComputerRuntimeLogRecall(reply);\n }\n\n async createComputerRuntimeLogRecallDownload(\n computerId: string,\n taskId: string,\n ): Promise<ComputerRuntimeLogRecallDownload> {\n const reply = await this.post(runtimeLogRecallDownloadPath(computerId, taskId), {\n computerId,\n taskId,\n });\n return parseComputerRuntimeLogRecallDownload(reply);\n }\n}\n\nconst parseResponseBody = async (response: Response): Promise<unknown> => {\n const text = await response.text();\n if (!text.trim()) {\n return {};\n }\n\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n};\n\nconst adminApiErrorDetail = (value: unknown): string => {\n if (!value || typeof value !== 'object') {\n return typeof value === 'string' ? value.trim() : '';\n }\n\n const record = value as Record<string, unknown>;\n for (const field of ['errmsg', 'message', 'reason', 'error']) {\n if (typeof record[field] === 'string' && record[field].trim()) {\n return record[field].trim();\n }\n }\n return '';\n};\n\nconst getField = (value: unknown, ...fields: string[]): unknown => {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n\n const record = value as Record<string, unknown>;\n for (const field of fields) {\n if (record[field] !== undefined) {\n return record[field];\n }\n }\n\n return undefined;\n};\n","import { mkdir, readFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { DEFAULT_ADMIN_API_ORIGIN } from '../constants/admin.js';\nimport { writePrivateFile } from './private-file.js';\n\nexport type AdminConfig = {\n apiOrigin: string;\n token: string | null;\n};\n\nexport type DataFinderConfig = {\n accessKeyId: string;\n appId: string;\n baseUrl: string;\n defaultDashboardId: string;\n pathMode?: 'app' | 'project';\n projectId: string;\n secretAccessKey: string;\n timezone: string;\n};\n\nexport type CliConfig = {\n admin?: AdminConfig;\n datafinder?: DataFinderConfig;\n defaultAwsProfile: string;\n locale: string;\n setup: {\n awsConfigured: boolean;\n datafinderConfigured?: boolean;\n ghConfigured: boolean;\n localeConfigured: boolean;\n };\n versionCheck?: {\n lastAutoCheckedAt: string | null;\n };\n};\n\nconst defaultConfig: CliConfig = {\n locale: 'zh-CN',\n defaultAwsProfile: 'AdministratorAccess-250509935467',\n setup: {\n localeConfigured: false,\n awsConfigured: false,\n ghConfigured: false,\n },\n versionCheck: {\n lastAutoCheckedAt: null,\n },\n};\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null;\n\nconst asBoolean = (value: unknown, fallback: boolean): boolean =>\n typeof value === 'boolean' ? value : fallback;\n\nconst asString = (value: unknown, fallback: string): string =>\n typeof value === 'string' ? value : fallback;\n\nconst asNullableString = (value: unknown, fallback: string | null): string | null => {\n if (typeof value === 'string') {\n return value;\n }\n\n if (value === null) {\n return null;\n }\n\n return fallback;\n};\n\nconst normalizeConfig = (source: unknown): CliConfig => {\n const admin = isObject(source) && isObject(source.admin) ? source.admin : undefined;\n const datafinder = isObject(source) && isObject(source.datafinder) ? source.datafinder : undefined;\n const setup = isObject(source) && isObject(source.setup) ? source.setup : {};\n const versionCheck = isObject(source) && isObject(source.versionCheck) ? source.versionCheck : {};\n const defaultLastAutoCheckedAt = defaultConfig.versionCheck?.lastAutoCheckedAt ?? null;\n\n return {\n ...(admin\n ? {\n admin: {\n apiOrigin: asString(admin.apiOrigin, DEFAULT_ADMIN_API_ORIGIN),\n token: asNullableString(admin.token, null),\n },\n }\n : {}),\n ...(datafinder\n ? {\n datafinder: {\n accessKeyId: asString(datafinder.accessKeyId, ''),\n appId: asString(datafinder.appId, ''),\n baseUrl: asString(datafinder.baseUrl, 'https://analytics.volcengineapi.com'),\n defaultDashboardId: asString(datafinder.defaultDashboardId, ''),\n pathMode: datafinder.pathMode === 'app' ? 'app' : 'project',\n projectId: asString(datafinder.projectId, ''),\n secretAccessKey: asString(datafinder.secretAccessKey, ''),\n timezone: asString(datafinder.timezone, 'Asia/Shanghai'),\n },\n }\n : {}),\n locale: isObject(source) ? asString(source.locale, defaultConfig.locale) : defaultConfig.locale,\n defaultAwsProfile: isObject(source)\n ? asString(source.defaultAwsProfile, defaultConfig.defaultAwsProfile)\n : defaultConfig.defaultAwsProfile,\n setup: {\n localeConfigured: asBoolean(setup.localeConfigured, defaultConfig.setup.localeConfigured),\n awsConfigured: asBoolean(setup.awsConfigured, defaultConfig.setup.awsConfigured),\n datafinderConfigured: asBoolean(setup.datafinderConfigured, false),\n ghConfigured: asBoolean(setup.ghConfigured, defaultConfig.setup.ghConfigured),\n },\n versionCheck: {\n lastAutoCheckedAt: asNullableString(versionCheck.lastAutoCheckedAt, defaultLastAutoCheckedAt),\n },\n };\n};\n\nconst resolveConfigDir = (configDir?: string): string =>\n configDir ?? join(process.env.XDG_CONFIG_HOME ?? join(homedir(), '.config'), 'nexight-devops');\n\nconst resolveConfigPath = (configDir?: string): string => join(resolveConfigDir(configDir), 'config.json');\n\nexport const loadConfig = async (options: { configDir?: string } = {}): Promise<CliConfig> => {\n try {\n const raw = await readFile(resolveConfigPath(options.configDir), 'utf8');\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`Invalid CLI config at ${resolveConfigPath(options.configDir)}`);\n }\n\n return normalizeConfig(parsed);\n } catch (error: unknown) {\n if (isObject(error) && 'code' in error && error.code === 'ENOENT') {\n return normalizeConfig(undefined);\n }\n\n throw error;\n }\n};\n\nexport const saveConfig = async (\n config: CliConfig,\n options: { configDir?: string } = {},\n): Promise<void> => {\n const configDir = resolveConfigDir(options.configDir);\n await mkdir(configDir, { recursive: true });\n const configPath = resolveConfigPath(options.configDir);\n await writePrivateFile(configPath, `${JSON.stringify(config, null, 2)}\\n`);\n};\n","import { randomUUID } from 'node:crypto';\nimport { open, rename, unlink } from 'node:fs/promises';\nimport { basename, dirname, join } from 'node:path';\n\nexport const writePrivateFile = async (filePath: string, contents: string): Promise<void> => {\n const directory = dirname(filePath);\n const temporaryPath = join(\n directory,\n `.${basename(filePath)}.${process.pid}.${randomUUID()}.tmp`,\n );\n let handle: Awaited<ReturnType<typeof open>> | undefined;\n\n try {\n handle = await open(temporaryPath, 'wx', 0o600);\n await handle.writeFile(contents, 'utf8');\n await handle.sync();\n await handle.close();\n handle = undefined;\n await rename(temporaryPath, filePath);\n } catch (error: unknown) {\n await handle?.close().catch(() => undefined);\n await unlink(temporaryPath).catch(() => undefined);\n throw error;\n }\n};\n","import chalk from 'chalk';\nimport symbols from 'log-symbols';\n\nconst writeLine = (line: string, useErrorStream = false): void => {\n if (useErrorStream) {\n console.error(line);\n return;\n }\n\n console.log(line);\n};\n\nexport const logger = {\n error: (message: string): void => {\n writeLine(`${symbols.error} ${chalk.red(message)}`, true);\n },\n info: (message: string): void => {\n writeLine(`${symbols.info} ${chalk.cyan(message)}`);\n },\n step: (message: string): void => {\n writeLine(`${chalk.blue('→')} ${chalk.bold(message)}`);\n },\n success: (message: string): void => {\n writeLine(`${symbols.success} ${chalk.green(message)}`);\n },\n warn: (message: string): void => {\n writeLine(`${symbols.warning} ${chalk.yellow(message)}`, true);\n },\n};\n","import type { Command } from 'commander';\nimport { AdminApi, normalizeAdminApiOrigin } from '../../lib/admin-api.js';\nimport { loadConfig, type CliConfig } from '../../lib/config.js';\nimport { CliError } from '../../lib/errors.js';\nimport { logger } from '../../lib/logger.js';\n\nexport type AdminCommandOptions = {\n adminUrl?: string;\n json?: boolean;\n};\n\nexport type AdminContext = {\n api: AdminApi;\n apiOrigin: string;\n config: CliConfig;\n token: string;\n};\n\nexport const addAdminConnectionOptions = (command: Command): Command =>\n command\n .option('--admin-url <url>', 'management API URL or admin.tutti.sh page URL')\n .option('--json', 'print the response as JSON without CLI decorations');\n\nexport const resolveAdminContext = async (\n options: AdminCommandOptions = {},\n tokenOverride?: string,\n): Promise<AdminContext> => {\n const config = await loadConfig();\n const apiOrigin = normalizeAdminApiOrigin(options.adminUrl ?? config.admin?.apiOrigin);\n const token = (\n tokenOverride ??\n process.env.NEXIGHT_ADMIN_TOKEN ??\n process.env.TUTTI_ADMIN_TOKEN ??\n config.admin?.token ??\n ''\n ).trim();\n\n if (!token) {\n throw new CliError('管理后台 Token 未配置,请先运行 nexight-devops admin auth login', 1);\n }\n\n return {\n api: new AdminApi({ apiOrigin, token }),\n apiOrigin,\n config,\n token,\n };\n};\n\nexport const printAdminResult = (value: unknown, options: AdminCommandOptions = {}): void => {\n const output = JSON.stringify(value, null, 2) ?? String(value);\n if (options.json) {\n console.log(output);\n return;\n }\n\n logger.info(output);\n};\n\nexport const parseAdminInclude = (value?: string): string[] =>\n (value ?? '')\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n","import type { Command } from 'commander';\nimport {\n addAdminConnectionOptions,\n parseAdminInclude,\n printAdminResult,\n resolveAdminContext,\n type AdminCommandOptions,\n} from './shared.js';\n\ntype AdminAppListOptions = AdminCommandOptions & {\n brand: string;\n query?: string;\n};\n\ntype AdminAppDetailOptions = AdminCommandOptions & {\n appId: string;\n brand: string;\n include?: string;\n};\n\nexport const runAdminAppList = async (options: AdminAppListOptions): Promise<void> => {\n const { api } = await resolveAdminContext(options);\n printAdminResult(await api.listApps(options.query), options);\n};\n\nexport const runAdminAppDetail = async (options: AdminAppDetailOptions): Promise<void> => {\n const { api } = await resolveAdminContext(options);\n printAdminResult(await api.appDetail(options.appId, parseAdminInclude(options.include)), options);\n};\n\nexport const registerAdminAppCommand = (program: Command): void => {\n const app = program.command('app').description('Query App Center data from the management backend');\n\n addAdminConnectionOptions(\n app\n .command('list')\n .description('List App Center applications')\n .requiredOption('--brand <brand>', 'App Center brand')\n .option('--query <query>', 'Filter applications by a case-insensitive text query'),\n ).action(runAdminAppList);\n\n addAdminConnectionOptions(\n app\n .command('detail')\n .description('Show one App Center application')\n .requiredOption('--brand <brand>', 'App Center brand')\n .requiredOption('--app-id <appId>')\n .option('--include <include>', 'comma separated: latest,versions'),\n ).action(runAdminAppDetail);\n};\n","import { checkbox, confirm, input, password, select } from '@inquirer/prompts';\nimport ora from 'ora';\n\nexport const ui: {\n checkbox: typeof checkbox;\n confirm: typeof confirm;\n input: typeof input;\n password: typeof password;\n select: typeof select;\n spinner: (text: string) => ReturnType<typeof ora>;\n} = {\n checkbox,\n confirm,\n input,\n password,\n select,\n spinner: (text: string) => ora({ text, spinner: 'dots' }),\n};\n","import type { Command } from 'commander';\nimport { CliError } from '../../lib/errors.js';\nimport { AdminApi, normalizeAdminApiOrigin } from '../../lib/admin-api.js';\nimport { loadConfig, saveConfig } from '../../lib/config.js';\nimport { logger } from '../../lib/logger.js';\nimport { ui } from '../../lib/ui.js';\nimport {\n addAdminConnectionOptions,\n printAdminResult,\n resolveAdminContext,\n type AdminCommandOptions,\n} from './shared.js';\n\nexport const runAdminLogin = async (options: AdminCommandOptions = {}): Promise<void> => {\n const config = await loadConfig();\n const apiOrigin = normalizeAdminApiOrigin(options.adminUrl ?? config.admin?.apiOrigin);\n const token = (await ui.password({ message: '请输入 Tutti 管理后台 Token' })).trim();\n\n if (!token) {\n throw new CliError('管理后台 Token 不能为空', 1);\n }\n\n const identity = await new AdminApi({ apiOrigin, token }).inspectToken(token);\n await saveConfig({\n ...config,\n admin: {\n apiOrigin,\n token,\n },\n });\n\n logger.success(`管理后台登录成功: ${apiOrigin}`);\n if (options.json) {\n printAdminResult(identity, options);\n }\n};\n\nexport const runAdminLogout = async (): Promise<void> => {\n const config = await loadConfig();\n config.admin = undefined;\n await saveConfig(config);\n logger.success('已退出管理后台');\n};\n\nexport const runAdminWhoami = async (options: AdminCommandOptions = {}): Promise<void> => {\n const { api } = await resolveAdminContext(options);\n printAdminResult(await api.inspectToken(), options);\n};\n\nexport const registerAdminAuthCommand = (program: Command): void => {\n const auth = program.command('auth').description('Manage management backend authentication');\n\n auth\n .command('login')\n .description('Save and verify a management backend token')\n .option('--admin-url <url>', 'management API URL or admin.tutti.sh page URL')\n .option('--json', 'also print the verified identity as JSON')\n .action(runAdminLogin);\n\n auth\n .command('logout')\n .description('Remove the saved management backend token')\n .action(runAdminLogout);\n\n addAdminConnectionOptions(\n auth\n .command('whoami')\n .description('Inspect the currently configured management backend token'),\n ).action(runAdminWhoami);\n\n const token = auth.command('token').description('Inspect management backend tokens');\n addAdminConnectionOptions(\n token.command('inspect').description('Inspect the currently configured management backend token'),\n ).action(runAdminWhoami);\n};\n","import { mkdtemp } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { AdminApi } from './admin-api.js';\nimport {\n downloadRuntimeLogArchive,\n safeRuntimeLogFileName,\n waitForRuntimeLogRecall,\n type ComputerRuntimeLogRecall,\n type SupportedComputerRuntimeLogRangePreset,\n type TuttiComputer,\n} from './admin-computer.js';\nimport { CliError } from './errors.js';\n\nconst RANGE_SELECTION_SAFETY_MS = 5_000;\nconst PROGRESS_HEARTBEAT_MS = 15_000;\n\nconst RUNTIME_LOG_RANGES: Array<{\n durationMs: number;\n preset: SupportedComputerRuntimeLogRangePreset;\n}> = [\n { durationMs: 60 * 60_000, preset: '1_hour' },\n { durationMs: 3 * 60 * 60_000, preset: '3_hours' },\n { durationMs: 24 * 60 * 60_000, preset: '1_day' },\n { durationMs: 3 * 24 * 60 * 60_000, preset: '3_days' },\n { durationMs: 14 * 24 * 60 * 60_000, preset: '14_days' },\n];\n\nconst RANGE_ALIASES: Record<string, SupportedComputerRuntimeLogRangePreset> = {\n '1h': '1_hour',\n '1_hour': '1_hour',\n '3h': '3_hours',\n '3_hours': '3_hours',\n '1d': '1_day',\n '1_day': '1_day',\n '3d': '3_days',\n '3_days': '3_days',\n '14d': '14_days',\n '14_days': '14_days',\n};\n\ntype RuntimeLogApi = Pick<\n AdminApi,\n | 'createComputerRuntimeLogRecall'\n | 'createComputerRuntimeLogRecallDownload'\n | 'getComputerRuntimeLogRecall'\n | 'getTuttiComputer'\n | 'listTuttiComputers'\n>;\n\nexport type RuntimeLogRecallSelection = {\n recallInterval: {\n from: string;\n to: string;\n };\n requestedInterval: {\n from: string;\n to: string;\n };\n rangePreset: SupportedComputerRuntimeLogRangePreset;\n};\n\nexport type RuntimeLogRecallArtifact = {\n bytes: number;\n expiresAt: string;\n fileName: string;\n path: string;\n};\n\nexport type RuntimeLogRecallResult = {\n artifact: RuntimeLogRecallArtifact;\n computer: {\n computerId: string;\n connectionStatus: TuttiComputer['connectionStatus'];\n desktopdVersion: string;\n displayName: string;\n reportedName: string;\n };\n recallInterval: RuntimeLogRecallSelection['recallInterval'];\n requestedInterval: RuntimeLogRecallSelection['requestedInterval'];\n rangePreset: SupportedComputerRuntimeLogRangePreset;\n task: ComputerRuntimeLogRecall;\n};\n\ntype RuntimeLogWorkflowDependencies = {\n api: RuntimeLogApi;\n clock?: () => number;\n downloadArchive?: typeof downloadRuntimeLogArchive;\n makeTempDirectory?: () => Promise<string>;\n onProgress?: (message: string) => void;\n sleep?: (durationMs: number) => Promise<void>;\n};\n\nexport const parseRuntimeLogRange = (value: string): SupportedComputerRuntimeLogRangePreset => {\n const preset = RANGE_ALIASES[value.trim().toLowerCase().replaceAll('-', '_')];\n if (!preset) {\n throw new CliError('--range 必须是 1h、3h、1d、3d 或 14d', 1);\n }\n return preset;\n};\n\nconst parseIntervalTimestamp = (value: string, optionName: '--from' | '--to'): Date => {\n const normalized = value.trim();\n if (!/(?:z|[+-]\\d{2}:\\d{2})$/i.test(normalized)) {\n throw new CliError(`${optionName} 必须包含时区偏移或 Z`, 1);\n }\n const parsed = new Date(normalized);\n if (Number.isNaN(parsed.getTime())) {\n throw new CliError(`${optionName} 不是有效时间: ${value}`, 1);\n }\n return parsed;\n};\n\nconst rangeDuration = (preset: SupportedComputerRuntimeLogRangePreset): number =>\n RUNTIME_LOG_RANGES.find((range) => range.preset === preset)?.durationMs ?? 0;\n\nexport const resolveRuntimeLogRecallSelection = (\n input: { from?: string; range?: string; to?: string },\n now = new Date(),\n): RuntimeLogRecallSelection => {\n if (Number.isNaN(now.getTime())) {\n throw new CliError('当前时间无效,无法计算日志召回区间', 1);\n }\n if (input.range && (input.from || input.to)) {\n throw new CliError('--range 不能与 --from/--to 同时使用', 1);\n }\n if (input.to && !input.from) {\n throw new CliError('--to 必须与 --from 一起使用', 1);\n }\n\n if (!input.from) {\n const rangePreset = parseRuntimeLogRange(input.range ?? '1h');\n const durationMs = rangeDuration(rangePreset);\n const interval = {\n from: new Date(now.getTime() - durationMs).toISOString(),\n to: now.toISOString(),\n };\n return {\n rangePreset,\n recallInterval: interval,\n requestedInterval: interval,\n };\n }\n\n const from = parseIntervalTimestamp(input.from, '--from');\n const to = input.to ? parseIntervalTimestamp(input.to, '--to') : now;\n if (from.getTime() >= to.getTime()) {\n throw new CliError('--from 必须早于 --to', 1);\n }\n if (to.getTime() > now.getTime()) {\n throw new CliError('--to 不能晚于当前时间', 1);\n }\n\n const requiredDurationMs = now.getTime() - from.getTime() + RANGE_SELECTION_SAFETY_MS;\n const selected = RUNTIME_LOG_RANGES.find((range) => range.durationMs >= requiredDurationMs);\n if (!selected) {\n throw new CliError('--from 超出最近 14 天,当前日志召回服务无法覆盖', 1);\n }\n\n return {\n rangePreset: selected.preset,\n requestedInterval: {\n from: from.toISOString(),\n to: to.toISOString(),\n },\n recallInterval: {\n from: new Date(now.getTime() - selected.durationMs).toISOString(),\n to: now.toISOString(),\n },\n };\n};\n\nconst isUUID = (value: string): boolean =>\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n value,\n );\n\nconst computerNameMatches = (computer: TuttiComputer, selector: string): boolean => {\n const expected = selector.trim().toLowerCase();\n return [computer.displayName, computer.reportedName]\n .map((value) => value.trim().toLowerCase())\n .includes(expected);\n};\n\nexport const resolveOnlineTuttiComputer = async (\n api: Pick<AdminApi, 'getTuttiComputer' | 'listTuttiComputers'>,\n selector: string,\n): Promise<TuttiComputer> => {\n const normalized = selector.trim();\n if (!normalized) {\n throw new CliError('Computer 名称或 ID 不能为空', 1);\n }\n\n if (isUUID(normalized)) {\n const computer = await api.getTuttiComputer(normalized);\n if (computer.connectionStatus !== 'online') {\n throw new CliError(`Computer ${normalized} 当前不在线,无法召回日志`, 1);\n }\n return computer;\n }\n\n const matches: TuttiComputer[] = [];\n const seenPageTokens = new Set<string>();\n let pageToken = '';\n do {\n const page = await api.listTuttiComputers({\n connectionStatus: 'online',\n nameQuery: normalized,\n pageSize: 50,\n pageToken: pageToken || undefined,\n });\n matches.push(...page.computers.filter((computer) => computerNameMatches(computer, normalized)));\n pageToken = page.nextPageToken;\n if (pageToken && seenPageTokens.has(pageToken)) {\n throw new CliError('管理后台返回了重复分页游标,无法可靠解析 Computer', 1);\n }\n if (pageToken) {\n seenPageTokens.add(pageToken);\n }\n } while (pageToken);\n\n if (matches.length === 0) {\n throw new CliError(`未找到名称完全匹配且在线的 Computer: ${normalized}`, 1);\n }\n if (matches.length > 1) {\n const ids = matches.map((computer) => computer.computerId).join(', ');\n throw new CliError(`找到多个同名在线 Computer,请改用 Computer ID: ${ids}`, 1);\n }\n return matches[0] as TuttiComputer;\n};\n\nexport const resolveOnlineTuttiComputersByOwner = async (\n api: Pick<AdminApi, 'listTuttiComputers'>,\n ownerQuery: string,\n): Promise<TuttiComputer[]> => {\n const normalized = ownerQuery.trim();\n if (!normalized) {\n throw new CliError('用户名或邮箱不能为空', 1);\n }\n\n const matches: TuttiComputer[] = [];\n const seenComputerIds = new Set<string>();\n const seenPageTokens = new Set<string>();\n let pageToken = '';\n do {\n const page = await api.listTuttiComputers({\n connectionStatus: 'online',\n ownerQuery: normalized,\n pageSize: 50,\n pageToken: pageToken || undefined,\n });\n for (const computer of page.computers) {\n if (!seenComputerIds.has(computer.computerId)) {\n seenComputerIds.add(computer.computerId);\n matches.push(computer);\n }\n }\n pageToken = page.nextPageToken;\n if (pageToken && seenPageTokens.has(pageToken)) {\n throw new CliError('管理后台返回了重复分页游标,无法可靠解析用户名对应的 Computer', 1);\n }\n if (pageToken) {\n seenPageTokens.add(pageToken);\n }\n } while (pageToken);\n\n if (matches.length === 0) {\n throw new CliError(`未找到用户名或邮箱匹配且在线的 Computer: ${normalized}`, 1);\n }\n return matches;\n};\n\nexport const resolveOnlineTuttiComputerForLogs = async (\n api: Pick<AdminApi, 'getTuttiComputer' | 'listTuttiComputers'>,\n input: { computer?: string; ownerQuery?: string },\n): Promise<TuttiComputer> => {\n const hasComputer = Boolean(input.computer?.trim());\n const hasOwnerQuery = Boolean(input.ownerQuery?.trim());\n if (hasComputer === hasOwnerQuery) {\n throw new CliError('Computer 名称/ID 与用户名/邮箱必须二选一', 1);\n }\n if (hasComputer) {\n return resolveOnlineTuttiComputer(api, input.computer as string);\n }\n\n const matches = await resolveOnlineTuttiComputersByOwner(api, input.ownerQuery as string);\n if (matches.length > 1) {\n const candidates = matches\n .map(\n (computer) =>\n `${computer.displayName || computer.reportedName} (${computer.computerId})`,\n )\n .join(', ');\n throw new CliError(\n `用户名/邮箱匹配到多个在线 Computer,请改用 Computer 名称或 ID: ${candidates}`,\n 1,\n );\n }\n return matches[0] as TuttiComputer;\n};\n\nconst stateLabel = (task: ComputerRuntimeLogRecall): string => {\n switch (task.state) {\n case 'waiting_for_device':\n return '等待设备接收';\n case 'device_processing':\n return '设备采集并上传中';\n case 'downloadable':\n return '可下载';\n case 'failed':\n return `失败${task.failureMessage ? `: ${task.failureMessage}` : ''}`;\n default:\n return `未知状态 ${task.state}`;\n }\n};\n\nconst taskFailure = (task: ComputerRuntimeLogRecall): CliError =>\n new CliError(\n `日志召回失败 [${task.taskId}]: ${task.failureMessage || task.failureCode || '设备未完成任务'}`,\n 1,\n );\n\nexport const recallComputerRuntimeLogs = async (\n input: {\n computer?: string;\n from?: string;\n ownerQuery?: string;\n pollIntervalMs: number;\n range?: string;\n timeoutMs: number;\n to?: string;\n },\n dependencies: RuntimeLogWorkflowDependencies,\n): Promise<RuntimeLogRecallResult> => {\n const clock = dependencies.clock ?? Date.now;\n const progress = dependencies.onProgress ?? (() => undefined);\n const selection = resolveRuntimeLogRecallSelection(input, new Date(clock()));\n\n const selector = input.ownerQuery ? `用户名/邮箱 ${input.ownerQuery}` : `Computer ${input.computer}`;\n progress(`正在解析唯一在线 Computer: ${selector}`);\n const computer = await resolveOnlineTuttiComputerForLogs(dependencies.api, input);\n progress(\n `已匹配 ${computer.displayName || computer.reportedName} (${computer.computerId}),desktopd ${computer.desktopdVersion || '未知'}`,\n );\n progress(\n `异常区间 ${selection.requestedInterval.from} → ${selection.requestedInterval.to};使用 ${selection.rangePreset} 档位覆盖`,\n );\n\n progress('正在创建日志召回任务');\n const created = await dependencies.api.createComputerRuntimeLogRecall(\n computer.computerId,\n selection.rangePreset,\n );\n if (created.state === 'failed') {\n throw taskFailure(created);\n }\n progress(`任务已创建: ${created.taskId}`);\n\n let lastReportedState = '';\n let lastReportedAt = 0;\n const completed = await waitForRuntimeLogRecall(\n () => dependencies.api.getComputerRuntimeLogRecall(computer.computerId, created.taskId),\n {\n initialTask: created,\n onUpdate: (task) => {\n const currentTime = clock();\n if (\n task.state !== lastReportedState ||\n currentTime - lastReportedAt >= PROGRESS_HEARTBEAT_MS\n ) {\n progress(`任务 ${task.taskId}: ${stateLabel(task)}`);\n lastReportedState = task.state;\n lastReportedAt = currentTime;\n }\n },\n pollIntervalMs: input.pollIntervalMs,\n timeoutMs: input.timeoutMs,\n },\n {\n now: clock,\n sleep: dependencies.sleep,\n },\n );\n if (completed.state === 'failed') {\n throw taskFailure(completed);\n }\n\n progress('正在生成短期下载地址');\n const download = await dependencies.api.createComputerRuntimeLogRecallDownload(\n computer.computerId,\n completed.taskId,\n );\n if (!download.downloadUrl) {\n throw new CliError('管理后台未返回日志下载地址', 1);\n }\n\n const makeTempDirectory =\n dependencies.makeTempDirectory ?? (() => mkdtemp(join('/tmp', 'nexight-runtime-log-')));\n const directory = await makeTempDirectory();\n const fileName = safeRuntimeLogFileName(download.fileName, completed.taskId);\n const outputPath = join(directory, fileName);\n progress(`正在下载日志归档到 ${outputPath}`);\n const saved = await (dependencies.downloadArchive ?? downloadRuntimeLogArchive)(\n download.downloadUrl,\n outputPath,\n );\n progress(`下载完成: ${saved.path} (${saved.bytes} bytes)`);\n\n return {\n computer: {\n computerId: computer.computerId,\n connectionStatus: computer.connectionStatus,\n desktopdVersion: computer.desktopdVersion,\n displayName: computer.displayName,\n reportedName: computer.reportedName,\n },\n rangePreset: selection.rangePreset,\n requestedInterval: selection.requestedInterval,\n recallInterval: selection.recallInterval,\n task: completed,\n artifact: {\n bytes: saved.bytes,\n expiresAt: download.expiresAt,\n fileName,\n path: saved.path,\n },\n };\n};\n","import chalk from 'chalk';\nimport ora from 'ora';\n\ntype ProgressTaskContext = {\n getElapsedMs: () => number;\n setText: (text: string) => void;\n};\n\ntype ProgressTaskOptions = {\n heartbeatText?: (elapsedMs: number) => string;\n heartbeatMs?: number;\n initialText: string;\n};\n\ntype EtaProgressOptions = {\n abnormalAfterMs?: number;\n estimateMs?: number | null;\n label: string;\n waitingForStartText: string;\n};\n\nconst HEARTBEAT_INTERVAL_MS = 15_000;\nconst ETA_REFRESH_INTERVAL_MS = 1_000;\nconst PROGRESS_ROW_STATUS_WIDTH = 7;\n\nexport type ProgressRowStatus = 'failure' | 'idle' | 'queued' | 'running' | 'success';\n\nexport type WorkflowProgressState = {\n conclusion?: 'failure' | 'success';\n detail?: string;\n estimateMs: number | null;\n runUrl?: string;\n startedAt?: number;\n status: 'idle' | 'queued' | 'running' | 'completed';\n};\n\nconst progressRowColor: Record<ProgressRowStatus, (text: string) => string> = {\n idle: chalk.gray,\n queued: chalk.blue,\n running: chalk.yellow,\n success: chalk.green,\n failure: chalk.red,\n};\n\nconst progressRowLabel: Record<ProgressRowStatus, string> = {\n idle: 'IDLE',\n queued: 'QUEUED',\n running: 'RUNNING',\n success: 'SUCCESS',\n failure: 'FAILURE',\n};\n\nconst unrefTimer = (timer: ReturnType<typeof setInterval>): void => {\n (timer as { unref?: () => void }).unref?.();\n};\n\nconst formatEstimate = (elapsedMs: number, estimateMs: number): string => {\n const elapsed = formatElapsed(elapsedMs);\n const estimate = formatElapsed(estimateMs);\n\n return `${elapsed} / ${estimate}`;\n};\n\nexport const formatElapsed = (elapsedMs: number): string => {\n const totalSeconds = Math.max(0, Math.floor(elapsedMs / 1_000));\n const hours = Math.floor(totalSeconds / 3_600);\n const minutes = Math.floor((totalSeconds % 3_600) / 60);\n const seconds = totalSeconds % 60;\n\n if (hours > 0) {\n return `${hours}h${minutes}m`;\n }\n\n if (minutes > 0) {\n return `${minutes}m${seconds}s`;\n }\n\n return `${seconds}s`;\n};\n\nexport const renderProgressBar = (percent: number, width = 12): string => {\n const safeWidth = Math.max(1, Math.floor(width));\n const safePercent = Math.max(0, Math.min(100, percent));\n const filled = Math.round((safePercent / 100) * safeWidth);\n\n return `[${'='.repeat(filled)}${'-'.repeat(safeWidth - filled)}]`;\n};\n\nexport const renderProgressPanel = ({\n title,\n rows,\n}: {\n title: string;\n rows: string[];\n}): string => [title, ...rows].join('\\n');\n\nexport const formatProgressRow = ({\n detail,\n repoKey,\n runUrl,\n status,\n width,\n}: {\n detail?: string;\n repoKey: string;\n runUrl?: string;\n status: ProgressRowStatus;\n width?: number;\n}): string => {\n const label = progressRowColor[status](progressRowLabel[status].padEnd(PROGRESS_ROW_STATUS_WIDTH));\n const repo = chalk.bold(repoKey.padEnd(width ?? repoKey.length));\n const parts = [label, repo];\n\n if (detail) {\n parts.push(detail);\n }\n\n if (runUrl) {\n parts.push(runUrl);\n }\n\n return parts.join(' ');\n};\n\nexport const formatWorkflowProgressRow = ({\n key,\n state,\n width,\n}: {\n key: string;\n state: WorkflowProgressState;\n width: number;\n}): string => {\n if (state.status === 'completed') {\n return formatProgressRow({\n detail: state.detail ?? (state.conclusion === 'failure' ? 'workflow failed' : 'completed'),\n repoKey: key,\n runUrl: state.runUrl,\n status: state.conclusion === 'failure' ? 'failure' : 'success',\n width,\n });\n }\n\n if (state.status === 'idle') {\n return formatProgressRow({\n detail: 'pending',\n repoKey: key,\n status: 'idle',\n width,\n });\n }\n\n if (state.status === 'queued') {\n return formatProgressRow({\n detail: 'waiting for workflow',\n repoKey: key,\n runUrl: state.runUrl,\n status: 'queued',\n width,\n });\n }\n\n return formatProgressRow({\n detail:\n state.detail ??\n formatEtaStatus({\n label: state.status,\n elapsedMs: state.startedAt ? Date.now() - state.startedAt : 0,\n estimateMs: state.estimateMs,\n }),\n repoKey: key,\n runUrl: state.runUrl,\n status: 'running',\n width,\n });\n};\n\nexport const renderWorkflowProgressPanel = ({\n items,\n states,\n title,\n}: {\n items: Array<{ key: string }>;\n states: ReadonlyMap<string, WorkflowProgressState>;\n title: string;\n}): string => {\n const defaultState: WorkflowProgressState = { estimateMs: null, status: 'idle' };\n const resolvedStates = items.map((item) => states.get(item.key) ?? defaultState);\n const width = items.length > 0 ? Math.max(...items.map((item) => item.key.length)) : 0;\n const completedCount = resolvedStates.filter((state) => state.status === 'completed').length;\n\n return renderProgressPanel({\n title: `${title} | 已完成 ${completedCount}/${items.length}`,\n rows: items.map((item, index) =>\n formatWorkflowProgressRow({\n key: item.key,\n state: resolvedStates[index] ?? defaultState,\n width,\n }),\n ),\n });\n};\n\nexport const formatEtaStatus = ({\n abnormalAfterMs,\n elapsedMs,\n estimateMs,\n label,\n runUrl,\n}: {\n abnormalAfterMs?: number;\n elapsedMs: number;\n estimateMs?: number | null;\n label: string;\n runUrl?: string;\n}): string => {\n if (estimateMs == null || estimateMs <= 0) {\n return `${label},已耗时 ${formatElapsed(elapsedMs)}(暂无历史参考)`;\n }\n\n const elapsed = formatElapsed(elapsedMs);\n const estimate = formatElapsed(estimateMs);\n const hasOverrun = elapsedMs > estimateMs;\n const overrunMs = elapsedMs - estimateMs;\n const isAbnormal = abnormalAfterMs !== undefined && hasOverrun && overrunMs >= abnormalAfterMs;\n const statusParts: string[] = [];\n\n if (hasOverrun) {\n statusParts.push(`${renderProgressBar(100)} >100% ${formatEstimate(elapsedMs, estimateMs)},已超参考 ${formatElapsed(overrunMs)}`);\n } else {\n const percent = Math.min(95, Math.floor((elapsedMs / estimateMs) * 100));\n statusParts.push(`${renderProgressBar(percent)} ${percent}% ${elapsed} / ${estimate}`);\n }\n\n if (isAbnormal) {\n statusParts.push('可能存在异常');\n if (runUrl) {\n statusParts.push(`请关注 workflow 页面: ${runUrl}`);\n }\n }\n\n return `${label} ${statusParts.join(',')}`;\n};\n\nexport const withProgressTask = async <T>(\n options: ProgressTaskOptions,\n run: (context: ProgressTaskContext) => Promise<T> | T,\n): Promise<T> => {\n const spinner = ora({ text: options.initialText, spinner: 'dots' });\n const startedAt = Date.now();\n const heartbeatMs = options.heartbeatMs ?? HEARTBEAT_INTERVAL_MS;\n const heartbeatText = options.heartbeatText ?? ((elapsedMs: number) => `${options.initialText}(已耗时 ${formatElapsed(elapsedMs)})`);\n\n const setText = (text: string): void => {\n spinner.text = text;\n };\n\n const getElapsedMs = (): number => Date.now() - startedAt;\n\n spinner.start();\n const heartbeatTimer = setInterval(() => {\n setText(heartbeatText(getElapsedMs()));\n }, heartbeatMs);\n unrefTimer(heartbeatTimer);\n\n try {\n return await run({ getElapsedMs, setText });\n } finally {\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n }\n\n spinner.stop();\n }\n};\n\nexport const createEtaProgress = ({\n abnormalAfterMs,\n estimateMs,\n label,\n waitingForStartText,\n}: EtaProgressOptions): {\n setEstimate: (nextEstimateMs: number | null | undefined) => void;\n setRunUrl: (nextRunUrl: string) => void;\n start: () => void;\n stop: () => void;\n} => {\n const spinner = ora({ text: waitingForStartText, spinner: 'dots' });\n\n let active = false;\n let startedAt = 0;\n let refreshTimer: ReturnType<typeof setInterval> | undefined;\n let currentEstimateMs = estimateMs;\n let currentRunUrl: string | undefined;\n\n const refresh = (): void => {\n if (!active) {\n spinner.text = waitingForStartText;\n return;\n }\n\n spinner.text = formatEtaStatus({\n abnormalAfterMs,\n elapsedMs: Date.now() - startedAt,\n estimateMs: currentEstimateMs,\n label,\n runUrl: currentRunUrl,\n });\n };\n\n const start = (): void => {\n if (active) {\n return;\n }\n\n active = true;\n startedAt = Date.now();\n spinner.text = waitingForStartText;\n spinner.start();\n refreshTimer = setInterval(refresh, ETA_REFRESH_INTERVAL_MS);\n unrefTimer(refreshTimer);\n };\n\n const stop = (): void => {\n active = false;\n\n if (refreshTimer) {\n clearInterval(refreshTimer);\n refreshTimer = undefined;\n }\n\n spinner.stop();\n };\n\n const setEstimate = (nextEstimateMs: number | null | undefined): void => {\n currentEstimateMs = nextEstimateMs;\n refresh();\n };\n\n const setRunUrl = (nextRunUrl: string): void => {\n currentRunUrl = nextRunUrl;\n refresh();\n };\n\n return {\n setEstimate,\n setRunUrl,\n start,\n stop,\n };\n};\n","import type { Command } from 'commander';\nimport {\n parseRuntimeLogRange,\n recallComputerRuntimeLogs,\n type RuntimeLogRecallResult,\n} from '../../lib/admin-computer-logs.js';\nimport {\n downloadRuntimeLogArchive,\n safeRuntimeLogFileName,\n waitForRuntimeLogRecall,\n type ComputerRuntimeLogRecall,\n type TuttiComputerConnectionStatus,\n} from '../../lib/admin-computer.js';\nimport { CliError } from '../../lib/errors.js';\nimport { logger } from '../../lib/logger.js';\nimport { withProgressTask } from '../../lib/progress.js';\nimport {\n addAdminConnectionOptions,\n printAdminResult,\n resolveAdminContext,\n type AdminCommandOptions,\n} from './shared.js';\n\nconst DEFAULT_RECALL_TIMEOUT_SECONDS = 30 * 60;\nconst DEFAULT_RECALL_POLL_INTERVAL_SECONDS = 5;\n\ntype AdminComputerListOptions = AdminCommandOptions & {\n connection?: string;\n desktopdVersion?: string;\n ownerQuery?: string;\n username?: string;\n pageSize: string;\n pageToken?: string;\n platform?: string;\n query?: string;\n};\n\ntype AdminComputerDetailOptions = AdminCommandOptions & {\n computerId: string;\n};\n\ntype AdminRuntimeLogListOptions = AdminComputerDetailOptions & {\n pageSize: string;\n pageToken?: string;\n};\n\ntype AdminRuntimeLogGetOptions = AdminComputerDetailOptions & {\n taskId: string;\n};\n\ntype AdminRuntimeLogCreateOptions = AdminComputerDetailOptions & {\n download?: boolean;\n force?: boolean;\n output?: string;\n pollIntervalSeconds: string;\n range: string;\n timeoutSeconds: string;\n wait?: boolean;\n};\n\ntype AdminRuntimeLogDownloadOptions = AdminRuntimeLogGetOptions & {\n force?: boolean;\n output?: string;\n};\n\ntype AdminRuntimeLogsOptions = AdminCommandOptions & {\n from?: string;\n ownerQuery?: string;\n username?: string;\n pollIntervalSeconds: string;\n range?: string;\n timeoutSeconds: string;\n to?: string;\n};\n\nconst parseIntegerOption = (\n value: string,\n optionName: string,\n minimum: number,\n maximum: number,\n): number => {\n if (!/^\\d+$/.test(value.trim())) {\n throw new CliError(`${optionName} 必须是整数`, 1);\n }\n const parsed = Number(value);\n if (parsed < minimum || parsed > maximum) {\n throw new CliError(`${optionName} 必须在 ${minimum}-${maximum} 之间`, 1);\n }\n return parsed;\n};\n\nconst parseConnectionStatus = (\n value?: string,\n): Exclude<TuttiComputerConnectionStatus, 'unknown'> | undefined => {\n const normalized = value?.trim().toLowerCase();\n if (!normalized || normalized === 'all') {\n return undefined;\n }\n if (normalized === 'online' || normalized === 'offline') {\n return normalized;\n }\n throw new CliError('--connection 必须是 all、online 或 offline', 1);\n};\n\nconst resolveOwnerQuery = (options: { ownerQuery?: string; username?: string }): string | undefined => {\n const ownerQuery = options.ownerQuery?.trim();\n const username = options.username?.trim();\n if (ownerQuery && username) {\n throw new CliError('--owner-query 与 --username 必须二选一', 1);\n }\n return ownerQuery || username || undefined;\n};\n\nexport { parseRuntimeLogRange };\n\nconst runtimeLogFailure = (task: ComputerRuntimeLogRecall): CliError => {\n const detail = task.failureMessage || task.failureCode || '设备未能完成日志召回';\n return new CliError(`日志召回失败 [${task.taskId}]: ${detail}`, 1);\n};\n\nconst waitForTask = async (\n options: AdminRuntimeLogCreateOptions,\n initialTask: ComputerRuntimeLogRecall,\n getTask: () => Promise<ComputerRuntimeLogRecall>,\n): Promise<ComputerRuntimeLogRecall> => {\n const pollIntervalMs =\n parseIntegerOption(options.pollIntervalSeconds, '--poll-interval-seconds', 1, 60) * 1_000;\n const timeoutMs =\n parseIntegerOption(options.timeoutSeconds, '--timeout-seconds', 1, 7_200) * 1_000;\n\n const run = (onUpdate?: (task: ComputerRuntimeLogRecall) => void) =>\n waitForRuntimeLogRecall(getTask, {\n initialTask,\n onUpdate,\n pollIntervalMs,\n timeoutMs,\n });\n\n if (options.json) {\n return run();\n }\n\n return withProgressTask(\n {\n initialText: `等待设备处理日志召回任务 ${initialTask.taskId}`,\n heartbeatText: (elapsedMs) =>\n `等待设备处理日志召回任务 ${initialTask.taskId}(${Math.floor(elapsedMs / 1_000)}s)`,\n },\n ({ setText }) =>\n run((task) => {\n setText(`日志召回 ${task.taskId}: ${task.state}`);\n }),\n );\n};\n\nconst downloadTaskArchive = async (\n options: AdminRuntimeLogDownloadOptions,\n task?: ComputerRuntimeLogRecall,\n): Promise<Record<string, unknown>> => {\n const { api } = await resolveAdminContext(options);\n const download = await api.createComputerRuntimeLogRecallDownload(\n options.computerId,\n options.taskId,\n );\n if (!download.downloadUrl) {\n throw new CliError('管理后台未返回日志下载地址', 1);\n }\n const outputPath =\n options.output?.trim() || safeRuntimeLogFileName(download.fileName, options.taskId);\n const run = () =>\n downloadRuntimeLogArchive(download.downloadUrl, outputPath, { force: options.force });\n const saved = options.json\n ? await run()\n : await withProgressTask(\n { initialText: `正在下载日志归档 ${safeRuntimeLogFileName(download.fileName, options.taskId)}` },\n run,\n );\n\n return {\n ...(task ? { task } : {}),\n download: {\n bytes: saved.bytes,\n expiresAt: download.expiresAt,\n fileName: safeRuntimeLogFileName(download.fileName, options.taskId),\n path: saved.path,\n },\n };\n};\n\nexport const runAdminComputerList = async (options: AdminComputerListOptions): Promise<void> => {\n const { api } = await resolveAdminContext(options);\n printAdminResult(\n await api.listTuttiComputers({\n nameQuery: options.query,\n ownerQuery: resolveOwnerQuery(options),\n connectionStatus: parseConnectionStatus(options.connection),\n platform: options.platform,\n desktopdVersion: options.desktopdVersion,\n pageSize: parseIntegerOption(options.pageSize, '--page-size', 1, 50),\n pageToken: options.pageToken,\n }),\n options,\n );\n};\n\nexport const runAdminComputerDetail = async (\n options: AdminComputerDetailOptions,\n): Promise<void> => {\n const { api } = await resolveAdminContext(options);\n printAdminResult(await api.getTuttiComputer(options.computerId), options);\n};\n\nexport const runAdminRuntimeLogList = async (\n options: AdminRuntimeLogListOptions,\n): Promise<void> => {\n const { api } = await resolveAdminContext(options);\n printAdminResult(\n await api.listComputerRuntimeLogRecalls(options.computerId, {\n pageSize: parseIntegerOption(options.pageSize, '--page-size', 1, 50),\n pageToken: options.pageToken,\n }),\n options,\n );\n};\n\nexport const runAdminRuntimeLogGet = async (\n options: AdminRuntimeLogGetOptions,\n): Promise<void> => {\n const { api } = await resolveAdminContext(options);\n printAdminResult(\n await api.getComputerRuntimeLogRecall(options.computerId, options.taskId),\n options,\n );\n};\n\nexport const runAdminRuntimeLogCreate = async (\n options: AdminRuntimeLogCreateOptions,\n): Promise<void> => {\n if (options.force && !options.download && !options.output) {\n throw new CliError('--force 只能与 --download 或 --output 一起使用', 1);\n }\n\n const { api } = await resolveAdminContext(options);\n const created = await api.createComputerRuntimeLogRecall(\n options.computerId,\n parseRuntimeLogRange(options.range),\n );\n if (created.state === 'failed') {\n throw runtimeLogFailure(created);\n }\n\n const shouldDownload = Boolean(options.download || options.output);\n if (!options.wait && !shouldDownload) {\n printAdminResult(created, options);\n return;\n }\n\n const completed = await waitForTask(options, created, () =>\n api.getComputerRuntimeLogRecall(options.computerId, created.taskId),\n );\n if (completed.state === 'failed') {\n throw runtimeLogFailure(completed);\n }\n\n if (!shouldDownload) {\n printAdminResult(completed, options);\n return;\n }\n\n const result = await downloadTaskArchive(\n {\n ...options,\n taskId: completed.taskId,\n },\n completed,\n );\n printAdminResult(result, options);\n};\n\nexport const runAdminRuntimeLogDownload = async (\n options: AdminRuntimeLogDownloadOptions,\n): Promise<void> => {\n printAdminResult(await downloadTaskArchive(options), options);\n};\n\nexport const runAdminRuntimeLogs = async (\n computerSelector: string | undefined,\n options: AdminRuntimeLogsOptions,\n): Promise<RuntimeLogRecallResult> => {\n const startedAt = Date.now();\n let latestProgress = '准备开始';\n const writeProgress = (message: string): void => {\n const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1_000);\n console.error(`[logs +${elapsedSeconds}s] ${message}`);\n };\n const progress = (message: string): void => {\n latestProgress = message;\n writeProgress(message);\n };\n const heartbeat = setInterval(() => {\n writeProgress(`仍在执行: ${latestProgress}`);\n }, 15_000);\n heartbeat.unref?.();\n\n try {\n progress('正在验证管理后台认证');\n const { api } = await resolveAdminContext(options);\n const ownerQuery = resolveOwnerQuery(options);\n const result = await recallComputerRuntimeLogs(\n {\n computer: computerSelector,\n from: options.from,\n ownerQuery,\n pollIntervalMs:\n parseIntegerOption(options.pollIntervalSeconds, '--poll-interval-seconds', 1, 60) *\n 1_000,\n range: options.range,\n timeoutMs:\n parseIntegerOption(options.timeoutSeconds, '--timeout-seconds', 1, 7_200) * 1_000,\n to: options.to,\n },\n {\n api,\n onProgress: progress,\n },\n );\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n logger.success(\n `日志召回完成: ${result.computer.displayName || result.computer.reportedName}`,\n );\n logger.info(`任务: ${result.task.taskId}`);\n logger.info(`临时产物: ${result.artifact.path}`);\n }\n return result;\n } finally {\n clearInterval(heartbeat);\n }\n};\n\nexport const registerAdminComputerCommand = (program: Command): void => {\n const computer = program\n .command('computer')\n .description('Query Tutti Computers and recall desktopd runtime logs');\n\n addAdminConnectionOptions(\n computer\n .command('list')\n .description('List Tutti Computers')\n .option('--query <query>', 'filter by Computer name')\n .option('--owner-query <query>', 'filter by owner username or email')\n .option('--username <username>', 'filter by owner username or email')\n .option('--connection <status>', 'all, online, or offline', 'all')\n .option('--platform <platform>', 'filter by platform')\n .option('--desktopd-version <version>', 'filter by desktopd version')\n .option('--page-size <number>', 'results per page, 1-50', '50')\n .option('--page-token <token>', 'continue from a previous nextPageToken'),\n ).action(runAdminComputerList);\n\n addAdminConnectionOptions(\n computer\n .command('detail')\n .description('Show one Tutti Computer')\n .requiredOption('--computer-id <computerId>', 'Computer ID'),\n ).action(runAdminComputerDetail);\n\n addAdminConnectionOptions(\n computer\n .command('logs')\n .description('Recall, wait for, and download desktopd logs in one command')\n .argument('[computer]', 'exact Computer name or Computer ID')\n .option('--owner-query <query>', 'resolve one online Computer by owner username or email')\n .option('--username <username>', 'resolve one online Computer by owner username or email')\n .option('--from <timestamp>', 'start of the suspicious interval; timezone is required')\n .option('--to <timestamp>', 'end of the suspicious interval; defaults to now')\n .option('--range <range>', 'explicit fallback range: 1h, 3h, 1d, 3d, or 14d')\n .option(\n '--timeout-seconds <seconds>',\n 'maximum time to wait, 1-7200',\n String(DEFAULT_RECALL_TIMEOUT_SECONDS),\n )\n .option(\n '--poll-interval-seconds <seconds>',\n 'task polling interval, 1-60',\n String(DEFAULT_RECALL_POLL_INTERVAL_SECONDS),\n ),\n ).action(async (computerSelector: string | undefined, options: AdminRuntimeLogsOptions) => {\n const ownerQuery = resolveOwnerQuery(options);\n if (Boolean(computerSelector?.trim()) === Boolean(ownerQuery)) {\n throw new CliError('Computer 名称/ID 与用户名/邮箱查询必须二选一', 1);\n }\n await runAdminRuntimeLogs(computerSelector, { ...options, ownerQuery, username: undefined });\n });\n\n const runtimeLog = computer\n .command('log-recall')\n .description('Create, inspect, and download desktopd runtime log recalls');\n\n addAdminConnectionOptions(\n runtimeLog\n .command('list')\n .description('List runtime log recall tasks for one Computer')\n .requiredOption('--computer-id <computerId>', 'Computer ID')\n .option('--page-size <number>', 'results per page, 1-50', '20')\n .option('--page-token <token>', 'continue from a previous nextPageToken'),\n ).action(runAdminRuntimeLogList);\n\n addAdminConnectionOptions(\n runtimeLog\n .command('get')\n .description('Show one runtime log recall task')\n .requiredOption('--computer-id <computerId>', 'Computer ID')\n .requiredOption('--task-id <taskId>', 'runtime log recall task ID'),\n ).action(runAdminRuntimeLogGet);\n\n addAdminConnectionOptions(\n runtimeLog\n .command('create')\n .description('Ask an online Computer to collect and upload desktopd runtime logs')\n .requiredOption('--computer-id <computerId>', 'Computer ID')\n .option('--range <range>', '1h, 3h, 1d, 3d, or 14d', '1h')\n .option('--wait', 'wait until the task is downloadable or failed')\n .option('--download', 'wait and download the completed archive')\n .option('--output <path>', 'archive output path; implies --download')\n .option('--force', 'overwrite an existing output file')\n .option(\n '--timeout-seconds <seconds>',\n 'maximum time to wait, 1-7200',\n String(DEFAULT_RECALL_TIMEOUT_SECONDS),\n )\n .option(\n '--poll-interval-seconds <seconds>',\n 'task polling interval, 1-60',\n String(DEFAULT_RECALL_POLL_INTERVAL_SECONDS),\n ),\n ).action(runAdminRuntimeLogCreate);\n\n addAdminConnectionOptions(\n runtimeLog\n .command('download')\n .description('Download a completed runtime log recall archive')\n .requiredOption('--computer-id <computerId>', 'Computer ID')\n .requiredOption('--task-id <taskId>', 'runtime log recall task ID')\n .option('--output <path>', 'archive output path; defaults to the server file name')\n .option('--force', 'overwrite an existing output file'),\n ).action(runAdminRuntimeLogDownload);\n};\n","import type { Command } from 'commander';\nimport { addAdminConnectionOptions, printAdminResult, resolveAdminContext, type AdminCommandOptions } from './shared.js';\n\nexport const runAdminHealth = async (options: AdminCommandOptions = {}): Promise<void> => {\n const { api } = await resolveAdminContext(options);\n printAdminResult(await api.health(), options);\n};\n\nexport const registerAdminSystemCommand = (program: Command): void => {\n const system = program.command('system').description('Query management backend system state');\n addAdminConnectionOptions(system.command('health').description('Check management backend health')).action(runAdminHealth);\n};\n","import type { Command } from 'commander';\nimport { registerAdminAppCommand } from './app.js';\nimport { registerAdminAuthCommand } from './auth.js';\nimport { registerAdminComputerCommand } from './computer.js';\nimport { registerAdminSystemCommand } from './system.js';\n\nexport const registerAdminCommand = (program: Command): void => {\n const admin = program.command('admin').description('Manage the Tutti administration backend');\n\n registerAdminAuthCommand(admin);\n registerAdminSystemCommand(admin);\n registerAdminAppCommand(admin);\n registerAdminComputerCommand(admin);\n};\n","import { CliError } from '../errors.js';\n\nexport class DataFinderApiError extends CliError {\n readonly apiCode: number | undefined;\n readonly body: unknown;\n readonly httpStatus: number;\n\n constructor(options: {\n apiCode?: number;\n body: unknown;\n httpStatus: number;\n label: string;\n message?: string;\n }) {\n const details = [\n `HTTP ${options.httpStatus}`,\n options.apiCode === undefined ? null : `code ${options.apiCode}`,\n options.message,\n ].filter(Boolean);\n super(`${options.label} failed: ${details.join(', ')}`, 1);\n this.name = 'DataFinderApiError';\n this.apiCode = options.apiCode;\n this.body = options.body;\n this.httpStatus = options.httpStatus;\n }\n}\n\nexport class DataFinderQueryError extends CliError {\n readonly failures: Array<{\n errorCode?: number | string | null;\n errorMessage?: string | null;\n queryId?: string;\n status?: string;\n traceId?: string;\n }>;\n\n constructor(failures: DataFinderQueryError['failures']) {\n const first = failures[0];\n super(\n `DataFinder query failed: ${first?.status ?? 'UNKNOWN'}${first?.errorMessage ? `, ${first.errorMessage}` : ''}`,\n 1,\n );\n this.name = 'DataFinderQueryError';\n this.failures = failures;\n }\n}\n","import datafinderSdk from '@datafinder/openapisdk';\nimport type { DataFinderRequestOptions } from './types.js';\n\ntype SdkResponse = {\n status: number;\n text(): Promise<string>;\n};\n\ntype RangersClientLike = {\n dataFinder(path: string, options: Record<string, unknown>): Promise<SdkResponse>;\n};\n\ntype RangersClientConstructor = new (\n accessKeyId: string,\n secretAccessKey: string,\n baseUrl?: string,\n) => RangersClientLike;\n\nconst sdk = datafinderSdk as unknown as { RangersClient: RangersClientConstructor };\n\nexport type DataFinderTransportResponse = {\n status: number;\n text: string;\n};\n\nexport type DataFinderTransport = {\n request(path: string, options: DataFinderRequestOptions): Promise<DataFinderTransportResponse>;\n};\n\nexport const createDataFinderSdkTransport = (options: {\n accessKeyId: string;\n baseUrl: string;\n secretAccessKey: string;\n}): DataFinderTransport => {\n const client = new sdk.RangersClient(\n options.accessKeyId,\n options.secretAccessKey,\n options.baseUrl,\n );\n\n return {\n request: async (path, requestOptions) => {\n const response = await client.dataFinder(path, {\n ...requestOptions,\n ...(requestOptions.body === undefined\n ? {}\n : {\n body:\n typeof requestOptions.body === 'string'\n ? requestOptions.body\n : JSON.stringify(requestOptions.body),\n }),\n });\n return { status: response.status, text: await response.text() };\n },\n };\n};\n","import { DataFinderApiError, DataFinderQueryError } from './errors.js';\nimport {\n createDataFinderSdkTransport,\n type DataFinderTransport,\n} from './sdk-adapter.js';\nimport type {\n DataFinderAnalysisItem,\n DataFinderApiPayload,\n DataFinderConnectionConfig,\n DataFinderConnectionSummary,\n DataFinderDashboard,\n DataFinderDashboardExport,\n DataFinderDashboardReports,\n DataFinderPublicConfig,\n DataFinderReport,\n DataFinderRequestOptions,\n} from './types.js';\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null;\n\nconst mapWithConcurrency = async <T, R>(\n values: T[],\n concurrency: number,\n mapper: (value: T) => Promise<R>,\n): Promise<R[]> => {\n const results = new Array<R>(values.length);\n let nextIndex = 0;\n\n const worker = async (): Promise<void> => {\n while (nextIndex < values.length) {\n const index = nextIndex;\n nextIndex += 1;\n results[index] = await mapper(values[index]);\n }\n };\n\n await Promise.all(\n Array.from({ length: Math.min(concurrency, values.length) }, async () => worker()),\n );\n return results;\n};\n\nexport class DataFinderClient {\n readonly publicConfig: DataFinderPublicConfig;\n private readonly transport: DataFinderTransport;\n\n constructor(config: DataFinderConnectionConfig, transport?: DataFinderTransport) {\n this.publicConfig = {\n appId: config.appId,\n baseUrl: config.baseUrl,\n defaultDashboardId: config.defaultDashboardId,\n pathMode: config.pathMode,\n projectId: config.projectId,\n timezone: config.timezone,\n };\n this.transport =\n transport ??\n createDataFinderSdkTransport({\n accessKeyId: config.accessKeyId,\n baseUrl: config.baseUrl,\n secretAccessKey: config.secretAccessKey,\n });\n }\n\n private get pathScope(): string {\n return this.publicConfig.pathMode === 'project'\n ? `projects/${this.publicConfig.projectId}`\n : this.publicConfig.appId;\n }\n\n async request<T>(\n path: string,\n options: DataFinderRequestOptions = {},\n label = `DataFinder request ${path}`,\n ): Promise<T> {\n if (!path.startsWith('/openapi/')) {\n throw new Error('DataFinder request path must start with /openapi/');\n }\n\n const response = await this.transport.request(path, options);\n let payload: DataFinderApiPayload<T>;\n try {\n payload = JSON.parse(response.text) as DataFinderApiPayload<T>;\n } catch {\n throw new DataFinderApiError({\n body: response.text.slice(0, 1_000),\n httpStatus: response.status,\n label,\n message: 'response was not JSON',\n });\n }\n\n if (response.status < 200 || response.status >= 300 || payload.code !== 200) {\n throw new DataFinderApiError({\n apiCode: payload.code,\n body: payload,\n httpStatus: response.status,\n label,\n message: payload.message,\n });\n }\n\n return payload.data as T;\n }\n\n async getDashboard(dashboardId = this.publicConfig.defaultDashboardId): Promise<DataFinderDashboard> {\n const dashboards = await this.request<Record<string, DataFinderDashboard>>(\n `/openapi/v1/${this.pathScope}/dashboards/${dashboardId}`,\n { method: 'GET' },\n 'query dashboard',\n );\n const dashboard = isRecord(dashboards) ? dashboards[dashboardId] : undefined;\n if (!isRecord(dashboard)) {\n throw new DataFinderApiError({\n body: dashboards,\n httpStatus: 200,\n label: 'query dashboard',\n message: `dashboard ${dashboardId} was missing or malformed in the response`,\n });\n }\n return dashboard as DataFinderDashboard;\n }\n\n async listDashboardReports(\n dashboardId = this.publicConfig.defaultDashboardId,\n ): Promise<DataFinderReport[]> {\n const dashboards = await this.request<Record<string, DataFinderDashboardReports>>(\n `/openapi/v1/${this.pathScope}/dashboards/${dashboardId}/reports`,\n { method: 'GET' },\n 'query dashboard reports',\n );\n const dashboard = isRecord(dashboards) ? dashboards[dashboardId] : undefined;\n const reports = isRecord(dashboard) ? dashboard.reports : undefined;\n if (\n !Array.isArray(reports) ||\n reports.some(\n (report) =>\n !isRecord(report) ||\n typeof report.report_id !== 'string' ||\n report.report_id.trim() === '',\n )\n ) {\n throw new DataFinderApiError({\n body: dashboards,\n httpStatus: 200,\n label: 'query dashboard reports',\n message: `reports for dashboard ${dashboardId} were missing or malformed`,\n });\n }\n return reports as DataFinderReport[];\n }\n\n async getReportData(reportId: string, count = 1_000): Promise<unknown> {\n if (!Number.isInteger(count) || count < 1 || count > 1_000) {\n throw new Error('report count must be an integer between 1 and 1000');\n }\n return this.request(\n `/openapi/v1/${this.pathScope}/reports/${reportId}`,\n { method: 'GET', params: { count } },\n `query report ${reportId}`,\n );\n }\n\n async analysis(dsl: unknown): Promise<DataFinderAnalysisItem[]> {\n if (!isRecord(dsl) || Object.keys(dsl).length === 0) {\n throw new Error('DataFinder analysis DSL must be a non-empty object');\n }\n const result = await this.request<DataFinderAnalysisItem[]>(\n '/openapi/v1/analysis',\n { body: dsl, method: 'POST' },\n 'run analysis',\n );\n const failures = result\n .filter((item) => item.result_status !== 'SUCCESS')\n .map((item) => ({\n errorCode: item.error_code,\n errorMessage: item.error_message,\n queryId: item.query_id,\n status: item.result_status,\n traceId: item.trace_id,\n }));\n if (failures.length > 0) {\n throw new DataFinderQueryError(failures);\n }\n return result;\n }\n\n async checkConnection(\n dashboardId = this.publicConfig.defaultDashboardId,\n ): Promise<DataFinderConnectionSummary> {\n const [dashboard, reports] = await Promise.all([\n this.getDashboard(dashboardId),\n this.listDashboardReports(dashboardId),\n ]);\n const queryableReport = reports.find(\n (report) => report.report_type !== 'rich_text' && report.report_type !== 'embed',\n );\n if (queryableReport) {\n await this.getReportData(queryableReport.report_id, 1);\n }\n return {\n dashboardId,\n dashboardName: typeof dashboard.name === 'string' ? dashboard.name : null,\n reportCount: reports.length,\n };\n }\n\n async exportDashboard(\n dashboardId = this.publicConfig.defaultDashboardId,\n count = 1_000,\n ): Promise<DataFinderDashboardExport> {\n const [dashboard, reports] = await Promise.all([\n this.getDashboard(dashboardId),\n this.listDashboardReports(dashboardId),\n ]);\n const reportResults = await mapWithConcurrency(reports, 4, async (report) => {\n if (report.report_type === 'rich_text' || report.report_type === 'embed') {\n return { report, source: 'embedded' as const, data: report.dsls ?? [] };\n }\n return {\n report,\n source: 'openapi' as const,\n data: await this.getReportData(report.report_id, count),\n };\n });\n return { dashboard, fetchedAt: new Date().toISOString(), reports: reportResults };\n }\n}\n","import type { CliConfig, DataFinderConfig } from '../config.js';\nimport { CliError } from '../errors.js';\nimport type { DataFinderConnectionConfig, DataFinderPathMode } from './types.js';\n\nconst required = (value: string | undefined, name: string): string => {\n const normalized = value?.trim();\n if (!normalized) {\n throw new CliError(\n `DataFinder ${name} 未配置,请先运行 nexight-devops onboard --set-mode datafinder`,\n 1,\n );\n }\n return normalized;\n};\n\nexport const parseDataFinderPathMode = (value: string | undefined): DataFinderPathMode => {\n const normalized = value?.trim() || 'project';\n if (normalized !== 'app' && normalized !== 'project') {\n throw new CliError('DataFinder pathMode 只支持 app 或 project', 1);\n }\n return normalized;\n};\n\nexport const normalizeDataFinderBaseUrl = (value: string): string => {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new CliError('DataFinder baseUrl 必须是合法的 HTTPS URL', 1);\n }\n\n if (\n url.protocol !== 'https:' ||\n url.username ||\n url.password ||\n url.search ||\n url.hash ||\n (url.pathname !== '/' && url.pathname !== '')\n ) {\n throw new CliError(\n 'DataFinder baseUrl 必须是仅包含 origin 的 HTTPS URL,不能包含凭证、路径、查询或锚点',\n 1,\n );\n }\n return url.origin;\n};\n\nexport const resolveDataFinderConfig = (config: CliConfig): DataFinderConnectionConfig => {\n const stored = config.datafinder;\n return {\n accessKeyId: required(process.env.DATAFINDER_AK ?? stored?.accessKeyId, 'AccessKeyId'),\n appId: required(process.env.DATAFINDER_APP_ID ?? stored?.appId, 'appId'),\n baseUrl: normalizeDataFinderBaseUrl(\n required(process.env.DATAFINDER_BASE_URL ?? stored?.baseUrl, 'baseUrl'),\n ),\n defaultDashboardId: required(\n process.env.DATAFINDER_DASHBOARD_ID ?? stored?.defaultDashboardId,\n 'defaultDashboardId',\n ),\n pathMode: parseDataFinderPathMode(\n process.env.DATAFINDER_PATH_MODE ?? stored?.pathMode,\n ),\n projectId: required(process.env.DATAFINDER_PROJECT_ID ?? stored?.projectId, 'projectId'),\n secretAccessKey: required(\n process.env.DATAFINDER_SK ?? stored?.secretAccessKey,\n 'SecretAccessKey',\n ),\n timezone: required(process.env.DATAFINDER_TIMEZONE ?? stored?.timezone, 'timezone'),\n };\n};\n\nexport const toStoredDataFinderConfig = (\n config: DataFinderConnectionConfig,\n): DataFinderConfig => ({ ...config });\n","import type { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { DataFinderClient } from '../../lib/datafinder/client.js';\nimport { resolveDataFinderConfig } from '../../lib/datafinder/config.js';\nimport { logger } from '../../lib/logger.js';\nimport { writePrivateFile } from '../../lib/private-file.js';\n\nexport type DataFinderOutputOptions = {\n output?: string;\n};\n\nexport type DataFinderContext = {\n client: DataFinderClient;\n};\n\nexport const resolveDataFinderContext = async (): Promise<DataFinderContext> => {\n const config = resolveDataFinderConfig(await loadConfig());\n return { client: new DataFinderClient(config) };\n};\n\nexport const addDataFinderOutputOptions = (command: Command): Command =>\n command.option('--output <path>', 'write JSON output to a file with mode 0600');\n\nexport const parseReportCount = (value: string | undefined): number => {\n if (value === undefined) {\n return 1_000;\n }\n const count = Number(value);\n if (!Number.isInteger(count) || count < 1 || count > 1_000) {\n throw new Error('--count must be an integer between 1 and 1000');\n }\n return count;\n};\n\nexport const printDataFinderResult = async (\n value: unknown,\n options: DataFinderOutputOptions = {},\n): Promise<void> => {\n const output = `${JSON.stringify(value, null, 2) ?? String(value)}\\n`;\n if (options.output) {\n await writePrivateFile(options.output, output);\n logger.success(`DataFinder 查询结果已写入 ${options.output}`);\n return;\n }\n console.log(output.trimEnd());\n};\n","import type { Command } from 'commander';\nimport { printDataFinderResult, resolveDataFinderContext } from './shared.js';\n\nexport const runDataFinderAuthCheck = async (): Promise<void> => {\n const { client } = await resolveDataFinderContext();\n await printDataFinderResult({\n ...(await client.checkConnection()),\n baseUrl: client.publicConfig.baseUrl,\n projectId: client.publicConfig.projectId,\n });\n};\n\nexport const registerDataFinderAuthCommand = (program: Command): void => {\n program\n .command('auth')\n .description('Validate configured DataFinder OpenAPI credentials and access')\n .command('check')\n .description('Check dashboard and report access')\n .action(runDataFinderAuthCheck);\n};\n","import type { Command } from 'commander';\nimport {\n addDataFinderOutputOptions,\n parseReportCount,\n printDataFinderResult,\n resolveDataFinderContext,\n type DataFinderOutputOptions,\n} from './shared.js';\n\ntype DashboardOptions = DataFinderOutputOptions & { count?: string };\n\nexport const runDataFinderDashboardGet = async (\n dashboardId: string | undefined,\n options: DataFinderOutputOptions,\n): Promise<void> => {\n const { client } = await resolveDataFinderContext();\n await printDataFinderResult(await client.getDashboard(dashboardId), options);\n};\n\nexport const runDataFinderDashboardExport = async (\n dashboardId: string | undefined,\n options: DashboardOptions,\n): Promise<void> => {\n const { client } = await resolveDataFinderContext();\n await printDataFinderResult(\n await client.exportDashboard(dashboardId, parseReportCount(options.count)),\n options,\n );\n};\n\nexport const registerDataFinderDashboardCommand = (program: Command): void => {\n const dashboard = program.command('dashboard').description('Query DataFinder dashboards');\n addDataFinderOutputOptions(\n dashboard\n .command('get')\n .description('Get dashboard metadata')\n .argument('[dashboardId]', 'defaults to the configured dashboard'),\n ).action(runDataFinderDashboardGet);\n addDataFinderOutputOptions(\n dashboard\n .command('export')\n .description('Export dashboard metadata and all report data')\n .argument('[dashboardId]', 'defaults to the configured dashboard')\n .option('--count <number>', 'maximum rows per report, 1-1000'),\n ).action(runDataFinderDashboardExport);\n};\n","import type { DataFinderClient } from './client.js';\nimport type { DataFinderReport } from './types.js';\n\nexport const DATAFINDER_BUILTIN_QUERIES = {\n 'p2p-health': {\n description: 'P2P 连接、失败、耗时与 Direct 探测指标',\n reports: [\n { id: '7673353793798422016', name: 'P2P 连接结果分布' },\n { id: '7673354540606823168', name: 'P2P 失败阶段与原因下钻' },\n { id: '7673354798632016640', name: 'P2P 路径 Ready 时长占比' },\n { id: '7673355100085033728', name: 'P2P 中断与恢复稳定性' },\n { id: '7673355557415171328', name: 'P2P 连接 P95 耗时' },\n { id: '7673355789829944576', name: 'Direct P2P 探测结果与原因' },\n ],\n },\n 'shared-agent-summary': {\n description: 'Shared Agent 阶段、结果、失败与上报端汇总',\n reports: [\n { id: '7672717280358176768', name: 'Shared Agent 阶段事件量' },\n { id: '7672720204652093184', name: 'Shared Agent 阶段覆盖分布' },\n { id: '7672720756710579968', name: 'Shared Agent 权威终态分布' },\n {\n id: '7672722222296859648',\n name: 'Shared Agent 失败原因(按 invocation 去重,跨原因可重复)',\n },\n { id: '7672723780816346880', name: 'Shared Agent 各阶段 P95 耗时' },\n { id: '7672724264134383616', name: 'Shared Agent 上报端分布' },\n { id: '7673163268139001344', name: 'Shared Agent desktopd 版本事件量' },\n { id: '7673170194381940224', name: 'Shared Agent 失败阶段分布' },\n { id: '7673170784805725696', name: 'Shared Agent 失败观测角色分布' },\n { id: '7673172139431696896', name: 'Shared Agent 失败事件上报端' },\n ],\n },\n} as const;\n\nexport type DataFinderBuiltinQueryName = keyof typeof DATAFINDER_BUILTIN_QUERIES;\n\nconst isEmbeddedReport = (report: DataFinderReport): boolean =>\n report.report_type === 'rich_text' || report.report_type === 'embed';\n\nexport const runDataFinderBuiltinQuery = async (\n client: DataFinderClient,\n name: DataFinderBuiltinQueryName,\n options: { count?: number; dashboardId?: string } = {},\n): Promise<unknown> => {\n const definition = DATAFINDER_BUILTIN_QUERIES[name];\n const dashboardId = options.dashboardId ?? client.publicConfig.defaultDashboardId;\n const reports = await client.listDashboardReports(dashboardId);\n const resolvedReports: DataFinderReport[] = [];\n const missing: string[] = [];\n for (const expected of definition.reports) {\n const idMatches = reports.filter((report) => report.report_id === expected.id);\n if (idMatches.length > 1) {\n throw new Error(`DataFinder 看板存在重复 report ID: ${expected.id}`);\n }\n if (idMatches.length === 1) {\n resolvedReports.push(idMatches[0]);\n continue;\n }\n\n const nameMatches = reports.filter((report) => report.report_name === expected.name);\n if (nameMatches.length > 1) {\n throw new Error(`DataFinder 看板存在同名固定查询报表: ${expected.name}`);\n }\n if (nameMatches.length === 1) {\n resolvedReports.push(nameMatches[0]);\n } else {\n missing.push(`${expected.name} (${expected.id})`);\n }\n }\n if (missing.length > 0) {\n throw new Error(`DataFinder 看板缺少固定查询所需报表: ${missing.join(', ')}`);\n }\n\n const results = [];\n for (const report of resolvedReports) {\n results.push({\n report,\n source: isEmbeddedReport(report) ? 'embedded' : 'openapi',\n data: isEmbeddedReport(report)\n ? (report.dsls ?? [])\n : await client.getReportData(report.report_id, options.count),\n });\n }\n\n return {\n dashboardId,\n description: definition.description,\n fetchedAt: new Date().toISOString(),\n query: name,\n reports: results,\n };\n};\n","import { stat } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type { DataFinderClient } from './client.js';\nimport type { DataFinderPublicConfig } from './types.js';\n\nexport type DataFinderQueryContext = {\n args: string[];\n client: DataFinderClient;\n config: DataFinderPublicConfig;\n};\n\ntype DataFinderQueryFunction = (context: DataFinderQueryContext) => unknown | Promise<unknown>;\n\nexport const executeDataFinderScript = async (\n scriptPath: string,\n context: DataFinderQueryContext,\n): Promise<unknown> => {\n const absolutePath = resolve(scriptPath);\n const scriptStat = await stat(absolutePath);\n if (!scriptStat.isFile()) {\n throw new Error(`DataFinder query script is not a file: ${absolutePath}`);\n }\n if (!/\\.(?:cjs|js|mjs)$/.test(absolutePath)) {\n throw new Error('DataFinder query script must use a .js, .mjs, or .cjs extension');\n }\n\n const module = (await import(pathToFileURL(absolutePath).href)) as {\n default?: unknown;\n };\n if (typeof module.default !== 'function') {\n throw new Error('DataFinder query script must default-export a function');\n }\n\n return (module.default as DataFinderQueryFunction)(context);\n};\n","import type { Command } from 'commander';\nimport {\n DATAFINDER_BUILTIN_QUERIES,\n runDataFinderBuiltinQuery,\n type DataFinderBuiltinQueryName,\n} from '../../lib/datafinder/builtin-queries.js';\nimport { executeDataFinderScript } from '../../lib/datafinder/script-runner.js';\nimport {\n addDataFinderOutputOptions,\n parseReportCount,\n printDataFinderResult,\n resolveDataFinderContext,\n type DataFinderOutputOptions,\n} from './shared.js';\n\ntype BuiltinOptions = DataFinderOutputOptions & {\n count?: string;\n dashboardId?: string;\n};\n\nexport const runDataFinderScript = async (\n script: string,\n scriptArgs: string[],\n options: DataFinderOutputOptions,\n): Promise<void> => {\n const { client } = await resolveDataFinderContext();\n await printDataFinderResult(\n await executeDataFinderScript(script, {\n args: scriptArgs,\n client,\n config: client.publicConfig,\n }),\n options,\n );\n};\n\nexport const runBuiltin = async (\n name: DataFinderBuiltinQueryName,\n options: BuiltinOptions,\n): Promise<void> => {\n const { client } = await resolveDataFinderContext();\n await printDataFinderResult(\n await runDataFinderBuiltinQuery(client, name, {\n count: parseReportCount(options.count),\n dashboardId: options.dashboardId,\n }),\n options,\n );\n};\n\nexport const registerDataFinderQueryCommand = (program: Command): void => {\n const query = program.command('query').description('Run DataFinder queries');\n\n addDataFinderOutputOptions(\n query\n .command('exec')\n .description('Execute a trusted local JavaScript query module')\n .argument('<script>', 'path to a .js, .mjs, or .cjs module')\n .argument('[scriptArgs...]', 'arguments exposed to the query module'),\n ).action(runDataFinderScript);\n\n for (const [name, definition] of Object.entries(DATAFINDER_BUILTIN_QUERIES)) {\n addDataFinderOutputOptions(\n query\n .command(name)\n .description(definition.description)\n .option('--dashboard-id <id>', 'override the configured dashboard')\n .option('--count <number>', 'maximum result rows per report, 1-1000'),\n ).action((options: BuiltinOptions) =>\n runBuiltin(name as DataFinderBuiltinQueryName, options),\n );\n }\n};\n","import type { Command } from 'commander';\nimport {\n addDataFinderOutputOptions,\n parseReportCount,\n printDataFinderResult,\n resolveDataFinderContext,\n type DataFinderOutputOptions,\n} from './shared.js';\n\ntype ReportOptions = DataFinderOutputOptions & { count?: string };\n\nexport const runDataFinderReportList = async (\n dashboardId: string | undefined,\n options: DataFinderOutputOptions,\n): Promise<void> => {\n const { client } = await resolveDataFinderContext();\n await printDataFinderResult(await client.listDashboardReports(dashboardId), options);\n};\n\nexport const runDataFinderReportGet = async (\n reportId: string,\n options: ReportOptions,\n): Promise<void> => {\n const { client } = await resolveDataFinderContext();\n await printDataFinderResult(\n await client.getReportData(reportId, parseReportCount(options.count)),\n options,\n );\n};\n\nexport const registerDataFinderReportCommand = (program: Command): void => {\n const report = program.command('report').description('Query DataFinder reports');\n addDataFinderOutputOptions(\n report\n .command('list')\n .description('List reports in a dashboard')\n .argument('[dashboardId]', 'defaults to the configured dashboard'),\n ).action(runDataFinderReportList);\n addDataFinderOutputOptions(\n report\n .command('get')\n .description('Get report definition and data')\n .argument('<reportId>')\n .option('--count <number>', 'maximum result rows, 1-1000'),\n ).action(runDataFinderReportGet);\n};\n","import type { Command } from 'commander';\nimport { registerDataFinderAuthCommand } from './auth.js';\nimport { registerDataFinderDashboardCommand } from './dashboard.js';\nimport { registerDataFinderQueryCommand } from './query.js';\nimport { registerDataFinderReportCommand } from './report.js';\n\nexport const registerDataFinderCommand = (program: Command): void => {\n const datafinder = program\n .command('datafinder')\n .description('Query Volcengine DataFinder through OpenAPI');\n registerDataFinderAuthCommand(datafinder);\n registerDataFinderDashboardCommand(datafinder);\n registerDataFinderReportCommand(datafinder);\n registerDataFinderQueryCommand(datafinder);\n};\n","import { createHash } from 'node:crypto';\nimport {\n queryCloudWatchLogs,\n type CloudWatchLogsQueryInput,\n type CloudWatchLogsQueryResult,\n type CloudWatchLogsQueryStats,\n} from '../lib/cloudwatch-logs.js';\nimport { CliError, toErrorMessage } from '../lib/errors.js';\n\nexport const SHARED_AGENT_PLAYBOOK_ID = 'shared-agent-connectivity';\nexport const SHARED_AGENT_PLAYBOOK_VERSION = '1.0.0';\nexport const DEFAULT_TSH_LOG_GROUP = '/aws/containerinsights/nexight-ojo-us-east-1/application';\nexport const DEFAULT_TSH_NAMESPACE = 'tsh';\nexport const DEFAULT_TSH_CONTAINER = 'tsh-server';\nexport const DEFAULT_DIAGNOSIS_WINDOW_MINUTES = 30;\nexport const MAX_DIAGNOSIS_WINDOW_MINUTES = 24 * 60;\n\nconst MAX_IDENTIFIER_LENGTH = 256;\nconst QUERY_LIMIT = 500;\nconst RESULT_EVENT_LIMIT = 50;\nconst PRODUCT_DEVICE_ID = /^(?:dev_[0-9a-f]{32}|[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})$/;\nconst PRODUCT_AUTHORITY_ID = /^deva_[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;\nconst SAFE_IDENTIFIER = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/;\n\nexport type SharedAgentVerdictCode =\n | 'CONTROL_PLANE_FAILURE'\n | 'DESCRIPTOR_ISSUED'\n | 'DESCRIPTOR_REJECTED'\n | 'HTTP_FAILURE_ONLY'\n | 'INCONCLUSIVE'\n | 'OWNER_LEASE_UNHEALTHY'\n | 'OWNER_OFFLINE'\n | 'OWNER_RECOVERED'\n | 'OWNER_RENEWING_NO_DESCRIPTOR';\n\nexport type SharedAgentDescriptorEvidence = {\n channel: string;\n directEligible?: boolean;\n outcome: string;\n ownerDeviceId?: string;\n ownerUserId?: string;\n reason?: string;\n roomId: string;\n sharedAgentId: string;\n timestamp: string;\n};\n\nexport type SharedAgentOwnerLeaseEvidence = {\n authorityRef?: string;\n clientVersion: string;\n leaseStateAfter: string;\n leaseStateBefore: string;\n observationId?: string;\n outcome: string;\n ownerDeviceRef?: string;\n reasonCode: string;\n retryable?: boolean;\n timestamp: string;\n};\n\nexport type SharedAgentHTTPFailureEvidence = {\n clientVersion?: string;\n deviceId?: string;\n reason?: string;\n requestId?: string;\n roomId?: string;\n route?: string;\n statusCode?: number;\n timestamp: string;\n urlPath?: string;\n};\n\nexport type SharedAgentQueryReport = {\n error?: string;\n name: 'descriptor' | 'http-failure' | 'owner-lease';\n queryId?: string;\n stats?: CloudWatchLogsQueryStats;\n status: 'complete' | 'failed' | 'skipped';\n};\n\nexport type SharedAgentDiagnosis = {\n backend: {\n account: string;\n logGroup: string;\n profile: string;\n region: string;\n type: 'aws-cloudwatch';\n };\n descriptor: {\n attemptCount: number;\n events: SharedAgentDescriptorEvidence[];\n latest?: SharedAgentDescriptorEvidence;\n };\n generatedAt: string;\n httpFailures: {\n count: number;\n events: SharedAgentHTTPFailureEvidence[];\n };\n missingEvidence: string[];\n owner: {\n clientVersion?: string;\n deviceId?: string;\n deviceRef?: string;\n userId?: string;\n };\n ownerLease: {\n events: SharedAgentOwnerLeaseEvidence[];\n latest?: SharedAgentOwnerLeaseEvidence;\n observationCount: number;\n };\n partial: boolean;\n playbook: {\n id: typeof SHARED_AGENT_PLAYBOOK_ID;\n version: typeof SHARED_AGENT_PLAYBOOK_VERSION;\n };\n queryReports: SharedAgentQueryReport[];\n schemaVersion: 1;\n subject: {\n roomId: string;\n sharedAgentId?: string;\n };\n verdict: {\n code: SharedAgentVerdictCode;\n confidence: 'high' | 'low' | 'medium';\n summary: string;\n };\n warnings: string[];\n window: {\n anchor: string;\n from: string;\n to: string;\n };\n};\n\nexport type SharedAgentDiagnosisInput = {\n account: string;\n anchor: Date;\n authorityId?: string;\n container?: string;\n logGroup: string;\n namespace?: string;\n ownerDeviceId?: string;\n profile: string;\n region: string;\n roomId: string;\n sharedAgentId?: string;\n windowMinutes?: number;\n};\n\ntype SharedAgentDiagnosisDependencies = {\n now?: () => Date;\n queryLogs?: (input: CloudWatchLogsQueryInput) => Promise<CloudWatchLogsQueryResult>;\n};\n\ntype QueryAttempt = {\n report: SharedAgentQueryReport;\n result?: CloudWatchLogsQueryResult;\n};\n\nconst asString = (value: unknown): string | undefined =>\n typeof value === 'string' && value.trim() ? value.trim() : undefined;\n\nconst asBoolean = (value: unknown): boolean | undefined =>\n typeof value === 'boolean' ? value : undefined;\n\nconst asNumber = (value: unknown): number | undefined => {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n};\n\nconst timestampValue = (row: Record<string, string>): string => {\n const value = row['@timestamp'];\n const normalized = value && /^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?$/.test(value)\n ? `${value.replace(' ', 'T')}Z`\n : value;\n const parsed = normalized ? new Date(normalized) : undefined;\n return parsed && !Number.isNaN(parsed.getTime()) ? parsed.toISOString() : value || new Date(0).toISOString();\n};\n\nconst newestFirst = <T extends { timestamp: string }>(events: T[]): T[] =>\n events.sort((left, right) => Date.parse(right.timestamp) - Date.parse(left.timestamp));\n\nexport const validateDiagnosticIdentifier = (label: string, value: string): string => {\n const normalized = value.trim();\n if (!normalized || normalized.length > MAX_IDENTIFIER_LENGTH || !SAFE_IDENTIFIER.test(normalized)) {\n throw new CliError(`${label} must use 1-${MAX_IDENTIFIER_LENGTH} letters, digits, '.', '_', ':', or '-'`, 1);\n }\n return normalized;\n};\n\nexport const parseDiagnosisAnchor = (value: string): Date => {\n const normalized = value.trim();\n if (!/(?:z|[+-]\\d{2}:\\d{2})$/i.test(normalized)) {\n throw new CliError('--at must include an explicit timezone offset or Z', 1);\n }\n const parsed = new Date(normalized);\n if (Number.isNaN(parsed.getTime())) {\n throw new CliError(`Invalid --at timestamp: ${value}`, 1);\n }\n return parsed;\n};\n\nexport const resolveDiagnosisWindow = (\n anchor: Date,\n windowMinutes = DEFAULT_DIAGNOSIS_WINDOW_MINUTES,\n now = new Date(),\n): { from: Date; to: Date } => {\n if (!Number.isInteger(windowMinutes) || windowMinutes < 5 || windowMinutes > MAX_DIAGNOSIS_WINDOW_MINUTES) {\n throw new CliError(`--window-minutes must be an integer between 5 and ${MAX_DIAGNOSIS_WINDOW_MINUTES}`, 1);\n }\n if (anchor.getTime() > now.getTime() + 5 * 60_000) {\n throw new CliError('--at cannot be more than five minutes in the future', 1);\n }\n const halfWindowMs = (windowMinutes * 60_000) / 2;\n return {\n from: new Date(anchor.getTime() - halfWindowMs),\n to: new Date(Math.min(anchor.getTime() + halfWindowMs, now.getTime())),\n };\n};\n\nconst regexEscape = (value: string): string =>\n value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&').replaceAll('/', '\\\\/');\n\nconst jsonFieldFilter = (field: string, value: string): string => {\n const encoded = JSON.stringify(value);\n return `diagnosticPayload like /\"${field}\"\\\\s*:\\\\s*\"${regexEscape(encoded.slice(1, -1))}\"/`;\n};\n\nconst baseDiagnosticQuery = (namespace: string, container: string, prefix: string): string[] => [\n 'fields @timestamp, log',\n `| filter kubernetes.namespace_name = ${JSON.stringify(namespace)}`,\n `| filter kubernetes.container_name = ${JSON.stringify(container)}`,\n `| filter log like /diagnostic_prefix=${regexEscape(prefix)}/`,\n '| parse log /diagnostic_payload=(?<diagnosticPayload>\\\\{.*\\\\})$/',\n '| filter ispresent(diagnosticPayload)',\n];\n\nexport const buildDescriptorQuery = (input: {\n container: string;\n namespace: string;\n roomId: string;\n sharedAgentId?: string;\n}): string => {\n const commands = baseDiagnosticQuery(input.namespace, input.container, 'RELAY_DESCRIPTOR_DIAGNOSTIC');\n commands.push(`| filter ${jsonFieldFilter('roomId', input.roomId)}`);\n if (input.sharedAgentId) {\n commands.push(`| filter ${jsonFieldFilter('sharedAgentId', input.sharedAgentId)}`);\n }\n commands.push('| display @timestamp, diagnosticPayload', '| sort @timestamp desc', `| limit ${QUERY_LIMIT}`);\n return commands.join('\\n');\n};\n\nexport const buildHTTPFailureQuery = (input: {\n authorityId?: string;\n container: string;\n namespace: string;\n ownerDeviceId?: string;\n roomId: string;\n}): string => {\n const commands = baseDiagnosticQuery(input.namespace, input.container, 'HTTP_FAILURE_DIAGNOSTIC');\n const filters = [jsonFieldFilter('roomId', input.roomId)];\n if (input.ownerDeviceId) {\n filters.push(jsonFieldFilter('deviceId', input.ownerDeviceId));\n }\n if (input.authorityId) {\n filters.push(`diagnosticPayload like /\"urlPath\"\\\\s*:\\\\s*\"[^\"]*${regexEscape(input.authorityId)}[^\"]*\"/`);\n }\n commands.push(`| filter (${filters.join(' or ')})`);\n commands.push('| display @timestamp, diagnosticPayload', '| sort @timestamp desc', `| limit ${QUERY_LIMIT}`);\n return commands.join('\\n');\n};\n\nexport const buildOwnerLeaseQuery = (input: {\n container: string;\n namespace: string;\n refs: string[];\n}): string => {\n const refs = [...new Set(input.refs.filter(Boolean))];\n if (refs.length === 0) {\n throw new CliError('Owner lease query requires at least one pseudonymous device or authority reference', 1);\n }\n return [\n 'fields @timestamp, log',\n `| filter kubernetes.namespace_name = ${JSON.stringify(input.namespace)}`,\n `| filter kubernetes.container_name = ${JSON.stringify(input.container)}`,\n '| filter log like /shared-agent owner lease observation accepted/',\n `| filter (${refs.map((ref) => `log like /${regexEscape(ref)}/`).join(' or ')})`,\n '| display @timestamp, log',\n '| sort @timestamp desc',\n `| limit ${QUERY_LIMIT}`,\n ].join('\\n');\n};\n\nconst parseDiagnosticPayload = (row: Record<string, string>): Record<string, unknown> | undefined => {\n const payload = row.diagnosticPayload;\n if (!payload) {\n return undefined;\n }\n try {\n const parsed = JSON.parse(payload) as unknown;\n return parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : undefined;\n } catch {\n return undefined;\n }\n};\n\nexport const parseDescriptorEvidence = (rows: Array<Record<string, string>>): SharedAgentDescriptorEvidence[] =>\n newestFirst(\n rows.flatMap((row) => {\n const payload = parseDiagnosticPayload(row);\n const outcome = asString(payload?.outcome);\n const roomId = asString(payload?.roomId);\n const sharedAgentId = asString(payload?.sharedAgentId);\n if (!payload || payload.prefix !== 'RELAY_DESCRIPTOR_DIAGNOSTIC' || !outcome || !roomId || !sharedAgentId) {\n return [];\n }\n return [\n {\n timestamp: timestampValue(row),\n outcome,\n channel: asString(payload.channel) ?? 'unknown',\n roomId,\n sharedAgentId,\n ...(asString(payload.ownerUserId) ? { ownerUserId: asString(payload.ownerUserId) } : {}),\n ...(asString(payload.ownerDeviceId) ? { ownerDeviceId: asString(payload.ownerDeviceId) } : {}),\n ...(asString(payload.reason) ? { reason: asString(payload.reason) } : {}),\n ...(asBoolean(payload.directEligible) !== undefined\n ? { directEligible: asBoolean(payload.directEligible) }\n : {}),\n },\n ];\n }),\n ).slice(0, RESULT_EVENT_LIMIT);\n\nconst extractLogValue = (log: string, field: string): string | undefined => {\n const escapedField = regexEscape(field);\n const jsonMatch = log.match(new RegExp(`\"${escapedField}\"\\\\s*:\\\\s*(?:\"([^\"]*)\"|([^,}\\\\s]+))`));\n if (jsonMatch) {\n return (jsonMatch[1] ?? jsonMatch[2])?.trim();\n }\n const keyValueMatch = log.match(new RegExp(`(?:^|\\\\s)${escapedField}=(?:\"([^\"]*)\"|([^\\\\s]+))`));\n return (keyValueMatch?.[1] ?? keyValueMatch?.[2])?.trim();\n};\n\nexport const parseOwnerLeaseEvidence = (rows: Array<Record<string, string>>): SharedAgentOwnerLeaseEvidence[] =>\n newestFirst(\n rows.flatMap((row) => {\n const log = row.log ?? '';\n const outcome = extractLogValue(log, 'outcome');\n const reasonCode = extractLogValue(log, 'reason_code');\n if (!log.includes('shared-agent owner lease observation accepted') || !outcome || !reasonCode) {\n return [];\n }\n const retryable = extractLogValue(log, 'retryable');\n return [\n {\n timestamp: timestampValue(row),\n outcome,\n reasonCode,\n clientVersion: extractLogValue(log, 'client_version') ?? 'unknown',\n leaseStateBefore: extractLogValue(log, 'lease_state_before') ?? 'unknown',\n leaseStateAfter: extractLogValue(log, 'lease_state_after') ?? 'unknown',\n ...(extractLogValue(log, 'observation_id')\n ? { observationId: extractLogValue(log, 'observation_id') }\n : {}),\n ...(extractLogValue(log, 'owner_device_ref')\n ? { ownerDeviceRef: extractLogValue(log, 'owner_device_ref') }\n : {}),\n ...(extractLogValue(log, 'authority_ref')\n ? { authorityRef: extractLogValue(log, 'authority_ref') }\n : {}),\n ...(retryable === 'true' || retryable === 'false' ? { retryable: retryable === 'true' } : {}),\n },\n ];\n }),\n ).slice(0, RESULT_EVENT_LIMIT);\n\nexport const parseHTTPFailureEvidence = (rows: Array<Record<string, string>>): SharedAgentHTTPFailureEvidence[] =>\n newestFirst(\n rows.flatMap((row) => {\n const payload = parseDiagnosticPayload(row);\n if (!payload || payload.prefix !== 'HTTP_FAILURE_DIAGNOSTIC') {\n return [];\n }\n return [\n {\n timestamp: timestampValue(row),\n ...(asNumber(payload.statusCode) !== undefined ? { statusCode: asNumber(payload.statusCode) } : {}),\n ...(asString(payload.route) ? { route: asString(payload.route) } : {}),\n ...(asString(payload.urlPath) ? { urlPath: asString(payload.urlPath) } : {}),\n ...(asString(payload.reason) ? { reason: asString(payload.reason) } : {}),\n ...(asString(payload.requestId) ? { requestId: asString(payload.requestId) } : {}),\n ...(asString(payload.roomId) ? { roomId: asString(payload.roomId) } : {}),\n ...(asString(payload.deviceId) ? { deviceId: asString(payload.deviceId) } : {}),\n ...(asString(payload.clientVersion) ? { clientVersion: asString(payload.clientVersion) } : {}),\n },\n ];\n }),\n ).slice(0, RESULT_EVENT_LIMIT);\n\nconst ownerGatewayRef = (kind: 'authority' | 'device', value?: string): string | undefined => {\n const normalized = value?.trim().toLowerCase();\n if (!normalized) {\n return undefined;\n }\n const eligible = kind === 'device' ? PRODUCT_DEVICE_ID.test(normalized) : PRODUCT_AUTHORITY_ID.test(normalized);\n if (!eligible) {\n return undefined;\n }\n return createHash('sha256')\n .update(['shared-agent-owner-gateway/v1', kind, normalized].join('\\0'))\n .digest('hex')\n .slice(0, 24);\n};\n\nexport const ownerDeviceRef = (deviceId: string): string | undefined => ownerGatewayRef('device', deviceId);\nexport const ownerAuthorityRef = (authorityId: string): string | undefined => ownerGatewayRef('authority', authorityId);\n\nconst attemptQuery = async (\n name: SharedAgentQueryReport['name'],\n queryLogs: NonNullable<SharedAgentDiagnosisDependencies['queryLogs']>,\n input: CloudWatchLogsQueryInput,\n): Promise<QueryAttempt> => {\n try {\n const result = await queryLogs(input);\n return { result, report: { name, status: 'complete', queryId: result.queryId, stats: result.stats } };\n } catch (error: unknown) {\n return { report: { name, status: 'failed', error: toErrorMessage(error) } };\n }\n};\n\nconst classify = (input: {\n descriptors: SharedAgentDescriptorEvidence[];\n failures: SharedAgentHTTPFailureEvidence[];\n leases: SharedAgentOwnerLeaseEvidence[];\n}): SharedAgentDiagnosis['verdict'] => {\n const latestDescriptor = input.descriptors[0];\n const latestLease = input.leases[0];\n if (\n latestLease &&\n ['failed', 'rejected'].includes(latestLease.outcome) &&\n (!latestDescriptor || Date.parse(latestLease.timestamp) >= Date.parse(latestDescriptor.timestamp))\n ) {\n return {\n code: 'OWNER_LEASE_UNHEALTHY',\n confidence: 'high',\n summary: `Owner 续约为 ${latestLease.outcome}/${latestLease.reasonCode},控制面已收到异常续约证据。`,\n };\n }\n if (latestDescriptor?.outcome === 'authority_offline') {\n if (\n latestLease?.outcome === 'recovered' &&\n Date.parse(latestLease.timestamp) >= Date.parse(latestDescriptor.timestamp)\n ) {\n return {\n code: 'OWNER_RECOVERED',\n confidence: 'high',\n summary: 'Descriptor 请求遇到 Owner 离线,随后服务端观察到 Owner 续约恢复。',\n };\n }\n return {\n code: 'OWNER_OFFLINE',\n confidence: 'high',\n summary: '控制面明确返回 authority_offline,Owner Presence lease 在请求时不可用。',\n };\n }\n if (latestDescriptor?.outcome === 'service_error') {\n return {\n code: 'CONTROL_PLANE_FAILURE',\n confidence: 'high',\n summary: 'Descriptor 签发发生服务端错误,需要按 requestId 或相邻服务端日志继续定位。',\n };\n }\n if (latestDescriptor?.outcome === 'rejected') {\n return {\n code: 'DESCRIPTOR_REJECTED',\n confidence: 'high',\n summary: `Descriptor 请求被拒绝${latestDescriptor.reason ? `:${latestDescriptor.reason}` : '。'}`,\n };\n }\n if (latestDescriptor?.outcome === 'issued') {\n return {\n code: 'DESCRIPTOR_ISSUED',\n confidence: latestLease ? 'high' : 'medium',\n summary: latestLease\n ? '控制面已签发 descriptor,且存在对应 Owner 续约证据;后续应检查客户端到 Device Gateway 的连接阶段。'\n : '控制面已签发 descriptor,但当前窗口没有对应 Owner 续约观测,后续应检查 Device Gateway 连接阶段。',\n };\n }\n if (latestLease && ['succeeded', 'recovered'].includes(latestLease.outcome)) {\n return {\n code: 'OWNER_RENEWING_NO_DESCRIPTOR',\n confidence: 'medium',\n summary: 'Owner 在当前窗口有健康续约,但没有找到该房间的 descriptor 请求证据。',\n };\n }\n if (input.failures.length > 0) {\n return {\n code: 'HTTP_FAILURE_ONLY',\n confidence: 'medium',\n summary: '只找到相关 HTTP 失败,未找到 descriptor 或 Owner 续约证据。',\n };\n }\n return {\n code: 'INCONCLUSIVE',\n confidence: 'low',\n summary: '当前时间窗没有足够证据判断共享 Agent 连接失败阶段。',\n };\n};\n\nexport const diagnoseSharedAgent = async (\n rawInput: SharedAgentDiagnosisInput,\n dependencies: SharedAgentDiagnosisDependencies = {},\n): Promise<SharedAgentDiagnosis> => {\n const now = dependencies.now?.() ?? new Date();\n const queryLogs = dependencies.queryLogs ?? queryCloudWatchLogs;\n const namespace = validateDiagnosticIdentifier('namespace', rawInput.namespace ?? DEFAULT_TSH_NAMESPACE);\n const container = validateDiagnosticIdentifier('container', rawInput.container ?? DEFAULT_TSH_CONTAINER);\n const roomId = validateDiagnosticIdentifier('room ID', rawInput.roomId);\n const sharedAgentId = rawInput.sharedAgentId\n ? validateDiagnosticIdentifier('shared Agent ID', rawInput.sharedAgentId)\n : undefined;\n const providedOwnerDeviceId = rawInput.ownerDeviceId\n ? validateDiagnosticIdentifier('Owner device ID', rawInput.ownerDeviceId).toLowerCase()\n : undefined;\n const authorityId = rawInput.authorityId\n ? validateDiagnosticIdentifier('Authority ID', rawInput.authorityId).toLowerCase()\n : undefined;\n const window = resolveDiagnosisWindow(rawInput.anchor, rawInput.windowMinutes, now);\n const commonQueryInput = {\n startTime: window.from,\n endTime: window.to,\n logGroup: rawInput.logGroup,\n profile: rawInput.profile,\n region: rawInput.region,\n limit: QUERY_LIMIT,\n };\n\n const descriptorAttempt = await attemptQuery('descriptor', queryLogs, {\n ...commonQueryInput,\n query: buildDescriptorQuery({ namespace, container, roomId, sharedAgentId }),\n });\n const descriptors = parseDescriptorEvidence(descriptorAttempt.result?.rows ?? []);\n const descriptorWithOwner = descriptors.find((event) => event.ownerDeviceId || event.ownerUserId);\n const ownerDeviceId = providedOwnerDeviceId ?? descriptorWithOwner?.ownerDeviceId?.toLowerCase();\n const ownerUserId = descriptorWithOwner?.ownerUserId;\n const deviceRef = ownerDeviceId ? ownerDeviceRef(ownerDeviceId) : undefined;\n const authorityRef = authorityId ? ownerAuthorityRef(authorityId) : undefined;\n const refs = [deviceRef, authorityRef].filter((value): value is string => Boolean(value));\n\n const httpAttemptPromise = attemptQuery('http-failure', queryLogs, {\n ...commonQueryInput,\n query: buildHTTPFailureQuery({ namespace, container, roomId, ownerDeviceId, authorityId }),\n });\n const leaseAttemptPromise: Promise<QueryAttempt> =\n refs.length > 0\n ? attemptQuery('owner-lease', queryLogs, {\n ...commonQueryInput,\n query: buildOwnerLeaseQuery({ namespace, container, refs }),\n })\n : Promise.resolve({ report: { name: 'owner-lease', status: 'skipped' } });\n const [httpAttempt, leaseAttempt] = await Promise.all([httpAttemptPromise, leaseAttemptPromise]);\n const failures = parseHTTPFailureEvidence(httpAttempt.result?.rows ?? []);\n const leases = parseOwnerLeaseEvidence(leaseAttempt.result?.rows ?? []);\n const queryReports = [descriptorAttempt.report, httpAttempt.report, leaseAttempt.report];\n if (!queryReports.some((report) => report.status === 'complete')) {\n throw new CliError(\n `All Shared Agent evidence queries failed: ${queryReports\n .filter((report) => report.status === 'failed')\n .map((report) => `${report.name}: ${report.error ?? 'unknown error'}`)\n .join('; ')}`,\n 1,\n );\n }\n const warnings = queryReports.flatMap((report) =>\n report.status === 'failed' ? [`${report.name} query failed: ${report.error ?? 'unknown error'}`] : [],\n );\n if (ownerDeviceId && !deviceRef) {\n warnings.push('Owner device ID is not a canonical product ID, so server-side pseudonymous lease events cannot be joined.');\n }\n if (authorityId && !authorityRef) {\n warnings.push('Authority ID is not canonical, so server-side pseudonymous lease events cannot be joined.');\n }\n\n const ownerRenewalFailure = failures.find((failure) =>\n `${failure.route ?? ''} ${failure.urlPath ?? ''}`.includes('/lease/renew'),\n );\n const ownerClientVersion = leases[0]?.clientVersion ?? ownerRenewalFailure?.clientVersion;\n const missingEvidence: string[] = [];\n if (descriptors.length === 0) {\n missingEvidence.push('No RELAY_DESCRIPTOR_DIAGNOSTIC event matched this room and time window.');\n }\n if (!ownerDeviceId) {\n missingEvidence.push('Owner device identity was not supplied and no issued descriptor exposed it.');\n }\n if (leaseAttempt.report.status === 'skipped') {\n missingEvidence.push('Owner lease evidence could not be queried without a canonical Owner device or Authority ID.');\n } else if (leases.length === 0) {\n missingEvidence.push('No sampled Owner lease observation matched the derived pseudonymous reference.');\n }\n\n return {\n schemaVersion: 1,\n playbook: { id: SHARED_AGENT_PLAYBOOK_ID, version: SHARED_AGENT_PLAYBOOK_VERSION },\n generatedAt: now.toISOString(),\n backend: {\n type: 'aws-cloudwatch',\n account: rawInput.account,\n profile: rawInput.profile,\n region: rawInput.region,\n logGroup: rawInput.logGroup,\n },\n subject: { roomId, ...(sharedAgentId ? { sharedAgentId } : {}) },\n window: {\n anchor: rawInput.anchor.toISOString(),\n from: window.from.toISOString(),\n to: window.to.toISOString(),\n },\n verdict: classify({ descriptors, failures, leases }),\n owner: {\n ...(ownerUserId ? { userId: ownerUserId } : {}),\n ...(ownerDeviceId ? { deviceId: ownerDeviceId } : {}),\n ...(deviceRef ? { deviceRef } : {}),\n ...(ownerClientVersion ? { clientVersion: ownerClientVersion } : {}),\n },\n descriptor: {\n attemptCount: descriptors.length,\n events: descriptors,\n ...(descriptors[0] ? { latest: descriptors[0] } : {}),\n },\n ownerLease: {\n observationCount: leases.length,\n events: leases,\n ...(leases[0] ? { latest: leases[0] } : {}),\n },\n httpFailures: { count: failures.length, events: failures },\n queryReports,\n partial: queryReports.some((report) => report.status === 'failed'),\n warnings,\n missingEvidence,\n };\n};\n","import { execa, type Options } from 'execa';\n\nexport type RunCommandOptions = Omit<Options, 'reject'>;\n\nexport type RunCommandResult = {\n exitCode: number;\n stderr: string;\n stdout: string;\n};\n\nexport const runCommand = async (\n command: string,\n args: string[] = [],\n options: RunCommandOptions = {},\n): Promise<RunCommandResult> => {\n const result = await execa(command, args, {\n ...options,\n reject: false,\n });\n\n return {\n exitCode: result.exitCode ?? 1,\n stderr: String(result.stderr ?? ''),\n stdout: String(result.stdout ?? ''),\n };\n};\n","import { CliError } from './errors.js';\nimport { runCommand, type RunCommandResult } from './shell.js';\n\nconst DEFAULT_QUERY_TIMEOUT_MS = 30_000;\nconst DEFAULT_POLL_INTERVAL_MS = 750;\n\ntype CloudWatchStartQueryReply = {\n queryId?: string;\n};\n\ntype CloudWatchResultField = {\n field?: string;\n value?: string;\n};\n\ntype CloudWatchQueryStatistics = {\n bytesScanned?: number;\n estimatedBytesSkipped?: number;\n estimatedRecordsSkipped?: number;\n logGroupsScanned?: number;\n recordsMatched?: number;\n recordsScanned?: number;\n};\n\ntype CloudWatchGetQueryResultsReply = {\n results?: CloudWatchResultField[][];\n statistics?: CloudWatchQueryStatistics;\n status?: string;\n};\n\nexport type CloudWatchLogsQueryStats = {\n bytesScanned: number;\n logGroupsScanned: number;\n recordsMatched: number;\n recordsScanned: number;\n};\n\nexport type CloudWatchLogsQueryResult = {\n queryId: string;\n rows: Array<Record<string, string>>;\n stats: CloudWatchLogsQueryStats;\n};\n\ntype CloudWatchLogsQueryDependencies = {\n now?: () => number;\n run?: (command: string, args: string[]) => Promise<RunCommandResult>;\n sleep?: (durationMs: number) => Promise<void>;\n};\n\nexport type CloudWatchLogsQueryInput = {\n endTime: Date;\n limit?: number;\n logGroup: string;\n pollIntervalMs?: number;\n profile: string;\n query: string;\n region: string;\n startTime: Date;\n timeoutMs?: number;\n};\n\nconst parseAwsJson = <T>(raw: string, operation: string): T => {\n try {\n return JSON.parse(raw) as T;\n } catch {\n throw new CliError(`AWS ${operation} returned invalid JSON`, 1);\n }\n};\n\nconst runAwsLogs = async (\n run: NonNullable<CloudWatchLogsQueryDependencies['run']>,\n args: string[],\n operation: string,\n): Promise<string> => {\n const result = await run('aws', args);\n if (result.exitCode !== 0) {\n throw new CliError(result.stderr.trim() || `AWS ${operation} failed`, 1);\n }\n return result.stdout;\n};\n\nconst queryRows = (rows: CloudWatchResultField[][] = []): Array<Record<string, string>> =>\n rows.map((row) =>\n Object.fromEntries(\n row.flatMap((field) =>\n field.field === undefined || field.value === undefined ? [] : [[field.field, field.value]],\n ),\n ),\n );\n\nconst queryStats = (stats: CloudWatchQueryStatistics = {}): CloudWatchLogsQueryStats => ({\n bytesScanned: stats.bytesScanned ?? 0,\n logGroupsScanned: stats.logGroupsScanned ?? 0,\n recordsMatched: stats.recordsMatched ?? 0,\n recordsScanned: stats.recordsScanned ?? 0,\n});\n\nconst epochSeconds = (value: Date): string => String(Math.floor(value.getTime() / 1_000));\n\nconst defaultSleep = async (durationMs: number): Promise<void> =>\n new Promise((resolve) => {\n setTimeout(resolve, durationMs);\n });\n\nexport const queryCloudWatchLogs = async (\n input: CloudWatchLogsQueryInput,\n dependencies: CloudWatchLogsQueryDependencies = {},\n): Promise<CloudWatchLogsQueryResult> => {\n const run = dependencies.run ?? runCommand;\n const now = dependencies.now ?? Date.now;\n const sleep = dependencies.sleep ?? defaultSleep;\n const timeoutMs = input.timeoutMs ?? DEFAULT_QUERY_TIMEOUT_MS;\n const pollIntervalMs = input.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const limit = Math.max(1, Math.min(10_000, Math.floor(input.limit ?? 500)));\n const startedAt = now();\n\n const startReply = parseAwsJson<CloudWatchStartQueryReply>(\n await runAwsLogs(\n run,\n [\n 'logs',\n 'start-query',\n '--log-group-name',\n input.logGroup,\n '--start-time',\n epochSeconds(input.startTime),\n '--end-time',\n epochSeconds(input.endTime),\n '--query-string',\n input.query,\n '--limit',\n String(limit),\n '--profile',\n input.profile,\n '--region',\n input.region,\n '--output',\n 'json',\n ],\n 'Logs Insights start-query',\n ),\n 'Logs Insights start-query',\n );\n const queryId = startReply.queryId?.trim();\n if (!queryId) {\n throw new CliError('AWS Logs Insights start-query returned no query ID', 1);\n }\n\n while (now() - startedAt <= timeoutMs) {\n const reply = parseAwsJson<CloudWatchGetQueryResultsReply>(\n await runAwsLogs(\n run,\n [\n 'logs',\n 'get-query-results',\n '--query-id',\n queryId,\n '--profile',\n input.profile,\n '--region',\n input.region,\n '--output',\n 'json',\n ],\n 'Logs Insights get-query-results',\n ),\n 'Logs Insights get-query-results',\n );\n const status = reply.status ?? 'Unknown';\n\n if (status === 'Complete') {\n return {\n queryId,\n rows: queryRows(reply.results),\n stats: queryStats(reply.statistics),\n };\n }\n if (status !== 'Running' && status !== 'Scheduled') {\n throw new CliError(`AWS Logs Insights query ${queryId} ended with status ${status}`, 1);\n }\n\n await sleep(pollIntervalMs);\n }\n\n await run('aws', [\n 'logs',\n 'stop-query',\n '--query-id',\n queryId,\n '--profile',\n input.profile,\n '--region',\n input.region,\n '--output',\n 'json',\n ]);\n throw new CliError(`AWS Logs Insights query ${queryId} exceeded ${timeoutMs}ms`, 1);\n};\n","import { CliError } from './errors.js';\nimport { runCommand } from './shell.js';\n\ntype AwsGetServiceResponse = {\n Service: {\n Name: string;\n NamespaceId: string;\n };\n};\n\ntype AwsGetNamespaceResponse = {\n Namespace: {\n Name: string;\n };\n};\n\ntype AwsListInstancesResponse = {\n Instances: Array<{\n Attributes: Record<string, string>;\n Id: string;\n }>;\n};\n\ntype AwsCallerIdentityResponse = {\n Account: string;\n Arn: string;\n UserId: string;\n};\n\nexport type AwsCallerIdentity = {\n account: string;\n arn: string;\n userId: string;\n};\n\nexport type LaneInstance = {\n host: string;\n id: string;\n lane: string;\n port: string;\n protocol: string;\n};\n\nconst parseJson = <T>(raw: string): T => JSON.parse(raw) as T;\n\nconst isSsoAuthFailure = (stderr: string): boolean =>\n /(token has expired|token.*expired|sso|authorization pending|login)/i.test(stderr);\n\nconst runAws = async (args: string[]) => {\n const result = await runCommand('aws', args);\n if (result.exitCode !== 0) {\n throw new CliError(result.stderr || `AWS command failed: aws ${args.join(' ')}`, 1);\n }\n\n return result.stdout;\n};\n\nexport const ensureAwsAuthenticated = async (profile: string): Promise<void> => {\n const identityArgs = ['sts', 'get-caller-identity', '--profile', profile, '--output', 'json'];\n const firstAttempt = await runCommand('aws', identityArgs);\n\n if (firstAttempt.exitCode === 0) {\n return;\n }\n\n if (!isSsoAuthFailure(firstAttempt.stderr)) {\n throw new CliError(firstAttempt.stderr || `AWS authentication failed for profile ${profile}`, 1);\n }\n\n const loginResult = await runCommand('aws', ['sso', 'login', '--profile', profile], {\n stdio: 'inherit',\n });\n if (loginResult.exitCode !== 0) {\n throw new CliError(`AWS SSO login failed for profile ${profile}`, 1);\n }\n\n const secondAttempt = await runCommand('aws', identityArgs);\n if (secondAttempt.exitCode !== 0) {\n throw new CliError(`AWS authentication is still invalid for profile ${profile}`, 1);\n }\n};\n\nexport const getAwsCallerIdentity = async (profile: string): Promise<AwsCallerIdentity> => {\n const identity = parseJson<AwsCallerIdentityResponse>(\n await runAws(['sts', 'get-caller-identity', '--profile', profile, '--output', 'json']),\n );\n\n return {\n account: identity.Account,\n arn: identity.Arn,\n userId: identity.UserId,\n };\n};\n\nexport const listLaneInstances = async (input: {\n lane?: string;\n profile: string;\n region: string;\n serviceId: string;\n}): Promise<{\n instances: LaneInstance[];\n namespaceName: string;\n serviceName: string;\n}> => {\n const service = parseJson<AwsGetServiceResponse>(\n await runAws([\n 'servicediscovery',\n 'get-service',\n '--id',\n input.serviceId,\n '--region',\n input.region,\n '--profile',\n input.profile,\n '--output',\n 'json',\n ]),\n ).Service;\n\n const namespace = parseJson<AwsGetNamespaceResponse>(\n await runAws([\n 'servicediscovery',\n 'get-namespace',\n '--id',\n service.NamespaceId,\n '--region',\n input.region,\n '--profile',\n input.profile,\n '--output',\n 'json',\n ]),\n ).Namespace;\n\n const instances = parseJson<AwsListInstancesResponse>(\n await runAws([\n 'servicediscovery',\n 'list-instances',\n '--service-id',\n input.serviceId,\n '--region',\n input.region,\n '--profile',\n input.profile,\n '--output',\n 'json',\n ]),\n ).Instances\n .filter((instance) => input.lane === undefined || instance.Attributes.lane === input.lane)\n .map<LaneInstance>((instance) => ({\n id: instance.Id,\n lane: instance.Attributes.lane ?? '',\n host: instance.Attributes.host ?? '',\n port: instance.Attributes.port ?? '',\n protocol: instance.Attributes.protocol ?? '',\n }));\n\n return {\n serviceName: service.Name,\n namespaceName: namespace.Name,\n instances,\n };\n};\n","import { mkdtemp, readFile, rm } from 'node:fs/promises';\nimport { CliError } from './errors.js';\nimport { runCommand } from './shell.js';\nimport os from 'node:os';\nimport path from 'node:path';\nimport {\n CONTROL_RELEASE_APPROVE_COMMAND,\n CONTROL_REPO_FULL_NAME,\n} from '../constants/release-targets.js';\n\ntype WorkflowRun = {\n actor: {\n login: string | null;\n } | null;\n conclusion: string | null;\n created_at: string;\n event: string;\n html_url: string;\n id: number;\n run_started_at?: string | null;\n status: string;\n updated_at?: string;\n};\n\ntype WorkflowRunJobStep = {\n conclusion?: string | null;\n name?: string | null;\n};\n\ntype WorkflowRunJob = {\n conclusion?: string | null;\n id: number;\n name?: string | null;\n steps?: WorkflowRunJobStep[] | null;\n};\n\nexport type IssueCommentMetadata = {\n commentId: number;\n createdAt: string;\n userLogin: string;\n};\n\nexport type WorkflowRunDurationSample = {\n createdAt: string;\n durationMs: number;\n htmlUrl: string;\n runId: number;\n updatedAt: string;\n};\n\nexport type WorkflowRunProgressUpdate =\n | {\n status: 'pending';\n }\n | {\n runId: number;\n status: 'pending';\n }\n | {\n htmlUrl: string;\n runId: number;\n status: 'completed' | 'in_progress';\n };\n\ntype WorkflowRunCorrelation = {\n actorLogin?: string;\n createdAt?: string;\n};\n\ntype WorkflowRunCompletion = {\n conclusion: string;\n failureMessage?: string;\n htmlUrl: string;\n runId: number;\n status: string;\n};\n\nexport type ControlledReleaseDurationEstimateInput = {\n allowUnmergedHotfix?: boolean;\n event?: string;\n perPage?: number;\n ref?: string;\n releaseMode: string;\n releaseProfile?: string;\n repoFullName: string;\n targetRepo: string;\n workflowFile: string;\n};\n\nexport type ControlledReleaseIssue = {\n approveCommand: string;\n body: string;\n candidateTag: string;\n createdAt: string;\n issueId: string;\n issueNumber: number;\n releaseBranch: string;\n releaseMode: string;\n releaseProfile: string;\n targetRepo: string;\n title: string;\n url: string;\n allowUnmergedHotfix: boolean;\n overrideReason: string;\n};\n\nexport type CanvasStagingVersionArtifact = {\n deploymentId: string;\n overrideHeader: string;\n previewAliasUrl: string | null;\n previewUrl: string | null;\n versionId: string;\n versionMessage: string;\n versionTag: string;\n workerName: string;\n workflowRunUrl: string;\n};\n\nconst CONTROLLED_RELEASE_HTML_COMMENT_MARKER = /^<!--\\s*([a-z_]+)=(.*?)\\s*-->$/;\nconst CONTROLLED_RELEASE_TEXT_MARKER = /^([a-z_]+):\\s*(.*)$/;\nconst CONTROLLED_RELEASE_MATCH_WINDOW_MS = 30 * 60 * 1000;\nconst TRANSIENT_WORKFLOW_RUN_READ_ATTEMPTS = 3;\n\nconst sleep = async (ms: number): Promise<void> => {\n if (ms <= 0) {\n return;\n }\n\n await new Promise((resolve) => setTimeout(resolve, ms));\n};\n\nconst hasRequiredControlledReleaseFields = (issue: ControlledReleaseIssue): boolean =>\n issue.targetRepo !== '' &&\n issue.releaseProfile !== '' &&\n issue.candidateTag !== '' &&\n issue.releaseMode !== '' &&\n issue.approveCommand !== '';\n\nconst stripWorkflowLogPrefix = (line: string): string =>\n line\n .replace(/^##\\[error\\]\\s*/i, '')\n .replace(/^##\\[warning\\]\\s*/i, '')\n .replace(/^::error::\\s*/i, '')\n .trim();\n\nconst getCommandFailureDetail = (stderr: string, stdout: string): string | null => {\n const combined = [stderr, stdout]\n .map((value) => value.trim())\n .filter(Boolean)\n .join('\\n');\n\n if (!combined) {\n return null;\n }\n\n return combined.split(/\\r?\\n/, 1)[0]?.trim() ?? null;\n};\n\nconst isTransientWorkflowRunReadFailure = (message: string): boolean =>\n /(bad gateway|connection reset|eai_again|econnreset|enotfound|eof|gateway timeout|http 502|http 503|http 504|network|rate limit|secondary rate limit|service unavailable|timeout|timed out|tls|temporary)/i.test(\n message,\n );\n\nconst extractActionableWorkflowLogLine = (logOutput: string): string | null => {\n let fallbackLine: string | null = null;\n let warningLine: string | null = null;\n\n for (const rawLine of logOutput.split(/\\r?\\n/)) {\n const trimmedLine = rawLine.trim();\n if (!trimmedLine) {\n continue;\n }\n\n if (/^##\\[error\\]/i.test(trimmedLine) || /^::error::/i.test(trimmedLine)) {\n const normalizedLine = stripWorkflowLogPrefix(trimmedLine);\n if (normalizedLine) {\n return normalizedLine;\n }\n continue;\n }\n\n if (/^##\\[warning\\]/i.test(trimmedLine)) {\n const normalizedLine = stripWorkflowLogPrefix(trimmedLine);\n if (normalizedLine && warningLine === null) {\n warningLine = normalizedLine;\n }\n continue;\n }\n\n const normalizedLine = stripWorkflowLogPrefix(trimmedLine);\n if (!normalizedLine) {\n continue;\n }\n\n if (/^(error|fatal|failed|failure|exception|panic)\\b[:\\s-]*/i.test(normalizedLine)) {\n const extractedLine = normalizedLine\n .replace(/^(error|fatal|failed|failure|exception|panic)\\b[:\\s-]*/i, '')\n .trim();\n if (extractedLine) {\n fallbackLine ??= extractedLine;\n }\n }\n }\n\n return fallbackLine ?? warningLine ?? null;\n};\n\nconst findFailedWorkflowJob = (jobs: WorkflowRunJob[]): WorkflowRunJob | null => {\n const failedJob = jobs.find((job) => job.conclusion === 'failure');\n if (failedJob) {\n return failedJob;\n }\n\n return jobs.find((job) =>\n job.steps?.some((step) => step.conclusion === 'failure'),\n ) ?? null;\n};\n\nconst findFailedWorkflowStepName = (job: WorkflowRunJob): string | null => {\n const failedStep = job.steps?.find((step) => step.conclusion === 'failure');\n const stepName = failedStep?.name?.trim() ?? job.name?.trim() ?? '';\n\n return stepName || null;\n};\n\nconst fetchWorkflowRunFailureMessage = async (input: {\n repoFullName: string;\n runId: number;\n}): Promise<string | null> => {\n const jobsResult = await runCommand('gh', [\n 'api',\n `repos/${input.repoFullName}/actions/runs/${input.runId}/jobs`,\n ]);\n\n if (jobsResult.exitCode !== 0) {\n return null;\n }\n\n const jobsPayload = JSON.parse(jobsResult.stdout) as {\n jobs?: WorkflowRunJob[];\n };\n const failedJob = findFailedWorkflowJob(jobsPayload.jobs ?? []);\n if (!failedJob) {\n return null;\n }\n\n const failedStepName = findFailedWorkflowStepName(failedJob);\n if (!failedStepName) {\n return null;\n }\n\n const logResult = await runCommand('gh', [\n 'run',\n 'view',\n String(input.runId),\n '--repo',\n input.repoFullName,\n '--job',\n String(failedJob.id),\n '--log-failed',\n ]);\n\n if (logResult.exitCode !== 0) {\n return failedStepName;\n }\n\n return extractActionableWorkflowLogLine(logResult.stdout) ?? failedStepName;\n};\n\nconst listWorkflowRuns = async (input: {\n event?: string;\n perPage?: number;\n ref?: string;\n repoFullName: string;\n workflowFile: string;\n}): Promise<WorkflowRun[]> => {\n const event = input.event ?? 'workflow_dispatch';\n const query = new URLSearchParams({\n event,\n per_page: String(input.perPage ?? 20),\n });\n\n if (event === 'workflow_dispatch' && input.ref) {\n query.set('branch', input.ref);\n }\n\n const result = await runCommand('gh', [\n 'api',\n `repos/${input.repoFullName}/actions/workflows/${input.workflowFile}/runs?${query.toString()}`,\n ]);\n\n if (result.exitCode !== 0) {\n const detail = getCommandFailureDetail(result.stderr, result.stdout);\n throw new CliError(\n detail\n ? `Failed to read workflow runs for ${input.repoFullName}: ${detail}`\n : `Failed to read workflow runs for ${input.repoFullName}`,\n 1,\n );\n }\n\n const payload = JSON.parse(result.stdout) as {\n workflow_runs: WorkflowRun[];\n };\n\n return payload.workflow_runs;\n};\n\nexport const getRepresentativeDurationMs = (durations: number[]): number | null => {\n if (durations.length === 0) {\n return null;\n }\n\n const sorted = [...durations].sort((left, right) => left - right);\n return sorted[Math.floor(sorted.length / 2)] ?? null;\n};\n\nexport const parseControlledReleaseIssueBody = (\n body: string,\n): Omit<\n ControlledReleaseIssue,\n 'body' | 'createdAt' | 'issueId' | 'issueNumber' | 'title' | 'url'\n> => {\n const markers = new Map<string, string>();\n\n for (const rawLine of body.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line) {\n continue;\n }\n\n const htmlCommentMatch = line.match(CONTROLLED_RELEASE_HTML_COMMENT_MARKER);\n if (htmlCommentMatch) {\n markers.set(htmlCommentMatch[1] ?? '', (htmlCommentMatch[2] ?? '').trim());\n continue;\n }\n\n const textMatch = line.match(CONTROLLED_RELEASE_TEXT_MARKER);\n if (textMatch) {\n markers.set(textMatch[1] ?? '', (textMatch[2] ?? '').trim());\n }\n }\n\n return {\n targetRepo: markers.get('target_repo') ?? '',\n releaseProfile: markers.get('release_profile') ?? '',\n candidateTag: markers.get('candidate_tag') ?? '',\n releaseBranch: markers.get('release_branch') ?? '',\n releaseMode: markers.get('release_mode') ?? '',\n allowUnmergedHotfix: (markers.get('allow_unmerged_hotfix') ?? 'false') === 'true',\n overrideReason: markers.get('override_reason') ?? '',\n approveCommand: markers.get('approve_command') ?? '',\n };\n};\n\nexport const ensureGhAuthenticated = async (): Promise<void> => {\n const result = await runCommand('gh', ['auth', 'status']);\n if (result.exitCode !== 0) {\n throw new CliError('GitHub CLI authentication is required', 1);\n }\n};\n\nexport const getCurrentGitHubLogin = async (): Promise<string> => {\n const result = await runCommand('gh', ['api', 'user', '--jq', '.login']);\n\n if (result.exitCode !== 0) {\n throw new CliError('Failed to resolve current GitHub login', 1);\n }\n\n const login = result.stdout.trim();\n if (!login) {\n throw new CliError('Failed to resolve current GitHub login', 1);\n }\n\n return login;\n};\n\nexport const resolveBranchForRepo = async (input: {\n defaultRef: string;\n repoFullName: string;\n requestedRef: string;\n}): Promise<{\n fallbackToDefault: boolean;\n requestedRef: string;\n resolvedRef: string;\n}> => {\n const result = await runCommand('gh', [\n 'api',\n `repos/${input.repoFullName}/branches/${encodeURIComponent(input.requestedRef)}`,\n ]);\n\n if (result.exitCode === 0) {\n return {\n requestedRef: input.requestedRef,\n resolvedRef: input.requestedRef,\n fallbackToDefault: false,\n };\n }\n\n if (!/404|not found/i.test(`${result.stdout}\\n${result.stderr}`)) {\n throw new CliError(\n result.stderr || `Failed to resolve branch ${input.requestedRef} for ${input.repoFullName}`,\n 1,\n );\n }\n\n return {\n requestedRef: input.requestedRef,\n resolvedRef: input.defaultRef,\n fallbackToDefault: true,\n };\n};\n\nexport const listWorkflowRunIds = async (input: {\n event?: string;\n ref: string;\n repoFullName: string;\n workflowFile: string;\n}): Promise<number[]> => {\n const runs = await listWorkflowRuns(input);\n return runs.map((run) => run.id);\n};\n\nexport const dispatchControlWorkflow = async (input: {\n inputs: Record<string, boolean | string>;\n ref: string;\n workflowFile: string;\n}): Promise<void> => {\n const args = [\n 'api',\n `repos/${CONTROL_REPO_FULL_NAME}/actions/workflows/${input.workflowFile}/dispatches`,\n '--method',\n 'POST',\n '-f',\n `ref=${input.ref}`,\n ];\n\n for (const [key, value] of Object.entries(input.inputs)) {\n args.push('-f', `inputs[${key}]=${String(value)}`);\n }\n\n const result = await runCommand('gh', args);\n\n if (result.exitCode !== 0) {\n throw new CliError(`Failed to dispatch ${input.workflowFile} for ${CONTROL_REPO_FULL_NAME}`, 1);\n }\n};\n\nexport const dispatchCanvasStagingVersionWorkflow = async (input: {\n repoFullName: string;\n targetRef: string;\n versionMessage?: string;\n versionTag?: string;\n workflowFile: string;\n workflowRef: string;\n}): Promise<void> => {\n const args = [\n 'api',\n `repos/${input.repoFullName}/actions/workflows/${input.workflowFile}/dispatches`,\n '--method',\n 'POST',\n '-f',\n `ref=${input.workflowRef}`,\n '-f',\n `inputs[target_ref]=${input.targetRef}`,\n ];\n\n if (input.versionMessage) {\n args.push('-f', `inputs[version_message]=${input.versionMessage}`);\n }\n\n if (input.versionTag) {\n args.push('-f', `inputs[version_tag]=${input.versionTag}`);\n }\n\n const result = await runCommand('gh', args);\n\n if (result.exitCode !== 0) {\n const detail = getCommandFailureDetail(result.stderr, result.stdout);\n throw new CliError(\n detail\n ? `Failed to dispatch ${input.workflowFile} for ${input.repoFullName}: ${detail}`\n : `Failed to dispatch ${input.workflowFile} for ${input.repoFullName}`,\n 1,\n );\n }\n};\n\nexport const dispatchWorkflow = async (input: {\n lane: string;\n ref: string;\n repoFullName: string;\n workflowFile: string;\n}): Promise<void> => {\n const result = await runCommand('gh', [\n 'api',\n `repos/${input.repoFullName}/actions/workflows/${input.workflowFile}/dispatches`,\n '--method',\n 'POST',\n '-f',\n `ref=${input.ref}`,\n '-F',\n `inputs[lane]=${input.lane}`,\n ]);\n\n if (result.exitCode !== 0) {\n const detail = getCommandFailureDetail(result.stderr, result.stdout);\n throw new CliError(\n detail\n ? `Failed to dispatch ${input.workflowFile} for ${input.repoFullName}: ${detail}`\n : `Failed to dispatch ${input.workflowFile} for ${input.repoFullName}`,\n 1,\n );\n }\n};\n\nexport const listOpenIssueIds = async (repoFullName: string): Promise<string[]> => {\n const result = await runCommand('gh', [\n 'issue',\n 'list',\n '--repo',\n repoFullName,\n '--state',\n 'open',\n '--json',\n 'id,number',\n '--limit',\n '100',\n ]);\n\n if (result.exitCode !== 0) {\n throw new CliError(`Failed to list issues for ${repoFullName}`, 1);\n }\n\n return (JSON.parse(result.stdout) as Array<{ id: string }>).map((issue) => issue.id);\n};\n\nexport const parseCanvasStagingVersionArtifact = (\n payload: string,\n): CanvasStagingVersionArtifact => {\n const parsed = JSON.parse(payload) as Partial<{\n deployment_id: string;\n override_header: string;\n preview_alias_url: string | null;\n preview_url: string | null;\n version_id: string;\n version_message: string;\n version_tag: string;\n worker_name: string;\n workflow_run_url: string;\n }>;\n\n if (\n !parsed.deployment_id ||\n !parsed.version_id ||\n !parsed.override_header ||\n !parsed.worker_name ||\n !parsed.workflow_run_url\n ) {\n throw new CliError('Failed to parse canvas staging version artifact metadata', 1);\n }\n\n return {\n deploymentId: String(parsed.deployment_id),\n overrideHeader: String(parsed.override_header),\n previewAliasUrl: parsed.preview_alias_url ? String(parsed.preview_alias_url) : null,\n previewUrl: parsed.preview_url ? String(parsed.preview_url) : null,\n versionId: String(parsed.version_id),\n versionMessage: String(parsed.version_message ?? ''),\n versionTag: String(parsed.version_tag ?? ''),\n workerName: String(parsed.worker_name),\n workflowRunUrl: String(parsed.workflow_run_url),\n };\n};\n\nexport const fetchCanvasStagingVersionArtifact = async (input: {\n artifactFileName: string;\n artifactName: string;\n repoFullName: string;\n runId: number;\n}): Promise<CanvasStagingVersionArtifact> => {\n const tempDir = await mkdtemp(path.join(os.tmpdir(), 'nexight-devops-canvas-'));\n\n try {\n const downloadResult = await runCommand('gh', [\n 'run',\n 'download',\n String(input.runId),\n '--repo',\n input.repoFullName,\n '--name',\n input.artifactName,\n '--dir',\n tempDir,\n ]);\n\n if (downloadResult.exitCode !== 0) {\n const detail = getCommandFailureDetail(downloadResult.stderr, downloadResult.stdout);\n throw new CliError(\n detail\n ? `Failed to download artifact ${input.artifactName} for run ${input.runId}: ${detail}`\n : `Failed to download artifact ${input.artifactName} for run ${input.runId}`,\n 1,\n );\n }\n\n const payload = await readFile(path.join(tempDir, input.artifactFileName), 'utf8');\n return parseCanvasStagingVersionArtifact(payload);\n } finally {\n await rm(tempDir, { recursive: true, force: true });\n }\n};\n\nconst listControlledReleaseIssues = async (\n state: 'all' | 'open',\n): Promise<ControlledReleaseIssue[]> => {\n const result = await runCommand('gh', [\n 'api',\n `repos/${CONTROL_REPO_FULL_NAME}/issues?state=${state}&labels=release-approval%2Crelease-control&per_page=100`,\n '--paginate',\n '--slurp',\n ]);\n\n if (result.exitCode !== 0) {\n throw new CliError('Failed to list release approval issues', 1);\n }\n\n const payload = JSON.parse(result.stdout) as Array<Record<string, unknown>> | Array<Array<Record<string, unknown>>>;\n const issues = Array.isArray(payload[0]) ? (payload as Array<Array<Record<string, unknown>>>).flat() : (payload as Array<Record<string, unknown>>);\n\n return issues\n .map((issue) => {\n const parsed = parseControlledReleaseIssueBody(String(issue.body ?? ''));\n\n return {\n issueId: String(issue.id ?? ''),\n issueNumber: Number(issue.number),\n title: String(issue.title ?? ''),\n url: String(issue.html_url ?? ''),\n createdAt: String(issue.created_at ?? ''),\n body: String(issue.body ?? ''),\n ...parsed,\n } satisfies ControlledReleaseIssue;\n })\n .filter(hasRequiredControlledReleaseFields)\n .filter((issue) => issue.approveCommand === CONTROL_RELEASE_APPROVE_COMMAND);\n};\n\nexport const filterPendingReleaseApprovalIssues = async (\n targetRepo: string,\n): Promise<ControlledReleaseIssue[]> => {\n const issues = await listControlledReleaseIssues('open');\n\n return issues.filter((issue) => issue.targetRepo === targetRepo);\n};\n\nexport const commentOnIssue = async (input: {\n body: string;\n issueNumber: number;\n repoFullName: string;\n}): Promise<IssueCommentMetadata> => {\n const result = await runCommand('gh', [\n 'api',\n `repos/${input.repoFullName}/issues/${input.issueNumber}/comments`,\n '--method',\n 'POST',\n '-f',\n `body=${input.body}`,\n ]);\n\n if (result.exitCode !== 0) {\n throw new CliError(`Failed to comment on issue #${input.issueNumber}`, 1);\n }\n\n const payload = JSON.parse(result.stdout) as {\n created_at?: string;\n id?: number;\n user?: {\n login?: string;\n };\n };\n\n const commentId = Number(payload.id ?? 0);\n const createdAt = String(payload.created_at ?? '');\n const userLogin = String(payload.user?.login ?? '');\n\n if (!commentId || !createdAt || !userLogin) {\n throw new CliError(`Failed to parse comment metadata for issue #${input.issueNumber}`, 1);\n }\n\n return {\n commentId,\n createdAt,\n userLogin,\n };\n};\n\nexport const closeIssue = async (input: {\n issueNumber: number;\n repoFullName: string;\n}): Promise<void> => {\n const result = await runCommand('gh', [\n 'api',\n `repos/${input.repoFullName}/issues/${input.issueNumber}`,\n '--method',\n 'PATCH',\n '-f',\n 'state=closed',\n ]);\n\n if (result.exitCode !== 0) {\n throw new CliError(`Failed to close issue #${input.issueNumber}`, 1);\n }\n};\n\nconst parseDurationMs = (startedAt: string, updatedAt: string): number | null => {\n const startedTime = Date.parse(startedAt);\n const updatedTime = Date.parse(updatedAt);\n\n if (Number.isNaN(startedTime) || Number.isNaN(updatedTime) || updatedTime < startedTime) {\n return null;\n }\n\n return updatedTime - startedTime;\n};\n\nexport const listSuccessfulWorkflowRunDurations = async (input: {\n event?: string;\n perPage?: number;\n ref?: string;\n repoFullName: string;\n workflowFile: string;\n}): Promise<WorkflowRunDurationSample[]> => {\n const runs = await listWorkflowRuns(input);\n\n return runs.flatMap((run) => {\n if (run.status !== 'completed' || run.conclusion !== 'success' || !run.updated_at) {\n return [];\n }\n\n const startedAt = run.run_started_at ?? run.created_at;\n const durationMs = parseDurationMs(startedAt, run.updated_at);\n if (durationMs === null) {\n return [];\n }\n\n return [\n {\n createdAt: run.created_at,\n runId: run.id,\n htmlUrl: run.html_url,\n updatedAt: run.updated_at,\n durationMs,\n },\n ];\n });\n};\n\nconst isRunCreatedAtOrAfter = (runCreatedAt: string, minimumCreatedAt?: string): boolean => {\n if (!minimumCreatedAt) {\n return true;\n }\n\n const runTime = Date.parse(runCreatedAt);\n const minimumTime = Date.parse(minimumCreatedAt);\n\n if (Number.isNaN(runTime) || Number.isNaN(minimumTime)) {\n return runCreatedAt >= minimumCreatedAt;\n }\n\n return Math.floor(runTime / 1000) >= Math.floor(minimumTime / 1000);\n};\n\nconst matchesWorkflowRunCorrelation = (\n run: WorkflowRun,\n correlation?: WorkflowRunCorrelation,\n): boolean => {\n if (!correlation) {\n return true;\n }\n\n if (correlation.actorLogin && run.actor?.login !== correlation.actorLogin) {\n return false;\n }\n\n if (!isRunCreatedAtOrAfter(run.created_at, correlation.createdAt)) {\n return false;\n }\n\n return true;\n};\n\nconst matchesControlledReleaseHistory = (\n issue: ControlledReleaseIssue,\n input: ControlledReleaseDurationEstimateInput,\n): boolean => {\n if (issue.targetRepo !== input.targetRepo || issue.releaseMode !== input.releaseMode) {\n return false;\n }\n\n if (input.releaseMode === 'mainline') {\n return issue.releaseProfile === (input.releaseProfile ?? '');\n }\n\n if (input.releaseMode === 'hotfix') {\n return issue.allowUnmergedHotfix === Boolean(input.allowUnmergedHotfix);\n }\n\n return true;\n};\n\nconst getIssueSampleGapMs = (issueCreatedAt: string, sampleCreatedAt: string): number => {\n const issueTime = Date.parse(issueCreatedAt);\n const sampleTime = Date.parse(sampleCreatedAt);\n\n if (Number.isNaN(issueTime) || Number.isNaN(sampleTime)) {\n return Number.POSITIVE_INFINITY;\n }\n\n return Math.abs(sampleTime - issueTime);\n};\n\nconst correlateIssueDurations = (\n issues: ControlledReleaseIssue[],\n samples: WorkflowRunDurationSample[],\n): number[] => {\n const remainingSamples = [...samples].sort((left, right) =>\n left.createdAt.localeCompare(right.createdAt),\n );\n const matchedDurations: number[] = [];\n\n const sortedIssues = [...issues].sort((left, right) => left.createdAt.localeCompare(right.createdAt));\n\n for (const issue of sortedIssues) {\n let bestIndex = -1;\n let bestGapMs = Number.POSITIVE_INFINITY;\n\n for (const [index, sample] of remainingSamples.entries()) {\n const gapMs = getIssueSampleGapMs(issue.createdAt, sample.createdAt);\n if (gapMs > CONTROLLED_RELEASE_MATCH_WINDOW_MS || gapMs >= bestGapMs) {\n continue;\n }\n\n bestIndex = index;\n bestGapMs = gapMs;\n }\n\n if (bestIndex === -1) {\n continue;\n }\n\n const matchedSample = remainingSamples.splice(bestIndex, 1)[0];\n if (matchedSample) {\n matchedDurations.push(matchedSample.durationMs);\n }\n }\n\n return matchedDurations;\n};\n\nexport const estimateControlledReleaseDuration = async (\n input: ControlledReleaseDurationEstimateInput,\n): Promise<number | null> => {\n const [issues, samples] = await Promise.all([\n listControlledReleaseIssues('all'),\n listSuccessfulWorkflowRunDurations({\n repoFullName: input.repoFullName,\n workflowFile: input.workflowFile,\n ref: input.ref,\n event: input.event,\n perPage: input.perPage,\n }),\n ]);\n\n const matchingIssues = issues.filter((issue) => matchesControlledReleaseHistory(issue, input));\n const matchedDurations = correlateIssueDurations(matchingIssues, samples);\n\n if (matchedDurations.length >= 2) {\n return getRepresentativeDurationMs(matchedDurations);\n }\n\n return getRepresentativeDurationMs(samples.map((sample) => sample.durationMs));\n};\n\nexport const pollWorkflowRun = async (input: {\n correlation?: WorkflowRunCorrelation;\n event?: string;\n intervalMs?: number;\n knownRunIds: number[];\n maxAttempts?: number;\n onUpdate?: (update: WorkflowRunProgressUpdate) => void;\n repoFullName: string;\n ref: string;\n workflowFile: string;\n}): Promise<WorkflowRunCompletion> => {\n const knownRunIds = new Set(input.knownRunIds);\n const intervalMs = input.intervalMs ?? 5000;\n const maxAttempts = input.maxAttempts ?? 120;\n let trackedRunId: number | null = null;\n\n for (let attempt = 0; attempt < maxAttempts; attempt += 1) {\n let runs: WorkflowRun[] | null = null;\n\n for (let readAttempt = 0; readAttempt < TRANSIENT_WORKFLOW_RUN_READ_ATTEMPTS; readAttempt += 1) {\n try {\n runs = await listWorkflowRuns(input);\n break;\n } catch (error) {\n if (\n !(error instanceof CliError) ||\n !isTransientWorkflowRunReadFailure(error.message) ||\n readAttempt === TRANSIENT_WORKFLOW_RUN_READ_ATTEMPTS - 1\n ) {\n throw error;\n }\n\n input.onUpdate?.(trackedRunId === null ? { status: 'pending' } : { runId: trackedRunId, status: 'pending' });\n await sleep(intervalMs);\n }\n }\n\n if (!runs) {\n throw new CliError(`Timed out waiting for workflow run in ${input.repoFullName}`, 1);\n }\n\n if (trackedRunId === null) {\n const candidates = runs\n .filter((run) => !knownRunIds.has(run.id))\n .filter((run) => matchesWorkflowRunCorrelation(run, input.correlation));\n\n if (candidates.length > 1) {\n throw new CliError(`Ambiguous workflow run selection for ${input.repoFullName}`, 1);\n }\n\n if (candidates.length === 0) {\n input.onUpdate?.({ status: 'pending' });\n await sleep(intervalMs);\n continue;\n }\n\n trackedRunId = candidates[0]?.id ?? null;\n }\n\n const matchedRun = runs.find((run) => run.id === trackedRunId);\n if (!matchedRun) {\n input.onUpdate?.({ runId: trackedRunId, status: 'pending' });\n await sleep(intervalMs);\n continue;\n }\n\n input.onUpdate?.({\n runId: trackedRunId,\n htmlUrl: matchedRun.html_url,\n status: matchedRun.status === 'completed' ? 'completed' : 'in_progress',\n });\n\n if (matchedRun.status === 'completed') {\n const completion: WorkflowRunCompletion = {\n conclusion: matchedRun.conclusion ?? 'unknown',\n htmlUrl: matchedRun.html_url,\n runId: matchedRun.id,\n status: matchedRun.status,\n };\n\n if (completion.conclusion !== 'success') {\n const failureMessage = await fetchWorkflowRunFailureMessage({\n repoFullName: input.repoFullName,\n runId: matchedRun.id,\n });\n\n if (failureMessage) {\n completion.failureMessage = failureMessage;\n }\n }\n\n return completion;\n }\n\n await sleep(intervalMs);\n }\n\n throw new CliError(`Timed out waiting for workflow run in ${input.repoFullName}`, 1);\n};\n","export type ReleaseTarget = {\n defaultReleaseProfile: 'production';\n key:\n | 'account'\n | 'design-project'\n | 'zk-agent-engine'\n | 'zk-admin-server'\n | 'zk-commerce'\n | 'zk-web'\n | 'zk-websocket';\n label: string;\n repoFullName: string;\n};\n\nexport const CONTROL_REPO_FULL_NAME = 'zk-org-test/github-action';\nexport const CONTROL_RELEASE_PREPARE_WORKFLOW_FILE = 'controlled-release.yml';\nexport const CONTROL_RELEASE_HOTFIX_WORKFLOW_FILE = 'controlled-hotfix-release.yml';\nexport const CONTROL_RELEASE_APPROVAL_WORKFLOW_FILE = 'controlled-release-approval.yml';\nexport const CONTROL_RELEASE_APPROVE_COMMAND = '/release-approve';\n\nexport const releaseTargets: ReleaseTarget[] = [\n {\n key: 'account',\n label: 'account',\n repoFullName: 'zk-org-test/account',\n defaultReleaseProfile: 'production',\n },\n {\n key: 'design-project',\n label: 'design-project',\n repoFullName: 'zk-org-test/design-project',\n defaultReleaseProfile: 'production',\n },\n {\n key: 'zk-web',\n label: 'zk-web',\n repoFullName: 'zk-org-test/zk-web',\n defaultReleaseProfile: 'production',\n },\n {\n key: 'zk-agent-engine',\n label: 'zk-agent-engine',\n repoFullName: 'zk-org-test/zk-agent-engine',\n defaultReleaseProfile: 'production',\n },\n {\n key: 'zk-commerce',\n label: 'zk-commerce',\n repoFullName: 'zk-org-test/zk-commerce',\n defaultReleaseProfile: 'production',\n },\n {\n key: 'zk-admin-server',\n label: 'zk-admin-server',\n repoFullName: 'zk-org-test/zk-admin-server',\n defaultReleaseProfile: 'production',\n },\n {\n key: 'zk-websocket',\n label: 'zk-websocket',\n repoFullName: 'zk-org-test/zk-websocket',\n defaultReleaseProfile: 'production',\n },\n];\n","import { ensureAwsAuthenticated } from './aws.js';\nimport { loadConfig } from './config.js';\nimport { CliError } from './errors.js';\nimport { ensureGhAuthenticated } from './github.js';\nimport { runCommand } from './shell.js';\n\nexport const ensureCommandInstalled = async (\n command: string,\n installHint: string,\n): Promise<void> => {\n const result = await runCommand(command, ['--version']);\n if (result.exitCode !== 0) {\n throw new CliError(installHint, 1);\n }\n};\n\nexport const ensurePrerequisites = async (input: {\n needsAws?: boolean;\n needsGh?: boolean;\n}) => {\n const config = await loadConfig();\n\n if (input.needsGh) {\n await ensureCommandInstalled('gh', 'gh is required. Run nexight-devops onboard --set-mode gh');\n await ensureGhAuthenticated();\n }\n\n if (input.needsAws) {\n await ensureCommandInstalled('aws', 'aws is required. Run nexight-devops onboard --set-mode aws');\n await ensureAwsAuthenticated(config.defaultAwsProfile);\n }\n\n return config;\n};\n","import type { Command } from 'commander';\nimport {\n DEFAULT_DIAGNOSIS_WINDOW_MINUTES,\n DEFAULT_TSH_LOG_GROUP,\n DEFAULT_TSH_NAMESPACE,\n diagnoseSharedAgent,\n parseDiagnosisAnchor,\n type SharedAgentDiagnosis,\n} from '../../diagnostics/shared-agent.js';\nimport { ensureAwsAuthenticated, getAwsCallerIdentity } from '../../lib/aws.js';\nimport { loadConfig } from '../../lib/config.js';\nimport { CliError } from '../../lib/errors.js';\nimport { logger } from '../../lib/logger.js';\nimport { ensureCommandInstalled } from '../../lib/prerequisites.js';\nimport { withProgressTask } from '../../lib/progress.js';\n\nconst EXPECTED_PRODUCTION_ACCOUNT = '250509935467';\nconst DEFAULT_REGION = 'us-east-1';\n\nexport type SharedAgentDiagnosisCommandOptions = {\n at: string;\n authorityId?: string;\n json?: boolean;\n logGroup: string;\n namespace: string;\n ownerDeviceId?: string;\n profile?: string;\n region: string;\n roomId: string;\n sharedAgentId?: string;\n windowMinutes: string;\n};\n\nconst parseWindowMinutes = (value: string): number => {\n if (!/^\\d+$/.test(value.trim())) {\n throw new CliError('--window-minutes must be an integer', 1);\n }\n return Number(value);\n};\n\nconst formatBytes = (bytes: number): string => {\n if (bytes < 1_024) {\n return `${bytes} B`;\n }\n if (bytes < 1_024 * 1_024) {\n return `${(bytes / 1_024).toFixed(1)} KiB`;\n }\n return `${(bytes / (1_024 * 1_024)).toFixed(1)} MiB`;\n};\n\nexport const printSharedAgentDiagnosis = (result: SharedAgentDiagnosis): void => {\n logger.info(`结论 [${result.verdict.code}/${result.verdict.confidence}] ${result.verdict.summary}`);\n logger.step(`时间窗 ${result.window.from} → ${result.window.to}`);\n\n const ownerParts = [\n result.owner.userId ? `user=${result.owner.userId}` : undefined,\n result.owner.deviceId ? `device=${result.owner.deviceId}` : undefined,\n result.owner.clientVersion ? `version=${result.owner.clientVersion}` : undefined,\n ].filter(Boolean);\n logger.step(`Owner ${ownerParts.length > 0 ? ownerParts.join(' | ') : '未识别'}`);\n\n const descriptor = result.descriptor.latest;\n logger.step(\n descriptor\n ? `Descriptor ${descriptor.timestamp} | ${descriptor.channel}/${descriptor.outcome}${\n descriptor.reason ? ` | ${descriptor.reason}` : ''\n }`\n : 'Descriptor 当前时间窗无证据',\n );\n\n const lease = result.ownerLease.latest;\n logger.step(\n lease\n ? `Owner lease ${lease.timestamp} | ${lease.outcome}/${lease.reasonCode} | version=${lease.clientVersion}`\n : 'Owner lease 当前时间窗无可关联观测',\n );\n logger.step(`HTTP failures ${result.httpFailures.count}`);\n\n result.queryReports.forEach((report) => {\n if (report.status === 'complete' && report.stats) {\n logger.step(\n `${report.name} query | matched=${report.stats.recordsMatched} scanned=${report.stats.recordsScanned} bytes=${formatBytes(\n report.stats.bytesScanned,\n )}`,\n );\n }\n });\n result.warnings.forEach((warning) => logger.warn(warning));\n result.missingEvidence.forEach((missing) => logger.warn(`缺失证据: ${missing}`));\n};\n\nexport const runSharedAgentDiagnosis = async (\n options: SharedAgentDiagnosisCommandOptions,\n): Promise<SharedAgentDiagnosis> => {\n const config = await loadConfig();\n const profile = options.profile?.trim() || config.defaultAwsProfile;\n await ensureCommandInstalled('aws', 'aws is required. Run nexight-devops onboard --set-mode aws');\n await ensureAwsAuthenticated(profile);\n const identity = await getAwsCallerIdentity(profile);\n if (identity.account !== EXPECTED_PRODUCTION_ACCOUNT) {\n throw new CliError(\n `AWS profile ${profile} is authenticated to account ${identity.account}; expected ${EXPECTED_PRODUCTION_ACCOUNT}`,\n 1,\n );\n }\n\n const run = () =>\n diagnoseSharedAgent({\n account: identity.account,\n profile,\n region: options.region,\n logGroup: options.logGroup,\n namespace: options.namespace,\n roomId: options.roomId,\n sharedAgentId: options.sharedAgentId,\n ownerDeviceId: options.ownerDeviceId,\n authorityId: options.authorityId,\n anchor: parseDiagnosisAnchor(options.at),\n windowMinutes: parseWindowMinutes(options.windowMinutes),\n });\n const result = options.json\n ? await run()\n : await withProgressTask(\n {\n initialText: '正在查询共享 Agent 控制面证据',\n heartbeatText: (elapsedMs) => `正在查询共享 Agent 控制面证据(${Math.floor(elapsedMs / 1_000)}s)`,\n },\n run,\n );\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n printSharedAgentDiagnosis(result);\n }\n return result;\n};\n\nexport const registerSharedAgentDiagnosisCommand = (program: Command): void => {\n program\n .command('shared-agent')\n .description('Diagnose Shared Agent connectivity from bounded production CloudWatch evidence')\n .requiredOption('--room-id <roomId>', 'room ID from the user report or requester diagnostics')\n .requiredOption('--at <timestamp>', 'incident timestamp with timezone, for example 2026-08-12T12:00:00+08:00')\n .option('--shared-agent-id <sharedAgentId>', 'narrow descriptor evidence to one Shared Agent')\n .option('--owner-device-id <ownerDeviceId>', 'known Owner device ID, used to join lease evidence')\n .option('--authority-id <authorityId>', 'known Device Authority ID, used to join lease evidence')\n .option('--window-minutes <minutes>', 'bounded window centered on --at', String(DEFAULT_DIAGNOSIS_WINDOW_MINUTES))\n .option('--profile <profile>', 'AWS CLI profile; defaults to the configured nexight-devops profile')\n .option('--region <region>', 'AWS region', DEFAULT_REGION)\n .option('--log-group <logGroup>', 'CloudWatch application log group', DEFAULT_TSH_LOG_GROUP)\n .option('--namespace <namespace>', 'Kubernetes namespace', DEFAULT_TSH_NAMESPACE)\n .option('--json', 'print stable machine-readable JSON without CLI decorations')\n .action(async (options: SharedAgentDiagnosisCommandOptions) => {\n await runSharedAgentDiagnosis(options);\n });\n};\n","import type { Command } from 'commander';\nimport { registerSharedAgentDiagnosisCommand } from './shared-agent.js';\n\nexport const registerDiagnoseCommand = (program: Command): void => {\n const diagnose = program.command('diagnose').description('Run deterministic incident diagnosis playbooks');\n\n registerSharedAgentDiagnosisCommand(diagnose);\n};\n","import type { Command } from 'commander';\nimport { logger } from '../lib/logger.js';\n\nexport const registerDoctorCommand = (program: Command): void => {\n program\n .command('doctor')\n .description('Run a local readiness check for the CLI shell')\n .action(() => {\n logger.step('Running basic readiness checks');\n logger.success('nexight-devops is ready');\n });\n};\n","export const DEFAULT_DATAFINDER_BASE_URL = 'https://analytics.volcengineapi.com';\nexport const DEFAULT_DATAFINDER_TIMEZONE = 'Asia/Shanghai';\n\nexport type DataFinderPathMode = 'app' | 'project';\n\nexport type DataFinderRequestOptions = {\n body?: unknown;\n method?: 'DELETE' | 'GET' | 'PATCH' | 'POST' | 'PUT';\n params?: Record<string, boolean | number | string>;\n};\n\nexport type DataFinderApiPayload<T = unknown> = {\n code?: number;\n data?: T;\n message?: string;\n};\n\nexport type DataFinderDashboard = {\n app_id?: number | string;\n dashboard_id?: string;\n name?: string;\n [key: string]: unknown;\n};\n\nexport type DataFinderReport = {\n dsls?: unknown[];\n report_id: string;\n report_name?: string;\n report_type?: string;\n [key: string]: unknown;\n};\n\nexport type DataFinderDashboardReports = {\n reports?: DataFinderReport[];\n [key: string]: unknown;\n};\n\nexport type DataFinderAnalysisItem = {\n data_item_list?: unknown[];\n date_index_list?: string[];\n error_code?: number | string | null;\n error_message?: string | null;\n query_id?: string;\n result_status?: string;\n trace_id?: string;\n [key: string]: unknown;\n};\n\nexport type DataFinderConnectionConfig = {\n accessKeyId: string;\n appId: string;\n baseUrl: string;\n defaultDashboardId: string;\n pathMode: DataFinderPathMode;\n projectId: string;\n secretAccessKey: string;\n timezone: string;\n};\n\nexport type DataFinderPublicConfig = Omit<\n DataFinderConnectionConfig,\n 'accessKeyId' | 'secretAccessKey'\n>;\n\nexport type DataFinderConnectionSummary = {\n dashboardId: string;\n dashboardName: string | null;\n reportCount: number;\n};\n\nexport type DataFinderDashboardExport = {\n dashboard: DataFinderDashboard;\n fetchedAt: string;\n reports: Array<{\n data: unknown;\n report: DataFinderReport;\n source: 'embedded' | 'openapi';\n }>;\n};\n","export const zhCN = {\n common: {\n continue: '继续',\n skip: '跳过',\n },\n errors: {\n missingAws: '未检测到 aws,请先完成 AWS CLI 安装。',\n missingGh: '未检测到 gh,请先完成 GitHub CLI 安装。',\n },\n onboard: {\n adminLoginSucceeded: '管理后台登录成功',\n adminSection: '管理后台登录设置',\n adminTokenRequired: '管理后台 Token 不能为空',\n awsSection: 'AWS CLI 设置',\n complete: 'Onboard 完成',\n chooseAwsProfile: '请选择默认 AWS Profile',\n chooseLocale: '请选择命令行语言',\n datafinderAppPathMode: '应用路径(传统 SaaS / 私有化)',\n datafinderCredentialAction: '已配置 DataFinder 凭证,请选择处理方式',\n datafinderKeepCredentials: '保留现有凭证',\n datafinderProjectPathMode: '项目路径(SaaS 云原生,推荐)',\n datafinderReplaceCredentials: '重新输入凭证',\n datafinderSection: 'DataFinder OpenAPI 设置',\n datafinderSucceeded: 'DataFinder 连接成功:{dashboardName},共 {reportCount} 个报表',\n enterGhToken: '请输入 GitHub Token',\n enterAdminToken: '请输入 Tutti 管理后台 Token',\n enterDataFinderAk: '请输入 DataFinder AccessKeyId',\n enterDataFinderAppId: '请输入 DataFinder 应用 ID',\n enterDataFinderDashboardId: '请输入默认 DataFinder 看板 ID',\n enterDataFinderProjectId: '请输入 DataFinder 项目 ID',\n enterDataFinderSk: '请输入 DataFinder SecretAccessKey',\n enterDataFinderTimezone: '请输入 DataFinder 查询时区',\n enterDataFinderUrl: '请输入 DataFinder OpenAPI 地址',\n ghInstallDeferred: '未完成 gh 安装。你可以稍后运行 nexight-devops onboard --set-mode gh',\n ghLoginToken: '使用 Token',\n ghLoginWeb: '浏览器登录(推荐)',\n ghSection: 'GitHub CLI 设置',\n installAwsPrompt: '未检测到 aws,是否现在尝试安装?',\n installBrewFailed: 'Homebrew 安装失败,请稍后手动重试。',\n installBrewPrompt: '未检测到 Homebrew,是否现在尝试安装?',\n installGhPrompt: '未检测到 gh,是否现在尝试安装?',\n installManualPrefix: '请先安装 Homebrew,再执行',\n selectDataFinderPathMode: '请选择 DataFinder OpenAPI 路径模式',\n selectGhLoginMode: '请选择 GitHub 登录方式',\n skipGhSetup: '跳过 GitHub CLI 设置',\n skipAdminSetup: '跳过管理后台登录设置',\n skipAwsSetup: '跳过 AWS CLI 设置',\n skipDataFinderSetup: '跳过 DataFinder OpenAPI 设置',\n awsInstallDeferred: '未完成 AWS CLI 安装。你可以稍后运行 nexight-devops onboard --set-mode aws',\n title: '开始初始化 nexight-devops',\n },\n release: {\n common: {\n approvalIssueUrl: '审批单地址: {approvalIssueUrl}',\n candidateTag: '候选版本: {candidateTag}',\n controlRunUrl: '控制面运行地址: {controlRunUrl}',\n releaseBranch: '发布分支: {releaseBranch}',\n releaseProfile: '发布 Profile: {releaseProfile}',\n targetRepo: '目标仓库: {targetRepo}',\n },\n approve: {\n approvalIssueMissing: '未找到可审批的发布单,请重新选择目标仓库或检查控制面状态。',\n approvalWorkflowRunUrl: '审批工作流地址: {approvalWorkflowRunUrl}',\n cancelled: '已取消 release approve。',\n commenting: '正在对发布单 #{issueNumber} 执行 /release-approve',\n closeIssueWarning: '审批单 #{issueNumber} 自动关闭失败,请稍后手动关闭。',\n confirm: '确认对发布单 #{issueNumber}({candidateTag} / {releaseBranch})执行 /release-approve?',\n feishuReminder: '飞书提醒:正式发版已开始,请立即关注飞书群,持续跟进发布状态。',\n noPendingIssues: '当前没有待审批的发布单,目标仓库 {targetRepo} 暂无可处理项。',\n selectApprovalIssue: '请选择要审批的发布单',\n selectTarget: '请选择要审批的仓库',\n success: 'release approve 已完成,正式发版已开始',\n workflowFailed: '审批工作流执行失败,请打开审批工作流运行查看详情: {approvalWorkflowRunUrl}',\n },\n hotfix: {\n allowUnmergedHotfix: '是否允许 release 分支上的补丁尚未被 main 吸收时直接发起 hotfix?',\n approvalIssueAmbiguous:\n '检测到多个新的 hotfix 审批单,请检查以下候选项: {candidateIssueUrls};控制面运行: {controlRunUrl}',\n approvalIssueMissing: '未找到新创建的 hotfix 审批单,请打开控制面运行查看详情: {controlRunUrl}',\n cancelled: '已取消 release hotfix。',\n confirm: '确认对 {repoName} 发起 hotfix,分支 {releaseBranch}?',\n dispatching: '正在准备 hotfix: {repoName}',\n enterReleaseBranch: '请输入 hotfix 的 release 分支(必须以 release/ 开头)',\n feishuReminder:\n '飞书提醒:自测发版通知已发送到飞书群,请关注飞书群并完成验证,随后执行 nexight-devops release approve。',\n invalidReleaseBranch: 'release 分支必须是 release/<name> 格式。',\n nextSteps: '下一步:完成验证后,执行 nexight-devops release approve。',\n overrideMode: 'Override 模式: {overrideMode}',\n overrideModeDisabled: '未开启',\n overrideModeEnabled: '已开启',\n overrideReason: '请输入 release 分支上的补丁尚未被 main 吸收时继续 hotfix 的原因',\n overrideReasonRequired: '开启 release 分支补丁 override 时必须填写原因。',\n workflowFailureReason: '失败原因: {failureMessage}',\n selectTarget: '请选择要执行 hotfix 的仓库',\n success: 'release hotfix 已完成',\n waiting: '控制面 hotfix 工作流已触发,正在等待完成: {repoName}',\n workflowFailed: 'controlled-hotfix-release 工作流执行失败,请打开控制面运行查看详情: {controlRunUrl}',\n },\n prepare: {\n approvalIssueAmbiguous:\n '检测到多个新的发布审批单,请检查以下候选项: {candidateIssueUrls};控制面运行: {controlRunUrl}',\n approvalIssueMissing: '未找到新创建的发布审批单,请打开控制面运行查看详情: {controlRunUrl}',\n cancelled: '已取消 release prepare。',\n confirm: '确认对 {repoName} 执行 release prepare?',\n dispatching: '正在准备发布: {repoName}',\n feishuReminder:\n '飞书提醒:自测发版通知已发送到飞书群,请关注飞书群并完成验证,随后执行 nexight-devops release approve。',\n nextSteps: '下一步:完成验证后,执行 nexight-devops release approve。',\n selectTarget: '请选择要准备发布的仓库',\n success: 'release prepare 已完成',\n waiting: '控制面发布工作流已触发,正在等待完成: {repoName}',\n workflowFailed: 'controlled-release 工作流执行失败,请打开控制面运行查看详情: {controlRunUrl}',\n },\n },\n ppeLane: {\n destroy: {\n atLeastOneRepo: '至少选择一个仓库',\n blankLane: 'PPE lane 名称不能为空',\n cancelled: '已取消销毁',\n confirmLane: '这是销毁操作,请再次输入 {lane} 确认',\n enterLane: '请输入需要移除的 PPE lane 名称',\n failed: '一个或多个 PPE lane 销毁工作流执行失败',\n noRecords: '该 ppe-lane 没查询到任何部署记录',\n running: '正在销毁 lane {lane}',\n selectRepos: '请选择需要销毁的仓库',\n skippedReason: 'Cloud Map 中未找到部署记录',\n warning: '将销毁以下仓库: {repos}',\n },\n },\n versionUpdate: {\n alreadyLatest: '当前已是最新版本 {currentVersion}。',\n available: '检测到新版本 {latestVersion},当前版本为 {currentVersion}。',\n checkingRegistry: '正在检查版本信息',\n detectingInstallSource: '正在检测安装来源',\n majorRequired: '检测到大版本更新 {latestVersion},当前版本 {currentVersion} 必须先升级后再继续。',\n manualUpgrade: '无法识别当前安装来源,请手动执行以下任一升级命令:\\n{commands}',\n optionalUpgradeFailed: '自动升级失败,本次继续使用当前版本。你可以稍后手动执行:{command}',\n registryCheckFailed: '版本检查失败,已继续执行当前命令。',\n registryCheckFailedManual: '版本检查失败,请稍后重试。',\n rerun: '升级完成后请重新执行刚才的命令。',\n selectAction: '检测到可用更新,是否现在升级?',\n skipThisRun: '跳过本次',\n skippedForRun: '已跳过本次升级,继续执行当前命令。',\n upgradeFailed: '自动升级失败,请先手动执行:{command}',\n upgradeNow: '立即升级',\n upgradeSucceeded: 'CLI 已更新到最新版本 {latestVersion}。',\n upgrading: '正在执行升级命令:{command}',\n },\n} as const;\n","import { zhCN } from '../locales/zh-CN.js';\n\nconst locales = {\n 'zh-CN': zhCN,\n} as const;\n\ntype InterpolationValue = number | string;\ntype InterpolationValues = Record<string, InterpolationValue>;\n\nconst getNestedValue = (source: unknown, key: string): string => {\n const value = key.split('.').reduce<unknown>((current, part) => {\n if (current && typeof current === 'object' && part in current) {\n return (current as Record<string, unknown>)[part];\n }\n\n return undefined;\n }, source);\n\n return typeof value === 'string' ? value : key;\n};\n\nconst interpolate = (message: string, values?: InterpolationValues): string => {\n if (!values) {\n return message;\n }\n\n return message.replace(/\\{(\\w+)\\}/g, (placeholder, key: string) => {\n const value = values[key];\n if (value === undefined) {\n return placeholder;\n }\n\n return String(value);\n });\n};\n\nexport const createI18n = (locale: string) => {\n const messages = locales[locale as keyof typeof locales];\n\n return (key: string, values?: InterpolationValues): string => {\n const messageFromLocale = messages ? getNestedValue(messages, key) : key;\n const message = messageFromLocale === key ? getNestedValue(zhCN, key) : messageFromLocale;\n\n return interpolate(message, values);\n };\n};\n","import type { Command } from 'commander';\nimport { AdminApi, normalizeAdminApiOrigin } from '../lib/admin-api.js';\nimport { loadConfig, saveConfig } from '../lib/config.js';\nimport { DataFinderClient } from '../lib/datafinder/client.js';\nimport {\n normalizeDataFinderBaseUrl,\n parseDataFinderPathMode,\n toStoredDataFinderConfig,\n} from '../lib/datafinder/config.js';\nimport {\n DEFAULT_DATAFINDER_BASE_URL,\n DEFAULT_DATAFINDER_TIMEZONE,\n type DataFinderConnectionConfig,\n} from '../lib/datafinder/types.js';\nimport { CliError } from '../lib/errors.js';\nimport { createI18n } from '../lib/i18n.js';\nimport { logger } from '../lib/logger.js';\nimport { runCommand } from '../lib/shell.js';\nimport { ui } from '../lib/ui.js';\n\ntype OnboardMode = 'all' | 'admin' | 'aws' | 'datafinder' | 'gh' | 'locale';\n\ntype OnboardOptions = {\n adminUrl?: string;\n datafinderAppId?: string;\n datafinderDashboardId?: string;\n datafinderPathMode?: string;\n datafinderProjectId?: string;\n datafinderUrl?: string;\n setMode?: OnboardMode;\n};\n\ntype Translate = ReturnType<typeof createI18n>;\n\nconst onboardModes: OnboardMode[] = ['all', 'admin', 'aws', 'datafinder', 'gh', 'locale'];\n\nconst resolveBrewCommand = async (): Promise<string | null> => {\n const result = await runCommand('/bin/bash', [\n '-lc',\n 'command -v brew || { [ -x /opt/homebrew/bin/brew ] && printf /opt/homebrew/bin/brew; } || { [ -x /usr/local/bin/brew ] && printf /usr/local/bin/brew; }',\n ]);\n\n const brewPath = result.stdout.trim();\n return brewPath ? brewPath : null;\n};\n\nconst installHomebrew = async (): Promise<boolean> => {\n const result = await runCommand(\n '/bin/bash',\n [\n '-lc',\n '/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"',\n ],\n { stdio: 'inherit' },\n );\n\n return result.exitCode === 0;\n};\n\nconst ensureBrewPackage = async (packageName: string, t: Translate): Promise<boolean> => {\n let brewCommand = await resolveBrewCommand();\n if (!brewCommand) {\n const shouldInstallBrew = await ui.confirm({\n message: t('onboard.installBrewPrompt'),\n default: true,\n });\n\n if (!shouldInstallBrew) {\n logger.warn(`${t('onboard.installManualPrefix')} brew install ${packageName}`);\n return false;\n }\n\n if (!(await installHomebrew())) {\n logger.warn(t('onboard.installBrewFailed'));\n return false;\n }\n\n brewCommand = await resolveBrewCommand();\n if (!brewCommand) {\n logger.warn(t('onboard.installBrewFailed'));\n return false;\n }\n }\n\n const installResult = await runCommand(brewCommand, ['install', packageName], { stdio: 'inherit' });\n return installResult.exitCode === 0;\n};\n\nconst ensureGhInstalled = async (t: Translate): Promise<boolean> => {\n const ghVersion = await runCommand('gh', ['--version']);\n if (ghVersion.exitCode === 0) {\n return true;\n }\n\n if (process.platform === 'darwin') {\n const shouldInstall = await ui.confirm({ message: t('onboard.installGhPrompt'), default: true });\n if (shouldInstall) {\n return ensureBrewPackage('gh', t);\n }\n }\n\n logger.warn(t('onboard.ghInstallDeferred'));\n return false;\n};\n\nconst ensureAwsInstalled = async (t: Translate): Promise<boolean> => {\n const awsVersion = await runCommand('aws', ['--version']);\n if (awsVersion.exitCode === 0) {\n return true;\n }\n\n if (process.platform === 'darwin') {\n const shouldInstall = await ui.confirm({ message: t('onboard.installAwsPrompt'), default: true });\n if (shouldInstall) {\n return ensureBrewPackage('awscli', t);\n }\n }\n\n logger.warn(t('onboard.awsInstallDeferred'));\n return false;\n};\n\nconst runGhSetup = async (t: Translate): Promise<boolean> => {\n if (!(await ensureGhInstalled(t))) {\n return false;\n }\n\n const authStatus = await runCommand('gh', ['auth', 'status']);\n if (authStatus.exitCode === 0) {\n return true;\n }\n\n const loginMode = await ui.select({\n message: t('onboard.selectGhLoginMode'),\n choices: [\n { value: 'web', name: t('onboard.ghLoginWeb') },\n { value: 'token', name: t('onboard.ghLoginToken') },\n ],\n });\n\n if (loginMode === 'web') {\n await runCommand('gh', ['auth', 'login', '--web'], { stdio: 'inherit' });\n } else {\n const token = await ui.password({ message: t('onboard.enterGhToken') });\n await runCommand('gh', ['auth', 'login', '--with-token'], {\n input: token,\n });\n }\n\n return (await runCommand('gh', ['auth', 'status'])).exitCode === 0;\n};\n\nconst runAwsSetup = async (\n defaultProfile: string,\n t: Translate,\n): Promise<{ configured: boolean; profile: string }> => {\n if (!(await ensureAwsInstalled(t))) {\n return {\n profile: defaultProfile,\n configured: false,\n };\n }\n\n const profile = await ui.input({\n message: t('onboard.chooseAwsProfile'),\n default: defaultProfile,\n });\n\n const listProfiles = await runCommand('aws', ['configure', 'list-profiles']);\n const profiles = listProfiles.stdout.split('\\n').map((item) => item.trim()).filter(Boolean);\n\n if (!profiles.includes(profile)) {\n await runCommand('aws', ['configure', 'sso', '--profile', profile], { stdio: 'inherit' });\n }\n\n const loginResult = await runCommand('aws', ['sso', 'login', '--profile', profile], { stdio: 'inherit' });\n if (loginResult.exitCode !== 0) {\n return {\n profile,\n configured: false,\n };\n }\n\n const identityResult = await runCommand('aws', [\n 'sts',\n 'get-caller-identity',\n '--profile',\n profile,\n '--output',\n 'json',\n ]);\n\n return {\n profile,\n configured: identityResult.exitCode === 0,\n };\n};\n\nconst runAdminSetup = async (config: Awaited<ReturnType<typeof loadConfig>>, options: OnboardOptions, t: Translate): Promise<void> => {\n const apiOrigin = normalizeAdminApiOrigin(options.adminUrl ?? config.admin?.apiOrigin);\n const token = (await ui.password({ message: t('onboard.enterAdminToken') })).trim();\n\n if (!token) {\n throw new CliError(t('onboard.adminTokenRequired'), 1);\n }\n\n await new AdminApi({ apiOrigin, token }).inspectToken(token);\n config.admin = {\n apiOrigin,\n token,\n };\n logger.success(t('onboard.adminLoginSucceeded'));\n};\n\nconst inputWithDefault = async (\n message: string,\n value: string | undefined,\n): Promise<string> =>\n (\n await ui.input({\n message,\n ...(value ? { default: value } : {}),\n })\n ).trim();\n\nconst requiredDataFinderValue = (value: string, label: string): string => {\n if (!value) {\n throw new CliError(`DataFinder ${label} 不能为空`, 1);\n }\n return value;\n};\n\nexport const runDataFinderSetup = async (\n config: Awaited<ReturnType<typeof loadConfig>>,\n options: OnboardOptions,\n t: Translate,\n): Promise<void> => {\n const previous = config.datafinder;\n let accessKeyId = previous?.accessKeyId ?? '';\n let secretAccessKey = previous?.secretAccessKey ?? '';\n\n if (previous?.accessKeyId && previous.secretAccessKey) {\n const credentialAction = await ui.select({\n message: t('onboard.datafinderCredentialAction'),\n choices: [\n { value: 'keep', name: t('onboard.datafinderKeepCredentials') },\n { value: 'replace', name: t('onboard.datafinderReplaceCredentials') },\n ],\n });\n if (credentialAction === 'replace') {\n accessKeyId = '';\n secretAccessKey = '';\n }\n }\n\n if (!accessKeyId || !secretAccessKey) {\n accessKeyId = (await ui.password({ message: t('onboard.enterDataFinderAk') })).trim();\n secretAccessKey = (await ui.password({ message: t('onboard.enterDataFinderSk') })).trim();\n }\n\n const pathMode = parseDataFinderPathMode(\n options.datafinderPathMode ??\n (await ui.select({\n message: t('onboard.selectDataFinderPathMode'),\n choices: [\n { value: 'project', name: t('onboard.datafinderProjectPathMode') },\n { value: 'app', name: t('onboard.datafinderAppPathMode') },\n ],\n default: previous?.pathMode ?? 'project',\n })),\n );\n\n const candidate: DataFinderConnectionConfig = {\n accessKeyId: requiredDataFinderValue(accessKeyId, 'AccessKeyId'),\n appId: requiredDataFinderValue(\n await inputWithDefault(\n t('onboard.enterDataFinderAppId'),\n options.datafinderAppId ?? previous?.appId,\n ),\n 'appId',\n ),\n baseUrl: normalizeDataFinderBaseUrl(\n requiredDataFinderValue(\n await inputWithDefault(\n t('onboard.enterDataFinderUrl'),\n options.datafinderUrl ?? previous?.baseUrl ?? DEFAULT_DATAFINDER_BASE_URL,\n ),\n 'baseUrl',\n ),\n ),\n defaultDashboardId: requiredDataFinderValue(\n await inputWithDefault(\n t('onboard.enterDataFinderDashboardId'),\n options.datafinderDashboardId ?? previous?.defaultDashboardId,\n ),\n 'defaultDashboardId',\n ),\n pathMode,\n projectId: requiredDataFinderValue(\n await inputWithDefault(\n t('onboard.enterDataFinderProjectId'),\n options.datafinderProjectId ?? previous?.projectId,\n ),\n 'projectId',\n ),\n secretAccessKey: requiredDataFinderValue(secretAccessKey, 'SecretAccessKey'),\n timezone: requiredDataFinderValue(\n await inputWithDefault(\n t('onboard.enterDataFinderTimezone'),\n previous?.timezone ?? DEFAULT_DATAFINDER_TIMEZONE,\n ),\n 'timezone',\n ),\n };\n\n const summary = await new DataFinderClient(candidate).checkConnection();\n config.datafinder = toStoredDataFinderConfig(candidate);\n config.setup.datafinderConfigured = true;\n logger.success(\n t('onboard.datafinderSucceeded', {\n dashboardName: summary.dashboardName ?? summary.dashboardId,\n reportCount: summary.reportCount,\n }),\n );\n};\n\nexport const runOnboard = async (options: OnboardOptions): Promise<void> => {\n const config = await loadConfig();\n const t = createI18n(config.locale);\n const mode = options.setMode ?? 'all';\n\n if (!onboardModes.includes(mode)) {\n throw new CliError(`Invalid onboard mode: ${mode}`, 1);\n }\n\n if (mode === 'all' || mode === 'locale') {\n const locale = await ui.select({\n message: t('onboard.chooseLocale'),\n choices: [\n { value: 'zh-CN', name: '中文' },\n { value: 'skip', name: t('common.skip') },\n ],\n });\n\n if (locale !== 'skip') {\n config.locale = locale;\n }\n config.setup.localeConfigured = true;\n }\n\n if (mode === 'all' || mode === 'admin') {\n const action =\n mode === 'admin'\n ? 'continue'\n : await ui.select({\n message: t('onboard.adminSection'),\n choices: [\n { value: 'continue', name: t('common.continue') },\n { value: 'skip', name: t('common.skip') },\n ],\n });\n\n if (action === 'continue') {\n await runAdminSetup(config, options, t);\n } else {\n logger.info(t('onboard.skipAdminSetup'));\n }\n }\n\n if (mode === 'all' || mode === 'datafinder') {\n const action =\n mode === 'datafinder'\n ? 'continue'\n : await ui.select({\n message: t('onboard.datafinderSection'),\n choices: [\n { value: 'continue', name: t('common.continue') },\n { value: 'skip', name: t('common.skip') },\n ],\n });\n\n if (action === 'continue') {\n await runDataFinderSetup(config, options, t);\n } else {\n logger.info(t('onboard.skipDataFinderSetup'));\n }\n }\n\n if (mode === 'all' || mode === 'gh') {\n const action =\n mode === 'gh'\n ? 'continue'\n : await ui.select({\n message: t('onboard.ghSection'),\n choices: [\n { value: 'continue', name: t('common.continue') },\n { value: 'skip', name: t('common.skip') },\n ],\n });\n\n if (action === 'continue') {\n config.setup.ghConfigured = await runGhSetup(t);\n } else {\n logger.info(t('onboard.skipGhSetup'));\n config.setup.ghConfigured = true;\n }\n }\n\n if (mode === 'all' || mode === 'aws') {\n const action =\n mode === 'aws'\n ? 'continue'\n : await ui.select({\n message: t('onboard.awsSection'),\n choices: [\n { value: 'continue', name: t('common.continue') },\n { value: 'skip', name: t('common.skip') },\n ],\n });\n\n if (action === 'continue') {\n const result = await runAwsSetup(config.defaultAwsProfile, t);\n config.setup.awsConfigured = result.configured;\n if (result.configured) {\n config.defaultAwsProfile = result.profile;\n }\n } else {\n logger.info(t('onboard.skipAwsSetup'));\n config.setup.awsConfigured = true;\n }\n }\n\n await saveConfig(config);\n logger.success(t('onboard.complete'));\n};\n\nexport const registerOnboardCommand = (program: Command): void => {\n program\n .command('onboard')\n .description('Install or configure local prerequisites')\n .option('--set-mode <mode>', 'setup only one flow: all|admin|aws|datafinder|gh|locale')\n .option('--admin-url <url>', 'management API URL or admin.tutti.sh page URL')\n .option('--datafinder-url <url>', 'DataFinder OpenAPI origin')\n .option('--datafinder-project-id <id>', 'DataFinder project ID')\n .option('--datafinder-app-id <id>', 'DataFinder application ID')\n .option('--datafinder-dashboard-id <id>', 'default DataFinder dashboard ID')\n .option('--datafinder-path-mode <mode>', 'DataFinder API path mode: project|app')\n .action((options: OnboardOptions) => runOnboard(options));\n};\n","export type PpeLaneFrontendTarget = {\n artifactFileName: string;\n artifactName: string;\n defaultWorkflowRef: string;\n key: 'zk-web/canvas';\n label: string;\n repoFullName: string;\n workerName: string;\n workflowFile: string;\n};\n\nexport const ppeLaneCanvasTarget: PpeLaneFrontendTarget = {\n key: 'zk-web/canvas',\n label: 'zk-web/canvas',\n repoFullName: 'zk-org-test/zk-web',\n workflowFile: 'upload-canvas-staging-version.yml',\n defaultWorkflowRef: 'main',\n artifactName: 'canvas-staging-version',\n artifactFileName: 'canvas-staging-version.json',\n workerName: 'zk-design-web-staging',\n};\n","export type PpeLaneRepo = {\n cloudMapServiceId: string;\n defaultRef: string;\n defaultDestroySelection?: boolean;\n deployWorkflowFile: string;\n destroyWorkflowFile: string;\n key: string;\n label: string;\n repoFullName: string;\n serviceName: string;\n};\n\nexport const ppeLaneRepos: PpeLaneRepo[] = [\n {\n key: 'tutti-server',\n label: 'tutti-server',\n repoFullName: 'tutti-lab/tutti-server',\n deployWorkflowFile: 'deploy-lane.yml',\n destroyWorkflowFile: 'destroy-lane.yml',\n defaultRef: 'main',\n defaultDestroySelection: false,\n cloudMapServiceId: 'srv-izinli73rwxpf2dr',\n serviceName: 'tutti-server',\n },\n {\n key: 'zk-agent-engine',\n label: 'zk-agent-engine',\n repoFullName: 'zk-org-test/zk-agent-engine',\n deployWorkflowFile: 'deploy-lane.yml',\n destroyWorkflowFile: 'destroy-lane.yml',\n defaultRef: 'main',\n cloudMapServiceId: 'srv-gg2qso5pnqgykn7h',\n serviceName: 'agent-engine',\n },\n {\n key: 'zk-commerce',\n label: 'zk-commerce',\n repoFullName: 'zk-org-test/zk-commerce',\n deployWorkflowFile: 'deploy-lane.yml',\n destroyWorkflowFile: 'destroy-lane.yml',\n defaultRef: 'main',\n cloudMapServiceId: 'srv-tfl3t6duyoehwedi',\n serviceName: 'zk-commerce',\n },\n {\n key: 'zk-admin-server',\n label: 'zk-admin-server',\n repoFullName: 'zk-org-test/zk-admin-server',\n deployWorkflowFile: 'deploy-lane.yml',\n destroyWorkflowFile: 'destroy-lane.yml',\n defaultRef: 'main',\n cloudMapServiceId: 'srv-s4fn35h7nen4u5ci',\n serviceName: 'admin',\n },\n {\n key: 'design-project',\n label: 'design-project',\n repoFullName: 'zk-org-test/design-project',\n deployWorkflowFile: 'deploy-lane.yml',\n destroyWorkflowFile: 'destroy-lane.yml',\n defaultRef: 'main',\n cloudMapServiceId: 'srv-bjtdvtcxg2clgs6m',\n serviceName: 'design-project',\n },\n {\n key: 'account',\n label: 'account',\n repoFullName: 'zk-org-test/account',\n deployWorkflowFile: 'deploy-lane.yml',\n destroyWorkflowFile: 'destroy-lane.yml',\n defaultRef: 'main',\n cloudMapServiceId: 'srv-j2newpni247wsn7h',\n serviceName: 'account',\n },\n {\n key: 'zk-websocket',\n label: 'zk-websocket',\n repoFullName: 'zk-org-test/zk-websocket',\n deployWorkflowFile: 'deploy-lane.yml',\n destroyWorkflowFile: 'destroy-lane.yml',\n defaultRef: 'main',\n cloudMapServiceId: 'srv-34fi45edgao7tp2r',\n serviceName: 'zk-websocket',\n },\n];\n","import { CliError } from './errors.js';\n\nexport const PPE_LANE_MAX_LENGTH = 38;\n\nconst PPE_LANE_PATTERN = /^[a-z0-9](?:[-a-z0-9]*[a-z0-9])?$/;\n\nexport const validatePpeLaneName = (value: string): string => {\n const lane = value.trim();\n if (!lane) {\n throw new CliError('PPE lane name is required', 1);\n }\n\n if (lane.length > PPE_LANE_MAX_LENGTH) {\n throw new CliError(`PPE lane name must be ${PPE_LANE_MAX_LENGTH} characters or fewer`, 1);\n }\n\n if (!PPE_LANE_PATTERN.test(lane)) {\n throw new CliError(\n 'PPE lane name must use lowercase letters, digits, or hyphens, and start and end with a letter or digit',\n 1,\n );\n }\n\n return lane;\n};\n","import type { Command } from 'commander';\nimport { ppeLaneCanvasTarget } from '../../constants/ppe-lane-frontend-targets.js';\nimport { ppeLaneRepos } from '../../constants/ppe-lane-repos.js';\nimport { listLaneInstances } from '../../lib/aws.js';\nimport { CliError } from '../../lib/errors.js';\nimport {\n dispatchCanvasStagingVersionWorkflow,\n dispatchWorkflow,\n type CanvasStagingVersionArtifact,\n getCurrentGitHubLogin,\n fetchCanvasStagingVersionArtifact,\n getRepresentativeDurationMs,\n listWorkflowRunIds,\n listSuccessfulWorkflowRunDurations,\n pollWorkflowRun,\n resolveBranchForRepo,\n} from '../../lib/github.js';\nimport { logger } from '../../lib/logger.js';\nimport { validatePpeLaneName } from '../../lib/ppe-lane.js';\nimport {\n renderWorkflowProgressPanel,\n type WorkflowProgressState,\n withProgressTask,\n} from '../../lib/progress.js';\nimport { ensurePrerequisites } from '../../lib/prerequisites.js';\nimport { ui } from '../../lib/ui.js';\n\ntype DeployResult = {\n conclusion: string;\n artifact?: CanvasStagingVersionArtifact;\n failureDetail?: string;\n key: string;\n ref: string;\n runUrl: string;\n status: string;\n};\n\ntype DeployProgressTarget = {\n defaultRef: string;\n key: string;\n kind: 'backend' | 'canvas';\n repoFullName: string;\n workflowFile: string;\n};\n\nconst getErrorMessage = (error: unknown): string => (error instanceof Error ? error.message : String(error));\n\nconst renderAggregateProgress = (\n lane: string | undefined,\n selectedTargets: Array<{ key: string }>,\n repoStates: Map<string, WorkflowProgressState>,\n): string =>\n renderWorkflowProgressPanel({\n items: selectedTargets,\n states: repoStates,\n title: lane ? `正在发布 lane ${lane}` : '正在发布所选目标',\n });\n\nexport const runPpeLaneDeploy = async (): Promise<void> => {\n const requestedRef = await ui.input({ message: '请输入目标分支', default: 'main' });\n const deployTargetChoices = [\n ...ppeLaneRepos.map((repo) => ({ value: repo.key, name: repo.label })),\n { value: ppeLaneCanvasTarget.key, name: ppeLaneCanvasTarget.label },\n ];\n const selectedKeys = await ui.checkbox({\n message: '请选择需要发布的目标',\n choices: deployTargetChoices,\n });\n if (selectedKeys.length === 0) {\n throw new CliError('At least one deploy target must be selected', 1);\n }\n\n const selectedRepos = ppeLaneRepos.filter((repo) => selectedKeys.includes(repo.key));\n const shouldDeployCanvas = selectedKeys.includes(ppeLaneCanvasTarget.key);\n const lane =\n selectedRepos.length > 0\n ? validatePpeLaneName(await ui.input({ message: '请输入 PPE lane 名称' }))\n : undefined;\n const selectedTargets: DeployProgressTarget[] = [\n ...selectedRepos.map((repo) => ({\n defaultRef: repo.defaultRef,\n key: repo.key,\n kind: 'backend' as const,\n repoFullName: repo.repoFullName,\n workflowFile: repo.deployWorkflowFile,\n })),\n ...(shouldDeployCanvas\n ? [\n {\n defaultRef: ppeLaneCanvasTarget.defaultWorkflowRef,\n key: ppeLaneCanvasTarget.key,\n kind: 'canvas' as const,\n repoFullName: ppeLaneCanvasTarget.repoFullName,\n workflowFile: ppeLaneCanvasTarget.workflowFile,\n },\n ]\n : []),\n ];\n\n const config = await ensurePrerequisites({ needsAws: selectedRepos.length > 0, needsGh: true });\n\n const branchResults = await Promise.all(\n selectedRepos.map((repo) =>\n resolveBranchForRepo({\n defaultRef: repo.defaultRef,\n repoFullName: repo.repoFullName,\n requestedRef,\n }),\n ),\n );\n\n const duplicateResults = await Promise.all(\n selectedRepos.map((repo) =>\n listLaneInstances({\n lane: lane!,\n profile: config.defaultAwsProfile,\n region: 'us-east-1',\n serviceId: repo.cloudMapServiceId,\n }),\n ),\n );\n\n branchResults\n .filter((result) => result.fallbackToDefault)\n .forEach((result) => logger.warn(`分支 ${result.requestedRef} 不存在,将回退到 ${result.resolvedRef} 发布`));\n\n duplicateResults\n .filter((result) => result.instances.length > 0)\n .forEach((result) => logger.warn(`检测到已存在 lane 实例: ${result.serviceName}`));\n\n const confirmationLines = [\n '确认开始部署?',\n ` 分支: ${requestedRef}`,\n ' 已选择目标:',\n ...selectedKeys.map((key) => ` - ${key}`),\n ];\n\n if (lane) {\n confirmationLines.splice(2, 0, ` lane: ${lane}`, '');\n }\n\n const confirmed = await ui.confirm({\n message: confirmationLines.join('\\n'),\n default: true,\n });\n if (!confirmed) {\n logger.warn('已取消发布');\n return;\n }\n\n const githubLogin = shouldDeployCanvas ? await getCurrentGitHubLogin() : undefined;\n const repoStates = new Map<string, WorkflowProgressState>();\n\n const results = await withProgressTask(\n {\n initialText: lane ? `正在发布 lane ${lane}` : '正在发布所选目标',\n heartbeatMs: 1_000,\n heartbeatText: () => renderAggregateProgress(lane, selectedTargets, repoStates),\n },\n async ({ setText }) => {\n await Promise.all(\n selectedTargets.map(async (target) => {\n const samples: Array<{ durationMs: number }> =\n (await Promise.resolve(\n listSuccessfulWorkflowRunDurations({\n ...(target.kind === 'canvas' ? { ref: target.defaultRef } : {}),\n repoFullName: target.repoFullName,\n workflowFile: target.workflowFile,\n }),\n ).catch(() => [])) ?? [];\n\n repoStates.set(target.key, {\n estimateMs: getRepresentativeDurationMs(samples.map((sample) => sample.durationMs)),\n status: 'idle',\n });\n setText(renderAggregateProgress(lane, selectedTargets, repoStates));\n }),\n );\n\n const deployBackendTarget = async (repo: (typeof selectedRepos)[number], index: number): Promise<DeployResult> => {\n const resolvedRef = branchResults[index]?.resolvedRef ?? repo.defaultRef;\n const currentState = repoStates.get(repo.key) ?? { estimateMs: null, status: 'idle' };\n\n try {\n repoStates.set(repo.key, {\n ...currentState,\n conclusion: undefined,\n startedAt: Date.now(),\n status: 'queued',\n });\n setText(renderAggregateProgress(lane, selectedTargets, repoStates));\n\n const knownRunIds = await listWorkflowRunIds({\n ref: resolvedRef,\n repoFullName: repo.repoFullName,\n workflowFile: repo.deployWorkflowFile,\n });\n\n await dispatchWorkflow({\n lane: lane!,\n ref: resolvedRef,\n repoFullName: repo.repoFullName,\n workflowFile: repo.deployWorkflowFile,\n });\n logger.step(`${repo.key} -> queued`);\n\n const run = await pollWorkflowRun({\n knownRunIds,\n ref: resolvedRef,\n repoFullName: repo.repoFullName,\n workflowFile: repo.deployWorkflowFile,\n onUpdate: (update) => {\n const nextState = repoStates.get(repo.key) ?? currentState;\n const runUrl = 'htmlUrl' in update ? update.htmlUrl : nextState.runUrl;\n repoStates.set(repo.key, {\n ...nextState,\n conclusion: undefined,\n runUrl,\n startedAt: nextState.startedAt ?? Date.now(),\n status:\n update.status === 'completed'\n ? 'completed'\n : update.status === 'pending'\n ? 'queued'\n : 'running',\n });\n setText(renderAggregateProgress(lane, selectedTargets, repoStates));\n },\n });\n logger.step(`${repo.key} -> ${run.conclusion}`);\n\n repoStates.set(repo.key, {\n ...(repoStates.get(repo.key) ?? currentState),\n conclusion: run.conclusion === 'success' ? 'success' : 'failure',\n detail:\n run.conclusion === 'success'\n ? undefined\n : run.failureMessage ?? 'workflow failed',\n runUrl: run.htmlUrl,\n startedAt: repoStates.get(repo.key)?.startedAt ?? Date.now(),\n status: 'completed',\n });\n setText(renderAggregateProgress(lane, selectedTargets, repoStates));\n\n return {\n key: repo.key,\n ref: resolvedRef,\n runUrl: run.htmlUrl,\n status: run.status,\n conclusion: run.conclusion,\n failureDetail: run.conclusion === 'success' ? undefined : run.failureMessage ?? 'workflow failed',\n };\n } catch (error) {\n const failureState = repoStates.get(repo.key) ?? currentState;\n repoStates.set(repo.key, {\n ...failureState,\n conclusion: 'failure',\n detail: getErrorMessage(error),\n runUrl: failureState.runUrl,\n startedAt: failureState.startedAt ?? Date.now(),\n status: 'completed',\n });\n setText(renderAggregateProgress(lane, selectedTargets, repoStates));\n\n return {\n key: repo.key,\n ref: resolvedRef,\n runUrl: failureState.runUrl ?? '',\n status: 'completed',\n conclusion: 'failure',\n failureDetail: getErrorMessage(error),\n };\n }\n };\n\n const deployCanvasTarget = async (): Promise<DeployResult> => {\n const currentState = repoStates.get(ppeLaneCanvasTarget.key) ?? { estimateMs: null, status: 'idle' };\n const targetRef = requestedRef;\n const dispatchCreatedAt = new Date().toISOString();\n\n try {\n repoStates.set(ppeLaneCanvasTarget.key, {\n ...currentState,\n conclusion: undefined,\n startedAt: Date.now(),\n status: 'queued',\n });\n setText(renderAggregateProgress(lane, selectedTargets, repoStates));\n\n const knownRunIds = await listWorkflowRunIds({\n ref: ppeLaneCanvasTarget.defaultWorkflowRef,\n repoFullName: ppeLaneCanvasTarget.repoFullName,\n workflowFile: ppeLaneCanvasTarget.workflowFile,\n });\n\n await dispatchCanvasStagingVersionWorkflow({\n repoFullName: ppeLaneCanvasTarget.repoFullName,\n targetRef,\n workflowFile: ppeLaneCanvasTarget.workflowFile,\n workflowRef: ppeLaneCanvasTarget.defaultWorkflowRef,\n });\n logger.step(`${ppeLaneCanvasTarget.key} -> queued`);\n\n const run = await pollWorkflowRun({\n correlation: {\n actorLogin: githubLogin,\n createdAt: dispatchCreatedAt,\n },\n knownRunIds,\n ref: ppeLaneCanvasTarget.defaultWorkflowRef,\n repoFullName: ppeLaneCanvasTarget.repoFullName,\n workflowFile: ppeLaneCanvasTarget.workflowFile,\n onUpdate: (update) => {\n const nextState = repoStates.get(ppeLaneCanvasTarget.key) ?? currentState;\n const runUrl = 'htmlUrl' in update ? update.htmlUrl : nextState.runUrl;\n repoStates.set(ppeLaneCanvasTarget.key, {\n ...nextState,\n conclusion: undefined,\n detail:\n update.status === 'completed'\n ? 'downloading artifact'\n : update.status === 'pending'\n ? 'waiting for workflow'\n : undefined,\n runUrl,\n startedAt: nextState.startedAt ?? Date.now(),\n status:\n update.status === 'completed'\n ? 'running'\n : update.status === 'pending'\n ? 'queued'\n : 'running',\n });\n setText(renderAggregateProgress(lane, selectedTargets, repoStates));\n },\n });\n logger.step(`${ppeLaneCanvasTarget.key} -> ${run.conclusion}`);\n\n if (run.conclusion !== 'success') {\n repoStates.set(ppeLaneCanvasTarget.key, {\n ...(repoStates.get(ppeLaneCanvasTarget.key) ?? currentState),\n conclusion: 'failure',\n detail: run.failureMessage ?? 'workflow failed',\n runUrl: run.htmlUrl,\n startedAt: repoStates.get(ppeLaneCanvasTarget.key)?.startedAt ?? Date.now(),\n status: 'completed',\n });\n setText(renderAggregateProgress(lane, selectedTargets, repoStates));\n\n return {\n key: ppeLaneCanvasTarget.key,\n ref: targetRef,\n runUrl: run.htmlUrl,\n status: run.status,\n conclusion: run.conclusion,\n failureDetail: run.failureMessage ?? 'workflow failed',\n };\n }\n\n repoStates.set(ppeLaneCanvasTarget.key, {\n ...(repoStates.get(ppeLaneCanvasTarget.key) ?? currentState),\n conclusion: undefined,\n detail: 'downloading artifact',\n runUrl: run.htmlUrl,\n startedAt: repoStates.get(ppeLaneCanvasTarget.key)?.startedAt ?? Date.now(),\n status: 'running',\n });\n setText(renderAggregateProgress(lane, selectedTargets, repoStates));\n\n const artifact = await fetchCanvasStagingVersionArtifact({\n artifactFileName: ppeLaneCanvasTarget.artifactFileName,\n artifactName: ppeLaneCanvasTarget.artifactName,\n repoFullName: ppeLaneCanvasTarget.repoFullName,\n runId: run.runId,\n });\n\n repoStates.set(ppeLaneCanvasTarget.key, {\n ...(repoStates.get(ppeLaneCanvasTarget.key) ?? currentState),\n conclusion: 'success',\n detail: undefined,\n runUrl: artifact.workflowRunUrl,\n startedAt: repoStates.get(ppeLaneCanvasTarget.key)?.startedAt ?? Date.now(),\n status: 'completed',\n });\n setText(renderAggregateProgress(lane, selectedTargets, repoStates));\n\n return {\n key: ppeLaneCanvasTarget.key,\n ref: targetRef,\n artifact,\n runUrl: artifact.workflowRunUrl,\n status: run.status,\n conclusion: 'success',\n };\n } catch (error) {\n const failureState = repoStates.get(ppeLaneCanvasTarget.key) ?? currentState;\n repoStates.set(ppeLaneCanvasTarget.key, {\n ...failureState,\n conclusion: 'failure',\n detail: getErrorMessage(error),\n runUrl: failureState.runUrl,\n startedAt: failureState.startedAt ?? Date.now(),\n status: 'completed',\n });\n setText(renderAggregateProgress(lane, selectedTargets, repoStates));\n\n return {\n key: ppeLaneCanvasTarget.key,\n ref: targetRef,\n runUrl: failureState.runUrl ?? '',\n status: 'completed',\n conclusion: 'failure',\n failureDetail: getErrorMessage(error),\n };\n }\n };\n\n return Promise.all([\n ...selectedRepos.map((repo, index) => deployBackendTarget(repo, index)),\n ...(shouldDeployCanvas ? [deployCanvasTarget()] : []),\n ]);\n },\n );\n\n results.forEach((result) => {\n logger.info(\n `${result.key} | ${result.ref} | ${result.conclusion} | ${result.runUrl}${result.failureDetail ? ` | ${result.failureDetail}` : ''}`,\n );\n });\n\n const canvasResult = results.find((result) => result.key === ppeLaneCanvasTarget.key && result.conclusion === 'success');\n if (canvasResult?.artifact) {\n logger.info(`canvas version id: ${canvasResult.artifact.versionId}`);\n logger.info(`canvas workflow: ${canvasResult.artifact.workflowRunUrl}`);\n logger.info(`override header: ${canvasResult.artifact.overrideHeader}`);\n if (canvasResult.artifact.previewUrl) {\n logger.info(`preview url: ${canvasResult.artifact.previewUrl}`);\n }\n if (canvasResult.artifact.previewAliasUrl) {\n logger.info(`preview alias url: ${canvasResult.artifact.previewAliasUrl}`);\n }\n }\n\n if (results.some((result) => result.conclusion !== 'success')) {\n throw new Error('One or more PPE lane deployments failed');\n }\n\n logger.success(lane ? `PPE lane ${lane} 发布完成` : '所选目标发布完成');\n if (selectedRepos.length > 0) {\n logger.info('==================== 重要提示 ====================');\n logger.info(`后续请求如需命中 lane ${lane!},请添加请求头:`);\n logger.info(`x-zk-ppe-lane: ${lane!}`);\n logger.info('=================================================');\n }\n};\n\nexport const registerPpeLaneDeployCommand = (program: Command): void => {\n program\n .command('deploy')\n .description('Deploy selected repositories to a PPE lane; route traffic with x-zk-ppe-lane')\n .addHelpText(\n 'after',\n '\\n说明:\\n 部署完成后,在请求头中添加 x-zk-ppe-lane: <lane> 即可命中对应泳道环境。\\n',\n )\n .action(runPpeLaneDeploy);\n};\n","import type { Command } from 'commander';\nimport { ppeLaneRepos } from '../../constants/ppe-lane-repos.js';\nimport { listLaneInstances } from '../../lib/aws.js';\nimport { CliError } from '../../lib/errors.js';\nimport {\n dispatchWorkflow,\n getRepresentativeDurationMs,\n listSuccessfulWorkflowRunDurations,\n listWorkflowRunIds,\n pollWorkflowRun,\n} from '../../lib/github.js';\nimport { createI18n } from '../../lib/i18n.js';\nimport { logger } from '../../lib/logger.js';\nimport { validatePpeLaneName } from '../../lib/ppe-lane.js';\nimport {\n renderWorkflowProgressPanel,\n type WorkflowProgressState,\n withProgressTask,\n} from '../../lib/progress.js';\nimport { ensurePrerequisites } from '../../lib/prerequisites.js';\nimport { ui } from '../../lib/ui.js';\n\ntype DestroyOutcome = {\n key: string;\n ref: string;\n result: 'failed' | 'skipped' | 'success';\n runUrl: string;\n reason?: string;\n};\n\nconst renderAggregateProgress = (\n prefix: string,\n selectedRepos: Array<{ key: string }>,\n repoStates: Map<string, WorkflowProgressState>,\n): string =>\n renderWorkflowProgressPanel({\n items: selectedRepos,\n states: repoStates,\n title: prefix,\n });\n\nconst logOutcomes = (outcomes: DestroyOutcome[]): void => {\n outcomes.forEach((outcome) => {\n logger.info(`${outcome.key} | ${outcome.ref} | ${outcome.result} | ${outcome.runUrl} | ${outcome.reason ?? '-'}`);\n });\n};\n\nexport const runPpeLaneDestroy = async (): Promise<{\n failed: number;\n skipped: number;\n success: number;\n}> => {\n const config = await ensurePrerequisites({ needsAws: true, needsGh: true });\n const t = createI18n(config.locale);\n const lane = validatePpeLaneName(await ui.input({ message: t('ppeLane.destroy.enterLane') }));\n\n const selectedKeys = await ui.checkbox({\n message: t('ppeLane.destroy.selectRepos'),\n choices: ppeLaneRepos.map((repo) => ({\n value: repo.key,\n name: repo.label,\n checked: repo.defaultDestroySelection !== false,\n })),\n });\n if (selectedKeys.length === 0) {\n throw new CliError(t('ppeLane.destroy.atLeastOneRepo'), 1);\n }\n\n const selectedRepos = ppeLaneRepos.filter((repo) => selectedKeys.includes(repo.key));\n const cloudMapResults = await Promise.all(\n selectedRepos.map((repo) =>\n listLaneInstances({\n lane,\n profile: config.defaultAwsProfile,\n region: 'us-east-1',\n serviceId: repo.cloudMapServiceId,\n }),\n ),\n );\n\n const skippedOutcomes: DestroyOutcome[] = [];\n const toDestroy = selectedRepos.filter((repo, index) => {\n const hasDeployment = (cloudMapResults[index]?.instances.length ?? 0) > 0;\n if (!hasDeployment) {\n skippedOutcomes.push({\n key: repo.key,\n ref: repo.defaultRef,\n result: 'skipped',\n runUrl: '-',\n reason: t('ppeLane.destroy.skippedReason'),\n });\n }\n\n return hasDeployment;\n });\n\n if (toDestroy.length === 0) {\n logOutcomes(skippedOutcomes);\n logger.info(t('ppeLane.destroy.noRecords'));\n return { failed: 0, skipped: skippedOutcomes.length, success: 0 };\n }\n\n logger.warn(t('ppeLane.destroy.warning', { repos: toDestroy.map((repo) => repo.key).join(', ') }));\n skippedOutcomes.forEach((outcome) => {\n logger.info(`${outcome.key} | ${outcome.result} | ${outcome.reason}`);\n });\n\n const confirmedLane = (await ui.input({ message: t('ppeLane.destroy.confirmLane', { lane }) })).trim();\n if (confirmedLane !== lane) {\n logger.warn(t('ppeLane.destroy.cancelled'));\n return { failed: 0, skipped: 0, success: 0 };\n }\n\n const repoStates = new Map<string, WorkflowProgressState>();\n\n const runOutcomes = await withProgressTask(\n {\n initialText: t('ppeLane.destroy.running', { lane }),\n heartbeatMs: 1_000,\n heartbeatText: () => renderAggregateProgress(t('ppeLane.destroy.running', { lane }), toDestroy, repoStates),\n },\n async ({ setText }) => {\n await Promise.all(\n toDestroy.map(async (repo) => {\n const samples: Array<{ durationMs: number }> =\n (await Promise.resolve(\n listSuccessfulWorkflowRunDurations({\n repoFullName: repo.repoFullName,\n workflowFile: repo.destroyWorkflowFile,\n }),\n ).catch(() => [])) ?? [];\n\n repoStates.set(repo.key, {\n estimateMs: getRepresentativeDurationMs(samples.map((sample) => sample.durationMs)),\n status: 'idle',\n });\n setText(renderAggregateProgress(t('ppeLane.destroy.running', { lane }), toDestroy, repoStates));\n }),\n );\n\n return Promise.all(\n toDestroy.map(async (repo): Promise<DestroyOutcome> => {\n const ref = repo.defaultRef;\n const initialState = repoStates.get(repo.key) ?? { estimateMs: null, status: 'idle' };\n\n try {\n repoStates.set(repo.key, {\n ...initialState,\n conclusion: undefined,\n startedAt: Date.now(),\n status: 'queued',\n });\n setText(renderAggregateProgress(t('ppeLane.destroy.running', { lane }), toDestroy, repoStates));\n\n const knownRunIds = await listWorkflowRunIds({\n ref,\n repoFullName: repo.repoFullName,\n workflowFile: repo.destroyWorkflowFile,\n });\n\n await dispatchWorkflow({\n lane,\n ref,\n repoFullName: repo.repoFullName,\n workflowFile: repo.destroyWorkflowFile,\n });\n logger.step(`${repo.key} -> queued`);\n\n const run = await pollWorkflowRun({\n knownRunIds,\n ref,\n repoFullName: repo.repoFullName,\n workflowFile: repo.destroyWorkflowFile,\n onUpdate: (update) => {\n const nextState = repoStates.get(repo.key) ?? initialState;\n const runUrl = 'htmlUrl' in update ? update.htmlUrl : nextState.runUrl;\n repoStates.set(repo.key, {\n ...nextState,\n conclusion: undefined,\n runUrl,\n startedAt: nextState.startedAt ?? Date.now(),\n status:\n update.status === 'completed'\n ? 'completed'\n : update.status === 'pending'\n ? 'queued'\n : 'running',\n });\n setText(renderAggregateProgress(t('ppeLane.destroy.running', { lane }), toDestroy, repoStates));\n },\n });\n logger.step(`${repo.key} -> ${run.conclusion}`);\n\n repoStates.set(repo.key, {\n ...(repoStates.get(repo.key) ?? initialState),\n conclusion: run.conclusion === 'success' ? 'success' : 'failure',\n runUrl: run.htmlUrl,\n startedAt: repoStates.get(repo.key)?.startedAt ?? Date.now(),\n status: 'completed',\n });\n setText(renderAggregateProgress(t('ppeLane.destroy.running', { lane }), toDestroy, repoStates));\n\n return {\n key: repo.key,\n ref,\n result: run.conclusion === 'success' ? 'success' : 'failed',\n runUrl: run.htmlUrl,\n };\n } catch (error: unknown) {\n repoStates.set(repo.key, {\n ...(repoStates.get(repo.key) ?? initialState),\n conclusion: 'failure',\n startedAt: repoStates.get(repo.key)?.startedAt ?? Date.now(),\n status: 'completed',\n });\n setText(renderAggregateProgress(t('ppeLane.destroy.running', { lane }), toDestroy, repoStates));\n\n return {\n key: repo.key,\n ref,\n result: 'failed',\n runUrl: '-',\n reason: error instanceof Error ? error.message : String(error),\n };\n }\n }),\n );\n },\n );\n\n const outcomes = [...runOutcomes, ...skippedOutcomes];\n logOutcomes(outcomes);\n\n const summary = outcomes.reduce(\n (acc, outcome) => {\n acc[outcome.result] += 1;\n return acc;\n },\n { failed: 0, skipped: 0, success: 0 },\n );\n\n if (summary.failed > 0) {\n throw new CliError(t('ppeLane.destroy.failed'), 1);\n }\n\n return summary;\n};\n\nexport const registerPpeLaneDestroyCommand = (program: Command): void => {\n program\n .command('destroy')\n .description('Trigger multiple PPE lane destroy workflows')\n .action(async () => {\n await runPpeLaneDestroy();\n });\n};\n","import type { Command } from 'commander';\nimport { ppeLaneRepos } from '../../constants/ppe-lane-repos.js';\nimport { listLaneInstances } from '../../lib/aws.js';\nimport { logger } from '../../lib/logger.js';\nimport { validatePpeLaneName } from '../../lib/ppe-lane.js';\nimport { ensurePrerequisites } from '../../lib/prerequisites.js';\nimport { ui } from '../../lib/ui.js';\n\ntype PpeLaneStatusOptions = {\n all?: boolean;\n};\n\nconst logAllLaneStatus = (\n results: Array<{\n instances: Array<{ lane: string }>;\n key: string;\n }>,\n): void => {\n results.forEach((result) => {\n logger.info(`${result.key} (${result.instances.length} 个)`);\n result.instances\n .map((instance) => instance.lane)\n .sort((left, right) => left.localeCompare(right))\n .forEach((lane) => {\n logger.step(lane);\n });\n });\n};\n\nexport const runPpeLaneStatus = async (options: PpeLaneStatusOptions = {}): Promise<{\n checked: number;\n deployed: number;\n notDeployed: number;\n}> => {\n const config = await ensurePrerequisites({ needsAws: true });\n const lane = options.all ? undefined : validatePpeLaneName(await ui.input({ message: '请输入需要查询的 PPE lane 名称' }));\n const selectedKeys = await ui.checkbox({\n message: '请选择需要查询的仓库',\n choices: ppeLaneRepos.map((repo) => ({ value: repo.key, name: repo.label, checked: true })),\n });\n\n const selectedRepos = ppeLaneRepos.filter((repo) => selectedKeys.includes(repo.key));\n const results = await Promise.all(\n selectedRepos.map(async (repo) => {\n const cloudMap = await listLaneInstances({\n profile: config.defaultAwsProfile,\n region: 'us-east-1',\n serviceId: repo.cloudMapServiceId,\n ...(lane === undefined ? {} : { lane }),\n });\n\n return {\n key: repo.key,\n repoFullName: repo.repoFullName,\n cloudMapServiceId: repo.cloudMapServiceId,\n namespaceName: cloudMap.namespaceName,\n serviceName: cloudMap.serviceName,\n instances: cloudMap.instances,\n };\n }),\n );\n\n const deployed = results.filter((result) => result.instances.length > 0).length;\n const notDeployed = results.length - deployed;\n\n logger.success(`已检查 ${results.length} 个服务,已部署 ${deployed} 个,未部署 ${notDeployed} 个`);\n if (options.all) {\n logAllLaneStatus(results);\n return {\n checked: results.length,\n deployed,\n notDeployed,\n };\n }\n\n results.forEach((result) => {\n const status = result.instances.length > 0 ? 'deployed' : 'not deployed';\n logger.info(`${result.key} | ${status} | ${result.namespaceName} | ${result.cloudMapServiceId}`);\n result.instances.forEach((instance) => {\n logger.step(`${instance.id} | ${instance.host} | ${instance.port} | ${instance.protocol}`);\n });\n });\n\n return {\n checked: results.length,\n deployed,\n notDeployed,\n };\n};\n\nexport const registerPpeLaneStatusCommand = (program: Command): void => {\n program\n .command('status')\n .description('Query PPE lane deployment status from Cloud Map')\n .option('--all', 'Query all PPE lanes')\n .action(async (options: PpeLaneStatusOptions) => {\n await runPpeLaneStatus(options);\n });\n};\n","import type { Command } from 'commander';\nimport { registerPpeLaneDeployCommand } from './deploy.js';\nimport { registerPpeLaneDestroyCommand } from './destroy.js';\nimport { registerPpeLaneStatusCommand } from './status.js';\n\nexport const registerPpeLaneCommand = (program: Command): void => {\n const lane = program.command('ppe-lane').description('Manage PPE lane workflows');\n\n registerPpeLaneDeployCommand(lane);\n registerPpeLaneDestroyCommand(lane);\n registerPpeLaneStatusCommand(lane);\n};\n","import { releaseTargets } from '../../constants/release-targets.js';\nimport { CliError } from '../../lib/errors.js';\n\nexport const resolveReleaseTarget = (targetKey: string) => {\n const target = releaseTargets.find((candidate) => candidate.key === targetKey);\n if (!target) {\n throw new CliError(`Unknown release target: ${targetKey}`, 1);\n }\n\n return target;\n};\n\nexport const getReleaseTargetChoices = (): Array<{ name: string; value: string }> =>\n releaseTargets.map((target) => ({\n name: `${target.label} (${target.repoFullName})`,\n value: target.key,\n }));\n\nexport const displayReleaseBranch = (releaseBranch: string, releaseMode: string): string =>\n releaseBranch || (releaseMode === 'mainline' ? 'mainline' : '-');\n","import type { Command } from 'commander';\nimport {\n CONTROL_REPO_FULL_NAME,\n CONTROL_RELEASE_APPROVAL_WORKFLOW_FILE,\n CONTROL_RELEASE_APPROVE_COMMAND,\n} from '../../constants/release-targets.js';\nimport {\n closeIssue,\n commentOnIssue,\n filterPendingReleaseApprovalIssues,\n listWorkflowRunIds,\n pollWorkflowRun,\n} from '../../lib/github.js';\nimport { CliError } from '../../lib/errors.js';\nimport { createI18n } from '../../lib/i18n.js';\nimport { logger } from '../../lib/logger.js';\nimport { ensurePrerequisites } from '../../lib/prerequisites.js';\nimport { ui } from '../../lib/ui.js';\nimport { displayReleaseBranch, getReleaseTargetChoices, resolveReleaseTarget } from './shared.js';\n\nconst describeApprovalIssue = (issue: {\n candidateTag: string;\n issueNumber: number;\n releaseBranch: string;\n releaseMode: string;\n}): string => `#${issue.issueNumber} ${issue.candidateTag} ${displayReleaseBranch(issue.releaseBranch, issue.releaseMode)}`;\n\nconst logApprovalSummary = (\n t: (key: string, values?: Record<string, string | number>) => string,\n input: {\n approvalIssueUrl: string;\n approvalWorkflowRunUrl: string;\n },\n): void => {\n logger.success(t('release.approve.success'));\n logger.info(t('release.common.approvalIssueUrl', { approvalIssueUrl: input.approvalIssueUrl }));\n logger.info(\n t('release.approve.approvalWorkflowRunUrl', {\n approvalWorkflowRunUrl: input.approvalWorkflowRunUrl,\n }),\n );\n logger.info(t('release.approve.feishuReminder'));\n};\n\nconst buildWorkflowError = (\n t: (key: string, values?: Record<string, string | number>) => string,\n approvalWorkflowRunUrl: string,\n): CliError =>\n new CliError(t('release.approve.workflowFailed', { approvalWorkflowRunUrl }), 1);\n\nexport const runReleaseApprove = async (): Promise<void> => {\n const config = await ensurePrerequisites({ needsAws: false, needsGh: true });\n const t = createI18n(config.locale);\n\n const selectedTargetKey = await ui.select({\n message: t('release.approve.selectTarget'),\n choices: getReleaseTargetChoices(),\n });\n const target = resolveReleaseTarget(selectedTargetKey);\n\n const pendingIssues = await filterPendingReleaseApprovalIssues(target.repoFullName);\n if (pendingIssues.length === 0) {\n logger.info(t('release.approve.noPendingIssues', { targetRepo: target.repoFullName }));\n return;\n }\n\n let approvalIssue: (typeof pendingIssues)[number] | undefined = pendingIssues[0];\n if (pendingIssues.length > 1) {\n const selectedIssueNumber = Number(\n await ui.select({\n message: t('release.approve.selectApprovalIssue'),\n choices: pendingIssues.map((issue) => ({\n name: describeApprovalIssue(issue),\n value: String(issue.issueNumber),\n })),\n }),\n );\n\n approvalIssue = pendingIssues.find((issue) => issue.issueNumber === selectedIssueNumber);\n }\n\n if (!approvalIssue) {\n throw new CliError(t('release.approve.approvalIssueMissing'), 1);\n }\n\n const confirmed = await ui.confirm({\n message: t('release.approve.confirm', {\n issueNumber: approvalIssue.issueNumber,\n candidateTag: approvalIssue.candidateTag,\n releaseBranch: displayReleaseBranch(approvalIssue.releaseBranch, approvalIssue.releaseMode),\n }),\n default: true,\n });\n if (!confirmed) {\n logger.warn(t('release.approve.cancelled'));\n return;\n }\n\n const baselineRunIds = await listWorkflowRunIds({\n event: 'issue_comment',\n repoFullName: CONTROL_REPO_FULL_NAME,\n workflowFile: CONTROL_RELEASE_APPROVAL_WORKFLOW_FILE,\n ref: 'main',\n });\n\n logger.step(t('release.approve.commenting', { issueNumber: approvalIssue.issueNumber }));\n\n const approvalComment = await commentOnIssue({\n repoFullName: CONTROL_REPO_FULL_NAME,\n issueNumber: approvalIssue.issueNumber,\n body: CONTROL_RELEASE_APPROVE_COMMAND,\n });\n\n const approvalRun = await pollWorkflowRun({\n correlation: {\n actorLogin: approvalComment.userLogin,\n createdAt: approvalComment.createdAt,\n },\n event: 'issue_comment',\n knownRunIds: baselineRunIds,\n repoFullName: CONTROL_REPO_FULL_NAME,\n workflowFile: CONTROL_RELEASE_APPROVAL_WORKFLOW_FILE,\n ref: 'main',\n });\n\n if (approvalRun.conclusion !== 'success') {\n throw buildWorkflowError(t, approvalRun.htmlUrl);\n }\n\n try {\n await closeIssue({\n repoFullName: CONTROL_REPO_FULL_NAME,\n issueNumber: approvalIssue.issueNumber,\n });\n } catch {\n logger.warn(\n t('release.approve.closeIssueWarning', {\n issueNumber: approvalIssue.issueNumber,\n }),\n );\n }\n\n logApprovalSummary(t, {\n approvalIssueUrl: approvalIssue.url,\n approvalWorkflowRunUrl: approvalRun.htmlUrl,\n });\n};\n\nexport const registerReleaseApproveCommand = (program: Command): void => {\n program\n .command('approve')\n .description('Approve a controlled release')\n .action(runReleaseApprove);\n};\n","import type { Command } from 'commander';\nimport {\n CONTROL_REPO_FULL_NAME,\n CONTROL_RELEASE_HOTFIX_WORKFLOW_FILE,\n} from '../../constants/release-targets.js';\nimport {\n dispatchControlWorkflow,\n estimateControlledReleaseDuration,\n filterPendingReleaseApprovalIssues,\n listOpenIssueIds,\n listWorkflowRunIds,\n pollWorkflowRun,\n} from '../../lib/github.js';\nimport { CliError } from '../../lib/errors.js';\nimport { createI18n } from '../../lib/i18n.js';\nimport { logger } from '../../lib/logger.js';\nimport { ensurePrerequisites } from '../../lib/prerequisites.js';\nimport { createEtaProgress } from '../../lib/progress.js';\nimport { ui } from '../../lib/ui.js';\nimport { getReleaseTargetChoices, resolveReleaseTarget } from './shared.js';\n\nconst hasValidReleaseBranchSuffix = (releaseBranch: string): boolean =>\n releaseBranch.startsWith('release/') &&\n releaseBranch\n .slice('release/'.length)\n .split('/')\n .some((segment) => segment.length > 0);\n\nconst logReleaseSummary = (t: (key: string, values?: Record<string, string | number>) => string, input: {\n approvalIssueUrl: string;\n candidateTag: string;\n controlRunUrl: string;\n overrideMode: string;\n releaseBranch: string;\n targetRepo: string;\n}): void => {\n logger.success(t('release.hotfix.success'));\n logger.info(t('release.common.targetRepo', { targetRepo: input.targetRepo }));\n logger.info(t('release.hotfix.overrideMode', { overrideMode: input.overrideMode }));\n logger.info(t('release.common.candidateTag', { candidateTag: input.candidateTag }));\n logger.info(t('release.common.releaseBranch', { releaseBranch: input.releaseBranch }));\n logger.info(t('release.common.approvalIssueUrl', { approvalIssueUrl: input.approvalIssueUrl }));\n logger.info(t('release.common.controlRunUrl', { controlRunUrl: input.controlRunUrl }));\n logger.info(t('release.hotfix.feishuReminder'));\n logger.info(t('release.hotfix.nextSteps'));\n};\n\nconst buildControlRunError = (\n t: (key: string, values?: Record<string, string | number>) => string,\n key:\n | 'release.hotfix.workflowFailed'\n | 'release.hotfix.approvalIssueMissing'\n | 'release.hotfix.approvalIssueAmbiguous',\n controlRunUrl: string,\n candidateIssueUrls?: string,\n failureMessage?: string,\n): CliError => {\n const message = t(key, { controlRunUrl, candidateIssueUrls: candidateIssueUrls ?? '' });\n if (!failureMessage) {\n return new CliError(message, 1);\n }\n\n return new CliError(\n `${message}\\n${t('release.hotfix.workflowFailureReason', {\n failureMessage,\n })}`,\n 1,\n );\n};\n\nexport const runReleaseHotfix = async (): Promise<void> => {\n const config = await ensurePrerequisites({ needsAws: false, needsGh: true });\n const t = createI18n(config.locale);\n\n const selectedTargetKey = await ui.select({\n message: t('release.hotfix.selectTarget'),\n choices: getReleaseTargetChoices(),\n });\n const target = resolveReleaseTarget(selectedTargetKey);\n\n const releaseBranch = (await ui.input({\n message: t('release.hotfix.enterReleaseBranch'),\n default: 'release/',\n })).trim();\n\n if (!hasValidReleaseBranchSuffix(releaseBranch)) {\n throw new CliError(t('release.hotfix.invalidReleaseBranch'), 1);\n }\n\n const allowUnmergedHotfix = await ui.confirm({\n message: t('release.hotfix.allowUnmergedHotfix'),\n default: false,\n });\n\n let overrideReason = '';\n if (allowUnmergedHotfix) {\n overrideReason = (await ui.input({\n message: t('release.hotfix.overrideReason'),\n })).trim();\n\n if (!overrideReason) {\n throw new CliError(t('release.hotfix.overrideReasonRequired'), 1);\n }\n }\n\n const confirmed = await ui.confirm({\n message: t('release.hotfix.confirm', {\n repoName: target.repoFullName,\n releaseBranch,\n }),\n default: true,\n });\n if (!confirmed) {\n logger.warn(t('release.hotfix.cancelled'));\n return;\n }\n\n const [baselineRunIds, baselineIssueIds] = await Promise.all([\n listWorkflowRunIds({\n repoFullName: CONTROL_REPO_FULL_NAME,\n workflowFile: CONTROL_RELEASE_HOTFIX_WORKFLOW_FILE,\n ref: 'main',\n }),\n listOpenIssueIds(CONTROL_REPO_FULL_NAME),\n ]);\n const baselineIssueIdSet = new Set(baselineIssueIds);\n const controlRunEstimateMs = await estimateControlledReleaseDuration({\n workflowFile: CONTROL_RELEASE_HOTFIX_WORKFLOW_FILE,\n targetRepo: target.repoFullName,\n releaseMode: 'hotfix',\n allowUnmergedHotfix,\n repoFullName: CONTROL_REPO_FULL_NAME,\n }).catch(() => null);\n const progress = createEtaProgress({\n label: t('release.hotfix.waiting', { repoName: target.repoFullName }),\n waitingForStartText: '已触发 workflow,正在等待 GitHub Actions 开始执行',\n estimateMs: controlRunEstimateMs,\n });\n progress.start();\n\n const controlRun = await (async () => {\n try {\n await dispatchControlWorkflow({\n ref: 'main',\n workflowFile: CONTROL_RELEASE_HOTFIX_WORKFLOW_FILE,\n inputs: {\n target_repo: target.repoFullName,\n release_branch: releaseBranch,\n allow_unmerged_hotfix: allowUnmergedHotfix,\n override_reason: overrideReason,\n },\n });\n\n return await pollWorkflowRun({\n knownRunIds: baselineRunIds,\n ref: 'main',\n repoFullName: CONTROL_REPO_FULL_NAME,\n workflowFile: CONTROL_RELEASE_HOTFIX_WORKFLOW_FILE,\n onUpdate: (update) => {\n if ('htmlUrl' in update) {\n progress.setRunUrl(update.htmlUrl);\n }\n },\n });\n } finally {\n progress.stop();\n }\n })();\n\n if (controlRun.conclusion !== 'success') {\n throw buildControlRunError(\n t,\n 'release.hotfix.workflowFailed',\n controlRun.htmlUrl,\n undefined,\n controlRun.failureMessage,\n );\n }\n\n const pendingIssues = await filterPendingReleaseApprovalIssues(target.repoFullName);\n const newIssues = pendingIssues\n .filter((issue) => issue.releaseMode === 'hotfix')\n .filter((issue) => !baselineIssueIdSet.has(issue.issueId));\n const branchMatchedIssues = newIssues.filter((issue) => issue.releaseBranch === releaseBranch);\n\n if (branchMatchedIssues.length === 0) {\n throw buildControlRunError(t, 'release.hotfix.approvalIssueMissing', controlRun.htmlUrl);\n }\n\n if (branchMatchedIssues.length > 1) {\n throw buildControlRunError(\n t,\n 'release.hotfix.approvalIssueAmbiguous',\n controlRun.htmlUrl,\n branchMatchedIssues.map((issue) => issue.url).join(', '),\n );\n }\n\n const approvalIssue = branchMatchedIssues[0];\n if (!approvalIssue) {\n throw buildControlRunError(t, 'release.hotfix.approvalIssueMissing', controlRun.htmlUrl);\n }\n\n logReleaseSummary(t, {\n approvalIssueUrl: approvalIssue.url,\n candidateTag: approvalIssue.candidateTag,\n controlRunUrl: controlRun.htmlUrl,\n overrideMode: t(\n allowUnmergedHotfix\n ? 'release.hotfix.overrideModeEnabled'\n : 'release.hotfix.overrideModeDisabled',\n ),\n releaseBranch: approvalIssue.releaseBranch,\n targetRepo: approvalIssue.targetRepo,\n });\n};\n\nexport const registerReleaseHotfixCommand = (program: Command): void => {\n program\n .command('hotfix')\n .description('Prepare a controlled hotfix release')\n .action(runReleaseHotfix);\n};\n","import type { Command } from 'commander';\nimport {\n CONTROL_REPO_FULL_NAME,\n CONTROL_RELEASE_PREPARE_WORKFLOW_FILE,\n} from '../../constants/release-targets.js';\nimport {\n dispatchControlWorkflow,\n estimateControlledReleaseDuration,\n filterPendingReleaseApprovalIssues,\n listOpenIssueIds,\n listWorkflowRunIds,\n pollWorkflowRun,\n} from '../../lib/github.js';\nimport { CliError } from '../../lib/errors.js';\nimport { createI18n } from '../../lib/i18n.js';\nimport { logger } from '../../lib/logger.js';\nimport { ensurePrerequisites } from '../../lib/prerequisites.js';\nimport { createEtaProgress } from '../../lib/progress.js';\nimport { ui } from '../../lib/ui.js';\nimport { displayReleaseBranch, getReleaseTargetChoices, resolveReleaseTarget } from './shared.js';\n\nconst logReleaseSummary = (t: (key: string, values?: Record<string, string | number>) => string, input: {\n approvalIssueUrl: string;\n candidateTag: string;\n controlRunUrl: string;\n releaseBranch: string;\n releaseMode: string;\n releaseProfile: string;\n targetRepo: string;\n}): void => {\n logger.success(t('release.prepare.success'));\n logger.info(t('release.common.targetRepo', { targetRepo: input.targetRepo }));\n logger.info(t('release.common.releaseProfile', { releaseProfile: input.releaseProfile }));\n logger.info(t('release.common.candidateTag', { candidateTag: input.candidateTag }));\n logger.info(t('release.common.releaseBranch', { releaseBranch: displayReleaseBranch(input.releaseBranch, input.releaseMode) }));\n logger.info(t('release.common.approvalIssueUrl', { approvalIssueUrl: input.approvalIssueUrl }));\n logger.info(t('release.common.controlRunUrl', { controlRunUrl: input.controlRunUrl }));\n logger.info(t('release.prepare.feishuReminder'));\n logger.info(t('release.prepare.nextSteps'));\n};\n\nconst buildControlRunError = (\n t: (key: string, values?: Record<string, string | number>) => string,\n key:\n | 'release.prepare.workflowFailed'\n | 'release.prepare.approvalIssueMissing'\n | 'release.prepare.approvalIssueAmbiguous',\n controlRunUrl: string,\n candidateIssueUrls?: string,\n): CliError => new CliError(t(key, { controlRunUrl, candidateIssueUrls: candidateIssueUrls ?? '' }), 1);\n\nexport const runReleasePrepare = async (): Promise<void> => {\n const config = await ensurePrerequisites({ needsAws: false, needsGh: true });\n const t = createI18n(config.locale);\n\n const selectedTargetKey = await ui.select({\n message: t('release.prepare.selectTarget'),\n choices: getReleaseTargetChoices(),\n });\n const target = resolveReleaseTarget(selectedTargetKey);\n\n const confirmed = await ui.confirm({\n message: t('release.prepare.confirm', { repoName: target.repoFullName }),\n default: true,\n });\n if (!confirmed) {\n logger.warn(t('release.prepare.cancelled'));\n return;\n }\n\n const [baselineRunIds, baselineIssueIds] = await Promise.all([\n listWorkflowRunIds({\n repoFullName: CONTROL_REPO_FULL_NAME,\n workflowFile: CONTROL_RELEASE_PREPARE_WORKFLOW_FILE,\n ref: 'main',\n }),\n listOpenIssueIds(CONTROL_REPO_FULL_NAME),\n ]);\n const baselineIssueIdSet = new Set(baselineIssueIds);\n const controlRunEstimateMs = await estimateControlledReleaseDuration({\n workflowFile: CONTROL_RELEASE_PREPARE_WORKFLOW_FILE,\n targetRepo: target.repoFullName,\n releaseProfile: target.defaultReleaseProfile,\n releaseMode: 'mainline',\n repoFullName: CONTROL_REPO_FULL_NAME,\n }).catch(() => null);\n const progress = createEtaProgress({\n label: t('release.prepare.waiting', { repoName: target.repoFullName }),\n waitingForStartText: '已触发 workflow,正在等待 GitHub Actions 开始执行',\n estimateMs: controlRunEstimateMs,\n });\n progress.start();\n\n const controlRun = await (async () => {\n try {\n await dispatchControlWorkflow({\n ref: 'main',\n workflowFile: CONTROL_RELEASE_PREPARE_WORKFLOW_FILE,\n inputs: {\n target_repo: target.repoFullName,\n release_profile: target.defaultReleaseProfile,\n },\n });\n\n return await pollWorkflowRun({\n knownRunIds: baselineRunIds,\n ref: 'main',\n repoFullName: CONTROL_REPO_FULL_NAME,\n workflowFile: CONTROL_RELEASE_PREPARE_WORKFLOW_FILE,\n onUpdate: (update) => {\n if ('htmlUrl' in update) {\n progress.setRunUrl(update.htmlUrl);\n }\n },\n });\n } finally {\n progress.stop();\n }\n })();\n\n if (controlRun.conclusion !== 'success') {\n throw buildControlRunError(t, 'release.prepare.workflowFailed', controlRun.htmlUrl);\n }\n\n const pendingIssues = await filterPendingReleaseApprovalIssues(target.repoFullName);\n const newIssues = pendingIssues\n .filter((issue) => issue.releaseMode === 'mainline')\n .filter((issue) => !baselineIssueIdSet.has(issue.issueId));\n\n if (newIssues.length === 0) {\n throw buildControlRunError(t, 'release.prepare.approvalIssueMissing', controlRun.htmlUrl);\n }\n\n if (newIssues.length > 1) {\n throw buildControlRunError(\n t,\n 'release.prepare.approvalIssueAmbiguous',\n controlRun.htmlUrl,\n newIssues.map((issue) => issue.url).join(', '),\n );\n }\n\n const approvalIssue = newIssues[0];\n if (!approvalIssue) {\n throw buildControlRunError(t, 'release.prepare.approvalIssueMissing', controlRun.htmlUrl);\n }\n\n logReleaseSummary(t, {\n approvalIssueUrl: approvalIssue.url,\n candidateTag: approvalIssue.candidateTag,\n controlRunUrl: controlRun.htmlUrl,\n releaseBranch: approvalIssue.releaseBranch,\n releaseMode: approvalIssue.releaseMode,\n releaseProfile: approvalIssue.releaseProfile,\n targetRepo: approvalIssue.targetRepo,\n });\n};\n\nexport const registerReleasePrepareCommand = (program: Command): void => {\n program\n .command('prepare')\n .description('Prepare a controlled release')\n .action(runReleasePrepare);\n};\n","import { mkdtemp, readFile, rm } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\nimport { rollbackTargets, tuttiServerRollbackTarget } from '../../constants/rollback-targets.js';\nimport { CliError } from '../../lib/errors.js';\nimport { listWorkflowRunIds, pollWorkflowRun } from '../../lib/github.js';\nimport { logger } from '../../lib/logger.js';\nimport { ensurePrerequisites } from '../../lib/prerequisites.js';\nimport { runCommand } from '../../lib/shell.js';\nimport { ui } from '../../lib/ui.js';\nimport { fetchLocalRollbackCatalog } from './rollback-local.js';\n\nconst REPO = tuttiServerRollbackTarget.repoFullName;\nconst WORKFLOW = 'rollback.yml';\nconst SHA256 = /^sha256:[0-9a-f]{64}$/;\nconst SINGAPORE_TIME = new Intl.DateTimeFormat('sv-SE', {\n timeZone: 'Asia/Singapore', dateStyle: 'short', timeStyle: 'medium',\n});\nconst SINGAPORE_CHOICE_TIME = new Intl.DateTimeFormat('sv-SE', {\n timeZone: 'Asia/Singapore', dateStyle: 'short', timeStyle: 'short',\n});\n\nconst displayTime = (raw: string): string => {\n const date = new Date(raw);\n return Number.isNaN(date.getTime()) ? raw : `${SINGAPORE_TIME.format(date)} SGT`;\n};\n\nconst displayChoiceTime = (raw: string): string => {\n const date = new Date(raw);\n return Number.isNaN(date.getTime()) ? raw : SINGAPORE_CHOICE_TIME.format(date);\n};\n\nexport type RollbackCandidate = {\n revision: number;\n deployedAt: string;\n digest: string;\n version: string;\n current: boolean;\n workflowSucceeded?: boolean;\n};\n\nexport type RollbackCatalog = {\n environment: 'production';\n currentDigest: string;\n currentRevision: number;\n candidates: RollbackCandidate[];\n};\n\nexport const buildRollbackChoices = (catalog: RollbackCatalog) => catalog.candidates\n .filter((candidate) => !candidate.current && candidate.digest !== catalog.currentDigest)\n .sort((left, right) => Date.parse(right.deployedAt) - Date.parse(left.deployedAt))\n .map((candidate) => ({\n name: `${displayChoiceTime(candidate.deployedAt)} SGT #${candidate.revision} ${candidate.version}`,\n value: candidate.revision,\n }));\n\ntype GithubRun = { id: number; status: string; display_title: string; html_url: string };\n\nconst gh = async (args: string[]): Promise<string> => {\n const result = await runCommand('gh', args);\n if (result.exitCode !== 0) {\n throw new CliError(result.stderr.trim() || result.stdout.trim() || `gh ${args[0]} failed`, 1);\n }\n return result.stdout;\n};\n\nexport const parseRollbackCatalog = (raw: string): RollbackCatalog => {\n const data = JSON.parse(raw) as RollbackCatalog;\n if (\n data.environment !== 'production' ||\n !SHA256.test(data.currentDigest) ||\n !Number.isSafeInteger(data.currentRevision) ||\n !Array.isArray(data.candidates) ||\n data.candidates.length === 0 ||\n data.candidates.length > 10\n ) {\n throw new CliError('Rollback catalog is invalid', 1);\n }\n for (const candidate of data.candidates) {\n if (\n !Number.isSafeInteger(candidate.revision) || candidate.revision <= 0 ||\n !SHA256.test(candidate.digest) || !candidate.deployedAt || !candidate.version ||\n typeof candidate.current !== 'boolean'\n ) {\n throw new CliError('Rollback catalog contains an invalid deployment', 1);\n }\n }\n return data;\n};\n\nconst listActiveDeployments = async (): Promise<GithubRun[]> => {\n const runs = await Promise.all(['deploy.yml', WORKFLOW].map(async (workflow) => {\n const raw = await gh(['api', `repos/${REPO}/actions/workflows/${workflow}/runs?per_page=30`]);\n return (JSON.parse(raw) as { workflow_runs: GithubRun[] }).workflow_runs;\n }));\n return runs.flat().filter((run) =>\n run.status !== 'completed' && !run.display_title.startsWith('Rollback / list /'),\n );\n};\n\nconst ensureNoActiveDeployment = async (): Promise<void> => {\n const active = await listActiveDeployments();\n if (active.length > 0) {\n throw new CliError(`Production deployment is already running: ${active[0]?.html_url}`, 1);\n }\n};\n\nconst dispatch = async (operation: 'list' | 'execute', inputs: Record<string, string> = {}) => {\n const knownRunIds = await listWorkflowRunIds({ repoFullName: REPO, workflowFile: WORKFLOW, ref: 'main' });\n const args = ['workflow', 'run', WORKFLOW, '--repo', REPO, '--ref', 'main', '-f', `operation=${operation}`];\n for (const [key, value] of Object.entries(inputs)) {\n args.push('-f', `${key}=${value}`);\n }\n await gh(args);\n const progress = ui.spinner(operation === 'list' ? '读取生产部署历史...' : '等待生产回滚和健康检查...').start();\n try {\n const run = await pollWorkflowRun({\n knownRunIds,\n repoFullName: REPO,\n workflowFile: WORKFLOW,\n ref: 'main',\n maxAttempts: operation === 'execute' ? 420 : 180,\n onUpdate: (update) => {\n if ('htmlUrl' in update) progress.text = `GitHub Actions: ${update.htmlUrl}`;\n },\n });\n if (run.conclusion !== 'success') {\n let state = '';\n if (operation === 'execute') {\n const dir = await mkdtemp(join(tmpdir(), 'tutti-rollback-state-'));\n try {\n await gh(['run', 'download', String(run.runId), '--repo', REPO, '--name', 'rollback-state', '--dir', dir]);\n state = `\\n${await readFile(join(dir, 'rollback-state.txt'), 'utf8')}`;\n } catch {\n state = '\\nActual production state is available in the workflow logs.';\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n }\n throw new CliError(`Workflow failed: ${run.failureMessage ?? run.conclusion}\\n${run.htmlUrl}${state}`, 1);\n }\n return run;\n } finally {\n progress.stop();\n }\n};\n\nconst fetchCatalog = async (runId: number): Promise<RollbackCatalog> => {\n const dir = await mkdtemp(join(tmpdir(), 'tutti-rollback-'));\n try {\n await gh(['run', 'download', String(runId), '--repo', REPO, '--name', 'rollback-catalog', '--dir', dir]);\n return parseRollbackCatalog(await readFile(join(dir, 'rollback-catalog.json'), 'utf8'));\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n};\n\nconst readCatalog = async (): Promise<RollbackCatalog> => {\n const progress = ui.spinner('直接读取生产 Helm 历史...').start();\n try {\n return await fetchLocalRollbackCatalog();\n } catch {\n // Local cluster access is optional; the protected workflow can read the same state.\n } finally {\n progress.stop();\n }\n logger.warn('本机无法完整读取生产部署历史,改用 GitHub Actions 查询。');\n const listRun = await dispatch('list');\n return fetchCatalog(listRun.runId);\n};\n\nexport const runTuttiRollback = async (options: { revision?: string; yes?: boolean }): Promise<void> => {\n await ensurePrerequisites({ needsGh: true });\n await ensureNoActiveDeployment();\n const catalog = await readCatalog();\n const choices = buildRollbackChoices(catalog);\n if (choices.length === 0) {\n throw new CliError('No previous retained production image is available to restore', 1);\n }\n\n let revision: number;\n if (options.revision) {\n revision = Number(options.revision);\n } else {\n const current = catalog.candidates.find((candidate) => candidate.current);\n logger.info(`Currently deployed: #${catalog.currentRevision} ${current?.version ?? catalog.currentDigest.slice(0, 19)}${current?.workflowSucceeded === false ? ' [checks failed]' : ''}`);\n revision = await ui.select({\n message: 'Select a production image to restore (newest first)',\n choices,\n pageSize: choices.length,\n });\n }\n const selected = catalog.candidates.find((candidate) =>\n candidate.revision === revision && !candidate.current && candidate.digest !== catalog.currentDigest,\n );\n if (!selected) {\n throw new CliError(`Revision ${revision} is not an eligible recent deployment`, 1);\n }\n\n logger.info(`Environment: production`);\n logger.info(`Current: Helm revision ${catalog.currentRevision}`);\n logger.info(` ${catalog.currentDigest}`);\n logger.info(`Target: Helm revision ${selected.revision} / ${displayTime(selected.deployedAt)} / ${selected.version}`);\n logger.info(` ${selected.digest}`);\n logger.info('GitHub Actions will recheck the live deployment and target image before changing production.');\n if (!options.yes && !await ui.confirm({ message: 'Restore this image to production?', default: false })) {\n logger.warn('Rollback cancelled');\n return;\n }\n await ensureNoActiveDeployment();\n const run = await dispatch('execute', {\n revision: String(selected.revision),\n digest: selected.digest,\n expected_current_digest: catalog.currentDigest,\n expected_current_revision: String(catalog.currentRevision),\n });\n logger.success(`Production rollback completed: ${selected.digest}`);\n logger.info(run.htmlUrl);\n};\n\nexport const registerReleaseRollbackCommand = (program: Command): void => {\n program\n .command('rollback')\n .description('Restore a recent production image')\n .argument('[repository]', 'Rollback target; omit to choose interactively')\n .option('--revision <number>', 'Select a recent Helm revision without the chooser')\n .option('--yes', 'Skip the final confirmation')\n .action(async (repository: string | undefined, options: { revision?: string; yes?: boolean }) => {\n const selected = repository ?? await ui.select({\n message: 'Select a repository to roll back',\n choices: rollbackTargets.map((target) => ({ name: target.label, value: target.key })),\n });\n if (selected !== tuttiServerRollbackTarget.key) {\n throw new CliError('Only tutti-server is currently supported', 1);\n }\n await runTuttiRollback(options);\n });\n};\n","export const tuttiServerRollbackTarget = {\n key: 'tutti-server',\n label: 'tutti-server',\n repoFullName: 'tutti-lab/tutti-server',\n} as const;\n\nexport const rollbackTargets = [tuttiServerRollbackTarget];\n","import { CliError } from '../../lib/errors.js';\nimport { runCommand } from '../../lib/shell.js';\nimport type { RollbackCandidate, RollbackCatalog } from './rollback.js';\n\nconst CLUSTER = 'arn:aws:eks:us-east-1:250509935467:cluster/nexight-ojo-us-east-1';\nconst REPOSITORY = '250509935467.dkr.ecr.us-east-1.amazonaws.com/nexight/tutti/tutti-server';\nconst DIGEST = /^sha256:[0-9a-f]{64}$/;\nconst MANIFEST_IMAGE = new RegExp(`image:\\\\s*[\"']?${REPOSITORY.replaceAll('.', '\\\\.')}@(sha256:[0-9a-f]{64})`, 'g');\n\ntype HelmHistoryEntry = {\n revision: number;\n updated: string;\n status: string;\n};\n\nconst read = async (command: string, args: string[]): Promise<string> => {\n const result = await runCommand(command, args);\n if (result.exitCode !== 0) {\n throw new CliError(result.stderr.trim() || `${command} read failed`, 1);\n }\n return result.stdout.trim();\n};\n\nexport const digestFromManifest = (manifest: string): string => {\n const matches = [...manifest.matchAll(MANIFEST_IMAGE)].map((match) => match[1]);\n const digests = new Set(matches);\n if (digests.size !== 1) {\n throw new CliError('Helm revision has no unambiguous Tutti image', 1);\n }\n return [...digests][0] as string;\n};\n\nexport const buildLocalRollbackCatalog = (\n history: HelmHistoryEntry[],\n deployment: unknown,\n manifests: Map<number, string>,\n): RollbackCatalog => {\n if (!Array.isArray(history) || history.length === 0) {\n throw new CliError('Production Helm history is empty', 1);\n }\n const sorted = [...history].sort((left, right) => right.revision - left.revision);\n const latest = sorted[0];\n if (!latest || !['deployed', 'failed'].includes(latest.status)) {\n throw new CliError('Latest Helm revision needs inspection', 1);\n }\n const resource = deployment as {\n spec?: { template?: { spec?: { containers?: Array<{ name?: string; image?: string }> } } };\n };\n const images = resource?.spec?.template?.spec?.containers\n ?.filter((container) => container.name === 'tutti-server')\n .map((container) => container.image);\n if (images?.length !== 1 || !images[0]?.startsWith(`${REPOSITORY}@`)) {\n throw new CliError('Production deployment has no unambiguous Tutti image', 1);\n }\n const currentDigest = images[0].slice(REPOSITORY.length + 1);\n if (!DIGEST.test(currentDigest)) {\n throw new CliError('Production deployment image is not digest-pinned', 1);\n }\n\n const entries = [latest, ...sorted.filter((item) =>\n item.revision !== latest.revision && ['deployed', 'superseded'].includes(item.status),\n )].slice(0, 10);\n const candidates: RollbackCandidate[] = entries.map((item) => {\n const manifest = manifests.get(item.revision);\n if (!manifest) {\n throw new CliError(`Missing manifest for Helm revision ${item.revision}`, 1);\n }\n const digest = digestFromManifest(manifest);\n return {\n revision: item.revision,\n deployedAt: item.updated,\n digest,\n version: `sha256:${digest.slice(7, 19)}`,\n current: digest === currentDigest,\n };\n });\n if (candidates[0]?.digest !== currentDigest) {\n throw new CliError('Current image does not match the latest Helm revision', 1);\n }\n return { environment: 'production', currentDigest, currentRevision: latest.revision, candidates };\n};\n\nexport const fetchLocalRollbackCatalog = async (): Promise<RollbackCatalog> => {\n const cluster = await read('kubectl', ['config', 'view', '--minify', '-o', 'jsonpath={.clusters[0].name}']);\n if (cluster !== CLUSTER) {\n throw new CliError('Current kubectl context is not the production cluster', 1);\n }\n const [historyRaw, deploymentRaw] = await Promise.all([\n read('helm', ['history', 'tutti-server', '-n', 'tutti', '--max', '100', '-o', 'json']),\n read('kubectl', ['get', 'deployment', 'tutti-server', '-n', 'tutti', '-o', 'json']),\n ]);\n const history = JSON.parse(historyRaw) as HelmHistoryEntry[];\n const deployment = JSON.parse(deploymentRaw) as unknown;\n if (!Array.isArray(history) || history.length === 0) {\n throw new CliError('Production Helm history is empty', 1);\n }\n const sorted = [...history].sort((left, right) => right.revision - left.revision);\n const latest = sorted[0];\n const entries = [latest, ...sorted.filter((item) =>\n item.revision !== latest.revision && ['deployed', 'superseded'].includes(item.status),\n )].slice(0, 10);\n const manifests = new Map(await Promise.all(entries.map(async (item) => [\n item.revision,\n await read('helm', ['get', 'manifest', 'tutti-server', '-n', 'tutti', '--revision', String(item.revision)]),\n ] as const)));\n return buildLocalRollbackCatalog(history, deployment, manifests);\n};\n","import type { Command } from 'commander';\nimport { registerReleaseApproveCommand } from './approve.js';\nimport { registerReleaseHotfixCommand } from './hotfix.js';\nimport { registerReleasePrepareCommand } from './prepare.js';\nimport { registerReleaseRollbackCommand } from './rollback.js';\n\nexport const registerReleaseCommand = (program: Command): void => {\n const release = program.command('release').description('Manage controlled release workflows');\n\n registerReleasePrepareCommand(release);\n registerReleaseHotfixCommand(release);\n registerReleaseApproveCommand(release);\n registerReleaseRollbackCommand(release);\n};\n","import { createRequire } from 'node:module';\n\ntype PackageMetadata = {\n version: string;\n};\n\nconst require = createRequire(import.meta.url);\n\nexport const readCliVersion = (): string => {\n for (const candidate of ['../../package.json', '../package.json']) {\n try {\n return (require(candidate) as PackageMetadata).version;\n } catch {\n continue;\n }\n }\n\n throw new Error('Unable to resolve package.json');\n};\n","import { realpath } from 'node:fs/promises';\nimport { join, resolve, sep } from 'node:path';\nimport { loadConfig, saveConfig, type CliConfig } from './config.js';\nimport { createI18n } from './i18n.js';\nimport { logger } from './logger.js';\nimport { withProgressTask } from './progress.js';\nimport { runCommand } from './shell.js';\nimport { ui } from './ui.js';\n\nexport type InstallSource = 'bun' | 'npm' | 'pnpm' | 'unknown';\nexport type VersionSeverity = 'major' | 'minor' | 'patch' | 'none';\n\ntype InstallSourceInput = {\n bunGlobalBin?: string | null;\n npmGlobalRoot?: string | null;\n pnpmGlobalRoot?: string | null;\n rawEntryPath?: string | null;\n resolvedEntryPath?: string | null;\n};\n\ntype ParsedVersion = {\n major: number;\n minor: number;\n patch: number;\n prerelease: string[] | null;\n};\n\ntype RegistryPayload = {\n 'dist-tags'?: {\n latest?: unknown;\n };\n};\n\ntype UpgradeCommand = {\n args: string[];\n command: string;\n};\n\nexport type CliVersionCheckResult =\n | {\n action: 'continue';\n exitCode: 0;\n }\n | {\n action: 'stop';\n exitCode: number;\n };\n\ntype EnsureCliVersionIsUsableOptions = {\n entryPath?: string;\n env?: NodeJS.ProcessEnv;\n isInteractive?: boolean;\n};\n\nconst PACKAGE_NAME = '@tutti-os/nexight-devops';\nconst AUTO_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;\nconst DEFAULT_LOCALE = 'zh-CN';\nconst PROBE_TIMEOUT_MS = 3000;\nconst REGISTRY_URL = 'https://registry.npmjs.org/@tutti-os%2Fnexight-devops';\nconst REGISTRY_TIMEOUT_MS = 3000;\nconst VERSION_PATTERN =\n /^v?(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/;\n\nconst parseVersion = (input: string): ParsedVersion | null => {\n const match = input.trim().match(VERSION_PATTERN);\n if (!match) {\n return null;\n }\n\n const [, major, minor, patch, prerelease] = match;\n\n return {\n major: Number(major),\n minor: Number(minor),\n patch: Number(patch),\n prerelease: prerelease ? prerelease.split('.') : null,\n };\n};\n\nconst comparePrerelease = (left: string[], right: string[]): number => {\n const maxLength = Math.max(left.length, right.length);\n\n for (let index = 0; index < maxLength; index += 1) {\n const leftPart = left[index];\n const rightPart = right[index];\n\n if (leftPart === undefined) {\n return -1;\n }\n\n if (rightPart === undefined) {\n return 1;\n }\n\n const leftIsNumeric = /^\\d+$/.test(leftPart);\n const rightIsNumeric = /^\\d+$/.test(rightPart);\n\n if (leftIsNumeric && rightIsNumeric) {\n const difference = Number(leftPart) - Number(rightPart);\n if (difference !== 0) {\n return difference;\n }\n continue;\n }\n\n if (leftIsNumeric) {\n return -1;\n }\n\n if (rightIsNumeric) {\n return 1;\n }\n\n if (leftPart < rightPart) {\n return -1;\n }\n\n if (leftPart > rightPart) {\n return 1;\n }\n }\n\n return 0;\n};\n\nconst compareCoreVersion = (current: ParsedVersion, latest: ParsedVersion): number => {\n if (latest.major !== current.major) {\n return latest.major - current.major;\n }\n\n if (latest.minor !== current.minor) {\n return latest.minor - current.minor;\n }\n\n return latest.patch - current.patch;\n};\n\nconst isInsidePackageRoot = (entryPath: string | null | undefined, root: string | null | undefined): boolean => {\n if (!entryPath || !root) {\n return false;\n }\n\n const packageRoot = resolve(join(root, '@tutti-os', 'nexight-devops'));\n const targetPath = resolve(entryPath);\n\n return targetPath === packageRoot || targetPath.startsWith(`${packageRoot}${sep}`);\n};\n\nconst isInsideBunGlobalBin = (entryPath: string | null | undefined, bunGlobalBin: string | null | undefined): boolean => {\n if (!entryPath || !bunGlobalBin) {\n return false;\n }\n\n const targetPath = resolve(entryPath);\n const binPath = resolve(bunGlobalBin);\n const expectedEntryPath = resolve(join(binPath, 'nexight-devops'));\n\n return targetPath === expectedEntryPath;\n};\n\nconst readGlobalPath = async (command: string, args: string[]): Promise<string | null> => {\n const result = await runCommand(command, args, { timeout: PROBE_TIMEOUT_MS }).catch(() => null);\n\n if (!result) {\n return null;\n }\n\n if (result.exitCode !== 0) {\n return null;\n }\n\n const stdout = result.stdout.trim();\n return stdout || null;\n};\n\nexport const shouldSkipVersionCheck = (argv: string[], env: NodeJS.ProcessEnv = process.env): boolean => {\n if (env.NEXIGHT_DEVOPS_SKIP_UPDATE_CHECK === '1') {\n return true;\n }\n\n return (\n argv.length <= 2 ||\n argv.includes('--version') ||\n argv.includes('-V') ||\n argv.includes('--help') ||\n argv.includes('-h') ||\n argv.slice(2).includes('help') ||\n argv[2] === 'update-version'\n );\n};\n\nexport const getVersionSeverity = (currentVersion: string, latestVersion: string): VersionSeverity => {\n const current = parseVersion(currentVersion);\n const latest = parseVersion(latestVersion);\n\n if (!current || !latest) {\n return 'none';\n }\n\n if (!current.prerelease && latest.prerelease) {\n return 'none';\n }\n\n const coreComparison = compareCoreVersion(current, latest);\n if (coreComparison < 0) {\n return 'none';\n }\n\n if (coreComparison > 0 && latest.major > current.major) {\n return 'major';\n }\n\n if (coreComparison > 0 && latest.minor > current.minor) {\n return 'minor';\n }\n\n if (coreComparison > 0 && latest.patch > current.patch) {\n return 'patch';\n }\n\n if (current.prerelease && !latest.prerelease) {\n return 'patch';\n }\n\n if (!current.prerelease && latest.prerelease) {\n return 'none';\n }\n\n if (current.prerelease && latest.prerelease && comparePrerelease(latest.prerelease, current.prerelease) > 0) {\n return 'patch';\n }\n\n return 'none';\n};\n\nexport const classifyInstallSource = (input: InstallSourceInput): InstallSource => {\n if (isInsidePackageRoot(input.resolvedEntryPath, input.npmGlobalRoot)) {\n return 'npm';\n }\n\n if (isInsidePackageRoot(input.resolvedEntryPath, input.pnpmGlobalRoot)) {\n return 'pnpm';\n }\n\n if (isInsideBunGlobalBin(input.rawEntryPath, input.bunGlobalBin)) {\n return 'bun';\n }\n\n return 'unknown';\n};\n\nexport const buildUpgradeCommand = (source: InstallSource): UpgradeCommand | null => {\n if (source === 'npm') {\n return {\n command: 'npm',\n args: ['install', '-g', `${PACKAGE_NAME}@latest`],\n };\n }\n\n if (source === 'pnpm') {\n return {\n command: 'pnpm',\n args: ['add', '-g', `${PACKAGE_NAME}@latest`],\n };\n }\n\n if (source === 'bun') {\n return {\n command: 'bun',\n args: ['add', '-g', `${PACKAGE_NAME}@latest`],\n };\n }\n\n return null;\n};\n\nexport const fetchLatestPublishedVersion = async (fetchImpl: typeof fetch = fetch): Promise<string> => {\n const response = await fetchImpl(REGISTRY_URL, {\n signal: AbortSignal.timeout(REGISTRY_TIMEOUT_MS),\n });\n if (!response.ok) {\n throw new Error(`Registry request failed with status ${response.status}`);\n }\n\n const payload = (await response.json()) as RegistryPayload;\n const latest = payload['dist-tags']?.latest;\n\n if (typeof latest !== 'string' || latest.trim() === '') {\n throw new Error('Registry response is missing dist-tags.latest');\n }\n\n return latest;\n};\n\nexport const detectInstallSource = async (entryPath = process.argv[1]): Promise<InstallSource> => {\n const rawEntryPath = entryPath ? resolve(entryPath) : null;\n const resolvedEntryPath = entryPath ? await realpath(entryPath).catch(() => rawEntryPath) : null;\n\n const [npmGlobalRoot, pnpmGlobalRoot, bunGlobalBin] = await Promise.all([\n readGlobalPath('npm', ['root', '-g']),\n readGlobalPath('pnpm', ['root', '-g']),\n readGlobalPath('bun', ['pm', 'bin', '-g']),\n ]);\n\n return classifyInstallSource({\n bunGlobalBin,\n npmGlobalRoot,\n pnpmGlobalRoot,\n rawEntryPath,\n resolvedEntryPath,\n });\n};\n\nconst renderUpgradeCommand = (upgradeCommand: UpgradeCommand): string =>\n [upgradeCommand.command, ...upgradeCommand.args].join(' ');\n\nconst renderManualUpgradeCommands = (): string =>\n [\n 'npm install -g @tutti-os/nexight-devops@latest',\n 'pnpm add -g @tutti-os/nexight-devops@latest',\n 'bun add -g @tutti-os/nexight-devops@latest',\n ].join('\\n');\n\nconst continueResult = (): CliVersionCheckResult => ({\n action: 'continue',\n exitCode: 0,\n});\n\nconst stopResult = (exitCode: number): CliVersionCheckResult => ({\n action: 'stop',\n exitCode,\n});\n\nconst loadVersionCheckContext = async (): Promise<{\n config: CliConfig | null;\n t: ReturnType<typeof createI18n>;\n}> => {\n try {\n const config = await loadConfig();\n return {\n config,\n t: createI18n(config.locale),\n };\n } catch {\n return {\n config: null,\n t: createI18n(DEFAULT_LOCALE),\n };\n }\n};\n\nconst hasFreshVersionCheck = (lastCheckedAt: string | null | undefined, now = Date.now()): boolean => {\n if (!lastCheckedAt) {\n return false;\n }\n\n const checkedAt = Date.parse(lastCheckedAt);\n if (Number.isNaN(checkedAt)) {\n return false;\n }\n\n return now - checkedAt < AUTO_CHECK_INTERVAL_MS;\n};\n\nconst persistVersionCheckTimestamp = async (\n config: CliConfig | null,\n checkedAt = new Date().toISOString(),\n): Promise<void> => {\n if (!config) {\n return;\n }\n\n try {\n await saveConfig({\n ...config,\n versionCheck: {\n lastAutoCheckedAt: checkedAt,\n },\n });\n } catch {\n // Best-effort persistence: version checks should never block command execution.\n }\n};\n\nconst detectUpgradeCommand = async (\n t: ReturnType<typeof createI18n>,\n entryPath?: string,\n): Promise<UpgradeCommand | null> => {\n const installSource = await withProgressTask(\n {\n initialText: t('versionUpdate.detectingInstallSource'),\n },\n async () => detectInstallSource(entryPath),\n ).catch(() => 'unknown' as const);\n\n return buildUpgradeCommand(installSource);\n};\n\nconst runUpgrade = async (\n upgradeCommand: UpgradeCommand,\n latestVersion: string,\n t: ReturnType<typeof createI18n>,\n): Promise<boolean> => {\n logger.step(t('versionUpdate.upgrading', { command: renderUpgradeCommand(upgradeCommand) }));\n const upgradeResult = await runCommand(upgradeCommand.command, upgradeCommand.args, { stdio: 'inherit' });\n\n if (upgradeResult.exitCode !== 0) {\n return false;\n }\n\n logger.success(t('versionUpdate.upgradeSucceeded', { latestVersion }));\n logger.info(t('versionUpdate.rerun'));\n return true;\n};\n\nexport const ensureCliVersionIsUsable = async (\n argv: string[],\n currentVersion: string,\n options: EnsureCliVersionIsUsableOptions = {},\n): Promise<CliVersionCheckResult> => {\n const env = options.env ?? process.env;\n const isInteractive = options.isInteractive ?? Boolean(process.stdin.isTTY && process.stdout.isTTY);\n\n if (shouldSkipVersionCheck(argv, env)) {\n return continueResult();\n }\n\n const { config, t } = await loadVersionCheckContext();\n\n if (hasFreshVersionCheck(config?.versionCheck?.lastAutoCheckedAt)) {\n return continueResult();\n }\n\n let latestVersion: string;\n try {\n latestVersion = await withProgressTask(\n {\n initialText: t('versionUpdate.checkingRegistry'),\n },\n async () => fetchLatestPublishedVersion(),\n );\n } catch {\n await persistVersionCheckTimestamp(config);\n logger.warn(t('versionUpdate.registryCheckFailed'));\n return continueResult();\n }\n\n await persistVersionCheckTimestamp(config);\n\n const severity = getVersionSeverity(currentVersion, latestVersion);\n if (severity === 'none') {\n return continueResult();\n }\n\n if (severity !== 'major' && !isInteractive) {\n logger.warn(t('versionUpdate.available', { currentVersion, latestVersion }));\n return continueResult();\n }\n\n const upgradeCommand = await detectUpgradeCommand(t, options.entryPath ?? argv[1]);\n\n if (severity === 'major') {\n logger.warn(t('versionUpdate.majorRequired', { currentVersion, latestVersion }));\n\n if (!upgradeCommand) {\n logger.warn(t('versionUpdate.manualUpgrade', { commands: renderManualUpgradeCommands() }));\n return stopResult(1);\n }\n\n if (!(await runUpgrade(upgradeCommand, latestVersion, t))) {\n logger.error(t('versionUpdate.upgradeFailed', { command: renderUpgradeCommand(upgradeCommand) }));\n return stopResult(1);\n }\n\n return stopResult(0);\n }\n\n logger.warn(t('versionUpdate.available', { currentVersion, latestVersion }));\n\n if (!upgradeCommand) {\n logger.warn(t('versionUpdate.manualUpgrade', { commands: renderManualUpgradeCommands() }));\n return continueResult();\n }\n\n const action = await ui\n .select({\n message: t('versionUpdate.selectAction'),\n choices: [\n { value: 'upgrade', name: t('versionUpdate.upgradeNow') },\n { value: 'skip', name: t('versionUpdate.skipThisRun') },\n ],\n })\n .catch(() => 'skip' as const);\n\n if (action === 'skip') {\n logger.info(t('versionUpdate.skippedForRun'));\n return continueResult();\n }\n\n if (!(await runUpgrade(upgradeCommand, latestVersion, t))) {\n logger.warn(t('versionUpdate.optionalUpgradeFailed', { command: renderUpgradeCommand(upgradeCommand) }));\n return continueResult();\n }\n\n return stopResult(0);\n};\n\nexport const runManualVersionUpdate = async (\n currentVersion: string,\n options: Pick<EnsureCliVersionIsUsableOptions, 'entryPath'> = {},\n): Promise<number> => {\n const { config, t } = await loadVersionCheckContext();\n\n let latestVersion: string;\n try {\n latestVersion = await withProgressTask(\n {\n initialText: t('versionUpdate.checkingRegistry'),\n },\n async () => fetchLatestPublishedVersion(),\n );\n } catch {\n await persistVersionCheckTimestamp(config);\n logger.error(t('versionUpdate.registryCheckFailedManual'));\n return 1;\n }\n\n await persistVersionCheckTimestamp(config);\n\n const severity = getVersionSeverity(currentVersion, latestVersion);\n if (severity === 'none') {\n logger.info(t('versionUpdate.alreadyLatest', { currentVersion }));\n return 0;\n }\n\n logger.warn(t('versionUpdate.available', { currentVersion, latestVersion }));\n\n const upgradeCommand = await detectUpgradeCommand(t, options.entryPath ?? process.argv[1]);\n if (!upgradeCommand) {\n logger.warn(t('versionUpdate.manualUpgrade', { commands: renderManualUpgradeCommands() }));\n return 1;\n }\n\n if (!(await runUpgrade(upgradeCommand, latestVersion, t))) {\n logger.error(t('versionUpdate.upgradeFailed', { command: renderUpgradeCommand(upgradeCommand) }));\n return 1;\n }\n\n return 0;\n};\n","import type { Command } from 'commander';\nimport { readCliVersion } from '../lib/package-metadata.js';\nimport { runManualVersionUpdate } from '../lib/version-check.js';\n\nconst version = readCliVersion();\n\nexport const registerUpdateVersionCommand = (program: Command): void => {\n program\n .command('update-version')\n .description('Check the registry and update the CLI when a newer version is available')\n .action(async () => {\n const exitCode = await runManualVersionUpdate(version);\n\n if (exitCode !== 0) {\n process.exitCode = exitCode;\n }\n });\n};\n","import type { Command } from 'commander';\nimport { registerAdminCommand } from './admin/index.js';\nimport { registerDataFinderCommand } from './datafinder/index.js';\nimport { registerDiagnoseCommand } from './diagnose/index.js';\nimport { registerDoctorCommand } from './doctor.js';\nimport { registerOnboardCommand } from './onboard.js';\nimport { registerPpeLaneCommand } from './ppe-lane/index.js';\nimport { registerReleaseCommand } from './release/index.js';\nimport { registerUpdateVersionCommand } from './update-version.js';\n\nexport const registerCommands = (program: Command): void => {\n registerAdminCommand(program);\n registerDataFinderCommand(program);\n registerDiagnoseCommand(program);\n registerDoctorCommand(program);\n registerOnboardCommand(program);\n registerPpeLaneCommand(program);\n registerReleaseCommand(program);\n registerUpdateVersionCommand(program);\n};\n"],"mappings":"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","names":["resolve","pathToFileURL","path","sleep","input","path","version","field","mkdir","join","randomUUID","rename","unlink","basename","dirname","join","join","mkdir","join","input","join","chalk","ora","path","path","stat","resolve","field","defaultSleep","resolve","input","sleep","asString","asBoolean","field","input","input","mkdtemp","readFile","resolve","normalizedLine","input","mkdtemp","readFile","input","renderAggregateProgress","input","input","logReleaseSummary","input","buildControlRunError","mkdtemp","readFile","rm","join","mkdtemp","join","readFile","rm","require","join","resolve","input","resolve","join","version","pathToFileURL","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/constants/admin.ts","../src/lib/admin-computer.ts","../src/lib/errors.ts","../src/lib/admin-api.ts","../src/lib/config.ts","../src/lib/private-file.ts","../src/lib/logger.ts","../src/commands/admin/shared.ts","../src/commands/admin/app.ts","../src/lib/ui.ts","../src/commands/admin/auth.ts","../src/lib/admin-computer-logs.ts","../src/lib/progress.ts","../src/commands/admin/computer.ts","../src/commands/admin/system.ts","../src/commands/admin/index.ts","../src/lib/datafinder/errors.ts","../src/lib/datafinder/sdk-adapter.ts","../src/lib/datafinder/client.ts","../src/lib/datafinder/config.ts","../src/commands/datafinder/shared.ts","../src/commands/datafinder/auth.ts","../src/commands/datafinder/dashboard.ts","../src/lib/datafinder/builtin-queries.ts","../src/lib/datafinder/script-runner.ts","../src/commands/datafinder/query.ts","../src/commands/datafinder/report.ts","../src/commands/datafinder/index.ts","../src/commands/doctor.ts","../src/lib/datafinder/types.ts","../src/locales/zh-CN.ts","../src/lib/i18n.ts","../src/lib/shell.ts","../src/commands/onboard.ts","../src/constants/ppe-lane-repos.ts","../src/lib/aws.ts","../src/constants/release-targets.ts","../src/lib/github.ts","../src/lib/ppe-lane.ts","../src/lib/prerequisites.ts","../src/commands/ppe-lane/deploy.ts","../src/commands/ppe-lane/destroy.ts","../src/commands/ppe-lane/status.ts","../src/commands/ppe-lane/index.ts","../src/commands/release/shared.ts","../src/commands/release/approve.ts","../src/commands/release/hotfix.ts","../src/commands/release/prepare.ts","../src/commands/release/rollback.ts","../src/constants/rollback-targets.ts","../src/commands/release/rollback-local.ts","../src/commands/release/index.ts","../src/lib/package-metadata.ts","../src/lib/version-check.ts","../src/commands/update-version.ts","../src/commands/index.ts"],"sourcesContent":["import { realpathSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { Command } from 'commander';\nimport { registerCommands } from './commands/index.js';\nimport { toErrorMessage, toExitCode } from './lib/errors.js';\nimport { logger } from './lib/logger.js';\nimport { readCliVersion } from './lib/package-metadata.js';\nimport { ensureCliVersionIsUsable } from './lib/version-check.js';\n\nconst version = readCliVersion();\nconst modulePath = fileURLToPath(import.meta.url);\n\nexport const createProgram = (): Command => {\n const program = new Command();\n\n program.name('nexight-devops');\n program.description('CLI for Nexight DevOps workflows');\n program.version(version);\n\n registerCommands(program);\n\n return program;\n};\n\nexport const main = async (argv: string[] = process.argv): Promise<void> => {\n try {\n const versionCheck = await ensureCliVersionIsUsable(argv, version);\n if (versionCheck.action === 'stop') {\n if (versionCheck.exitCode !== 0) {\n process.exitCode = versionCheck.exitCode;\n }\n\n return;\n }\n\n const program = createProgram();\n if (argv.length <= 2) {\n program.outputHelp();\n return;\n }\n\n await program.parseAsync(argv);\n } catch (error: unknown) {\n logger.error(toErrorMessage(error));\n process.exitCode = toExitCode(error);\n }\n};\n\nconst isDirectExecution = (): boolean => {\n const entryPath = process.argv[1];\n\n if (!entryPath) {\n return false;\n }\n\n if (process.execArgv.includes('--eval') || process.execArgv.includes('-e')) {\n return false;\n }\n\n if (pathToFileURL(resolve(entryPath)).href === import.meta.url) {\n return true;\n }\n\n try {\n return resolve(realpathSync(entryPath)) === modulePath;\n } catch {\n return false;\n }\n};\n\nif (isDirectExecution()) {\n void main(process.argv);\n}\n","export const DEFAULT_ADMIN_API_ORIGIN = 'https://tutti.sh';\n","import { randomUUID } from 'node:crypto';\nimport { createWriteStream } from 'node:fs';\nimport { link, mkdir, rename, stat, unlink } from 'node:fs/promises';\nimport { basename, dirname, join, resolve } from 'node:path';\nimport { Readable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\nimport { CliError } from './errors.js';\n\nexport const TUTTI_COMPUTER_API_BASE_PATH = '/api/desktop/v2/admin/tutti-v2/computers';\n\nexport const TUTTI_COMPUTER_CONNECTION_WIRE_VALUE = {\n online: 1,\n offline: 2,\n} as const;\n\nexport const RUNTIME_LOG_RANGE_WIRE_VALUE = {\n '1_hour': 1,\n '3_hours': 2,\n '1_day': 3,\n '3_days': 4,\n '14_days': 5,\n} as const;\n\nexport type TuttiComputerConnectionStatus = 'online' | 'offline' | 'unknown';\n\nexport type ComputerRuntimeLogRangePreset =\n | '1_hour'\n | '3_hours'\n | '1_day'\n | '3_days'\n | '14_days'\n | 'unknown';\n\nexport type SupportedComputerRuntimeLogRangePreset = Exclude<\n ComputerRuntimeLogRangePreset,\n 'unknown'\n>;\n\nexport type ComputerRuntimeLogRecallState =\n | 'waiting_for_device'\n | 'device_processing'\n | 'downloadable'\n | 'failed'\n | 'unknown';\n\nexport type ComputerRuntimeLogUploadMode = 'single_put' | 'multipart' | 'unknown';\n\nexport type TuttiComputer = {\n computerId: string;\n displayName: string;\n reportedName: string;\n owner: {\n userId: string;\n name: string;\n email: string;\n };\n connectionStatus: TuttiComputerConnectionStatus;\n platform: string;\n arch: string;\n companionVersion: string;\n desktopdVersion: string;\n desktopdGeneration: string;\n bindingRevision: string;\n boundAt: string;\n lastSeenAt: string;\n};\n\nexport type ComputerRuntimeLogRecall = {\n taskId: string;\n computerId: string;\n boundUserId: string;\n bindingRevision: string;\n connectionId: string;\n desktopdGeneration: string;\n desktopdVersion: string;\n requestedByUserId: string;\n rangePreset: ComputerRuntimeLogRangePreset;\n requestedStartAt: string;\n requestedEndAt: string;\n state: ComputerRuntimeLogRecallState;\n uploadMode: ComputerRuntimeLogUploadMode;\n originalBytes: string;\n compressedBytes: string;\n sha256: string;\n actualStartAt: string;\n actualEndAt: string;\n unknownTimestampRows: string;\n truncated: boolean;\n collectionDurationMs: string;\n uploadDurationMs: string;\n failureCode: string;\n failureMessage: string;\n acceptedAt: string;\n uploadStartedAt: string;\n completedAt: string;\n failedAt: string;\n deadlineAt: string;\n downloadExpiresAt: string;\n createdAt: string;\n updatedAt: string;\n downloadExpired: boolean;\n};\n\nexport type ListTuttiComputersRequest = {\n nameQuery?: string;\n ownerQuery?: string;\n connectionStatus?: Exclude<TuttiComputerConnectionStatus, 'unknown'>;\n platform?: string;\n desktopdVersion?: string;\n pageSize?: number;\n pageToken?: string;\n};\n\nexport type ListTuttiComputersReply = {\n computers: TuttiComputer[];\n nextPageToken: string;\n};\n\nexport type ListComputerRuntimeLogRecallsRequest = {\n pageSize?: number;\n pageToken?: string;\n};\n\nexport type ListComputerRuntimeLogRecallsReply = {\n tasks: ComputerRuntimeLogRecall[];\n nextPageToken: string;\n};\n\nexport type ComputerRuntimeLogRecallDownload = {\n downloadUrl: string;\n expiresAt: string;\n fileName: string;\n};\n\ntype JsonObject = Record<string, unknown>;\n\ntype FetchLike = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\ntype RuntimeLogWaitDependencies = {\n now?: () => number;\n sleep?: (durationMs: number) => Promise<void>;\n};\n\ntype DownloadDependencies = {\n fetchImpl?: FetchLike;\n newId?: () => string;\n};\n\nconst objectValue = (value: unknown): JsonObject =>\n typeof value === 'object' && value !== null ? (value as JsonObject) : {};\n\nconst field = (root: JsonObject, camelName: string, snakeName: string): unknown =>\n root[camelName] ?? root[snakeName];\n\nconst stringField = (root: JsonObject, camelName: string, snakeName: string): string => {\n const value = field(root, camelName, snakeName);\n return value === undefined || value === null ? '' : String(value);\n};\n\nconst booleanField = (root: JsonObject, camelName: string, snakeName: string): boolean =>\n field(root, camelName, snakeName) === true;\n\nconst normalizedEnum = (value: unknown): string =>\n typeof value === 'string' ? value.trim().toUpperCase() : '';\n\nexport const normalizeComputerConnectionStatus = (\n value: unknown,\n): TuttiComputerConnectionStatus => {\n const name = normalizedEnum(value);\n if (value === 1 || value === '1' || name === 'ONLINE' || name.endsWith('_ONLINE')) {\n return 'online';\n }\n if (value === 2 || value === '2' || name === 'OFFLINE' || name.endsWith('_OFFLINE')) {\n return 'offline';\n }\n return 'unknown';\n};\n\nexport const normalizeRuntimeLogRangePreset = (\n value: unknown,\n): ComputerRuntimeLogRangePreset => {\n const name = normalizedEnum(value);\n if (value === 1 || value === '1' || name.endsWith('_1_HOUR')) {\n return '1_hour';\n }\n if (value === 2 || value === '2' || name.endsWith('_3_HOURS')) {\n return '3_hours';\n }\n if (value === 3 || value === '3' || name.endsWith('_1_DAY')) {\n return '1_day';\n }\n if (value === 4 || value === '4' || name.endsWith('_3_DAYS')) {\n return '3_days';\n }\n if (value === 5 || value === '5' || name.endsWith('_14_DAYS')) {\n return '14_days';\n }\n return 'unknown';\n};\n\nexport const normalizeRuntimeLogRecallState = (\n value: unknown,\n): ComputerRuntimeLogRecallState => {\n const name = normalizedEnum(value);\n if (value === 1 || value === '1' || name.endsWith('_WAITING_FOR_DEVICE')) {\n return 'waiting_for_device';\n }\n if (value === 2 || value === '2' || name.endsWith('_DEVICE_PROCESSING')) {\n return 'device_processing';\n }\n if (value === 3 || value === '3' || name.endsWith('_DOWNLOADABLE')) {\n return 'downloadable';\n }\n if (value === 4 || value === '4' || name.endsWith('_FAILED')) {\n return 'failed';\n }\n return 'unknown';\n};\n\nexport const normalizeRuntimeLogUploadMode = (\n value: unknown,\n): ComputerRuntimeLogUploadMode => {\n const name = normalizedEnum(value);\n if (value === 1 || value === '1' || name.endsWith('_SINGLE_PUT')) {\n return 'single_put';\n }\n if (value === 2 || value === '2' || name.endsWith('_MULTIPART')) {\n return 'multipart';\n }\n return 'unknown';\n};\n\nexport const isTerminalRuntimeLogRecallState = (state: ComputerRuntimeLogRecallState): boolean =>\n state === 'downloadable' || state === 'failed';\n\nexport const parseTuttiComputer = (value: unknown): TuttiComputer => {\n const root = objectValue(value);\n const owner = objectValue(root.owner);\n return {\n computerId: stringField(root, 'computerId', 'computer_id'),\n displayName: stringField(root, 'displayName', 'display_name'),\n reportedName: stringField(root, 'reportedName', 'reported_name'),\n owner: {\n userId: stringField(owner, 'userId', 'user_id'),\n name: stringField(owner, 'name', 'name'),\n email: stringField(owner, 'email', 'email'),\n },\n connectionStatus: normalizeComputerConnectionStatus(\n field(root, 'connectionStatus', 'connection_status'),\n ),\n platform: stringField(root, 'platform', 'platform'),\n arch: stringField(root, 'arch', 'arch'),\n companionVersion: stringField(root, 'companionVersion', 'companion_version'),\n desktopdVersion: stringField(root, 'desktopdVersion', 'desktopd_version'),\n desktopdGeneration: stringField(root, 'desktopdGeneration', 'desktopd_generation'),\n bindingRevision: stringField(root, 'bindingRevision', 'binding_revision'),\n boundAt: stringField(root, 'boundAt', 'bound_at'),\n lastSeenAt: stringField(root, 'lastSeenAt', 'last_seen_at'),\n };\n};\n\nexport const parseComputerRuntimeLogRecall = (value: unknown): ComputerRuntimeLogRecall => {\n const root = objectValue(value);\n return {\n taskId: stringField(root, 'taskId', 'task_id'),\n computerId: stringField(root, 'computerId', 'computer_id'),\n boundUserId: stringField(root, 'boundUserId', 'bound_user_id'),\n bindingRevision: stringField(root, 'bindingRevision', 'binding_revision'),\n connectionId: stringField(root, 'connectionId', 'connection_id'),\n desktopdGeneration: stringField(root, 'desktopdGeneration', 'desktopd_generation'),\n desktopdVersion: stringField(root, 'desktopdVersion', 'desktopd_version'),\n requestedByUserId: stringField(root, 'requestedByUserId', 'requested_by_user_id'),\n rangePreset: normalizeRuntimeLogRangePreset(field(root, 'rangePreset', 'range_preset')),\n requestedStartAt: stringField(root, 'requestedStartAt', 'requested_start_at'),\n requestedEndAt: stringField(root, 'requestedEndAt', 'requested_end_at'),\n state: normalizeRuntimeLogRecallState(field(root, 'state', 'state')),\n uploadMode: normalizeRuntimeLogUploadMode(field(root, 'uploadMode', 'upload_mode')),\n originalBytes: stringField(root, 'originalBytes', 'original_bytes'),\n compressedBytes: stringField(root, 'compressedBytes', 'compressed_bytes'),\n sha256: stringField(root, 'sha256', 'sha256'),\n actualStartAt: stringField(root, 'actualStartAt', 'actual_start_at'),\n actualEndAt: stringField(root, 'actualEndAt', 'actual_end_at'),\n unknownTimestampRows: stringField(root, 'unknownTimestampRows', 'unknown_timestamp_rows'),\n truncated: booleanField(root, 'truncated', 'truncated'),\n collectionDurationMs: stringField(root, 'collectionDurationMs', 'collection_duration_ms'),\n uploadDurationMs: stringField(root, 'uploadDurationMs', 'upload_duration_ms'),\n failureCode: stringField(root, 'failureCode', 'failure_code'),\n failureMessage: stringField(root, 'failureMessage', 'failure_message'),\n acceptedAt: stringField(root, 'acceptedAt', 'accepted_at'),\n uploadStartedAt: stringField(root, 'uploadStartedAt', 'upload_started_at'),\n completedAt: stringField(root, 'completedAt', 'completed_at'),\n failedAt: stringField(root, 'failedAt', 'failed_at'),\n deadlineAt: stringField(root, 'deadlineAt', 'deadline_at'),\n downloadExpiresAt: stringField(root, 'downloadExpiresAt', 'download_expires_at'),\n createdAt: stringField(root, 'createdAt', 'created_at'),\n updatedAt: stringField(root, 'updatedAt', 'updated_at'),\n downloadExpired: booleanField(root, 'downloadExpired', 'download_expired'),\n };\n};\n\nexport const parseTuttiComputerList = (value: unknown): ListTuttiComputersReply => {\n const root = objectValue(value);\n const computers = field(root, 'computers', 'computers');\n return {\n computers: Array.isArray(computers) ? computers.map(parseTuttiComputer) : [],\n nextPageToken: stringField(root, 'nextPageToken', 'next_page_token'),\n };\n};\n\nexport const parseComputerRuntimeLogRecallList = (\n value: unknown,\n): ListComputerRuntimeLogRecallsReply => {\n const root = objectValue(value);\n const tasks = field(root, 'tasks', 'tasks');\n return {\n tasks: Array.isArray(tasks) ? tasks.map(parseComputerRuntimeLogRecall) : [],\n nextPageToken: stringField(root, 'nextPageToken', 'next_page_token'),\n };\n};\n\nexport const parseComputerRuntimeLogRecallDownload = (\n value: unknown,\n): ComputerRuntimeLogRecallDownload => {\n const root = objectValue(value);\n return {\n downloadUrl: stringField(root, 'downloadUrl', 'download_url'),\n expiresAt: stringField(root, 'expiresAt', 'expires_at'),\n fileName: stringField(root, 'fileName', 'file_name'),\n };\n};\n\nexport const tuttiComputerPath = (computerId?: string): string =>\n computerId\n ? `${TUTTI_COMPUTER_API_BASE_PATH}/${encodeURIComponent(computerId)}`\n : TUTTI_COMPUTER_API_BASE_PATH;\n\nexport const runtimeLogRecallCollectionPath = (computerId: string): string =>\n `${tuttiComputerPath(computerId)}/runtime-log-recalls`;\n\nexport const runtimeLogRecallPath = (computerId: string, taskId: string): string =>\n `${runtimeLogRecallCollectionPath(computerId)}/${encodeURIComponent(taskId)}`;\n\nexport const runtimeLogRecallDownloadPath = (computerId: string, taskId: string): string =>\n `${runtimeLogRecallPath(computerId, taskId)}:create-download-url`;\n\nexport const appendQuery = (\n path: string,\n values: Record<string, string | number | undefined>,\n): string => {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined && value !== '') {\n query.set(key, String(value));\n }\n }\n const encoded = query.toString();\n return encoded ? `${path}?${encoded}` : path;\n};\n\nconst defaultSleep = async (durationMs: number): Promise<void> =>\n new Promise((resolveSleep) => {\n setTimeout(resolveSleep, durationMs);\n });\n\nexport const waitForRuntimeLogRecall = async (\n getTask: () => Promise<ComputerRuntimeLogRecall>,\n options: {\n initialTask?: ComputerRuntimeLogRecall;\n onUpdate?: (task: ComputerRuntimeLogRecall) => void;\n pollIntervalMs: number;\n timeoutMs: number;\n },\n dependencies: RuntimeLogWaitDependencies = {},\n): Promise<ComputerRuntimeLogRecall> => {\n const now = dependencies.now ?? Date.now;\n const sleep = dependencies.sleep ?? defaultSleep;\n const startedAt = now();\n let current = options.initialTask;\n\n if (current) {\n options.onUpdate?.(current);\n if (isTerminalRuntimeLogRecallState(current.state)) {\n return current;\n }\n }\n\n while (now() - startedAt < options.timeoutMs) {\n const remainingMs = options.timeoutMs - (now() - startedAt);\n await sleep(Math.min(options.pollIntervalMs, remainingMs));\n current = await getTask();\n options.onUpdate?.(current);\n if (isTerminalRuntimeLogRecallState(current.state)) {\n return current;\n }\n }\n\n throw new CliError(\n `日志召回任务在 ${Math.ceil(options.timeoutMs / 1_000)} 秒内未完成,可稍后使用 log-recall get 查询`,\n 1,\n );\n};\n\nexport const safeRuntimeLogFileName = (fileName: string, taskId: string): string => {\n const safeName = basename(fileName.trim());\n return safeName && safeName !== '.' ? safeName : `${taskId}.tar.gz`;\n};\n\nexport const downloadRuntimeLogArchive = async (\n downloadUrl: string,\n outputPath: string,\n options: { force?: boolean } = {},\n dependencies: DownloadDependencies = {},\n): Promise<{ bytes: number; path: string }> => {\n let url: URL;\n try {\n url = new URL(downloadUrl);\n } catch {\n throw new CliError('管理后台返回了无效的日志下载地址', 1);\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new CliError('日志下载地址必须使用 http 或 https', 1);\n }\n\n const absolutePath = resolve(outputPath);\n const outputDirectory = dirname(absolutePath);\n await mkdir(outputDirectory, { recursive: true });\n\n if (!options.force) {\n try {\n await stat(absolutePath);\n throw new CliError(`输出文件已存在: ${absolutePath};如需覆盖请添加 --force`, 1);\n } catch (error: unknown) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n }\n\n const temporaryPath = join(\n outputDirectory,\n `.${basename(absolutePath)}.${process.pid}.${(dependencies.newId ?? randomUUID)()}.tmp`,\n );\n const response = await (dependencies.fetchImpl ?? fetch)(url, {\n headers: { accept: 'application/gzip, application/octet-stream' },\n method: 'GET',\n });\n if (!response.ok) {\n throw new CliError(`日志下载失败: HTTP ${response.status} ${response.statusText}`, 1);\n }\n if (!response.body) {\n throw new CliError('日志下载失败: 响应内容为空', 1);\n }\n\n try {\n await pipeline(\n Readable.from(response.body as unknown as AsyncIterable<Uint8Array>),\n createWriteStream(temporaryPath, { flags: 'wx', mode: 0o600 }),\n );\n\n if (options.force) {\n await unlink(absolutePath).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n });\n await rename(temporaryPath, absolutePath);\n } else {\n try {\n await link(temporaryPath, absolutePath);\n } catch (error: unknown) {\n if ((error as NodeJS.ErrnoException).code === 'EEXIST') {\n throw new CliError(`输出文件已存在: ${absolutePath};如需覆盖请添加 --force`, 1);\n }\n throw error;\n }\n await unlink(temporaryPath);\n }\n\n return { bytes: (await stat(absolutePath)).size, path: absolutePath };\n } catch (error: unknown) {\n await unlink(temporaryPath).catch(() => undefined);\n throw error;\n }\n};\n","export class CliError extends Error {\n readonly exitCode: number;\n\n constructor(message: string, exitCode: number) {\n super(message);\n this.name = 'CliError';\n this.exitCode = normalizeExitCode(exitCode);\n }\n}\n\nconst normalizeExitCode = (exitCode: number): number => {\n if (!Number.isInteger(exitCode) || exitCode < 1 || exitCode > 255) {\n return 1;\n }\n\n return exitCode;\n};\n\nexport const toErrorMessage = (error: unknown): string => {\n if (error instanceof Error) {\n return error.message;\n }\n\n return 'Unknown error';\n};\n\nexport const toExitCode = (error: unknown): number => {\n if (error instanceof CliError) {\n return error.exitCode;\n }\n\n return 1;\n};\n","import { DEFAULT_ADMIN_API_ORIGIN } from '../constants/admin.js';\nimport {\n appendQuery,\n parseComputerRuntimeLogRecall,\n parseComputerRuntimeLogRecallDownload,\n parseComputerRuntimeLogRecallList,\n parseTuttiComputer,\n parseTuttiComputerList,\n RUNTIME_LOG_RANGE_WIRE_VALUE,\n runtimeLogRecallCollectionPath,\n runtimeLogRecallDownloadPath,\n runtimeLogRecallPath,\n TUTTI_COMPUTER_CONNECTION_WIRE_VALUE,\n tuttiComputerPath,\n type ComputerRuntimeLogRecall,\n type ComputerRuntimeLogRecallDownload,\n type ListComputerRuntimeLogRecallsReply,\n type ListComputerRuntimeLogRecallsRequest,\n type ListTuttiComputersReply,\n type ListTuttiComputersRequest,\n type SupportedComputerRuntimeLogRangePreset,\n type TuttiComputer,\n} from './admin-computer.js';\n\nconst ADMIN_TOKEN_INSPECT_PATH = '/api/admin/api/v1/admin/auth/token/inspect';\nconst APP_CENTER_BASE = '/api/desktop/v1/admin/app-center';\n\nexport type AdminRuntimeConfig = {\n apiOrigin: string;\n token?: string;\n};\n\nexport class AdminApiError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly body: unknown,\n ) {\n super(message);\n this.name = 'AdminApiError';\n }\n}\n\ntype FetchLike = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\nexport const normalizeAdminApiOrigin = (input?: string): string => {\n const raw = (\n input ??\n process.env.NEXIGHT_ADMIN_URL ??\n process.env.TUTTI_ADMIN_URL ??\n DEFAULT_ADMIN_API_ORIGIN\n ).trim();\n\n let url: URL;\n try {\n url = new URL(raw);\n } catch {\n throw new Error(`Invalid admin URL: ${raw}`);\n }\n\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new Error(`Admin URL must use http or https: ${raw}`);\n }\n\n if (url.hostname === 'admin.tutti.sh') {\n return 'https://tutti.sh';\n }\n\n if (url.hostname === 'admin.svenzeng.com') {\n return 'https://svenzeng.com';\n }\n\n return url.origin;\n};\n\nexport class AdminApi {\n constructor(\n private readonly runtime: AdminRuntimeConfig,\n private readonly fetchImpl: FetchLike = fetch,\n ) {}\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const headers: Record<string, string> = {\n accept: 'application/json',\n };\n\n if (this.runtime.token) {\n headers.authorization = `Bearer ${this.runtime.token}`;\n }\n\n let payload: BodyInit | undefined;\n if (body !== undefined) {\n headers['content-type'] = 'application/json';\n payload = JSON.stringify(body);\n }\n\n const response = await this.fetchImpl(`${this.runtime.apiOrigin}${path}`, {\n method,\n headers,\n body: payload,\n });\n const parsed = await parseResponseBody(response);\n\n if (!response.ok) {\n const detail = adminApiErrorDetail(parsed);\n throw new AdminApiError(\n `Admin API request failed: HTTP ${response.status} ${response.statusText}${detail ? `: ${detail}` : ''}`,\n response.status,\n parsed,\n );\n }\n\n return parsed as T;\n }\n\n get<T>(path: string): Promise<T> {\n return this.request<T>('GET', path);\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('POST', path, body);\n }\n\n inspectToken(token?: string): Promise<unknown> {\n return this.post(ADMIN_TOKEN_INSPECT_PATH, token ? { token_value: token } : {});\n }\n\n health(): Promise<unknown> {\n return this.get('/health');\n }\n\n async listApps(query?: string): Promise<unknown[]> {\n const reply = await this.get<{ apps?: unknown[] }>(`${APP_CENTER_BASE}/apps`);\n const apps = reply.apps ?? [];\n\n if (!query?.trim()) {\n return apps;\n }\n\n const needle = query.trim().toLowerCase();\n return apps.filter((app) => JSON.stringify(app).toLowerCase().includes(needle));\n }\n\n async listVersions(appId: string): Promise<unknown[]> {\n const reply = await this.get<{ versions?: unknown[] }>(\n `${APP_CENTER_BASE}/apps/${encodeURIComponent(appId)}/versions`,\n );\n\n return reply.versions ?? [];\n }\n\n async appDetail(appId: string, include: string[] = []): Promise<Record<string, unknown>> {\n const apps = await this.listApps();\n const app = apps.find((item) => getField(item, 'appId', 'app_id') === appId);\n const result: Record<string, unknown> = { app };\n\n if (include.includes('versions') || include.includes('latest')) {\n const versions = await this.listVersions(appId);\n result.versions = versions;\n\n if (include.includes('latest')) {\n const latestVersionId = getField(app, 'latestVersionId', 'latest_version_id');\n result.latest = versions.find(\n (version) => getField(version, 'versionId', 'version_id') === latestVersionId,\n );\n }\n }\n\n return result;\n }\n\n async listTuttiComputers(\n request: ListTuttiComputersRequest = {},\n ): Promise<ListTuttiComputersReply> {\n const connectionStatus = request.connectionStatus\n ? TUTTI_COMPUTER_CONNECTION_WIRE_VALUE[request.connectionStatus]\n : undefined;\n const reply = await this.get(\n appendQuery(tuttiComputerPath(), {\n nameQuery: request.nameQuery?.trim(),\n ownerQuery: request.ownerQuery?.trim(),\n connectionStatus,\n platform: request.platform?.trim(),\n desktopdVersion: request.desktopdVersion?.trim(),\n pageSize: request.pageSize,\n pageToken: request.pageToken?.trim(),\n }),\n );\n return parseTuttiComputerList(reply);\n }\n\n async getTuttiComputer(computerId: string): Promise<TuttiComputer> {\n return parseTuttiComputer(await this.get(tuttiComputerPath(computerId)));\n }\n\n async listComputerRuntimeLogRecalls(\n computerId: string,\n request: ListComputerRuntimeLogRecallsRequest = {},\n ): Promise<ListComputerRuntimeLogRecallsReply> {\n const reply = await this.get(\n appendQuery(runtimeLogRecallCollectionPath(computerId), {\n pageSize: request.pageSize,\n pageToken: request.pageToken?.trim(),\n }),\n );\n return parseComputerRuntimeLogRecallList(reply);\n }\n\n async getComputerRuntimeLogRecall(\n computerId: string,\n taskId: string,\n ): Promise<ComputerRuntimeLogRecall> {\n return parseComputerRuntimeLogRecall(await this.get(runtimeLogRecallPath(computerId, taskId)));\n }\n\n async createComputerRuntimeLogRecall(\n computerId: string,\n rangePreset: SupportedComputerRuntimeLogRangePreset,\n ): Promise<ComputerRuntimeLogRecall> {\n const reply = await this.post(runtimeLogRecallCollectionPath(computerId), {\n computerId,\n rangePreset: RUNTIME_LOG_RANGE_WIRE_VALUE[rangePreset],\n });\n return parseComputerRuntimeLogRecall(reply);\n }\n\n async createComputerRuntimeLogRecallDownload(\n computerId: string,\n taskId: string,\n ): Promise<ComputerRuntimeLogRecallDownload> {\n const reply = await this.post(runtimeLogRecallDownloadPath(computerId, taskId), {\n computerId,\n taskId,\n });\n return parseComputerRuntimeLogRecallDownload(reply);\n }\n}\n\nconst parseResponseBody = async (response: Response): Promise<unknown> => {\n const text = await response.text();\n if (!text.trim()) {\n return {};\n }\n\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n};\n\nconst adminApiErrorDetail = (value: unknown): string => {\n if (!value || typeof value !== 'object') {\n return typeof value === 'string' ? value.trim() : '';\n }\n\n const record = value as Record<string, unknown>;\n for (const field of ['errmsg', 'message', 'reason', 'error']) {\n if (typeof record[field] === 'string' && record[field].trim()) {\n return record[field].trim();\n }\n }\n return '';\n};\n\nconst getField = (value: unknown, ...fields: string[]): unknown => {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n\n const record = value as Record<string, unknown>;\n for (const field of fields) {\n if (record[field] !== undefined) {\n return record[field];\n }\n }\n\n return undefined;\n};\n","import { mkdir, readFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { DEFAULT_ADMIN_API_ORIGIN } from '../constants/admin.js';\nimport { writePrivateFile } from './private-file.js';\n\nexport type AdminConfig = {\n apiOrigin: string;\n token: string | null;\n};\n\nexport type DataFinderConfig = {\n accessKeyId: string;\n appId: string;\n baseUrl: string;\n defaultDashboardId: string;\n pathMode?: 'app' | 'project';\n projectId: string;\n secretAccessKey: string;\n timezone: string;\n};\n\nexport type CliConfig = {\n admin?: AdminConfig;\n datafinder?: DataFinderConfig;\n defaultAwsProfile: string;\n locale: string;\n setup: {\n awsConfigured: boolean;\n datafinderConfigured?: boolean;\n ghConfigured: boolean;\n localeConfigured: boolean;\n };\n versionCheck?: {\n lastAutoCheckedAt: string | null;\n };\n};\n\nconst defaultConfig: CliConfig = {\n locale: 'zh-CN',\n defaultAwsProfile: 'AdministratorAccess-250509935467',\n setup: {\n localeConfigured: false,\n awsConfigured: false,\n ghConfigured: false,\n },\n versionCheck: {\n lastAutoCheckedAt: null,\n },\n};\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null;\n\nconst asBoolean = (value: unknown, fallback: boolean): boolean =>\n typeof value === 'boolean' ? value : fallback;\n\nconst asString = (value: unknown, fallback: string): string =>\n typeof value === 'string' ? value : fallback;\n\nconst asNullableString = (value: unknown, fallback: string | null): string | null => {\n if (typeof value === 'string') {\n return value;\n }\n\n if (value === null) {\n return null;\n }\n\n return fallback;\n};\n\nconst normalizeConfig = (source: unknown): CliConfig => {\n const admin = isObject(source) && isObject(source.admin) ? source.admin : undefined;\n const datafinder = isObject(source) && isObject(source.datafinder) ? source.datafinder : undefined;\n const setup = isObject(source) && isObject(source.setup) ? source.setup : {};\n const versionCheck = isObject(source) && isObject(source.versionCheck) ? source.versionCheck : {};\n const defaultLastAutoCheckedAt = defaultConfig.versionCheck?.lastAutoCheckedAt ?? null;\n\n return {\n ...(admin\n ? {\n admin: {\n apiOrigin: asString(admin.apiOrigin, DEFAULT_ADMIN_API_ORIGIN),\n token: asNullableString(admin.token, null),\n },\n }\n : {}),\n ...(datafinder\n ? {\n datafinder: {\n accessKeyId: asString(datafinder.accessKeyId, ''),\n appId: asString(datafinder.appId, ''),\n baseUrl: asString(datafinder.baseUrl, 'https://analytics.volcengineapi.com'),\n defaultDashboardId: asString(datafinder.defaultDashboardId, ''),\n pathMode: datafinder.pathMode === 'app' ? 'app' : 'project',\n projectId: asString(datafinder.projectId, ''),\n secretAccessKey: asString(datafinder.secretAccessKey, ''),\n timezone: asString(datafinder.timezone, 'Asia/Shanghai'),\n },\n }\n : {}),\n locale: isObject(source) ? asString(source.locale, defaultConfig.locale) : defaultConfig.locale,\n defaultAwsProfile: isObject(source)\n ? asString(source.defaultAwsProfile, defaultConfig.defaultAwsProfile)\n : defaultConfig.defaultAwsProfile,\n setup: {\n localeConfigured: asBoolean(setup.localeConfigured, defaultConfig.setup.localeConfigured),\n awsConfigured: asBoolean(setup.awsConfigured, defaultConfig.setup.awsConfigured),\n datafinderConfigured: asBoolean(setup.datafinderConfigured, false),\n ghConfigured: asBoolean(setup.ghConfigured, defaultConfig.setup.ghConfigured),\n },\n versionCheck: {\n lastAutoCheckedAt: asNullableString(versionCheck.lastAutoCheckedAt, defaultLastAutoCheckedAt),\n },\n };\n};\n\nconst resolveConfigDir = (configDir?: string): string =>\n configDir ?? join(process.env.XDG_CONFIG_HOME ?? join(homedir(), '.config'), 'nexight-devops');\n\nconst resolveConfigPath = (configDir?: string): string => join(resolveConfigDir(configDir), 'config.json');\n\nexport const loadConfig = async (options: { configDir?: string } = {}): Promise<CliConfig> => {\n try {\n const raw = await readFile(resolveConfigPath(options.configDir), 'utf8');\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`Invalid CLI config at ${resolveConfigPath(options.configDir)}`);\n }\n\n return normalizeConfig(parsed);\n } catch (error: unknown) {\n if (isObject(error) && 'code' in error && error.code === 'ENOENT') {\n return normalizeConfig(undefined);\n }\n\n throw error;\n }\n};\n\nexport const saveConfig = async (\n config: CliConfig,\n options: { configDir?: string } = {},\n): Promise<void> => {\n const configDir = resolveConfigDir(options.configDir);\n await mkdir(configDir, { recursive: true });\n const configPath = resolveConfigPath(options.configDir);\n await writePrivateFile(configPath, `${JSON.stringify(config, null, 2)}\\n`);\n};\n","import { randomUUID } from 'node:crypto';\nimport { open, rename, unlink } from 'node:fs/promises';\nimport { basename, dirname, join } from 'node:path';\n\nexport const writePrivateFile = async (filePath: string, contents: string): Promise<void> => {\n const directory = dirname(filePath);\n const temporaryPath = join(\n directory,\n `.${basename(filePath)}.${process.pid}.${randomUUID()}.tmp`,\n );\n let handle: Awaited<ReturnType<typeof open>> | undefined;\n\n try {\n handle = await open(temporaryPath, 'wx', 0o600);\n await handle.writeFile(contents, 'utf8');\n await handle.sync();\n await handle.close();\n handle = undefined;\n await rename(temporaryPath, filePath);\n } catch (error: unknown) {\n await handle?.close().catch(() => undefined);\n await unlink(temporaryPath).catch(() => undefined);\n throw error;\n }\n};\n","import chalk from 'chalk';\nimport symbols from 'log-symbols';\n\nconst writeLine = (line: string, useErrorStream = false): void => {\n if (useErrorStream) {\n console.error(line);\n return;\n }\n\n console.log(line);\n};\n\nexport const logger = {\n error: (message: string): void => {\n writeLine(`${symbols.error} ${chalk.red(message)}`, true);\n },\n info: (message: string): void => {\n writeLine(`${symbols.info} ${chalk.cyan(message)}`);\n },\n step: (message: string): void => {\n writeLine(`${chalk.blue('→')} ${chalk.bold(message)}`);\n },\n success: (message: string): void => {\n writeLine(`${symbols.success} ${chalk.green(message)}`);\n },\n warn: (message: string): void => {\n writeLine(`${symbols.warning} ${chalk.yellow(message)}`, true);\n },\n};\n","import type { Command } from 'commander';\nimport { AdminApi, normalizeAdminApiOrigin } from '../../lib/admin-api.js';\nimport { loadConfig, type CliConfig } from '../../lib/config.js';\nimport { CliError } from '../../lib/errors.js';\nimport { logger } from '../../lib/logger.js';\n\nexport type AdminCommandOptions = {\n adminUrl?: string;\n json?: boolean;\n};\n\nexport type AdminContext = {\n api: AdminApi;\n apiOrigin: string;\n config: CliConfig;\n token: string;\n};\n\nexport const addAdminConnectionOptions = (command: Command): Command =>\n command\n .option('--admin-url <url>', 'management API URL or admin.tutti.sh page URL')\n .option('--json', 'print the response as JSON without CLI decorations');\n\nexport const resolveAdminContext = async (\n options: AdminCommandOptions = {},\n tokenOverride?: string,\n): Promise<AdminContext> => {\n const config = await loadConfig();\n const apiOrigin = normalizeAdminApiOrigin(options.adminUrl ?? config.admin?.apiOrigin);\n const token = (\n tokenOverride ??\n process.env.NEXIGHT_ADMIN_TOKEN ??\n process.env.TUTTI_ADMIN_TOKEN ??\n config.admin?.token ??\n ''\n ).trim();\n\n if (!token) {\n throw new CliError('管理后台 Token 未配置,请先运行 nexight-devops admin auth login', 1);\n }\n\n return {\n api: new AdminApi({ apiOrigin, token }),\n apiOrigin,\n config,\n token,\n };\n};\n\nexport const printAdminResult = (value: unknown, options: AdminCommandOptions = {}): void => {\n const output = JSON.stringify(value, null, 2) ?? String(value);\n if (options.json) {\n console.log(output);\n return;\n }\n\n logger.info(output);\n};\n\nexport const parseAdminInclude = (value?: string): string[] =>\n (value ?? '')\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n","import type { Command } from 'commander';\nimport {\n addAdminConnectionOptions,\n parseAdminInclude,\n printAdminResult,\n resolveAdminContext,\n type AdminCommandOptions,\n} from './shared.js';\n\ntype AdminAppListOptions = AdminCommandOptions & {\n brand: string;\n query?: string;\n};\n\ntype AdminAppDetailOptions = AdminCommandOptions & {\n appId: string;\n brand: string;\n include?: string;\n};\n\nexport const runAdminAppList = async (options: AdminAppListOptions): Promise<void> => {\n const { api } = await resolveAdminContext(options);\n printAdminResult(await api.listApps(options.query), options);\n};\n\nexport const runAdminAppDetail = async (options: AdminAppDetailOptions): Promise<void> => {\n const { api } = await resolveAdminContext(options);\n printAdminResult(await api.appDetail(options.appId, parseAdminInclude(options.include)), options);\n};\n\nexport const registerAdminAppCommand = (program: Command): void => {\n const app = program.command('app').description('Query App Center data from the management backend');\n\n addAdminConnectionOptions(\n app\n .command('list')\n .description('List App Center applications')\n .requiredOption('--brand <brand>', 'App Center brand')\n .option('--query <query>', 'Filter applications by a case-insensitive text query'),\n ).action(runAdminAppList);\n\n addAdminConnectionOptions(\n app\n .command('detail')\n .description('Show one App Center application')\n .requiredOption('--brand <brand>', 'App Center brand')\n .requiredOption('--app-id <appId>')\n .option('--include <include>', 'comma separated: latest,versions'),\n ).action(runAdminAppDetail);\n};\n","import { checkbox, confirm, input, password, select } from '@inquirer/prompts';\nimport ora from 'ora';\n\nexport const ui: {\n checkbox: typeof checkbox;\n confirm: typeof confirm;\n input: typeof input;\n password: typeof password;\n select: typeof select;\n spinner: (text: string) => ReturnType<typeof ora>;\n} = {\n checkbox,\n confirm,\n input,\n password,\n select,\n spinner: (text: string) => ora({ text, spinner: 'dots' }),\n};\n","import type { Command } from 'commander';\nimport { CliError } from '../../lib/errors.js';\nimport { AdminApi, normalizeAdminApiOrigin } from '../../lib/admin-api.js';\nimport { loadConfig, saveConfig } from '../../lib/config.js';\nimport { logger } from '../../lib/logger.js';\nimport { ui } from '../../lib/ui.js';\nimport {\n addAdminConnectionOptions,\n printAdminResult,\n resolveAdminContext,\n type AdminCommandOptions,\n} from './shared.js';\n\nexport const runAdminLogin = async (options: AdminCommandOptions = {}): Promise<void> => {\n const config = await loadConfig();\n const apiOrigin = normalizeAdminApiOrigin(options.adminUrl ?? config.admin?.apiOrigin);\n const token = (await ui.password({ message: '请输入 Tutti 管理后台 Token' })).trim();\n\n if (!token) {\n throw new CliError('管理后台 Token 不能为空', 1);\n }\n\n const identity = await new AdminApi({ apiOrigin, token }).inspectToken(token);\n await saveConfig({\n ...config,\n admin: {\n apiOrigin,\n token,\n },\n });\n\n logger.success(`管理后台登录成功: ${apiOrigin}`);\n if (options.json) {\n printAdminResult(identity, options);\n }\n};\n\nexport const runAdminLogout = async (): Promise<void> => {\n const config = await loadConfig();\n config.admin = undefined;\n await saveConfig(config);\n logger.success('已退出管理后台');\n};\n\nexport const runAdminWhoami = async (options: AdminCommandOptions = {}): Promise<void> => {\n const { api } = await resolveAdminContext(options);\n printAdminResult(await api.inspectToken(), options);\n};\n\nexport const registerAdminAuthCommand = (program: Command): void => {\n const auth = program.command('auth').description('Manage management backend authentication');\n\n auth\n .command('login')\n .description('Save and verify a management backend token')\n .option('--admin-url <url>', 'management API URL or admin.tutti.sh page URL')\n .option('--json', 'also print the verified identity as JSON')\n .action(runAdminLogin);\n\n auth\n .command('logout')\n .description('Remove the saved management backend token')\n .action(runAdminLogout);\n\n addAdminConnectionOptions(\n auth\n .command('whoami')\n .description('Inspect the currently configured management backend token'),\n ).action(runAdminWhoami);\n\n const token = auth.command('token').description('Inspect management backend tokens');\n addAdminConnectionOptions(\n token.command('inspect').description('Inspect the currently configured management backend token'),\n ).action(runAdminWhoami);\n};\n","import { mkdtemp } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { AdminApi } from './admin-api.js';\nimport {\n downloadRuntimeLogArchive,\n safeRuntimeLogFileName,\n waitForRuntimeLogRecall,\n type ComputerRuntimeLogRecall,\n type SupportedComputerRuntimeLogRangePreset,\n type TuttiComputer,\n} from './admin-computer.js';\nimport { CliError } from './errors.js';\n\nconst RANGE_SELECTION_SAFETY_MS = 5_000;\nconst PROGRESS_HEARTBEAT_MS = 15_000;\n\nconst RUNTIME_LOG_RANGES: Array<{\n durationMs: number;\n preset: SupportedComputerRuntimeLogRangePreset;\n}> = [\n { durationMs: 60 * 60_000, preset: '1_hour' },\n { durationMs: 3 * 60 * 60_000, preset: '3_hours' },\n { durationMs: 24 * 60 * 60_000, preset: '1_day' },\n { durationMs: 3 * 24 * 60 * 60_000, preset: '3_days' },\n { durationMs: 14 * 24 * 60 * 60_000, preset: '14_days' },\n];\n\nconst RANGE_ALIASES: Record<string, SupportedComputerRuntimeLogRangePreset> = {\n '1h': '1_hour',\n '1_hour': '1_hour',\n '3h': '3_hours',\n '3_hours': '3_hours',\n '1d': '1_day',\n '1_day': '1_day',\n '3d': '3_days',\n '3_days': '3_days',\n '14d': '14_days',\n '14_days': '14_days',\n};\n\ntype RuntimeLogApi = Pick<\n AdminApi,\n | 'createComputerRuntimeLogRecall'\n | 'createComputerRuntimeLogRecallDownload'\n | 'getComputerRuntimeLogRecall'\n | 'getTuttiComputer'\n | 'listTuttiComputers'\n>;\n\nexport type RuntimeLogRecallSelection = {\n recallInterval: {\n from: string;\n to: string;\n };\n requestedInterval: {\n from: string;\n to: string;\n };\n rangePreset: SupportedComputerRuntimeLogRangePreset;\n};\n\nexport type RuntimeLogRecallArtifact = {\n bytes: number;\n expiresAt: string;\n fileName: string;\n path: string;\n};\n\nexport type RuntimeLogRecallResult = {\n artifact: RuntimeLogRecallArtifact;\n computer: {\n computerId: string;\n connectionStatus: TuttiComputer['connectionStatus'];\n desktopdVersion: string;\n displayName: string;\n reportedName: string;\n };\n recallInterval: RuntimeLogRecallSelection['recallInterval'];\n requestedInterval: RuntimeLogRecallSelection['requestedInterval'];\n rangePreset: SupportedComputerRuntimeLogRangePreset;\n task: ComputerRuntimeLogRecall;\n};\n\ntype RuntimeLogWorkflowDependencies = {\n api: RuntimeLogApi;\n clock?: () => number;\n downloadArchive?: typeof downloadRuntimeLogArchive;\n makeTempDirectory?: () => Promise<string>;\n onProgress?: (message: string) => void;\n sleep?: (durationMs: number) => Promise<void>;\n};\n\nexport const parseRuntimeLogRange = (value: string): SupportedComputerRuntimeLogRangePreset => {\n const preset = RANGE_ALIASES[value.trim().toLowerCase().replaceAll('-', '_')];\n if (!preset) {\n throw new CliError('--range 必须是 1h、3h、1d、3d 或 14d', 1);\n }\n return preset;\n};\n\nconst parseIntervalTimestamp = (value: string, optionName: '--from' | '--to'): Date => {\n const normalized = value.trim();\n if (!/(?:z|[+-]\\d{2}:\\d{2})$/i.test(normalized)) {\n throw new CliError(`${optionName} 必须包含时区偏移或 Z`, 1);\n }\n const parsed = new Date(normalized);\n if (Number.isNaN(parsed.getTime())) {\n throw new CliError(`${optionName} 不是有效时间: ${value}`, 1);\n }\n return parsed;\n};\n\nconst rangeDuration = (preset: SupportedComputerRuntimeLogRangePreset): number =>\n RUNTIME_LOG_RANGES.find((range) => range.preset === preset)?.durationMs ?? 0;\n\nexport const resolveRuntimeLogRecallSelection = (\n input: { from?: string; range?: string; to?: string },\n now = new Date(),\n): RuntimeLogRecallSelection => {\n if (Number.isNaN(now.getTime())) {\n throw new CliError('当前时间无效,无法计算日志召回区间', 1);\n }\n if (input.range && (input.from || input.to)) {\n throw new CliError('--range 不能与 --from/--to 同时使用', 1);\n }\n if (input.to && !input.from) {\n throw new CliError('--to 必须与 --from 一起使用', 1);\n }\n\n if (!input.from) {\n const rangePreset = parseRuntimeLogRange(input.range ?? '1h');\n const durationMs = rangeDuration(rangePreset);\n const interval = {\n from: new Date(now.getTime() - durationMs).toISOString(),\n to: now.toISOString(),\n };\n return {\n rangePreset,\n recallInterval: interval,\n requestedInterval: interval,\n };\n }\n\n const from = parseIntervalTimestamp(input.from, '--from');\n const to = input.to ? parseIntervalTimestamp(input.to, '--to') : now;\n if (from.getTime() >= to.getTime()) {\n throw new CliError('--from 必须早于 --to', 1);\n }\n if (to.getTime() > now.getTime()) {\n throw new CliError('--to 不能晚于当前时间', 1);\n }\n\n const requiredDurationMs = now.getTime() - from.getTime() + RANGE_SELECTION_SAFETY_MS;\n const selected = RUNTIME_LOG_RANGES.find((range) => range.durationMs >= requiredDurationMs);\n if (!selected) {\n throw new CliError('--from 超出最近 14 天,当前日志召回服务无法覆盖', 1);\n }\n\n return {\n rangePreset: selected.preset,\n requestedInterval: {\n from: from.toISOString(),\n to: to.toISOString(),\n },\n recallInterval: {\n from: new Date(now.getTime() - selected.durationMs).toISOString(),\n to: now.toISOString(),\n },\n };\n};\n\nconst isUUID = (value: string): boolean =>\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n value,\n );\n\nconst computerNameMatches = (computer: TuttiComputer, selector: string): boolean => {\n const expected = selector.trim().toLowerCase();\n return [computer.displayName, computer.reportedName]\n .map((value) => value.trim().toLowerCase())\n .includes(expected);\n};\n\nexport const resolveOnlineTuttiComputer = async (\n api: Pick<AdminApi, 'getTuttiComputer' | 'listTuttiComputers'>,\n selector: string,\n): Promise<TuttiComputer> => {\n const normalized = selector.trim();\n if (!normalized) {\n throw new CliError('Computer 名称或 ID 不能为空', 1);\n }\n\n if (isUUID(normalized)) {\n const computer = await api.getTuttiComputer(normalized);\n if (computer.connectionStatus !== 'online') {\n throw new CliError(`Computer ${normalized} 当前不在线,无法召回日志`, 1);\n }\n return computer;\n }\n\n const matches: TuttiComputer[] = [];\n const seenPageTokens = new Set<string>();\n let pageToken = '';\n do {\n const page = await api.listTuttiComputers({\n connectionStatus: 'online',\n nameQuery: normalized,\n pageSize: 50,\n pageToken: pageToken || undefined,\n });\n matches.push(...page.computers.filter((computer) => computerNameMatches(computer, normalized)));\n pageToken = page.nextPageToken;\n if (pageToken && seenPageTokens.has(pageToken)) {\n throw new CliError('管理后台返回了重复分页游标,无法可靠解析 Computer', 1);\n }\n if (pageToken) {\n seenPageTokens.add(pageToken);\n }\n } while (pageToken);\n\n if (matches.length === 0) {\n throw new CliError(`未找到名称完全匹配且在线的 Computer: ${normalized}`, 1);\n }\n if (matches.length > 1) {\n const ids = matches.map((computer) => computer.computerId).join(', ');\n throw new CliError(`找到多个同名在线 Computer,请改用 Computer ID: ${ids}`, 1);\n }\n return matches[0] as TuttiComputer;\n};\n\nexport const resolveOnlineTuttiComputersByOwner = async (\n api: Pick<AdminApi, 'listTuttiComputers'>,\n ownerQuery: string,\n): Promise<TuttiComputer[]> => {\n const normalized = ownerQuery.trim();\n if (!normalized) {\n throw new CliError('用户名或邮箱不能为空', 1);\n }\n\n const matches: TuttiComputer[] = [];\n const seenComputerIds = new Set<string>();\n const seenPageTokens = new Set<string>();\n let pageToken = '';\n do {\n const page = await api.listTuttiComputers({\n connectionStatus: 'online',\n ownerQuery: normalized,\n pageSize: 50,\n pageToken: pageToken || undefined,\n });\n for (const computer of page.computers) {\n if (!seenComputerIds.has(computer.computerId)) {\n seenComputerIds.add(computer.computerId);\n matches.push(computer);\n }\n }\n pageToken = page.nextPageToken;\n if (pageToken && seenPageTokens.has(pageToken)) {\n throw new CliError('管理后台返回了重复分页游标,无法可靠解析用户名对应的 Computer', 1);\n }\n if (pageToken) {\n seenPageTokens.add(pageToken);\n }\n } while (pageToken);\n\n if (matches.length === 0) {\n throw new CliError(`未找到用户名或邮箱匹配且在线的 Computer: ${normalized}`, 1);\n }\n return matches;\n};\n\nexport const resolveOnlineTuttiComputerForLogs = async (\n api: Pick<AdminApi, 'getTuttiComputer' | 'listTuttiComputers'>,\n input: { computer?: string; ownerQuery?: string },\n): Promise<TuttiComputer> => {\n const hasComputer = Boolean(input.computer?.trim());\n const hasOwnerQuery = Boolean(input.ownerQuery?.trim());\n if (hasComputer === hasOwnerQuery) {\n throw new CliError('Computer 名称/ID 与用户名/邮箱必须二选一', 1);\n }\n if (hasComputer) {\n return resolveOnlineTuttiComputer(api, input.computer as string);\n }\n\n const matches = await resolveOnlineTuttiComputersByOwner(api, input.ownerQuery as string);\n if (matches.length > 1) {\n const candidates = matches\n .map(\n (computer) =>\n `${computer.displayName || computer.reportedName} (${computer.computerId})`,\n )\n .join(', ');\n throw new CliError(\n `用户名/邮箱匹配到多个在线 Computer,请改用 Computer 名称或 ID: ${candidates}`,\n 1,\n );\n }\n return matches[0] as TuttiComputer;\n};\n\nconst stateLabel = (task: ComputerRuntimeLogRecall): string => {\n switch (task.state) {\n case 'waiting_for_device':\n return '等待设备接收';\n case 'device_processing':\n return '设备采集并上传中';\n case 'downloadable':\n return '可下载';\n case 'failed':\n return `失败${task.failureMessage ? `: ${task.failureMessage}` : ''}`;\n default:\n return `未知状态 ${task.state}`;\n }\n};\n\nconst taskFailure = (task: ComputerRuntimeLogRecall): CliError =>\n new CliError(\n `日志召回失败 [${task.taskId}]: ${task.failureMessage || task.failureCode || '设备未完成任务'}`,\n 1,\n );\n\nexport const recallComputerRuntimeLogs = async (\n input: {\n computer?: string;\n from?: string;\n ownerQuery?: string;\n pollIntervalMs: number;\n range?: string;\n timeoutMs: number;\n to?: string;\n },\n dependencies: RuntimeLogWorkflowDependencies,\n): Promise<RuntimeLogRecallResult> => {\n const clock = dependencies.clock ?? Date.now;\n const progress = dependencies.onProgress ?? (() => undefined);\n const selection = resolveRuntimeLogRecallSelection(input, new Date(clock()));\n\n const selector = input.ownerQuery ? `用户名/邮箱 ${input.ownerQuery}` : `Computer ${input.computer}`;\n progress(`正在解析唯一在线 Computer: ${selector}`);\n const computer = await resolveOnlineTuttiComputerForLogs(dependencies.api, input);\n progress(\n `已匹配 ${computer.displayName || computer.reportedName} (${computer.computerId}),desktopd ${computer.desktopdVersion || '未知'}`,\n );\n progress(\n `异常区间 ${selection.requestedInterval.from} → ${selection.requestedInterval.to};使用 ${selection.rangePreset} 档位覆盖`,\n );\n\n progress('正在创建日志召回任务');\n const created = await dependencies.api.createComputerRuntimeLogRecall(\n computer.computerId,\n selection.rangePreset,\n );\n if (created.state === 'failed') {\n throw taskFailure(created);\n }\n progress(`任务已创建: ${created.taskId}`);\n\n let lastReportedState = '';\n let lastReportedAt = 0;\n const completed = await waitForRuntimeLogRecall(\n () => dependencies.api.getComputerRuntimeLogRecall(computer.computerId, created.taskId),\n {\n initialTask: created,\n onUpdate: (task) => {\n const currentTime = clock();\n if (\n task.state !== lastReportedState ||\n currentTime - lastReportedAt >= PROGRESS_HEARTBEAT_MS\n ) {\n progress(`任务 ${task.taskId}: ${stateLabel(task)}`);\n lastReportedState = task.state;\n lastReportedAt = currentTime;\n }\n },\n pollIntervalMs: input.pollIntervalMs,\n timeoutMs: input.timeoutMs,\n },\n {\n now: clock,\n sleep: dependencies.sleep,\n },\n );\n if (completed.state === 'failed') {\n throw taskFailure(completed);\n }\n\n progress('正在生成短期下载地址');\n const download = await dependencies.api.createComputerRuntimeLogRecallDownload(\n computer.computerId,\n completed.taskId,\n );\n if (!download.downloadUrl) {\n throw new CliError('管理后台未返回日志下载地址', 1);\n }\n\n const makeTempDirectory =\n dependencies.makeTempDirectory ?? (() => mkdtemp(join('/tmp', 'nexight-runtime-log-')));\n const directory = await makeTempDirectory();\n const fileName = safeRuntimeLogFileName(download.fileName, completed.taskId);\n const outputPath = join(directory, fileName);\n progress(`正在下载日志归档到 ${outputPath}`);\n const saved = await (dependencies.downloadArchive ?? downloadRuntimeLogArchive)(\n download.downloadUrl,\n outputPath,\n );\n progress(`下载完成: ${saved.path} (${saved.bytes} bytes)`);\n\n return {\n computer: {\n computerId: computer.computerId,\n connectionStatus: computer.connectionStatus,\n desktopdVersion: computer.desktopdVersion,\n displayName: computer.displayName,\n reportedName: computer.reportedName,\n },\n rangePreset: selection.rangePreset,\n requestedInterval: selection.requestedInterval,\n recallInterval: selection.recallInterval,\n task: completed,\n artifact: {\n bytes: saved.bytes,\n expiresAt: download.expiresAt,\n fileName,\n path: saved.path,\n },\n };\n};\n","import chalk from 'chalk';\nimport ora from 'ora';\n\ntype ProgressTaskContext = {\n getElapsedMs: () => number;\n setText: (text: string) => void;\n};\n\ntype ProgressTaskOptions = {\n heartbeatText?: (elapsedMs: number) => string;\n heartbeatMs?: number;\n initialText: string;\n};\n\ntype EtaProgressOptions = {\n abnormalAfterMs?: number;\n estimateMs?: number | null;\n label: string;\n waitingForStartText: string;\n};\n\nconst HEARTBEAT_INTERVAL_MS = 15_000;\nconst ETA_REFRESH_INTERVAL_MS = 1_000;\nconst PROGRESS_ROW_STATUS_WIDTH = 7;\n\nexport type ProgressRowStatus = 'failure' | 'idle' | 'queued' | 'running' | 'success';\n\nexport type WorkflowProgressState = {\n conclusion?: 'failure' | 'success';\n detail?: string;\n estimateMs: number | null;\n runUrl?: string;\n startedAt?: number;\n status: 'idle' | 'queued' | 'running' | 'completed';\n};\n\nconst progressRowColor: Record<ProgressRowStatus, (text: string) => string> = {\n idle: chalk.gray,\n queued: chalk.blue,\n running: chalk.yellow,\n success: chalk.green,\n failure: chalk.red,\n};\n\nconst progressRowLabel: Record<ProgressRowStatus, string> = {\n idle: 'IDLE',\n queued: 'QUEUED',\n running: 'RUNNING',\n success: 'SUCCESS',\n failure: 'FAILURE',\n};\n\nconst unrefTimer = (timer: ReturnType<typeof setInterval>): void => {\n (timer as { unref?: () => void }).unref?.();\n};\n\nconst formatEstimate = (elapsedMs: number, estimateMs: number): string => {\n const elapsed = formatElapsed(elapsedMs);\n const estimate = formatElapsed(estimateMs);\n\n return `${elapsed} / ${estimate}`;\n};\n\nexport const formatElapsed = (elapsedMs: number): string => {\n const totalSeconds = Math.max(0, Math.floor(elapsedMs / 1_000));\n const hours = Math.floor(totalSeconds / 3_600);\n const minutes = Math.floor((totalSeconds % 3_600) / 60);\n const seconds = totalSeconds % 60;\n\n if (hours > 0) {\n return `${hours}h${minutes}m`;\n }\n\n if (minutes > 0) {\n return `${minutes}m${seconds}s`;\n }\n\n return `${seconds}s`;\n};\n\nexport const renderProgressBar = (percent: number, width = 12): string => {\n const safeWidth = Math.max(1, Math.floor(width));\n const safePercent = Math.max(0, Math.min(100, percent));\n const filled = Math.round((safePercent / 100) * safeWidth);\n\n return `[${'='.repeat(filled)}${'-'.repeat(safeWidth - filled)}]`;\n};\n\nexport const renderProgressPanel = ({\n title,\n rows,\n}: {\n title: string;\n rows: string[];\n}): string => [title, ...rows].join('\\n');\n\nexport const formatProgressRow = ({\n detail,\n repoKey,\n runUrl,\n status,\n width,\n}: {\n detail?: string;\n repoKey: string;\n runUrl?: string;\n status: ProgressRowStatus;\n width?: number;\n}): string => {\n const label = progressRowColor[status](progressRowLabel[status].padEnd(PROGRESS_ROW_STATUS_WIDTH));\n const repo = chalk.bold(repoKey.padEnd(width ?? repoKey.length));\n const parts = [label, repo];\n\n if (detail) {\n parts.push(detail);\n }\n\n if (runUrl) {\n parts.push(runUrl);\n }\n\n return parts.join(' ');\n};\n\nexport const formatWorkflowProgressRow = ({\n key,\n state,\n width,\n}: {\n key: string;\n state: WorkflowProgressState;\n width: number;\n}): string => {\n if (state.status === 'completed') {\n return formatProgressRow({\n detail: state.detail ?? (state.conclusion === 'failure' ? 'workflow failed' : 'completed'),\n repoKey: key,\n runUrl: state.runUrl,\n status: state.conclusion === 'failure' ? 'failure' : 'success',\n width,\n });\n }\n\n if (state.status === 'idle') {\n return formatProgressRow({\n detail: 'pending',\n repoKey: key,\n status: 'idle',\n width,\n });\n }\n\n if (state.status === 'queued') {\n return formatProgressRow({\n detail: 'waiting for workflow',\n repoKey: key,\n runUrl: state.runUrl,\n status: 'queued',\n width,\n });\n }\n\n return formatProgressRow({\n detail:\n state.detail ??\n formatEtaStatus({\n label: state.status,\n elapsedMs: state.startedAt ? Date.now() - state.startedAt : 0,\n estimateMs: state.estimateMs,\n }),\n repoKey: key,\n runUrl: state.runUrl,\n status: 'running',\n width,\n });\n};\n\nexport const renderWorkflowProgressPanel = ({\n items,\n states,\n title,\n}: {\n items: Array<{ key: string }>;\n states: ReadonlyMap<string, WorkflowProgressState>;\n title: string;\n}): string => {\n const defaultState: WorkflowProgressState = { estimateMs: null, status: 'idle' };\n const resolvedStates = items.map((item) => states.get(item.key) ?? defaultState);\n const width = items.length > 0 ? Math.max(...items.map((item) => item.key.length)) : 0;\n const completedCount = resolvedStates.filter((state) => state.status === 'completed').length;\n\n return renderProgressPanel({\n title: `${title} | 已完成 ${completedCount}/${items.length}`,\n rows: items.map((item, index) =>\n formatWorkflowProgressRow({\n key: item.key,\n state: resolvedStates[index] ?? defaultState,\n width,\n }),\n ),\n });\n};\n\nexport const formatEtaStatus = ({\n abnormalAfterMs,\n elapsedMs,\n estimateMs,\n label,\n runUrl,\n}: {\n abnormalAfterMs?: number;\n elapsedMs: number;\n estimateMs?: number | null;\n label: string;\n runUrl?: string;\n}): string => {\n if (estimateMs == null || estimateMs <= 0) {\n return `${label},已耗时 ${formatElapsed(elapsedMs)}(暂无历史参考)`;\n }\n\n const elapsed = formatElapsed(elapsedMs);\n const estimate = formatElapsed(estimateMs);\n const hasOverrun = elapsedMs > estimateMs;\n const overrunMs = elapsedMs - estimateMs;\n const isAbnormal = abnormalAfterMs !== undefined && hasOverrun && overrunMs >= abnormalAfterMs;\n const statusParts: string[] = [];\n\n if (hasOverrun) {\n statusParts.push(`${renderProgressBar(100)} >100% ${formatEstimate(elapsedMs, estimateMs)},已超参考 ${formatElapsed(overrunMs)}`);\n } else {\n const percent = Math.min(95, Math.floor((elapsedMs / estimateMs) * 100));\n statusParts.push(`${renderProgressBar(percent)} ${percent}% ${elapsed} / ${estimate}`);\n }\n\n if (isAbnormal) {\n statusParts.push('可能存在异常');\n if (runUrl) {\n statusParts.push(`请关注 workflow 页面: ${runUrl}`);\n }\n }\n\n return `${label} ${statusParts.join(',')}`;\n};\n\nexport const withProgressTask = async <T>(\n options: ProgressTaskOptions,\n run: (context: ProgressTaskContext) => Promise<T> | T,\n): Promise<T> => {\n const spinner = ora({ text: options.initialText, spinner: 'dots' });\n const startedAt = Date.now();\n const heartbeatMs = options.heartbeatMs ?? HEARTBEAT_INTERVAL_MS;\n const heartbeatText = options.heartbeatText ?? ((elapsedMs: number) => `${options.initialText}(已耗时 ${formatElapsed(elapsedMs)})`);\n\n const setText = (text: string): void => {\n spinner.text = text;\n };\n\n const getElapsedMs = (): number => Date.now() - startedAt;\n\n spinner.start();\n const heartbeatTimer = setInterval(() => {\n setText(heartbeatText(getElapsedMs()));\n }, heartbeatMs);\n unrefTimer(heartbeatTimer);\n\n try {\n return await run({ getElapsedMs, setText });\n } finally {\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n }\n\n spinner.stop();\n }\n};\n\nexport const createEtaProgress = ({\n abnormalAfterMs,\n estimateMs,\n label,\n waitingForStartText,\n}: EtaProgressOptions): {\n setEstimate: (nextEstimateMs: number | null | undefined) => void;\n setRunUrl: (nextRunUrl: string) => void;\n start: () => void;\n stop: () => void;\n} => {\n const spinner = ora({ text: waitingForStartText, spinner: 'dots' });\n\n let active = false;\n let startedAt = 0;\n let refreshTimer: ReturnType<typeof setInterval> | undefined;\n let currentEstimateMs = estimateMs;\n let currentRunUrl: string | undefined;\n\n const refresh = (): void => {\n if (!active) {\n spinner.text = waitingForStartText;\n return;\n }\n\n spinner.text = formatEtaStatus({\n abnormalAfterMs,\n elapsedMs: Date.now() - startedAt,\n estimateMs: currentEstimateMs,\n label,\n runUrl: currentRunUrl,\n });\n };\n\n const start = (): void => {\n if (active) {\n return;\n }\n\n active = true;\n startedAt = Date.now();\n spinner.text = waitingForStartText;\n spinner.start();\n refreshTimer = setInterval(refresh, ETA_REFRESH_INTERVAL_MS);\n unrefTimer(refreshTimer);\n };\n\n const stop = (): void => {\n active = false;\n\n if (refreshTimer) {\n clearInterval(refreshTimer);\n refreshTimer = undefined;\n }\n\n spinner.stop();\n };\n\n const setEstimate = (nextEstimateMs: number | null | undefined): void => {\n currentEstimateMs = nextEstimateMs;\n refresh();\n };\n\n const setRunUrl = (nextRunUrl: string): void => {\n currentRunUrl = nextRunUrl;\n refresh();\n };\n\n return {\n setEstimate,\n setRunUrl,\n start,\n stop,\n };\n};\n","import type { Command } from 'commander';\nimport {\n parseRuntimeLogRange,\n recallComputerRuntimeLogs,\n type RuntimeLogRecallResult,\n} from '../../lib/admin-computer-logs.js';\nimport {\n downloadRuntimeLogArchive,\n safeRuntimeLogFileName,\n waitForRuntimeLogRecall,\n type ComputerRuntimeLogRecall,\n type TuttiComputerConnectionStatus,\n} from '../../lib/admin-computer.js';\nimport { CliError } from '../../lib/errors.js';\nimport { logger } from '../../lib/logger.js';\nimport { withProgressTask } from '../../lib/progress.js';\nimport {\n addAdminConnectionOptions,\n printAdminResult,\n resolveAdminContext,\n type AdminCommandOptions,\n} from './shared.js';\n\nconst DEFAULT_RECALL_TIMEOUT_SECONDS = 30 * 60;\nconst DEFAULT_RECALL_POLL_INTERVAL_SECONDS = 5;\n\ntype AdminComputerListOptions = AdminCommandOptions & {\n connection?: string;\n desktopdVersion?: string;\n ownerQuery?: string;\n username?: string;\n pageSize: string;\n pageToken?: string;\n platform?: string;\n query?: string;\n};\n\ntype AdminComputerDetailOptions = AdminCommandOptions & {\n computerId: string;\n};\n\ntype AdminRuntimeLogListOptions = AdminComputerDetailOptions & {\n pageSize: string;\n pageToken?: string;\n};\n\ntype AdminRuntimeLogGetOptions = AdminComputerDetailOptions & {\n taskId: string;\n};\n\ntype AdminRuntimeLogCreateOptions = AdminComputerDetailOptions & {\n download?: boolean;\n force?: boolean;\n output?: string;\n pollIntervalSeconds: string;\n range: string;\n timeoutSeconds: string;\n wait?: boolean;\n};\n\ntype AdminRuntimeLogDownloadOptions = AdminRuntimeLogGetOptions & {\n force?: boolean;\n output?: string;\n};\n\ntype AdminRuntimeLogsOptions = AdminCommandOptions & {\n from?: string;\n ownerQuery?: string;\n username?: string;\n pollIntervalSeconds: string;\n range?: string;\n timeoutSeconds: string;\n to?: string;\n};\n\nconst parseIntegerOption = (\n value: string,\n optionName: string,\n minimum: number,\n maximum: number,\n): number => {\n if (!/^\\d+$/.test(value.trim())) {\n throw new CliError(`${optionName} 必须是整数`, 1);\n }\n const parsed = Number(value);\n if (parsed < minimum || parsed > maximum) {\n throw new CliError(`${optionName} 必须在 ${minimum}-${maximum} 之间`, 1);\n }\n return parsed;\n};\n\nconst parseConnectionStatus = (\n value?: string,\n): Exclude<TuttiComputerConnectionStatus, 'unknown'> | undefined => {\n const normalized = value?.trim().toLowerCase();\n if (!normalized || normalized === 'all') {\n return undefined;\n }\n if (normalized === 'online' || normalized === 'offline') {\n return normalized;\n }\n throw new CliError('--connection 必须是 all、online 或 offline', 1);\n};\n\nconst resolveOwnerQuery = (options: { ownerQuery?: string; username?: string }): string | undefined => {\n const ownerQuery = options.ownerQuery?.trim();\n const username = options.username?.trim();\n if (ownerQuery && username) {\n throw new CliError('--owner-query 与 --username 必须二选一', 1);\n }\n return ownerQuery || username || undefined;\n};\n\nexport { parseRuntimeLogRange };\n\nconst runtimeLogFailure = (task: ComputerRuntimeLogRecall): CliError => {\n const detail = task.failureMessage || task.failureCode || '设备未能完成日志召回';\n return new CliError(`日志召回失败 [${task.taskId}]: ${detail}`, 1);\n};\n\nconst waitForTask = async (\n options: AdminRuntimeLogCreateOptions,\n initialTask: ComputerRuntimeLogRecall,\n getTask: () => Promise<ComputerRuntimeLogRecall>,\n): Promise<ComputerRuntimeLogRecall> => {\n const pollIntervalMs =\n parseIntegerOption(options.pollIntervalSeconds, '--poll-interval-seconds', 1, 60) * 1_000;\n const timeoutMs =\n parseIntegerOption(options.timeoutSeconds, '--timeout-seconds', 1, 7_200) * 1_000;\n\n const run = (onUpdate?: (task: ComputerRuntimeLogRecall) => void) =>\n waitForRuntimeLogRecall(getTask, {\n initialTask,\n onUpdate,\n pollIntervalMs,\n timeoutMs,\n });\n\n if (options.json) {\n return run();\n }\n\n return withProgressTask(\n {\n initialText: `等待设备处理日志召回任务 ${initialTask.taskId}`,\n heartbeatText: (elapsedMs) =>\n `等待设备处理日志召回任务 ${initialTask.taskId}(${Math.floor(elapsedMs / 1_000)}s)`,\n },\n ({ setText }) =>\n run((task) => {\n setText(`日志召回 ${task.taskId}: ${task.state}`);\n }),\n );\n};\n\nconst downloadTaskArchive = async (\n options: AdminRuntimeLogDownloadOptions,\n task?: ComputerRuntimeLogRecall,\n): Promise<Record<string, unknown>> => {\n const { api } = await resolveAdminContext(options);\n const download = await api.createComputerRuntimeLogRecallDownload(\n options.computerId,\n options.taskId,\n );\n if (!download.downloadUrl) {\n throw new CliError('管理后台未返回日志下载地址', 1);\n }\n const outputPath =\n options.output?.trim() || safeRuntimeLogFileName(download.fileName, options.taskId);\n const run = () =>\n downloadRuntimeLogArchive(download.downloadUrl, outputPath, { force: options.force });\n const saved = options.json\n ? await run()\n : await withProgressTask(\n { initialText: `正在下载日志归档 ${safeRuntimeLogFileName(download.fileName, options.taskId)}` },\n run,\n );\n\n return {\n ...(task ? { task } : {}),\n download: {\n bytes: saved.bytes,\n expiresAt: download.expiresAt,\n fileName: safeRuntimeLogFileName(download.fileName, options.taskId),\n path: saved.path,\n },\n };\n};\n\nexport const runAdminComputerList = async (options: AdminComputerListOptions): Promise<void> => {\n const { api } = await resolveAdminContext(options);\n printAdminResult(\n await api.listTuttiComputers({\n nameQuery: options.query,\n ownerQuery: resolveOwnerQuery(options),\n connectionStatus: parseConnectionStatus(options.connection),\n platform: options.platform,\n desktopdVersion: options.desktopdVersion,\n pageSize: parseIntegerOption(options.pageSize, '--page-size', 1, 50),\n pageToken: options.pageToken,\n }),\n options,\n );\n};\n\nexport const runAdminComputerDetail = async (\n options: AdminComputerDetailOptions,\n): Promise<void> => {\n const { api } = await resolveAdminContext(options);\n printAdminResult(await api.getTuttiComputer(options.computerId), options);\n};\n\nexport const runAdminRuntimeLogList = async (\n options: AdminRuntimeLogListOptions,\n): Promise<void> => {\n const { api } = await resolveAdminContext(options);\n printAdminResult(\n await api.listComputerRuntimeLogRecalls(options.computerId, {\n pageSize: parseIntegerOption(options.pageSize, '--page-size', 1, 50),\n pageToken: options.pageToken,\n }),\n options,\n );\n};\n\nexport const runAdminRuntimeLogGet = async (\n options: AdminRuntimeLogGetOptions,\n): Promise<void> => {\n const { api } = await resolveAdminContext(options);\n printAdminResult(\n await api.getComputerRuntimeLogRecall(options.computerId, options.taskId),\n options,\n );\n};\n\nexport const runAdminRuntimeLogCreate = async (\n options: AdminRuntimeLogCreateOptions,\n): Promise<void> => {\n if (options.force && !options.download && !options.output) {\n throw new CliError('--force 只能与 --download 或 --output 一起使用', 1);\n }\n\n const { api } = await resolveAdminContext(options);\n const created = await api.createComputerRuntimeLogRecall(\n options.computerId,\n parseRuntimeLogRange(options.range),\n );\n if (created.state === 'failed') {\n throw runtimeLogFailure(created);\n }\n\n const shouldDownload = Boolean(options.download || options.output);\n if (!options.wait && !shouldDownload) {\n printAdminResult(created, options);\n return;\n }\n\n const completed = await waitForTask(options, created, () =>\n api.getComputerRuntimeLogRecall(options.computerId, created.taskId),\n );\n if (completed.state === 'failed') {\n throw runtimeLogFailure(completed);\n }\n\n if (!shouldDownload) {\n printAdminResult(completed, options);\n return;\n }\n\n const result = await downloadTaskArchive(\n {\n ...options,\n taskId: completed.taskId,\n },\n completed,\n );\n printAdminResult(result, options);\n};\n\nexport const runAdminRuntimeLogDownload = async (\n options: AdminRuntimeLogDownloadOptions,\n): Promise<void> => {\n printAdminResult(await downloadTaskArchive(options), options);\n};\n\nexport const runAdminRuntimeLogs = async (\n computerSelector: string | undefined,\n options: AdminRuntimeLogsOptions,\n): Promise<RuntimeLogRecallResult> => {\n const startedAt = Date.now();\n let latestProgress = '准备开始';\n const writeProgress = (message: string): void => {\n const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1_000);\n console.error(`[logs +${elapsedSeconds}s] ${message}`);\n };\n const progress = (message: string): void => {\n latestProgress = message;\n writeProgress(message);\n };\n const heartbeat = setInterval(() => {\n writeProgress(`仍在执行: ${latestProgress}`);\n }, 15_000);\n heartbeat.unref?.();\n\n try {\n progress('正在验证管理后台认证');\n const { api } = await resolveAdminContext(options);\n const ownerQuery = resolveOwnerQuery(options);\n const result = await recallComputerRuntimeLogs(\n {\n computer: computerSelector,\n from: options.from,\n ownerQuery,\n pollIntervalMs:\n parseIntegerOption(options.pollIntervalSeconds, '--poll-interval-seconds', 1, 60) *\n 1_000,\n range: options.range,\n timeoutMs:\n parseIntegerOption(options.timeoutSeconds, '--timeout-seconds', 1, 7_200) * 1_000,\n to: options.to,\n },\n {\n api,\n onProgress: progress,\n },\n );\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n logger.success(\n `日志召回完成: ${result.computer.displayName || result.computer.reportedName}`,\n );\n logger.info(`任务: ${result.task.taskId}`);\n logger.info(`临时产物: ${result.artifact.path}`);\n }\n return result;\n } finally {\n clearInterval(heartbeat);\n }\n};\n\nexport const registerAdminComputerCommand = (program: Command): void => {\n const computer = program\n .command('computer')\n .description('Query Tutti Computers and recall desktopd runtime logs');\n\n addAdminConnectionOptions(\n computer\n .command('list')\n .description('List Tutti Computers')\n .option('--query <query>', 'filter by Computer name')\n .option('--owner-query <query>', 'filter by owner username or email')\n .option('--username <username>', 'filter by owner username or email')\n .option('--connection <status>', 'all, online, or offline', 'all')\n .option('--platform <platform>', 'filter by platform')\n .option('--desktopd-version <version>', 'filter by desktopd version')\n .option('--page-size <number>', 'results per page, 1-50', '50')\n .option('--page-token <token>', 'continue from a previous nextPageToken'),\n ).action(runAdminComputerList);\n\n addAdminConnectionOptions(\n computer\n .command('detail')\n .description('Show one Tutti Computer')\n .requiredOption('--computer-id <computerId>', 'Computer ID'),\n ).action(runAdminComputerDetail);\n\n addAdminConnectionOptions(\n computer\n .command('logs')\n .description('Recall, wait for, and download desktopd logs in one command')\n .argument('[computer]', 'exact Computer name or Computer ID')\n .option('--owner-query <query>', 'resolve one online Computer by owner username or email')\n .option('--username <username>', 'resolve one online Computer by owner username or email')\n .option('--from <timestamp>', 'start of the suspicious interval; timezone is required')\n .option('--to <timestamp>', 'end of the suspicious interval; defaults to now')\n .option('--range <range>', 'explicit fallback range: 1h, 3h, 1d, 3d, or 14d')\n .option(\n '--timeout-seconds <seconds>',\n 'maximum time to wait, 1-7200',\n String(DEFAULT_RECALL_TIMEOUT_SECONDS),\n )\n .option(\n '--poll-interval-seconds <seconds>',\n 'task polling interval, 1-60',\n String(DEFAULT_RECALL_POLL_INTERVAL_SECONDS),\n ),\n ).action(async (computerSelector: string | undefined, options: AdminRuntimeLogsOptions) => {\n const ownerQuery = resolveOwnerQuery(options);\n if (Boolean(computerSelector?.trim()) === Boolean(ownerQuery)) {\n throw new CliError('Computer 名称/ID 与用户名/邮箱查询必须二选一', 1);\n }\n await runAdminRuntimeLogs(computerSelector, { ...options, ownerQuery, username: undefined });\n });\n\n const runtimeLog = computer\n .command('log-recall')\n .description('Create, inspect, and download desktopd runtime log recalls');\n\n addAdminConnectionOptions(\n runtimeLog\n .command('list')\n .description('List runtime log recall tasks for one Computer')\n .requiredOption('--computer-id <computerId>', 'Computer ID')\n .option('--page-size <number>', 'results per page, 1-50', '20')\n .option('--page-token <token>', 'continue from a previous nextPageToken'),\n ).action(runAdminRuntimeLogList);\n\n addAdminConnectionOptions(\n runtimeLog\n .command('get')\n .description('Show one runtime log recall task')\n .requiredOption('--computer-id <computerId>', 'Computer ID')\n .requiredOption('--task-id <taskId>', 'runtime log recall task ID'),\n ).action(runAdminRuntimeLogGet);\n\n addAdminConnectionOptions(\n runtimeLog\n .command('create')\n .description('Ask an online Computer to collect and upload desktopd runtime logs')\n .requiredOption('--computer-id <computerId>', 'Computer ID')\n .option('--range <range>', '1h, 3h, 1d, 3d, or 14d', '1h')\n .option('--wait', 'wait until the task is downloadable or failed')\n .option('--download', 'wait and download the completed archive')\n .option('--output <path>', 'archive output path; implies --download')\n .option('--force', 'overwrite an existing output file')\n .option(\n '--timeout-seconds <seconds>',\n 'maximum time to wait, 1-7200',\n String(DEFAULT_RECALL_TIMEOUT_SECONDS),\n )\n .option(\n '--poll-interval-seconds <seconds>',\n 'task polling interval, 1-60',\n String(DEFAULT_RECALL_POLL_INTERVAL_SECONDS),\n ),\n ).action(runAdminRuntimeLogCreate);\n\n addAdminConnectionOptions(\n runtimeLog\n .command('download')\n .description('Download a completed runtime log recall archive')\n .requiredOption('--computer-id <computerId>', 'Computer ID')\n .requiredOption('--task-id <taskId>', 'runtime log recall task ID')\n .option('--output <path>', 'archive output path; defaults to the server file name')\n .option('--force', 'overwrite an existing output file'),\n ).action(runAdminRuntimeLogDownload);\n};\n","import type { Command } from 'commander';\nimport { addAdminConnectionOptions, printAdminResult, resolveAdminContext, type AdminCommandOptions } from './shared.js';\n\nexport const runAdminHealth = async (options: AdminCommandOptions = {}): Promise<void> => {\n const { api } = await resolveAdminContext(options);\n printAdminResult(await api.health(), options);\n};\n\nexport const registerAdminSystemCommand = (program: Command): void => {\n const system = program.command('system').description('Query management backend system state');\n addAdminConnectionOptions(system.command('health').description('Check management backend health')).action(runAdminHealth);\n};\n","import type { Command } from 'commander';\nimport { registerAdminAppCommand } from './app.js';\nimport { registerAdminAuthCommand } from './auth.js';\nimport { registerAdminComputerCommand } from './computer.js';\nimport { registerAdminSystemCommand } from './system.js';\n\nexport const registerAdminCommand = (program: Command): void => {\n const admin = program.command('admin').description('Manage the Tutti administration backend');\n\n registerAdminAuthCommand(admin);\n registerAdminSystemCommand(admin);\n registerAdminAppCommand(admin);\n registerAdminComputerCommand(admin);\n};\n","import { CliError } from '../errors.js';\n\nexport class DataFinderApiError extends CliError {\n readonly apiCode: number | undefined;\n readonly body: unknown;\n readonly httpStatus: number;\n\n constructor(options: {\n apiCode?: number;\n body: unknown;\n httpStatus: number;\n label: string;\n message?: string;\n }) {\n const details = [\n `HTTP ${options.httpStatus}`,\n options.apiCode === undefined ? null : `code ${options.apiCode}`,\n options.message,\n ].filter(Boolean);\n super(`${options.label} failed: ${details.join(', ')}`, 1);\n this.name = 'DataFinderApiError';\n this.apiCode = options.apiCode;\n this.body = options.body;\n this.httpStatus = options.httpStatus;\n }\n}\n\nexport class DataFinderQueryError extends CliError {\n readonly failures: Array<{\n errorCode?: number | string | null;\n errorMessage?: string | null;\n queryId?: string;\n status?: string;\n traceId?: string;\n }>;\n\n constructor(failures: DataFinderQueryError['failures']) {\n const first = failures[0];\n super(\n `DataFinder query failed: ${first?.status ?? 'UNKNOWN'}${first?.errorMessage ? `, ${first.errorMessage}` : ''}`,\n 1,\n );\n this.name = 'DataFinderQueryError';\n this.failures = failures;\n }\n}\n","import datafinderSdk from '@datafinder/openapisdk';\nimport type { DataFinderRequestOptions } from './types.js';\n\ntype SdkResponse = {\n status: number;\n text(): Promise<string>;\n};\n\ntype RangersClientLike = {\n dataFinder(path: string, options: Record<string, unknown>): Promise<SdkResponse>;\n};\n\ntype RangersClientConstructor = new (\n accessKeyId: string,\n secretAccessKey: string,\n baseUrl?: string,\n) => RangersClientLike;\n\nconst sdk = datafinderSdk as unknown as { RangersClient: RangersClientConstructor };\n\nexport type DataFinderTransportResponse = {\n status: number;\n text: string;\n};\n\nexport type DataFinderTransport = {\n request(path: string, options: DataFinderRequestOptions): Promise<DataFinderTransportResponse>;\n};\n\nexport const createDataFinderSdkTransport = (options: {\n accessKeyId: string;\n baseUrl: string;\n secretAccessKey: string;\n}): DataFinderTransport => {\n const client = new sdk.RangersClient(\n options.accessKeyId,\n options.secretAccessKey,\n options.baseUrl,\n );\n\n return {\n request: async (path, requestOptions) => {\n const response = await client.dataFinder(path, {\n ...requestOptions,\n ...(requestOptions.body === undefined\n ? {}\n : {\n body:\n typeof requestOptions.body === 'string'\n ? requestOptions.body\n : JSON.stringify(requestOptions.body),\n }),\n });\n return { status: response.status, text: await response.text() };\n },\n };\n};\n","import { DataFinderApiError, DataFinderQueryError } from './errors.js';\nimport {\n createDataFinderSdkTransport,\n type DataFinderTransport,\n} from './sdk-adapter.js';\nimport type {\n DataFinderAnalysisItem,\n DataFinderApiPayload,\n DataFinderConnectionConfig,\n DataFinderConnectionSummary,\n DataFinderDashboard,\n DataFinderDashboardExport,\n DataFinderDashboardReports,\n DataFinderPublicConfig,\n DataFinderReport,\n DataFinderRequestOptions,\n} from './types.js';\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null;\n\nconst mapWithConcurrency = async <T, R>(\n values: T[],\n concurrency: number,\n mapper: (value: T) => Promise<R>,\n): Promise<R[]> => {\n const results = new Array<R>(values.length);\n let nextIndex = 0;\n\n const worker = async (): Promise<void> => {\n while (nextIndex < values.length) {\n const index = nextIndex;\n nextIndex += 1;\n results[index] = await mapper(values[index]);\n }\n };\n\n await Promise.all(\n Array.from({ length: Math.min(concurrency, values.length) }, async () => worker()),\n );\n return results;\n};\n\nexport class DataFinderClient {\n readonly publicConfig: DataFinderPublicConfig;\n private readonly transport: DataFinderTransport;\n\n constructor(config: DataFinderConnectionConfig, transport?: DataFinderTransport) {\n this.publicConfig = {\n appId: config.appId,\n baseUrl: config.baseUrl,\n defaultDashboardId: config.defaultDashboardId,\n pathMode: config.pathMode,\n projectId: config.projectId,\n timezone: config.timezone,\n };\n this.transport =\n transport ??\n createDataFinderSdkTransport({\n accessKeyId: config.accessKeyId,\n baseUrl: config.baseUrl,\n secretAccessKey: config.secretAccessKey,\n });\n }\n\n private get pathScope(): string {\n return this.publicConfig.pathMode === 'project'\n ? `projects/${this.publicConfig.projectId}`\n : this.publicConfig.appId;\n }\n\n async request<T>(\n path: string,\n options: DataFinderRequestOptions = {},\n label = `DataFinder request ${path}`,\n ): Promise<T> {\n if (!path.startsWith('/openapi/')) {\n throw new Error('DataFinder request path must start with /openapi/');\n }\n\n const response = await this.transport.request(path, options);\n let payload: DataFinderApiPayload<T>;\n try {\n payload = JSON.parse(response.text) as DataFinderApiPayload<T>;\n } catch {\n throw new DataFinderApiError({\n body: response.text.slice(0, 1_000),\n httpStatus: response.status,\n label,\n message: 'response was not JSON',\n });\n }\n\n if (response.status < 200 || response.status >= 300 || payload.code !== 200) {\n throw new DataFinderApiError({\n apiCode: payload.code,\n body: payload,\n httpStatus: response.status,\n label,\n message: payload.message,\n });\n }\n\n return payload.data as T;\n }\n\n async getDashboard(dashboardId = this.publicConfig.defaultDashboardId): Promise<DataFinderDashboard> {\n const dashboards = await this.request<Record<string, DataFinderDashboard>>(\n `/openapi/v1/${this.pathScope}/dashboards/${dashboardId}`,\n { method: 'GET' },\n 'query dashboard',\n );\n const dashboard = isRecord(dashboards) ? dashboards[dashboardId] : undefined;\n if (!isRecord(dashboard)) {\n throw new DataFinderApiError({\n body: dashboards,\n httpStatus: 200,\n label: 'query dashboard',\n message: `dashboard ${dashboardId} was missing or malformed in the response`,\n });\n }\n return dashboard as DataFinderDashboard;\n }\n\n async listDashboardReports(\n dashboardId = this.publicConfig.defaultDashboardId,\n ): Promise<DataFinderReport[]> {\n const dashboards = await this.request<Record<string, DataFinderDashboardReports>>(\n `/openapi/v1/${this.pathScope}/dashboards/${dashboardId}/reports`,\n { method: 'GET' },\n 'query dashboard reports',\n );\n const dashboard = isRecord(dashboards) ? dashboards[dashboardId] : undefined;\n const reports = isRecord(dashboard) ? dashboard.reports : undefined;\n if (\n !Array.isArray(reports) ||\n reports.some(\n (report) =>\n !isRecord(report) ||\n typeof report.report_id !== 'string' ||\n report.report_id.trim() === '',\n )\n ) {\n throw new DataFinderApiError({\n body: dashboards,\n httpStatus: 200,\n label: 'query dashboard reports',\n message: `reports for dashboard ${dashboardId} were missing or malformed`,\n });\n }\n return reports as DataFinderReport[];\n }\n\n async getReportData(reportId: string, count = 1_000): Promise<unknown> {\n if (!Number.isInteger(count) || count < 1 || count > 1_000) {\n throw new Error('report count must be an integer between 1 and 1000');\n }\n return this.request(\n `/openapi/v1/${this.pathScope}/reports/${reportId}`,\n { method: 'GET', params: { count } },\n `query report ${reportId}`,\n );\n }\n\n async analysis(dsl: unknown): Promise<DataFinderAnalysisItem[]> {\n if (!isRecord(dsl) || Object.keys(dsl).length === 0) {\n throw new Error('DataFinder analysis DSL must be a non-empty object');\n }\n const result = await this.request<DataFinderAnalysisItem[]>(\n '/openapi/v1/analysis',\n { body: dsl, method: 'POST' },\n 'run analysis',\n );\n const failures = result\n .filter((item) => item.result_status !== 'SUCCESS')\n .map((item) => ({\n errorCode: item.error_code,\n errorMessage: item.error_message,\n queryId: item.query_id,\n status: item.result_status,\n traceId: item.trace_id,\n }));\n if (failures.length > 0) {\n throw new DataFinderQueryError(failures);\n }\n return result;\n }\n\n async checkConnection(\n dashboardId = this.publicConfig.defaultDashboardId,\n ): Promise<DataFinderConnectionSummary> {\n const [dashboard, reports] = await Promise.all([\n this.getDashboard(dashboardId),\n this.listDashboardReports(dashboardId),\n ]);\n const queryableReport = reports.find(\n (report) => report.report_type !== 'rich_text' && report.report_type !== 'embed',\n );\n if (queryableReport) {\n await this.getReportData(queryableReport.report_id, 1);\n }\n return {\n dashboardId,\n dashboardName: typeof dashboard.name === 'string' ? dashboard.name : null,\n reportCount: reports.length,\n };\n }\n\n async exportDashboard(\n dashboardId = this.publicConfig.defaultDashboardId,\n count = 1_000,\n ): Promise<DataFinderDashboardExport> {\n const [dashboard, reports] = await Promise.all([\n this.getDashboard(dashboardId),\n this.listDashboardReports(dashboardId),\n ]);\n const reportResults = await mapWithConcurrency(reports, 4, async (report) => {\n if (report.report_type === 'rich_text' || report.report_type === 'embed') {\n return { report, source: 'embedded' as const, data: report.dsls ?? [] };\n }\n return {\n report,\n source: 'openapi' as const,\n data: await this.getReportData(report.report_id, count),\n };\n });\n return { dashboard, fetchedAt: new Date().toISOString(), reports: reportResults };\n }\n}\n","import type { CliConfig, DataFinderConfig } from '../config.js';\nimport { CliError } from '../errors.js';\nimport type { DataFinderConnectionConfig, DataFinderPathMode } from './types.js';\n\nconst required = (value: string | undefined, name: string): string => {\n const normalized = value?.trim();\n if (!normalized) {\n throw new CliError(\n `DataFinder ${name} 未配置,请先运行 nexight-devops onboard --set-mode datafinder`,\n 1,\n );\n }\n return normalized;\n};\n\nexport const parseDataFinderPathMode = (value: string | undefined): DataFinderPathMode => {\n const normalized = value?.trim() || 'project';\n if (normalized !== 'app' && normalized !== 'project') {\n throw new CliError('DataFinder pathMode 只支持 app 或 project', 1);\n }\n return normalized;\n};\n\nexport const normalizeDataFinderBaseUrl = (value: string): string => {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new CliError('DataFinder baseUrl 必须是合法的 HTTPS URL', 1);\n }\n\n if (\n url.protocol !== 'https:' ||\n url.username ||\n url.password ||\n url.search ||\n url.hash ||\n (url.pathname !== '/' && url.pathname !== '')\n ) {\n throw new CliError(\n 'DataFinder baseUrl 必须是仅包含 origin 的 HTTPS URL,不能包含凭证、路径、查询或锚点',\n 1,\n );\n }\n return url.origin;\n};\n\nexport const resolveDataFinderConfig = (config: CliConfig): DataFinderConnectionConfig => {\n const stored = config.datafinder;\n return {\n accessKeyId: required(process.env.DATAFINDER_AK ?? stored?.accessKeyId, 'AccessKeyId'),\n appId: required(process.env.DATAFINDER_APP_ID ?? stored?.appId, 'appId'),\n baseUrl: normalizeDataFinderBaseUrl(\n required(process.env.DATAFINDER_BASE_URL ?? stored?.baseUrl, 'baseUrl'),\n ),\n defaultDashboardId: required(\n process.env.DATAFINDER_DASHBOARD_ID ?? stored?.defaultDashboardId,\n 'defaultDashboardId',\n ),\n pathMode: parseDataFinderPathMode(\n process.env.DATAFINDER_PATH_MODE ?? stored?.pathMode,\n ),\n projectId: required(process.env.DATAFINDER_PROJECT_ID ?? stored?.projectId, 'projectId'),\n secretAccessKey: required(\n process.env.DATAFINDER_SK ?? stored?.secretAccessKey,\n 'SecretAccessKey',\n ),\n timezone: required(process.env.DATAFINDER_TIMEZONE ?? stored?.timezone, 'timezone'),\n };\n};\n\nexport const toStoredDataFinderConfig = (\n config: DataFinderConnectionConfig,\n): DataFinderConfig => ({ ...config });\n","import type { Command } from 'commander';\nimport { loadConfig } from '../../lib/config.js';\nimport { DataFinderClient } from '../../lib/datafinder/client.js';\nimport { resolveDataFinderConfig } from '../../lib/datafinder/config.js';\nimport { logger } from '../../lib/logger.js';\nimport { writePrivateFile } from '../../lib/private-file.js';\n\nexport type DataFinderOutputOptions = {\n output?: string;\n};\n\nexport type DataFinderContext = {\n client: DataFinderClient;\n};\n\nexport const resolveDataFinderContext = async (): Promise<DataFinderContext> => {\n const config = resolveDataFinderConfig(await loadConfig());\n return { client: new DataFinderClient(config) };\n};\n\nexport const addDataFinderOutputOptions = (command: Command): Command =>\n command.option('--output <path>', 'write JSON output to a file with mode 0600');\n\nexport const parseReportCount = (value: string | undefined): number => {\n if (value === undefined) {\n return 1_000;\n }\n const count = Number(value);\n if (!Number.isInteger(count) || count < 1 || count > 1_000) {\n throw new Error('--count must be an integer between 1 and 1000');\n }\n return count;\n};\n\nexport const printDataFinderResult = async (\n value: unknown,\n options: DataFinderOutputOptions = {},\n): Promise<void> => {\n const output = `${JSON.stringify(value, null, 2) ?? String(value)}\\n`;\n if (options.output) {\n await writePrivateFile(options.output, output);\n logger.success(`DataFinder 查询结果已写入 ${options.output}`);\n return;\n }\n console.log(output.trimEnd());\n};\n","import type { Command } from 'commander';\nimport { printDataFinderResult, resolveDataFinderContext } from './shared.js';\n\nexport const runDataFinderAuthCheck = async (): Promise<void> => {\n const { client } = await resolveDataFinderContext();\n await printDataFinderResult({\n ...(await client.checkConnection()),\n baseUrl: client.publicConfig.baseUrl,\n projectId: client.publicConfig.projectId,\n });\n};\n\nexport const registerDataFinderAuthCommand = (program: Command): void => {\n program\n .command('auth')\n .description('Validate configured DataFinder OpenAPI credentials and access')\n .command('check')\n .description('Check dashboard and report access')\n .action(runDataFinderAuthCheck);\n};\n","import type { Command } from 'commander';\nimport {\n addDataFinderOutputOptions,\n parseReportCount,\n printDataFinderResult,\n resolveDataFinderContext,\n type DataFinderOutputOptions,\n} from './shared.js';\n\ntype DashboardOptions = DataFinderOutputOptions & { count?: string };\n\nexport const runDataFinderDashboardGet = async (\n dashboardId: string | undefined,\n options: DataFinderOutputOptions,\n): Promise<void> => {\n const { client } = await resolveDataFinderContext();\n await printDataFinderResult(await client.getDashboard(dashboardId), options);\n};\n\nexport const runDataFinderDashboardExport = async (\n dashboardId: string | undefined,\n options: DashboardOptions,\n): Promise<void> => {\n const { client } = await resolveDataFinderContext();\n await printDataFinderResult(\n await client.exportDashboard(dashboardId, parseReportCount(options.count)),\n options,\n );\n};\n\nexport const registerDataFinderDashboardCommand = (program: Command): void => {\n const dashboard = program.command('dashboard').description('Query DataFinder dashboards');\n addDataFinderOutputOptions(\n dashboard\n .command('get')\n .description('Get dashboard metadata')\n .argument('[dashboardId]', 'defaults to the configured dashboard'),\n ).action(runDataFinderDashboardGet);\n addDataFinderOutputOptions(\n dashboard\n .command('export')\n .description('Export dashboard metadata and all report data')\n .argument('[dashboardId]', 'defaults to the configured dashboard')\n .option('--count <number>', 'maximum rows per report, 1-1000'),\n ).action(runDataFinderDashboardExport);\n};\n","import type { DataFinderClient } from './client.js';\nimport type { DataFinderReport } from './types.js';\n\nexport const DATAFINDER_BUILTIN_QUERIES = {\n 'p2p-health': {\n description: 'P2P 连接、失败、耗时与 Direct 探测指标',\n reports: [\n { id: '7673353793798422016', name: 'P2P 连接结果分布' },\n { id: '7673354540606823168', name: 'P2P 失败阶段与原因下钻' },\n { id: '7673354798632016640', name: 'P2P 路径 Ready 时长占比' },\n { id: '7673355100085033728', name: 'P2P 中断与恢复稳定性' },\n { id: '7673355557415171328', name: 'P2P 连接 P95 耗时' },\n { id: '7673355789829944576', name: 'Direct P2P 探测结果与原因' },\n ],\n },\n 'shared-agent-summary': {\n description: 'Shared Agent 阶段、结果、失败与上报端汇总',\n reports: [\n { id: '7672717280358176768', name: 'Shared Agent 阶段事件量' },\n { id: '7672720204652093184', name: 'Shared Agent 阶段覆盖分布' },\n { id: '7672720756710579968', name: 'Shared Agent 权威终态分布' },\n {\n id: '7672722222296859648',\n name: 'Shared Agent 失败原因(按 invocation 去重,跨原因可重复)',\n },\n { id: '7672723780816346880', name: 'Shared Agent 各阶段 P95 耗时' },\n { id: '7672724264134383616', name: 'Shared Agent 上报端分布' },\n { id: '7673163268139001344', name: 'Shared Agent desktopd 版本事件量' },\n { id: '7673170194381940224', name: 'Shared Agent 失败阶段分布' },\n { id: '7673170784805725696', name: 'Shared Agent 失败观测角色分布' },\n { id: '7673172139431696896', name: 'Shared Agent 失败事件上报端' },\n ],\n },\n} as const;\n\nexport type DataFinderBuiltinQueryName = keyof typeof DATAFINDER_BUILTIN_QUERIES;\n\nconst isEmbeddedReport = (report: DataFinderReport): boolean =>\n report.report_type === 'rich_text' || report.report_type === 'embed';\n\nexport const runDataFinderBuiltinQuery = async (\n client: DataFinderClient,\n name: DataFinderBuiltinQueryName,\n options: { count?: number; dashboardId?: string } = {},\n): Promise<unknown> => {\n const definition = DATAFINDER_BUILTIN_QUERIES[name];\n const dashboardId = options.dashboardId ?? client.publicConfig.defaultDashboardId;\n const reports = await client.listDashboardReports(dashboardId);\n const resolvedReports: DataFinderReport[] = [];\n const missing: string[] = [];\n for (const expected of definition.reports) {\n const idMatches = reports.filter((report) => report.report_id === expected.id);\n if (idMatches.length > 1) {\n throw new Error(`DataFinder 看板存在重复 report ID: ${expected.id}`);\n }\n if (idMatches.length === 1) {\n resolvedReports.push(idMatches[0]);\n continue;\n }\n\n const nameMatches = reports.filter((report) => report.report_name === expected.name);\n if (nameMatches.length > 1) {\n throw new Error(`DataFinder 看板存在同名固定查询报表: ${expected.name}`);\n }\n if (nameMatches.length === 1) {\n resolvedReports.push(nameMatches[0]);\n } else {\n missing.push(`${expected.name} (${expected.id})`);\n }\n }\n if (missing.length > 0) {\n throw new Error(`DataFinder 看板缺少固定查询所需报表: ${missing.join(', ')}`);\n }\n\n const results = [];\n for (const report of resolvedReports) {\n results.push({\n report,\n source: isEmbeddedReport(report) ? 'embedded' : 'openapi',\n data: isEmbeddedReport(report)\n ? (report.dsls ?? [])\n : await client.getReportData(report.report_id, options.count),\n });\n }\n\n return {\n dashboardId,\n description: definition.description,\n fetchedAt: new Date().toISOString(),\n query: name,\n reports: results,\n };\n};\n","import { stat } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type { DataFinderClient } from './client.js';\nimport type { DataFinderPublicConfig } from './types.js';\n\nexport type DataFinderQueryContext = {\n args: string[];\n client: DataFinderClient;\n config: DataFinderPublicConfig;\n};\n\ntype DataFinderQueryFunction = (context: DataFinderQueryContext) => unknown | Promise<unknown>;\n\nexport const executeDataFinderScript = async (\n scriptPath: string,\n context: DataFinderQueryContext,\n): Promise<unknown> => {\n const absolutePath = resolve(scriptPath);\n const scriptStat = await stat(absolutePath);\n if (!scriptStat.isFile()) {\n throw new Error(`DataFinder query script is not a file: ${absolutePath}`);\n }\n if (!/\\.(?:cjs|js|mjs)$/.test(absolutePath)) {\n throw new Error('DataFinder query script must use a .js, .mjs, or .cjs extension');\n }\n\n const module = (await import(pathToFileURL(absolutePath).href)) as {\n default?: unknown;\n };\n if (typeof module.default !== 'function') {\n throw new Error('DataFinder query script must default-export a function');\n }\n\n return (module.default as DataFinderQueryFunction)(context);\n};\n","import type { Command } from 'commander';\nimport {\n DATAFINDER_BUILTIN_QUERIES,\n runDataFinderBuiltinQuery,\n type DataFinderBuiltinQueryName,\n} from '../../lib/datafinder/builtin-queries.js';\nimport { executeDataFinderScript } from '../../lib/datafinder/script-runner.js';\nimport {\n addDataFinderOutputOptions,\n parseReportCount,\n printDataFinderResult,\n resolveDataFinderContext,\n type DataFinderOutputOptions,\n} from './shared.js';\n\ntype BuiltinOptions = DataFinderOutputOptions & {\n count?: string;\n dashboardId?: string;\n};\n\nexport const runDataFinderScript = async (\n script: string,\n scriptArgs: string[],\n options: DataFinderOutputOptions,\n): Promise<void> => {\n const { client } = await resolveDataFinderContext();\n await printDataFinderResult(\n await executeDataFinderScript(script, {\n args: scriptArgs,\n client,\n config: client.publicConfig,\n }),\n options,\n );\n};\n\nexport const runBuiltin = async (\n name: DataFinderBuiltinQueryName,\n options: BuiltinOptions,\n): Promise<void> => {\n const { client } = await resolveDataFinderContext();\n await printDataFinderResult(\n await runDataFinderBuiltinQuery(client, name, {\n count: parseReportCount(options.count),\n dashboardId: options.dashboardId,\n }),\n options,\n );\n};\n\nexport const registerDataFinderQueryCommand = (program: Command): void => {\n const query = program.command('query').description('Run DataFinder queries');\n\n addDataFinderOutputOptions(\n query\n .command('exec')\n .description('Execute a trusted local JavaScript query module')\n .argument('<script>', 'path to a .js, .mjs, or .cjs module')\n .argument('[scriptArgs...]', 'arguments exposed to the query module'),\n ).action(runDataFinderScript);\n\n for (const [name, definition] of Object.entries(DATAFINDER_BUILTIN_QUERIES)) {\n addDataFinderOutputOptions(\n query\n .command(name)\n .description(definition.description)\n .option('--dashboard-id <id>', 'override the configured dashboard')\n .option('--count <number>', 'maximum result rows per report, 1-1000'),\n ).action((options: BuiltinOptions) =>\n runBuiltin(name as DataFinderBuiltinQueryName, options),\n );\n }\n};\n","import type { Command } from 'commander';\nimport {\n addDataFinderOutputOptions,\n parseReportCount,\n printDataFinderResult,\n resolveDataFinderContext,\n type DataFinderOutputOptions,\n} from './shared.js';\n\ntype ReportOptions = DataFinderOutputOptions & { count?: string };\n\nexport const runDataFinderReportList = async (\n dashboardId: string | undefined,\n options: DataFinderOutputOptions,\n): Promise<void> => {\n const { client } = await resolveDataFinderContext();\n await printDataFinderResult(await client.listDashboardReports(dashboardId), options);\n};\n\nexport const runDataFinderReportGet = async (\n reportId: string,\n options: ReportOptions,\n): Promise<void> => {\n const { client } = await resolveDataFinderContext();\n await printDataFinderResult(\n await client.getReportData(reportId, parseReportCount(options.count)),\n options,\n );\n};\n\nexport const registerDataFinderReportCommand = (program: Command): void => {\n const report = program.command('report').description('Query DataFinder reports');\n addDataFinderOutputOptions(\n report\n .command('list')\n .description('List reports in a dashboard')\n .argument('[dashboardId]', 'defaults to the configured dashboard'),\n ).action(runDataFinderReportList);\n addDataFinderOutputOptions(\n report\n .command('get')\n .description('Get report definition and data')\n .argument('<reportId>')\n .option('--count <number>', 'maximum result rows, 1-1000'),\n ).action(runDataFinderReportGet);\n};\n","import type { Command } from 'commander';\nimport { registerDataFinderAuthCommand } from './auth.js';\nimport { registerDataFinderDashboardCommand } from './dashboard.js';\nimport { registerDataFinderQueryCommand } from './query.js';\nimport { registerDataFinderReportCommand } from './report.js';\n\nexport const registerDataFinderCommand = (program: Command): void => {\n const datafinder = program\n .command('datafinder')\n .description('Query Volcengine DataFinder through OpenAPI');\n registerDataFinderAuthCommand(datafinder);\n registerDataFinderDashboardCommand(datafinder);\n registerDataFinderReportCommand(datafinder);\n registerDataFinderQueryCommand(datafinder);\n};\n","import type { Command } from 'commander';\nimport { logger } from '../lib/logger.js';\n\nexport const registerDoctorCommand = (program: Command): void => {\n program\n .command('doctor')\n .description('Run a local readiness check for the CLI shell')\n .action(() => {\n logger.step('Running basic readiness checks');\n logger.success('nexight-devops is ready');\n });\n};\n","export const DEFAULT_DATAFINDER_BASE_URL = 'https://analytics.volcengineapi.com';\nexport const DEFAULT_DATAFINDER_TIMEZONE = 'Asia/Shanghai';\n\nexport type DataFinderPathMode = 'app' | 'project';\n\nexport type DataFinderRequestOptions = {\n body?: unknown;\n method?: 'DELETE' | 'GET' | 'PATCH' | 'POST' | 'PUT';\n params?: Record<string, boolean | number | string>;\n};\n\nexport type DataFinderApiPayload<T = unknown> = {\n code?: number;\n data?: T;\n message?: string;\n};\n\nexport type DataFinderDashboard = {\n app_id?: number | string;\n dashboard_id?: string;\n name?: string;\n [key: string]: unknown;\n};\n\nexport type DataFinderReport = {\n dsls?: unknown[];\n report_id: string;\n report_name?: string;\n report_type?: string;\n [key: string]: unknown;\n};\n\nexport type DataFinderDashboardReports = {\n reports?: DataFinderReport[];\n [key: string]: unknown;\n};\n\nexport type DataFinderAnalysisItem = {\n data_item_list?: unknown[];\n date_index_list?: string[];\n error_code?: number | string | null;\n error_message?: string | null;\n query_id?: string;\n result_status?: string;\n trace_id?: string;\n [key: string]: unknown;\n};\n\nexport type DataFinderConnectionConfig = {\n accessKeyId: string;\n appId: string;\n baseUrl: string;\n defaultDashboardId: string;\n pathMode: DataFinderPathMode;\n projectId: string;\n secretAccessKey: string;\n timezone: string;\n};\n\nexport type DataFinderPublicConfig = Omit<\n DataFinderConnectionConfig,\n 'accessKeyId' | 'secretAccessKey'\n>;\n\nexport type DataFinderConnectionSummary = {\n dashboardId: string;\n dashboardName: string | null;\n reportCount: number;\n};\n\nexport type DataFinderDashboardExport = {\n dashboard: DataFinderDashboard;\n fetchedAt: string;\n reports: Array<{\n data: unknown;\n report: DataFinderReport;\n source: 'embedded' | 'openapi';\n }>;\n};\n","export const zhCN = {\n common: {\n continue: '继续',\n skip: '跳过',\n },\n errors: {\n missingAws: '未检测到 aws,请先完成 AWS CLI 安装。',\n missingGh: '未检测到 gh,请先完成 GitHub CLI 安装。',\n },\n onboard: {\n adminLoginSucceeded: '管理后台登录成功',\n adminSection: '管理后台登录设置',\n adminTokenRequired: '管理后台 Token 不能为空',\n awsSection: 'AWS CLI 设置',\n complete: 'Onboard 完成',\n chooseAwsProfile: '请选择默认 AWS Profile',\n chooseLocale: '请选择命令行语言',\n datafinderAppPathMode: '应用路径(传统 SaaS / 私有化)',\n datafinderCredentialAction: '已配置 DataFinder 凭证,请选择处理方式',\n datafinderKeepCredentials: '保留现有凭证',\n datafinderProjectPathMode: '项目路径(SaaS 云原生,推荐)',\n datafinderReplaceCredentials: '重新输入凭证',\n datafinderSection: 'DataFinder OpenAPI 设置',\n datafinderSucceeded: 'DataFinder 连接成功:{dashboardName},共 {reportCount} 个报表',\n enterGhToken: '请输入 GitHub Token',\n enterAdminToken: '请输入 Tutti 管理后台 Token',\n enterDataFinderAk: '请输入 DataFinder AccessKeyId',\n enterDataFinderAppId: '请输入 DataFinder 应用 ID',\n enterDataFinderDashboardId: '请输入默认 DataFinder 看板 ID',\n enterDataFinderProjectId: '请输入 DataFinder 项目 ID',\n enterDataFinderSk: '请输入 DataFinder SecretAccessKey',\n enterDataFinderTimezone: '请输入 DataFinder 查询时区',\n enterDataFinderUrl: '请输入 DataFinder OpenAPI 地址',\n ghInstallDeferred: '未完成 gh 安装。你可以稍后运行 nexight-devops onboard --set-mode gh',\n ghLoginToken: '使用 Token',\n ghLoginWeb: '浏览器登录(推荐)',\n ghSection: 'GitHub CLI 设置',\n installAwsPrompt: '未检测到 aws,是否现在尝试安装?',\n installBrewFailed: 'Homebrew 安装失败,请稍后手动重试。',\n installBrewPrompt: '未检测到 Homebrew,是否现在尝试安装?',\n installGhPrompt: '未检测到 gh,是否现在尝试安装?',\n installManualPrefix: '请先安装 Homebrew,再执行',\n selectDataFinderPathMode: '请选择 DataFinder OpenAPI 路径模式',\n selectGhLoginMode: '请选择 GitHub 登录方式',\n skipGhSetup: '跳过 GitHub CLI 设置',\n skipAdminSetup: '跳过管理后台登录设置',\n skipAwsSetup: '跳过 AWS CLI 设置',\n skipDataFinderSetup: '跳过 DataFinder OpenAPI 设置',\n awsInstallDeferred: '未完成 AWS CLI 安装。你可以稍后运行 nexight-devops onboard --set-mode aws',\n title: '开始初始化 nexight-devops',\n },\n release: {\n common: {\n approvalIssueUrl: '审批单地址: {approvalIssueUrl}',\n candidateTag: '候选版本: {candidateTag}',\n controlRunUrl: '控制面运行地址: {controlRunUrl}',\n releaseBranch: '发布分支: {releaseBranch}',\n releaseProfile: '发布 Profile: {releaseProfile}',\n targetRepo: '目标仓库: {targetRepo}',\n },\n approve: {\n approvalIssueMissing: '未找到可审批的发布单,请重新选择目标仓库或检查控制面状态。',\n approvalWorkflowRunUrl: '审批工作流地址: {approvalWorkflowRunUrl}',\n cancelled: '已取消 release approve。',\n commenting: '正在对发布单 #{issueNumber} 执行 /release-approve',\n closeIssueWarning: '审批单 #{issueNumber} 自动关闭失败,请稍后手动关闭。',\n confirm: '确认对发布单 #{issueNumber}({candidateTag} / {releaseBranch})执行 /release-approve?',\n feishuReminder: '飞书提醒:正式发版已开始,请立即关注飞书群,持续跟进发布状态。',\n noPendingIssues: '当前没有待审批的发布单,目标仓库 {targetRepo} 暂无可处理项。',\n selectApprovalIssue: '请选择要审批的发布单',\n selectTarget: '请选择要审批的仓库',\n success: 'release approve 已完成,正式发版已开始',\n workflowFailed: '审批工作流执行失败,请打开审批工作流运行查看详情: {approvalWorkflowRunUrl}',\n },\n hotfix: {\n allowUnmergedHotfix: '是否允许 release 分支上的补丁尚未被 main 吸收时直接发起 hotfix?',\n approvalIssueAmbiguous:\n '检测到多个新的 hotfix 审批单,请检查以下候选项: {candidateIssueUrls};控制面运行: {controlRunUrl}',\n approvalIssueMissing: '未找到新创建的 hotfix 审批单,请打开控制面运行查看详情: {controlRunUrl}',\n cancelled: '已取消 release hotfix。',\n confirm: '确认对 {repoName} 发起 hotfix,分支 {releaseBranch}?',\n dispatching: '正在准备 hotfix: {repoName}',\n enterReleaseBranch: '请输入 hotfix 的 release 分支(必须以 release/ 开头)',\n feishuReminder:\n '飞书提醒:自测发版通知已发送到飞书群,请关注飞书群并完成验证,随后执行 nexight-devops release approve。',\n invalidReleaseBranch: 'release 分支必须是 release/<name> 格式。',\n nextSteps: '下一步:完成验证后,执行 nexight-devops release approve。',\n overrideMode: 'Override 模式: {overrideMode}',\n overrideModeDisabled: '未开启',\n overrideModeEnabled: '已开启',\n overrideReason: '请输入 release 分支上的补丁尚未被 main 吸收时继续 hotfix 的原因',\n overrideReasonRequired: '开启 release 分支补丁 override 时必须填写原因。',\n workflowFailureReason: '失败原因: {failureMessage}',\n selectTarget: '请选择要执行 hotfix 的仓库',\n success: 'release hotfix 已完成',\n waiting: '控制面 hotfix 工作流已触发,正在等待完成: {repoName}',\n workflowFailed: 'controlled-hotfix-release 工作流执行失败,请打开控制面运行查看详情: {controlRunUrl}',\n },\n prepare: {\n approvalIssueAmbiguous:\n '检测到多个新的发布审批单,请检查以下候选项: {candidateIssueUrls};控制面运行: {controlRunUrl}',\n approvalIssueMissing: '未找到新创建的发布审批单,请打开控制面运行查看详情: {controlRunUrl}',\n cancelled: '已取消 release prepare。',\n confirm: '确认对 {repoName} 执行 release prepare?',\n dispatching: '正在准备发布: {repoName}',\n feishuReminder:\n '飞书提醒:自测发版通知已发送到飞书群,请关注飞书群并完成验证,随后执行 nexight-devops release approve。',\n nextSteps: '下一步:完成验证后,执行 nexight-devops release approve。',\n selectTarget: '请选择要准备发布的仓库',\n success: 'release prepare 已完成',\n waiting: '控制面发布工作流已触发,正在等待完成: {repoName}',\n workflowFailed: 'controlled-release 工作流执行失败,请打开控制面运行查看详情: {controlRunUrl}',\n },\n },\n ppeLane: {\n destroy: {\n atLeastOneRepo: '至少选择一个仓库',\n blankLane: 'PPE lane 名称不能为空',\n cancelled: '已取消销毁',\n confirmLane: '这是销毁操作,请再次输入 {lane} 确认',\n enterLane: '请输入需要移除的 PPE lane 名称',\n failed: '一个或多个 PPE lane 销毁工作流执行失败',\n noRecords: '该 ppe-lane 没查询到任何部署记录',\n running: '正在销毁 lane {lane}',\n selectRepos: '请选择需要销毁的仓库',\n skippedReason: 'Cloud Map 中未找到部署记录',\n warning: '将销毁以下仓库: {repos}',\n },\n },\n versionUpdate: {\n alreadyLatest: '当前已是最新版本 {currentVersion}。',\n available: '检测到新版本 {latestVersion},当前版本为 {currentVersion}。',\n checkingRegistry: '正在检查版本信息',\n detectingInstallSource: '正在检测安装来源',\n majorRequired: '检测到大版本更新 {latestVersion},当前版本 {currentVersion} 必须先升级后再继续。',\n manualUpgrade: '无法识别当前安装来源,请手动执行以下任一升级命令:\\n{commands}',\n optionalUpgradeFailed: '自动升级失败,本次继续使用当前版本。你可以稍后手动执行:{command}',\n registryCheckFailed: '版本检查失败,已继续执行当前命令。',\n registryCheckFailedManual: '版本检查失败,请稍后重试。',\n rerun: '升级完成后请重新执行刚才的命令。',\n selectAction: '检测到可用更新,是否现在升级?',\n skipThisRun: '跳过本次',\n skippedForRun: '已跳过本次升级,继续执行当前命令。',\n upgradeFailed: '自动升级失败,请先手动执行:{command}',\n upgradeNow: '立即升级',\n upgradeSucceeded: 'CLI 已更新到最新版本 {latestVersion}。',\n upgrading: '正在执行升级命令:{command}',\n },\n} as const;\n","import { zhCN } from '../locales/zh-CN.js';\n\nconst locales = {\n 'zh-CN': zhCN,\n} as const;\n\ntype InterpolationValue = number | string;\ntype InterpolationValues = Record<string, InterpolationValue>;\n\nconst getNestedValue = (source: unknown, key: string): string => {\n const value = key.split('.').reduce<unknown>((current, part) => {\n if (current && typeof current === 'object' && part in current) {\n return (current as Record<string, unknown>)[part];\n }\n\n return undefined;\n }, source);\n\n return typeof value === 'string' ? value : key;\n};\n\nconst interpolate = (message: string, values?: InterpolationValues): string => {\n if (!values) {\n return message;\n }\n\n return message.replace(/\\{(\\w+)\\}/g, (placeholder, key: string) => {\n const value = values[key];\n if (value === undefined) {\n return placeholder;\n }\n\n return String(value);\n });\n};\n\nexport const createI18n = (locale: string) => {\n const messages = locales[locale as keyof typeof locales];\n\n return (key: string, values?: InterpolationValues): string => {\n const messageFromLocale = messages ? getNestedValue(messages, key) : key;\n const message = messageFromLocale === key ? getNestedValue(zhCN, key) : messageFromLocale;\n\n return interpolate(message, values);\n };\n};\n","import { execa, type Options } from 'execa';\n\nexport type RunCommandOptions = Omit<Options, 'reject'>;\n\nexport type RunCommandResult = {\n exitCode: number;\n stderr: string;\n stdout: string;\n};\n\nexport const runCommand = async (\n command: string,\n args: string[] = [],\n options: RunCommandOptions = {},\n): Promise<RunCommandResult> => {\n const result = await execa(command, args, {\n ...options,\n reject: false,\n });\n\n return {\n exitCode: result.exitCode ?? 1,\n stderr: String(result.stderr ?? ''),\n stdout: String(result.stdout ?? ''),\n };\n};\n","import type { Command } from 'commander';\nimport { AdminApi, normalizeAdminApiOrigin } from '../lib/admin-api.js';\nimport { loadConfig, saveConfig } from '../lib/config.js';\nimport { DataFinderClient } from '../lib/datafinder/client.js';\nimport {\n normalizeDataFinderBaseUrl,\n parseDataFinderPathMode,\n toStoredDataFinderConfig,\n} from '../lib/datafinder/config.js';\nimport {\n DEFAULT_DATAFINDER_BASE_URL,\n DEFAULT_DATAFINDER_TIMEZONE,\n type DataFinderConnectionConfig,\n} from '../lib/datafinder/types.js';\nimport { CliError } from '../lib/errors.js';\nimport { createI18n } from '../lib/i18n.js';\nimport { logger } from '../lib/logger.js';\nimport { runCommand } from '../lib/shell.js';\nimport { ui } from '../lib/ui.js';\n\ntype OnboardMode = 'all' | 'admin' | 'aws' | 'datafinder' | 'gh' | 'locale';\n\ntype OnboardOptions = {\n adminUrl?: string;\n datafinderAppId?: string;\n datafinderDashboardId?: string;\n datafinderPathMode?: string;\n datafinderProjectId?: string;\n datafinderUrl?: string;\n setMode?: OnboardMode;\n};\n\ntype Translate = ReturnType<typeof createI18n>;\n\nconst onboardModes: OnboardMode[] = ['all', 'admin', 'aws', 'datafinder', 'gh', 'locale'];\n\nconst resolveBrewCommand = async (): Promise<string | null> => {\n const result = await runCommand('/bin/bash', [\n '-lc',\n 'command -v brew || { [ -x /opt/homebrew/bin/brew ] && printf /opt/homebrew/bin/brew; } || { [ -x /usr/local/bin/brew ] && printf /usr/local/bin/brew; }',\n ]);\n\n const brewPath = result.stdout.trim();\n return brewPath ? brewPath : null;\n};\n\nconst installHomebrew = async (): Promise<boolean> => {\n const result = await runCommand(\n '/bin/bash',\n [\n '-lc',\n '/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"',\n ],\n { stdio: 'inherit' },\n );\n\n return result.exitCode === 0;\n};\n\nconst ensureBrewPackage = async (packageName: string, t: Translate): Promise<boolean> => {\n let brewCommand = await resolveBrewCommand();\n if (!brewCommand) {\n const shouldInstallBrew = await ui.confirm({\n message: t('onboard.installBrewPrompt'),\n default: true,\n });\n\n if (!shouldInstallBrew) {\n logger.warn(`${t('onboard.installManualPrefix')} brew install ${packageName}`);\n return false;\n }\n\n if (!(await installHomebrew())) {\n logger.warn(t('onboard.installBrewFailed'));\n return false;\n }\n\n brewCommand = await resolveBrewCommand();\n if (!brewCommand) {\n logger.warn(t('onboard.installBrewFailed'));\n return false;\n }\n }\n\n const installResult = await runCommand(brewCommand, ['install', packageName], { stdio: 'inherit' });\n return installResult.exitCode === 0;\n};\n\nconst ensureGhInstalled = async (t: Translate): Promise<boolean> => {\n const ghVersion = await runCommand('gh', ['--version']);\n if (ghVersion.exitCode === 0) {\n return true;\n }\n\n if (process.platform === 'darwin') {\n const shouldInstall = await ui.confirm({ message: t('onboard.installGhPrompt'), default: true });\n if (shouldInstall) {\n return ensureBrewPackage('gh', t);\n }\n }\n\n logger.warn(t('onboard.ghInstallDeferred'));\n return false;\n};\n\nconst ensureAwsInstalled = async (t: Translate): Promise<boolean> => {\n const awsVersion = await runCommand('aws', ['--version']);\n if (awsVersion.exitCode === 0) {\n return true;\n }\n\n if (process.platform === 'darwin') {\n const shouldInstall = await ui.confirm({ message: t('onboard.installAwsPrompt'), default: true });\n if (shouldInstall) {\n return ensureBrewPackage('awscli', t);\n }\n }\n\n logger.warn(t('onboard.awsInstallDeferred'));\n return false;\n};\n\nconst runGhSetup = async (t: Translate): Promise<boolean> => {\n if (!(await ensureGhInstalled(t))) {\n return false;\n }\n\n const authStatus = await runCommand('gh', ['auth', 'status']);\n if (authStatus.exitCode === 0) {\n return true;\n }\n\n const loginMode = await ui.select({\n message: t('onboard.selectGhLoginMode'),\n choices: [\n { value: 'web', name: t('onboard.ghLoginWeb') },\n { value: 'token', name: t('onboard.ghLoginToken') },\n ],\n });\n\n if (loginMode === 'web') {\n await runCommand('gh', ['auth', 'login', '--web'], { stdio: 'inherit' });\n } else {\n const token = await ui.password({ message: t('onboard.enterGhToken') });\n await runCommand('gh', ['auth', 'login', '--with-token'], {\n input: token,\n });\n }\n\n return (await runCommand('gh', ['auth', 'status'])).exitCode === 0;\n};\n\nconst runAwsSetup = async (\n defaultProfile: string,\n t: Translate,\n): Promise<{ configured: boolean; profile: string }> => {\n if (!(await ensureAwsInstalled(t))) {\n return {\n profile: defaultProfile,\n configured: false,\n };\n }\n\n const profile = await ui.input({\n message: t('onboard.chooseAwsProfile'),\n default: defaultProfile,\n });\n\n const listProfiles = await runCommand('aws', ['configure', 'list-profiles']);\n const profiles = listProfiles.stdout.split('\\n').map((item) => item.trim()).filter(Boolean);\n\n if (!profiles.includes(profile)) {\n await runCommand('aws', ['configure', 'sso', '--profile', profile], { stdio: 'inherit' });\n }\n\n const loginResult = await runCommand('aws', ['sso', 'login', '--profile', profile], { stdio: 'inherit' });\n if (loginResult.exitCode !== 0) {\n return {\n profile,\n configured: false,\n };\n }\n\n const identityResult = await runCommand('aws', [\n 'sts',\n 'get-caller-identity',\n '--profile',\n profile,\n '--output',\n 'json',\n ]);\n\n return {\n profile,\n configured: identityResult.exitCode === 0,\n };\n};\n\nconst runAdminSetup = async (config: Awaited<ReturnType<typeof loadConfig>>, options: OnboardOptions, t: Translate): Promise<void> => {\n const apiOrigin = normalizeAdminApiOrigin(options.adminUrl ?? config.admin?.apiOrigin);\n const token = (await ui.password({ message: t('onboard.enterAdminToken') })).trim();\n\n if (!token) {\n throw new CliError(t('onboard.adminTokenRequired'), 1);\n }\n\n await new AdminApi({ apiOrigin, token }).inspectToken(token);\n config.admin = {\n apiOrigin,\n token,\n };\n logger.success(t('onboard.adminLoginSucceeded'));\n};\n\nconst inputWithDefault = async (\n message: string,\n value: string | undefined,\n): Promise<string> =>\n (\n await ui.input({\n message,\n ...(value ? { default: value } : {}),\n })\n ).trim();\n\nconst requiredDataFinderValue = (value: string, label: string): string => {\n if (!value) {\n throw new CliError(`DataFinder ${label} 不能为空`, 1);\n }\n return value;\n};\n\nexport const runDataFinderSetup = async (\n config: Awaited<ReturnType<typeof loadConfig>>,\n options: OnboardOptions,\n t: Translate,\n): Promise<void> => {\n const previous = config.datafinder;\n let accessKeyId = previous?.accessKeyId ?? '';\n let secretAccessKey = previous?.secretAccessKey ?? '';\n\n if (previous?.accessKeyId && previous.secretAccessKey) {\n const credentialAction = await ui.select({\n message: t('onboard.datafinderCredentialAction'),\n choices: [\n { value: 'keep', name: t('onboard.datafinderKeepCredentials') },\n { value: 'replace', name: t('onboard.datafinderReplaceCredentials') },\n ],\n });\n if (credentialAction === 'replace') {\n accessKeyId = '';\n secretAccessKey = '';\n }\n }\n\n if (!accessKeyId || !secretAccessKey) {\n accessKeyId = (await ui.password({ message: t('onboard.enterDataFinderAk') })).trim();\n secretAccessKey = (await ui.password({ message: t('onboard.enterDataFinderSk') })).trim();\n }\n\n const pathMode = parseDataFinderPathMode(\n options.datafinderPathMode ??\n (await ui.select({\n message: t('onboard.selectDataFinderPathMode'),\n choices: [\n { value: 'project', name: t('onboard.datafinderProjectPathMode') },\n { value: 'app', name: t('onboard.datafinderAppPathMode') },\n ],\n default: previous?.pathMode ?? 'project',\n })),\n );\n\n const candidate: DataFinderConnectionConfig = {\n accessKeyId: requiredDataFinderValue(accessKeyId, 'AccessKeyId'),\n appId: requiredDataFinderValue(\n await inputWithDefault(\n t('onboard.enterDataFinderAppId'),\n options.datafinderAppId ?? previous?.appId,\n ),\n 'appId',\n ),\n baseUrl: normalizeDataFinderBaseUrl(\n requiredDataFinderValue(\n await inputWithDefault(\n t('onboard.enterDataFinderUrl'),\n options.datafinderUrl ?? previous?.baseUrl ?? DEFAULT_DATAFINDER_BASE_URL,\n ),\n 'baseUrl',\n ),\n ),\n defaultDashboardId: requiredDataFinderValue(\n await inputWithDefault(\n t('onboard.enterDataFinderDashboardId'),\n options.datafinderDashboardId ?? previous?.defaultDashboardId,\n ),\n 'defaultDashboardId',\n ),\n pathMode,\n projectId: requiredDataFinderValue(\n await inputWithDefault(\n t('onboard.enterDataFinderProjectId'),\n options.datafinderProjectId ?? previous?.projectId,\n ),\n 'projectId',\n ),\n secretAccessKey: requiredDataFinderValue(secretAccessKey, 'SecretAccessKey'),\n timezone: requiredDataFinderValue(\n await inputWithDefault(\n t('onboard.enterDataFinderTimezone'),\n previous?.timezone ?? DEFAULT_DATAFINDER_TIMEZONE,\n ),\n 'timezone',\n ),\n };\n\n const summary = await new DataFinderClient(candidate).checkConnection();\n config.datafinder = toStoredDataFinderConfig(candidate);\n config.setup.datafinderConfigured = true;\n logger.success(\n t('onboard.datafinderSucceeded', {\n dashboardName: summary.dashboardName ?? summary.dashboardId,\n reportCount: summary.reportCount,\n }),\n );\n};\n\nexport const runOnboard = async (options: OnboardOptions): Promise<void> => {\n const config = await loadConfig();\n const t = createI18n(config.locale);\n const mode = options.setMode ?? 'all';\n\n if (!onboardModes.includes(mode)) {\n throw new CliError(`Invalid onboard mode: ${mode}`, 1);\n }\n\n if (mode === 'all' || mode === 'locale') {\n const locale = await ui.select({\n message: t('onboard.chooseLocale'),\n choices: [\n { value: 'zh-CN', name: '中文' },\n { value: 'skip', name: t('common.skip') },\n ],\n });\n\n if (locale !== 'skip') {\n config.locale = locale;\n }\n config.setup.localeConfigured = true;\n }\n\n if (mode === 'all' || mode === 'admin') {\n const action =\n mode === 'admin'\n ? 'continue'\n : await ui.select({\n message: t('onboard.adminSection'),\n choices: [\n { value: 'continue', name: t('common.continue') },\n { value: 'skip', name: t('common.skip') },\n ],\n });\n\n if (action === 'continue') {\n await runAdminSetup(config, options, t);\n } else {\n logger.info(t('onboard.skipAdminSetup'));\n }\n }\n\n if (mode === 'all' || mode === 'datafinder') {\n const action =\n mode === 'datafinder'\n ? 'continue'\n : await ui.select({\n message: t('onboard.datafinderSection'),\n choices: [\n { value: 'continue', name: t('common.continue') },\n { value: 'skip', name: t('common.skip') },\n ],\n });\n\n if (action === 'continue') {\n await runDataFinderSetup(config, options, t);\n } else {\n logger.info(t('onboard.skipDataFinderSetup'));\n }\n }\n\n if (mode === 'all' || mode === 'gh') {\n const action =\n mode === 'gh'\n ? 'continue'\n : await ui.select({\n message: t('onboard.ghSection'),\n choices: [\n { value: 'continue', name: t('common.continue') },\n { value: 'skip', name: t('common.skip') },\n ],\n });\n\n if (action === 'continue') {\n config.setup.ghConfigured = await runGhSetup(t);\n } else {\n logger.info(t('onboard.skipGhSetup'));\n config.setup.ghConfigured = true;\n }\n }\n\n if (mode === 'all' || mode === 'aws') {\n const action =\n mode === 'aws'\n ? 'continue'\n : await ui.select({\n message: t('onboard.awsSection'),\n choices: [\n { value: 'continue', name: t('common.continue') },\n { value: 'skip', name: t('common.skip') },\n ],\n });\n\n if (action === 'continue') {\n const result = await runAwsSetup(config.defaultAwsProfile, t);\n config.setup.awsConfigured = result.configured;\n if (result.configured) {\n config.defaultAwsProfile = result.profile;\n }\n } else {\n logger.info(t('onboard.skipAwsSetup'));\n config.setup.awsConfigured = true;\n }\n }\n\n await saveConfig(config);\n logger.success(t('onboard.complete'));\n};\n\nexport const registerOnboardCommand = (program: Command): void => {\n program\n .command('onboard')\n .description('Install or configure local prerequisites')\n .option('--set-mode <mode>', 'setup only one flow: all|admin|aws|datafinder|gh|locale')\n .option('--admin-url <url>', 'management API URL or admin.tutti.sh page URL')\n .option('--datafinder-url <url>', 'DataFinder OpenAPI origin')\n .option('--datafinder-project-id <id>', 'DataFinder project ID')\n .option('--datafinder-app-id <id>', 'DataFinder application ID')\n .option('--datafinder-dashboard-id <id>', 'default DataFinder dashboard ID')\n .option('--datafinder-path-mode <mode>', 'DataFinder API path mode: project|app')\n .action((options: OnboardOptions) => runOnboard(options));\n};\n","export type PpeLaneRepo = {\n cloudMapServiceId: string;\n defaultRef: string;\n defaultDestroySelection?: boolean;\n deployWorkflowFile: string;\n destroyWorkflowFile: string;\n key: string;\n label: string;\n repoFullName: string;\n serviceName: string;\n};\n\nexport const ppeLaneRepos: PpeLaneRepo[] = [\n {\n key: 'tutti-server',\n label: 'tutti-server',\n repoFullName: 'tutti-lab/tutti-server',\n deployWorkflowFile: 'deploy-lane.yml',\n destroyWorkflowFile: 'destroy-lane.yml',\n defaultRef: 'main',\n defaultDestroySelection: false,\n cloudMapServiceId: 'srv-izinli73rwxpf2dr',\n serviceName: 'tutti-server',\n },\n {\n key: 'zk-admin-server',\n label: 'zk-admin-server',\n repoFullName: 'zk-org-test/zk-admin-server',\n deployWorkflowFile: 'deploy-lane.yml',\n destroyWorkflowFile: 'destroy-lane.yml',\n defaultRef: 'main',\n cloudMapServiceId: 'srv-s4fn35h7nen4u5ci',\n serviceName: 'admin',\n },\n {\n key: 'account',\n label: 'account',\n repoFullName: 'zk-org-test/account',\n deployWorkflowFile: 'deploy-lane.yml',\n destroyWorkflowFile: 'destroy-lane.yml',\n defaultRef: 'main',\n cloudMapServiceId: 'srv-j2newpni247wsn7h',\n serviceName: 'account',\n },\n {\n key: 'zk-websocket',\n label: 'zk-websocket',\n repoFullName: 'zk-org-test/zk-websocket',\n deployWorkflowFile: 'deploy-lane.yml',\n destroyWorkflowFile: 'destroy-lane.yml',\n defaultRef: 'main',\n cloudMapServiceId: 'srv-34fi45edgao7tp2r',\n serviceName: 'zk-websocket',\n },\n];\n","import { CliError } from './errors.js';\nimport { runCommand } from './shell.js';\n\ntype AwsGetServiceResponse = {\n Service: {\n Name: string;\n NamespaceId: string;\n };\n};\n\ntype AwsGetNamespaceResponse = {\n Namespace: {\n Name: string;\n };\n};\n\ntype AwsListInstancesResponse = {\n Instances: Array<{\n Attributes: Record<string, string>;\n Id: string;\n }>;\n};\n\ntype AwsCallerIdentityResponse = {\n Account: string;\n Arn: string;\n UserId: string;\n};\n\nexport type AwsCallerIdentity = {\n account: string;\n arn: string;\n userId: string;\n};\n\nexport type LaneInstance = {\n host: string;\n id: string;\n lane: string;\n port: string;\n protocol: string;\n};\n\nconst parseJson = <T>(raw: string): T => JSON.parse(raw) as T;\n\nconst isSsoAuthFailure = (stderr: string): boolean =>\n /(token has expired|token.*expired|sso|authorization pending|login)/i.test(stderr);\n\nconst runAws = async (args: string[]) => {\n const result = await runCommand('aws', args);\n if (result.exitCode !== 0) {\n throw new CliError(result.stderr || `AWS command failed: aws ${args.join(' ')}`, 1);\n }\n\n return result.stdout;\n};\n\nexport const ensureAwsAuthenticated = async (profile: string): Promise<void> => {\n const identityArgs = ['sts', 'get-caller-identity', '--profile', profile, '--output', 'json'];\n const firstAttempt = await runCommand('aws', identityArgs);\n\n if (firstAttempt.exitCode === 0) {\n return;\n }\n\n if (!isSsoAuthFailure(firstAttempt.stderr)) {\n throw new CliError(firstAttempt.stderr || `AWS authentication failed for profile ${profile}`, 1);\n }\n\n const loginResult = await runCommand('aws', ['sso', 'login', '--profile', profile], {\n stdio: 'inherit',\n });\n if (loginResult.exitCode !== 0) {\n throw new CliError(`AWS SSO login failed for profile ${profile}`, 1);\n }\n\n const secondAttempt = await runCommand('aws', identityArgs);\n if (secondAttempt.exitCode !== 0) {\n throw new CliError(`AWS authentication is still invalid for profile ${profile}`, 1);\n }\n};\n\nexport const getAwsCallerIdentity = async (profile: string): Promise<AwsCallerIdentity> => {\n const identity = parseJson<AwsCallerIdentityResponse>(\n await runAws(['sts', 'get-caller-identity', '--profile', profile, '--output', 'json']),\n );\n\n return {\n account: identity.Account,\n arn: identity.Arn,\n userId: identity.UserId,\n };\n};\n\nexport const listLaneInstances = async (input: {\n lane?: string;\n profile: string;\n region: string;\n serviceId: string;\n}): Promise<{\n instances: LaneInstance[];\n namespaceName: string;\n serviceName: string;\n}> => {\n const service = parseJson<AwsGetServiceResponse>(\n await runAws([\n 'servicediscovery',\n 'get-service',\n '--id',\n input.serviceId,\n '--region',\n input.region,\n '--profile',\n input.profile,\n '--output',\n 'json',\n ]),\n ).Service;\n\n const namespace = parseJson<AwsGetNamespaceResponse>(\n await runAws([\n 'servicediscovery',\n 'get-namespace',\n '--id',\n service.NamespaceId,\n '--region',\n input.region,\n '--profile',\n input.profile,\n '--output',\n 'json',\n ]),\n ).Namespace;\n\n const instances = parseJson<AwsListInstancesResponse>(\n await runAws([\n 'servicediscovery',\n 'list-instances',\n '--service-id',\n input.serviceId,\n '--region',\n input.region,\n '--profile',\n input.profile,\n '--output',\n 'json',\n ]),\n ).Instances\n .filter((instance) => input.lane === undefined || instance.Attributes.lane === input.lane)\n .map<LaneInstance>((instance) => ({\n id: instance.Id,\n lane: instance.Attributes.lane ?? '',\n host: instance.Attributes.host ?? '',\n port: instance.Attributes.port ?? '',\n protocol: instance.Attributes.protocol ?? '',\n }));\n\n return {\n serviceName: service.Name,\n namespaceName: namespace.Name,\n instances,\n };\n};\n","export type ReleaseTarget = {\n defaultReleaseProfile: 'production';\n key: 'account' | 'zk-admin-server' | 'zk-websocket';\n label: string;\n repoFullName: string;\n};\n\nexport const CONTROL_REPO_FULL_NAME = 'zk-org-test/github-action';\nexport const CONTROL_RELEASE_PREPARE_WORKFLOW_FILE = 'controlled-release.yml';\nexport const CONTROL_RELEASE_HOTFIX_WORKFLOW_FILE = 'controlled-hotfix-release.yml';\nexport const CONTROL_RELEASE_APPROVAL_WORKFLOW_FILE = 'controlled-release-approval.yml';\nexport const CONTROL_RELEASE_APPROVE_COMMAND = '/release-approve';\n\nexport const releaseTargets: ReleaseTarget[] = [\n {\n key: 'account',\n label: 'account',\n repoFullName: 'zk-org-test/account',\n defaultReleaseProfile: 'production',\n },\n {\n key: 'zk-admin-server',\n label: 'zk-admin-server',\n repoFullName: 'zk-org-test/zk-admin-server',\n defaultReleaseProfile: 'production',\n },\n {\n key: 'zk-websocket',\n label: 'zk-websocket',\n repoFullName: 'zk-org-test/zk-websocket',\n defaultReleaseProfile: 'production',\n },\n];\n","import { CliError } from './errors.js';\nimport { runCommand } from './shell.js';\nimport {\n CONTROL_RELEASE_APPROVE_COMMAND,\n CONTROL_REPO_FULL_NAME,\n} from '../constants/release-targets.js';\n\ntype WorkflowRun = {\n actor: {\n login: string | null;\n } | null;\n conclusion: string | null;\n created_at: string;\n event: string;\n html_url: string;\n id: number;\n run_started_at?: string | null;\n status: string;\n updated_at?: string;\n};\n\ntype WorkflowRunJobStep = {\n conclusion?: string | null;\n name?: string | null;\n};\n\ntype WorkflowRunJob = {\n conclusion?: string | null;\n id: number;\n name?: string | null;\n steps?: WorkflowRunJobStep[] | null;\n};\n\nexport type IssueCommentMetadata = {\n commentId: number;\n createdAt: string;\n userLogin: string;\n};\n\nexport type WorkflowRunDurationSample = {\n createdAt: string;\n durationMs: number;\n htmlUrl: string;\n runId: number;\n updatedAt: string;\n};\n\nexport type WorkflowRunProgressUpdate =\n | {\n status: 'pending';\n }\n | {\n runId: number;\n status: 'pending';\n }\n | {\n htmlUrl: string;\n runId: number;\n status: 'completed' | 'in_progress';\n };\n\ntype WorkflowRunCorrelation = {\n actorLogin?: string;\n createdAt?: string;\n};\n\ntype WorkflowRunCompletion = {\n conclusion: string;\n failureMessage?: string;\n htmlUrl: string;\n runId: number;\n status: string;\n};\n\nexport type ControlledReleaseDurationEstimateInput = {\n allowUnmergedHotfix?: boolean;\n event?: string;\n perPage?: number;\n ref?: string;\n releaseMode: string;\n releaseProfile?: string;\n repoFullName: string;\n targetRepo: string;\n workflowFile: string;\n};\n\nexport type ControlledReleaseIssue = {\n approveCommand: string;\n body: string;\n candidateTag: string;\n createdAt: string;\n issueId: string;\n issueNumber: number;\n releaseBranch: string;\n releaseMode: string;\n releaseProfile: string;\n targetRepo: string;\n title: string;\n url: string;\n allowUnmergedHotfix: boolean;\n overrideReason: string;\n};\n\nconst CONTROLLED_RELEASE_HTML_COMMENT_MARKER = /^<!--\\s*([a-z_]+)=(.*?)\\s*-->$/;\nconst CONTROLLED_RELEASE_TEXT_MARKER = /^([a-z_]+):\\s*(.*)$/;\nconst CONTROLLED_RELEASE_MATCH_WINDOW_MS = 30 * 60 * 1000;\nconst TRANSIENT_WORKFLOW_RUN_READ_ATTEMPTS = 3;\n\nconst sleep = async (ms: number): Promise<void> => {\n if (ms <= 0) {\n return;\n }\n\n await new Promise((resolve) => setTimeout(resolve, ms));\n};\n\nconst hasRequiredControlledReleaseFields = (issue: ControlledReleaseIssue): boolean =>\n issue.targetRepo !== '' &&\n issue.releaseProfile !== '' &&\n issue.candidateTag !== '' &&\n issue.releaseMode !== '' &&\n issue.approveCommand !== '';\n\nconst stripWorkflowLogPrefix = (line: string): string =>\n line\n .replace(/^##\\[error\\]\\s*/i, '')\n .replace(/^##\\[warning\\]\\s*/i, '')\n .replace(/^::error::\\s*/i, '')\n .trim();\n\nconst getCommandFailureDetail = (stderr: string, stdout: string): string | null => {\n const combined = [stderr, stdout]\n .map((value) => value.trim())\n .filter(Boolean)\n .join('\\n');\n\n if (!combined) {\n return null;\n }\n\n return combined.split(/\\r?\\n/, 1)[0]?.trim() ?? null;\n};\n\nconst isTransientWorkflowRunReadFailure = (message: string): boolean =>\n /(bad gateway|connection reset|eai_again|econnreset|enotfound|eof|gateway timeout|http 502|http 503|http 504|network|rate limit|secondary rate limit|service unavailable|timeout|timed out|tls|temporary)/i.test(\n message,\n );\n\nconst extractActionableWorkflowLogLine = (logOutput: string): string | null => {\n let fallbackLine: string | null = null;\n let warningLine: string | null = null;\n\n for (const rawLine of logOutput.split(/\\r?\\n/)) {\n const trimmedLine = rawLine.trim();\n if (!trimmedLine) {\n continue;\n }\n\n if (/^##\\[error\\]/i.test(trimmedLine) || /^::error::/i.test(trimmedLine)) {\n const normalizedLine = stripWorkflowLogPrefix(trimmedLine);\n if (normalizedLine) {\n return normalizedLine;\n }\n continue;\n }\n\n if (/^##\\[warning\\]/i.test(trimmedLine)) {\n const normalizedLine = stripWorkflowLogPrefix(trimmedLine);\n if (normalizedLine && warningLine === null) {\n warningLine = normalizedLine;\n }\n continue;\n }\n\n const normalizedLine = stripWorkflowLogPrefix(trimmedLine);\n if (!normalizedLine) {\n continue;\n }\n\n if (/^(error|fatal|failed|failure|exception|panic)\\b[:\\s-]*/i.test(normalizedLine)) {\n const extractedLine = normalizedLine\n .replace(/^(error|fatal|failed|failure|exception|panic)\\b[:\\s-]*/i, '')\n .trim();\n if (extractedLine) {\n fallbackLine ??= extractedLine;\n }\n }\n }\n\n return fallbackLine ?? warningLine ?? null;\n};\n\nconst findFailedWorkflowJob = (jobs: WorkflowRunJob[]): WorkflowRunJob | null => {\n const failedJob = jobs.find((job) => job.conclusion === 'failure');\n if (failedJob) {\n return failedJob;\n }\n\n return jobs.find((job) =>\n job.steps?.some((step) => step.conclusion === 'failure'),\n ) ?? null;\n};\n\nconst findFailedWorkflowStepName = (job: WorkflowRunJob): string | null => {\n const failedStep = job.steps?.find((step) => step.conclusion === 'failure');\n const stepName = failedStep?.name?.trim() ?? job.name?.trim() ?? '';\n\n return stepName || null;\n};\n\nconst fetchWorkflowRunFailureMessage = async (input: {\n repoFullName: string;\n runId: number;\n}): Promise<string | null> => {\n const jobsResult = await runCommand('gh', [\n 'api',\n `repos/${input.repoFullName}/actions/runs/${input.runId}/jobs`,\n ]);\n\n if (jobsResult.exitCode !== 0) {\n return null;\n }\n\n const jobsPayload = JSON.parse(jobsResult.stdout) as {\n jobs?: WorkflowRunJob[];\n };\n const failedJob = findFailedWorkflowJob(jobsPayload.jobs ?? []);\n if (!failedJob) {\n return null;\n }\n\n const failedStepName = findFailedWorkflowStepName(failedJob);\n if (!failedStepName) {\n return null;\n }\n\n const logResult = await runCommand('gh', [\n 'run',\n 'view',\n String(input.runId),\n '--repo',\n input.repoFullName,\n '--job',\n String(failedJob.id),\n '--log-failed',\n ]);\n\n if (logResult.exitCode !== 0) {\n return failedStepName;\n }\n\n return extractActionableWorkflowLogLine(logResult.stdout) ?? failedStepName;\n};\n\nconst listWorkflowRuns = async (input: {\n event?: string;\n perPage?: number;\n ref?: string;\n repoFullName: string;\n workflowFile: string;\n}): Promise<WorkflowRun[]> => {\n const event = input.event ?? 'workflow_dispatch';\n const query = new URLSearchParams({\n event,\n per_page: String(input.perPage ?? 20),\n });\n\n if (event === 'workflow_dispatch' && input.ref) {\n query.set('branch', input.ref);\n }\n\n const result = await runCommand('gh', [\n 'api',\n `repos/${input.repoFullName}/actions/workflows/${input.workflowFile}/runs?${query.toString()}`,\n ]);\n\n if (result.exitCode !== 0) {\n const detail = getCommandFailureDetail(result.stderr, result.stdout);\n throw new CliError(\n detail\n ? `Failed to read workflow runs for ${input.repoFullName}: ${detail}`\n : `Failed to read workflow runs for ${input.repoFullName}`,\n 1,\n );\n }\n\n const payload = JSON.parse(result.stdout) as {\n workflow_runs: WorkflowRun[];\n };\n\n return payload.workflow_runs;\n};\n\nexport const getRepresentativeDurationMs = (durations: number[]): number | null => {\n if (durations.length === 0) {\n return null;\n }\n\n const sorted = [...durations].sort((left, right) => left - right);\n return sorted[Math.floor(sorted.length / 2)] ?? null;\n};\n\nexport const parseControlledReleaseIssueBody = (\n body: string,\n): Omit<\n ControlledReleaseIssue,\n 'body' | 'createdAt' | 'issueId' | 'issueNumber' | 'title' | 'url'\n> => {\n const markers = new Map<string, string>();\n\n for (const rawLine of body.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line) {\n continue;\n }\n\n const htmlCommentMatch = line.match(CONTROLLED_RELEASE_HTML_COMMENT_MARKER);\n if (htmlCommentMatch) {\n markers.set(htmlCommentMatch[1] ?? '', (htmlCommentMatch[2] ?? '').trim());\n continue;\n }\n\n const textMatch = line.match(CONTROLLED_RELEASE_TEXT_MARKER);\n if (textMatch) {\n markers.set(textMatch[1] ?? '', (textMatch[2] ?? '').trim());\n }\n }\n\n return {\n targetRepo: markers.get('target_repo') ?? '',\n releaseProfile: markers.get('release_profile') ?? '',\n candidateTag: markers.get('candidate_tag') ?? '',\n releaseBranch: markers.get('release_branch') ?? '',\n releaseMode: markers.get('release_mode') ?? '',\n allowUnmergedHotfix: (markers.get('allow_unmerged_hotfix') ?? 'false') === 'true',\n overrideReason: markers.get('override_reason') ?? '',\n approveCommand: markers.get('approve_command') ?? '',\n };\n};\n\nexport const ensureGhAuthenticated = async (): Promise<void> => {\n const result = await runCommand('gh', ['auth', 'status']);\n if (result.exitCode !== 0) {\n throw new CliError('GitHub CLI authentication is required', 1);\n }\n};\n\nexport const resolveBranchForRepo = async (input: {\n defaultRef: string;\n repoFullName: string;\n requestedRef: string;\n}): Promise<{\n fallbackToDefault: boolean;\n requestedRef: string;\n resolvedRef: string;\n}> => {\n const result = await runCommand('gh', [\n 'api',\n `repos/${input.repoFullName}/branches/${encodeURIComponent(input.requestedRef)}`,\n ]);\n\n if (result.exitCode === 0) {\n return {\n requestedRef: input.requestedRef,\n resolvedRef: input.requestedRef,\n fallbackToDefault: false,\n };\n }\n\n if (!/404|not found/i.test(`${result.stdout}\\n${result.stderr}`)) {\n throw new CliError(\n result.stderr || `Failed to resolve branch ${input.requestedRef} for ${input.repoFullName}`,\n 1,\n );\n }\n\n return {\n requestedRef: input.requestedRef,\n resolvedRef: input.defaultRef,\n fallbackToDefault: true,\n };\n};\n\nexport const listWorkflowRunIds = async (input: {\n event?: string;\n ref: string;\n repoFullName: string;\n workflowFile: string;\n}): Promise<number[]> => {\n const runs = await listWorkflowRuns(input);\n return runs.map((run) => run.id);\n};\n\nexport const dispatchControlWorkflow = async (input: {\n inputs: Record<string, boolean | string>;\n ref: string;\n workflowFile: string;\n}): Promise<void> => {\n const args = [\n 'api',\n `repos/${CONTROL_REPO_FULL_NAME}/actions/workflows/${input.workflowFile}/dispatches`,\n '--method',\n 'POST',\n '-f',\n `ref=${input.ref}`,\n ];\n\n for (const [key, value] of Object.entries(input.inputs)) {\n args.push('-f', `inputs[${key}]=${String(value)}`);\n }\n\n const result = await runCommand('gh', args);\n\n if (result.exitCode !== 0) {\n throw new CliError(`Failed to dispatch ${input.workflowFile} for ${CONTROL_REPO_FULL_NAME}`, 1);\n }\n};\n\nexport const dispatchWorkflow = async (input: {\n lane: string;\n ref: string;\n repoFullName: string;\n workflowFile: string;\n}): Promise<void> => {\n const result = await runCommand('gh', [\n 'api',\n `repos/${input.repoFullName}/actions/workflows/${input.workflowFile}/dispatches`,\n '--method',\n 'POST',\n '-f',\n `ref=${input.ref}`,\n '-F',\n `inputs[lane]=${input.lane}`,\n ]);\n\n if (result.exitCode !== 0) {\n const detail = getCommandFailureDetail(result.stderr, result.stdout);\n throw new CliError(\n detail\n ? `Failed to dispatch ${input.workflowFile} for ${input.repoFullName}: ${detail}`\n : `Failed to dispatch ${input.workflowFile} for ${input.repoFullName}`,\n 1,\n );\n }\n};\n\nexport const listOpenIssueIds = async (repoFullName: string): Promise<string[]> => {\n const result = await runCommand('gh', [\n 'issue',\n 'list',\n '--repo',\n repoFullName,\n '--state',\n 'open',\n '--json',\n 'id,number',\n '--limit',\n '100',\n ]);\n\n if (result.exitCode !== 0) {\n throw new CliError(`Failed to list issues for ${repoFullName}`, 1);\n }\n\n return (JSON.parse(result.stdout) as Array<{ id: string }>).map((issue) => issue.id);\n};\n\nconst listControlledReleaseIssues = async (\n state: 'all' | 'open',\n): Promise<ControlledReleaseIssue[]> => {\n const result = await runCommand('gh', [\n 'api',\n `repos/${CONTROL_REPO_FULL_NAME}/issues?state=${state}&labels=release-approval%2Crelease-control&per_page=100`,\n '--paginate',\n '--slurp',\n ]);\n\n if (result.exitCode !== 0) {\n throw new CliError('Failed to list release approval issues', 1);\n }\n\n const payload = JSON.parse(result.stdout) as Array<Record<string, unknown>> | Array<Array<Record<string, unknown>>>;\n const issues = Array.isArray(payload[0]) ? (payload as Array<Array<Record<string, unknown>>>).flat() : (payload as Array<Record<string, unknown>>);\n\n return issues\n .map((issue) => {\n const parsed = parseControlledReleaseIssueBody(String(issue.body ?? ''));\n\n return {\n issueId: String(issue.id ?? ''),\n issueNumber: Number(issue.number),\n title: String(issue.title ?? ''),\n url: String(issue.html_url ?? ''),\n createdAt: String(issue.created_at ?? ''),\n body: String(issue.body ?? ''),\n ...parsed,\n } satisfies ControlledReleaseIssue;\n })\n .filter(hasRequiredControlledReleaseFields)\n .filter((issue) => issue.approveCommand === CONTROL_RELEASE_APPROVE_COMMAND);\n};\n\nexport const filterPendingReleaseApprovalIssues = async (\n targetRepo: string,\n): Promise<ControlledReleaseIssue[]> => {\n const issues = await listControlledReleaseIssues('open');\n\n return issues.filter((issue) => issue.targetRepo === targetRepo);\n};\n\nexport const commentOnIssue = async (input: {\n body: string;\n issueNumber: number;\n repoFullName: string;\n}): Promise<IssueCommentMetadata> => {\n const result = await runCommand('gh', [\n 'api',\n `repos/${input.repoFullName}/issues/${input.issueNumber}/comments`,\n '--method',\n 'POST',\n '-f',\n `body=${input.body}`,\n ]);\n\n if (result.exitCode !== 0) {\n throw new CliError(`Failed to comment on issue #${input.issueNumber}`, 1);\n }\n\n const payload = JSON.parse(result.stdout) as {\n created_at?: string;\n id?: number;\n user?: {\n login?: string;\n };\n };\n\n const commentId = Number(payload.id ?? 0);\n const createdAt = String(payload.created_at ?? '');\n const userLogin = String(payload.user?.login ?? '');\n\n if (!commentId || !createdAt || !userLogin) {\n throw new CliError(`Failed to parse comment metadata for issue #${input.issueNumber}`, 1);\n }\n\n return {\n commentId,\n createdAt,\n userLogin,\n };\n};\n\nexport const closeIssue = async (input: {\n issueNumber: number;\n repoFullName: string;\n}): Promise<void> => {\n const result = await runCommand('gh', [\n 'api',\n `repos/${input.repoFullName}/issues/${input.issueNumber}`,\n '--method',\n 'PATCH',\n '-f',\n 'state=closed',\n ]);\n\n if (result.exitCode !== 0) {\n throw new CliError(`Failed to close issue #${input.issueNumber}`, 1);\n }\n};\n\nconst parseDurationMs = (startedAt: string, updatedAt: string): number | null => {\n const startedTime = Date.parse(startedAt);\n const updatedTime = Date.parse(updatedAt);\n\n if (Number.isNaN(startedTime) || Number.isNaN(updatedTime) || updatedTime < startedTime) {\n return null;\n }\n\n return updatedTime - startedTime;\n};\n\nexport const listSuccessfulWorkflowRunDurations = async (input: {\n event?: string;\n perPage?: number;\n ref?: string;\n repoFullName: string;\n workflowFile: string;\n}): Promise<WorkflowRunDurationSample[]> => {\n const runs = await listWorkflowRuns(input);\n\n return runs.flatMap((run) => {\n if (run.status !== 'completed' || run.conclusion !== 'success' || !run.updated_at) {\n return [];\n }\n\n const startedAt = run.run_started_at ?? run.created_at;\n const durationMs = parseDurationMs(startedAt, run.updated_at);\n if (durationMs === null) {\n return [];\n }\n\n return [\n {\n createdAt: run.created_at,\n runId: run.id,\n htmlUrl: run.html_url,\n updatedAt: run.updated_at,\n durationMs,\n },\n ];\n });\n};\n\nconst isRunCreatedAtOrAfter = (runCreatedAt: string, minimumCreatedAt?: string): boolean => {\n if (!minimumCreatedAt) {\n return true;\n }\n\n const runTime = Date.parse(runCreatedAt);\n const minimumTime = Date.parse(minimumCreatedAt);\n\n if (Number.isNaN(runTime) || Number.isNaN(minimumTime)) {\n return runCreatedAt >= minimumCreatedAt;\n }\n\n return Math.floor(runTime / 1000) >= Math.floor(minimumTime / 1000);\n};\n\nconst matchesWorkflowRunCorrelation = (\n run: WorkflowRun,\n correlation?: WorkflowRunCorrelation,\n): boolean => {\n if (!correlation) {\n return true;\n }\n\n if (correlation.actorLogin && run.actor?.login !== correlation.actorLogin) {\n return false;\n }\n\n if (!isRunCreatedAtOrAfter(run.created_at, correlation.createdAt)) {\n return false;\n }\n\n return true;\n};\n\nconst matchesControlledReleaseHistory = (\n issue: ControlledReleaseIssue,\n input: ControlledReleaseDurationEstimateInput,\n): boolean => {\n if (issue.targetRepo !== input.targetRepo || issue.releaseMode !== input.releaseMode) {\n return false;\n }\n\n if (input.releaseMode === 'mainline') {\n return issue.releaseProfile === (input.releaseProfile ?? '');\n }\n\n if (input.releaseMode === 'hotfix') {\n return issue.allowUnmergedHotfix === Boolean(input.allowUnmergedHotfix);\n }\n\n return true;\n};\n\nconst getIssueSampleGapMs = (issueCreatedAt: string, sampleCreatedAt: string): number => {\n const issueTime = Date.parse(issueCreatedAt);\n const sampleTime = Date.parse(sampleCreatedAt);\n\n if (Number.isNaN(issueTime) || Number.isNaN(sampleTime)) {\n return Number.POSITIVE_INFINITY;\n }\n\n return Math.abs(sampleTime - issueTime);\n};\n\nconst correlateIssueDurations = (\n issues: ControlledReleaseIssue[],\n samples: WorkflowRunDurationSample[],\n): number[] => {\n const remainingSamples = [...samples].sort((left, right) =>\n left.createdAt.localeCompare(right.createdAt),\n );\n const matchedDurations: number[] = [];\n\n const sortedIssues = [...issues].sort((left, right) => left.createdAt.localeCompare(right.createdAt));\n\n for (const issue of sortedIssues) {\n let bestIndex = -1;\n let bestGapMs = Number.POSITIVE_INFINITY;\n\n for (const [index, sample] of remainingSamples.entries()) {\n const gapMs = getIssueSampleGapMs(issue.createdAt, sample.createdAt);\n if (gapMs > CONTROLLED_RELEASE_MATCH_WINDOW_MS || gapMs >= bestGapMs) {\n continue;\n }\n\n bestIndex = index;\n bestGapMs = gapMs;\n }\n\n if (bestIndex === -1) {\n continue;\n }\n\n const matchedSample = remainingSamples.splice(bestIndex, 1)[0];\n if (matchedSample) {\n matchedDurations.push(matchedSample.durationMs);\n }\n }\n\n return matchedDurations;\n};\n\nexport const estimateControlledReleaseDuration = async (\n input: ControlledReleaseDurationEstimateInput,\n): Promise<number | null> => {\n const [issues, samples] = await Promise.all([\n listControlledReleaseIssues('all'),\n listSuccessfulWorkflowRunDurations({\n repoFullName: input.repoFullName,\n workflowFile: input.workflowFile,\n ref: input.ref,\n event: input.event,\n perPage: input.perPage,\n }),\n ]);\n\n const matchingIssues = issues.filter((issue) => matchesControlledReleaseHistory(issue, input));\n const matchedDurations = correlateIssueDurations(matchingIssues, samples);\n\n if (matchedDurations.length >= 2) {\n return getRepresentativeDurationMs(matchedDurations);\n }\n\n return getRepresentativeDurationMs(samples.map((sample) => sample.durationMs));\n};\n\nexport const pollWorkflowRun = async (input: {\n correlation?: WorkflowRunCorrelation;\n event?: string;\n intervalMs?: number;\n knownRunIds: number[];\n maxAttempts?: number;\n onUpdate?: (update: WorkflowRunProgressUpdate) => void;\n repoFullName: string;\n ref: string;\n workflowFile: string;\n}): Promise<WorkflowRunCompletion> => {\n const knownRunIds = new Set(input.knownRunIds);\n const intervalMs = input.intervalMs ?? 5000;\n const maxAttempts = input.maxAttempts ?? 120;\n let trackedRunId: number | null = null;\n\n for (let attempt = 0; attempt < maxAttempts; attempt += 1) {\n let runs: WorkflowRun[] | null = null;\n\n for (let readAttempt = 0; readAttempt < TRANSIENT_WORKFLOW_RUN_READ_ATTEMPTS; readAttempt += 1) {\n try {\n runs = await listWorkflowRuns(input);\n break;\n } catch (error) {\n if (\n !(error instanceof CliError) ||\n !isTransientWorkflowRunReadFailure(error.message) ||\n readAttempt === TRANSIENT_WORKFLOW_RUN_READ_ATTEMPTS - 1\n ) {\n throw error;\n }\n\n input.onUpdate?.(trackedRunId === null ? { status: 'pending' } : { runId: trackedRunId, status: 'pending' });\n await sleep(intervalMs);\n }\n }\n\n if (!runs) {\n throw new CliError(`Timed out waiting for workflow run in ${input.repoFullName}`, 1);\n }\n\n if (trackedRunId === null) {\n const candidates = runs\n .filter((run) => !knownRunIds.has(run.id))\n .filter((run) => matchesWorkflowRunCorrelation(run, input.correlation));\n\n if (candidates.length > 1) {\n throw new CliError(`Ambiguous workflow run selection for ${input.repoFullName}`, 1);\n }\n\n if (candidates.length === 0) {\n input.onUpdate?.({ status: 'pending' });\n await sleep(intervalMs);\n continue;\n }\n\n trackedRunId = candidates[0]?.id ?? null;\n }\n\n const matchedRun = runs.find((run) => run.id === trackedRunId);\n if (!matchedRun) {\n input.onUpdate?.({ runId: trackedRunId, status: 'pending' });\n await sleep(intervalMs);\n continue;\n }\n\n input.onUpdate?.({\n runId: trackedRunId,\n htmlUrl: matchedRun.html_url,\n status: matchedRun.status === 'completed' ? 'completed' : 'in_progress',\n });\n\n if (matchedRun.status === 'completed') {\n const completion: WorkflowRunCompletion = {\n conclusion: matchedRun.conclusion ?? 'unknown',\n htmlUrl: matchedRun.html_url,\n runId: matchedRun.id,\n status: matchedRun.status,\n };\n\n if (completion.conclusion !== 'success') {\n const failureMessage = await fetchWorkflowRunFailureMessage({\n repoFullName: input.repoFullName,\n runId: matchedRun.id,\n });\n\n if (failureMessage) {\n completion.failureMessage = failureMessage;\n }\n }\n\n return completion;\n }\n\n await sleep(intervalMs);\n }\n\n throw new CliError(`Timed out waiting for workflow run in ${input.repoFullName}`, 1);\n};\n","import { CliError } from './errors.js';\n\nexport const PPE_LANE_MAX_LENGTH = 38;\n\nconst PPE_LANE_PATTERN = /^[a-z0-9](?:[-a-z0-9]*[a-z0-9])?$/;\n\nexport const validatePpeLaneName = (value: string): string => {\n const lane = value.trim();\n if (!lane) {\n throw new CliError('PPE lane name is required', 1);\n }\n\n if (lane.length > PPE_LANE_MAX_LENGTH) {\n throw new CliError(`PPE lane name must be ${PPE_LANE_MAX_LENGTH} characters or fewer`, 1);\n }\n\n if (!PPE_LANE_PATTERN.test(lane)) {\n throw new CliError(\n 'PPE lane name must use lowercase letters, digits, or hyphens, and start and end with a letter or digit',\n 1,\n );\n }\n\n return lane;\n};\n","import { ensureAwsAuthenticated } from './aws.js';\nimport { loadConfig } from './config.js';\nimport { CliError } from './errors.js';\nimport { ensureGhAuthenticated } from './github.js';\nimport { runCommand } from './shell.js';\n\nexport const ensureCommandInstalled = async (\n command: string,\n installHint: string,\n): Promise<void> => {\n const result = await runCommand(command, ['--version']);\n if (result.exitCode !== 0) {\n throw new CliError(installHint, 1);\n }\n};\n\nexport const ensurePrerequisites = async (input: {\n needsAws?: boolean;\n needsGh?: boolean;\n}) => {\n const config = await loadConfig();\n\n if (input.needsGh) {\n await ensureCommandInstalled('gh', 'gh is required. Run nexight-devops onboard --set-mode gh');\n await ensureGhAuthenticated();\n }\n\n if (input.needsAws) {\n await ensureCommandInstalled('aws', 'aws is required. Run nexight-devops onboard --set-mode aws');\n await ensureAwsAuthenticated(config.defaultAwsProfile);\n }\n\n return config;\n};\n","import type { Command } from 'commander';\nimport { ppeLaneRepos } from '../../constants/ppe-lane-repos.js';\nimport { listLaneInstances } from '../../lib/aws.js';\nimport { CliError } from '../../lib/errors.js';\nimport {\n dispatchWorkflow,\n getRepresentativeDurationMs,\n listWorkflowRunIds,\n listSuccessfulWorkflowRunDurations,\n pollWorkflowRun,\n resolveBranchForRepo,\n} from '../../lib/github.js';\nimport { logger } from '../../lib/logger.js';\nimport { validatePpeLaneName } from '../../lib/ppe-lane.js';\nimport {\n renderWorkflowProgressPanel,\n type WorkflowProgressState,\n withProgressTask,\n} from '../../lib/progress.js';\nimport { ensurePrerequisites } from '../../lib/prerequisites.js';\nimport { ui } from '../../lib/ui.js';\n\ntype DeployResult = {\n conclusion: string;\n failureDetail?: string;\n key: string;\n ref: string;\n runUrl: string;\n status: string;\n};\n\ntype DeployProgressTarget = {\n key: string;\n repoFullName: string;\n workflowFile: string;\n};\n\nconst getErrorMessage = (error: unknown): string => (error instanceof Error ? error.message : String(error));\n\nconst renderAggregateProgress = (\n lane: string,\n selectedTargets: Array<{ key: string }>,\n repoStates: Map<string, WorkflowProgressState>,\n): string =>\n renderWorkflowProgressPanel({\n items: selectedTargets,\n states: repoStates,\n title: `正在发布 lane ${lane}`,\n });\n\nexport const runPpeLaneDeploy = async (): Promise<void> => {\n const requestedRef = await ui.input({ message: '请输入目标分支', default: 'main' });\n const selectedKeys = await ui.checkbox({\n message: '请选择需要发布的仓库',\n choices: ppeLaneRepos.map((repo) => ({ value: repo.key, name: repo.label })),\n });\n const selectedRepos = ppeLaneRepos.filter((repo) => selectedKeys.includes(repo.key));\n if (selectedRepos.length === 0) {\n throw new CliError('At least one deploy repository must be selected', 1);\n }\n\n const lane = validatePpeLaneName(await ui.input({ message: '请输入 PPE lane 名称' }));\n const selectedTargets: DeployProgressTarget[] = selectedRepos.map((repo) => ({\n key: repo.key,\n repoFullName: repo.repoFullName,\n workflowFile: repo.deployWorkflowFile,\n }));\n\n const config = await ensurePrerequisites({ needsAws: true, needsGh: true });\n\n const branchResults = await Promise.all(\n selectedRepos.map((repo) =>\n resolveBranchForRepo({\n defaultRef: repo.defaultRef,\n repoFullName: repo.repoFullName,\n requestedRef,\n }),\n ),\n );\n\n const duplicateResults = await Promise.all(\n selectedRepos.map((repo) =>\n listLaneInstances({\n lane,\n profile: config.defaultAwsProfile,\n region: 'us-east-1',\n serviceId: repo.cloudMapServiceId,\n }),\n ),\n );\n\n branchResults\n .filter((result) => result.fallbackToDefault)\n .forEach((result) => logger.warn(`分支 ${result.requestedRef} 不存在,将回退到 ${result.resolvedRef} 发布`));\n\n duplicateResults\n .filter((result) => result.instances.length > 0)\n .forEach((result) => logger.warn(`检测到已存在 lane 实例: ${result.serviceName}`));\n\n const confirmationLines = [\n '确认开始部署?',\n ` 分支: ${requestedRef}`,\n ` lane: ${lane}`,\n '',\n ' 已选择目标:',\n ...selectedRepos.map((repo) => ` - ${repo.key}`),\n ];\n\n const confirmed = await ui.confirm({\n message: confirmationLines.join('\\n'),\n default: true,\n });\n if (!confirmed) {\n logger.warn('已取消发布');\n return;\n }\n\n const repoStates = new Map<string, WorkflowProgressState>();\n\n const results = await withProgressTask(\n {\n initialText: `正在发布 lane ${lane}`,\n heartbeatMs: 1_000,\n heartbeatText: () => renderAggregateProgress(lane, selectedTargets, repoStates),\n },\n async ({ setText }) => {\n await Promise.all(\n selectedTargets.map(async (target) => {\n const samples: Array<{ durationMs: number }> =\n (await Promise.resolve(\n listSuccessfulWorkflowRunDurations({\n repoFullName: target.repoFullName,\n workflowFile: target.workflowFile,\n }),\n ).catch(() => [])) ?? [];\n\n repoStates.set(target.key, {\n estimateMs: getRepresentativeDurationMs(samples.map((sample) => sample.durationMs)),\n status: 'idle',\n });\n setText(renderAggregateProgress(lane, selectedTargets, repoStates));\n }),\n );\n\n const deployBackendTarget = async (repo: (typeof selectedRepos)[number], index: number): Promise<DeployResult> => {\n const resolvedRef = branchResults[index]?.resolvedRef ?? repo.defaultRef;\n const currentState = repoStates.get(repo.key) ?? { estimateMs: null, status: 'idle' };\n\n try {\n repoStates.set(repo.key, {\n ...currentState,\n conclusion: undefined,\n startedAt: Date.now(),\n status: 'queued',\n });\n setText(renderAggregateProgress(lane, selectedTargets, repoStates));\n\n const knownRunIds = await listWorkflowRunIds({\n ref: resolvedRef,\n repoFullName: repo.repoFullName,\n workflowFile: repo.deployWorkflowFile,\n });\n\n await dispatchWorkflow({\n lane,\n ref: resolvedRef,\n repoFullName: repo.repoFullName,\n workflowFile: repo.deployWorkflowFile,\n });\n logger.step(`${repo.key} -> queued`);\n\n const run = await pollWorkflowRun({\n knownRunIds,\n ref: resolvedRef,\n repoFullName: repo.repoFullName,\n workflowFile: repo.deployWorkflowFile,\n onUpdate: (update) => {\n const nextState = repoStates.get(repo.key) ?? currentState;\n const runUrl = 'htmlUrl' in update ? update.htmlUrl : nextState.runUrl;\n repoStates.set(repo.key, {\n ...nextState,\n conclusion: undefined,\n runUrl,\n startedAt: nextState.startedAt ?? Date.now(),\n status:\n update.status === 'completed'\n ? 'completed'\n : update.status === 'pending'\n ? 'queued'\n : 'running',\n });\n setText(renderAggregateProgress(lane, selectedTargets, repoStates));\n },\n });\n logger.step(`${repo.key} -> ${run.conclusion}`);\n\n repoStates.set(repo.key, {\n ...(repoStates.get(repo.key) ?? currentState),\n conclusion: run.conclusion === 'success' ? 'success' : 'failure',\n detail:\n run.conclusion === 'success'\n ? undefined\n : run.failureMessage ?? 'workflow failed',\n runUrl: run.htmlUrl,\n startedAt: repoStates.get(repo.key)?.startedAt ?? Date.now(),\n status: 'completed',\n });\n setText(renderAggregateProgress(lane, selectedTargets, repoStates));\n\n return {\n key: repo.key,\n ref: resolvedRef,\n runUrl: run.htmlUrl,\n status: run.status,\n conclusion: run.conclusion,\n failureDetail: run.conclusion === 'success' ? undefined : run.failureMessage ?? 'workflow failed',\n };\n } catch (error) {\n const failureState = repoStates.get(repo.key) ?? currentState;\n repoStates.set(repo.key, {\n ...failureState,\n conclusion: 'failure',\n detail: getErrorMessage(error),\n runUrl: failureState.runUrl,\n startedAt: failureState.startedAt ?? Date.now(),\n status: 'completed',\n });\n setText(renderAggregateProgress(lane, selectedTargets, repoStates));\n\n return {\n key: repo.key,\n ref: resolvedRef,\n runUrl: failureState.runUrl ?? '',\n status: 'completed',\n conclusion: 'failure',\n failureDetail: getErrorMessage(error),\n };\n }\n };\n\n return Promise.all(selectedRepos.map((repo, index) => deployBackendTarget(repo, index)));\n },\n );\n\n results.forEach((result) => {\n logger.info(\n `${result.key} | ${result.ref} | ${result.conclusion} | ${result.runUrl}${result.failureDetail ? ` | ${result.failureDetail}` : ''}`,\n );\n });\n\n if (results.some((result) => result.conclusion !== 'success')) {\n throw new Error('One or more PPE lane deployments failed');\n }\n\n logger.success(`PPE lane ${lane} 发布完成`);\n logger.info('==================== 重要提示 ====================');\n logger.info(`后续请求如需命中 lane ${lane},请添加请求头:`);\n logger.info(`x-zk-ppe-lane: ${lane}`);\n logger.info('=================================================');\n};\n\nexport const registerPpeLaneDeployCommand = (program: Command): void => {\n program\n .command('deploy')\n .description('Deploy selected repositories to a PPE lane; route traffic with x-zk-ppe-lane')\n .addHelpText(\n 'after',\n '\\n说明:\\n 部署完成后,在请求头中添加 x-zk-ppe-lane: <lane> 即可命中对应泳道环境。\\n',\n )\n .action(runPpeLaneDeploy);\n};\n","import type { Command } from 'commander';\nimport { ppeLaneRepos } from '../../constants/ppe-lane-repos.js';\nimport { listLaneInstances } from '../../lib/aws.js';\nimport { CliError } from '../../lib/errors.js';\nimport {\n dispatchWorkflow,\n getRepresentativeDurationMs,\n listSuccessfulWorkflowRunDurations,\n listWorkflowRunIds,\n pollWorkflowRun,\n} from '../../lib/github.js';\nimport { createI18n } from '../../lib/i18n.js';\nimport { logger } from '../../lib/logger.js';\nimport { validatePpeLaneName } from '../../lib/ppe-lane.js';\nimport {\n renderWorkflowProgressPanel,\n type WorkflowProgressState,\n withProgressTask,\n} from '../../lib/progress.js';\nimport { ensurePrerequisites } from '../../lib/prerequisites.js';\nimport { ui } from '../../lib/ui.js';\n\ntype DestroyOutcome = {\n key: string;\n ref: string;\n result: 'failed' | 'skipped' | 'success';\n runUrl: string;\n reason?: string;\n};\n\nconst renderAggregateProgress = (\n prefix: string,\n selectedRepos: Array<{ key: string }>,\n repoStates: Map<string, WorkflowProgressState>,\n): string =>\n renderWorkflowProgressPanel({\n items: selectedRepos,\n states: repoStates,\n title: prefix,\n });\n\nconst logOutcomes = (outcomes: DestroyOutcome[]): void => {\n outcomes.forEach((outcome) => {\n logger.info(`${outcome.key} | ${outcome.ref} | ${outcome.result} | ${outcome.runUrl} | ${outcome.reason ?? '-'}`);\n });\n};\n\nexport const runPpeLaneDestroy = async (): Promise<{\n failed: number;\n skipped: number;\n success: number;\n}> => {\n const config = await ensurePrerequisites({ needsAws: true, needsGh: true });\n const t = createI18n(config.locale);\n const lane = validatePpeLaneName(await ui.input({ message: t('ppeLane.destroy.enterLane') }));\n\n const selectedKeys = await ui.checkbox({\n message: t('ppeLane.destroy.selectRepos'),\n choices: ppeLaneRepos.map((repo) => ({\n value: repo.key,\n name: repo.label,\n checked: repo.defaultDestroySelection !== false,\n })),\n });\n if (selectedKeys.length === 0) {\n throw new CliError(t('ppeLane.destroy.atLeastOneRepo'), 1);\n }\n\n const selectedRepos = ppeLaneRepos.filter((repo) => selectedKeys.includes(repo.key));\n const cloudMapResults = await Promise.all(\n selectedRepos.map((repo) =>\n listLaneInstances({\n lane,\n profile: config.defaultAwsProfile,\n region: 'us-east-1',\n serviceId: repo.cloudMapServiceId,\n }),\n ),\n );\n\n const skippedOutcomes: DestroyOutcome[] = [];\n const toDestroy = selectedRepos.filter((repo, index) => {\n const hasDeployment = (cloudMapResults[index]?.instances.length ?? 0) > 0;\n if (!hasDeployment) {\n skippedOutcomes.push({\n key: repo.key,\n ref: repo.defaultRef,\n result: 'skipped',\n runUrl: '-',\n reason: t('ppeLane.destroy.skippedReason'),\n });\n }\n\n return hasDeployment;\n });\n\n if (toDestroy.length === 0) {\n logOutcomes(skippedOutcomes);\n logger.info(t('ppeLane.destroy.noRecords'));\n return { failed: 0, skipped: skippedOutcomes.length, success: 0 };\n }\n\n logger.warn(t('ppeLane.destroy.warning', { repos: toDestroy.map((repo) => repo.key).join(', ') }));\n skippedOutcomes.forEach((outcome) => {\n logger.info(`${outcome.key} | ${outcome.result} | ${outcome.reason}`);\n });\n\n const confirmedLane = (await ui.input({ message: t('ppeLane.destroy.confirmLane', { lane }) })).trim();\n if (confirmedLane !== lane) {\n logger.warn(t('ppeLane.destroy.cancelled'));\n return { failed: 0, skipped: 0, success: 0 };\n }\n\n const repoStates = new Map<string, WorkflowProgressState>();\n\n const runOutcomes = await withProgressTask(\n {\n initialText: t('ppeLane.destroy.running', { lane }),\n heartbeatMs: 1_000,\n heartbeatText: () => renderAggregateProgress(t('ppeLane.destroy.running', { lane }), toDestroy, repoStates),\n },\n async ({ setText }) => {\n await Promise.all(\n toDestroy.map(async (repo) => {\n const samples: Array<{ durationMs: number }> =\n (await Promise.resolve(\n listSuccessfulWorkflowRunDurations({\n repoFullName: repo.repoFullName,\n workflowFile: repo.destroyWorkflowFile,\n }),\n ).catch(() => [])) ?? [];\n\n repoStates.set(repo.key, {\n estimateMs: getRepresentativeDurationMs(samples.map((sample) => sample.durationMs)),\n status: 'idle',\n });\n setText(renderAggregateProgress(t('ppeLane.destroy.running', { lane }), toDestroy, repoStates));\n }),\n );\n\n return Promise.all(\n toDestroy.map(async (repo): Promise<DestroyOutcome> => {\n const ref = repo.defaultRef;\n const initialState = repoStates.get(repo.key) ?? { estimateMs: null, status: 'idle' };\n\n try {\n repoStates.set(repo.key, {\n ...initialState,\n conclusion: undefined,\n startedAt: Date.now(),\n status: 'queued',\n });\n setText(renderAggregateProgress(t('ppeLane.destroy.running', { lane }), toDestroy, repoStates));\n\n const knownRunIds = await listWorkflowRunIds({\n ref,\n repoFullName: repo.repoFullName,\n workflowFile: repo.destroyWorkflowFile,\n });\n\n await dispatchWorkflow({\n lane,\n ref,\n repoFullName: repo.repoFullName,\n workflowFile: repo.destroyWorkflowFile,\n });\n logger.step(`${repo.key} -> queued`);\n\n const run = await pollWorkflowRun({\n knownRunIds,\n ref,\n repoFullName: repo.repoFullName,\n workflowFile: repo.destroyWorkflowFile,\n onUpdate: (update) => {\n const nextState = repoStates.get(repo.key) ?? initialState;\n const runUrl = 'htmlUrl' in update ? update.htmlUrl : nextState.runUrl;\n repoStates.set(repo.key, {\n ...nextState,\n conclusion: undefined,\n runUrl,\n startedAt: nextState.startedAt ?? Date.now(),\n status:\n update.status === 'completed'\n ? 'completed'\n : update.status === 'pending'\n ? 'queued'\n : 'running',\n });\n setText(renderAggregateProgress(t('ppeLane.destroy.running', { lane }), toDestroy, repoStates));\n },\n });\n logger.step(`${repo.key} -> ${run.conclusion}`);\n\n repoStates.set(repo.key, {\n ...(repoStates.get(repo.key) ?? initialState),\n conclusion: run.conclusion === 'success' ? 'success' : 'failure',\n runUrl: run.htmlUrl,\n startedAt: repoStates.get(repo.key)?.startedAt ?? Date.now(),\n status: 'completed',\n });\n setText(renderAggregateProgress(t('ppeLane.destroy.running', { lane }), toDestroy, repoStates));\n\n return {\n key: repo.key,\n ref,\n result: run.conclusion === 'success' ? 'success' : 'failed',\n runUrl: run.htmlUrl,\n };\n } catch (error: unknown) {\n repoStates.set(repo.key, {\n ...(repoStates.get(repo.key) ?? initialState),\n conclusion: 'failure',\n startedAt: repoStates.get(repo.key)?.startedAt ?? Date.now(),\n status: 'completed',\n });\n setText(renderAggregateProgress(t('ppeLane.destroy.running', { lane }), toDestroy, repoStates));\n\n return {\n key: repo.key,\n ref,\n result: 'failed',\n runUrl: '-',\n reason: error instanceof Error ? error.message : String(error),\n };\n }\n }),\n );\n },\n );\n\n const outcomes = [...runOutcomes, ...skippedOutcomes];\n logOutcomes(outcomes);\n\n const summary = outcomes.reduce(\n (acc, outcome) => {\n acc[outcome.result] += 1;\n return acc;\n },\n { failed: 0, skipped: 0, success: 0 },\n );\n\n if (summary.failed > 0) {\n throw new CliError(t('ppeLane.destroy.failed'), 1);\n }\n\n return summary;\n};\n\nexport const registerPpeLaneDestroyCommand = (program: Command): void => {\n program\n .command('destroy')\n .description('Trigger multiple PPE lane destroy workflows')\n .action(async () => {\n await runPpeLaneDestroy();\n });\n};\n","import type { Command } from 'commander';\nimport { ppeLaneRepos } from '../../constants/ppe-lane-repos.js';\nimport { listLaneInstances } from '../../lib/aws.js';\nimport { logger } from '../../lib/logger.js';\nimport { validatePpeLaneName } from '../../lib/ppe-lane.js';\nimport { ensurePrerequisites } from '../../lib/prerequisites.js';\nimport { ui } from '../../lib/ui.js';\n\ntype PpeLaneStatusOptions = {\n all?: boolean;\n};\n\nconst logAllLaneStatus = (\n results: Array<{\n instances: Array<{ lane: string }>;\n key: string;\n }>,\n): void => {\n results.forEach((result) => {\n logger.info(`${result.key} (${result.instances.length} 个)`);\n result.instances\n .map((instance) => instance.lane)\n .sort((left, right) => left.localeCompare(right))\n .forEach((lane) => {\n logger.step(lane);\n });\n });\n};\n\nexport const runPpeLaneStatus = async (options: PpeLaneStatusOptions = {}): Promise<{\n checked: number;\n deployed: number;\n notDeployed: number;\n}> => {\n const config = await ensurePrerequisites({ needsAws: true });\n const lane = options.all ? undefined : validatePpeLaneName(await ui.input({ message: '请输入需要查询的 PPE lane 名称' }));\n const selectedKeys = await ui.checkbox({\n message: '请选择需要查询的仓库',\n choices: ppeLaneRepos.map((repo) => ({ value: repo.key, name: repo.label, checked: true })),\n });\n\n const selectedRepos = ppeLaneRepos.filter((repo) => selectedKeys.includes(repo.key));\n const results = await Promise.all(\n selectedRepos.map(async (repo) => {\n const cloudMap = await listLaneInstances({\n profile: config.defaultAwsProfile,\n region: 'us-east-1',\n serviceId: repo.cloudMapServiceId,\n ...(lane === undefined ? {} : { lane }),\n });\n\n return {\n key: repo.key,\n repoFullName: repo.repoFullName,\n cloudMapServiceId: repo.cloudMapServiceId,\n namespaceName: cloudMap.namespaceName,\n serviceName: cloudMap.serviceName,\n instances: cloudMap.instances,\n };\n }),\n );\n\n const deployed = results.filter((result) => result.instances.length > 0).length;\n const notDeployed = results.length - deployed;\n\n logger.success(`已检查 ${results.length} 个服务,已部署 ${deployed} 个,未部署 ${notDeployed} 个`);\n if (options.all) {\n logAllLaneStatus(results);\n return {\n checked: results.length,\n deployed,\n notDeployed,\n };\n }\n\n results.forEach((result) => {\n const status = result.instances.length > 0 ? 'deployed' : 'not deployed';\n logger.info(`${result.key} | ${status} | ${result.namespaceName} | ${result.cloudMapServiceId}`);\n result.instances.forEach((instance) => {\n logger.step(`${instance.id} | ${instance.host} | ${instance.port} | ${instance.protocol}`);\n });\n });\n\n return {\n checked: results.length,\n deployed,\n notDeployed,\n };\n};\n\nexport const registerPpeLaneStatusCommand = (program: Command): void => {\n program\n .command('status')\n .description('Query PPE lane deployment status from Cloud Map')\n .option('--all', 'Query all PPE lanes')\n .action(async (options: PpeLaneStatusOptions) => {\n await runPpeLaneStatus(options);\n });\n};\n","import type { Command } from 'commander';\nimport { registerPpeLaneDeployCommand } from './deploy.js';\nimport { registerPpeLaneDestroyCommand } from './destroy.js';\nimport { registerPpeLaneStatusCommand } from './status.js';\n\nexport const registerPpeLaneCommand = (program: Command): void => {\n const lane = program.command('ppe-lane').description('Manage PPE lane workflows');\n\n registerPpeLaneDeployCommand(lane);\n registerPpeLaneDestroyCommand(lane);\n registerPpeLaneStatusCommand(lane);\n};\n","import { releaseTargets } from '../../constants/release-targets.js';\nimport { CliError } from '../../lib/errors.js';\n\nexport const resolveReleaseTarget = (targetKey: string) => {\n const target = releaseTargets.find((candidate) => candidate.key === targetKey);\n if (!target) {\n throw new CliError(`Unknown release target: ${targetKey}`, 1);\n }\n\n return target;\n};\n\nexport const getReleaseTargetChoices = (): Array<{ name: string; value: string }> =>\n releaseTargets.map((target) => ({\n name: `${target.label} (${target.repoFullName})`,\n value: target.key,\n }));\n\nexport const displayReleaseBranch = (releaseBranch: string, releaseMode: string): string =>\n releaseBranch || (releaseMode === 'mainline' ? 'mainline' : '-');\n","import type { Command } from 'commander';\nimport {\n CONTROL_REPO_FULL_NAME,\n CONTROL_RELEASE_APPROVAL_WORKFLOW_FILE,\n CONTROL_RELEASE_APPROVE_COMMAND,\n} from '../../constants/release-targets.js';\nimport {\n closeIssue,\n commentOnIssue,\n filterPendingReleaseApprovalIssues,\n listWorkflowRunIds,\n pollWorkflowRun,\n} from '../../lib/github.js';\nimport { CliError } from '../../lib/errors.js';\nimport { createI18n } from '../../lib/i18n.js';\nimport { logger } from '../../lib/logger.js';\nimport { ensurePrerequisites } from '../../lib/prerequisites.js';\nimport { ui } from '../../lib/ui.js';\nimport { displayReleaseBranch, getReleaseTargetChoices, resolveReleaseTarget } from './shared.js';\n\nconst describeApprovalIssue = (issue: {\n candidateTag: string;\n issueNumber: number;\n releaseBranch: string;\n releaseMode: string;\n}): string => `#${issue.issueNumber} ${issue.candidateTag} ${displayReleaseBranch(issue.releaseBranch, issue.releaseMode)}`;\n\nconst logApprovalSummary = (\n t: (key: string, values?: Record<string, string | number>) => string,\n input: {\n approvalIssueUrl: string;\n approvalWorkflowRunUrl: string;\n },\n): void => {\n logger.success(t('release.approve.success'));\n logger.info(t('release.common.approvalIssueUrl', { approvalIssueUrl: input.approvalIssueUrl }));\n logger.info(\n t('release.approve.approvalWorkflowRunUrl', {\n approvalWorkflowRunUrl: input.approvalWorkflowRunUrl,\n }),\n );\n logger.info(t('release.approve.feishuReminder'));\n};\n\nconst buildWorkflowError = (\n t: (key: string, values?: Record<string, string | number>) => string,\n approvalWorkflowRunUrl: string,\n): CliError =>\n new CliError(t('release.approve.workflowFailed', { approvalWorkflowRunUrl }), 1);\n\nexport const runReleaseApprove = async (): Promise<void> => {\n const config = await ensurePrerequisites({ needsAws: false, needsGh: true });\n const t = createI18n(config.locale);\n\n const selectedTargetKey = await ui.select({\n message: t('release.approve.selectTarget'),\n choices: getReleaseTargetChoices(),\n });\n const target = resolveReleaseTarget(selectedTargetKey);\n\n const pendingIssues = await filterPendingReleaseApprovalIssues(target.repoFullName);\n if (pendingIssues.length === 0) {\n logger.info(t('release.approve.noPendingIssues', { targetRepo: target.repoFullName }));\n return;\n }\n\n let approvalIssue: (typeof pendingIssues)[number] | undefined = pendingIssues[0];\n if (pendingIssues.length > 1) {\n const selectedIssueNumber = Number(\n await ui.select({\n message: t('release.approve.selectApprovalIssue'),\n choices: pendingIssues.map((issue) => ({\n name: describeApprovalIssue(issue),\n value: String(issue.issueNumber),\n })),\n }),\n );\n\n approvalIssue = pendingIssues.find((issue) => issue.issueNumber === selectedIssueNumber);\n }\n\n if (!approvalIssue) {\n throw new CliError(t('release.approve.approvalIssueMissing'), 1);\n }\n\n const confirmed = await ui.confirm({\n message: t('release.approve.confirm', {\n issueNumber: approvalIssue.issueNumber,\n candidateTag: approvalIssue.candidateTag,\n releaseBranch: displayReleaseBranch(approvalIssue.releaseBranch, approvalIssue.releaseMode),\n }),\n default: true,\n });\n if (!confirmed) {\n logger.warn(t('release.approve.cancelled'));\n return;\n }\n\n const baselineRunIds = await listWorkflowRunIds({\n event: 'issue_comment',\n repoFullName: CONTROL_REPO_FULL_NAME,\n workflowFile: CONTROL_RELEASE_APPROVAL_WORKFLOW_FILE,\n ref: 'main',\n });\n\n logger.step(t('release.approve.commenting', { issueNumber: approvalIssue.issueNumber }));\n\n const approvalComment = await commentOnIssue({\n repoFullName: CONTROL_REPO_FULL_NAME,\n issueNumber: approvalIssue.issueNumber,\n body: CONTROL_RELEASE_APPROVE_COMMAND,\n });\n\n const approvalRun = await pollWorkflowRun({\n correlation: {\n actorLogin: approvalComment.userLogin,\n createdAt: approvalComment.createdAt,\n },\n event: 'issue_comment',\n knownRunIds: baselineRunIds,\n repoFullName: CONTROL_REPO_FULL_NAME,\n workflowFile: CONTROL_RELEASE_APPROVAL_WORKFLOW_FILE,\n ref: 'main',\n });\n\n if (approvalRun.conclusion !== 'success') {\n throw buildWorkflowError(t, approvalRun.htmlUrl);\n }\n\n try {\n await closeIssue({\n repoFullName: CONTROL_REPO_FULL_NAME,\n issueNumber: approvalIssue.issueNumber,\n });\n } catch {\n logger.warn(\n t('release.approve.closeIssueWarning', {\n issueNumber: approvalIssue.issueNumber,\n }),\n );\n }\n\n logApprovalSummary(t, {\n approvalIssueUrl: approvalIssue.url,\n approvalWorkflowRunUrl: approvalRun.htmlUrl,\n });\n};\n\nexport const registerReleaseApproveCommand = (program: Command): void => {\n program\n .command('approve')\n .description('Approve a controlled release')\n .action(runReleaseApprove);\n};\n","import type { Command } from 'commander';\nimport {\n CONTROL_REPO_FULL_NAME,\n CONTROL_RELEASE_HOTFIX_WORKFLOW_FILE,\n} from '../../constants/release-targets.js';\nimport {\n dispatchControlWorkflow,\n estimateControlledReleaseDuration,\n filterPendingReleaseApprovalIssues,\n listOpenIssueIds,\n listWorkflowRunIds,\n pollWorkflowRun,\n} from '../../lib/github.js';\nimport { CliError } from '../../lib/errors.js';\nimport { createI18n } from '../../lib/i18n.js';\nimport { logger } from '../../lib/logger.js';\nimport { ensurePrerequisites } from '../../lib/prerequisites.js';\nimport { createEtaProgress } from '../../lib/progress.js';\nimport { ui } from '../../lib/ui.js';\nimport { getReleaseTargetChoices, resolveReleaseTarget } from './shared.js';\n\nconst hasValidReleaseBranchSuffix = (releaseBranch: string): boolean =>\n releaseBranch.startsWith('release/') &&\n releaseBranch\n .slice('release/'.length)\n .split('/')\n .some((segment) => segment.length > 0);\n\nconst logReleaseSummary = (t: (key: string, values?: Record<string, string | number>) => string, input: {\n approvalIssueUrl: string;\n candidateTag: string;\n controlRunUrl: string;\n overrideMode: string;\n releaseBranch: string;\n targetRepo: string;\n}): void => {\n logger.success(t('release.hotfix.success'));\n logger.info(t('release.common.targetRepo', { targetRepo: input.targetRepo }));\n logger.info(t('release.hotfix.overrideMode', { overrideMode: input.overrideMode }));\n logger.info(t('release.common.candidateTag', { candidateTag: input.candidateTag }));\n logger.info(t('release.common.releaseBranch', { releaseBranch: input.releaseBranch }));\n logger.info(t('release.common.approvalIssueUrl', { approvalIssueUrl: input.approvalIssueUrl }));\n logger.info(t('release.common.controlRunUrl', { controlRunUrl: input.controlRunUrl }));\n logger.info(t('release.hotfix.feishuReminder'));\n logger.info(t('release.hotfix.nextSteps'));\n};\n\nconst buildControlRunError = (\n t: (key: string, values?: Record<string, string | number>) => string,\n key:\n | 'release.hotfix.workflowFailed'\n | 'release.hotfix.approvalIssueMissing'\n | 'release.hotfix.approvalIssueAmbiguous',\n controlRunUrl: string,\n candidateIssueUrls?: string,\n failureMessage?: string,\n): CliError => {\n const message = t(key, { controlRunUrl, candidateIssueUrls: candidateIssueUrls ?? '' });\n if (!failureMessage) {\n return new CliError(message, 1);\n }\n\n return new CliError(\n `${message}\\n${t('release.hotfix.workflowFailureReason', {\n failureMessage,\n })}`,\n 1,\n );\n};\n\nexport const runReleaseHotfix = async (): Promise<void> => {\n const config = await ensurePrerequisites({ needsAws: false, needsGh: true });\n const t = createI18n(config.locale);\n\n const selectedTargetKey = await ui.select({\n message: t('release.hotfix.selectTarget'),\n choices: getReleaseTargetChoices(),\n });\n const target = resolveReleaseTarget(selectedTargetKey);\n\n const releaseBranch = (await ui.input({\n message: t('release.hotfix.enterReleaseBranch'),\n default: 'release/',\n })).trim();\n\n if (!hasValidReleaseBranchSuffix(releaseBranch)) {\n throw new CliError(t('release.hotfix.invalidReleaseBranch'), 1);\n }\n\n const allowUnmergedHotfix = await ui.confirm({\n message: t('release.hotfix.allowUnmergedHotfix'),\n default: false,\n });\n\n let overrideReason = '';\n if (allowUnmergedHotfix) {\n overrideReason = (await ui.input({\n message: t('release.hotfix.overrideReason'),\n })).trim();\n\n if (!overrideReason) {\n throw new CliError(t('release.hotfix.overrideReasonRequired'), 1);\n }\n }\n\n const confirmed = await ui.confirm({\n message: t('release.hotfix.confirm', {\n repoName: target.repoFullName,\n releaseBranch,\n }),\n default: true,\n });\n if (!confirmed) {\n logger.warn(t('release.hotfix.cancelled'));\n return;\n }\n\n const [baselineRunIds, baselineIssueIds] = await Promise.all([\n listWorkflowRunIds({\n repoFullName: CONTROL_REPO_FULL_NAME,\n workflowFile: CONTROL_RELEASE_HOTFIX_WORKFLOW_FILE,\n ref: 'main',\n }),\n listOpenIssueIds(CONTROL_REPO_FULL_NAME),\n ]);\n const baselineIssueIdSet = new Set(baselineIssueIds);\n const controlRunEstimateMs = await estimateControlledReleaseDuration({\n workflowFile: CONTROL_RELEASE_HOTFIX_WORKFLOW_FILE,\n targetRepo: target.repoFullName,\n releaseMode: 'hotfix',\n allowUnmergedHotfix,\n repoFullName: CONTROL_REPO_FULL_NAME,\n }).catch(() => null);\n const progress = createEtaProgress({\n label: t('release.hotfix.waiting', { repoName: target.repoFullName }),\n waitingForStartText: '已触发 workflow,正在等待 GitHub Actions 开始执行',\n estimateMs: controlRunEstimateMs,\n });\n progress.start();\n\n const controlRun = await (async () => {\n try {\n await dispatchControlWorkflow({\n ref: 'main',\n workflowFile: CONTROL_RELEASE_HOTFIX_WORKFLOW_FILE,\n inputs: {\n target_repo: target.repoFullName,\n release_branch: releaseBranch,\n allow_unmerged_hotfix: allowUnmergedHotfix,\n override_reason: overrideReason,\n },\n });\n\n return await pollWorkflowRun({\n knownRunIds: baselineRunIds,\n ref: 'main',\n repoFullName: CONTROL_REPO_FULL_NAME,\n workflowFile: CONTROL_RELEASE_HOTFIX_WORKFLOW_FILE,\n onUpdate: (update) => {\n if ('htmlUrl' in update) {\n progress.setRunUrl(update.htmlUrl);\n }\n },\n });\n } finally {\n progress.stop();\n }\n })();\n\n if (controlRun.conclusion !== 'success') {\n throw buildControlRunError(\n t,\n 'release.hotfix.workflowFailed',\n controlRun.htmlUrl,\n undefined,\n controlRun.failureMessage,\n );\n }\n\n const pendingIssues = await filterPendingReleaseApprovalIssues(target.repoFullName);\n const newIssues = pendingIssues\n .filter((issue) => issue.releaseMode === 'hotfix')\n .filter((issue) => !baselineIssueIdSet.has(issue.issueId));\n const branchMatchedIssues = newIssues.filter((issue) => issue.releaseBranch === releaseBranch);\n\n if (branchMatchedIssues.length === 0) {\n throw buildControlRunError(t, 'release.hotfix.approvalIssueMissing', controlRun.htmlUrl);\n }\n\n if (branchMatchedIssues.length > 1) {\n throw buildControlRunError(\n t,\n 'release.hotfix.approvalIssueAmbiguous',\n controlRun.htmlUrl,\n branchMatchedIssues.map((issue) => issue.url).join(', '),\n );\n }\n\n const approvalIssue = branchMatchedIssues[0];\n if (!approvalIssue) {\n throw buildControlRunError(t, 'release.hotfix.approvalIssueMissing', controlRun.htmlUrl);\n }\n\n logReleaseSummary(t, {\n approvalIssueUrl: approvalIssue.url,\n candidateTag: approvalIssue.candidateTag,\n controlRunUrl: controlRun.htmlUrl,\n overrideMode: t(\n allowUnmergedHotfix\n ? 'release.hotfix.overrideModeEnabled'\n : 'release.hotfix.overrideModeDisabled',\n ),\n releaseBranch: approvalIssue.releaseBranch,\n targetRepo: approvalIssue.targetRepo,\n });\n};\n\nexport const registerReleaseHotfixCommand = (program: Command): void => {\n program\n .command('hotfix')\n .description('Prepare a controlled hotfix release')\n .action(runReleaseHotfix);\n};\n","import type { Command } from 'commander';\nimport {\n CONTROL_REPO_FULL_NAME,\n CONTROL_RELEASE_PREPARE_WORKFLOW_FILE,\n} from '../../constants/release-targets.js';\nimport {\n dispatchControlWorkflow,\n estimateControlledReleaseDuration,\n filterPendingReleaseApprovalIssues,\n listOpenIssueIds,\n listWorkflowRunIds,\n pollWorkflowRun,\n} from '../../lib/github.js';\nimport { CliError } from '../../lib/errors.js';\nimport { createI18n } from '../../lib/i18n.js';\nimport { logger } from '../../lib/logger.js';\nimport { ensurePrerequisites } from '../../lib/prerequisites.js';\nimport { createEtaProgress } from '../../lib/progress.js';\nimport { ui } from '../../lib/ui.js';\nimport { displayReleaseBranch, getReleaseTargetChoices, resolveReleaseTarget } from './shared.js';\n\nconst logReleaseSummary = (t: (key: string, values?: Record<string, string | number>) => string, input: {\n approvalIssueUrl: string;\n candidateTag: string;\n controlRunUrl: string;\n releaseBranch: string;\n releaseMode: string;\n releaseProfile: string;\n targetRepo: string;\n}): void => {\n logger.success(t('release.prepare.success'));\n logger.info(t('release.common.targetRepo', { targetRepo: input.targetRepo }));\n logger.info(t('release.common.releaseProfile', { releaseProfile: input.releaseProfile }));\n logger.info(t('release.common.candidateTag', { candidateTag: input.candidateTag }));\n logger.info(t('release.common.releaseBranch', { releaseBranch: displayReleaseBranch(input.releaseBranch, input.releaseMode) }));\n logger.info(t('release.common.approvalIssueUrl', { approvalIssueUrl: input.approvalIssueUrl }));\n logger.info(t('release.common.controlRunUrl', { controlRunUrl: input.controlRunUrl }));\n logger.info(t('release.prepare.feishuReminder'));\n logger.info(t('release.prepare.nextSteps'));\n};\n\nconst buildControlRunError = (\n t: (key: string, values?: Record<string, string | number>) => string,\n key:\n | 'release.prepare.workflowFailed'\n | 'release.prepare.approvalIssueMissing'\n | 'release.prepare.approvalIssueAmbiguous',\n controlRunUrl: string,\n candidateIssueUrls?: string,\n): CliError => new CliError(t(key, { controlRunUrl, candidateIssueUrls: candidateIssueUrls ?? '' }), 1);\n\nexport const runReleasePrepare = async (): Promise<void> => {\n const config = await ensurePrerequisites({ needsAws: false, needsGh: true });\n const t = createI18n(config.locale);\n\n const selectedTargetKey = await ui.select({\n message: t('release.prepare.selectTarget'),\n choices: getReleaseTargetChoices(),\n });\n const target = resolveReleaseTarget(selectedTargetKey);\n\n const confirmed = await ui.confirm({\n message: t('release.prepare.confirm', { repoName: target.repoFullName }),\n default: true,\n });\n if (!confirmed) {\n logger.warn(t('release.prepare.cancelled'));\n return;\n }\n\n const [baselineRunIds, baselineIssueIds] = await Promise.all([\n listWorkflowRunIds({\n repoFullName: CONTROL_REPO_FULL_NAME,\n workflowFile: CONTROL_RELEASE_PREPARE_WORKFLOW_FILE,\n ref: 'main',\n }),\n listOpenIssueIds(CONTROL_REPO_FULL_NAME),\n ]);\n const baselineIssueIdSet = new Set(baselineIssueIds);\n const controlRunEstimateMs = await estimateControlledReleaseDuration({\n workflowFile: CONTROL_RELEASE_PREPARE_WORKFLOW_FILE,\n targetRepo: target.repoFullName,\n releaseProfile: target.defaultReleaseProfile,\n releaseMode: 'mainline',\n repoFullName: CONTROL_REPO_FULL_NAME,\n }).catch(() => null);\n const progress = createEtaProgress({\n label: t('release.prepare.waiting', { repoName: target.repoFullName }),\n waitingForStartText: '已触发 workflow,正在等待 GitHub Actions 开始执行',\n estimateMs: controlRunEstimateMs,\n });\n progress.start();\n\n const controlRun = await (async () => {\n try {\n await dispatchControlWorkflow({\n ref: 'main',\n workflowFile: CONTROL_RELEASE_PREPARE_WORKFLOW_FILE,\n inputs: {\n target_repo: target.repoFullName,\n release_profile: target.defaultReleaseProfile,\n },\n });\n\n return await pollWorkflowRun({\n knownRunIds: baselineRunIds,\n ref: 'main',\n repoFullName: CONTROL_REPO_FULL_NAME,\n workflowFile: CONTROL_RELEASE_PREPARE_WORKFLOW_FILE,\n onUpdate: (update) => {\n if ('htmlUrl' in update) {\n progress.setRunUrl(update.htmlUrl);\n }\n },\n });\n } finally {\n progress.stop();\n }\n })();\n\n if (controlRun.conclusion !== 'success') {\n throw buildControlRunError(t, 'release.prepare.workflowFailed', controlRun.htmlUrl);\n }\n\n const pendingIssues = await filterPendingReleaseApprovalIssues(target.repoFullName);\n const newIssues = pendingIssues\n .filter((issue) => issue.releaseMode === 'mainline')\n .filter((issue) => !baselineIssueIdSet.has(issue.issueId));\n\n if (newIssues.length === 0) {\n throw buildControlRunError(t, 'release.prepare.approvalIssueMissing', controlRun.htmlUrl);\n }\n\n if (newIssues.length > 1) {\n throw buildControlRunError(\n t,\n 'release.prepare.approvalIssueAmbiguous',\n controlRun.htmlUrl,\n newIssues.map((issue) => issue.url).join(', '),\n );\n }\n\n const approvalIssue = newIssues[0];\n if (!approvalIssue) {\n throw buildControlRunError(t, 'release.prepare.approvalIssueMissing', controlRun.htmlUrl);\n }\n\n logReleaseSummary(t, {\n approvalIssueUrl: approvalIssue.url,\n candidateTag: approvalIssue.candidateTag,\n controlRunUrl: controlRun.htmlUrl,\n releaseBranch: approvalIssue.releaseBranch,\n releaseMode: approvalIssue.releaseMode,\n releaseProfile: approvalIssue.releaseProfile,\n targetRepo: approvalIssue.targetRepo,\n });\n};\n\nexport const registerReleasePrepareCommand = (program: Command): void => {\n program\n .command('prepare')\n .description('Prepare a controlled release')\n .action(runReleasePrepare);\n};\n","import { mkdtemp, readFile, rm } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\nimport { rollbackTargets, tuttiServerRollbackTarget } from '../../constants/rollback-targets.js';\nimport { CliError } from '../../lib/errors.js';\nimport { listWorkflowRunIds, pollWorkflowRun } from '../../lib/github.js';\nimport { logger } from '../../lib/logger.js';\nimport { ensurePrerequisites } from '../../lib/prerequisites.js';\nimport { runCommand } from '../../lib/shell.js';\nimport { ui } from '../../lib/ui.js';\nimport { fetchLocalRollbackCatalog } from './rollback-local.js';\n\nconst REPO = tuttiServerRollbackTarget.repoFullName;\nconst WORKFLOW = 'rollback.yml';\nconst SHA256 = /^sha256:[0-9a-f]{64}$/;\nconst SINGAPORE_TIME = new Intl.DateTimeFormat('sv-SE', {\n timeZone: 'Asia/Singapore', dateStyle: 'short', timeStyle: 'medium',\n});\nconst SINGAPORE_CHOICE_TIME = new Intl.DateTimeFormat('sv-SE', {\n timeZone: 'Asia/Singapore', dateStyle: 'short', timeStyle: 'short',\n});\n\nconst displayTime = (raw: string): string => {\n const date = new Date(raw);\n return Number.isNaN(date.getTime()) ? raw : `${SINGAPORE_TIME.format(date)} SGT`;\n};\n\nconst displayChoiceTime = (raw: string): string => {\n const date = new Date(raw);\n return Number.isNaN(date.getTime()) ? raw : SINGAPORE_CHOICE_TIME.format(date);\n};\n\nexport type RollbackCandidate = {\n revision: number;\n deployedAt: string;\n digest: string;\n version: string;\n current: boolean;\n workflowSucceeded?: boolean;\n};\n\nexport type RollbackCatalog = {\n environment: 'production';\n currentDigest: string;\n currentRevision: number;\n candidates: RollbackCandidate[];\n};\n\nexport const buildRollbackChoices = (catalog: RollbackCatalog) => catalog.candidates\n .filter((candidate) => !candidate.current && candidate.digest !== catalog.currentDigest)\n .sort((left, right) => Date.parse(right.deployedAt) - Date.parse(left.deployedAt))\n .map((candidate) => ({\n name: `${displayChoiceTime(candidate.deployedAt)} SGT #${candidate.revision} ${candidate.version}`,\n value: candidate.revision,\n }));\n\ntype GithubRun = { id: number; status: string; display_title: string; html_url: string };\n\nconst gh = async (args: string[]): Promise<string> => {\n const result = await runCommand('gh', args);\n if (result.exitCode !== 0) {\n throw new CliError(result.stderr.trim() || result.stdout.trim() || `gh ${args[0]} failed`, 1);\n }\n return result.stdout;\n};\n\nexport const parseRollbackCatalog = (raw: string): RollbackCatalog => {\n const data = JSON.parse(raw) as RollbackCatalog;\n if (\n data.environment !== 'production' ||\n !SHA256.test(data.currentDigest) ||\n !Number.isSafeInteger(data.currentRevision) ||\n !Array.isArray(data.candidates) ||\n data.candidates.length === 0 ||\n data.candidates.length > 10\n ) {\n throw new CliError('Rollback catalog is invalid', 1);\n }\n for (const candidate of data.candidates) {\n if (\n !Number.isSafeInteger(candidate.revision) || candidate.revision <= 0 ||\n !SHA256.test(candidate.digest) || !candidate.deployedAt || !candidate.version ||\n typeof candidate.current !== 'boolean'\n ) {\n throw new CliError('Rollback catalog contains an invalid deployment', 1);\n }\n }\n return data;\n};\n\nconst listActiveDeployments = async (): Promise<GithubRun[]> => {\n const runs = await Promise.all(['deploy.yml', WORKFLOW].map(async (workflow) => {\n const raw = await gh(['api', `repos/${REPO}/actions/workflows/${workflow}/runs?per_page=30`]);\n return (JSON.parse(raw) as { workflow_runs: GithubRun[] }).workflow_runs;\n }));\n return runs.flat().filter((run) =>\n run.status !== 'completed' && !run.display_title.startsWith('Rollback / list /'),\n );\n};\n\nconst ensureNoActiveDeployment = async (): Promise<void> => {\n const active = await listActiveDeployments();\n if (active.length > 0) {\n throw new CliError(`Production deployment is already running: ${active[0]?.html_url}`, 1);\n }\n};\n\nconst dispatch = async (operation: 'list' | 'execute', inputs: Record<string, string> = {}) => {\n const knownRunIds = await listWorkflowRunIds({ repoFullName: REPO, workflowFile: WORKFLOW, ref: 'main' });\n const args = ['workflow', 'run', WORKFLOW, '--repo', REPO, '--ref', 'main', '-f', `operation=${operation}`];\n for (const [key, value] of Object.entries(inputs)) {\n args.push('-f', `${key}=${value}`);\n }\n await gh(args);\n const progress = ui.spinner(operation === 'list' ? '读取生产部署历史...' : '等待生产回滚和健康检查...').start();\n try {\n const run = await pollWorkflowRun({\n knownRunIds,\n repoFullName: REPO,\n workflowFile: WORKFLOW,\n ref: 'main',\n maxAttempts: operation === 'execute' ? 420 : 180,\n onUpdate: (update) => {\n if ('htmlUrl' in update) progress.text = `GitHub Actions: ${update.htmlUrl}`;\n },\n });\n if (run.conclusion !== 'success') {\n let state = '';\n if (operation === 'execute') {\n const dir = await mkdtemp(join(tmpdir(), 'tutti-rollback-state-'));\n try {\n await gh(['run', 'download', String(run.runId), '--repo', REPO, '--name', 'rollback-state', '--dir', dir]);\n state = `\\n${await readFile(join(dir, 'rollback-state.txt'), 'utf8')}`;\n } catch {\n state = '\\nActual production state is available in the workflow logs.';\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n }\n throw new CliError(`Workflow failed: ${run.failureMessage ?? run.conclusion}\\n${run.htmlUrl}${state}`, 1);\n }\n return run;\n } finally {\n progress.stop();\n }\n};\n\nconst fetchCatalog = async (runId: number): Promise<RollbackCatalog> => {\n const dir = await mkdtemp(join(tmpdir(), 'tutti-rollback-'));\n try {\n await gh(['run', 'download', String(runId), '--repo', REPO, '--name', 'rollback-catalog', '--dir', dir]);\n return parseRollbackCatalog(await readFile(join(dir, 'rollback-catalog.json'), 'utf8'));\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n};\n\nconst readCatalog = async (): Promise<RollbackCatalog> => {\n const progress = ui.spinner('直接读取生产 Helm 历史...').start();\n try {\n return await fetchLocalRollbackCatalog();\n } catch {\n // Local cluster access is optional; the protected workflow can read the same state.\n } finally {\n progress.stop();\n }\n logger.warn('本机无法完整读取生产部署历史,改用 GitHub Actions 查询。');\n const listRun = await dispatch('list');\n return fetchCatalog(listRun.runId);\n};\n\nexport const runTuttiRollback = async (options: { revision?: string; yes?: boolean }): Promise<void> => {\n await ensurePrerequisites({ needsGh: true });\n await ensureNoActiveDeployment();\n const catalog = await readCatalog();\n const choices = buildRollbackChoices(catalog);\n if (choices.length === 0) {\n throw new CliError('No previous retained production image is available to restore', 1);\n }\n\n let revision: number;\n if (options.revision) {\n revision = Number(options.revision);\n } else {\n const current = catalog.candidates.find((candidate) => candidate.current);\n logger.info(`Currently deployed: #${catalog.currentRevision} ${current?.version ?? catalog.currentDigest.slice(0, 19)}${current?.workflowSucceeded === false ? ' [checks failed]' : ''}`);\n revision = await ui.select({\n message: 'Select a production image to restore (newest first)',\n choices,\n pageSize: choices.length,\n });\n }\n const selected = catalog.candidates.find((candidate) =>\n candidate.revision === revision && !candidate.current && candidate.digest !== catalog.currentDigest,\n );\n if (!selected) {\n throw new CliError(`Revision ${revision} is not an eligible recent deployment`, 1);\n }\n\n logger.info(`Environment: production`);\n logger.info(`Current: Helm revision ${catalog.currentRevision}`);\n logger.info(` ${catalog.currentDigest}`);\n logger.info(`Target: Helm revision ${selected.revision} / ${displayTime(selected.deployedAt)} / ${selected.version}`);\n logger.info(` ${selected.digest}`);\n logger.info('GitHub Actions will recheck the live deployment and target image before changing production.');\n if (!options.yes && !await ui.confirm({ message: 'Restore this image to production?', default: false })) {\n logger.warn('Rollback cancelled');\n return;\n }\n await ensureNoActiveDeployment();\n const run = await dispatch('execute', {\n revision: String(selected.revision),\n digest: selected.digest,\n expected_current_digest: catalog.currentDigest,\n expected_current_revision: String(catalog.currentRevision),\n });\n logger.success(`Production rollback completed: ${selected.digest}`);\n logger.info(run.htmlUrl);\n};\n\nexport const registerReleaseRollbackCommand = (program: Command): void => {\n program\n .command('rollback')\n .description('Restore a recent production image')\n .argument('[repository]', 'Rollback target; omit to choose interactively')\n .option('--revision <number>', 'Select a recent Helm revision without the chooser')\n .option('--yes', 'Skip the final confirmation')\n .action(async (repository: string | undefined, options: { revision?: string; yes?: boolean }) => {\n const selected = repository ?? await ui.select({\n message: 'Select a repository to roll back',\n choices: rollbackTargets.map((target) => ({ name: target.label, value: target.key })),\n });\n if (selected !== tuttiServerRollbackTarget.key) {\n throw new CliError('Only tutti-server is currently supported', 1);\n }\n await runTuttiRollback(options);\n });\n};\n","export const tuttiServerRollbackTarget = {\n key: 'tutti-server',\n label: 'tutti-server',\n repoFullName: 'tutti-lab/tutti-server',\n} as const;\n\nexport const rollbackTargets = [tuttiServerRollbackTarget];\n","import { CliError } from '../../lib/errors.js';\nimport { runCommand } from '../../lib/shell.js';\nimport type { RollbackCandidate, RollbackCatalog } from './rollback.js';\n\nconst CLUSTER = 'arn:aws:eks:us-east-1:250509935467:cluster/nexight-ojo-us-east-1';\nconst REPOSITORY = '250509935467.dkr.ecr.us-east-1.amazonaws.com/nexight/tutti/tutti-server';\nconst DIGEST = /^sha256:[0-9a-f]{64}$/;\nconst MANIFEST_IMAGE = new RegExp(`image:\\\\s*[\"']?${REPOSITORY.replaceAll('.', '\\\\.')}@(sha256:[0-9a-f]{64})`, 'g');\n\ntype HelmHistoryEntry = {\n revision: number;\n updated: string;\n status: string;\n};\n\nconst read = async (command: string, args: string[]): Promise<string> => {\n const result = await runCommand(command, args);\n if (result.exitCode !== 0) {\n throw new CliError(result.stderr.trim() || `${command} read failed`, 1);\n }\n return result.stdout.trim();\n};\n\nexport const digestFromManifest = (manifest: string): string => {\n const matches = [...manifest.matchAll(MANIFEST_IMAGE)].map((match) => match[1]);\n const digests = new Set(matches);\n if (digests.size !== 1) {\n throw new CliError('Helm revision has no unambiguous Tutti image', 1);\n }\n return [...digests][0] as string;\n};\n\nexport const buildLocalRollbackCatalog = (\n history: HelmHistoryEntry[],\n deployment: unknown,\n manifests: Map<number, string>,\n): RollbackCatalog => {\n if (!Array.isArray(history) || history.length === 0) {\n throw new CliError('Production Helm history is empty', 1);\n }\n const sorted = [...history].sort((left, right) => right.revision - left.revision);\n const latest = sorted[0];\n if (!latest || !['deployed', 'failed'].includes(latest.status)) {\n throw new CliError('Latest Helm revision needs inspection', 1);\n }\n const resource = deployment as {\n spec?: { template?: { spec?: { containers?: Array<{ name?: string; image?: string }> } } };\n };\n const images = resource?.spec?.template?.spec?.containers\n ?.filter((container) => container.name === 'tutti-server')\n .map((container) => container.image);\n if (images?.length !== 1 || !images[0]?.startsWith(`${REPOSITORY}@`)) {\n throw new CliError('Production deployment has no unambiguous Tutti image', 1);\n }\n const currentDigest = images[0].slice(REPOSITORY.length + 1);\n if (!DIGEST.test(currentDigest)) {\n throw new CliError('Production deployment image is not digest-pinned', 1);\n }\n\n const entries = [latest, ...sorted.filter((item) =>\n item.revision !== latest.revision && ['deployed', 'superseded'].includes(item.status),\n )].slice(0, 10);\n const candidates: RollbackCandidate[] = entries.map((item) => {\n const manifest = manifests.get(item.revision);\n if (!manifest) {\n throw new CliError(`Missing manifest for Helm revision ${item.revision}`, 1);\n }\n const digest = digestFromManifest(manifest);\n return {\n revision: item.revision,\n deployedAt: item.updated,\n digest,\n version: `sha256:${digest.slice(7, 19)}`,\n current: digest === currentDigest,\n };\n });\n if (candidates[0]?.digest !== currentDigest) {\n throw new CliError('Current image does not match the latest Helm revision', 1);\n }\n return { environment: 'production', currentDigest, currentRevision: latest.revision, candidates };\n};\n\nexport const fetchLocalRollbackCatalog = async (): Promise<RollbackCatalog> => {\n const cluster = await read('kubectl', ['config', 'view', '--minify', '-o', 'jsonpath={.clusters[0].name}']);\n if (cluster !== CLUSTER) {\n throw new CliError('Current kubectl context is not the production cluster', 1);\n }\n const [historyRaw, deploymentRaw] = await Promise.all([\n read('helm', ['history', 'tutti-server', '-n', 'tutti', '--max', '100', '-o', 'json']),\n read('kubectl', ['get', 'deployment', 'tutti-server', '-n', 'tutti', '-o', 'json']),\n ]);\n const history = JSON.parse(historyRaw) as HelmHistoryEntry[];\n const deployment = JSON.parse(deploymentRaw) as unknown;\n if (!Array.isArray(history) || history.length === 0) {\n throw new CliError('Production Helm history is empty', 1);\n }\n const sorted = [...history].sort((left, right) => right.revision - left.revision);\n const latest = sorted[0];\n const entries = [latest, ...sorted.filter((item) =>\n item.revision !== latest.revision && ['deployed', 'superseded'].includes(item.status),\n )].slice(0, 10);\n const manifests = new Map(await Promise.all(entries.map(async (item) => [\n item.revision,\n await read('helm', ['get', 'manifest', 'tutti-server', '-n', 'tutti', '--revision', String(item.revision)]),\n ] as const)));\n return buildLocalRollbackCatalog(history, deployment, manifests);\n};\n","import type { Command } from 'commander';\nimport { registerReleaseApproveCommand } from './approve.js';\nimport { registerReleaseHotfixCommand } from './hotfix.js';\nimport { registerReleasePrepareCommand } from './prepare.js';\nimport { registerReleaseRollbackCommand } from './rollback.js';\n\nexport const registerReleaseCommand = (program: Command): void => {\n const release = program.command('release').description('Manage controlled release workflows');\n\n registerReleasePrepareCommand(release);\n registerReleaseHotfixCommand(release);\n registerReleaseApproveCommand(release);\n registerReleaseRollbackCommand(release);\n};\n","import { createRequire } from 'node:module';\n\ntype PackageMetadata = {\n version: string;\n};\n\nconst require = createRequire(import.meta.url);\n\nexport const readCliVersion = (): string => {\n for (const candidate of ['../../package.json', '../package.json']) {\n try {\n return (require(candidate) as PackageMetadata).version;\n } catch {\n continue;\n }\n }\n\n throw new Error('Unable to resolve package.json');\n};\n","import { realpath } from 'node:fs/promises';\nimport { join, resolve, sep } from 'node:path';\nimport { loadConfig, saveConfig, type CliConfig } from './config.js';\nimport { createI18n } from './i18n.js';\nimport { logger } from './logger.js';\nimport { withProgressTask } from './progress.js';\nimport { runCommand } from './shell.js';\nimport { ui } from './ui.js';\n\nexport type InstallSource = 'bun' | 'npm' | 'pnpm' | 'unknown';\nexport type VersionSeverity = 'major' | 'minor' | 'patch' | 'none';\n\ntype InstallSourceInput = {\n bunGlobalBin?: string | null;\n npmGlobalRoot?: string | null;\n pnpmGlobalRoot?: string | null;\n rawEntryPath?: string | null;\n resolvedEntryPath?: string | null;\n};\n\ntype ParsedVersion = {\n major: number;\n minor: number;\n patch: number;\n prerelease: string[] | null;\n};\n\ntype RegistryPayload = {\n 'dist-tags'?: {\n latest?: unknown;\n };\n};\n\ntype UpgradeCommand = {\n args: string[];\n command: string;\n};\n\nexport type CliVersionCheckResult =\n | {\n action: 'continue';\n exitCode: 0;\n }\n | {\n action: 'stop';\n exitCode: number;\n };\n\ntype EnsureCliVersionIsUsableOptions = {\n entryPath?: string;\n env?: NodeJS.ProcessEnv;\n isInteractive?: boolean;\n};\n\nconst PACKAGE_NAME = '@tutti-os/nexight-devops';\nconst AUTO_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;\nconst DEFAULT_LOCALE = 'zh-CN';\nconst PROBE_TIMEOUT_MS = 3000;\nconst REGISTRY_URL = 'https://registry.npmjs.org/@tutti-os%2Fnexight-devops';\nconst REGISTRY_TIMEOUT_MS = 3000;\nconst VERSION_PATTERN =\n /^v?(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/;\n\nconst parseVersion = (input: string): ParsedVersion | null => {\n const match = input.trim().match(VERSION_PATTERN);\n if (!match) {\n return null;\n }\n\n const [, major, minor, patch, prerelease] = match;\n\n return {\n major: Number(major),\n minor: Number(minor),\n patch: Number(patch),\n prerelease: prerelease ? prerelease.split('.') : null,\n };\n};\n\nconst comparePrerelease = (left: string[], right: string[]): number => {\n const maxLength = Math.max(left.length, right.length);\n\n for (let index = 0; index < maxLength; index += 1) {\n const leftPart = left[index];\n const rightPart = right[index];\n\n if (leftPart === undefined) {\n return -1;\n }\n\n if (rightPart === undefined) {\n return 1;\n }\n\n const leftIsNumeric = /^\\d+$/.test(leftPart);\n const rightIsNumeric = /^\\d+$/.test(rightPart);\n\n if (leftIsNumeric && rightIsNumeric) {\n const difference = Number(leftPart) - Number(rightPart);\n if (difference !== 0) {\n return difference;\n }\n continue;\n }\n\n if (leftIsNumeric) {\n return -1;\n }\n\n if (rightIsNumeric) {\n return 1;\n }\n\n if (leftPart < rightPart) {\n return -1;\n }\n\n if (leftPart > rightPart) {\n return 1;\n }\n }\n\n return 0;\n};\n\nconst compareCoreVersion = (current: ParsedVersion, latest: ParsedVersion): number => {\n if (latest.major !== current.major) {\n return latest.major - current.major;\n }\n\n if (latest.minor !== current.minor) {\n return latest.minor - current.minor;\n }\n\n return latest.patch - current.patch;\n};\n\nconst isInsidePackageRoot = (entryPath: string | null | undefined, root: string | null | undefined): boolean => {\n if (!entryPath || !root) {\n return false;\n }\n\n const packageRoot = resolve(join(root, '@tutti-os', 'nexight-devops'));\n const targetPath = resolve(entryPath);\n\n return targetPath === packageRoot || targetPath.startsWith(`${packageRoot}${sep}`);\n};\n\nconst isInsideBunGlobalBin = (entryPath: string | null | undefined, bunGlobalBin: string | null | undefined): boolean => {\n if (!entryPath || !bunGlobalBin) {\n return false;\n }\n\n const targetPath = resolve(entryPath);\n const binPath = resolve(bunGlobalBin);\n const expectedEntryPath = resolve(join(binPath, 'nexight-devops'));\n\n return targetPath === expectedEntryPath;\n};\n\nconst readGlobalPath = async (command: string, args: string[]): Promise<string | null> => {\n const result = await runCommand(command, args, { timeout: PROBE_TIMEOUT_MS }).catch(() => null);\n\n if (!result) {\n return null;\n }\n\n if (result.exitCode !== 0) {\n return null;\n }\n\n const stdout = result.stdout.trim();\n return stdout || null;\n};\n\nexport const shouldSkipVersionCheck = (argv: string[], env: NodeJS.ProcessEnv = process.env): boolean => {\n if (env.NEXIGHT_DEVOPS_SKIP_UPDATE_CHECK === '1') {\n return true;\n }\n\n return (\n argv.length <= 2 ||\n argv.includes('--version') ||\n argv.includes('-V') ||\n argv.includes('--help') ||\n argv.includes('-h') ||\n argv.slice(2).includes('help') ||\n argv[2] === 'update-version'\n );\n};\n\nexport const getVersionSeverity = (currentVersion: string, latestVersion: string): VersionSeverity => {\n const current = parseVersion(currentVersion);\n const latest = parseVersion(latestVersion);\n\n if (!current || !latest) {\n return 'none';\n }\n\n if (!current.prerelease && latest.prerelease) {\n return 'none';\n }\n\n const coreComparison = compareCoreVersion(current, latest);\n if (coreComparison < 0) {\n return 'none';\n }\n\n if (coreComparison > 0 && latest.major > current.major) {\n return 'major';\n }\n\n if (coreComparison > 0 && latest.minor > current.minor) {\n return 'minor';\n }\n\n if (coreComparison > 0 && latest.patch > current.patch) {\n return 'patch';\n }\n\n if (current.prerelease && !latest.prerelease) {\n return 'patch';\n }\n\n if (!current.prerelease && latest.prerelease) {\n return 'none';\n }\n\n if (current.prerelease && latest.prerelease && comparePrerelease(latest.prerelease, current.prerelease) > 0) {\n return 'patch';\n }\n\n return 'none';\n};\n\nexport const classifyInstallSource = (input: InstallSourceInput): InstallSource => {\n if (isInsidePackageRoot(input.resolvedEntryPath, input.npmGlobalRoot)) {\n return 'npm';\n }\n\n if (isInsidePackageRoot(input.resolvedEntryPath, input.pnpmGlobalRoot)) {\n return 'pnpm';\n }\n\n if (isInsideBunGlobalBin(input.rawEntryPath, input.bunGlobalBin)) {\n return 'bun';\n }\n\n return 'unknown';\n};\n\nexport const buildUpgradeCommand = (source: InstallSource): UpgradeCommand | null => {\n if (source === 'npm') {\n return {\n command: 'npm',\n args: ['install', '-g', `${PACKAGE_NAME}@latest`],\n };\n }\n\n if (source === 'pnpm') {\n return {\n command: 'pnpm',\n args: ['add', '-g', `${PACKAGE_NAME}@latest`],\n };\n }\n\n if (source === 'bun') {\n return {\n command: 'bun',\n args: ['add', '-g', `${PACKAGE_NAME}@latest`],\n };\n }\n\n return null;\n};\n\nexport const fetchLatestPublishedVersion = async (fetchImpl: typeof fetch = fetch): Promise<string> => {\n const response = await fetchImpl(REGISTRY_URL, {\n signal: AbortSignal.timeout(REGISTRY_TIMEOUT_MS),\n });\n if (!response.ok) {\n throw new Error(`Registry request failed with status ${response.status}`);\n }\n\n const payload = (await response.json()) as RegistryPayload;\n const latest = payload['dist-tags']?.latest;\n\n if (typeof latest !== 'string' || latest.trim() === '') {\n throw new Error('Registry response is missing dist-tags.latest');\n }\n\n return latest;\n};\n\nexport const detectInstallSource = async (entryPath = process.argv[1]): Promise<InstallSource> => {\n const rawEntryPath = entryPath ? resolve(entryPath) : null;\n const resolvedEntryPath = entryPath ? await realpath(entryPath).catch(() => rawEntryPath) : null;\n\n const [npmGlobalRoot, pnpmGlobalRoot, bunGlobalBin] = await Promise.all([\n readGlobalPath('npm', ['root', '-g']),\n readGlobalPath('pnpm', ['root', '-g']),\n readGlobalPath('bun', ['pm', 'bin', '-g']),\n ]);\n\n return classifyInstallSource({\n bunGlobalBin,\n npmGlobalRoot,\n pnpmGlobalRoot,\n rawEntryPath,\n resolvedEntryPath,\n });\n};\n\nconst renderUpgradeCommand = (upgradeCommand: UpgradeCommand): string =>\n [upgradeCommand.command, ...upgradeCommand.args].join(' ');\n\nconst renderManualUpgradeCommands = (): string =>\n [\n 'npm install -g @tutti-os/nexight-devops@latest',\n 'pnpm add -g @tutti-os/nexight-devops@latest',\n 'bun add -g @tutti-os/nexight-devops@latest',\n ].join('\\n');\n\nconst continueResult = (): CliVersionCheckResult => ({\n action: 'continue',\n exitCode: 0,\n});\n\nconst stopResult = (exitCode: number): CliVersionCheckResult => ({\n action: 'stop',\n exitCode,\n});\n\nconst loadVersionCheckContext = async (): Promise<{\n config: CliConfig | null;\n t: ReturnType<typeof createI18n>;\n}> => {\n try {\n const config = await loadConfig();\n return {\n config,\n t: createI18n(config.locale),\n };\n } catch {\n return {\n config: null,\n t: createI18n(DEFAULT_LOCALE),\n };\n }\n};\n\nconst hasFreshVersionCheck = (lastCheckedAt: string | null | undefined, now = Date.now()): boolean => {\n if (!lastCheckedAt) {\n return false;\n }\n\n const checkedAt = Date.parse(lastCheckedAt);\n if (Number.isNaN(checkedAt)) {\n return false;\n }\n\n return now - checkedAt < AUTO_CHECK_INTERVAL_MS;\n};\n\nconst persistVersionCheckTimestamp = async (\n config: CliConfig | null,\n checkedAt = new Date().toISOString(),\n): Promise<void> => {\n if (!config) {\n return;\n }\n\n try {\n await saveConfig({\n ...config,\n versionCheck: {\n lastAutoCheckedAt: checkedAt,\n },\n });\n } catch {\n // Best-effort persistence: version checks should never block command execution.\n }\n};\n\nconst detectUpgradeCommand = async (\n t: ReturnType<typeof createI18n>,\n entryPath?: string,\n): Promise<UpgradeCommand | null> => {\n const installSource = await withProgressTask(\n {\n initialText: t('versionUpdate.detectingInstallSource'),\n },\n async () => detectInstallSource(entryPath),\n ).catch(() => 'unknown' as const);\n\n return buildUpgradeCommand(installSource);\n};\n\nconst runUpgrade = async (\n upgradeCommand: UpgradeCommand,\n latestVersion: string,\n t: ReturnType<typeof createI18n>,\n): Promise<boolean> => {\n logger.step(t('versionUpdate.upgrading', { command: renderUpgradeCommand(upgradeCommand) }));\n const upgradeResult = await runCommand(upgradeCommand.command, upgradeCommand.args, { stdio: 'inherit' });\n\n if (upgradeResult.exitCode !== 0) {\n return false;\n }\n\n logger.success(t('versionUpdate.upgradeSucceeded', { latestVersion }));\n logger.info(t('versionUpdate.rerun'));\n return true;\n};\n\nexport const ensureCliVersionIsUsable = async (\n argv: string[],\n currentVersion: string,\n options: EnsureCliVersionIsUsableOptions = {},\n): Promise<CliVersionCheckResult> => {\n const env = options.env ?? process.env;\n const isInteractive = options.isInteractive ?? Boolean(process.stdin.isTTY && process.stdout.isTTY);\n\n if (shouldSkipVersionCheck(argv, env)) {\n return continueResult();\n }\n\n const { config, t } = await loadVersionCheckContext();\n\n if (hasFreshVersionCheck(config?.versionCheck?.lastAutoCheckedAt)) {\n return continueResult();\n }\n\n let latestVersion: string;\n try {\n latestVersion = await withProgressTask(\n {\n initialText: t('versionUpdate.checkingRegistry'),\n },\n async () => fetchLatestPublishedVersion(),\n );\n } catch {\n await persistVersionCheckTimestamp(config);\n logger.warn(t('versionUpdate.registryCheckFailed'));\n return continueResult();\n }\n\n await persistVersionCheckTimestamp(config);\n\n const severity = getVersionSeverity(currentVersion, latestVersion);\n if (severity === 'none') {\n return continueResult();\n }\n\n if (severity !== 'major' && !isInteractive) {\n logger.warn(t('versionUpdate.available', { currentVersion, latestVersion }));\n return continueResult();\n }\n\n const upgradeCommand = await detectUpgradeCommand(t, options.entryPath ?? argv[1]);\n\n if (severity === 'major') {\n logger.warn(t('versionUpdate.majorRequired', { currentVersion, latestVersion }));\n\n if (!upgradeCommand) {\n logger.warn(t('versionUpdate.manualUpgrade', { commands: renderManualUpgradeCommands() }));\n return stopResult(1);\n }\n\n if (!(await runUpgrade(upgradeCommand, latestVersion, t))) {\n logger.error(t('versionUpdate.upgradeFailed', { command: renderUpgradeCommand(upgradeCommand) }));\n return stopResult(1);\n }\n\n return stopResult(0);\n }\n\n logger.warn(t('versionUpdate.available', { currentVersion, latestVersion }));\n\n if (!upgradeCommand) {\n logger.warn(t('versionUpdate.manualUpgrade', { commands: renderManualUpgradeCommands() }));\n return continueResult();\n }\n\n const action = await ui\n .select({\n message: t('versionUpdate.selectAction'),\n choices: [\n { value: 'upgrade', name: t('versionUpdate.upgradeNow') },\n { value: 'skip', name: t('versionUpdate.skipThisRun') },\n ],\n })\n .catch(() => 'skip' as const);\n\n if (action === 'skip') {\n logger.info(t('versionUpdate.skippedForRun'));\n return continueResult();\n }\n\n if (!(await runUpgrade(upgradeCommand, latestVersion, t))) {\n logger.warn(t('versionUpdate.optionalUpgradeFailed', { command: renderUpgradeCommand(upgradeCommand) }));\n return continueResult();\n }\n\n return stopResult(0);\n};\n\nexport const runManualVersionUpdate = async (\n currentVersion: string,\n options: Pick<EnsureCliVersionIsUsableOptions, 'entryPath'> = {},\n): Promise<number> => {\n const { config, t } = await loadVersionCheckContext();\n\n let latestVersion: string;\n try {\n latestVersion = await withProgressTask(\n {\n initialText: t('versionUpdate.checkingRegistry'),\n },\n async () => fetchLatestPublishedVersion(),\n );\n } catch {\n await persistVersionCheckTimestamp(config);\n logger.error(t('versionUpdate.registryCheckFailedManual'));\n return 1;\n }\n\n await persistVersionCheckTimestamp(config);\n\n const severity = getVersionSeverity(currentVersion, latestVersion);\n if (severity === 'none') {\n logger.info(t('versionUpdate.alreadyLatest', { currentVersion }));\n return 0;\n }\n\n logger.warn(t('versionUpdate.available', { currentVersion, latestVersion }));\n\n const upgradeCommand = await detectUpgradeCommand(t, options.entryPath ?? process.argv[1]);\n if (!upgradeCommand) {\n logger.warn(t('versionUpdate.manualUpgrade', { commands: renderManualUpgradeCommands() }));\n return 1;\n }\n\n if (!(await runUpgrade(upgradeCommand, latestVersion, t))) {\n logger.error(t('versionUpdate.upgradeFailed', { command: renderUpgradeCommand(upgradeCommand) }));\n return 1;\n }\n\n return 0;\n};\n","import type { Command } from 'commander';\nimport { readCliVersion } from '../lib/package-metadata.js';\nimport { runManualVersionUpdate } from '../lib/version-check.js';\n\nconst version = readCliVersion();\n\nexport const registerUpdateVersionCommand = (program: Command): void => {\n program\n .command('update-version')\n .description('Check the registry and update the CLI when a newer version is available')\n .action(async () => {\n const exitCode = await runManualVersionUpdate(version);\n\n if (exitCode !== 0) {\n process.exitCode = exitCode;\n }\n });\n};\n","import type { Command } from 'commander';\nimport { registerAdminCommand } from './admin/index.js';\nimport { registerDataFinderCommand } from './datafinder/index.js';\nimport { registerDoctorCommand } from './doctor.js';\nimport { registerOnboardCommand } from './onboard.js';\nimport { registerPpeLaneCommand } from './ppe-lane/index.js';\nimport { registerReleaseCommand } from './release/index.js';\nimport { registerUpdateVersionCommand } from './update-version.js';\n\nexport const registerCommands = (program: Command): void => {\n registerAdminCommand(program);\n registerDataFinderCommand(program);\n registerDoctorCommand(program);\n registerOnboardCommand(program);\n registerPpeLaneCommand(program);\n registerReleaseCommand(program);\n registerUpdateVersionCommand(program);\n};\n"],"mappings":"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","names":["resolve","pathToFileURL","sleep","input","version","field","mkdir","join","randomUUID","rename","unlink","basename","dirname","join","join","mkdir","join","input","join","chalk","ora","stat","resolve","input","resolve","normalizedLine","input","input","renderAggregateProgress","input","input","logReleaseSummary","input","buildControlRunError","mkdtemp","readFile","join","mkdtemp","join","readFile","require","join","resolve","input","resolve","join","version","pathToFileURL","resolve"]}
|