maoda-commander-tt 0.0.20 → 0.0.21

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/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/main.ts","../src/commands/hello/hello-greet-command.ts","../src/commands/hello/hello-info-command.ts","../src/commands/hello/hello-command.ts","../src/commands/pippit/pippit-get-thread-command.ts","../src/commands/pippit/modules/request-json.ts","../src/commands/pippit/modules/get-thread/errors.ts","../src/commands/pippit/modules/get-thread/fetch-thread.ts","../src/commands/pippit/modules/get-thread/trim-thread.ts","../src/commands/pippit/modules/get-thread/get-thread.ts","../src/commands/pippit/pippit-fornax-token-command.ts","../src/bedrock/config/local-config.ts","../src/bedrock/pkg/find-closest-package-json.ts","../src/commands/pippit/modules/fornax-token/fornax-token.ts","../src/commands/pippit/pippit-search-fornax-log-command.ts","../src/commands/pippit/modules/search-log/errors.ts","../src/commands/pippit/modules/search-log/common.ts","../src/commands/pippit/modules/search-log/cn-search-log.ts","../src/commands/pippit/modules/search-log/i18n-search-log.ts","../src/commands/pippit/modules/search-log/search-log.ts","../src/commands/pippit/pippit-save-thread-fornax-command.ts","../src/commands/pippit/pippit-asset-upload-command.ts","../src/commands/pippit/modules/asset-upload/cn-asset-upload.ts","../src/commands/pippit/modules/web-token/web-token.ts","../src/commands/pippit/modules/web-token/errors.ts","../src/commands/pippit/modules/web-token/web-context.ts","../src/commands/pippit/modules/asset-upload/errors.ts","../src/commands/pippit/modules/asset-upload/i18n-asset-upload.ts","../src/commands/pippit/modules/asset-upload/upload-asset.ts","../src/commands/pippit/pippit-web-token-command.ts","../src/commands/pippit/pippit-asset-get-command.ts","../src/commands/pippit/modules/asset-get/errors.ts","../src/commands/pippit/modules/asset-get/cn-asset-get.ts","../src/commands/pippit/modules/asset-get/i18n-asset-get.ts","../src/commands/pippit/modules/asset-get/get-asset.ts","../src/commands/pippit/pippit-command.ts","../src/commands/git/git-base-command.ts","../src/commands/git/git-checkout-command.ts","../src/commands/git/git-mm-command.ts","../src/commands/git/git-mr-command.ts","../src/commands/git/git-pp-command.ts","../src/commands/git/git-command.ts","../src/commands/shortcut/shortcut-emo-lynx-command.ts","../src/commands/shortcut/shortcut-base-command.ts","../src/commands/shortcut/shortcut-emo-pippit-cn-command.ts","../src/commands/shortcut/shortcut-emo-pippit-command.ts","../src/commands/shortcut/shortcut-command.ts","../src/commands/ai/ai-base-command.ts","../src/constants/ak.ts","../src/commands/ai/ai-websearch-command.ts","../src/commands/ai/ai-cursor-command.ts","../src/commands/ai/ai-codex-command.ts","../src/commands/ai/ai-run-command.ts","../src/commands/ai/ai-context-path.ts","../src/commands/ai/ai-image-command-v2.ts","../src/commands/ai/ai-video-command.ts","../src/bedrock/uuid/uuid.ts","../src/commands/pippit/modules/submit-direct/submit-direct-cn.ts","../src/commands/ai/ai-vid-command.ts","../src/commands/ai/ai-image-reference.ts","../src/commands/ai/ai-querytask-command.ts","../src/commands/ai/ai-command.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { createRequire } from \"node:module\";\nimport { CliApp } from \"./core\";\nimport {\n HelloCommand,\n PippitCommand,\n GitCommand,\n ShortcutCommand,\n AiCommand,\n} from \"./commands\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\");\n\n/**\n * 注:\n * option 里,boolean 的同时支持长、短选项,短的还可以合并,比如 -fr\n * option 里,字符串的,也同时支持长短,唯独短选项不支持=,只支持空格\n * 子命令,通常最多 3 层,比如 npm config set\n */\n\nasync function bootstrap(): Promise<void> {\n const binName = Object.keys(pkg.bin)[0];\n\n const app = new CliApp({\n name: binName,\n version: pkg.version,\n description: pkg.description,\n });\n\n app.registerCommand(new HelloCommand(), { hidden: true });\n app.registerCommand(new PippitCommand());\n app.registerCommand(new GitCommand(), { hidden: true });\n app.registerCommand(new ShortcutCommand(), { hidden: true });\n app.registerCommand(new AiCommand(), { hidden: true });\n\n const result = await app.run();\n\n if (!result.ok) {\n process.stderr.write(`Fatal: ${result.msg}\\n`);\n process.exitCode = 1;\n }\n\n app.dispose();\n}\n\nbootstrap();\n","import type { Command } from 'commander';\nimport { BaseCommand } from '../../core/base-command';\nimport type { ICommandActionContext } from '../../core/base-command';\nimport type { ICommandMeta } from '../../core/command-types';\nimport type { ILvErrorOr } from '../../bedrock/error';\n\ninterface IHelloGreetOptions {\n uppercase: boolean;\n}\n\nexport class HelloGreetCommand extends BaseCommand<IHelloGreetOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: 'greet',\n description: '向指定用户打招呼',\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument('[name]', '要打招呼的用户名', 'World');\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.option('-u, --uppercase', '将输出转为大写', false);\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IHelloGreetOptions>,\n ): Promise<ILvErrorOr<void>> {\n const name = ctx.args[0] as string;\n const { uppercase } = ctx.options;\n\n let message = `Hello, ${name}!`;\n if (uppercase) {\n message = message.toUpperCase();\n }\n\n this._outputJsonOk({ message });\n return this._makeOk();\n }\n}\n","import { BaseCommand } from '../../core/base-command';\nimport type { ICommandActionContext } from '../../core/base-command';\nimport type { ICommandMeta } from '../../core/command-types';\nimport type { ILvErrorOr } from '../../bedrock/error';\n\nexport class HelloInfoCommand extends BaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: 'info',\n description: '显示 hello 命令的相关信息',\n };\n }\n\n protected async _execute(\n _ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n this._outputJsonOk({\n version: '1.0.0',\n description: 'Hello 命令组 - 用于打招呼的示例命令',\n });\n return this._makeOk();\n }\n}\n","import type { ICommandMeta } from '../../core/command-types';\nimport { BaseSubcommandHost } from '../../core/base-subcommand-host';\nimport { HelloGreetCommand } from './hello-greet-command';\nimport { HelloInfoCommand } from './hello-info-command';\n\nexport class HelloCommand extends BaseSubcommandHost {\n protected _meta(): ICommandMeta {\n return {\n name: 'hello',\n description: '向指定用户打招呼 (示例命令组)',\n aliases: ['hi'],\n };\n }\n\n protected _registerSubcommands(): void {\n this._addSubcommand(new HelloGreetCommand());\n this._addSubcommand(new HelloInfoCommand());\n }\n}\n","import { BaseCommand } from \"../../core/base-command\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { Option, type Command } from \"commander\";\nimport type { Region } from \"./types\";\nimport { getThread } from \"./modules/get-thread\";\n\nexport class PippitGetThreadCommand extends BaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"thread\",\n description: \"获取指定 thread 的详细信息\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"<thread_id>\", \"要获取的 thread id\");\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.addOption(\n new Option(\n \"-r, --region <region>\",\n \"指定区域,缺省时,会多 region 自动尝试,略微会有额外的耗时\",\n ).choices([\"cn\", \"i18n\"]),\n );\n }\n\n protected async _execute(\n _ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n const threadId = _ctx.args[0] as string;\n const region = _ctx.options.region as Region | undefined;\n\n const result = await getThread({ threadId, region });\n\n if (!result.ok) {\n this._outputJsonError(result.code, result.msg);\n return this._makeOk();\n }\n\n this._outputJsonOk(result.value);\n return this._makeOk();\n }\n}\n","import { makeOkWith, type ILvErrorOr } from \"../../../bedrock/error\";\n\ninterface IRequestJsonHandlers {\n readonly networkRequestFailed: (message: string) => ILvErrorOr<never>;\n readonly responseParseFailed: (message: string) => ILvErrorOr<never>;\n readonly unauthorizedError?: () => ILvErrorOr<never>;\n readonly httpError?: (\n message: string,\n response: Response,\n ) => ILvErrorOr<never>;\n}\n\nasync function readJsonBody<T>(\n response: Response,\n url: string,\n responseParseFailed: (message: string) => ILvErrorOr<never>,\n): Promise<ILvErrorOr<T>> {\n const bodyText = await response.text();\n try {\n return makeOkWith(JSON.parse(bodyText) as T);\n } catch (error) {\n const cause = error instanceof Error ? ` (${error.message})` : \"\";\n return responseParseFailed(`接口返回非 JSON 响应: ${url}${cause}`);\n }\n}\n\nexport async function requestJson<T>(\n url: string,\n init: RequestInit,\n handlers: IRequestJsonHandlers,\n): Promise<ILvErrorOr<T>> {\n let response: Response;\n try {\n response = await fetch(url, init);\n } catch (error) {\n const cause = error instanceof Error ? ` (${error.message})` : \"\";\n return handlers.networkRequestFailed(`请求接口失败: ${url}${cause}`);\n }\n\n if (\n handlers.unauthorizedError &&\n (response.status === 401 || response.status === 403)\n ) {\n return handlers.unauthorizedError();\n }\n\n if (handlers.httpError && !response.ok) {\n return handlers.httpError(\n `接口返回 HTTP ${response.status} ${response.statusText}: ${url}`,\n response,\n );\n }\n\n return readJsonBody<T>(response, url, handlers.responseParseFailed);\n}\n","import { lvErrorConst } from \"../../../../bedrock/error\";\n\nconst BASE = 10000;\n\nexport enum GetThreadError {\n MissingThreadId = BASE + 1,\n NetworkRequestFailed = BASE + 2,\n ResponseParseFailed = BASE + 3,\n ThreadNotFound = BASE + 4,\n}\n\nexport const missingThreadIdError = lvErrorConst(\n GetThreadError.MissingThreadId,\n \"缺少 thread_id 参数。\",\n);\n\nexport const networkRequestFailedError = lvErrorConst(\n GetThreadError.NetworkRequestFailed,\n \"请求 Pippit API 失败,请确保在内网环境下请求\",\n);\n\nexport const responseParseFailed = lvErrorConst(\n GetThreadError.ResponseParseFailed,\n \"解析 API 响应失败,返回消息的数据格式异常。\",\n);\n\nexport const threadNotFoundError = lvErrorConst(\n GetThreadError.ThreadNotFound,\n \"未找到对应的 thread 数据。\",\n);\n","import type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport { makeOkWith } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\nimport type { IThreadData } from \"./types\";\nimport { requestJson } from \"../request-json\";\nimport {\n networkRequestFailedError,\n responseParseFailed,\n threadNotFoundError,\n} from \"./errors\";\n\nconst REGION_URL_MAP: Record<Region, string> = {\n [Region.CN]:\n \"https://pippit-cms.bytedance.net/api/internal/v1/agent/get_thread\",\n [Region.I18N]:\n \"https://pippit-cms.tiktok-row.org/api/internal/v1/agent/get_thread\",\n};\n\nconst REGION_REFERER_MAP: Record<Region, string> = {\n [Region.CN]: \"https://pippit-cms.bytedance.net/\",\n [Region.I18N]: \"https://pippit-cms.tiktok-row.org/\",\n};\n\nexport async function fetchThread(\n threadId: string,\n region: Region,\n): Promise<ILvErrorOr<IThreadData>> {\n const url = REGION_URL_MAP[region];\n const referer = REGION_REFERER_MAP[region];\n\n const result = await requestJson<{ data?: { thread?: IThreadData } }>(url, {\n method: \"POST\",\n headers: {\n accept: \"*/*\",\n \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8\",\n appvr: \"1.1.4\",\n \"content-type\": \"application/json\",\n Referer: referer,\n },\n body: JSON.stringify({\n scopes: [\"run_list.entry_list\"],\n thread_id: threadId,\n }),\n }, {\n networkRequestFailed: (message) => networkRequestFailedError(message),\n responseParseFailed: (message) => responseParseFailed(message),\n });\n if (!result.ok) {\n return result;\n }\n\n const thread = result.value?.data?.thread as IThreadData | undefined;\n if (!thread?.run_list) {\n return threadNotFoundError();\n }\n\n return makeOkWith(thread);\n}\n","import type { IThreadData, IThreadRun, IThreadMessage, IThreadPart } from \"./types\";\n\nconst RUN_WHITE_KEYS: readonly string[] = [\n \"run_id\",\n \"state\",\n \"agent_name\",\n \"entry_list\",\n \"updated_at\",\n];\n\nconst MESSAGE_WHITE_KEYS: readonly string[] = [\n \"content\",\n \"message_id\",\n \"role\",\n \"run_id\",\n];\n\nconst PART_WHITE_KEYS: readonly string[] = [\"data\", \"sub_type\"];\n\nfunction pickKeys<T extends Record<string, unknown>>(\n obj: T,\n keys: readonly string[],\n): void {\n for (const key of Object.keys(obj)) {\n if (!keys.includes(key)) {\n delete obj[key];\n }\n }\n}\n\nfunction extractLogId(extraStr: string | undefined): string | undefined {\n if (!extraStr) return undefined;\n try {\n const extra = JSON.parse(extraStr);\n return extra?.execute_log_id as string | undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction trimMessage(message: IThreadMessage): void {\n pickKeys(message, MESSAGE_WHITE_KEYS);\n if (Array.isArray(message.content)) {\n for (const part of message.content as IThreadPart[]) {\n pickKeys(part, PART_WHITE_KEYS);\n }\n }\n}\n\nfunction trimRun(run: IThreadRun, isLast: boolean): void {\n const logId = isLast ? extractLogId(run.extra) : undefined;\n\n pickKeys(run, RUN_WHITE_KEYS);\n\n if (logId) {\n run.execute_log_id = logId;\n }\n\n if (!run.entry_list) return;\n\n const messages: IThreadMessage[] = [];\n for (const entry of run.entry_list) {\n const msg = entry.artifact ?? entry.message;\n if (msg) {\n trimMessage(msg);\n messages.push(msg);\n }\n }\n\n run.entry_list.length = 0;\n run.entry_list.push(...(messages as any[]));\n}\n\n/**\n * 对 thread 数据做字段裁剪,只保留关键信息。\n * 会直接修改传入的对象。\n */\nexport function trimThread(thread: IThreadData): void {\n const { run_list } = thread;\n for (let i = 0; i < run_list.length; i++) {\n trimRun(run_list[i], i === run_list.length - 1);\n }\n}\n","import type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport { makeOkWith } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\nimport type { IGetThreadOptions, IGetThreadResult } from \"./types\";\nimport { fetchThread } from \"./fetch-thread\";\nimport { trimThread } from \"./trim-thread\";\nimport {\n GetThreadError,\n missingThreadIdError,\n threadNotFoundError,\n} from \"./errors\";\n\nconst AUTO_DETECT_REGIONS: readonly Region[] = [Region.CN, Region.I18N];\n\n/**\n * 获取 thread 信息。\n *\n * - 指定 region 时直接请求对应区域\n * - 未指定 region 时依次尝试 cn -> i18n\n * - trim 选项控制是否裁剪冗余字段(默认 true)\n */\nexport async function getThread(\n options: IGetThreadOptions,\n): Promise<ILvErrorOr<IGetThreadResult>> {\n const { threadId, region, trim = true } = options;\n\n if (!threadId) {\n return missingThreadIdError();\n }\n\n if (region) {\n return _fetchAndProcess(threadId, region, trim);\n }\n\n let lastNonNotFoundError: ILvErrorOr<IGetThreadResult> | undefined;\n\n for (const r of AUTO_DETECT_REGIONS) {\n const result = await _fetchAndProcess(threadId, r, trim);\n if (result.ok) {\n return result;\n }\n if (result.code !== GetThreadError.ThreadNotFound) {\n lastNonNotFoundError = result;\n }\n }\n\n return lastNonNotFoundError ?? threadNotFoundError();\n}\n\nasync function _fetchAndProcess(\n threadId: string,\n region: Region,\n trim: boolean,\n): Promise<ILvErrorOr<IGetThreadResult>> {\n const result = await fetchThread(threadId, region);\n if (!result.ok) {\n return result;\n }\n\n const thread = result.value;\n if (trim) {\n trimThread(thread);\n }\n\n return makeOkWith({ thread, region });\n}\n","import type { Command } from \"commander\";\nimport { Option } from \"commander\";\nimport { BaseCommand } from \"../../core/base-command\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { writeFornaxToken } from \"./modules/fornax-token\";\nimport type { Region } from \"./types\";\n\ninterface IPippitFornaxTokenOptions {\n region: Region;\n}\n\nexport class PippitFornaxTokenCommand extends BaseCommand<IPippitFornaxTokenOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"fornax-token\",\n description: \"设置 fornax 的 token\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"<token>\", \"要写入的 fornax token\");\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.addOption(\n new Option(\"-r, --region <region>\", \"token 所属区域\")\n .choices([\"cn\", \"i18n\"])\n .makeOptionMandatory(),\n );\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IPippitFornaxTokenOptions>,\n ): Promise<ILvErrorOr<void>> {\n const token = ctx.args[0] as string;\n const { region } = ctx.options;\n\n const result = await writeFornaxToken(region, token);\n if (!result.ok) {\n return this._makeError(result.code, result.msg);\n }\n\n this._outputJsonOk({\n region,\n stored: true,\n });\n return this._makeOk();\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { findClosestPackageJson } from \"../pkg\";\nimport { makeError, makeOkWith, type ILvErrorOr } from \"../error\";\n\nexport type ConfigPath = string | Array<string | number>;\n\nexport interface IConfigLocation {\n readonly packageName: string;\n readonly configDir: string;\n readonly configFilePath: string;\n}\n\nfunction normalizeAppName(rawName: string): string {\n const lastSegment = rawName.split(\"/\").pop() ?? rawName;\n const sanitized = lastSegment\n .trim()\n .replace(/[<>:\"/\\\\|?*\\u0000-\\u001F]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^[-.]+|[-.]+$/g, \"\");\n return sanitized.length > 0 ? sanitized : \"app\";\n}\n\nasync function readClosestPackageName(): Promise<ILvErrorOr<string>> {\n const packageJsonResult = findClosestPackageJson();\n if (!packageJsonResult.ok) {\n return packageJsonResult;\n }\n\n try {\n const content = await fs.readFile(packageJsonResult.value, \"utf8\");\n const parsed = JSON.parse(content) as { name?: unknown };\n if (typeof parsed.name !== \"string\" || parsed.name.trim().length === 0) {\n return makeError(\n 1,\n `package.json at ${packageJsonResult.value} does not contain a valid name field`,\n );\n }\n return makeOkWith(normalizeAppName(parsed.name));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(\n 1,\n `failed to read package name from ${packageJsonResult.value}: ${message}`,\n );\n }\n}\n\nasync function getBaseConfigDir(): Promise<string> {\n if (process.platform === \"win32\") {\n return process.env.APPDATA ?? path.join(os.homedir(), \"AppData\", \"Roaming\");\n }\n\n return process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), \".config\");\n}\n\nexport async function resolveConfigLocation(): Promise<\n ILvErrorOr<IConfigLocation>\n> {\n const appNameResult = await readClosestPackageName();\n if (!appNameResult.ok) {\n return appNameResult;\n }\n\n const baseDir = await getBaseConfigDir();\n const configDir = path.join(baseDir, appNameResult.value);\n return makeOkWith({\n packageName: appNameResult.value,\n configDir,\n configFilePath: path.join(configDir, `${appNameResult.value}.json`),\n });\n}\n\nexport function parseConfigPath(\n configPath: ConfigPath,\n): Array<string | number> {\n if (Array.isArray(configPath)) {\n return configPath.slice();\n }\n\n const segments: Array<string | number> = [];\n const matcher = /[^.[\\]]+|\\[(\\d+)\\]/g;\n configPath.replace(matcher, (match, index) => {\n if (index !== undefined) {\n segments.push(Number(index));\n } else {\n segments.push(match);\n }\n return \"\";\n });\n return segments;\n}\n\nfunction isContainer(\n value: unknown,\n): value is Record<string, unknown> | Array<unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction getIndexableContainer(\n value: Record<string, unknown> | Array<unknown>,\n): Record<string | number, unknown> {\n return value as Record<string | number, unknown>;\n}\n\nfunction getConfigValue<T>(\n source: unknown,\n configPath: ConfigPath,\n defaultValue?: T,\n): T {\n const segments = parseConfigPath(configPath);\n if (segments.length === 0) {\n return (source === undefined ? defaultValue : source) as T;\n }\n\n let current: unknown = source;\n for (const segment of segments) {\n if (!isContainer(current)) {\n return defaultValue as T;\n }\n current = getIndexableContainer(current)[segment];\n if (current === undefined) {\n return defaultValue as T;\n }\n }\n\n return (current === undefined ? defaultValue : current) as T;\n}\n\nfunction createNextContainer(\n nextSegment: string | number | undefined,\n): Record<string, unknown> | Array<unknown> {\n return typeof nextSegment === \"number\" ? [] : {};\n}\n\nfunction setConfigValue(\n target: Record<string, unknown>,\n configPath: ConfigPath,\n value: unknown,\n): void {\n const segments = parseConfigPath(configPath);\n if (segments.length === 0) {\n return;\n }\n\n let current: Record<string, unknown> | Array<unknown> = target;\n for (let index = 0; index < segments.length; index++) {\n const segment = segments[index];\n const isLast = index === segments.length - 1;\n const currentIndexable = getIndexableContainer(current);\n\n if (isLast) {\n currentIndexable[segment] = value;\n return;\n }\n\n const nextSegment = segments[index + 1];\n const existing = currentIndexable[segment];\n if (!isContainer(existing)) {\n currentIndexable[segment] = createNextContainer(nextSegment);\n }\n current = currentIndexable[segment] as\n | Record<string, unknown>\n | Array<unknown>;\n }\n}\n\nasync function ensureConfigFile(\n configFilePath: string,\n): Promise<ILvErrorOr<void>> {\n try {\n await fs.mkdir(path.dirname(configFilePath), { recursive: true });\n await fs.access(configFilePath).catch(async () => {\n await fs.writeFile(configFilePath, \"{}\\n\", \"utf8\");\n });\n return makeOkWith(undefined);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(\n 1,\n `failed to ensure config file ${configFilePath}: ${message}`,\n );\n }\n}\n\nexport async function readConfig<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(): Promise<ILvErrorOr<T>> {\n const locationResult = await resolveConfigLocation();\n if (!locationResult.ok) {\n return locationResult;\n }\n\n const ensureResult = await ensureConfigFile(\n locationResult.value.configFilePath,\n );\n if (!ensureResult.ok) {\n return ensureResult;\n }\n\n try {\n const content = await fs.readFile(\n locationResult.value.configFilePath,\n \"utf8\",\n );\n if (content.trim().length === 0) {\n return makeOkWith({} as T);\n }\n return makeOkWith(JSON.parse(content) as T);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(\n 1,\n `failed to read config from ${locationResult.value.configFilePath}: ${message}`,\n );\n }\n}\n\nexport async function writeConfig<T extends Record<string, unknown>>(\n config: T,\n): Promise<ILvErrorOr<void>> {\n const locationResult = await resolveConfigLocation();\n if (!locationResult.ok) {\n return locationResult;\n }\n\n const ensureResult = await ensureConfigFile(\n locationResult.value.configFilePath,\n );\n if (!ensureResult.ok) {\n return ensureResult;\n }\n\n try {\n const content = `${JSON.stringify(config, null, 2)}\\n`;\n await fs.writeFile(locationResult.value.configFilePath, content, \"utf8\");\n return makeOkWith(undefined);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(\n 1,\n `failed to write config to ${locationResult.value.configFilePath}: ${message}`,\n );\n }\n}\n\nexport async function readConfigValue<T = unknown>(\n configPath: ConfigPath,\n defaultValue?: T,\n): Promise<ILvErrorOr<T>> {\n const configResult = await readConfig<Record<string, unknown>>();\n if (!configResult.ok) {\n return configResult;\n }\n\n return makeOkWith(\n getConfigValue(configResult.value, configPath, defaultValue),\n );\n}\n\nexport async function writeConfigValue<T = unknown>(\n configPath: ConfigPath,\n value: T,\n): Promise<ILvErrorOr<void>> {\n const configResult = await readConfig<Record<string, unknown>>();\n if (!configResult.ok) {\n return configResult;\n }\n\n setConfigValue(configResult.value, configPath, value);\n return writeConfig(configResult.value);\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { makeOkWith, makeError } from '../error/error-t';\nimport type { ILvErrorOr } from '../error/error-base';\n\nconst _thisDir = path.dirname(fileURLToPath(import.meta.url));\nconst DEFAULT_MAX_DEPTH = 10;\n\n/**\n * 从当前文件所在目录向上查找最近的 package.json 文件\n * @param maxDepth 最多向上遍历的层级数,缺省为 10\n */\nexport function findClosestPackageJson(\n maxDepth: number = DEFAULT_MAX_DEPTH,\n): ILvErrorOr<string> {\n let currentDir = _thisDir;\n\n for (let i = 0; i < maxDepth; i++) {\n const candidate = path.join(currentDir, 'package.json');\n if (fs.existsSync(candidate)) {\n return makeOkWith(candidate);\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n\n return makeError(1, `package.json not found within ${maxDepth} levels from ${_thisDir}`);\n}\n","import { readConfigValue, writeConfigValue } from \"../../../../bedrock/config\";\nimport type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport type { Region } from \"../../types\";\n\nconst FORNAX_TOKEN_CONFIG_PATH = [\"fornax\", \"token\"] as const;\n\nexport async function writeFornaxToken(\n region: Region,\n token: string,\n): Promise<ILvErrorOr<void>> {\n return writeConfigValue([...FORNAX_TOKEN_CONFIG_PATH, region], token);\n}\n\nexport async function readFornaxToken(\n region: Region,\n): Promise<ILvErrorOr<string | undefined>> {\n return readConfigValue([...FORNAX_TOKEN_CONFIG_PATH, region]);\n}\n","import type { Command } from \"commander\";\nimport { Option } from \"commander\";\nimport { BaseCommand } from \"../../core/base-command\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { searchLog } from \"./modules/search-log\";\nimport type { Region } from \"./types\";\n\ninterface IPippitSearchFornaxLogOptions {\n region: Region;\n}\n\nexport class PippitSearchFornaxLogCommand extends BaseCommand<IPippitSearchFornaxLogOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"fornax\",\n description: \"从 fornax 中获取并解析 log 数据\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"<log_id>\", \"要获取的 log id\");\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.addOption(\n new Option(\"-r, --region <region>\", \"指定区域\")\n .choices([\"cn\", \"i18n\"])\n .makeOptionMandatory(),\n );\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IPippitSearchFornaxLogOptions>,\n ): Promise<ILvErrorOr<void>> {\n const logId = ctx.args[0] as string;\n const region = ctx.options.region;\n\n const result = await searchLog({ logId, region });\n if (!result.ok) {\n this._outputJsonError(result.code, result.msg);\n return this._makeOk();\n }\n\n this._outputJsonOk(result.value);\n return this._makeOk();\n }\n}\n","import { lvErrorConst } from \"../../../../bedrock/error\";\n\nconst BASE = 11000;\n\nexport enum FornaxSearchError {\n MissingLogId = BASE + 1,\n MissingFornaxToken = BASE + 2,\n NetworkRequestFailed = BASE + 3,\n ResponseParseFailed = BASE + 4,\n SearchResultNotFound = BASE + 5,\n DetailSpanNotFound = BASE + 6,\n PayloadNotFound = BASE + 7,\n PayloadParseFailed = BASE + 8,\n MissingRegion = BASE + 9,\n ExpiredFornaxToken = BASE + 10,\n}\n\nexport const missingLogIdError = lvErrorConst(\n FornaxSearchError.MissingLogId,\n \"缺少 log_id 参数。\",\n);\n\nexport const missingRegionError = lvErrorConst(\n FornaxSearchError.MissingRegion,\n \"缺少 region 参数,请显式指定 cn 或 i18n。\",\n);\n\nexport const howToConfigureFornaxToken =\n \"关于如何获取 token: 国内访问 https://fornax.bytedance.net/ 海外访问 https://fornax-i18n.byteintl.net/,然后拷贝 cookie 里的 prompt-platform-session\";\n\nexport const missingFornaxTokenError = lvErrorConst(\n FornaxSearchError.MissingFornaxToken,\n \"缺少可用的 fornax-token,请先使用 `tt pippit fornax-token -r <region> <token>` 配置。\" +\n howToConfigureFornaxToken,\n);\n\nexport const expiredFornaxTokenError = lvErrorConst(\n FornaxSearchError.ExpiredFornaxToken,\n \"fornax-token 可能已失效,请先使用 `tt pippit fornax-token -r <region> <token>` 重新配置。\" +\n howToConfigureFornaxToken,\n);\n\nexport const networkRequestFailedError = lvErrorConst(\n FornaxSearchError.NetworkRequestFailed,\n \"请求 fornax API 失败,请确保在内网环境下请求。\",\n);\n\nexport const responseParseFailedError = lvErrorConst(\n FornaxSearchError.ResponseParseFailed,\n \"解析 fornax API 响应失败,返回消息的数据格式异常。\",\n);\n\nexport const searchResultNotFoundError = lvErrorConst(\n FornaxSearchError.SearchResultNotFound,\n \"未找到符合条件的 fornax 记录。\",\n);\n\nexport const detailSpanNotFoundError = lvErrorConst(\n FornaxSearchError.DetailSpanNotFound,\n \"未找到可用于读取数据的 span。\",\n);\n\nexport const payloadNotFoundError = lvErrorConst(\n FornaxSearchError.PayloadNotFound,\n \"未找到 span 的 input 数据。\",\n);\n\nexport const payloadParseFailedError = lvErrorConst(\n FornaxSearchError.PayloadParseFailed,\n \"解析 span payload 失败。\",\n);\n","import { makeOkWith, type ILvErrorOr } from \"../../../../bedrock/error\";\nimport { requestJson as requestJsonShared } from \"../request-json\";\nimport {\n expiredFornaxTokenError,\n networkRequestFailedError,\n payloadNotFoundError,\n payloadParseFailedError,\n responseParseFailedError,\n} from \"./errors\";\nimport type { IFornaxSpan } from \"./types\";\n\nexport interface IJsonRequestOptions extends RequestInit {\n unauthorizedError?: () => ILvErrorOr<never>;\n}\n\nexport function normalizeToken(token: string): string {\n const trimmed = token.trim();\n const prefix = \"prompt-platform-session=\";\n if (trimmed.startsWith(prefix)) {\n return trimmed.slice(prefix.length).trim();\n }\n return trimmed;\n}\n\nexport function createHeaders(token: string, referer: string): any {\n return {\n accept: \"application/json, text/plain, */*\",\n \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8\",\n \"agw-js-conv\": \"str\",\n \"content-type\": \"application/json\",\n \"sec-ch-ua\":\n '\"Chromium\";v=\"146\", \"Not-A.Brand\";v=\"24\", \"Google Chrome\";v=\"146\"',\n \"sec-ch-ua-mobile\": \"?0\",\n \"sec-ch-ua-platform\": '\"macOS\"',\n \"sec-fetch-dest\": \"empty\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-site\": \"same-origin\",\n \"x-requested-with\": \"XMLHttpRequest\",\n cookie: `prompt-platform-session=${normalizeToken(token)}`,\n Referer: referer,\n };\n}\n\nexport async function requestJson<T>(\n url: string,\n options: IJsonRequestOptions,\n): Promise<ILvErrorOr<T>> {\n return requestJsonShared<T>(url, options, {\n networkRequestFailed: (message) => {\n return networkRequestFailedError(message);\n },\n responseParseFailed: (message) => {\n return responseParseFailedError(message);\n },\n unauthorizedError: options.unauthorizedError ?? expiredFornaxTokenError,\n httpError: (message) => {\n return networkRequestFailedError(message);\n },\n });\n}\n\nexport function resolveTimeWindow(\n baseOffsetInDays: number,\n daysLater: number,\n): { startTime: string; endTime: string } {\n const currentTime = Date.now();\n return {\n startTime: String(currentTime - 1000 * 60 * 60 * 24 * baseOffsetInDays),\n endTime: String(currentTime + 1000 * 60 * 60 * 24 * daysLater),\n };\n}\n\nexport function parseDetailPayload<T>(input: unknown): ILvErrorOr<T> {\n if (typeof input === \"string\") {\n try {\n return makeOkWith(JSON.parse(input) as unknown) as ILvErrorOr<T>;\n } catch (error) {\n return payloadParseFailedError(\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n if (input !== null && typeof input === \"object\") {\n return makeOkWith(input as T);\n }\n\n return payloadNotFoundError();\n}\n\nexport function selectDetailSpan(\n spans: IFornaxSpan[],\n): IFornaxSpan | undefined {\n return spans.findLast((span) => {\n return (\n span?.type === \"model\" && span?.service_name === \"pippit.business.agent\"\n );\n });\n}\n","import { makeOkWith, type ILvErrorOr } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\nimport { readFornaxToken } from \"../fornax-token\";\nimport {\n expiredFornaxTokenError,\n detailSpanNotFoundError,\n missingFornaxTokenError,\n missingLogIdError,\n searchResultNotFoundError,\n} from \"./errors\";\nimport {\n createHeaders,\n parseDetailPayload,\n requestJson,\n resolveTimeWindow,\n selectDetailSpan,\n} from \"./common\";\nimport type {\n IFornaxDataResult,\n IFornaxSearchOptions,\n IFornaxSpan,\n IFornaxLogData,\n} from \"./types\";\n\nconst CONFIG = {\n BASE_URL: \"https://fornax.bytedance.net/\",\n WORKSPACE_ID: \"7507836945448304652\",\n SCAN_SPAN_IN_HOUR: \"4\",\n DAYS_AGO: 30,\n DAYS_LATER: 1,\n PLATFORM_TYPE: \"inner_cozeloop\",\n PAGE_SIZE: 30,\n} as const;\n\ninterface ITraceSearchResult {\n spans?: IFornaxSpan[];\n [key: string]: unknown;\n}\n\nfunction createFilterField(\n fieldName: string,\n fieldType: string,\n values: string[],\n queryType: string,\n isCustom = false,\n) {\n return {\n field_name: fieldName,\n field_type: fieldType,\n values,\n query_type: queryType,\n query_and_or: \"and\",\n is_custom: isCustom,\n sub_filter: {\n query_and_or: \"and\",\n filter_fields: [],\n },\n };\n}\n\nfunction selectRootSpan(spans: IFornaxSpan[]): IFornaxSpan | undefined {\n let selected: IFornaxSpan | undefined;\n for (const span of spans) {\n if (typeof span.span_id !== \"string\" || typeof span.trace_id !== \"string\") {\n continue;\n }\n if (\n !selected ||\n (span.duration ?? -Infinity) > (selected.duration ?? -Infinity)\n ) {\n selected = span;\n }\n }\n return selected;\n}\n\nfunction getSearchUrl(): string {\n return `${CONFIG.BASE_URL}api/observability/v1/spans/list`;\n}\n\nfunction getSearchReferer(): string {\n return getSearchUrl();\n}\n\nfunction getTimeWindow(): { startTime: string; endTime: string } {\n return resolveTimeWindow(CONFIG.DAYS_AGO, CONFIG.DAYS_LATER);\n}\n\nfunction getSearchBody(logId: string): string {\n const { startTime, endTime } = getTimeWindow();\n return JSON.stringify({\n workspace_id: CONFIG.WORKSPACE_ID,\n start_time: startTime,\n end_time: endTime,\n filters: {\n query_and_or: \"and\",\n filter_fields: [\n createFilterField(\"deployment_env\", \"string\", [\"boe\"], \"not_in\"),\n createFilterField(\"psm\", \"string\", [\"pippit.business.agent\"], \"in\"),\n createFilterField(\"logid\", \"string\", [logId], \"in\"),\n ],\n },\n page_size: CONFIG.PAGE_SIZE,\n order_bys: [\n {\n field: \"start_time\",\n is_asc: false,\n },\n ],\n platform_type: CONFIG.PLATFORM_TYPE,\n span_list_type: \"root_span\",\n });\n}\n\nfunction getTreeUrl(): string {\n return `${CONFIG.BASE_URL}api/observability/v1/traces/search_tree`;\n}\n\nfunction getDetailUrl(traceId: string, spanId: string): string {\n const { startTime, endTime } = getTimeWindow();\n return `${CONFIG.BASE_URL}api/observability/v1/traces/${traceId}?workspace_id=${CONFIG.WORKSPACE_ID}&start_time=${startTime}&end_time=${endTime}&platform_type=${CONFIG.PLATFORM_TYPE}&span_ids=${spanId}`;\n}\n\nexport async function searchLogCn(\n options: IFornaxSearchOptions,\n): Promise<ILvErrorOr<IFornaxDataResult>> {\n const { logId } = options;\n if (!logId) {\n return missingLogIdError();\n }\n\n const tokenResult = await readFornaxToken(Region.CN);\n if (!tokenResult.ok) {\n return tokenResult;\n }\n\n const token = tokenResult.value?.trim();\n if (!token) {\n return missingFornaxTokenError();\n }\n\n const searchResult = await requestJson<ITraceSearchResult>(getSearchUrl(), {\n method: \"POST\",\n headers: createHeaders(token, getSearchReferer()),\n body: getSearchBody(logId),\n unauthorizedError: expiredFornaxTokenError,\n });\n if (!searchResult.ok) {\n return searchResult;\n }\n\n const searchSpans = searchResult.value.spans ?? [];\n if (searchSpans.length === 0) {\n return searchResultNotFoundError();\n }\n\n const rootSpan = selectRootSpan(searchSpans);\n if (!rootSpan?.trace_id) {\n return detailSpanNotFoundError();\n }\n\n const treeResult = await requestJson<ITraceSearchResult>(getTreeUrl(), {\n method: \"POST\",\n headers: createHeaders(token, getSearchReferer()),\n body: JSON.stringify({\n workspace_id: CONFIG.WORKSPACE_ID,\n trace_id: rootSpan.trace_id,\n start_time: getTimeWindow().startTime,\n end_time: getTimeWindow().endTime,\n platform_type: CONFIG.PLATFORM_TYPE,\n }),\n unauthorizedError: expiredFornaxTokenError,\n });\n if (!treeResult.ok) {\n return treeResult;\n }\n\n const detailSpan = selectDetailSpan(treeResult.value.spans ?? []);\n if (!detailSpan?.trace_id || !detailSpan.span_id) {\n return detailSpanNotFoundError();\n }\n\n const detailResult = await requestJson<ITraceSearchResult>(\n getDetailUrl(detailSpan.trace_id, detailSpan.span_id),\n {\n method: \"GET\",\n headers: createHeaders(token, getSearchReferer()),\n unauthorizedError: expiredFornaxTokenError,\n },\n );\n if (!detailResult.ok) {\n return detailResult;\n }\n\n const payload = parseDetailPayload<IFornaxLogData>(\n detailResult.value.spans?.[0]?.input,\n );\n if (!payload.ok) {\n return payload;\n }\n\n return makeOkWith({\n meta: {\n region: Region.CN,\n spanName: detailSpan.span_name || \"\",\n },\n data: payload.value,\n });\n}\n","import { makeOkWith, type ILvErrorOr } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\nimport { readFornaxToken } from \"../fornax-token\";\nimport {\n expiredFornaxTokenError,\n detailSpanNotFoundError,\n missingFornaxTokenError,\n missingLogIdError,\n searchResultNotFoundError,\n} from \"./errors\";\nimport {\n createHeaders,\n parseDetailPayload,\n requestJson,\n resolveTimeWindow,\n selectDetailSpan,\n} from \"./common\";\nimport type {\n IFornaxDataResult,\n IFornaxSearchOptions,\n IFornaxLogData,\n IFornaxSpan,\n} from \"./types\";\n\nconst CONFIG = {\n BASE_URL: \"https://fornax-i18n.byteintl.net\",\n WORKSPACE_ID: \"7517207223651532851\",\n SCAN_SPAN_IN_HOUR: \"4\",\n DAYS_AGO: 30,\n DAYS_LATER: 1,\n} as const;\n\ninterface ITraceSearchResult {\n spans?: IFornaxSpan[];\n [key: string]: unknown;\n}\n\nfunction getSearchUrl(): string {\n return `${CONFIG.BASE_URL}/api/observability/v1/traces/search`;\n}\n\nfunction getSearchReferer(logId: string): string {\n return `${CONFIG.BASE_URL}/space/${CONFIG.WORKSPACE_ID}/analytics/log-query?env=online&logIdTime=${CONFIG.SCAN_SPAN_IN_HOUR}&queryID=${logId}&queryType=log_id`;\n}\n\nfunction getTimeWindow(): { startTime: string; endTime: string } {\n return resolveTimeWindow(CONFIG.DAYS_AGO, CONFIG.DAYS_LATER);\n}\n\nfunction getDetailUrl(traceId: string, spanId: string): string {\n const { startTime, endTime } = getTimeWindow();\n return `${CONFIG.BASE_URL}/api/observability/v1/traces/${traceId}?workspace_id=${CONFIG.WORKSPACE_ID}&start_time=${startTime}&end_time=${endTime}&platform_type=trace_detail&span_ids=${spanId}`;\n}\n\nexport async function searchLogI18n(\n options: IFornaxSearchOptions,\n): Promise<ILvErrorOr<IFornaxDataResult>> {\n const { logId } = options;\n if (!logId) {\n return missingLogIdError();\n }\n\n const tokenResult = await readFornaxToken(Region.I18N);\n if (!tokenResult.ok) {\n return tokenResult;\n }\n\n const token = tokenResult.value?.trim();\n if (!token) {\n return missingFornaxTokenError();\n }\n\n const searchResult = await requestJson<ITraceSearchResult>(getSearchUrl(), {\n method: \"POST\",\n headers: createHeaders(token, getSearchReferer(logId)),\n body: JSON.stringify({\n workspace_id: CONFIG.WORKSPACE_ID,\n search_type: \"log_id\",\n id: logId,\n scan_span_in_hour: CONFIG.SCAN_SPAN_IN_HOUR,\n }),\n unauthorizedError: expiredFornaxTokenError,\n });\n if (!searchResult.ok) {\n return searchResult;\n }\n\n const searchSpan = selectDetailSpan(searchResult.value.spans ?? []);\n if (!searchSpan?.trace_id || !searchSpan.span_id) {\n return searchResultNotFoundError();\n }\n\n const detailResult = await requestJson<ITraceSearchResult>(\n getDetailUrl(searchSpan.trace_id, searchSpan.span_id),\n {\n method: \"GET\",\n headers: createHeaders(token, getSearchReferer(logId)),\n unauthorizedError: expiredFornaxTokenError,\n },\n );\n if (!detailResult.ok) {\n return detailResult;\n }\n\n const detailSpan = selectDetailSpan(detailResult.value.spans ?? []);\n if (!detailSpan?.trace_id || !detailSpan.span_id) {\n return detailSpanNotFoundError();\n }\n\n const payload = parseDetailPayload<IFornaxLogData>(detailSpan.input);\n if (!payload.ok) {\n return payload;\n }\n\n return makeOkWith({\n meta: {\n region: Region.I18N,\n spanName: detailSpan.span_name || \"\",\n },\n data: payload.value,\n });\n}\n","import { Region } from \"../../types\";\nimport type { IFornaxDataResult, IFornaxSearchOptions } from \"./types\";\nimport { searchLogCn } from \"./cn-search-log\";\nimport { searchLogI18n } from \"./i18n-search-log\";\nimport { missingLogIdError, missingRegionError } from \"./errors\";\nimport type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport type { IFornaxLogData } from \"./types\";\n\nfunction trimFornaxMessages(data: IFornaxLogData): void {\n if (!Array.isArray(data.messages)) {\n return;\n }\n\n for (const message of data.messages) {\n if (message === null || typeof message !== \"object\") {\n continue;\n }\n\n if (Object.prototype.hasOwnProperty.call(message, \"metadata\")) {\n void Reflect.deleteProperty(message as Record<string, unknown>, \"metadata\");\n }\n }\n}\n\nexport async function searchLog(\n options: IFornaxSearchOptions,\n): Promise<ILvErrorOr<IFornaxDataResult>> {\n const { logId, region, trim = true } = options;\n if (!logId) {\n return missingLogIdError();\n }\n\n if (!region) {\n return missingRegionError();\n }\n\n if (region === Region.CN) {\n const result = await searchLogCn({ logId, region });\n if (result.ok && trim) {\n trimFornaxMessages(result.value.data);\n }\n return result;\n }\n\n const result = await searchLogI18n({ logId, region });\n if (result.ok && trim) {\n trimFornaxMessages(result.value.data);\n }\n return result;\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { Command } from \"commander\";\nimport { Option } from \"commander\";\nimport { BaseCommand } from \"../../core/base-command\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { getThread } from \"./modules/get-thread\";\nimport type { IThreadData } from \"./modules/get-thread/types\";\nimport { searchLog } from \"./modules/search-log\";\nimport type { Region } from \"./types\";\n\ninterface IPippitSaveThreadFornaxOptions {\n outputDir?: string;\n}\n\nexport class PippitSaveThreadFornaxCommand extends BaseCommand<IPippitSaveThreadFornaxOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"save\",\n description: \"获取 thread 和 fornax 并保存到本地\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"<thread_id>\", \"要获取并保存的 thread id\");\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.addOption(\n new Option(\"-o, --output-dir <dir>\", \"保存目录,缺省时使用当前工作目录\"),\n );\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IPippitSaveThreadFornaxOptions>,\n ): Promise<ILvErrorOr<void>> {\n const threadId = ctx.args[0] as string;\n const outputDir = ctx.options.outputDir;\n\n const threadResult = await getThread({ threadId, trim: true });\n if (!threadResult.ok) {\n return this._emitJsonError(threadResult.code, threadResult.msg);\n }\n\n const threadData = threadResult.value.thread;\n const region = threadResult.value.region;\n const logId = this._extractExecuteLogId(threadData);\n if (!logId) {\n return this._emitJsonError(\n 1,\n \"未找到 thread 中可用于查询 fornax 的 execute_log_id。\",\n );\n }\n\n const fornaxResult = await searchLog({ logId, region });\n if (!fornaxResult.ok) {\n return this._emitJsonError(fornaxResult.code, fornaxResult.msg);\n }\n\n const targetDir = this._resolveTargetDir(threadId, outputDir);\n const threadPath = path.join(targetDir, \"thread.json\");\n const fornaxPath = path.join(targetDir, \"fornax.json\");\n\n try {\n await fs.mkdir(targetDir, { recursive: true });\n await fs.writeFile(\n threadPath,\n `${JSON.stringify(threadData, null, 2)}\\n`,\n \"utf8\",\n );\n await fs.writeFile(\n fornaxPath,\n `${JSON.stringify(fornaxResult.value.data, null, 2)}\\n`,\n \"utf8\",\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return this._emitJsonError(1, `写入文件失败: ${message}`);\n }\n\n this._outputJsonOk({\n thread_id: threadId,\n output_dir: targetDir,\n files: {\n thread: threadPath,\n fornax: fornaxPath,\n },\n });\n return this._makeOk();\n }\n\n private _emitJsonError(code: number, msg: string): ILvErrorOr<void> {\n this._outputJsonError(code, msg);\n process.exitCode = 1;\n return this._makeOk();\n }\n\n private _resolveTargetDir(threadId: string, outputDir?: string): string {\n const baseDir = outputDir\n ? path.resolve(process.cwd(), outputDir)\n : process.cwd();\n return path.join(baseDir, threadId);\n }\n\n private _extractExecuteLogId(thread: IThreadData): string | undefined {\n const lastRun = thread.run_list.at(-1);\n if (!lastRun) {\n return undefined;\n }\n\n if (typeof lastRun.execute_log_id === \"string\") {\n const executeLogId = lastRun.execute_log_id.trim();\n if (executeLogId.length > 0) {\n return executeLogId;\n }\n }\n\n if (typeof lastRun.extra !== \"string\" || lastRun.extra.length === 0) {\n return undefined;\n }\n\n try {\n const extra = JSON.parse(lastRun.extra) as {\n execute_log_id?: unknown;\n };\n if (typeof extra.execute_log_id !== \"string\") {\n return undefined;\n }\n\n const executeLogId = extra.execute_log_id.trim();\n return executeLogId.length > 0 ? executeLogId : undefined;\n } catch {\n return undefined;\n }\n }\n}\n","import * as path from \"node:path\";\nimport type { Command } from \"commander\";\nimport { Option } from \"commander\";\nimport { BaseCommand } from \"../../core/base-command\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { Region } from \"./types\";\nimport { uploadAsset } from \"./modules/asset-upload\";\nimport { missingFilePathError } from \"./modules/asset-upload/errors\";\n\ninterface IPippitAssetUploadOptions {\n region: Region;\n}\n\nexport class PippitAssetUploadCommand extends BaseCommand<IPippitAssetUploadOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"asset-upload\",\n description: \"上传 pippit 图片或视频资源\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"<file_path>\", \"要上传的图片或视频文件路径\");\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.addOption(\n new Option(\"-r, --region <region>\", \"指定区域\")\n .choices([Region.CN, Region.I18N])\n .makeOptionMandatory(),\n );\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IPippitAssetUploadOptions>,\n ): Promise<ILvErrorOr<void>> {\n const filePath = ctx.args[0] as string | undefined;\n const region = ctx.options.region;\n\n if (!filePath) {\n const error = missingFilePathError();\n this._outputJsonError(error.code, error.msg);\n return this._makeOk();\n }\n\n const result = await uploadAsset({ filePath, region });\n if (!result.ok) {\n this._outputJsonError(result.code, result.msg);\n return this._makeOk();\n }\n\n this._outputJsonOk({\n asset_id: result.value.assetId,\n file_path: path.resolve(process.cwd(), filePath),\n region: result.value.region,\n asset_type: result.value.fileInfo.assetType,\n });\n return this._makeOk();\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport { makeError, makeOkWith } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\nimport { requestJson } from \"../request-json\";\nimport { readWebToken } from \"../web-token\";\nimport type {\n AssetType,\n IAssetUploadFileInfo,\n IAssetUploadOptions,\n IAssetUploadResult,\n} from \"./types\";\nimport {\n fileReadFailedError,\n missingUploadTokenError,\n networkRequestFailedError,\n responseParseFailedError,\n unsupportedAssetTypeError,\n} from \"./errors\";\n\ninterface IUploadResponse {\n readonly ret?: string | number;\n readonly errmsg?: string;\n readonly data?: {\n readonly asset_id?: string;\n readonly [key: string]: unknown;\n };\n readonly [key: string]: unknown;\n}\n\nconst UPLOAD_URL = \"https://xyq.jianying.com/api/web/v1/common/upload_file\";\n\nconst IMAGE_EXTENSIONS = new Set([\n \".png\",\n \".jpg\",\n \".jpeg\",\n \".gif\",\n \".webp\",\n \".bmp\",\n \".tif\",\n \".tiff\",\n \".heic\",\n \".heif\",\n \".avif\",\n]);\n\nconst VIDEO_EXTENSIONS = new Set([\n \".mp4\",\n \".mov\",\n \".m4v\",\n \".webm\",\n \".avi\",\n \".mkv\",\n \".flv\",\n \".ts\",\n \".wmv\",\n \".mpg\",\n \".mpeg\",\n]);\n\nfunction normalizeSessionToken(token: string): string {\n const trimmed = token.trim();\n const prefix = \"sessionid_pippitcn_web=\";\n if (trimmed.startsWith(prefix)) {\n return trimmed.slice(prefix.length).trim();\n }\n return trimmed;\n}\n\nfunction getCookieHeader(token: string): string {\n return `sessionid_pippitcn_web=${normalizeSessionToken(token)}`;\n}\n\nfunction resolveFileInfo(filePath: string): IAssetUploadFileInfo | undefined {\n const resolvedPath = path.resolve(process.cwd(), filePath);\n const fileName = path.basename(resolvedPath);\n const ext = path.extname(fileName).toLowerCase();\n\n let assetType: AssetType | undefined;\n if (IMAGE_EXTENSIONS.has(ext)) {\n assetType = 2;\n } else if (VIDEO_EXTENSIONS.has(ext)) {\n assetType = 1;\n }\n\n if (!assetType) {\n return undefined;\n }\n\n return {\n resolvedPath,\n fileName,\n assetType,\n };\n}\n\nfunction makeUploadFailedError(\n ret: string | number | undefined,\n errmsg?: string,\n) {\n const parsedCode =\n typeof ret === \"number\"\n ? ret\n : typeof ret === \"string\"\n ? Number.parseInt(ret, 10)\n : Number.NaN;\n const code = Number.isFinite(parsedCode) ? parsedCode : 1;\n const message = errmsg?.trim();\n return makeError(\n code,\n message && message.length > 0\n ? message\n : `上传失败,返回码: ${String(ret ?? \"unknown\")}`,\n );\n}\n\nexport async function uploadAssetCn(\n options: IAssetUploadOptions,\n): Promise<ILvErrorOr<IAssetUploadResult>> {\n const tokenResult = await readWebToken(Region.CN);\n if (!tokenResult.ok) {\n return tokenResult;\n }\n\n const token = tokenResult.value?.trim();\n if (!token) {\n return missingUploadTokenError();\n }\n\n const fileInfo = resolveFileInfo(options.filePath);\n if (!fileInfo) {\n return unsupportedAssetTypeError();\n }\n\n let fileBytes: Buffer;\n try {\n fileBytes = await fs.readFile(fileInfo.resolvedPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return fileReadFailedError(message);\n }\n\n const formData = new FormData();\n formData.append(\"file\", new Blob([fileBytes]), fileInfo.fileName);\n formData.append(\"asset_type\", String(fileInfo.assetType));\n\n const result = await requestJson<IUploadResponse>(UPLOAD_URL, {\n method: \"POST\",\n headers: {\n accept: \"application/json, text/plain, */*\",\n cookie: getCookieHeader(token),\n Referer: \"https://xyq.jianying.com/\",\n },\n body: formData,\n }, {\n networkRequestFailed: (message) => networkRequestFailedError(message),\n responseParseFailed: (message) => responseParseFailedError(message),\n });\n if (!result.ok) {\n return result;\n }\n\n const payload = result.value;\n const ret = payload?.ret;\n if (String(ret) !== \"0\") {\n return makeUploadFailedError(ret, payload?.errmsg);\n }\n\n const assetId = payload?.data?.asset_id?.trim();\n if (!assetId) {\n return makeError(1, \"上传成功,但未返回 asset_id。\");\n }\n\n return makeOkWith({\n assetId,\n fileInfo,\n region: Region.CN,\n });\n}\n","import { readConfigValue, writeConfigValue } from \"../../../../bedrock/config\";\nimport type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\n\ntype WebTokenConfigPath =\n | readonly [\"xyqweb\", \"sessionid_pippitcn_web\"]\n | readonly [\"pippitweb\", \"sid_tt\"];\n\ntype WebTokenNamespace = readonly [\"xyqweb\"] | readonly [\"pippitweb\"];\ntype WebTokenContainer = Record<string, unknown>;\n\nfunction getWebTokenConfigPath(region: Region): WebTokenConfigPath {\n return region === Region.CN\n ? [\"xyqweb\", \"sessionid_pippitcn_web\"]\n : [\"pippitweb\", \"sid_tt\"];\n}\n\nfunction getWebTokenNamespace(region: Region): WebTokenNamespace {\n return region === Region.CN ? [\"xyqweb\"] : [\"pippitweb\"];\n}\n\nexport async function writeWebToken(\n region: Region,\n token: string,\n): Promise<ILvErrorOr<void>> {\n const namespace = getWebTokenNamespace(region);\n const namespaceResult = await readConfigValue<WebTokenContainer | undefined>(\n namespace as any,\n undefined,\n );\n if (!namespaceResult.ok) {\n return namespaceResult;\n }\n\n const nextConfig: WebTokenContainer = {\n [getWebTokenConfigPath(region)[1]]: token,\n };\n\n return writeConfigValue(namespace as any, nextConfig);\n}\n\nexport async function readWebToken(\n region: Region,\n): Promise<ILvErrorOr<string | undefined>> {\n return readConfigValue(getWebTokenConfigPath(region) as any);\n}\n","import { lvErrorConst } from \"../../../../bedrock/error\";\n\nconst BASE = 13000;\n\nexport enum WebTokenError {\n MissingWebToken = BASE + 1,\n NetworkRequestFailed = BASE + 2,\n ResponseParseFailed = BASE + 3,\n UserInfoRequestFailed = BASE + 4,\n UserInfoNotFound = BASE + 5,\n WorkspaceRequestFailed = BASE + 6,\n WorkspaceNotFound = BASE + 7,\n RefreshNotSupported = BASE + 8,\n MissingWebContext = BASE + 9,\n}\n\nexport const missingWebTokenError = lvErrorConst(\n WebTokenError.MissingWebToken,\n \"缺少可用的 sessionid_pippitcn_web token,请先使用 `tt pippit web-token --region=cn <token>` 配置。\",\n);\n\nexport const networkRequestFailedError = lvErrorConst(\n WebTokenError.NetworkRequestFailed,\n \"请求 pippit web 相关接口失败,请检查网络和登录态。\",\n);\n\nexport const responseParseFailedError = lvErrorConst(\n WebTokenError.ResponseParseFailed,\n \"解析 pippit web 接口响应失败。\",\n);\n\nexport const userInfoRequestFailedError = lvErrorConst(\n WebTokenError.UserInfoRequestFailed,\n \"获取 pippit 用户信息失败。\",\n);\n\nexport const userInfoNotFoundError = lvErrorConst(\n WebTokenError.UserInfoNotFound,\n \"获取 pippit 用户信息失败,未返回 uid。\",\n);\n\nexport const workspaceRequestFailedError = lvErrorConst(\n WebTokenError.WorkspaceRequestFailed,\n \"获取 pippit workspace 信息失败。\",\n);\n\nexport const workspaceNotFoundError = lvErrorConst(\n WebTokenError.WorkspaceNotFound,\n \"获取 pippit workspace 信息失败,未返回 workspace_id 或 space_id。\",\n);\n\nexport const refreshNotSupportedError = lvErrorConst(\n WebTokenError.RefreshNotSupported,\n \"当前仅支持国内场景刷新 pippit web 关联信息。\",\n);\n\nexport const missingWebContextError = lvErrorConst(\n WebTokenError.MissingWebContext,\n \"请先配置 web-token\",\n);\n","import { readConfigValue, writeConfigValue } from \"../../../../bedrock/config\";\nimport { makeOkWith, type ILvErrorOr } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\nimport { requestJson as requestJsonShared } from \"../request-json\";\nimport {\n missingWebTokenError,\n missingWebContextError,\n networkRequestFailedError,\n refreshNotSupportedError,\n responseParseFailedError,\n userInfoNotFoundError,\n userInfoRequestFailedError,\n workspaceNotFoundError,\n workspaceRequestFailedError,\n} from \"./errors\";\n\nconst USER_INFO_URL =\n \"https://xyq.jianying.com/commerce/v1/subscription/user_info\";\nconst WORKSPACE_URL =\n \"https://xyq.jianying.com/api/web/v1/workspace/get_user_workspace\";\n\nconst WEB_NAMESPACE_PATH = [\"xyqweb\", \"pippitweb\"];\n\ninterface ITokenResponse {\n readonly ret?: string | number;\n readonly errmsg?: string;\n readonly data?: {\n readonly uid?: string | number;\n readonly [key: string]: unknown;\n };\n readonly [key: string]: unknown;\n}\n\ninterface IWorkspaceResponse {\n readonly ret?: string | number;\n readonly errmsg?: string;\n readonly data?: {\n readonly workspace_id?: string | number;\n readonly space_id?: string | number;\n readonly [key: string]: unknown;\n };\n readonly [key: string]: unknown;\n}\n\nexport interface IWebContextData {\n readonly uid: string;\n readonly workspaceId: string;\n readonly spaceId: string;\n}\n\nfunction normalizeToken(token: string): string {\n const trimmed = token.trim();\n const prefix = \"sessionid_pippitcn_web=\";\n if (trimmed.startsWith(prefix)) {\n return trimmed.slice(prefix.length).trim();\n }\n return trimmed;\n}\n\nfunction createCookieHeader(token: string): string {\n return `sessionid_pippitcn_web=${normalizeToken(token)}`;\n}\n\nfunction normalizeId(value: string | number | undefined): string | undefined {\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? String(value) : undefined;\n }\n\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction parseWebContext(value: unknown): IWebContextData | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return undefined;\n }\n\n const record = value as Record<string, unknown>;\n const uid = normalizeId(record.uid as string | number | undefined);\n const workspaceId = normalizeId(\n record.workspace_id as string | number | undefined,\n );\n const spaceId = normalizeId(record.space_id as string | number | undefined);\n\n if (!uid || !workspaceId || !spaceId) {\n return undefined;\n }\n\n return {\n uid,\n workspaceId,\n spaceId,\n };\n}\n\nasync function requestJson<T>(\n url: string,\n init: RequestInit,\n): Promise<ILvErrorOr<T>> {\n return requestJsonShared<T>(url, init, {\n networkRequestFailed: (message) => {\n return networkRequestFailedError(message);\n },\n responseParseFailed: (message) => {\n return responseParseFailedError(message);\n },\n });\n}\n\nasync function fetchUserId(token: string): Promise<ILvErrorOr<string>> {\n const responseResult = await requestJson<ITokenResponse>(USER_INFO_URL, {\n method: \"POST\",\n headers: {\n accept: \"application/json, text/plain, */*\",\n \"content-type\": \"application/json\",\n cookie: createCookieHeader(token),\n Referer: \"https://xyq.jianying.com/\",\n },\n body: JSON.stringify({\n aid: 795647,\n }),\n });\n if (!responseResult.ok) {\n return responseResult;\n }\n\n const data = responseResult.value;\n if (String(data?.ret) !== \"0\") {\n return userInfoRequestFailedError(data?.errmsg);\n }\n\n const uid = normalizeId(data?.data?.uid);\n if (!uid) {\n return userInfoNotFoundError();\n }\n\n return makeOkWith(uid);\n}\n\nasync function fetchWorkspace(\n token: string,\n uid: string,\n): Promise<ILvErrorOr<IWebContextData>> {\n const responseResult = await requestJson<IWorkspaceResponse>(WORKSPACE_URL, {\n method: \"POST\",\n headers: {\n accept: \"application/json, text/plain, */*\",\n \"content-type\": \"application/json\",\n cookie: createCookieHeader(token),\n Referer: \"https://xyq.jianying.com/\",\n },\n body: JSON.stringify({\n uid,\n }),\n });\n if (!responseResult.ok) {\n return responseResult;\n }\n\n const data = responseResult.value;\n if (String(data?.ret) !== \"0\") {\n return workspaceRequestFailedError(data?.errmsg);\n }\n\n const workspaceId = normalizeId(data?.data?.workspace_id);\n const spaceId = normalizeId(data?.data?.space_id);\n if (!workspaceId || !spaceId) {\n return workspaceNotFoundError();\n }\n\n return makeOkWith({\n uid,\n workspaceId,\n spaceId,\n });\n}\n\nexport async function refreshWebContext(\n region: Region,\n token: string,\n): Promise<ILvErrorOr<IWebContextData>> {\n if (region !== Region.CN) {\n return refreshNotSupportedError();\n }\n\n const normalizedToken = normalizeToken(token);\n if (!normalizedToken) {\n return missingWebTokenError();\n }\n\n const uidResult = await fetchUserId(normalizedToken);\n if (!uidResult.ok) {\n return uidResult;\n }\n\n const workspaceResult = await fetchWorkspace(\n normalizedToken,\n uidResult.value,\n );\n if (!workspaceResult.ok) {\n return workspaceResult;\n }\n\n const writeResult = await writeConfigValue(WEB_NAMESPACE_PATH, {\n uid: workspaceResult.value.uid,\n workspace_id: workspaceResult.value.workspaceId,\n space_id: workspaceResult.value.spaceId,\n });\n if (!writeResult.ok) {\n return writeResult;\n }\n\n return workspaceResult;\n}\n\nexport async function readWebContext(\n region: Region,\n): Promise<ILvErrorOr<IWebContextData>> {\n if (region !== Region.CN) {\n return refreshNotSupportedError();\n }\n\n const configResult = await readConfigValue<unknown>(\n WEB_NAMESPACE_PATH,\n undefined,\n );\n if (!configResult.ok) {\n return configResult;\n }\n\n const webContext = parseWebContext(configResult.value);\n if (!webContext) {\n return missingWebContextError();\n }\n\n return makeOkWith(webContext);\n}\n","import { lvErrorConst } from \"../../../../bedrock/error\";\n\nconst BASE = 12000;\n\nexport enum AssetUploadError {\n MissingFilePath = BASE + 1,\n MissingUploadToken = BASE + 2,\n UnsupportedAssetType = BASE + 3,\n NetworkRequestFailed = BASE + 4,\n ResponseParseFailed = BASE + 5,\n I18nNotSupported = BASE + 6,\n FileReadFailed = BASE + 7,\n}\n\nexport const missingFilePathError = lvErrorConst(\n AssetUploadError.MissingFilePath,\n \"缺少 file_path 参数。\",\n);\n\nexport const missingUploadTokenError = lvErrorConst(\n AssetUploadError.MissingUploadToken,\n \"缺少可用的 sessionid_pippitcn_web token,请先使用 `tt pippit web-token --region=cn <token>` 配置 token。获取 token 的图文详情参考 https://cdna-1253404032.cos.ap-beijing.myqcloud.com/img/copy-cookie.png\",\n);\n\nexport const unsupportedAssetTypeError = lvErrorConst(\n AssetUploadError.UnsupportedAssetType,\n \"目前只支持图片、视频文件类型。\",\n);\n\nexport const networkRequestFailedError = lvErrorConst(\n AssetUploadError.NetworkRequestFailed,\n \"请求 pippit 资源上传 API 失败,请检查网络和登录态。\",\n);\n\nexport const responseParseFailedError = lvErrorConst(\n AssetUploadError.ResponseParseFailed,\n \"解析 pippit 资源上传 API 响应失败。\",\n);\n\nexport const i18nNotSupportedError = lvErrorConst(\n AssetUploadError.I18nNotSupported,\n \"i18n 区域暂不支持 pippit 资源上传。\",\n);\n\nexport const fileReadFailedError = lvErrorConst(\n AssetUploadError.FileReadFailed,\n \"读取待上传文件失败。\",\n);\n","import type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport type { IAssetUploadOptions, IAssetUploadResult } from \"./types\";\nimport { i18nNotSupportedError } from \"./errors\";\n\nexport async function uploadAssetI18n(\n _options: IAssetUploadOptions,\n): Promise<ILvErrorOr<IAssetUploadResult>> {\n return i18nNotSupportedError();\n}\n","import type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\nimport type { IAssetUploadOptions, IAssetUploadResult } from \"./types\";\nimport { uploadAssetCn } from \"./cn-asset-upload\";\nimport { uploadAssetI18n } from \"./i18n-asset-upload\";\n\nexport async function uploadAsset(\n options: IAssetUploadOptions,\n): Promise<ILvErrorOr<IAssetUploadResult>> {\n if (options.region === Region.CN) {\n return uploadAssetCn(options);\n }\n\n return uploadAssetI18n(options);\n}\n","import type { Command } from \"commander\";\nimport { Option } from \"commander\";\nimport { BaseCommand } from \"../../core/base-command\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { refreshWebContext, writeWebToken } from \"./modules/web-token\";\nimport { Region } from \"./types\";\n\ninterface IPippitWebTokenOptions {\n region: Region;\n}\n\nexport class PippitWebTokenCommand extends BaseCommand<IPippitWebTokenOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"web-token\",\n description: \"设置 pippit web 的 token\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"<token>\", \"要写入的 pippit web token\");\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.addOption(\n new Option(\"-r, --region <region>\", \"token 所属区域\")\n .choices([\"cn\", \"i18n\"])\n .makeOptionMandatory(),\n );\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IPippitWebTokenOptions>,\n ): Promise<ILvErrorOr<void>> {\n const token = ctx.args[0] as string;\n const { region } = ctx.options;\n\n const result = await writeWebToken(region, token);\n if (!result.ok) {\n return this._makeError(result.code, result.msg);\n }\n\n if (region === Region.CN) {\n const refreshResult = await refreshWebContext(region, token);\n if (!refreshResult.ok) {\n return this._makeError(refreshResult.code, refreshResult.msg);\n }\n\n this._outputJsonOk({\n region,\n stored: true,\n refreshed: true,\n web: {\n uid: refreshResult.value.uid,\n workspace_id: refreshResult.value.workspaceId,\n space_id: refreshResult.value.spaceId,\n },\n });\n return this._makeOk();\n }\n\n this._outputJsonOk({\n region,\n stored: true,\n refreshed: false,\n });\n return this._makeOk();\n }\n}\n","import type { Command } from \"commander\";\nimport { Option } from \"commander\";\nimport { BaseCommand } from \"../../core/base-command\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { Region } from \"./types\";\nimport { getAssetInfo } from \"./modules/asset-get\";\nimport { missingAssetIdsError } from \"./modules/asset-get/errors\";\n\ninterface IPippitAssetGetOptions {\n region: Region;\n}\n\nexport class PippitAssetGetCommand extends BaseCommand<IPippitAssetGetOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"asset-get\",\n description: \"获取 pippit asset 详情\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"<asset_id...>\", \"要查询的 asset id,可传多个\");\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.addOption(\n new Option(\"-r, --region <region>\", \"指定区域\")\n .choices([Region.CN, Region.I18N])\n .makeOptionMandatory(),\n );\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IPippitAssetGetOptions>,\n ): Promise<ILvErrorOr<void>> {\n const assetIds = (ctx.args[0] as string[] | undefined) ?? [];\n const region = ctx.options.region;\n\n const normalizedAssetIds = assetIds\n .map((assetId) => assetId.trim())\n .filter((assetId) => assetId.length > 0);\n\n if (normalizedAssetIds.length === 0) {\n const error = missingAssetIdsError();\n this._outputJsonError(error.code, error.msg);\n return this._makeOk();\n }\n\n const result = await getAssetInfo({\n region,\n assetIds: normalizedAssetIds,\n });\n if (!result.ok) {\n this._outputJsonError(result.code, result.msg);\n return this._makeOk();\n }\n\n this._outputJsonOk(result.value);\n return this._makeOk();\n }\n}\n","import { lvErrorConst } from \"../../../../bedrock/error\";\n\nconst BASE = 14000;\n\nexport enum AssetGetError {\n MissingAssetIds = BASE + 1,\n MissingWebContext = BASE + 2,\n NetworkRequestFailed = BASE + 3,\n ResponseParseFailed = BASE + 4,\n RequestFailed = BASE + 5,\n I18nNotSupported = BASE + 6,\n}\n\nexport const missingAssetIdsError = lvErrorConst(\n AssetGetError.MissingAssetIds,\n \"缺少 asset_id 参数。\",\n);\n\nexport const missingWebContextError = lvErrorConst(\n AssetGetError.MissingWebContext,\n \"请先配置 web-token\",\n);\n\nexport const networkRequestFailedError = lvErrorConst(\n AssetGetError.NetworkRequestFailed,\n \"请求 pippit asset 接口失败,请检查网络和登录态。\",\n);\n\nexport const responseParseFailedError = lvErrorConst(\n AssetGetError.ResponseParseFailed,\n \"解析 pippit asset 接口响应失败。\",\n);\n\nexport const requestFailedError = lvErrorConst(\n AssetGetError.RequestFailed,\n \"获取 asset 信息失败。\",\n);\n\nexport const i18nNotSupportedError = lvErrorConst(\n AssetGetError.I18nNotSupported,\n \"i18n 区域暂不支持 pippit asset 查询。\",\n);\n","import type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport { makeError, makeOkWith } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\nimport { requestJson } from \"../request-json\";\nimport { readWebContext, readWebToken } from \"../web-token\";\nimport type { IAssetGetOptions, IAssetGetResult } from \"./types\";\nimport {\n missingWebContextError,\n networkRequestFailedError,\n requestFailedError,\n responseParseFailedError,\n} from \"./errors\";\n\ninterface IAssetInfoResponse {\n readonly ret?: string | number;\n readonly errmsg?: string;\n readonly data?: unknown;\n readonly [key: string]: unknown;\n}\n\nconst QUERY_URL = \"https://xyq.jianying.com/api/web/v1/common/mget_asset_info\";\nconst ALLOWED_KEYS = new Set([\n \"asset_id\",\n \"download_url\",\n \"duration_ms\",\n \"format\",\n \"height\",\n \"md5\",\n \"mime\",\n]);\n\nfunction normalizeToken(token: string): string {\n const trimmed = token.trim();\n const prefix = \"sessionid_pippitcn_web=\";\n if (trimmed.startsWith(prefix)) {\n return trimmed.slice(prefix.length).trim();\n }\n return trimmed;\n}\n\nfunction createCookieHeader(token: string): string {\n return `sessionid_pippitcn_web=${normalizeToken(token)}`;\n}\n\nfunction sanitizeAssetItem(item: unknown): Record<string, unknown> | undefined {\n if (typeof item !== \"object\" || item === null || Array.isArray(item)) {\n return undefined;\n }\n\n const record = item as Record<string, unknown>;\n const assetId = record.asset_id;\n if (typeof assetId !== \"string\" || assetId.trim().length === 0) {\n return undefined;\n }\n\n for (const key of Object.keys(record)) {\n if (!ALLOWED_KEYS.has(key)) {\n void Reflect.deleteProperty(record, key);\n }\n }\n\n record.asset_id = assetId.trim();\n return record;\n}\n\nfunction parseAssetList(data: unknown): IAssetGetResult | undefined {\n if (!Array.isArray(data)) {\n return undefined;\n }\n\n const result: IAssetGetResult = [];\n for (const item of data) {\n const sanitized = sanitizeAssetItem(item);\n if (sanitized) {\n result.push(sanitized);\n }\n }\n return result;\n}\n\nfunction parseErrorCode(ret: string | number | undefined): number {\n const parsed =\n typeof ret === \"number\"\n ? ret\n : typeof ret === \"string\"\n ? Number.parseInt(ret, 10)\n : Number.NaN;\n return Number.isFinite(parsed) ? parsed : 1;\n}\n\nexport async function getAssetInfoCn(\n options: IAssetGetOptions,\n): Promise<ILvErrorOr<IAssetGetResult>> {\n const webContextResult = await readWebContext(Region.CN);\n if (!webContextResult.ok) {\n return webContextResult;\n }\n\n const tokenResult = await readWebToken(Region.CN);\n if (!tokenResult.ok) {\n return tokenResult;\n }\n\n const token = tokenResult.value?.trim();\n if (!token) {\n return missingWebContextError();\n }\n\n const responseResult = await requestJson<IAssetInfoResponse>(\n QUERY_URL,\n {\n method: \"POST\",\n headers: {\n accept: \"application/json, text/plain, */*\",\n \"content-type\": \"application/json\",\n cookie: createCookieHeader(token),\n Referer: \"https://xyq.jianying.com/\",\n },\n body: JSON.stringify({\n workspace_id: webContextResult.value.workspaceId,\n asset_ids: options.assetIds,\n uid: webContextResult.value.uid,\n need_transcode: true,\n }),\n },\n {\n networkRequestFailed: (message) => networkRequestFailedError(message),\n responseParseFailed: (message) => responseParseFailedError(message),\n },\n );\n if (!responseResult.ok) {\n return responseResult;\n }\n\n const response = responseResult.value;\n if (String(response.ret) !== \"0\") {\n return makeError(\n parseErrorCode(response.ret),\n response.errmsg?.trim() || \"获取 asset 信息失败。\",\n );\n }\n\n const assets = parseAssetList(response.data);\n if (!assets) {\n return requestFailedError(\"返回的 data 不是数组。\");\n }\n\n return makeOkWith(assets);\n}\n","import type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport type { IAssetGetOptions, IAssetGetResult } from \"./types\";\nimport { i18nNotSupportedError } from \"./errors\";\n\nexport async function getAssetInfoI18n(\n _options: IAssetGetOptions,\n): Promise<ILvErrorOr<IAssetGetResult>> {\n return i18nNotSupportedError();\n}\n","import type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\nimport type { IAssetGetOptions, IAssetGetResult } from \"./types\";\nimport { getAssetInfoCn } from \"./cn-asset-get\";\nimport { getAssetInfoI18n } from \"./i18n-asset-get\";\n\nexport async function getAssetInfo(\n options: IAssetGetOptions,\n): Promise<ILvErrorOr<IAssetGetResult>> {\n if (options.region === Region.CN) {\n return getAssetInfoCn(options);\n }\n\n return getAssetInfoI18n(options);\n}\n","import type { ICommandMeta } from \"../../core/command-types\";\nimport { BaseSubcommandHost } from \"../../core/base-subcommand-host\";\nimport { PippitGetThreadCommand } from \"./pippit-get-thread-command\";\nimport { PippitFornaxTokenCommand } from \"./pippit-fornax-token-command\";\nimport { PippitSearchFornaxLogCommand } from \"./pippit-search-fornax-log-command\";\nimport { PippitSaveThreadFornaxCommand } from \"./pippit-save-thread-fornax-command\";\nimport { PippitAssetUploadCommand } from \"./pippit-asset-upload-command\";\nimport { PippitWebTokenCommand } from \"./pippit-web-token-command\";\nimport { PippitAssetGetCommand } from \"./pippit-asset-get-command\";\n\nexport class PippitCommand extends BaseSubcommandHost {\n protected _meta(): ICommandMeta {\n return {\n name: \"pippit\",\n description: \"访问 pippit 服务\",\n aliases: [\"pp\", \"xyq\"],\n };\n }\n\n protected _registerSubcommands(): void {\n this._addSubcommand(new PippitGetThreadCommand());\n this._addSubcommand(new PippitFornaxTokenCommand());\n this._addSubcommand(new PippitSearchFornaxLogCommand());\n this._addSubcommand(new PippitSaveThreadFornaxCommand());\n this._addSubcommand(new PippitAssetUploadCommand());\n this._addSubcommand(new PippitWebTokenCommand());\n this._addSubcommand(new PippitAssetGetCommand());\n }\n}\n","import { spawnSync } from \"node:child_process\";\nimport type { Command } from \"commander\";\nimport { BaseCommand } from \"../../core/base-command\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { makeError, makeOkWith } from \"../../bedrock/error\";\n\nexport interface IGitCommandOptions {\n readonly verify?: boolean;\n}\n\nexport abstract class GitBaseCommand extends BaseCommand<IGitCommandOptions> {\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"[msg]\", \"提交消息\", \"feat: update\");\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.option(\"-n, --no-verify\", \"跳过 git hook 校验\");\n }\n\n protected _runGit(args: string[]): ILvErrorOr<void> {\n const result = spawnSync(\"git\", args, {\n cwd: process.cwd(),\n stdio: \"inherit\",\n });\n\n if (result.error) {\n return this._makeError(\n 1,\n `执行 git ${args.join(\" \")} 失败: ${result.error.message}`,\n );\n }\n\n if (result.status !== 0) {\n const signalText = result.signal ? `, signal: ${result.signal}` : \"\";\n return this._makeError(\n result.status ?? 1,\n `执行 git ${args.join(\" \")} 失败${signalText}`,\n );\n }\n\n return this._makeOk();\n }\n\n protected _runGitCapture(args: string[]): ILvErrorOr<string> {\n const result = spawnSync(\"git\", args, {\n cwd: process.cwd(),\n encoding: \"utf8\",\n });\n\n if (result.error) {\n return makeError(\n 1,\n `执行 git ${args.join(\" \")} 失败: ${result.error.message}`,\n );\n }\n\n if (result.status !== 0) {\n const signalText = result.signal ? `, signal: ${result.signal}` : \"\";\n const stderrText =\n typeof result.stderr === \"string\" && result.stderr.trim()\n ? `: ${result.stderr.trim()}`\n : \"\";\n return makeError(\n result.status ?? 1,\n `执行 git ${args.join(\" \")} 失败${signalText}${stderrText}`,\n );\n }\n\n return makeOkWith((result.stdout ?? \"\").trim());\n }\n\n protected _gitAddAll(): ILvErrorOr<void> {\n return this._runGit([\"add\", \".\"]);\n }\n\n protected _gitCommit(msg: string, noVerify: boolean): ILvErrorOr<void> {\n const args = [\"commit\", \"-m\", msg];\n if (noVerify) {\n args.push(\"--no-verify\");\n }\n return this._runGit(args);\n }\n\n protected _gitPush(noVerify: boolean): ILvErrorOr<void> {\n const args = [\"push\"];\n if (noVerify) {\n args.push(\"--no-verify\");\n }\n return this._runGit(args);\n }\n\n protected _gitCheckoutNewBranch(branchName: string): ILvErrorOr<void> {\n return this._runGit([\"checkout\", \"-b\", branchName]);\n }\n\n protected _gitPullRebaseOrigin(branchName: string): ILvErrorOr<void> {\n return this._runGit([\"pull\", \"--rebase\", \"origin\", branchName]);\n }\n\n protected _gitPushWithUpstream(branchName: string): ILvErrorOr<void> {\n return this._runGit([\"push\", \"-u\", \"origin\", branchName]);\n }\n\n protected _gitCurrentBranch(): ILvErrorOr<string> {\n const result = this._runGitCapture([\"branch\", \"--show-current\"]);\n if (!result.ok) {\n return result;\n }\n\n if (!result.value) {\n return makeError(1, \"当前不在任何分支上,请先切换到一个分支\");\n }\n\n return result;\n }\n\n protected _gitOriginUrl(): ILvErrorOr<string> {\n return this._runGitCapture([\"config\", \"--get\", \"remote.origin.url\"]);\n }\n\n protected _normalizeRepoUrl(originUrl: string): string {\n const trimmed = originUrl.trim().replace(/\\.git$/, \"\");\n\n if (trimmed.startsWith(\"http://\") || trimmed.startsWith(\"https://\")) {\n return trimmed;\n }\n\n const sshLike = trimmed.match(/^git@([^:]+):(.+)$/);\n if (sshLike) {\n return `https://${sshLike[1]}/${sshLike[2]}`;\n }\n\n const sshUrlLike = trimmed.match(/^ssh:\\/\\/git@([^/]+)\\/(.+)$/);\n if (sshUrlLike) {\n return `https://${sshUrlLike[1]}/${sshUrlLike[2]}`;\n }\n\n return trimmed;\n }\n\n protected _openUrlInBrowser(url: string): ILvErrorOr<void> {\n const result =\n process.platform === \"darwin\"\n ? spawnSync(\"open\", [url], {\n cwd: process.cwd(),\n stdio: \"ignore\",\n })\n : process.platform === \"win32\"\n ? spawnSync(\"cmd\", [\"/c\", \"start\", \"\", url], {\n cwd: process.cwd(),\n stdio: \"ignore\",\n })\n : spawnSync(\"xdg-open\", [url], {\n cwd: process.cwd(),\n stdio: \"ignore\",\n });\n\n if (result.error) {\n return this._makeError(1, `打开浏览器失败: ${result.error.message}`);\n }\n\n if (result.status !== 0) {\n const signalText = result.signal ? `, signal: ${result.signal}` : \"\";\n return this._makeError(result.status ?? 1, `打开浏览器失败${signalText}`);\n }\n\n return this._makeOk();\n }\n\n protected abstract _meta(): ICommandMeta;\n\n protected abstract _execute(\n ctx: ICommandActionContext<IGitCommandOptions>,\n ): Promise<ILvErrorOr<void>>;\n}\n","import type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { Command } from \"commander\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { GitBaseCommand, type IGitCommandOptions } from \"./git-base-command\";\n\nexport class GitCheckoutCommand extends GitBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"checkout\",\n description: \"同步当前分支后基于它创建并推送一个新分支\",\n aliases: [\"c\"],\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"<branch>\", \"要创建的新分支名\");\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IGitCommandOptions>,\n ): Promise<ILvErrorOr<void>> {\n const branchName = ctx.args[0] as string;\n\n const currentBranchResult = this._gitCurrentBranch();\n if (!currentBranchResult.ok) {\n return currentBranchResult;\n }\n\n const syncResult = this._gitPullRebaseOrigin(currentBranchResult.value);\n if (!syncResult.ok) {\n return syncResult;\n }\n\n const checkoutResult = this._gitCheckoutNewBranch(branchName);\n if (!checkoutResult.ok) {\n return checkoutResult;\n }\n\n return this._gitPushWithUpstream(branchName);\n }\n}\n","import type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { GitBaseCommand, type IGitCommandOptions } from \"./git-base-command\";\n\nexport class GitMmCommand extends GitBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"mm\",\n description: \"执行 git add . 和 git commit\",\n };\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IGitCommandOptions>,\n ): Promise<ILvErrorOr<void>> {\n const msg = ctx.args[0] as string;\n const { verify } = ctx.options;\n const noVerif = verify === false;\n\n const addResult = this._gitAddAll();\n if (!addResult.ok) {\n return addResult;\n }\n\n return this._gitCommit(msg, noVerif);\n }\n}\n","import type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { GitBaseCommand } from \"./git-base-command\";\n\nexport class GitMrCommand extends GitBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"mr\",\n description: \"基于当前分支生成并打开 merge request 链接\",\n };\n }\n\n protected async _execute(\n _ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n const currentBranchResult = this._gitCurrentBranch();\n if (!currentBranchResult.ok) {\n return currentBranchResult;\n }\n\n const originUrlResult = this._gitOriginUrl();\n if (!originUrlResult.ok) {\n return originUrlResult;\n }\n\n const repoUrl = this._normalizeRepoUrl(originUrlResult.value);\n const mrUrl =\n `${repoUrl}/merge_requests/new?merge_request=&source_branch=${encodeURIComponent(currentBranchResult.value)}`;\n\n this._output(mrUrl);\n\n const openResult = this._openUrlInBrowser(mrUrl);\n if (!openResult.ok) {\n this._debug(openResult.msg);\n }\n\n return this._makeOk();\n }\n}\n","import type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { GitBaseCommand, type IGitCommandOptions } from \"./git-base-command\";\n\nexport class GitPpCommand extends GitBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"pp\",\n description: \"执行 git add .、git commit 并 push\",\n };\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IGitCommandOptions>,\n ): Promise<ILvErrorOr<void>> {\n const msg = ctx.args[0] as string;\n const { verify } = ctx.options;\n const noVerif = verify === false;\n\n const addResult = this._gitAddAll();\n if (!addResult.ok) {\n return addResult;\n }\n\n const commitResult = this._gitCommit(msg, noVerif);\n if (!commitResult.ok) {\n return commitResult;\n }\n\n return this._gitPush(noVerif);\n }\n}\n","import type { ICommandMeta } from \"../../core/command-types\";\nimport { BaseSubcommandHost } from \"../../core/base-subcommand-host\";\nimport { GitCheckoutCommand } from \"./git-checkout-command\";\nimport { GitMmCommand } from \"./git-mm-command\";\nimport { GitMrCommand } from \"./git-mr-command\";\nimport { GitPpCommand } from \"./git-pp-command\";\n\nexport class GitCommand extends BaseSubcommandHost {\n protected _meta(): ICommandMeta {\n return {\n name: \"git\",\n description: \"常用 git 便捷命令\",\n aliases: [\"g\"],\n };\n }\n\n protected _registerSubcommands(): void {\n this._addSubcommand(new GitMmCommand());\n this._addSubcommand(new GitPpCommand());\n this._addSubcommand(new GitCheckoutCommand());\n this._addSubcommand(new GitMrCommand());\n }\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { ShortcutBaseCommand } from \"./shortcut-base-command\";\n\nexport class ShortcutEmoLynxCommand extends ShortcutBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"lynx\",\n description: \"启动 lynx 项目\",\n aliases: [\"lx\"],\n };\n }\n\n protected async _execute(\n _ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n const cwd = join(homedir(), \"work\", \"lv-lynx\");\n return this._runCommandLine(` emo start pippit-lynx --deps`, cwd);\n }\n}\n","import { spawn } from \"node:child_process\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { BaseCommand } from \"../../core/base-command\";\n\nexport abstract class ShortcutBaseCommand extends BaseCommand {\n protected _runCommandLine(\n cmdLine: string,\n cwd: string = process.cwd(),\n customEnv: NodeJS.ProcessEnv = {},\n ): Promise<ILvErrorOr<void>> {\n const child = spawn(cmdLine, {\n cwd,\n env: { ...process.env, ...customEnv },\n stdio: \"inherit\",\n shell: true,\n });\n\n return new Promise((resolve) => {\n child.on(\"error\", (error) => {\n resolve(\n this._makeError(\n 1,\n `执行 ${cmdLine} 失败: ${error.message}`,\n ),\n );\n });\n\n child.on(\"close\", (code, signal) => {\n if (code === 0) {\n resolve(this._makeOk());\n return;\n }\n\n const signalText = signal ? `, signal: ${signal}` : \"\";\n resolve(\n this._makeError(\n code ?? 1,\n `执行 ${cmdLine} 失败${signalText}`,\n ),\n );\n });\n });\n }\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { ShortcutBaseCommand } from \"./shortcut-base-command\";\n\nexport class ShortcutEmoPippitCnCommand extends ShortcutBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"pippit-cn\",\n description: \"启动 pippit-cn 项目\",\n aliases: [\"ppc\"],\n };\n }\n\n protected async _execute(\n _ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n const cwd = join(homedir(), \"work\", \"pippit-cn\");\n return this._runCommandLine(`w2 start && emo start platform-xyq`, cwd);\n }\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { ShortcutBaseCommand } from \"./shortcut-base-command\";\n\nexport class ShortcutEmoPippitCommand extends ShortcutBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"pippit\",\n description: \"启动 pippit 项目\",\n aliases: [\"pp\"],\n };\n }\n\n protected async _execute(\n _ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n const cwd = join(homedir(), \"work\", \"pippit\");\n return this._runCommandLine(`w2 start && emo start platform-business`, cwd);\n }\n}\n","import type { ICommandMeta } from \"../../core/command-types\";\nimport { BaseSubcommandHost } from \"../../core/base-subcommand-host\";\nimport { ShortcutEmoLynxCommand } from \"./shortcut-emo-lynx-command\";\nimport { ShortcutEmoPippitCnCommand } from \"./shortcut-emo-pippit-cn-command\";\nimport { ShortcutEmoPippitCommand } from \"./shortcut-emo-pippit-command\";\n\nexport class ShortcutCommand extends BaseSubcommandHost {\n protected _meta(): ICommandMeta {\n return {\n name: \"shortcut\",\n description: \"常用 shell 命令快捷方式\",\n aliases: [\"sc\"],\n };\n }\n\n protected _registerSubcommands(): void {\n this._addSubcommand(new ShortcutEmoLynxCommand());\n this._addSubcommand(new ShortcutEmoPippitCommand());\n this._addSubcommand(new ShortcutEmoPippitCnCommand());\n }\n}\n","import { spawn } from \"node:child_process\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { BaseCommand } from \"../../core/base-command\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\n\nexport abstract class AiBaseCommand<\n TOptions = Record<string, unknown>,\n> extends BaseCommand<TOptions> {\n protected _readPrompt(ctx: ICommandActionContext<TOptions>): string {\n const parts: string[] = [];\n\n for (const arg of ctx.args) {\n if (Array.isArray(arg)) {\n parts.push(...arg.map((item) => String(item)));\n } else if (arg !== undefined && arg !== null) {\n parts.push(String(arg));\n }\n }\n\n return parts.join(\" \").trim();\n }\n\n protected _runCommand(\n command: string,\n args: string[],\n ): Promise<ILvErrorOr<void>> {\n const child = spawn(command, args, {\n cwd: process.cwd(),\n stdio: \"inherit\",\n });\n\n return new Promise((resolve) => {\n child.on(\"error\", (error) => {\n resolve(\n this._makeError(\n 1,\n `执行 ${command} ${args.join(\" \")} 失败: ${error.message}`,\n ),\n );\n });\n\n child.on(\"close\", (code, signal) => {\n if (code === 0) {\n resolve(this._makeOk());\n return;\n }\n\n const signalText = signal ? `, signal: ${signal}` : \"\";\n resolve(\n this._makeError(\n code ?? 1,\n `执行 ${command} ${args.join(\" \")} 失败${signalText}`,\n ),\n );\n });\n });\n }\n}\n","/**\n * https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey\n */\nexport const ARK_AK = \"6990de07-83be-487d-930d-f5dd3b6d5993\";\n\nexport const OPENROUTER_AK =\n \"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\";\n","import type { Command } from \"commander\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { AiBaseCommand } from \"./ai-base-command\";\nimport { ARK_AK } from \"../../constants/ak\";\n\ntype IWebSearchResponse = {\n readonly output?: unknown;\n};\n\nexport class AiWebSearchCommand extends AiBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"websearch\",\n description: \"使用内置 web search 搜索内容\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"[content...]\", \"搜索内容\");\n }\n\n protected async _execute(\n ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n const content = this._readPrompt(ctx);\n if (!content) {\n return this._makeError(1, \"请输入搜索内容\");\n }\n\n const url = \"https://ark.cn-beijing.volces.com/api/v3/responses\";\n const token = ARK_AK;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: \"doubao-seed-2-0-mini-260215\",\n tools: [\n {\n type: \"web_search\",\n },\n ],\n input: [\n {\n role: \"user\",\n content: [\n {\n type: \"input_text\",\n text: content,\n },\n ],\n },\n ],\n }),\n });\n\n if (!response.ok) {\n const bodyText = await response.text().catch(() => \"\");\n const suffix = bodyText ? `: ${bodyText}` : \"\";\n return this._makeError(\n response.status,\n `HTTP 错误!状态码: ${response.status}${suffix}`,\n );\n }\n\n const data = (await response.json()) as IWebSearchResponse;\n const outputList = data.output;\n\n if (!Array.isArray(outputList) || outputList.length === 0) {\n return this._makeError(1, \"返回数据格式异常\");\n }\n\n let outputStr = \"返回数据格式异常\";\n for (const item of outputList) {\n if (item && typeof item === \"object\" && \"content\" in item) {\n const contentValue = (item as { readonly content?: unknown }).content;\n if (contentValue !== undefined) {\n outputStr = JSON.stringify(contentValue);\n }\n }\n }\n\n this._output(outputStr);\n return this._makeOk();\n }\n}\n","import type { Command } from \"commander\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { AiBaseCommand } from \"./ai-base-command\";\n\nexport class AiCursorCommand extends AiBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"cursor\",\n description: \"通过 agent 调用 Gemini 3 Flash\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"[content...]\", \"要传给 agent 的内容\");\n }\n\n protected async _execute(\n ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n const prompt = this._readPrompt(ctx);\n if (!prompt) {\n return this._makeError(1, \"请输入内容\");\n }\n\n return this._runCommand(\"agent\", [\"--model\", \"gemini-3-flash\", \"-p\", prompt]);\n }\n}\n","import type { Command } from \"commander\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { AiBaseCommand } from \"./ai-base-command\";\n\ninterface IAiCodexOptions {\n mini: boolean;\n}\n\nexport class AiCodexCommand extends AiBaseCommand<IAiCodexOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"codex\",\n description: \"通过 codex exec 执行提示词\",\n };\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.option(\"--mini\", \"使用 gpt-5.4-mini,否则使用 gpt-5.4\", false);\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"[content...]\", \"要传给 codex 的内容\");\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IAiCodexOptions>,\n ): Promise<ILvErrorOr<void>> {\n const prompt = this._readPrompt(ctx);\n if (!prompt) {\n return this._makeError(1, \"请输入内容\");\n }\n\n const model = ctx.options.mini ? \"gpt-5.4-mini\" : \"gpt-5.4\";\n\n return this._runCommand(\"codex\", [\n \"exec\",\n \"-m\",\n model,\n \"--full-auto\",\n prompt,\n ]);\n }\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { makeOkWith } from \"../../bedrock/error\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport { AiBaseCommand } from \"./ai-base-command\";\nimport {\n ensureDirectoryExists,\n getCurrentCloudRootPath,\n} from \"./ai-context-path\";\n\ntype TAiRunOptions = Record<string, boolean>;\n\ninterface IAiRunContextAlias {\n readonly optionName: string;\n readonly optionDescription: string;\n readonly resolveReferenceDir: () => ILvErrorOr<string>;\n}\n\nconst AI_RUN_CONTEXT_ALIASES: readonly IAiRunContextAlias[] = [\n {\n optionName: \"my\",\n optionDescription:\n \"参考 iCloud 知识库上下文,了解我的个人信息和工作日志信息\",\n resolveReferenceDir: () => {\n const cloudRoot = getCurrentCloudRootPath();\n if (!cloudRoot.ok) {\n return cloudRoot;\n }\n\n return ensureDirectoryExists(\n join(cloudRoot.value, \"icloud-hub\", \"local-knowlege-base\"),\n );\n },\n },\n {\n optionName: \"sk\",\n optionDescription: \"参考 ~/work/smart-agent/dymamic-skills 学习 skill\",\n resolveReferenceDir: () => {\n return ensureDirectoryExists(\n join(homedir(), \"work\", \"smart-agent\", \"dynamic-skills\"),\n );\n },\n },\n] as const;\n\nexport class AiRunCommand extends AiBaseCommand<TAiRunOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"run\",\n description: \"通过 codex exec 执行 prompt,并可附带目录上下文\",\n };\n }\n\n protected _configureOptions(cmd: Command): void {\n for (const alias of AI_RUN_CONTEXT_ALIASES) {\n cmd.option(`--${alias.optionName}`, alias.optionDescription, false);\n }\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"[content...]\", \"要传给 codex 的内容\");\n }\n\n protected async _execute(\n ctx: ICommandActionContext<TAiRunOptions>,\n ): Promise<ILvErrorOr<void>> {\n const prompt = this._readPrompt(ctx);\n if (!prompt) {\n return this._makeError(1, \"请输入内容\");\n }\n\n const enhancedPrompt = this._buildPromptWithContext(ctx.options, prompt);\n if (!enhancedPrompt.ok) {\n return enhancedPrompt;\n }\n\n return this._runCommand(\"codex\", [\n \"exec\",\n \"-m\",\n \"gpt-5.4\",\n \"--full-auto\",\n enhancedPrompt.value,\n ]);\n }\n\n private _buildPromptWithContext(\n options: TAiRunOptions,\n prompt: string,\n ): ILvErrorOr<string> {\n const reminders: string[] = [];\n\n for (const alias of AI_RUN_CONTEXT_ALIASES) {\n if (!options[alias.optionName]) {\n continue;\n }\n\n const referenceDir = alias.resolveReferenceDir();\n if (!referenceDir.ok) {\n return referenceDir;\n }\n\n reminders.push(this._createSystemReminder(referenceDir.value));\n }\n\n if (reminders.length === 0) {\n return makeOkWith(prompt);\n }\n\n return makeOkWith([...reminders, prompt].join(\"\\n\"));\n }\n\n private _createSystemReminder(referenceDir: string): string {\n return `<system-reminder>\\n参考文件路径 ${referenceDir} 下,文件夹里的内容,执行用户的要求,若非用户明确要求,不要对该文件夹的内容进行修改,而是查阅里面的内容作为上下文补充比如作为信息参考,或者执行指引;\\n如果 user_prompt 里,给出一些文件路径,默认是当前执行命令路径 (cwd) 下的文件,提供的是本次要求的详细指令或者重要的参考信息\\n若用户未提及任何文件和目录,你无需读取命令执行目录下的任何内容,只需在参考文件路径下搜索相关的信息即可\\n最后给出的用户回复,无需引用参考文件目录下的具体文件,因为用户不会去看对应的文件,而且这也是内部私有信息\\n</system-reminder>\\nuser_prompt:\\n`;\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { makeError, makeOkWith } from \"../../bedrock/error\";\n\nexport function getCurrentCloudRootPath(): ILvErrorOr<string> {\n if (process.platform !== \"darwin\") {\n return makeError(1, \"`--my` 仅支持在 macOS 上使用\");\n }\n\n const cloudRootPath = join(\n homedir(),\n \"Library\",\n \"Mobile Documents\",\n \"com~apple~CloudDocs\",\n );\n\n if (!existsSync(cloudRootPath)) {\n return makeError(1, `未找到 iCloud 目录: ${cloudRootPath}`);\n }\n\n return makeOkWith(cloudRootPath);\n}\n\nexport function ensureDirectoryExists(dirPath: string): ILvErrorOr<string> {\n if (!existsSync(dirPath)) {\n return makeError(1, `未找到目录: ${dirPath}`);\n }\n\n return makeOkWith(dirPath);\n}\n","import { spawn } from \"node:child_process\";\nimport type { Dirent, Stats } from \"node:fs\";\nimport * as fs from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport * as path from \"node:path\";\nimport type { Command } from \"commander\";\nimport { makeError, makeOkWith } from \"../../bedrock/error\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport { AiBaseCommand } from \"./ai-base-command\";\n\nconst GENERATED_IMAGES_DIR = path.join(homedir(), \".codex\", \"generated_images\");\nconst CODEX_EMPTY_WORKDIR = path.join(homedir(), \".codex-empty\");\nconst CREATED_AT_TOLERANCE_MS = 1_000;\n\ninterface ICreatedEntry {\n readonly filePath: string;\n readonly createdAt: number;\n}\n\nexport class AiImageCommandV2 extends AiBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"image\",\n description: \"通过 codex exec 生成图片,并返回本地生成图片路径\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\n \"[prompt...]\",\n \"生图提示词;如有参考图,需在 prompt 中给出参考图的绝对地址\",\n );\n }\n\n protected async _execute(\n ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n const prompt = this._readPrompt(ctx);\n if (!prompt) {\n this._outputJsonError(1, \"请输入生图提示词\");\n return this._makeOk();\n }\n\n const startedAt = Date.now();\n const runResult = await this._runCodexImagePrompt(prompt);\n if (!runResult.ok) {\n this._outputJsonError(runResult.code, runResult.msg);\n return this._makeOk();\n }\n\n const imagePathResult = await findLatestGeneratedImageFile(startedAt);\n if (!imagePathResult.ok) {\n this._outputJsonError(imagePathResult.code, imagePathResult.msg);\n return this._makeOk();\n }\n\n this._outputJsonOk({\n image_path: imagePathResult.value,\n });\n return this._makeOk();\n }\n\n private async _runCodexImagePrompt(\n prompt: string,\n ): Promise<ILvErrorOr<void>> {\n try {\n await fs.mkdir(CODEX_EMPTY_WORKDIR, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return this._makeError(\n 1,\n `创建 codex 空工作目录失败: ${CODEX_EMPTY_WORKDIR}: ${message}`,\n );\n }\n\n const codexPrompt = `生成图片\\n ${prompt}`;\n const args = [\n \"exec\",\n \"-C\",\n CODEX_EMPTY_WORKDIR,\n \"--skip-git-repo-check\",\n \"--ephemeral\",\n \"--dangerously-bypass-approvals-and-sandbox\",\n codexPrompt,\n ];\n\n const child = spawn(\"codex\", args, {\n cwd: process.cwd(),\n stdio: \"ignore\",\n });\n\n return new Promise((resolve) => {\n child.on(\"error\", (error) => {\n resolve(\n this._makeError(\n 1,\n `执行 codex ${args.join(\" \")} 失败: ${error.message}`,\n ),\n );\n });\n\n child.on(\"close\", (code, signal) => {\n if (code === 0) {\n resolve(this._makeOk());\n return;\n }\n\n const signalText = signal ? `, signal: ${signal}` : \"\";\n resolve(\n this._makeError(\n code ?? 1,\n `执行 codex ${args.join(\" \")} 失败${signalText}`,\n ),\n );\n });\n });\n }\n}\n\nasync function findLatestGeneratedImageFile(\n minCreatedAt: number,\n): Promise<ILvErrorOr<string>> {\n const latestDirectoryResult = await findLatestCreatedDirectory(\n GENERATED_IMAGES_DIR,\n minCreatedAt,\n );\n if (!latestDirectoryResult.ok) {\n return latestDirectoryResult;\n }\n\n return findLatestCreatedFile(latestDirectoryResult.value);\n}\n\nasync function findLatestCreatedDirectory(\n directoryPath: string,\n minCreatedAt: number,\n): Promise<ILvErrorOr<string>> {\n const entriesResult = await readDirectoryEntries(directoryPath);\n if (!entriesResult.ok) {\n return entriesResult;\n }\n\n const directories = await collectCreatedEntries(\n directoryPath,\n entriesResult.value\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name),\n );\n if (!directories.ok) {\n return directories;\n }\n\n const latest = directories.value\n .filter(\n (entry) => entry.createdAt >= minCreatedAt - CREATED_AT_TOLERANCE_MS,\n )\n .sort(compareCreatedEntryDesc)[0];\n if (!latest) {\n return makeErrorForPath(\n 1,\n \"未找到本次 codex 生图输出子目录\",\n directoryPath,\n );\n }\n\n return makeOkWith(latest.filePath);\n}\n\nasync function findLatestCreatedFile(\n directoryPath: string,\n): Promise<ILvErrorOr<string>> {\n const entriesResult = await readDirectoryEntries(directoryPath);\n if (!entriesResult.ok) {\n return entriesResult;\n }\n\n const files = await collectCreatedEntries(\n directoryPath,\n entriesResult.value\n .filter((entry) => entry.isFile())\n .map((entry) => entry.name),\n );\n if (!files.ok) {\n return files;\n }\n\n const latest = files.value.sort(compareCreatedEntryDesc)[0];\n if (!latest) {\n return makeErrorForPath(1, \"最新生图输出目录中未找到文件\", directoryPath);\n }\n\n return makeOkWith(path.resolve(latest.filePath));\n}\n\nasync function readDirectoryEntries(\n directoryPath: string,\n): Promise<ILvErrorOr<Dirent[]>> {\n try {\n return makeOkWith(await fs.readdir(directoryPath, { withFileTypes: true }));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeErrorForPath(1, `读取目录失败: ${message}`, directoryPath);\n }\n}\n\nasync function collectCreatedEntries(\n parentPath: string,\n names: string[],\n): Promise<ILvErrorOr<ICreatedEntry[]>> {\n const entries: ICreatedEntry[] = [];\n\n for (const name of names) {\n const filePath = path.join(parentPath, name);\n\n try {\n const stats = await fs.stat(filePath);\n entries.push({\n filePath,\n createdAt: getCreatedAt(stats),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeErrorForPath(1, `读取路径状态失败: ${message}`, filePath);\n }\n }\n\n return makeOkWith(entries);\n}\n\nfunction getCreatedAt(stats: Stats): number {\n return stats.birthtimeMs || stats.ctimeMs || stats.mtimeMs;\n}\n\nfunction compareCreatedEntryDesc(a: ICreatedEntry, b: ICreatedEntry): number {\n return b.createdAt - a.createdAt || b.filePath.localeCompare(a.filePath);\n}\n\nfunction makeErrorForPath(\n code: number,\n message: string,\n filePath: string,\n): ILvErrorOr<never> {\n return makeError(code, `${message}: ${filePath}`);\n}\n","import * as path from \"node:path\";\nimport { Option } from \"commander\";\nimport type { Command } from \"commander\";\nimport type {\n AssetType,\n IAssetUploadResult,\n} from \"../pippit/modules/asset-upload/types\";\nimport { uploadAsset } from \"../pippit/modules/asset-upload/upload-asset\";\nimport { Region } from \"../pippit/types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { makeOkWith } from \"../../bedrock/error\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport { AiBaseCommand } from \"./ai-base-command\";\nimport { submitDirectCn } from \"../pippit/modules\";\n\ninterface IAiVideoOptions {\n reference: string[];\n}\n\ninterface IAiVideoAsset {\n readonly asset_id: string;\n readonly asset_type: AssetType;\n readonly file_path: string;\n readonly region: Region;\n}\n\ninterface IAiVideoGenerationPayload {\n readonly prompt: string;\n readonly assets: readonly IAiVideoAsset[];\n readonly implemented: boolean;\n}\n\nexport class AiVideoCommand extends AiBaseCommand<IAiVideoOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"video\",\n description: \"上传参考素材并调用视频生成接口\",\n };\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.addOption(\n new Option(\n \"-r, --reference <path>\",\n \"参考图片或视频路径,可重复传入,也支持用英文逗号分隔多个路径\",\n )\n .argParser(parseReferencePaths)\n .default([]),\n );\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"[content...]\", \"视频生成提示词\");\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IAiVideoOptions>,\n ): Promise<ILvErrorOr<void>> {\n const prompt = this._readPrompt(ctx);\n if (!prompt) {\n this._outputJsonError(1, \"请输入视频生成提示词\");\n return this._makeOk();\n }\n\n const uploadResult = await this._uploadReferences(ctx.options.reference);\n if (!uploadResult.ok) {\n this._outputJsonError(uploadResult.code, uploadResult.msg);\n return this._makeOk();\n }\n\n const generationResult = await this._requestVideoGeneration(\n prompt,\n uploadResult.value,\n );\n if (!generationResult.ok) {\n this._outputJsonError(generationResult.code, generationResult.msg);\n return this._makeOk();\n }\n\n this._outputJsonOk({\n prompt,\n assets: uploadResult.value,\n generation: generationResult.value,\n });\n return this._makeOk();\n }\n\n private async _uploadReferences(\n references: readonly string[],\n ): Promise<ILvErrorOr<IAiVideoAsset[]>> {\n if (references.length === 0) {\n return makeOkWith([]);\n }\n\n const uploadResults: ILvErrorOr<IAiVideoAsset>[] = await Promise.all(\n references.map(async (referencePath) => {\n const result = await uploadAsset({\n filePath: referencePath,\n region: Region.CN,\n });\n if (!result.ok) {\n return result;\n }\n\n return makeOkWith<IAiVideoAsset>({\n asset_id: result.value.assetId,\n asset_type: result.value.fileInfo.assetType,\n file_path: path.resolve(process.cwd(), referencePath),\n region: result.value.region,\n });\n }),\n );\n\n for (const result of uploadResults) {\n if (!result.ok) {\n return result;\n }\n }\n\n return makeOkWith(uploadResults.map((result) => (result as any).value));\n }\n\n private async _requestVideoGeneration(\n prompt: string,\n assets: readonly IAiVideoAsset[],\n ): Promise<ILvErrorOr<any>> {\n // TODO: 接入真实视频生成接口。当前先保留已整理好的调用入参结构。\n return submitDirectCn({\n prompt,\n imageAssetIds: assets.map((asset) => asset.asset_id),\n durationSec: 5,\n });\n }\n}\n\nfunction parseReferencePaths(value: string, previous: string[]): string[] {\n return previous.concat(\n value\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0),\n );\n}\n","const pattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nfunction isUuid(value: string): boolean {\n return pattern.test(value);\n}\n\nconst generateUuid = (() => {\n if (typeof crypto === 'object' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID.bind(crypto) as () => string;\n }\n\n let getRandomValues: (bucket: Uint8Array) => Uint8Array;\n if (typeof crypto === 'object' && typeof crypto.getRandomValues === 'function') {\n getRandomValues = crypto.getRandomValues.bind(crypto);\n } else {\n getRandomValues = function (bucket: Uint8Array): Uint8Array {\n for (let i = 0; i < bucket.length; i++) {\n bucket[i] = Math.floor(Math.random() * 256);\n }\n return bucket;\n };\n }\n\n const data = new Uint8Array(16);\n const hex: string[] = [];\n for (let i = 0; i < 256; i++) {\n hex.push(i.toString(16).padStart(2, '0'));\n }\n\n return (): string => {\n getRandomValues(data);\n data[6] = (data[6] & 15) | 64;\n data[8] = (data[8] & 63) | 128;\n let i = 0;\n let result = '';\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += '-';\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += '-';\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += '-';\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += '-';\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += hex[data[i++]];\n return result;\n };\n})();\n\nconst generateUpperCaseUuid = (): string => generateUuid().toUpperCase();\nconst uuid = generateUuid;\nconst upperCaseUuid = generateUpperCaseUuid;\n\nexport { generateUpperCaseUuid, generateUuid, isUuid, upperCaseUuid, uuid };\n","import type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport { makeError, makeOkWith } from \"../../../../bedrock/error\";\nimport { generateUuid } from \"../../../../bedrock/uuid\";\nimport { Region } from \"../../types\";\nimport { requestJson } from \"../request-json\";\nimport { readWebContext, readWebToken } from \"../web-token\";\nimport {\n missingWebContextError,\n missingWebTokenError,\n networkRequestFailedError,\n responseParseFailedError,\n} from \"../web-token/errors\";\n\nconst SUBMIT_DIRECT_URL =\n \"https://xyq.jianying.com/api/biz/v1/agent/submit_run\";\n\ninterface ISubmitDirectResponse {\n readonly ret?: string | number;\n readonly errmsg?: string;\n readonly data?: unknown;\n readonly [key: string]: unknown;\n}\n\ninterface IUserInfo {\n readonly uid: string;\n readonly workspace_id: string;\n readonly space_id: string;\n}\n\nexport interface ISubmitDirectCnOptions {\n durationSec?: number;\n imageAssetIds?: string[];\n prompt?: string;\n}\n\nexport type ISubmitDirectCnResult = unknown;\n\nfunction normalizeToken(token: string): string {\n const trimmed = token.trim();\n const prefix = \"sessionid_pippitcn_web=\";\n if (trimmed.startsWith(prefix)) {\n return trimmed.slice(prefix.length).trim();\n }\n return trimmed;\n}\n\nfunction createCookieHeader(token: string): string {\n return `sessionid_pippitcn_web=${normalizeToken(token)}`;\n}\n\nfunction parseErrorCode(ret: string | number | undefined): number {\n const parsed =\n typeof ret === \"number\"\n ? ret\n : typeof ret === \"string\"\n ? Number.parseInt(ret, 10)\n : Number.NaN;\n return Number.isFinite(parsed) ? parsed : 1;\n}\n\nfunction createUserInfo(): Promise<ILvErrorOr<IUserInfo>> {\n return readWebContext(Region.CN).then((webContextResult) => {\n if (!webContextResult.ok) {\n return webContextResult;\n }\n\n const webContext = webContextResult.value;\n if (!webContext.uid || !webContext.workspaceId || !webContext.spaceId) {\n return missingWebContextError();\n }\n\n return makeOkWith({\n uid: webContext.uid,\n workspace_id: webContext.workspaceId,\n space_id: webContext.spaceId,\n });\n });\n}\n\nexport async function submitDirectCn(\n options: ISubmitDirectCnOptions,\n): Promise<ILvErrorOr<ISubmitDirectCnResult>> {\n const userInfoResult = await createUserInfo();\n if (!userInfoResult.ok) {\n return userInfoResult;\n }\n\n const { durationSec, imageAssetIds, prompt } = options;\n\n const tokenResult = await readWebToken(Region.CN);\n if (!tokenResult.ok) {\n return tokenResult;\n }\n\n const token = tokenResult.value?.trim();\n if (!token) {\n return missingWebTokenError();\n }\n\n const threadId = generateUuid();\n const runId = generateUuid();\n\n let duration: number = 5;\n if (durationSec && durationSec <= 8 && durationSec >= 2) {\n duration = Math.round(durationSec);\n }\n\n const message = {\n message_id: \"\",\n role: \"user\",\n thread_id: threadId,\n run_id: runId,\n created_at: Date.now(),\n content: [\n {\n type: \"data\",\n sub_type: \"biz/x_data_direct_tool_call_req\",\n data: JSON.stringify({\n param: JSON.stringify({\n prompt,\n images: [\n imageAssetIds?.map((assetId) => ({\n asset_id: assetId,\n })),\n ],\n duration_sec: duration,\n language: \"zh\",\n resolution: \"720p\",\n imitation_videos: [],\n videos: [],\n audios: [],\n model: \"seedance2.0_vision\",\n }),\n tool_name: \"biz/x_tool_name_video_part\",\n }),\n hidden: false,\n is_thought: false,\n },\n ],\n };\n\n const userInfo = {\n app_id: \"795647\",\n consumer_uid: userInfoResult.value.uid,\n workspace_id: userInfoResult.value.workspace_id,\n space_id: userInfoResult.value.space_id,\n };\n\n const responseResult = await requestJson<ISubmitDirectResponse>(\n SUBMIT_DIRECT_URL,\n {\n method: \"POST\",\n headers: {\n accept: \"application/json, text/plain, */*\",\n \"content-type\": \"application/json\",\n cookie: createCookieHeader(token),\n Referer: \"https://xyq.jianying.com/\",\n },\n body: JSON.stringify({\n user_info: userInfo,\n message,\n agent_name: \"pippit_video_part_agent\",\n entrance_from: \"web\",\n run_extra: \"{}\",\n }),\n },\n {\n networkRequestFailed: (message) => networkRequestFailedError(message),\n responseParseFailed: (message) => responseParseFailedError(message),\n },\n );\n if (!responseResult.ok) {\n return responseResult;\n }\n\n const response = responseResult.value;\n console.log(\"=====response\", response);\n if (String(response.ret) !== \"0\") {\n return makeError(\n parseErrorCode(response.ret),\n response.errmsg?.trim() || \"直接提交失败。\",\n );\n }\n\n return makeOkWith(response.data);\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { Option } from \"commander\";\nimport type { Command } from \"commander\";\nimport { OPENROUTER_AK } from \"../../constants/ak\";\nimport { resolveConfigLocation } from \"../../bedrock/config/local-config\";\nimport { makeError, makeOkWith } from \"../../bedrock/error\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport { AiBaseCommand } from \"./ai-base-command\";\nimport { prepareReferenceImages } from \"./ai-image-reference\";\n\nconst VIDEO_GENERATION_URL = \"https://openrouter.ai/api/v1/videos\";\nconst VIDEO_MODEL = \"bytedance/seedance-2.0\";\nconst POLLING_LOG_FILE_NAME = \"ai-vid-polling.log\";\n\nconst POLL_INTERVAL_MS = 3_000;\nconst POLL_STATUS_LOG_INTERVAL_MS = 10_000;\nconst POLL_TIMEOUT_MS = 5 * 60 * 1000;\nconst SUBMIT_TIMEOUT_MS = 30_000;\nconst DOWNLOAD_TIMEOUT_MS = 5 * 60 * 1000;\n\ntype TResolution = \"480p\" | \"720p\";\n\ninterface IAiVidOptions {\n reference: string[];\n resolution: TResolution;\n aspectRatio?: string;\n duration?: number;\n pollingOnly: boolean;\n output?: string;\n}\n\ninterface IVideoSubmitResponse {\n readonly id: string;\n readonly polling_url: string;\n readonly status?: string;\n readonly error?: string;\n readonly [key: string]: unknown;\n}\n\ninterface IVideoPollResponse {\n readonly status?: string;\n readonly error?: string;\n readonly unsigned_urls?: readonly string[];\n readonly [key: string]: unknown;\n}\n\ninterface IOutputTarget {\n readonly directoryPath: string;\n readonly filePath: string;\n readonly autoNamed: boolean;\n}\n\nexport class AiVidCommand extends AiBaseCommand<IAiVidOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"vid\",\n description: \"通过 OpenRouter 调用 bytedance/seedance-2.0 生成视频\",\n };\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.addOption(\n new Option(\n \"-r, --reference <path>\",\n \"参考图片本地路径,可重复传入,也支持用英文逗号分隔多个路径;最终转为 base64 data URL\",\n )\n .argParser(parseReferencePaths)\n .default([]),\n );\n cmd.addOption(\n new Option(\"--resolution <resolution>\", \"视频分辨率\")\n .choices([\"480p\", \"720p\"])\n .default(\"480p\"),\n );\n cmd.addOption(\n new Option(\n \"--aspect-ratio <ratio>\",\n \"视频长宽比,例如 16:9、9:16、1:1,缺省不指定\",\n ),\n );\n cmd.addOption(\n new Option(\n \"--duration <seconds>\",\n \"视频时长(秒),缺省不指定\",\n ).argParser(parseDuration),\n );\n cmd.addOption(\n new Option(\n \"--polling-only\",\n \"仅提交并返回 polling_url,不在本地轮询结果\",\n ).default(false),\n );\n cmd.addOption(\n new Option(\n \"-o, --output <path>\",\n \"视频下载输出路径,可传文件路径或目录路径;未传时默认写入当前目录并自动命名\",\n ),\n );\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"[content...]\", \"视频生成提示词\");\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IAiVidOptions>,\n ): Promise<ILvErrorOr<void>> {\n const prompt = this._readPrompt(ctx);\n if (!prompt) {\n this._outputJsonError(1, \"请输入视频生成提示词\");\n return this._makeOk();\n }\n\n const token = resolveOpenRouterToken();\n if (!token) {\n this._outputJsonError(1, \"缺少 OPENROUTER_AK,请先配置可用的 API Key\");\n return this._makeOk();\n }\n\n const referenceResult = await prepareReferenceImages(ctx.options.reference);\n if (!referenceResult.ok) {\n this._outputJsonError(referenceResult.code, referenceResult.msg);\n return this._makeOk();\n }\n\n const requestBody: Record<string, unknown> = {\n model: VIDEO_MODEL,\n prompt,\n resolution: ctx.options.resolution,\n };\n if (ctx.options.aspectRatio) {\n requestBody.aspect_ratio = ctx.options.aspectRatio;\n }\n if (typeof ctx.options.duration === \"number\") {\n requestBody.duration = ctx.options.duration;\n }\n if (referenceResult.value.length > 0) {\n requestBody.input_references = referenceResult.value.map((item) => ({\n type: \"image_url\",\n image_url: { url: item.dataUrl },\n }));\n }\n\n const submitResult = await this._submitGeneration(requestBody, token);\n if (!submitResult.ok) {\n this._outputJsonError(submitResult.code, submitResult.msg);\n return this._makeOk();\n }\n\n const submitPayload = submitResult.value;\n const pollingUrl = submitPayload.polling_url?.trim();\n if (!pollingUrl) {\n this._outputJsonError(1, \"提交成功但返回数据缺少 polling_url\");\n return this._makeOk();\n }\n\n const logPathResult = await appendPollingUrl(pollingUrl, submitPayload.id);\n const pollingLogPath = logPathResult.ok ? logPathResult.value : undefined;\n if (!logPathResult.ok) {\n this._debug(`记录 polling_url 失败: ${logPathResult.msg}`);\n }\n\n if (ctx.options.pollingOnly) {\n this._outputJsonOk({\n polling_url: pollingUrl,\n generation_id: submitPayload.id,\n polling_log_path: pollingLogPath,\n });\n return this._makeOk();\n }\n\n const pollResult = await this._pollUntilComplete(pollingUrl, token);\n if (!pollResult.ok) {\n this._outputJsonError(pollResult.code, pollResult.msg);\n return this._makeOk();\n }\n\n const videoUrl = pollResult.value.unsigned_urls?.[0];\n if (!videoUrl) {\n this._outputJsonError(1, \"视频生成完成,但未拿到 unsigned_urls[0]\");\n return this._makeOk();\n }\n\n const outputTargetResult = await resolveOutputTarget(ctx.options.output);\n if (!outputTargetResult.ok) {\n this._outputJsonError(outputTargetResult.code, outputTargetResult.msg);\n return this._makeOk();\n }\n\n const downloadResult = await downloadVideoToFile(\n videoUrl,\n outputTargetResult.value,\n token,\n );\n if (!downloadResult.ok) {\n this._outputJsonError(downloadResult.code, downloadResult.msg);\n return this._makeOk();\n }\n\n this._outputJsonOk({\n video_path: downloadResult.value,\n video_url: videoUrl,\n polling_url: pollingUrl,\n generation_id: submitPayload.id,\n polling_log_path: pollingLogPath,\n });\n return this._makeOk();\n }\n\n private async _submitGeneration(\n requestBody: Record<string, unknown>,\n token: string,\n ): Promise<ILvErrorOr<IVideoSubmitResponse>> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), SUBMIT_TIMEOUT_MS);\n\n let response: Response;\n try {\n response = await fetch(VIDEO_GENERATION_URL, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(requestBody),\n signal: controller.signal,\n });\n } catch (error) {\n const message =\n error instanceof Error && error.name === \"AbortError\"\n ? \"请求超时\"\n : error instanceof Error\n ? error.message\n : String(error);\n return makeError(1, `提交视频生成请求失败: ${message}`);\n } finally {\n clearTimeout(timer);\n }\n\n const bodyText = await response.text().catch(() => \"\");\n const payload = parseJsonSafely<IVideoSubmitResponse>(bodyText);\n\n if (!response.ok) {\n const detail = extractErrorText(payload) ?? bodyText.trim();\n const suffix = detail ? `: ${detail}` : \"\";\n return makeError(\n response.status,\n `视频生成请求失败: HTTP ${response.status}${suffix}`,\n );\n }\n\n if (!payload) {\n return makeError(1, \"视频生成接口返回非 JSON 响应\");\n }\n\n if (payload.error) {\n return makeError(1, `视频生成请求被拒绝: ${payload.error}`);\n }\n\n if (!payload.id || !payload.polling_url) {\n return makeError(\n 1,\n `视频生成接口返回数据异常: ${bodyText.slice(0, 500)}`,\n );\n }\n\n return makeOkWith(payload);\n }\n\n private async _pollUntilComplete(\n pollingUrl: string,\n token: string,\n ): Promise<ILvErrorOr<IVideoPollResponse>> {\n const startedAt = Date.now();\n let lastStatusLogAt = 0;\n\n while (true) {\n const elapsed = Date.now() - startedAt;\n if (elapsed >= POLL_TIMEOUT_MS) {\n return makeError(\n 1,\n `轮询超时,超过 ${Math.round(POLL_TIMEOUT_MS / 1000)}s 仍未完成,可使用 --polling-only 拿到 polling_url 后稍后重试`,\n );\n }\n\n let response: Response;\n try {\n response = await fetch(pollingUrl, {\n headers: { Authorization: `Bearer ${token}` },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this._debug(`轮询请求失败,将重试: ${message}`);\n await delay(POLL_INTERVAL_MS);\n continue;\n }\n\n const bodyText = await response.text().catch(() => \"\");\n const payload = parseJsonSafely<IVideoPollResponse>(bodyText);\n\n if (!response.ok) {\n const detail = extractErrorText(payload) ?? bodyText.trim();\n return makeError(\n response.status,\n `轮询请求失败: HTTP ${response.status}${detail ? `: ${detail}` : \"\"}`,\n );\n }\n\n if (!payload) {\n this._debug(\"轮询返回非 JSON 数据,将重试\");\n await delay(POLL_INTERVAL_MS);\n continue;\n }\n\n const status = payload.status;\n\n if (status === \"completed\") {\n return makeOkWith(payload);\n }\n\n if (\n status === \"failed\" ||\n status === \"cancelled\" ||\n status === \"expired\"\n ) {\n const errorText =\n payload.error?.trim() || `视频生成结束于状态 ${status}`;\n return makeError(1, errorText);\n }\n\n const now = Date.now();\n if (now - lastStatusLogAt >= POLL_STATUS_LOG_INTERVAL_MS) {\n this._debug(\n `视频生成状态: ${status ?? \"unknown\"} (已等待 ${Math.round(elapsed / 1000)}s)`,\n );\n lastStatusLogAt = now;\n }\n\n await delay(POLL_INTERVAL_MS);\n }\n }\n}\n\nfunction resolveOpenRouterToken(): string {\n return process.env.OPENROUTER_AK?.trim() || OPENROUTER_AK;\n}\n\nfunction parseReferencePaths(value: string, previous: string[]): string[] {\n return previous.concat(\n value\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0),\n );\n}\n\nfunction parseDuration(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`duration 需要是正整数,收到: ${value}`);\n }\n return parsed;\n}\n\nfunction parseJsonSafely<T>(text: string): T | undefined {\n if (!text.trim()) {\n return undefined;\n }\n try {\n return JSON.parse(text) as T;\n } catch {\n return undefined;\n }\n}\n\nfunction extractErrorText(payload: unknown): string | undefined {\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n const record = payload as Record<string, unknown>;\n if (typeof record.error === \"string\" && record.error.trim().length > 0) {\n return record.error.trim();\n }\n if (record.error && typeof record.error === \"object\") {\n const inner = record.error as { message?: unknown };\n if (typeof inner.message === \"string\" && inner.message.trim().length > 0) {\n return inner.message.trim();\n }\n }\n if (typeof record.message === \"string\" && record.message.trim().length > 0) {\n return record.message.trim();\n }\n return undefined;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function appendPollingUrl(\n pollingUrl: string,\n generationId: string,\n): Promise<ILvErrorOr<string>> {\n const locationResult = await resolveConfigLocation();\n if (!locationResult.ok) {\n return locationResult;\n }\n\n const logFilePath = path.join(\n locationResult.value.configDir,\n POLLING_LOG_FILE_NAME,\n );\n\n try {\n await fs.mkdir(locationResult.value.configDir, { recursive: true });\n const line = `${new Date().toISOString()}\\t${generationId}\\t${pollingUrl}\\n`;\n await fs.appendFile(logFilePath, line, \"utf8\");\n return makeOkWith(logFilePath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(1, `写入 polling 日志失败 ${logFilePath}: ${message}`);\n }\n}\n\nasync function resolveOutputTarget(\n outputPath: string | undefined,\n): Promise<ILvErrorOr<IOutputTarget>> {\n if (!outputPath) {\n const directoryPath = process.cwd();\n return makeOkWith({\n directoryPath,\n filePath: path.join(directoryPath, buildAutoFileName()),\n autoNamed: true,\n });\n }\n\n const resolvedPath = path.resolve(process.cwd(), outputPath);\n\n try {\n const stats = await fs.stat(resolvedPath);\n if (stats.isDirectory()) {\n return makeOkWith({\n directoryPath: resolvedPath,\n filePath: path.join(resolvedPath, buildAutoFileName()),\n autoNamed: true,\n });\n }\n return makeOkWith({\n directoryPath: path.dirname(resolvedPath),\n filePath: resolvedPath,\n autoNamed: false,\n });\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code !== \"ENOENT\") {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(1, `读取输出路径失败: ${resolvedPath}: ${message}`);\n }\n\n if (path.extname(resolvedPath)) {\n return makeOkWith({\n directoryPath: path.dirname(resolvedPath),\n filePath: resolvedPath,\n autoNamed: false,\n });\n }\n\n return makeOkWith({\n directoryPath: resolvedPath,\n filePath: path.join(resolvedPath, buildAutoFileName()),\n autoNamed: true,\n });\n }\n}\n\nasync function downloadVideoToFile(\n remoteUrl: string,\n target: IOutputTarget,\n token: string,\n): Promise<ILvErrorOr<string>> {\n try {\n await fs.mkdir(target.directoryPath, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(\n 1,\n `创建输出目录失败: ${target.directoryPath}: ${message}`,\n );\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), DOWNLOAD_TIMEOUT_MS);\n\n let response: Response;\n try {\n response = await fetch(remoteUrl, {\n headers: { Authorization: `Bearer ${token}` },\n signal: controller.signal,\n });\n } catch (error) {\n const message =\n error instanceof Error && error.name === \"AbortError\"\n ? \"下载超时\"\n : error instanceof Error\n ? error.message\n : String(error);\n return makeError(1, `下载视频失败: ${message}`);\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n const detail = await response.text().catch(() => \"\");\n const suffix = detail.trim() ? `: ${detail.trim().slice(0, 500)}` : \"\";\n return makeError(\n response.status,\n `下载视频失败: HTTP ${response.status}${suffix}`,\n );\n }\n\n const bytes = Buffer.from(await response.arrayBuffer());\n const targetPath = target.autoNamed\n ? replaceFileExtension(\n target.filePath,\n inferVideoExtension(remoteUrl, response),\n )\n : target.filePath;\n\n try {\n await fs.writeFile(targetPath, bytes);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(1, `写入视频失败: ${targetPath}: ${message}`);\n }\n\n return makeOkWith(path.resolve(targetPath));\n}\n\nfunction buildAutoFileName(): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n return `ai-vid-${timestamp}.mp4`;\n}\n\nfunction replaceFileExtension(filePath: string, extension: string): string {\n const ext = path.extname(filePath);\n if (!ext) {\n return `${filePath}.${extension}`;\n }\n return `${filePath.slice(0, -ext.length)}.${extension}`;\n}\n\nfunction inferVideoExtension(remoteUrl: string, response: Response): string {\n const contentType = response.headers.get(\"content-type\")?.toLowerCase() ?? \"\";\n if (contentType.includes(\"mp4\")) {\n return \"mp4\";\n }\n if (contentType.includes(\"webm\")) {\n return \"webm\";\n }\n if (contentType.includes(\"quicktime\") || contentType.includes(\"mov\")) {\n return \"mov\";\n }\n\n try {\n const url = new URL(remoteUrl);\n const ext = path.extname(url.pathname).toLowerCase();\n if (ext === \".mp4\" || ext === \".webm\" || ext === \".mov\") {\n return ext.slice(1);\n }\n } catch {\n // ignore parse failure\n }\n\n return \"mp4\";\n}\n","import * as fs from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { makeError, makeOkWith } from \"../../bedrock/error\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\n\nconst execFileAsync = promisify(execFile);\n\nexport const MAX_REFERENCE_IMAGE_BYTES = 2 * 1024 * 1024;\nexport const MAX_REFERENCE_IMAGE_COUNT = 14;\n\nconst API_SUPPORTED_MIME_TYPES = new Set([\n \"image/jpeg\",\n \"image/png\",\n \"image/webp\",\n \"image/bmp\",\n \"image/tiff\",\n \"image/gif\",\n]);\n\ninterface IDetectedMimeType {\n readonly mimeType: string;\n readonly extension: string;\n}\n\nexport interface IPreparedReferenceImage {\n readonly inputPath: string;\n readonly resolvedPath: string;\n readonly sourceMimeType: string;\n readonly requestMimeType: string;\n readonly originalBytes: number;\n readonly finalBytes: number;\n readonly compressed: boolean;\n readonly dataUrl: string;\n}\n\nexport async function prepareReferenceImages(\n filePaths: readonly string[],\n): Promise<ILvErrorOr<IPreparedReferenceImage[]>> {\n if (filePaths.length > MAX_REFERENCE_IMAGE_COUNT) {\n return makeError(\n 1,\n `参考图最多支持 ${MAX_REFERENCE_IMAGE_COUNT} 张,当前传入 ${filePaths.length} 张。`,\n );\n }\n\n const preparedImages: IPreparedReferenceImage[] = [];\n\n for (const filePath of filePaths) {\n const prepared = await prepareReferenceImage(filePath);\n if (!prepared.ok) {\n return prepared;\n }\n preparedImages.push(prepared.value);\n }\n\n return makeOkWith(preparedImages);\n}\n\nasync function prepareReferenceImage(\n filePath: string,\n): Promise<ILvErrorOr<IPreparedReferenceImage>> {\n const resolvedPath = path.resolve(process.cwd(), filePath);\n\n let stats;\n try {\n stats = await fs.stat(resolvedPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(1, `读取参考图失败: ${resolvedPath}: ${message}`);\n }\n\n if (!stats.isFile()) {\n return makeError(1, `参考图不是文件: ${resolvedPath}`);\n }\n\n let fileBytes: Buffer;\n try {\n fileBytes = await fs.readFile(resolvedPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(1, `读取参考图内容失败: ${resolvedPath}: ${message}`);\n }\n\n const detectedType = detectMimeType(fileBytes, resolvedPath);\n if (!detectedType) {\n return makeError(1, `参考图不是支持的图片格式: ${resolvedPath}`);\n }\n\n const needsTranscode =\n !API_SUPPORTED_MIME_TYPES.has(detectedType.mimeType) ||\n fileBytes.byteLength > MAX_REFERENCE_IMAGE_BYTES;\n\n if (!needsTranscode) {\n return makeOkWith({\n inputPath: filePath,\n resolvedPath,\n sourceMimeType: detectedType.mimeType,\n requestMimeType: detectedType.mimeType,\n originalBytes: fileBytes.byteLength,\n finalBytes: fileBytes.byteLength,\n compressed: false,\n dataUrl: toDataUrl(detectedType.mimeType, fileBytes),\n });\n }\n\n const compressed = await compressImageForReference(resolvedPath);\n if (!compressed.ok) {\n return compressed;\n }\n\n return makeOkWith({\n inputPath: filePath,\n resolvedPath,\n sourceMimeType: detectedType.mimeType,\n requestMimeType: compressed.value.mimeType,\n originalBytes: fileBytes.byteLength,\n finalBytes: compressed.value.bytes.byteLength,\n compressed: true,\n dataUrl: toDataUrl(compressed.value.mimeType, compressed.value.bytes),\n });\n}\n\nfunction detectMimeType(\n fileBytes: Buffer,\n filePath: string,\n): IDetectedMimeType | undefined {\n if (\n fileBytes.length >= 3 &&\n fileBytes[0] === 0xff &&\n fileBytes[1] === 0xd8 &&\n fileBytes[2] === 0xff\n ) {\n return { mimeType: \"image/jpeg\", extension: \"jpeg\" };\n }\n\n if (\n fileBytes.length >= 8 &&\n fileBytes[0] === 0x89 &&\n fileBytes[1] === 0x50 &&\n fileBytes[2] === 0x4e &&\n fileBytes[3] === 0x47 &&\n fileBytes[4] === 0x0d &&\n fileBytes[5] === 0x0a &&\n fileBytes[6] === 0x1a &&\n fileBytes[7] === 0x0a\n ) {\n return { mimeType: \"image/png\", extension: \"png\" };\n }\n\n if (fileBytes.length >= 6) {\n const gifHeader = fileBytes.subarray(0, 6).toString(\"ascii\");\n if (gifHeader === \"GIF87a\" || gifHeader === \"GIF89a\") {\n return { mimeType: \"image/gif\", extension: \"gif\" };\n }\n }\n\n if (\n fileBytes.length >= 12 &&\n fileBytes.subarray(0, 4).toString(\"ascii\") === \"RIFF\" &&\n fileBytes.subarray(8, 12).toString(\"ascii\") === \"WEBP\"\n ) {\n return { mimeType: \"image/webp\", extension: \"webp\" };\n }\n\n if (fileBytes.length >= 2 && fileBytes.subarray(0, 2).toString(\"ascii\") === \"BM\") {\n return { mimeType: \"image/bmp\", extension: \"bmp\" };\n }\n\n if (\n fileBytes.length >= 4 &&\n ((fileBytes[0] === 0x49 &&\n fileBytes[1] === 0x49 &&\n fileBytes[2] === 0x2a &&\n fileBytes[3] === 0x00) ||\n (fileBytes[0] === 0x4d &&\n fileBytes[1] === 0x4d &&\n fileBytes[2] === 0x00 &&\n fileBytes[3] === 0x2a))\n ) {\n return { mimeType: \"image/tiff\", extension: \"tiff\" };\n }\n\n if (fileBytes.length >= 12 && fileBytes.subarray(4, 8).toString(\"ascii\") === \"ftyp\") {\n const brand = fileBytes.subarray(8, 12).toString(\"ascii\").trim();\n if (brand.startsWith(\"avif\") || brand === \"avis\") {\n return { mimeType: \"image/avif\", extension: \"avif\" };\n }\n if (\n brand.startsWith(\"hei\") ||\n brand.startsWith(\"hev\") ||\n brand === \"mif1\" ||\n brand === \"msf1\"\n ) {\n return { mimeType: \"image/heic\", extension: \"heic\" };\n }\n }\n\n const ext = path.extname(filePath).toLowerCase();\n switch (ext) {\n case \".jpg\":\n case \".jpeg\":\n return { mimeType: \"image/jpeg\", extension: \"jpeg\" };\n case \".png\":\n return { mimeType: \"image/png\", extension: \"png\" };\n case \".gif\":\n return { mimeType: \"image/gif\", extension: \"gif\" };\n case \".webp\":\n return { mimeType: \"image/webp\", extension: \"webp\" };\n case \".bmp\":\n return { mimeType: \"image/bmp\", extension: \"bmp\" };\n case \".tif\":\n case \".tiff\":\n return { mimeType: \"image/tiff\", extension: \"tiff\" };\n case \".heic\":\n case \".heif\":\n return { mimeType: \"image/heic\", extension: \"heic\" };\n case \".avif\":\n return { mimeType: \"image/avif\", extension: \"avif\" };\n default:\n return undefined;\n }\n}\n\nasync function compressImageForReference(\n sourcePath: string,\n): Promise<ILvErrorOr<{ mimeType: string; bytes: Buffer }>> {\n if (process.platform !== \"darwin\") {\n return makeError(\n 1,\n `参考图需要压缩或转码,但当前平台 ${process.platform} 未实现自动处理。`,\n );\n }\n\n const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), \"tt-ai-image-\"));\n try {\n const dimensions = await readImageDimensions(sourcePath);\n const maxDimension = Math.max(dimensions.width, dimensions.height);\n const resizeLimits = uniqueNumbers([\n maxDimension,\n Math.floor(maxDimension * 0.85),\n Math.floor(maxDimension * 0.7),\n Math.floor(maxDimension * 0.55),\n Math.floor(maxDimension * 0.4),\n ]).filter((value) => value >= 64);\n const qualityLevels = [85, 75, 65, 55, 45, 35];\n\n let attemptIndex = 0;\n for (const resizeLimit of resizeLimits) {\n for (const quality of qualityLevels) {\n const targetPath = path.join(tempDir, `compressed-${attemptIndex}.jpeg`);\n attemptIndex += 1;\n\n await runSips([\n \"--setProperty\",\n \"format\",\n \"jpeg\",\n \"--setProperty\",\n \"formatOptions\",\n String(quality),\n sourcePath,\n \"--out\",\n targetPath,\n ]);\n\n if (resizeLimit < maxDimension) {\n await runSips([\"-Z\", String(resizeLimit), targetPath]);\n }\n\n const compressedBytes = await fs.readFile(targetPath);\n if (compressedBytes.byteLength <= MAX_REFERENCE_IMAGE_BYTES) {\n return makeOkWith({\n mimeType: \"image/jpeg\",\n bytes: compressedBytes,\n });\n }\n }\n }\n\n return makeError(1, `参考图压缩失败,无法压缩到 2MB 以内: ${sourcePath}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(1, `处理参考图失败: ${sourcePath}: ${message}`);\n } finally {\n await fs.rm(tempDir, { recursive: true, force: true });\n }\n}\n\nasync function readImageDimensions(\n sourcePath: string,\n): Promise<{ width: number; height: number }> {\n const { stdout } = await runSips([\n \"-g\",\n \"pixelWidth\",\n \"-g\",\n \"pixelHeight\",\n sourcePath,\n ]);\n\n const width = readSipsMetric(stdout, \"pixelWidth\");\n const height = readSipsMetric(stdout, \"pixelHeight\");\n if (!width || !height) {\n throw new Error(\"无法读取图片尺寸\");\n }\n\n return { width, height };\n}\n\nasync function runSips(args: readonly string[]) {\n return execFileAsync(\"/usr/bin/sips\", [...args]);\n}\n\nfunction readSipsMetric(output: string, key: string): number | undefined {\n const matcher = new RegExp(`${key}:\\\\s*(\\\\d+)`);\n const matched = output.match(matcher);\n if (!matched) {\n return undefined;\n }\n\n const value = Number.parseInt(matched[1], 10);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction uniqueNumbers(values: readonly number[]): number[] {\n return [...new Set(values)];\n}\n\nfunction toDataUrl(mimeType: string, fileBytes: Buffer): string {\n const suffix = mimeType.replace(\"image/\", \"\");\n return `data:image/${suffix};base64,${fileBytes.toString(\"base64\")}`;\n}\n","import { spawn } from \"node:child_process\";\nimport type { Command } from \"commander\";\nimport { makeError, makeOkWith } from \"../../bedrock/error\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport { AiBaseCommand } from \"./ai-base-command\";\n\nconst BIN = \"xx\";\nconst PPE_ENV = \"ppe_new_login_cli\";\nconst POLL_INTERVAL_MS = 5_000;\nconst POLL_TIMEOUT_MS = 10 * 60 * 1000;\nconst RUNNING_STATUS = \"running\";\n\ninterface ICommandOutput {\n readonly stdout: string;\n readonly stderr: string;\n}\n\nexport class AiQueryTaskCommand extends AiBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"querytask\",\n description:\n \"轮询 xx query-video-direct 任务结果,running 时自动重试直至完成或超时\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"<task_id>\", \"要查询的任务 ID\");\n }\n\n protected async _execute(\n ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n const taskId = String(ctx.args[0] ?? \"\").trim();\n if (!taskId) {\n return this._makeError(1, \"请传入 task_id\");\n }\n\n const startedAt = Date.now();\n\n while (true) {\n const queryResult = await this._runQuery(taskId);\n if (!queryResult.ok) {\n return this._makeError(queryResult.code, queryResult.msg);\n }\n\n const { stdout, stderr } = queryResult.value;\n const status = extractStatus(stdout);\n\n if (status !== RUNNING_STATUS) {\n if (stderr.trim().length > 0) {\n process.stderr.write(stderr);\n }\n process.stdout.write(stdout.endsWith(\"\\n\") ? stdout : `${stdout}\\n`);\n return this._makeOk();\n }\n\n const elapsed = Date.now() - startedAt;\n if (elapsed + POLL_INTERVAL_MS >= POLL_TIMEOUT_MS) {\n return this._makeError(\n 1,\n `轮询超时 ${Math.round(POLL_TIMEOUT_MS / 1000)}s,任务 ${taskId} 仍为 ${RUNNING_STATUS} 状态`,\n );\n }\n\n await delay(POLL_INTERVAL_MS);\n }\n }\n\n private _runQuery(taskId: string): Promise<ILvErrorOr<ICommandOutput>> {\n const args = [\n \"query-video-direct\",\n \"--task-id\",\n taskId,\n \"--ppe-env\",\n PPE_ENV,\n \"--json\",\n ];\n\n return new Promise((resolve) => {\n const child = spawn(BIN, args, { cwd: process.cwd() });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n\n child.on(\"error\", (error) => {\n resolve(\n makeError(\n 1,\n `执行 ${BIN} ${args.join(\" \")} 失败: ${error.message}`,\n ),\n );\n });\n\n child.on(\"close\", (code, signal) => {\n if (code === 0) {\n resolve(makeOkWith({ stdout, stderr }));\n return;\n }\n\n const signalText = signal ? `, signal: ${signal}` : \"\";\n const stderrText = stderr.trim() ? `\\n${stderr.trim()}` : \"\";\n resolve(\n makeError(\n code ?? 1,\n `执行 ${BIN} ${args.join(\" \")} 失败${signalText}${stderrText}`,\n ),\n );\n });\n });\n }\n}\n\nfunction extractStatus(stdout: string): string | undefined {\n const trimmed = stdout.trim();\n if (!trimmed) {\n return undefined;\n }\n\n const parsed = tryParseJson(trimmed);\n if (!parsed || typeof parsed !== \"object\") {\n return undefined;\n }\n\n const record = parsed as Record<string, unknown>;\n if (typeof record.status === \"string\" && record.status.trim()) {\n return record.status.trim();\n }\n\n const data = record.data;\n if (data && typeof data === \"object\") {\n const dataRecord = data as Record<string, unknown>;\n if (typeof dataRecord.status === \"string\" && dataRecord.status.trim()) {\n return dataRecord.status.trim();\n }\n }\n\n return undefined;\n}\n\nfunction tryParseJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { ICommandMeta } from \"../../core/command-types\";\nimport { BaseSubcommandHost } from \"../../core/base-subcommand-host\";\nimport { AiWebSearchCommand } from \"./ai-websearch-command\";\nimport { AiCursorCommand } from \"./ai-cursor-command\";\nimport { AiCodexCommand } from \"./ai-codex-command\";\nimport { AiRunCommand } from \"./ai-run-command\";\nimport { AiImageCommandV2 } from \"./ai-image-command-v2\";\nimport { AiVideoCommand } from \"./ai-video-command\";\nimport { AiVidCommand } from \"./ai-vid-command\";\nimport { AiQueryTaskCommand } from \"./ai-querytask-command\";\n\nexport class AiCommand extends BaseSubcommandHost {\n protected _meta(): ICommandMeta {\n return {\n name: \"ai\",\n description: \"AI 辅助命令\",\n };\n }\n\n protected _registerSubcommands(): void {\n this._addSubcommand(new AiWebSearchCommand());\n this._addSubcommand(new AiCursorCommand());\n this._addSubcommand(new AiCodexCommand());\n this._addSubcommand(new AiRunCommand());\n this._addSubcommand(new AiImageCommandV2());\n this._addSubcommand(new AiVideoCommand());\n this._addSubcommand(new AiVidCommand());\n this._addSubcommand(new AiQueryTaskCommand());\n }\n}\n"],"mappings":"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","names":["responseParseFailed","GetThreadError","Option","fs","path","Option","Option","BASE","FornaxSearchError","networkRequestFailedError","requestJson","networkRequestFailedError","requestJson","CONFIG","getSearchUrl","getSearchReferer","getTimeWindow","getDetailUrl","requestJson","result","Option","fs","path","Option","Option","path","Option","fs","path","BASE","WebTokenError","networkRequestFailedError","responseParseFailedError","normalizeToken","requestJson","networkRequestFailedError","responseParseFailedError","BASE","AssetUploadError","networkRequestFailedError","responseParseFailedError","networkRequestFailedError","responseParseFailedError","Option","Option","Option","Option","BASE","AssetGetError","missingWebContextError","networkRequestFailedError","responseParseFailedError","i18nNotSupportedError","normalizeToken","createCookieHeader","missingWebContextError","networkRequestFailedError","responseParseFailedError","i18nNotSupportedError","Option","homedir","join","resolve","join","homedir","homedir","join","join","homedir","homedir","join","join","homedir","spawn","spawn","resolve","homedir","join","existsSync","homedir","join","join","homedir","existsSync","join","homedir","spawn","fs","homedir","path","homedir","spawn","resolve","path","Option","normalizeToken","createCookieHeader","parseErrorCode","message","networkRequestFailedError","responseParseFailedError","Option","fs","path","Option","fs","os","path","Option","parseReferencePaths","resolve","spawn","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","delay","resolve","spawn","require"]}
1
+ {"version":3,"sources":["../src/main.ts","../src/commands/hello/hello-greet-command.ts","../src/commands/hello/hello-info-command.ts","../src/commands/hello/hello-command.ts","../src/commands/pippit/pippit-get-thread-command.ts","../src/commands/pippit/modules/request-json.ts","../src/commands/pippit/modules/get-thread/errors.ts","../src/commands/pippit/modules/get-thread/fetch-thread.ts","../src/commands/pippit/modules/get-thread/trim-thread.ts","../src/commands/pippit/modules/get-thread/get-thread.ts","../src/commands/pippit/pippit-fornax-token-command.ts","../src/bedrock/config/local-config.ts","../src/bedrock/pkg/find-closest-package-json.ts","../src/commands/pippit/modules/fornax-token/fornax-token.ts","../src/commands/pippit/pippit-search-fornax-log-command.ts","../src/commands/pippit/modules/search-log/errors.ts","../src/commands/pippit/modules/search-log/common.ts","../src/commands/pippit/modules/search-log/cn-search-log.ts","../src/commands/pippit/modules/search-log/i18n-search-log.ts","../src/commands/pippit/modules/search-log/search-log.ts","../src/commands/pippit/pippit-save-thread-fornax-command.ts","../src/commands/pippit/pippit-asset-upload-command.ts","../src/commands/pippit/modules/asset-upload/cn-asset-upload.ts","../src/commands/pippit/modules/web-token/web-token.ts","../src/commands/pippit/modules/web-token/errors.ts","../src/commands/pippit/modules/web-token/web-context.ts","../src/commands/pippit/modules/asset-upload/errors.ts","../src/commands/pippit/modules/asset-upload/i18n-asset-upload.ts","../src/commands/pippit/modules/asset-upload/upload-asset.ts","../src/commands/pippit/pippit-web-token-command.ts","../src/commands/pippit/pippit-asset-get-command.ts","../src/commands/pippit/modules/asset-get/errors.ts","../src/commands/pippit/modules/asset-get/cn-asset-get.ts","../src/commands/pippit/modules/asset-get/i18n-asset-get.ts","../src/commands/pippit/modules/asset-get/get-asset.ts","../src/commands/pippit/pippit-command.ts","../src/commands/git/git-base-command.ts","../src/commands/git/git-checkout-command.ts","../src/commands/git/git-mm-command.ts","../src/commands/git/git-mr-command.ts","../src/commands/git/git-pp-command.ts","../src/commands/git/git-command.ts","../src/commands/shortcut/shortcut-emo-lynx-command.ts","../src/commands/shortcut/shortcut-base-command.ts","../src/commands/shortcut/shortcut-emo-pippit-cn-command.ts","../src/commands/shortcut/shortcut-emo-pippit-command.ts","../src/commands/shortcut/shortcut-command.ts","../src/commands/ai/ai-base-command.ts","../src/constants/ak.ts","../src/commands/ai/ai-websearch-command.ts","../src/commands/ai/ai-cursor-command.ts","../src/commands/ai/ai-codex-command.ts","../src/commands/ai/ai-run-command.ts","../src/commands/ai/ai-context-path.ts","../src/commands/ai/ai-image-command-v2.ts","../src/commands/ai/ai-video-command.ts","../src/bedrock/uuid/uuid.ts","../src/commands/pippit/modules/submit-direct/submit-direct-cn.ts","../src/commands/ai/ai-vid-command.ts","../src/commands/ai/ai-image-reference.ts","../src/commands/ai/ai-querytask-command.ts","../src/commands/ai/ai-command.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { createRequire } from \"node:module\";\nimport { CliApp } from \"./core\";\nimport {\n HelloCommand,\n PippitCommand,\n GitCommand,\n ShortcutCommand,\n AiCommand,\n} from \"./commands\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\");\n\n/**\n * 注:\n * option 里,boolean 的同时支持长、短选项,短的还可以合并,比如 -fr\n * option 里,字符串的,也同时支持长短,唯独短选项不支持=,只支持空格\n * 子命令,通常最多 3 层,比如 npm config set\n */\n\nasync function bootstrap(): Promise<void> {\n const binName = Object.keys(pkg.bin)[0];\n\n const app = new CliApp({\n name: binName,\n version: pkg.version,\n description: pkg.description,\n });\n\n app.registerCommand(new HelloCommand(), { hidden: true });\n app.registerCommand(new PippitCommand());\n app.registerCommand(new GitCommand(), { hidden: true });\n app.registerCommand(new ShortcutCommand(), { hidden: true });\n app.registerCommand(new AiCommand(), { hidden: true });\n\n const result = await app.run();\n\n if (!result.ok) {\n process.stderr.write(`Fatal: ${result.msg}\\n`);\n process.exitCode = 1;\n }\n\n app.dispose();\n}\n\nbootstrap();\n","import type { Command } from 'commander';\nimport { BaseCommand } from '../../core/base-command';\nimport type { ICommandActionContext } from '../../core/base-command';\nimport type { ICommandMeta } from '../../core/command-types';\nimport type { ILvErrorOr } from '../../bedrock/error';\n\ninterface IHelloGreetOptions {\n uppercase: boolean;\n}\n\nexport class HelloGreetCommand extends BaseCommand<IHelloGreetOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: 'greet',\n description: '向指定用户打招呼',\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument('[name]', '要打招呼的用户名', 'World');\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.option('-u, --uppercase', '将输出转为大写', false);\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IHelloGreetOptions>,\n ): Promise<ILvErrorOr<void>> {\n const name = ctx.args[0] as string;\n const { uppercase } = ctx.options;\n\n let message = `Hello, ${name}!`;\n if (uppercase) {\n message = message.toUpperCase();\n }\n\n this._outputJsonOk({ message });\n return this._makeOk();\n }\n}\n","import { BaseCommand } from '../../core/base-command';\nimport type { ICommandActionContext } from '../../core/base-command';\nimport type { ICommandMeta } from '../../core/command-types';\nimport type { ILvErrorOr } from '../../bedrock/error';\n\nexport class HelloInfoCommand extends BaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: 'info',\n description: '显示 hello 命令的相关信息',\n };\n }\n\n protected async _execute(\n _ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n this._outputJsonOk({\n version: '1.0.0',\n description: 'Hello 命令组 - 用于打招呼的示例命令',\n });\n return this._makeOk();\n }\n}\n","import type { ICommandMeta } from '../../core/command-types';\nimport { BaseSubcommandHost } from '../../core/base-subcommand-host';\nimport { HelloGreetCommand } from './hello-greet-command';\nimport { HelloInfoCommand } from './hello-info-command';\n\nexport class HelloCommand extends BaseSubcommandHost {\n protected _meta(): ICommandMeta {\n return {\n name: 'hello',\n description: '向指定用户打招呼 (示例命令组)',\n aliases: ['hi'],\n };\n }\n\n protected _registerSubcommands(): void {\n this._addSubcommand(new HelloGreetCommand());\n this._addSubcommand(new HelloInfoCommand());\n }\n}\n","import { BaseCommand } from \"../../core/base-command\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { Option, type Command } from \"commander\";\nimport type { Region } from \"./types\";\nimport { getThread } from \"./modules/get-thread\";\n\nexport class PippitGetThreadCommand extends BaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"thread\",\n description: \"获取指定 thread 的详细信息\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"<thread_id>\", \"要获取的 thread id\");\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.addOption(\n new Option(\n \"-r, --region <region>\",\n \"指定区域,缺省时,会多 region 自动尝试,略微会有额外的耗时\",\n ).choices([\"cn\", \"i18n\"]),\n );\n }\n\n protected async _execute(\n _ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n const threadId = _ctx.args[0] as string;\n const region = _ctx.options.region as Region | undefined;\n\n const result = await getThread({ threadId, region });\n\n if (!result.ok) {\n this._outputJsonError(result.code, result.msg);\n return this._makeOk();\n }\n\n this._outputJsonOk(result.value);\n return this._makeOk();\n }\n}\n","import { makeOkWith, type ILvErrorOr } from \"../../../bedrock/error\";\n\ninterface IRequestJsonHandlers {\n readonly networkRequestFailed: (message: string) => ILvErrorOr<never>;\n readonly responseParseFailed: (message: string) => ILvErrorOr<never>;\n readonly unauthorizedError?: () => ILvErrorOr<never>;\n readonly httpError?: (\n message: string,\n response: Response,\n ) => ILvErrorOr<never>;\n}\n\nasync function readJsonBody<T>(\n response: Response,\n url: string,\n responseParseFailed: (message: string) => ILvErrorOr<never>,\n): Promise<ILvErrorOr<T>> {\n const bodyText = await response.text();\n try {\n return makeOkWith(JSON.parse(bodyText) as T);\n } catch (error) {\n const cause = error instanceof Error ? ` (${error.message})` : \"\";\n return responseParseFailed(`接口返回非 JSON 响应: ${url}${cause}`);\n }\n}\n\nexport async function requestJson<T>(\n url: string,\n init: RequestInit,\n handlers: IRequestJsonHandlers,\n): Promise<ILvErrorOr<T>> {\n let response: Response;\n try {\n response = await fetch(url, init);\n } catch (error) {\n const cause = error instanceof Error ? ` (${error.message})` : \"\";\n return handlers.networkRequestFailed(`请求接口失败: ${url}${cause}`);\n }\n\n if (\n handlers.unauthorizedError &&\n (response.status === 401 || response.status === 403)\n ) {\n return handlers.unauthorizedError();\n }\n\n if (handlers.httpError && !response.ok) {\n return handlers.httpError(\n `接口返回 HTTP ${response.status} ${response.statusText}: ${url}`,\n response,\n );\n }\n\n return readJsonBody<T>(response, url, handlers.responseParseFailed);\n}\n","import { lvErrorConst } from \"../../../../bedrock/error\";\n\nconst BASE = 10000;\n\nexport enum GetThreadError {\n MissingThreadId = BASE + 1,\n NetworkRequestFailed = BASE + 2,\n ResponseParseFailed = BASE + 3,\n ThreadNotFound = BASE + 4,\n}\n\nexport const missingThreadIdError = lvErrorConst(\n GetThreadError.MissingThreadId,\n \"缺少 thread_id 参数。\",\n);\n\nexport const networkRequestFailedError = lvErrorConst(\n GetThreadError.NetworkRequestFailed,\n \"请求 Pippit API 失败,请确保在内网环境下请求\",\n);\n\nexport const responseParseFailed = lvErrorConst(\n GetThreadError.ResponseParseFailed,\n \"解析 API 响应失败,返回消息的数据格式异常。\",\n);\n\nexport const threadNotFoundError = lvErrorConst(\n GetThreadError.ThreadNotFound,\n \"未找到对应的 thread 数据。\",\n);\n","import type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport { makeOkWith } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\nimport type { IThreadData } from \"./types\";\nimport { requestJson } from \"../request-json\";\nimport {\n networkRequestFailedError,\n responseParseFailed,\n threadNotFoundError,\n} from \"./errors\";\n\nconst REGION_URL_MAP: Record<Region, string> = {\n [Region.CN]:\n \"https://pippit-cms.bytedance.net/api/internal/v1/agent/get_thread\",\n [Region.I18N]:\n \"https://pippit-cms.tiktok-row.org/api/internal/v1/agent/get_thread\",\n};\n\nconst REGION_REFERER_MAP: Record<Region, string> = {\n [Region.CN]: \"https://pippit-cms.bytedance.net/\",\n [Region.I18N]: \"https://pippit-cms.tiktok-row.org/\",\n};\n\nexport async function fetchThread(\n threadId: string,\n region: Region,\n): Promise<ILvErrorOr<IThreadData>> {\n const url = REGION_URL_MAP[region];\n const referer = REGION_REFERER_MAP[region];\n\n const result = await requestJson<{ data?: { thread?: IThreadData } }>(url, {\n method: \"POST\",\n headers: {\n accept: \"*/*\",\n \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8\",\n appvr: \"1.1.4\",\n \"content-type\": \"application/json\",\n Referer: referer,\n },\n body: JSON.stringify({\n scopes: [\"run_list.entry_list\"],\n thread_id: threadId,\n }),\n }, {\n networkRequestFailed: (message) => networkRequestFailedError(message),\n responseParseFailed: (message) => responseParseFailed(message),\n });\n if (!result.ok) {\n return result;\n }\n\n const thread = result.value?.data?.thread as IThreadData | undefined;\n if (!thread?.run_list) {\n return threadNotFoundError();\n }\n\n return makeOkWith(thread);\n}\n","import type { IThreadData, IThreadRun, IThreadMessage, IThreadPart } from \"./types\";\n\nconst RUN_WHITE_KEYS: readonly string[] = [\n \"run_id\",\n \"state\",\n \"agent_name\",\n \"entry_list\",\n \"updated_at\",\n];\n\nconst MESSAGE_WHITE_KEYS: readonly string[] = [\n \"content\",\n \"message_id\",\n \"role\",\n \"run_id\",\n];\n\nconst PART_WHITE_KEYS: readonly string[] = [\"data\", \"sub_type\"];\n\nfunction pickKeys<T extends Record<string, unknown>>(\n obj: T,\n keys: readonly string[],\n): void {\n for (const key of Object.keys(obj)) {\n if (!keys.includes(key)) {\n delete obj[key];\n }\n }\n}\n\nfunction extractLogId(extraStr: string | undefined): string | undefined {\n if (!extraStr) return undefined;\n try {\n const extra = JSON.parse(extraStr);\n return extra?.execute_log_id as string | undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction trimMessage(message: IThreadMessage): void {\n pickKeys(message, MESSAGE_WHITE_KEYS);\n if (Array.isArray(message.content)) {\n for (const part of message.content as IThreadPart[]) {\n pickKeys(part, PART_WHITE_KEYS);\n }\n }\n}\n\nfunction trimRun(run: IThreadRun, isLast: boolean): void {\n const logId = isLast ? extractLogId(run.extra) : undefined;\n\n pickKeys(run, RUN_WHITE_KEYS);\n\n if (logId) {\n run.execute_log_id = logId;\n }\n\n if (!run.entry_list) return;\n\n const messages: IThreadMessage[] = [];\n for (const entry of run.entry_list) {\n const msg = entry.artifact ?? entry.message;\n if (msg) {\n trimMessage(msg);\n messages.push(msg);\n }\n }\n\n run.entry_list.length = 0;\n run.entry_list.push(...(messages as any[]));\n}\n\n/**\n * 对 thread 数据做字段裁剪,只保留关键信息。\n * 会直接修改传入的对象。\n */\nexport function trimThread(thread: IThreadData): void {\n const { run_list } = thread;\n for (let i = 0; i < run_list.length; i++) {\n trimRun(run_list[i], i === run_list.length - 1);\n }\n}\n","import type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport { makeOkWith } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\nimport type { IGetThreadOptions, IGetThreadResult } from \"./types\";\nimport { fetchThread } from \"./fetch-thread\";\nimport { trimThread } from \"./trim-thread\";\nimport {\n GetThreadError,\n missingThreadIdError,\n threadNotFoundError,\n} from \"./errors\";\n\nconst AUTO_DETECT_REGIONS: readonly Region[] = [Region.CN, Region.I18N];\n\n/**\n * 获取 thread 信息。\n *\n * - 指定 region 时直接请求对应区域\n * - 未指定 region 时依次尝试 cn -> i18n\n * - trim 选项控制是否裁剪冗余字段(默认 true)\n */\nexport async function getThread(\n options: IGetThreadOptions,\n): Promise<ILvErrorOr<IGetThreadResult>> {\n const { threadId, region, trim = true } = options;\n\n if (!threadId) {\n return missingThreadIdError();\n }\n\n if (region) {\n return _fetchAndProcess(threadId, region, trim);\n }\n\n let lastNonNotFoundError: ILvErrorOr<IGetThreadResult> | undefined;\n\n for (const r of AUTO_DETECT_REGIONS) {\n const result = await _fetchAndProcess(threadId, r, trim);\n if (result.ok) {\n return result;\n }\n if (result.code !== GetThreadError.ThreadNotFound) {\n lastNonNotFoundError = result;\n }\n }\n\n return lastNonNotFoundError ?? threadNotFoundError();\n}\n\nasync function _fetchAndProcess(\n threadId: string,\n region: Region,\n trim: boolean,\n): Promise<ILvErrorOr<IGetThreadResult>> {\n const result = await fetchThread(threadId, region);\n if (!result.ok) {\n return result;\n }\n\n const thread = result.value;\n if (trim) {\n trimThread(thread);\n }\n\n return makeOkWith({ thread, region });\n}\n","import type { Command } from \"commander\";\nimport { Option } from \"commander\";\nimport { BaseCommand } from \"../../core/base-command\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { writeFornaxToken } from \"./modules/fornax-token\";\nimport type { Region } from \"./types\";\n\ninterface IPippitFornaxTokenOptions {\n region: Region;\n}\n\nexport class PippitFornaxTokenCommand extends BaseCommand<IPippitFornaxTokenOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"fornax-token\",\n description: \"设置 fornax 的 token\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"<token>\", \"要写入的 fornax token\");\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.addOption(\n new Option(\"-r, --region <region>\", \"token 所属区域\")\n .choices([\"cn\", \"i18n\"])\n .makeOptionMandatory(),\n );\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IPippitFornaxTokenOptions>,\n ): Promise<ILvErrorOr<void>> {\n const token = ctx.args[0] as string;\n const { region } = ctx.options;\n\n const result = await writeFornaxToken(region, token);\n if (!result.ok) {\n return this._makeError(result.code, result.msg);\n }\n\n this._outputJsonOk({\n region,\n stored: true,\n });\n return this._makeOk();\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { findClosestPackageJson } from \"../pkg\";\nimport { makeError, makeOkWith, type ILvErrorOr } from \"../error\";\n\nexport type ConfigPath = string | Array<string | number>;\n\nexport interface IConfigLocation {\n readonly packageName: string;\n readonly configDir: string;\n readonly configFilePath: string;\n}\n\nfunction normalizeAppName(rawName: string): string {\n const lastSegment = rawName.split(\"/\").pop() ?? rawName;\n const sanitized = lastSegment\n .trim()\n .replace(/[<>:\"/\\\\|?*\\u0000-\\u001F]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^[-.]+|[-.]+$/g, \"\");\n return sanitized.length > 0 ? sanitized : \"app\";\n}\n\nasync function readClosestPackageName(): Promise<ILvErrorOr<string>> {\n const packageJsonResult = findClosestPackageJson();\n if (!packageJsonResult.ok) {\n return packageJsonResult;\n }\n\n try {\n const content = await fs.readFile(packageJsonResult.value, \"utf8\");\n const parsed = JSON.parse(content) as { name?: unknown };\n if (typeof parsed.name !== \"string\" || parsed.name.trim().length === 0) {\n return makeError(\n 1,\n `package.json at ${packageJsonResult.value} does not contain a valid name field`,\n );\n }\n return makeOkWith(normalizeAppName(parsed.name));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(\n 1,\n `failed to read package name from ${packageJsonResult.value}: ${message}`,\n );\n }\n}\n\nasync function getBaseConfigDir(): Promise<string> {\n if (process.platform === \"win32\") {\n return process.env.APPDATA ?? path.join(os.homedir(), \"AppData\", \"Roaming\");\n }\n\n return process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), \".config\");\n}\n\nexport async function resolveConfigLocation(): Promise<\n ILvErrorOr<IConfigLocation>\n> {\n const appNameResult = await readClosestPackageName();\n if (!appNameResult.ok) {\n return appNameResult;\n }\n\n const baseDir = await getBaseConfigDir();\n const configDir = path.join(baseDir, appNameResult.value);\n return makeOkWith({\n packageName: appNameResult.value,\n configDir,\n configFilePath: path.join(configDir, `${appNameResult.value}.json`),\n });\n}\n\nexport function parseConfigPath(\n configPath: ConfigPath,\n): Array<string | number> {\n if (Array.isArray(configPath)) {\n return configPath.slice();\n }\n\n const segments: Array<string | number> = [];\n const matcher = /[^.[\\]]+|\\[(\\d+)\\]/g;\n configPath.replace(matcher, (match, index) => {\n if (index !== undefined) {\n segments.push(Number(index));\n } else {\n segments.push(match);\n }\n return \"\";\n });\n return segments;\n}\n\nfunction isContainer(\n value: unknown,\n): value is Record<string, unknown> | Array<unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction getIndexableContainer(\n value: Record<string, unknown> | Array<unknown>,\n): Record<string | number, unknown> {\n return value as Record<string | number, unknown>;\n}\n\nfunction getConfigValue<T>(\n source: unknown,\n configPath: ConfigPath,\n defaultValue?: T,\n): T {\n const segments = parseConfigPath(configPath);\n if (segments.length === 0) {\n return (source === undefined ? defaultValue : source) as T;\n }\n\n let current: unknown = source;\n for (const segment of segments) {\n if (!isContainer(current)) {\n return defaultValue as T;\n }\n current = getIndexableContainer(current)[segment];\n if (current === undefined) {\n return defaultValue as T;\n }\n }\n\n return (current === undefined ? defaultValue : current) as T;\n}\n\nfunction createNextContainer(\n nextSegment: string | number | undefined,\n): Record<string, unknown> | Array<unknown> {\n return typeof nextSegment === \"number\" ? [] : {};\n}\n\nfunction setConfigValue(\n target: Record<string, unknown>,\n configPath: ConfigPath,\n value: unknown,\n): void {\n const segments = parseConfigPath(configPath);\n if (segments.length === 0) {\n return;\n }\n\n let current: Record<string, unknown> | Array<unknown> = target;\n for (let index = 0; index < segments.length; index++) {\n const segment = segments[index];\n const isLast = index === segments.length - 1;\n const currentIndexable = getIndexableContainer(current);\n\n if (isLast) {\n currentIndexable[segment] = value;\n return;\n }\n\n const nextSegment = segments[index + 1];\n const existing = currentIndexable[segment];\n if (!isContainer(existing)) {\n currentIndexable[segment] = createNextContainer(nextSegment);\n }\n current = currentIndexable[segment] as\n | Record<string, unknown>\n | Array<unknown>;\n }\n}\n\nasync function ensureConfigFile(\n configFilePath: string,\n): Promise<ILvErrorOr<void>> {\n try {\n await fs.mkdir(path.dirname(configFilePath), { recursive: true });\n await fs.access(configFilePath).catch(async () => {\n await fs.writeFile(configFilePath, \"{}\\n\", \"utf8\");\n });\n return makeOkWith(undefined);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(\n 1,\n `failed to ensure config file ${configFilePath}: ${message}`,\n );\n }\n}\n\nexport async function readConfig<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(): Promise<ILvErrorOr<T>> {\n const locationResult = await resolveConfigLocation();\n if (!locationResult.ok) {\n return locationResult;\n }\n\n const ensureResult = await ensureConfigFile(\n locationResult.value.configFilePath,\n );\n if (!ensureResult.ok) {\n return ensureResult;\n }\n\n try {\n const content = await fs.readFile(\n locationResult.value.configFilePath,\n \"utf8\",\n );\n if (content.trim().length === 0) {\n return makeOkWith({} as T);\n }\n return makeOkWith(JSON.parse(content) as T);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(\n 1,\n `failed to read config from ${locationResult.value.configFilePath}: ${message}`,\n );\n }\n}\n\nexport async function writeConfig<T extends Record<string, unknown>>(\n config: T,\n): Promise<ILvErrorOr<void>> {\n const locationResult = await resolveConfigLocation();\n if (!locationResult.ok) {\n return locationResult;\n }\n\n const ensureResult = await ensureConfigFile(\n locationResult.value.configFilePath,\n );\n if (!ensureResult.ok) {\n return ensureResult;\n }\n\n try {\n const content = `${JSON.stringify(config, null, 2)}\\n`;\n await fs.writeFile(locationResult.value.configFilePath, content, \"utf8\");\n return makeOkWith(undefined);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(\n 1,\n `failed to write config to ${locationResult.value.configFilePath}: ${message}`,\n );\n }\n}\n\nexport async function readConfigValue<T = unknown>(\n configPath: ConfigPath,\n defaultValue?: T,\n): Promise<ILvErrorOr<T>> {\n const configResult = await readConfig<Record<string, unknown>>();\n if (!configResult.ok) {\n return configResult;\n }\n\n return makeOkWith(\n getConfigValue(configResult.value, configPath, defaultValue),\n );\n}\n\nexport async function writeConfigValue<T = unknown>(\n configPath: ConfigPath,\n value: T,\n): Promise<ILvErrorOr<void>> {\n const configResult = await readConfig<Record<string, unknown>>();\n if (!configResult.ok) {\n return configResult;\n }\n\n setConfigValue(configResult.value, configPath, value);\n return writeConfig(configResult.value);\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { makeOkWith, makeError } from '../error/error-t';\nimport type { ILvErrorOr } from '../error/error-base';\n\nconst _thisDir = path.dirname(fileURLToPath(import.meta.url));\nconst DEFAULT_MAX_DEPTH = 10;\n\n/**\n * 从当前文件所在目录向上查找最近的 package.json 文件\n * @param maxDepth 最多向上遍历的层级数,缺省为 10\n */\nexport function findClosestPackageJson(\n maxDepth: number = DEFAULT_MAX_DEPTH,\n): ILvErrorOr<string> {\n let currentDir = _thisDir;\n\n for (let i = 0; i < maxDepth; i++) {\n const candidate = path.join(currentDir, 'package.json');\n if (fs.existsSync(candidate)) {\n return makeOkWith(candidate);\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n\n return makeError(1, `package.json not found within ${maxDepth} levels from ${_thisDir}`);\n}\n","import { readConfigValue, writeConfigValue } from \"../../../../bedrock/config\";\nimport type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport type { Region } from \"../../types\";\n\nconst FORNAX_TOKEN_CONFIG_PATH = [\"fornax\", \"token\"] as const;\n\nexport async function writeFornaxToken(\n region: Region,\n token: string,\n): Promise<ILvErrorOr<void>> {\n return writeConfigValue([...FORNAX_TOKEN_CONFIG_PATH, region], token);\n}\n\nexport async function readFornaxToken(\n region: Region,\n): Promise<ILvErrorOr<string | undefined>> {\n return readConfigValue([...FORNAX_TOKEN_CONFIG_PATH, region]);\n}\n","import type { Command } from \"commander\";\nimport { Option } from \"commander\";\nimport { BaseCommand } from \"../../core/base-command\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { searchLog } from \"./modules/search-log\";\nimport type { Region } from \"./types\";\n\ninterface IPippitSearchFornaxLogOptions {\n region: Region;\n}\n\nexport class PippitSearchFornaxLogCommand extends BaseCommand<IPippitSearchFornaxLogOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"fornax\",\n description: \"从 fornax 中获取并解析 log 数据\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"<log_id>\", \"要获取的 log id\");\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.addOption(\n new Option(\"-r, --region <region>\", \"指定区域\")\n .choices([\"cn\", \"i18n\"])\n .makeOptionMandatory(),\n );\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IPippitSearchFornaxLogOptions>,\n ): Promise<ILvErrorOr<void>> {\n const logId = ctx.args[0] as string;\n const region = ctx.options.region;\n\n const result = await searchLog({ logId, region });\n if (!result.ok) {\n this._outputJsonError(result.code, result.msg);\n return this._makeOk();\n }\n\n this._outputJsonOk(result.value);\n return this._makeOk();\n }\n}\n","import { lvErrorConst } from \"../../../../bedrock/error\";\n\nconst BASE = 11000;\n\nexport enum FornaxSearchError {\n MissingLogId = BASE + 1,\n MissingFornaxToken = BASE + 2,\n NetworkRequestFailed = BASE + 3,\n ResponseParseFailed = BASE + 4,\n SearchResultNotFound = BASE + 5,\n DetailSpanNotFound = BASE + 6,\n PayloadNotFound = BASE + 7,\n PayloadParseFailed = BASE + 8,\n MissingRegion = BASE + 9,\n ExpiredFornaxToken = BASE + 10,\n}\n\nexport const missingLogIdError = lvErrorConst(\n FornaxSearchError.MissingLogId,\n \"缺少 log_id 参数。\",\n);\n\nexport const missingRegionError = lvErrorConst(\n FornaxSearchError.MissingRegion,\n \"缺少 region 参数,请显式指定 cn 或 i18n。\",\n);\n\nexport const howToConfigureFornaxToken =\n \"关于如何获取 token: 国内访问 https://fornax.bytedance.net/ 海外访问 https://fornax-i18n.byteintl.net/,然后拷贝 cookie 里的 prompt-platform-session\";\n\nexport const missingFornaxTokenError = lvErrorConst(\n FornaxSearchError.MissingFornaxToken,\n \"缺少可用的 fornax-token,请先使用 `tt pippit fornax-token -r <region> <token>` 配置。\" +\n howToConfigureFornaxToken,\n);\n\nexport const expiredFornaxTokenError = lvErrorConst(\n FornaxSearchError.ExpiredFornaxToken,\n \"fornax-token 可能已失效,请先使用 `tt pippit fornax-token -r <region> <token>` 重新配置。\" +\n howToConfigureFornaxToken,\n);\n\nexport const networkRequestFailedError = lvErrorConst(\n FornaxSearchError.NetworkRequestFailed,\n \"请求 fornax API 失败,请确保在内网环境下请求。\",\n);\n\nexport const responseParseFailedError = lvErrorConst(\n FornaxSearchError.ResponseParseFailed,\n \"解析 fornax API 响应失败,返回消息的数据格式异常。\",\n);\n\nexport const searchResultNotFoundError = lvErrorConst(\n FornaxSearchError.SearchResultNotFound,\n \"未找到符合条件的 fornax 记录。\",\n);\n\nexport const detailSpanNotFoundError = lvErrorConst(\n FornaxSearchError.DetailSpanNotFound,\n \"未找到可用于读取数据的 span。\",\n);\n\nexport const payloadNotFoundError = lvErrorConst(\n FornaxSearchError.PayloadNotFound,\n \"未找到 span 的 input 数据。\",\n);\n\nexport const payloadParseFailedError = lvErrorConst(\n FornaxSearchError.PayloadParseFailed,\n \"解析 span payload 失败。\",\n);\n","import { makeOkWith, type ILvErrorOr } from \"../../../../bedrock/error\";\nimport { requestJson as requestJsonShared } from \"../request-json\";\nimport {\n expiredFornaxTokenError,\n networkRequestFailedError,\n payloadNotFoundError,\n payloadParseFailedError,\n responseParseFailedError,\n} from \"./errors\";\nimport type { IFornaxSpan } from \"./types\";\n\nexport interface IJsonRequestOptions extends RequestInit {\n unauthorizedError?: () => ILvErrorOr<never>;\n}\n\nexport function normalizeToken(token: string): string {\n const trimmed = token.trim();\n const prefix = \"prompt-platform-session=\";\n if (trimmed.startsWith(prefix)) {\n return trimmed.slice(prefix.length).trim();\n }\n return trimmed;\n}\n\nexport function createHeaders(token: string, referer: string): any {\n return {\n accept: \"application/json, text/plain, */*\",\n \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8\",\n \"agw-js-conv\": \"str\",\n \"content-type\": \"application/json\",\n \"sec-ch-ua\":\n '\"Chromium\";v=\"146\", \"Not-A.Brand\";v=\"24\", \"Google Chrome\";v=\"146\"',\n \"sec-ch-ua-mobile\": \"?0\",\n \"sec-ch-ua-platform\": '\"macOS\"',\n \"sec-fetch-dest\": \"empty\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-site\": \"same-origin\",\n \"x-requested-with\": \"XMLHttpRequest\",\n cookie: `prompt-platform-session=${normalizeToken(token)}`,\n Referer: referer,\n };\n}\n\nexport async function requestJson<T>(\n url: string,\n options: IJsonRequestOptions,\n): Promise<ILvErrorOr<T>> {\n return requestJsonShared<T>(url, options, {\n networkRequestFailed: (message) => {\n return networkRequestFailedError(message);\n },\n responseParseFailed: (message) => {\n return responseParseFailedError(message);\n },\n unauthorizedError: options.unauthorizedError ?? expiredFornaxTokenError,\n httpError: (message) => {\n return networkRequestFailedError(message);\n },\n });\n}\n\nexport function resolveTimeWindow(\n baseOffsetInDays: number,\n daysLater: number,\n): { startTime: string; endTime: string } {\n const currentTime = Date.now();\n return {\n startTime: String(currentTime - 1000 * 60 * 60 * 24 * baseOffsetInDays),\n endTime: String(currentTime + 1000 * 60 * 60 * 24 * daysLater),\n };\n}\n\nexport function parseDetailPayload<T>(input: unknown): ILvErrorOr<T> {\n if (typeof input === \"string\") {\n try {\n return makeOkWith(JSON.parse(input) as unknown) as ILvErrorOr<T>;\n } catch (error) {\n return payloadParseFailedError(\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n if (input !== null && typeof input === \"object\") {\n return makeOkWith(input as T);\n }\n\n return payloadNotFoundError();\n}\n\nexport function selectDetailSpan(\n spans: IFornaxSpan[],\n): IFornaxSpan | undefined {\n return spans.findLast((span) => {\n return (\n span?.type === \"model\" && span?.service_name === \"pippit.business.agent\"\n );\n });\n}\n","import { makeOkWith, type ILvErrorOr } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\nimport { readFornaxToken } from \"../fornax-token\";\nimport {\n expiredFornaxTokenError,\n detailSpanNotFoundError,\n missingFornaxTokenError,\n missingLogIdError,\n searchResultNotFoundError,\n} from \"./errors\";\nimport {\n createHeaders,\n parseDetailPayload,\n requestJson,\n resolveTimeWindow,\n selectDetailSpan,\n} from \"./common\";\nimport type {\n IFornaxDataResult,\n IFornaxSearchOptions,\n IFornaxSpan,\n IFornaxLogData,\n} from \"./types\";\n\nconst CONFIG = {\n BASE_URL: \"https://fornax.bytedance.net/\",\n WORKSPACE_ID: \"7507836945448304652\",\n SCAN_SPAN_IN_HOUR: \"4\",\n DAYS_AGO: 30,\n DAYS_LATER: 1,\n PLATFORM_TYPE: \"inner_cozeloop\",\n PAGE_SIZE: 30,\n} as const;\n\ninterface ITraceSearchResult {\n spans?: IFornaxSpan[];\n [key: string]: unknown;\n}\n\nfunction createFilterField(\n fieldName: string,\n fieldType: string,\n values: string[],\n queryType: string,\n isCustom = false,\n) {\n return {\n field_name: fieldName,\n field_type: fieldType,\n values,\n query_type: queryType,\n query_and_or: \"and\",\n is_custom: isCustom,\n sub_filter: {\n query_and_or: \"and\",\n filter_fields: [],\n },\n };\n}\n\nfunction selectRootSpan(spans: IFornaxSpan[]): IFornaxSpan | undefined {\n let selected: IFornaxSpan | undefined;\n for (const span of spans) {\n if (typeof span.span_id !== \"string\" || typeof span.trace_id !== \"string\") {\n continue;\n }\n if (\n !selected ||\n (span.duration ?? -Infinity) > (selected.duration ?? -Infinity)\n ) {\n selected = span;\n }\n }\n return selected;\n}\n\nfunction getSearchUrl(): string {\n return `${CONFIG.BASE_URL}api/observability/v1/spans/list`;\n}\n\nfunction getSearchReferer(): string {\n return getSearchUrl();\n}\n\nfunction getTimeWindow(): { startTime: string; endTime: string } {\n return resolveTimeWindow(CONFIG.DAYS_AGO, CONFIG.DAYS_LATER);\n}\n\nfunction getSearchBody(logId: string): string {\n const { startTime, endTime } = getTimeWindow();\n return JSON.stringify({\n workspace_id: CONFIG.WORKSPACE_ID,\n start_time: startTime,\n end_time: endTime,\n filters: {\n query_and_or: \"and\",\n filter_fields: [\n createFilterField(\"deployment_env\", \"string\", [\"boe\"], \"not_in\"),\n createFilterField(\"psm\", \"string\", [\"pippit.business.agent\"], \"in\"),\n createFilterField(\"logid\", \"string\", [logId], \"in\"),\n ],\n },\n page_size: CONFIG.PAGE_SIZE,\n order_bys: [\n {\n field: \"start_time\",\n is_asc: false,\n },\n ],\n platform_type: CONFIG.PLATFORM_TYPE,\n span_list_type: \"root_span\",\n });\n}\n\nfunction getTreeUrl(): string {\n return `${CONFIG.BASE_URL}api/observability/v1/traces/search_tree`;\n}\n\nfunction getDetailUrl(traceId: string, spanId: string): string {\n const { startTime, endTime } = getTimeWindow();\n return `${CONFIG.BASE_URL}api/observability/v1/traces/${traceId}?workspace_id=${CONFIG.WORKSPACE_ID}&start_time=${startTime}&end_time=${endTime}&platform_type=${CONFIG.PLATFORM_TYPE}&span_ids=${spanId}`;\n}\n\nexport async function searchLogCn(\n options: IFornaxSearchOptions,\n): Promise<ILvErrorOr<IFornaxDataResult>> {\n const { logId } = options;\n if (!logId) {\n return missingLogIdError();\n }\n\n const tokenResult = await readFornaxToken(Region.CN);\n if (!tokenResult.ok) {\n return tokenResult;\n }\n\n const token = tokenResult.value?.trim();\n if (!token) {\n return missingFornaxTokenError();\n }\n\n const searchResult = await requestJson<ITraceSearchResult>(getSearchUrl(), {\n method: \"POST\",\n headers: createHeaders(token, getSearchReferer()),\n body: getSearchBody(logId),\n unauthorizedError: expiredFornaxTokenError,\n });\n if (!searchResult.ok) {\n return searchResult;\n }\n\n const searchSpans = searchResult.value.spans ?? [];\n if (searchSpans.length === 0) {\n return searchResultNotFoundError();\n }\n\n const rootSpan = selectRootSpan(searchSpans);\n if (!rootSpan?.trace_id) {\n return detailSpanNotFoundError();\n }\n\n const treeResult = await requestJson<ITraceSearchResult>(getTreeUrl(), {\n method: \"POST\",\n headers: createHeaders(token, getSearchReferer()),\n body: JSON.stringify({\n workspace_id: CONFIG.WORKSPACE_ID,\n trace_id: rootSpan.trace_id,\n start_time: getTimeWindow().startTime,\n end_time: getTimeWindow().endTime,\n platform_type: CONFIG.PLATFORM_TYPE,\n }),\n unauthorizedError: expiredFornaxTokenError,\n });\n if (!treeResult.ok) {\n return treeResult;\n }\n\n const detailSpan = selectDetailSpan(treeResult.value.spans ?? []);\n if (!detailSpan?.trace_id || !detailSpan.span_id) {\n return detailSpanNotFoundError();\n }\n\n const detailResult = await requestJson<ITraceSearchResult>(\n getDetailUrl(detailSpan.trace_id, detailSpan.span_id),\n {\n method: \"GET\",\n headers: createHeaders(token, getSearchReferer()),\n unauthorizedError: expiredFornaxTokenError,\n },\n );\n if (!detailResult.ok) {\n return detailResult;\n }\n\n const payload = parseDetailPayload<IFornaxLogData>(\n detailResult.value.spans?.[0]?.input,\n );\n if (!payload.ok) {\n return payload;\n }\n\n return makeOkWith({\n meta: {\n region: Region.CN,\n spanName: detailSpan.span_name || \"\",\n },\n data: payload.value,\n });\n}\n","import { makeOkWith, type ILvErrorOr } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\nimport { readFornaxToken } from \"../fornax-token\";\nimport {\n expiredFornaxTokenError,\n detailSpanNotFoundError,\n missingFornaxTokenError,\n missingLogIdError,\n searchResultNotFoundError,\n} from \"./errors\";\nimport {\n createHeaders,\n parseDetailPayload,\n requestJson,\n resolveTimeWindow,\n selectDetailSpan,\n} from \"./common\";\nimport type {\n IFornaxDataResult,\n IFornaxSearchOptions,\n IFornaxLogData,\n IFornaxSpan,\n} from \"./types\";\n\nconst CONFIG = {\n BASE_URL: \"https://fornax-i18n.byteintl.net\",\n WORKSPACE_ID: \"7517207223651532851\",\n SCAN_SPAN_IN_HOUR: \"4\",\n DAYS_AGO: 30,\n DAYS_LATER: 1,\n} as const;\n\ninterface ITraceSearchResult {\n spans?: IFornaxSpan[];\n [key: string]: unknown;\n}\n\nfunction getSearchUrl(): string {\n return `${CONFIG.BASE_URL}/api/observability/v1/traces/search`;\n}\n\nfunction getSearchReferer(logId: string): string {\n return `${CONFIG.BASE_URL}/space/${CONFIG.WORKSPACE_ID}/analytics/log-query?env=online&logIdTime=${CONFIG.SCAN_SPAN_IN_HOUR}&queryID=${logId}&queryType=log_id`;\n}\n\nfunction getTimeWindow(): { startTime: string; endTime: string } {\n return resolveTimeWindow(CONFIG.DAYS_AGO, CONFIG.DAYS_LATER);\n}\n\nfunction getDetailUrl(traceId: string, spanId: string): string {\n const { startTime, endTime } = getTimeWindow();\n return `${CONFIG.BASE_URL}/api/observability/v1/traces/${traceId}?workspace_id=${CONFIG.WORKSPACE_ID}&start_time=${startTime}&end_time=${endTime}&platform_type=trace_detail&span_ids=${spanId}`;\n}\n\nexport async function searchLogI18n(\n options: IFornaxSearchOptions,\n): Promise<ILvErrorOr<IFornaxDataResult>> {\n const { logId } = options;\n if (!logId) {\n return missingLogIdError();\n }\n\n const tokenResult = await readFornaxToken(Region.I18N);\n if (!tokenResult.ok) {\n return tokenResult;\n }\n\n const token = tokenResult.value?.trim();\n if (!token) {\n return missingFornaxTokenError();\n }\n\n const searchResult = await requestJson<ITraceSearchResult>(getSearchUrl(), {\n method: \"POST\",\n headers: createHeaders(token, getSearchReferer(logId)),\n body: JSON.stringify({\n workspace_id: CONFIG.WORKSPACE_ID,\n search_type: \"log_id\",\n id: logId,\n scan_span_in_hour: CONFIG.SCAN_SPAN_IN_HOUR,\n }),\n unauthorizedError: expiredFornaxTokenError,\n });\n if (!searchResult.ok) {\n return searchResult;\n }\n\n const searchSpan = selectDetailSpan(searchResult.value.spans ?? []);\n if (!searchSpan?.trace_id || !searchSpan.span_id) {\n return searchResultNotFoundError();\n }\n\n const detailResult = await requestJson<ITraceSearchResult>(\n getDetailUrl(searchSpan.trace_id, searchSpan.span_id),\n {\n method: \"GET\",\n headers: createHeaders(token, getSearchReferer(logId)),\n unauthorizedError: expiredFornaxTokenError,\n },\n );\n if (!detailResult.ok) {\n return detailResult;\n }\n\n const detailSpan = selectDetailSpan(detailResult.value.spans ?? []);\n if (!detailSpan?.trace_id || !detailSpan.span_id) {\n return detailSpanNotFoundError();\n }\n\n const payload = parseDetailPayload<IFornaxLogData>(detailSpan.input);\n if (!payload.ok) {\n return payload;\n }\n\n return makeOkWith({\n meta: {\n region: Region.I18N,\n spanName: detailSpan.span_name || \"\",\n },\n data: payload.value,\n });\n}\n","import { Region } from \"../../types\";\nimport type { IFornaxDataResult, IFornaxSearchOptions } from \"./types\";\nimport { searchLogCn } from \"./cn-search-log\";\nimport { searchLogI18n } from \"./i18n-search-log\";\nimport { missingLogIdError, missingRegionError } from \"./errors\";\nimport type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport type { IFornaxLogData } from \"./types\";\n\nfunction trimFornaxMessages(data: IFornaxLogData): void {\n if (!Array.isArray(data.messages)) {\n return;\n }\n\n for (const message of data.messages) {\n if (message === null || typeof message !== \"object\") {\n continue;\n }\n\n if (Object.prototype.hasOwnProperty.call(message, \"metadata\")) {\n void Reflect.deleteProperty(message as Record<string, unknown>, \"metadata\");\n }\n }\n}\n\nexport async function searchLog(\n options: IFornaxSearchOptions,\n): Promise<ILvErrorOr<IFornaxDataResult>> {\n const { logId, region, trim = true } = options;\n if (!logId) {\n return missingLogIdError();\n }\n\n if (!region) {\n return missingRegionError();\n }\n\n if (region === Region.CN) {\n const result = await searchLogCn({ logId, region });\n if (result.ok && trim) {\n trimFornaxMessages(result.value.data);\n }\n return result;\n }\n\n const result = await searchLogI18n({ logId, region });\n if (result.ok && trim) {\n trimFornaxMessages(result.value.data);\n }\n return result;\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { Command } from \"commander\";\nimport { Option } from \"commander\";\nimport { BaseCommand } from \"../../core/base-command\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { getThread } from \"./modules/get-thread\";\nimport type { IThreadData } from \"./modules/get-thread/types\";\nimport { searchLog } from \"./modules/search-log\";\nimport type { Region } from \"./types\";\n\ninterface IPippitSaveThreadFornaxOptions {\n outputDir?: string;\n}\n\nexport class PippitSaveThreadFornaxCommand extends BaseCommand<IPippitSaveThreadFornaxOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"save\",\n description: \"获取 thread 和 fornax 并保存到本地\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"<thread_id>\", \"要获取并保存的 thread id\");\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.addOption(\n new Option(\"-o, --output-dir <dir>\", \"保存目录,缺省时使用当前工作目录\"),\n );\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IPippitSaveThreadFornaxOptions>,\n ): Promise<ILvErrorOr<void>> {\n const threadId = ctx.args[0] as string;\n const outputDir = ctx.options.outputDir;\n\n const threadResult = await getThread({ threadId, trim: true });\n if (!threadResult.ok) {\n return this._emitJsonError(threadResult.code, threadResult.msg);\n }\n\n const threadData = threadResult.value.thread;\n const region = threadResult.value.region;\n const logId = this._extractExecuteLogId(threadData);\n if (!logId) {\n return this._emitJsonError(\n 1,\n \"未找到 thread 中可用于查询 fornax 的 execute_log_id。\",\n );\n }\n\n const fornaxResult = await searchLog({ logId, region });\n if (!fornaxResult.ok) {\n return this._emitJsonError(fornaxResult.code, fornaxResult.msg);\n }\n\n const targetDir = this._resolveTargetDir(threadId, outputDir);\n const threadPath = path.join(targetDir, \"thread.json\");\n const fornaxPath = path.join(targetDir, \"fornax.json\");\n\n try {\n await fs.mkdir(targetDir, { recursive: true });\n await fs.writeFile(\n threadPath,\n `${JSON.stringify(threadData, null, 2)}\\n`,\n \"utf8\",\n );\n await fs.writeFile(\n fornaxPath,\n `${JSON.stringify(fornaxResult.value.data, null, 2)}\\n`,\n \"utf8\",\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return this._emitJsonError(1, `写入文件失败: ${message}`);\n }\n\n this._outputJsonOk({\n thread_id: threadId,\n output_dir: targetDir,\n files: {\n thread: threadPath,\n fornax: fornaxPath,\n },\n });\n return this._makeOk();\n }\n\n private _emitJsonError(code: number, msg: string): ILvErrorOr<void> {\n this._outputJsonError(code, msg);\n process.exitCode = 1;\n return this._makeOk();\n }\n\n private _resolveTargetDir(threadId: string, outputDir?: string): string {\n const baseDir = outputDir\n ? path.resolve(process.cwd(), outputDir)\n : process.cwd();\n return path.join(baseDir, threadId);\n }\n\n private _extractExecuteLogId(thread: IThreadData): string | undefined {\n const lastRun = thread.run_list.at(-1);\n if (!lastRun) {\n return undefined;\n }\n\n if (typeof lastRun.execute_log_id === \"string\") {\n const executeLogId = lastRun.execute_log_id.trim();\n if (executeLogId.length > 0) {\n return executeLogId;\n }\n }\n\n if (typeof lastRun.extra !== \"string\" || lastRun.extra.length === 0) {\n return undefined;\n }\n\n try {\n const extra = JSON.parse(lastRun.extra) as {\n execute_log_id?: unknown;\n };\n if (typeof extra.execute_log_id !== \"string\") {\n return undefined;\n }\n\n const executeLogId = extra.execute_log_id.trim();\n return executeLogId.length > 0 ? executeLogId : undefined;\n } catch {\n return undefined;\n }\n }\n}\n","import * as path from \"node:path\";\nimport type { Command } from \"commander\";\nimport { Option } from \"commander\";\nimport { BaseCommand } from \"../../core/base-command\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { Region } from \"./types\";\nimport { uploadAsset } from \"./modules/asset-upload\";\nimport { missingFilePathError } from \"./modules/asset-upload/errors\";\n\ninterface IPippitAssetUploadOptions {\n region: Region;\n}\n\nexport class PippitAssetUploadCommand extends BaseCommand<IPippitAssetUploadOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"asset-upload\",\n description: \"上传 pippit 图片或视频资源\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"<file_path>\", \"要上传的图片或视频文件路径\");\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.addOption(\n new Option(\"-r, --region <region>\", \"指定区域\")\n .choices([Region.CN, Region.I18N])\n .makeOptionMandatory(),\n );\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IPippitAssetUploadOptions>,\n ): Promise<ILvErrorOr<void>> {\n const filePath = ctx.args[0] as string | undefined;\n const region = ctx.options.region;\n\n if (!filePath) {\n const error = missingFilePathError();\n this._outputJsonError(error.code, error.msg);\n return this._makeOk();\n }\n\n const result = await uploadAsset({ filePath, region });\n if (!result.ok) {\n this._outputJsonError(result.code, result.msg);\n return this._makeOk();\n }\n\n this._outputJsonOk({\n asset_id: result.value.assetId,\n file_path: path.resolve(process.cwd(), filePath),\n region: result.value.region,\n asset_type: result.value.fileInfo.assetType,\n });\n return this._makeOk();\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport { makeError, makeOkWith } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\nimport { requestJson } from \"../request-json\";\nimport { readWebToken } from \"../web-token\";\nimport type {\n AssetType,\n IAssetUploadFileInfo,\n IAssetUploadOptions,\n IAssetUploadResult,\n} from \"./types\";\nimport {\n fileReadFailedError,\n missingUploadTokenError,\n networkRequestFailedError,\n responseParseFailedError,\n unsupportedAssetTypeError,\n} from \"./errors\";\n\ninterface IUploadResponse {\n readonly ret?: string | number;\n readonly errmsg?: string;\n readonly data?: {\n readonly asset_id?: string;\n readonly [key: string]: unknown;\n };\n readonly [key: string]: unknown;\n}\n\nconst UPLOAD_URL = \"https://xyq.jianying.com/api/web/v1/common/upload_file\";\n\nconst IMAGE_EXTENSIONS = new Set([\n \".png\",\n \".jpg\",\n \".jpeg\",\n \".gif\",\n \".webp\",\n \".bmp\",\n \".tif\",\n \".tiff\",\n \".heic\",\n \".heif\",\n \".avif\",\n]);\n\nconst VIDEO_EXTENSIONS = new Set([\n \".mp4\",\n \".mov\",\n \".m4v\",\n \".webm\",\n \".avi\",\n \".mkv\",\n \".flv\",\n \".ts\",\n \".wmv\",\n \".mpg\",\n \".mpeg\",\n]);\n\nfunction normalizeSessionToken(token: string): string {\n const trimmed = token.trim();\n const prefix = \"sessionid_pippitcn_web=\";\n if (trimmed.startsWith(prefix)) {\n return trimmed.slice(prefix.length).trim();\n }\n return trimmed;\n}\n\nfunction getCookieHeader(token: string): string {\n return `sessionid_pippitcn_web=${normalizeSessionToken(token)}`;\n}\n\nfunction resolveFileInfo(filePath: string): IAssetUploadFileInfo | undefined {\n const resolvedPath = path.resolve(process.cwd(), filePath);\n const fileName = path.basename(resolvedPath);\n const ext = path.extname(fileName).toLowerCase();\n\n let assetType: AssetType | undefined;\n if (IMAGE_EXTENSIONS.has(ext)) {\n assetType = 2;\n } else if (VIDEO_EXTENSIONS.has(ext)) {\n assetType = 1;\n }\n\n if (!assetType) {\n return undefined;\n }\n\n return {\n resolvedPath,\n fileName,\n assetType,\n };\n}\n\nfunction makeUploadFailedError(\n ret: string | number | undefined,\n errmsg?: string,\n) {\n const parsedCode =\n typeof ret === \"number\"\n ? ret\n : typeof ret === \"string\"\n ? Number.parseInt(ret, 10)\n : Number.NaN;\n const code = Number.isFinite(parsedCode) ? parsedCode : 1;\n const message = errmsg?.trim();\n return makeError(\n code,\n message && message.length > 0\n ? message\n : `上传失败,返回码: ${String(ret ?? \"unknown\")}`,\n );\n}\n\nexport async function uploadAssetCn(\n options: IAssetUploadOptions,\n): Promise<ILvErrorOr<IAssetUploadResult>> {\n const tokenResult = await readWebToken(Region.CN);\n if (!tokenResult.ok) {\n return tokenResult;\n }\n\n const token = tokenResult.value?.trim();\n if (!token) {\n return missingUploadTokenError();\n }\n\n const fileInfo = resolveFileInfo(options.filePath);\n if (!fileInfo) {\n return unsupportedAssetTypeError();\n }\n\n let fileBytes: Buffer;\n try {\n fileBytes = await fs.readFile(fileInfo.resolvedPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return fileReadFailedError(message);\n }\n\n const formData = new FormData();\n formData.append(\"file\", new Blob([fileBytes]), fileInfo.fileName);\n formData.append(\"asset_type\", String(fileInfo.assetType));\n\n const result = await requestJson<IUploadResponse>(UPLOAD_URL, {\n method: \"POST\",\n headers: {\n accept: \"application/json, text/plain, */*\",\n cookie: getCookieHeader(token),\n Referer: \"https://xyq.jianying.com/\",\n },\n body: formData,\n }, {\n networkRequestFailed: (message) => networkRequestFailedError(message),\n responseParseFailed: (message) => responseParseFailedError(message),\n });\n if (!result.ok) {\n return result;\n }\n\n const payload = result.value;\n const ret = payload?.ret;\n if (String(ret) !== \"0\") {\n return makeUploadFailedError(ret, payload?.errmsg);\n }\n\n const assetId = payload?.data?.asset_id?.trim();\n if (!assetId) {\n return makeError(1, \"上传成功,但未返回 asset_id。\");\n }\n\n return makeOkWith({\n assetId,\n fileInfo,\n region: Region.CN,\n });\n}\n","import { readConfigValue, writeConfigValue } from \"../../../../bedrock/config\";\nimport type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\n\ntype WebTokenConfigPath =\n | readonly [\"xyqweb\", \"sessionid_pippitcn_web\"]\n | readonly [\"pippitweb\", \"sid_tt\"];\n\ntype WebTokenNamespace = readonly [\"xyqweb\"] | readonly [\"pippitweb\"];\ntype WebTokenContainer = Record<string, unknown>;\n\nfunction getWebTokenConfigPath(region: Region): WebTokenConfigPath {\n return region === Region.CN\n ? [\"xyqweb\", \"sessionid_pippitcn_web\"]\n : [\"pippitweb\", \"sid_tt\"];\n}\n\nfunction getWebTokenNamespace(region: Region): WebTokenNamespace {\n return region === Region.CN ? [\"xyqweb\"] : [\"pippitweb\"];\n}\n\nexport async function writeWebToken(\n region: Region,\n token: string,\n): Promise<ILvErrorOr<void>> {\n const namespace = getWebTokenNamespace(region);\n const namespaceResult = await readConfigValue<WebTokenContainer | undefined>(\n namespace as any,\n undefined,\n );\n if (!namespaceResult.ok) {\n return namespaceResult;\n }\n\n const nextConfig: WebTokenContainer = {\n [getWebTokenConfigPath(region)[1]]: token,\n };\n\n return writeConfigValue(namespace as any, nextConfig);\n}\n\nexport async function readWebToken(\n region: Region,\n): Promise<ILvErrorOr<string | undefined>> {\n return readConfigValue(getWebTokenConfigPath(region) as any);\n}\n","import { lvErrorConst } from \"../../../../bedrock/error\";\n\nconst BASE = 13000;\n\nexport enum WebTokenError {\n MissingWebToken = BASE + 1,\n NetworkRequestFailed = BASE + 2,\n ResponseParseFailed = BASE + 3,\n UserInfoRequestFailed = BASE + 4,\n UserInfoNotFound = BASE + 5,\n WorkspaceRequestFailed = BASE + 6,\n WorkspaceNotFound = BASE + 7,\n RefreshNotSupported = BASE + 8,\n MissingWebContext = BASE + 9,\n}\n\nexport const missingWebTokenError = lvErrorConst(\n WebTokenError.MissingWebToken,\n \"缺少可用的 sessionid_pippitcn_web token,请先使用 `tt pippit web-token --region=cn <token>` 配置。\",\n);\n\nexport const networkRequestFailedError = lvErrorConst(\n WebTokenError.NetworkRequestFailed,\n \"请求 pippit web 相关接口失败,请检查网络和登录态。\",\n);\n\nexport const responseParseFailedError = lvErrorConst(\n WebTokenError.ResponseParseFailed,\n \"解析 pippit web 接口响应失败。\",\n);\n\nexport const userInfoRequestFailedError = lvErrorConst(\n WebTokenError.UserInfoRequestFailed,\n \"获取 pippit 用户信息失败。\",\n);\n\nexport const userInfoNotFoundError = lvErrorConst(\n WebTokenError.UserInfoNotFound,\n \"获取 pippit 用户信息失败,未返回 uid。\",\n);\n\nexport const workspaceRequestFailedError = lvErrorConst(\n WebTokenError.WorkspaceRequestFailed,\n \"获取 pippit workspace 信息失败。\",\n);\n\nexport const workspaceNotFoundError = lvErrorConst(\n WebTokenError.WorkspaceNotFound,\n \"获取 pippit workspace 信息失败,未返回 workspace_id 或 space_id。\",\n);\n\nexport const refreshNotSupportedError = lvErrorConst(\n WebTokenError.RefreshNotSupported,\n \"当前仅支持国内场景刷新 pippit web 关联信息。\",\n);\n\nexport const missingWebContextError = lvErrorConst(\n WebTokenError.MissingWebContext,\n \"请先配置 web-token\",\n);\n","import { readConfigValue, writeConfigValue } from \"../../../../bedrock/config\";\nimport { makeOkWith, type ILvErrorOr } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\nimport { requestJson as requestJsonShared } from \"../request-json\";\nimport {\n missingWebTokenError,\n missingWebContextError,\n networkRequestFailedError,\n refreshNotSupportedError,\n responseParseFailedError,\n userInfoNotFoundError,\n userInfoRequestFailedError,\n workspaceNotFoundError,\n workspaceRequestFailedError,\n} from \"./errors\";\n\nconst USER_INFO_URL =\n \"https://xyq.jianying.com/commerce/v1/subscription/user_info\";\nconst WORKSPACE_URL =\n \"https://xyq.jianying.com/api/web/v1/workspace/get_user_workspace\";\n\nconst WEB_NAMESPACE_PATH = [\"xyqweb\", \"pippitweb\"];\n\ninterface ITokenResponse {\n readonly ret?: string | number;\n readonly errmsg?: string;\n readonly data?: {\n readonly uid?: string | number;\n readonly [key: string]: unknown;\n };\n readonly [key: string]: unknown;\n}\n\ninterface IWorkspaceResponse {\n readonly ret?: string | number;\n readonly errmsg?: string;\n readonly data?: {\n readonly workspace_id?: string | number;\n readonly space_id?: string | number;\n readonly [key: string]: unknown;\n };\n readonly [key: string]: unknown;\n}\n\nexport interface IWebContextData {\n readonly uid: string;\n readonly workspaceId: string;\n readonly spaceId: string;\n}\n\nfunction normalizeToken(token: string): string {\n const trimmed = token.trim();\n const prefix = \"sessionid_pippitcn_web=\";\n if (trimmed.startsWith(prefix)) {\n return trimmed.slice(prefix.length).trim();\n }\n return trimmed;\n}\n\nfunction createCookieHeader(token: string): string {\n return `sessionid_pippitcn_web=${normalizeToken(token)}`;\n}\n\nfunction normalizeId(value: string | number | undefined): string | undefined {\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? String(value) : undefined;\n }\n\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction parseWebContext(value: unknown): IWebContextData | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return undefined;\n }\n\n const record = value as Record<string, unknown>;\n const uid = normalizeId(record.uid as string | number | undefined);\n const workspaceId = normalizeId(\n record.workspace_id as string | number | undefined,\n );\n const spaceId = normalizeId(record.space_id as string | number | undefined);\n\n if (!uid || !workspaceId || !spaceId) {\n return undefined;\n }\n\n return {\n uid,\n workspaceId,\n spaceId,\n };\n}\n\nasync function requestJson<T>(\n url: string,\n init: RequestInit,\n): Promise<ILvErrorOr<T>> {\n return requestJsonShared<T>(url, init, {\n networkRequestFailed: (message) => {\n return networkRequestFailedError(message);\n },\n responseParseFailed: (message) => {\n return responseParseFailedError(message);\n },\n });\n}\n\nasync function fetchUserId(token: string): Promise<ILvErrorOr<string>> {\n const responseResult = await requestJson<ITokenResponse>(USER_INFO_URL, {\n method: \"POST\",\n headers: {\n accept: \"application/json, text/plain, */*\",\n \"content-type\": \"application/json\",\n cookie: createCookieHeader(token),\n Referer: \"https://xyq.jianying.com/\",\n },\n body: JSON.stringify({\n aid: 795647,\n }),\n });\n if (!responseResult.ok) {\n return responseResult;\n }\n\n const data = responseResult.value;\n if (String(data?.ret) !== \"0\") {\n return userInfoRequestFailedError(data?.errmsg);\n }\n\n const uid = normalizeId(data?.data?.uid);\n if (!uid) {\n return userInfoNotFoundError();\n }\n\n return makeOkWith(uid);\n}\n\nasync function fetchWorkspace(\n token: string,\n uid: string,\n): Promise<ILvErrorOr<IWebContextData>> {\n const responseResult = await requestJson<IWorkspaceResponse>(WORKSPACE_URL, {\n method: \"POST\",\n headers: {\n accept: \"application/json, text/plain, */*\",\n \"content-type\": \"application/json\",\n cookie: createCookieHeader(token),\n Referer: \"https://xyq.jianying.com/\",\n },\n body: JSON.stringify({\n uid,\n }),\n });\n if (!responseResult.ok) {\n return responseResult;\n }\n\n const data = responseResult.value;\n if (String(data?.ret) !== \"0\") {\n return workspaceRequestFailedError(data?.errmsg);\n }\n\n const workspaceId = normalizeId(data?.data?.workspace_id);\n const spaceId = normalizeId(data?.data?.space_id);\n if (!workspaceId || !spaceId) {\n return workspaceNotFoundError();\n }\n\n return makeOkWith({\n uid,\n workspaceId,\n spaceId,\n });\n}\n\nexport async function refreshWebContext(\n region: Region,\n token: string,\n): Promise<ILvErrorOr<IWebContextData>> {\n if (region !== Region.CN) {\n return refreshNotSupportedError();\n }\n\n const normalizedToken = normalizeToken(token);\n if (!normalizedToken) {\n return missingWebTokenError();\n }\n\n const uidResult = await fetchUserId(normalizedToken);\n if (!uidResult.ok) {\n return uidResult;\n }\n\n const workspaceResult = await fetchWorkspace(\n normalizedToken,\n uidResult.value,\n );\n if (!workspaceResult.ok) {\n return workspaceResult;\n }\n\n const writeResult = await writeConfigValue(WEB_NAMESPACE_PATH, {\n uid: workspaceResult.value.uid,\n workspace_id: workspaceResult.value.workspaceId,\n space_id: workspaceResult.value.spaceId,\n });\n if (!writeResult.ok) {\n return writeResult;\n }\n\n return workspaceResult;\n}\n\nexport async function readWebContext(\n region: Region,\n): Promise<ILvErrorOr<IWebContextData>> {\n if (region !== Region.CN) {\n return refreshNotSupportedError();\n }\n\n const configResult = await readConfigValue<unknown>(\n WEB_NAMESPACE_PATH,\n undefined,\n );\n if (!configResult.ok) {\n return configResult;\n }\n\n const webContext = parseWebContext(configResult.value);\n if (!webContext) {\n return missingWebContextError();\n }\n\n return makeOkWith(webContext);\n}\n","import { lvErrorConst } from \"../../../../bedrock/error\";\n\nconst BASE = 12000;\n\nexport enum AssetUploadError {\n MissingFilePath = BASE + 1,\n MissingUploadToken = BASE + 2,\n UnsupportedAssetType = BASE + 3,\n NetworkRequestFailed = BASE + 4,\n ResponseParseFailed = BASE + 5,\n I18nNotSupported = BASE + 6,\n FileReadFailed = BASE + 7,\n}\n\nexport const missingFilePathError = lvErrorConst(\n AssetUploadError.MissingFilePath,\n \"缺少 file_path 参数。\",\n);\n\nexport const missingUploadTokenError = lvErrorConst(\n AssetUploadError.MissingUploadToken,\n \"缺少可用的 sessionid_pippitcn_web token,请先使用 `tt pippit web-token --region=cn <token>` 配置 token。获取 token 的图文详情参考 https://cdna-1253404032.cos.ap-beijing.myqcloud.com/img/copy-cookie.png\",\n);\n\nexport const unsupportedAssetTypeError = lvErrorConst(\n AssetUploadError.UnsupportedAssetType,\n \"目前只支持图片、视频文件类型。\",\n);\n\nexport const networkRequestFailedError = lvErrorConst(\n AssetUploadError.NetworkRequestFailed,\n \"请求 pippit 资源上传 API 失败,请检查网络和登录态。\",\n);\n\nexport const responseParseFailedError = lvErrorConst(\n AssetUploadError.ResponseParseFailed,\n \"解析 pippit 资源上传 API 响应失败。\",\n);\n\nexport const i18nNotSupportedError = lvErrorConst(\n AssetUploadError.I18nNotSupported,\n \"i18n 区域暂不支持 pippit 资源上传。\",\n);\n\nexport const fileReadFailedError = lvErrorConst(\n AssetUploadError.FileReadFailed,\n \"读取待上传文件失败。\",\n);\n","import type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport type { IAssetUploadOptions, IAssetUploadResult } from \"./types\";\nimport { i18nNotSupportedError } from \"./errors\";\n\nexport async function uploadAssetI18n(\n _options: IAssetUploadOptions,\n): Promise<ILvErrorOr<IAssetUploadResult>> {\n return i18nNotSupportedError();\n}\n","import type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\nimport type { IAssetUploadOptions, IAssetUploadResult } from \"./types\";\nimport { uploadAssetCn } from \"./cn-asset-upload\";\nimport { uploadAssetI18n } from \"./i18n-asset-upload\";\n\nexport async function uploadAsset(\n options: IAssetUploadOptions,\n): Promise<ILvErrorOr<IAssetUploadResult>> {\n if (options.region === Region.CN) {\n return uploadAssetCn(options);\n }\n\n return uploadAssetI18n(options);\n}\n","import type { Command } from \"commander\";\nimport { Option } from \"commander\";\nimport { BaseCommand } from \"../../core/base-command\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { refreshWebContext, writeWebToken } from \"./modules/web-token\";\nimport { Region } from \"./types\";\n\ninterface IPippitWebTokenOptions {\n region: Region;\n}\n\nexport class PippitWebTokenCommand extends BaseCommand<IPippitWebTokenOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"web-token\",\n description: \"设置 pippit web 的 token\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"<token>\", \"要写入的 pippit web token\");\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.addOption(\n new Option(\"-r, --region <region>\", \"token 所属区域\")\n .choices([\"cn\", \"i18n\"])\n .makeOptionMandatory(),\n );\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IPippitWebTokenOptions>,\n ): Promise<ILvErrorOr<void>> {\n const token = ctx.args[0] as string;\n const { region } = ctx.options;\n\n const result = await writeWebToken(region, token);\n if (!result.ok) {\n return this._makeError(result.code, result.msg);\n }\n\n if (region === Region.CN) {\n const refreshResult = await refreshWebContext(region, token);\n if (!refreshResult.ok) {\n return this._makeError(refreshResult.code, refreshResult.msg);\n }\n\n this._outputJsonOk({\n region,\n stored: true,\n refreshed: true,\n web: {\n uid: refreshResult.value.uid,\n workspace_id: refreshResult.value.workspaceId,\n space_id: refreshResult.value.spaceId,\n },\n });\n return this._makeOk();\n }\n\n this._outputJsonOk({\n region,\n stored: true,\n refreshed: false,\n });\n return this._makeOk();\n }\n}\n","import type { Command } from \"commander\";\nimport { Option } from \"commander\";\nimport { BaseCommand } from \"../../core/base-command\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { Region } from \"./types\";\nimport { getAssetInfo } from \"./modules/asset-get\";\nimport { missingAssetIdsError } from \"./modules/asset-get/errors\";\n\ninterface IPippitAssetGetOptions {\n region: Region;\n}\n\nexport class PippitAssetGetCommand extends BaseCommand<IPippitAssetGetOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"asset-get\",\n description: \"获取 pippit asset 详情\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"<asset_id...>\", \"要查询的 asset id,可传多个\");\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.addOption(\n new Option(\"-r, --region <region>\", \"指定区域\")\n .choices([Region.CN, Region.I18N])\n .makeOptionMandatory(),\n );\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IPippitAssetGetOptions>,\n ): Promise<ILvErrorOr<void>> {\n const assetIds = (ctx.args[0] as string[] | undefined) ?? [];\n const region = ctx.options.region;\n\n const normalizedAssetIds = assetIds\n .map((assetId) => assetId.trim())\n .filter((assetId) => assetId.length > 0);\n\n if (normalizedAssetIds.length === 0) {\n const error = missingAssetIdsError();\n this._outputJsonError(error.code, error.msg);\n return this._makeOk();\n }\n\n const result = await getAssetInfo({\n region,\n assetIds: normalizedAssetIds,\n });\n if (!result.ok) {\n this._outputJsonError(result.code, result.msg);\n return this._makeOk();\n }\n\n this._outputJsonOk(result.value);\n return this._makeOk();\n }\n}\n","import { lvErrorConst } from \"../../../../bedrock/error\";\n\nconst BASE = 14000;\n\nexport enum AssetGetError {\n MissingAssetIds = BASE + 1,\n MissingWebContext = BASE + 2,\n NetworkRequestFailed = BASE + 3,\n ResponseParseFailed = BASE + 4,\n RequestFailed = BASE + 5,\n I18nNotSupported = BASE + 6,\n}\n\nexport const missingAssetIdsError = lvErrorConst(\n AssetGetError.MissingAssetIds,\n \"缺少 asset_id 参数。\",\n);\n\nexport const missingWebContextError = lvErrorConst(\n AssetGetError.MissingWebContext,\n \"请先配置 web-token\",\n);\n\nexport const networkRequestFailedError = lvErrorConst(\n AssetGetError.NetworkRequestFailed,\n \"请求 pippit asset 接口失败,请检查网络和登录态。\",\n);\n\nexport const responseParseFailedError = lvErrorConst(\n AssetGetError.ResponseParseFailed,\n \"解析 pippit asset 接口响应失败。\",\n);\n\nexport const requestFailedError = lvErrorConst(\n AssetGetError.RequestFailed,\n \"获取 asset 信息失败。\",\n);\n\nexport const i18nNotSupportedError = lvErrorConst(\n AssetGetError.I18nNotSupported,\n \"i18n 区域暂不支持 pippit asset 查询。\",\n);\n","import type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport { makeError, makeOkWith } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\nimport { requestJson } from \"../request-json\";\nimport { readWebContext, readWebToken } from \"../web-token\";\nimport type { IAssetGetOptions, IAssetGetResult } from \"./types\";\nimport {\n missingWebContextError,\n networkRequestFailedError,\n requestFailedError,\n responseParseFailedError,\n} from \"./errors\";\n\ninterface IAssetInfoResponse {\n readonly ret?: string | number;\n readonly errmsg?: string;\n readonly data?: unknown;\n readonly [key: string]: unknown;\n}\n\nconst QUERY_URL = \"https://xyq.jianying.com/api/web/v1/common/mget_asset_info\";\nconst ALLOWED_KEYS = new Set([\n \"asset_id\",\n \"download_url\",\n \"duration_ms\",\n \"format\",\n \"height\",\n \"md5\",\n \"mime\",\n]);\n\nfunction normalizeToken(token: string): string {\n const trimmed = token.trim();\n const prefix = \"sessionid_pippitcn_web=\";\n if (trimmed.startsWith(prefix)) {\n return trimmed.slice(prefix.length).trim();\n }\n return trimmed;\n}\n\nfunction createCookieHeader(token: string): string {\n return `sessionid_pippitcn_web=${normalizeToken(token)}`;\n}\n\nfunction sanitizeAssetItem(item: unknown): Record<string, unknown> | undefined {\n if (typeof item !== \"object\" || item === null || Array.isArray(item)) {\n return undefined;\n }\n\n const record = item as Record<string, unknown>;\n const assetId = record.asset_id;\n if (typeof assetId !== \"string\" || assetId.trim().length === 0) {\n return undefined;\n }\n\n for (const key of Object.keys(record)) {\n if (!ALLOWED_KEYS.has(key)) {\n void Reflect.deleteProperty(record, key);\n }\n }\n\n record.asset_id = assetId.trim();\n return record;\n}\n\nfunction parseAssetList(data: unknown): IAssetGetResult | undefined {\n if (!Array.isArray(data)) {\n return undefined;\n }\n\n const result: IAssetGetResult = [];\n for (const item of data) {\n const sanitized = sanitizeAssetItem(item);\n if (sanitized) {\n result.push(sanitized);\n }\n }\n return result;\n}\n\nfunction parseErrorCode(ret: string | number | undefined): number {\n const parsed =\n typeof ret === \"number\"\n ? ret\n : typeof ret === \"string\"\n ? Number.parseInt(ret, 10)\n : Number.NaN;\n return Number.isFinite(parsed) ? parsed : 1;\n}\n\nexport async function getAssetInfoCn(\n options: IAssetGetOptions,\n): Promise<ILvErrorOr<IAssetGetResult>> {\n const webContextResult = await readWebContext(Region.CN);\n if (!webContextResult.ok) {\n return webContextResult;\n }\n\n const tokenResult = await readWebToken(Region.CN);\n if (!tokenResult.ok) {\n return tokenResult;\n }\n\n const token = tokenResult.value?.trim();\n if (!token) {\n return missingWebContextError();\n }\n\n const responseResult = await requestJson<IAssetInfoResponse>(\n QUERY_URL,\n {\n method: \"POST\",\n headers: {\n accept: \"application/json, text/plain, */*\",\n \"content-type\": \"application/json\",\n cookie: createCookieHeader(token),\n Referer: \"https://xyq.jianying.com/\",\n },\n body: JSON.stringify({\n workspace_id: webContextResult.value.workspaceId,\n asset_ids: options.assetIds,\n uid: webContextResult.value.uid,\n need_transcode: true,\n }),\n },\n {\n networkRequestFailed: (message) => networkRequestFailedError(message),\n responseParseFailed: (message) => responseParseFailedError(message),\n },\n );\n if (!responseResult.ok) {\n return responseResult;\n }\n\n const response = responseResult.value;\n if (String(response.ret) !== \"0\") {\n return makeError(\n parseErrorCode(response.ret),\n response.errmsg?.trim() || \"获取 asset 信息失败。\",\n );\n }\n\n const assets = parseAssetList(response.data);\n if (!assets) {\n return requestFailedError(\"返回的 data 不是数组。\");\n }\n\n return makeOkWith(assets);\n}\n","import type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport type { IAssetGetOptions, IAssetGetResult } from \"./types\";\nimport { i18nNotSupportedError } from \"./errors\";\n\nexport async function getAssetInfoI18n(\n _options: IAssetGetOptions,\n): Promise<ILvErrorOr<IAssetGetResult>> {\n return i18nNotSupportedError();\n}\n","import type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport { Region } from \"../../types\";\nimport type { IAssetGetOptions, IAssetGetResult } from \"./types\";\nimport { getAssetInfoCn } from \"./cn-asset-get\";\nimport { getAssetInfoI18n } from \"./i18n-asset-get\";\n\nexport async function getAssetInfo(\n options: IAssetGetOptions,\n): Promise<ILvErrorOr<IAssetGetResult>> {\n if (options.region === Region.CN) {\n return getAssetInfoCn(options);\n }\n\n return getAssetInfoI18n(options);\n}\n","import type { ICommandMeta } from \"../../core/command-types\";\nimport { BaseSubcommandHost } from \"../../core/base-subcommand-host\";\nimport { PippitGetThreadCommand } from \"./pippit-get-thread-command\";\nimport { PippitFornaxTokenCommand } from \"./pippit-fornax-token-command\";\nimport { PippitSearchFornaxLogCommand } from \"./pippit-search-fornax-log-command\";\nimport { PippitSaveThreadFornaxCommand } from \"./pippit-save-thread-fornax-command\";\nimport { PippitAssetUploadCommand } from \"./pippit-asset-upload-command\";\nimport { PippitWebTokenCommand } from \"./pippit-web-token-command\";\nimport { PippitAssetGetCommand } from \"./pippit-asset-get-command\";\n\nexport class PippitCommand extends BaseSubcommandHost {\n protected _meta(): ICommandMeta {\n return {\n name: \"pippit\",\n description: \"访问 pippit 服务\",\n aliases: [\"pp\", \"xyq\"],\n };\n }\n\n protected _registerSubcommands(): void {\n this._addSubcommand(new PippitGetThreadCommand());\n this._addSubcommand(new PippitFornaxTokenCommand());\n this._addSubcommand(new PippitSearchFornaxLogCommand());\n this._addSubcommand(new PippitSaveThreadFornaxCommand());\n this._addSubcommand(new PippitAssetUploadCommand());\n this._addSubcommand(new PippitWebTokenCommand());\n this._addSubcommand(new PippitAssetGetCommand());\n }\n}\n","import { spawnSync } from \"node:child_process\";\nimport type { Command } from \"commander\";\nimport { BaseCommand } from \"../../core/base-command\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { makeError, makeOkWith } from \"../../bedrock/error\";\n\nexport interface IGitCommandOptions {\n readonly verify?: boolean;\n}\n\nexport abstract class GitBaseCommand extends BaseCommand<IGitCommandOptions> {\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"[msg]\", \"提交消息\", \"feat: update\");\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.option(\"-n, --no-verify\", \"跳过 git hook 校验\");\n }\n\n protected _runGit(args: string[]): ILvErrorOr<void> {\n const result = spawnSync(\"git\", args, {\n cwd: process.cwd(),\n stdio: \"inherit\",\n });\n\n if (result.error) {\n return this._makeError(\n 1,\n `执行 git ${args.join(\" \")} 失败: ${result.error.message}`,\n );\n }\n\n if (result.status !== 0) {\n const signalText = result.signal ? `, signal: ${result.signal}` : \"\";\n return this._makeError(\n result.status ?? 1,\n `执行 git ${args.join(\" \")} 失败${signalText}`,\n );\n }\n\n return this._makeOk();\n }\n\n protected _runGitCapture(args: string[]): ILvErrorOr<string> {\n const result = spawnSync(\"git\", args, {\n cwd: process.cwd(),\n encoding: \"utf8\",\n });\n\n if (result.error) {\n return makeError(\n 1,\n `执行 git ${args.join(\" \")} 失败: ${result.error.message}`,\n );\n }\n\n if (result.status !== 0) {\n const signalText = result.signal ? `, signal: ${result.signal}` : \"\";\n const stderrText =\n typeof result.stderr === \"string\" && result.stderr.trim()\n ? `: ${result.stderr.trim()}`\n : \"\";\n return makeError(\n result.status ?? 1,\n `执行 git ${args.join(\" \")} 失败${signalText}${stderrText}`,\n );\n }\n\n return makeOkWith((result.stdout ?? \"\").trim());\n }\n\n protected _gitAddAll(): ILvErrorOr<void> {\n return this._runGit([\"add\", \".\"]);\n }\n\n protected _gitCommit(msg: string, noVerify: boolean): ILvErrorOr<void> {\n const args = [\"commit\", \"-m\", msg];\n if (noVerify) {\n args.push(\"--no-verify\");\n }\n return this._runGit(args);\n }\n\n protected _gitPush(noVerify: boolean): ILvErrorOr<void> {\n const args = [\"push\"];\n if (noVerify) {\n args.push(\"--no-verify\");\n }\n return this._runGit(args);\n }\n\n protected _gitCheckoutNewBranch(branchName: string): ILvErrorOr<void> {\n return this._runGit([\"checkout\", \"-b\", branchName]);\n }\n\n protected _gitPullRebaseOrigin(branchName: string): ILvErrorOr<void> {\n return this._runGit([\"pull\", \"--rebase\", \"origin\", branchName]);\n }\n\n protected _gitPushWithUpstream(branchName: string): ILvErrorOr<void> {\n return this._runGit([\"push\", \"-u\", \"origin\", branchName]);\n }\n\n protected _gitCurrentBranch(): ILvErrorOr<string> {\n const result = this._runGitCapture([\"branch\", \"--show-current\"]);\n if (!result.ok) {\n return result;\n }\n\n if (!result.value) {\n return makeError(1, \"当前不在任何分支上,请先切换到一个分支\");\n }\n\n return result;\n }\n\n protected _gitOriginUrl(): ILvErrorOr<string> {\n return this._runGitCapture([\"config\", \"--get\", \"remote.origin.url\"]);\n }\n\n protected _normalizeRepoUrl(originUrl: string): string {\n const trimmed = originUrl.trim().replace(/\\.git$/, \"\");\n\n if (trimmed.startsWith(\"http://\") || trimmed.startsWith(\"https://\")) {\n return trimmed;\n }\n\n const sshLike = trimmed.match(/^git@([^:]+):(.+)$/);\n if (sshLike) {\n return `https://${sshLike[1]}/${sshLike[2]}`;\n }\n\n const sshUrlLike = trimmed.match(/^ssh:\\/\\/git@([^/]+)\\/(.+)$/);\n if (sshUrlLike) {\n return `https://${sshUrlLike[1]}/${sshUrlLike[2]}`;\n }\n\n return trimmed;\n }\n\n protected _openUrlInBrowser(url: string): ILvErrorOr<void> {\n const result =\n process.platform === \"darwin\"\n ? spawnSync(\"open\", [url], {\n cwd: process.cwd(),\n stdio: \"ignore\",\n })\n : process.platform === \"win32\"\n ? spawnSync(\"cmd\", [\"/c\", \"start\", \"\", url], {\n cwd: process.cwd(),\n stdio: \"ignore\",\n })\n : spawnSync(\"xdg-open\", [url], {\n cwd: process.cwd(),\n stdio: \"ignore\",\n });\n\n if (result.error) {\n return this._makeError(1, `打开浏览器失败: ${result.error.message}`);\n }\n\n if (result.status !== 0) {\n const signalText = result.signal ? `, signal: ${result.signal}` : \"\";\n return this._makeError(result.status ?? 1, `打开浏览器失败${signalText}`);\n }\n\n return this._makeOk();\n }\n\n protected abstract _meta(): ICommandMeta;\n\n protected abstract _execute(\n ctx: ICommandActionContext<IGitCommandOptions>,\n ): Promise<ILvErrorOr<void>>;\n}\n","import type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { Command } from \"commander\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { GitBaseCommand, type IGitCommandOptions } from \"./git-base-command\";\n\nexport class GitCheckoutCommand extends GitBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"checkout\",\n description: \"同步当前分支后基于它创建并推送一个新分支\",\n aliases: [\"c\"],\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"<branch>\", \"要创建的新分支名\");\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IGitCommandOptions>,\n ): Promise<ILvErrorOr<void>> {\n const branchName = ctx.args[0] as string;\n\n const currentBranchResult = this._gitCurrentBranch();\n if (!currentBranchResult.ok) {\n return currentBranchResult;\n }\n\n const syncResult = this._gitPullRebaseOrigin(currentBranchResult.value);\n if (!syncResult.ok) {\n return syncResult;\n }\n\n const checkoutResult = this._gitCheckoutNewBranch(branchName);\n if (!checkoutResult.ok) {\n return checkoutResult;\n }\n\n return this._gitPushWithUpstream(branchName);\n }\n}\n","import type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { GitBaseCommand, type IGitCommandOptions } from \"./git-base-command\";\n\nexport class GitMmCommand extends GitBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"mm\",\n description: \"执行 git add . 和 git commit\",\n };\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IGitCommandOptions>,\n ): Promise<ILvErrorOr<void>> {\n const msg = ctx.args[0] as string;\n const { verify } = ctx.options;\n const noVerif = verify === false;\n\n const addResult = this._gitAddAll();\n if (!addResult.ok) {\n return addResult;\n }\n\n return this._gitCommit(msg, noVerif);\n }\n}\n","import type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { GitBaseCommand } from \"./git-base-command\";\n\nexport class GitMrCommand extends GitBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"mr\",\n description: \"基于当前分支生成并打开 merge request 链接\",\n };\n }\n\n protected async _execute(\n _ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n const currentBranchResult = this._gitCurrentBranch();\n if (!currentBranchResult.ok) {\n return currentBranchResult;\n }\n\n const originUrlResult = this._gitOriginUrl();\n if (!originUrlResult.ok) {\n return originUrlResult;\n }\n\n const repoUrl = this._normalizeRepoUrl(originUrlResult.value);\n const mrUrl =\n `${repoUrl}/merge_requests/new?merge_request=&source_branch=${encodeURIComponent(currentBranchResult.value)}`;\n\n this._output(mrUrl);\n\n const openResult = this._openUrlInBrowser(mrUrl);\n if (!openResult.ok) {\n this._debug(openResult.msg);\n }\n\n return this._makeOk();\n }\n}\n","import type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { GitBaseCommand, type IGitCommandOptions } from \"./git-base-command\";\n\nexport class GitPpCommand extends GitBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"pp\",\n description: \"执行 git add .、git commit 并 push\",\n };\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IGitCommandOptions>,\n ): Promise<ILvErrorOr<void>> {\n const msg = ctx.args[0] as string;\n const { verify } = ctx.options;\n const noVerif = verify === false;\n\n const addResult = this._gitAddAll();\n if (!addResult.ok) {\n return addResult;\n }\n\n const commitResult = this._gitCommit(msg, noVerif);\n if (!commitResult.ok) {\n return commitResult;\n }\n\n return this._gitPush(noVerif);\n }\n}\n","import type { ICommandMeta } from \"../../core/command-types\";\nimport { BaseSubcommandHost } from \"../../core/base-subcommand-host\";\nimport { GitCheckoutCommand } from \"./git-checkout-command\";\nimport { GitMmCommand } from \"./git-mm-command\";\nimport { GitMrCommand } from \"./git-mr-command\";\nimport { GitPpCommand } from \"./git-pp-command\";\n\nexport class GitCommand extends BaseSubcommandHost {\n protected _meta(): ICommandMeta {\n return {\n name: \"git\",\n description: \"常用 git 便捷命令\",\n aliases: [\"g\"],\n };\n }\n\n protected _registerSubcommands(): void {\n this._addSubcommand(new GitMmCommand());\n this._addSubcommand(new GitPpCommand());\n this._addSubcommand(new GitCheckoutCommand());\n this._addSubcommand(new GitMrCommand());\n }\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { ShortcutBaseCommand } from \"./shortcut-base-command\";\n\nexport class ShortcutEmoLynxCommand extends ShortcutBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"lynx\",\n description: \"启动 lynx 项目\",\n aliases: [\"lx\"],\n };\n }\n\n protected async _execute(\n _ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n const cwd = join(homedir(), \"work\", \"lv-lynx\");\n return this._runCommandLine(` emo start pippit-lynx --deps`, cwd);\n }\n}\n","import { spawn } from \"node:child_process\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { BaseCommand } from \"../../core/base-command\";\n\nexport abstract class ShortcutBaseCommand extends BaseCommand {\n protected _runCommandLine(\n cmdLine: string,\n cwd: string = process.cwd(),\n customEnv: NodeJS.ProcessEnv = {},\n ): Promise<ILvErrorOr<void>> {\n const child = spawn(cmdLine, {\n cwd,\n env: { ...process.env, ...customEnv },\n stdio: \"inherit\",\n shell: true,\n });\n\n return new Promise((resolve) => {\n child.on(\"error\", (error) => {\n resolve(\n this._makeError(\n 1,\n `执行 ${cmdLine} 失败: ${error.message}`,\n ),\n );\n });\n\n child.on(\"close\", (code, signal) => {\n if (code === 0) {\n resolve(this._makeOk());\n return;\n }\n\n const signalText = signal ? `, signal: ${signal}` : \"\";\n resolve(\n this._makeError(\n code ?? 1,\n `执行 ${cmdLine} 失败${signalText}`,\n ),\n );\n });\n });\n }\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { ShortcutBaseCommand } from \"./shortcut-base-command\";\n\nexport class ShortcutEmoPippitCnCommand extends ShortcutBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"pippit-cn\",\n description: \"启动 pippit-cn 项目\",\n aliases: [\"ppc\"],\n };\n }\n\n protected async _execute(\n _ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n const cwd = join(homedir(), \"work\", \"pippit-cn\");\n return this._runCommandLine(`w2 start && emo start platform-xyq`, cwd);\n }\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { ShortcutBaseCommand } from \"./shortcut-base-command\";\n\nexport class ShortcutEmoPippitCommand extends ShortcutBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"pippit\",\n description: \"启动 pippit 项目\",\n aliases: [\"pp\"],\n };\n }\n\n protected async _execute(\n _ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n const cwd = join(homedir(), \"work\", \"pippit\");\n return this._runCommandLine(`w2 start && emo start platform-business`, cwd);\n }\n}\n","import type { ICommandMeta } from \"../../core/command-types\";\nimport { BaseSubcommandHost } from \"../../core/base-subcommand-host\";\nimport { ShortcutEmoLynxCommand } from \"./shortcut-emo-lynx-command\";\nimport { ShortcutEmoPippitCnCommand } from \"./shortcut-emo-pippit-cn-command\";\nimport { ShortcutEmoPippitCommand } from \"./shortcut-emo-pippit-command\";\n\nexport class ShortcutCommand extends BaseSubcommandHost {\n protected _meta(): ICommandMeta {\n return {\n name: \"shortcut\",\n description: \"常用 shell 命令快捷方式\",\n aliases: [\"sc\"],\n };\n }\n\n protected _registerSubcommands(): void {\n this._addSubcommand(new ShortcutEmoLynxCommand());\n this._addSubcommand(new ShortcutEmoPippitCommand());\n this._addSubcommand(new ShortcutEmoPippitCnCommand());\n }\n}\n","import { spawn } from \"node:child_process\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { BaseCommand } from \"../../core/base-command\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\n\nexport abstract class AiBaseCommand<\n TOptions = Record<string, unknown>,\n> extends BaseCommand<TOptions> {\n protected _readPrompt(ctx: ICommandActionContext<TOptions>): string {\n const parts: string[] = [];\n\n for (const arg of ctx.args) {\n if (Array.isArray(arg)) {\n parts.push(...arg.map((item) => String(item)));\n } else if (arg !== undefined && arg !== null) {\n parts.push(String(arg));\n }\n }\n\n return parts.join(\" \").trim();\n }\n\n protected _runCommand(\n command: string,\n args: string[],\n ): Promise<ILvErrorOr<void>> {\n const child = spawn(command, args, {\n cwd: process.cwd(),\n stdio: \"inherit\",\n });\n\n return new Promise((resolve) => {\n child.on(\"error\", (error) => {\n resolve(\n this._makeError(\n 1,\n `执行 ${command} ${args.join(\" \")} 失败: ${error.message}`,\n ),\n );\n });\n\n child.on(\"close\", (code, signal) => {\n if (code === 0) {\n resolve(this._makeOk());\n return;\n }\n\n const signalText = signal ? `, signal: ${signal}` : \"\";\n resolve(\n this._makeError(\n code ?? 1,\n `执行 ${command} ${args.join(\" \")} 失败${signalText}`,\n ),\n );\n });\n });\n }\n}\n","/**\n * https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey\n */\nexport const ARK_AK = \"6990de07-83be-487d-930d-f5dd3b6d5993\";\n\nexport const OPENROUTER_AK =\n \"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\";\n","import type { Command } from \"commander\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { AiBaseCommand } from \"./ai-base-command\";\nimport { ARK_AK } from \"../../constants/ak\";\n\ntype IWebSearchResponse = {\n readonly output?: unknown;\n};\n\nexport class AiWebSearchCommand extends AiBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"websearch\",\n description: \"使用内置 web search 搜索内容\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"[content...]\", \"搜索内容\");\n }\n\n protected async _execute(\n ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n const content = this._readPrompt(ctx);\n if (!content) {\n return this._makeError(1, \"请输入搜索内容\");\n }\n\n const url = \"https://ark.cn-beijing.volces.com/api/v3/responses\";\n const token = ARK_AK;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: \"doubao-seed-2-0-mini-260215\",\n tools: [\n {\n type: \"web_search\",\n },\n ],\n input: [\n {\n role: \"user\",\n content: [\n {\n type: \"input_text\",\n text: content,\n },\n ],\n },\n ],\n }),\n });\n\n if (!response.ok) {\n const bodyText = await response.text().catch(() => \"\");\n const suffix = bodyText ? `: ${bodyText}` : \"\";\n return this._makeError(\n response.status,\n `HTTP 错误!状态码: ${response.status}${suffix}`,\n );\n }\n\n const data = (await response.json()) as IWebSearchResponse;\n const outputList = data.output;\n\n if (!Array.isArray(outputList) || outputList.length === 0) {\n return this._makeError(1, \"返回数据格式异常\");\n }\n\n let outputStr = \"返回数据格式异常\";\n for (const item of outputList) {\n if (item && typeof item === \"object\" && \"content\" in item) {\n const contentValue = (item as { readonly content?: unknown }).content;\n if (contentValue !== undefined) {\n outputStr = JSON.stringify(contentValue);\n }\n }\n }\n\n this._output(outputStr);\n return this._makeOk();\n }\n}\n","import type { Command } from \"commander\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { AiBaseCommand } from \"./ai-base-command\";\n\nexport class AiCursorCommand extends AiBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"cursor\",\n description: \"通过 agent 调用 Gemini 3 Flash\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"[content...]\", \"要传给 agent 的内容\");\n }\n\n protected async _execute(\n ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n const prompt = this._readPrompt(ctx);\n if (!prompt) {\n return this._makeError(1, \"请输入内容\");\n }\n\n return this._runCommand(\"agent\", [\"--model\", \"gemini-3-flash\", \"-p\", prompt]);\n }\n}\n","import type { Command } from \"commander\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { AiBaseCommand } from \"./ai-base-command\";\n\ninterface IAiCodexOptions {\n mini: boolean;\n}\n\nexport class AiCodexCommand extends AiBaseCommand<IAiCodexOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"codex\",\n description: \"通过 codex exec 执行提示词\",\n };\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.option(\"--mini\", \"使用 gpt-5.4-mini,否则使用 gpt-5.4\", false);\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"[content...]\", \"要传给 codex 的内容\");\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IAiCodexOptions>,\n ): Promise<ILvErrorOr<void>> {\n const prompt = this._readPrompt(ctx);\n if (!prompt) {\n return this._makeError(1, \"请输入内容\");\n }\n\n const model = ctx.options.mini ? \"gpt-5.4-mini\" : \"gpt-5.4\";\n\n return this._runCommand(\"codex\", [\n \"exec\",\n \"-m\",\n model,\n \"--full-auto\",\n prompt,\n ]);\n }\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { makeOkWith } from \"../../bedrock/error\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport { AiBaseCommand } from \"./ai-base-command\";\nimport {\n ensureDirectoryExists,\n getCurrentCloudRootPath,\n} from \"./ai-context-path\";\n\ntype TAiRunOptions = Record<string, boolean>;\n\ninterface IAiRunContextAlias {\n readonly optionName: string;\n readonly optionDescription: string;\n readonly resolveReferenceDir: () => ILvErrorOr<string>;\n}\n\nconst AI_RUN_CONTEXT_ALIASES: readonly IAiRunContextAlias[] = [\n {\n optionName: \"my\",\n optionDescription:\n \"参考 iCloud 知识库上下文,了解我的个人信息和工作日志信息\",\n resolveReferenceDir: () => {\n const cloudRoot = getCurrentCloudRootPath();\n if (!cloudRoot.ok) {\n return cloudRoot;\n }\n\n return ensureDirectoryExists(\n join(cloudRoot.value, \"icloud-hub\", \"local-knowlege-base\"),\n );\n },\n },\n {\n optionName: \"sk\",\n optionDescription: \"参考 ~/work/smart-agent/dymamic-skills 学习 skill\",\n resolveReferenceDir: () => {\n return ensureDirectoryExists(\n join(homedir(), \"work\", \"smart-agent\", \"dynamic-skills\"),\n );\n },\n },\n] as const;\n\nexport class AiRunCommand extends AiBaseCommand<TAiRunOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"run\",\n description: \"通过 codex exec 执行 prompt,并可附带目录上下文\",\n };\n }\n\n protected _configureOptions(cmd: Command): void {\n for (const alias of AI_RUN_CONTEXT_ALIASES) {\n cmd.option(`--${alias.optionName}`, alias.optionDescription, false);\n }\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"[content...]\", \"要传给 codex 的内容\");\n }\n\n protected async _execute(\n ctx: ICommandActionContext<TAiRunOptions>,\n ): Promise<ILvErrorOr<void>> {\n const prompt = this._readPrompt(ctx);\n if (!prompt) {\n return this._makeError(1, \"请输入内容\");\n }\n\n const enhancedPrompt = this._buildPromptWithContext(ctx.options, prompt);\n if (!enhancedPrompt.ok) {\n return enhancedPrompt;\n }\n\n return this._runCommand(\"codex\", [\n \"exec\",\n \"-m\",\n \"gpt-5.4\",\n \"--full-auto\",\n enhancedPrompt.value,\n ]);\n }\n\n private _buildPromptWithContext(\n options: TAiRunOptions,\n prompt: string,\n ): ILvErrorOr<string> {\n const reminders: string[] = [];\n\n for (const alias of AI_RUN_CONTEXT_ALIASES) {\n if (!options[alias.optionName]) {\n continue;\n }\n\n const referenceDir = alias.resolveReferenceDir();\n if (!referenceDir.ok) {\n return referenceDir;\n }\n\n reminders.push(this._createSystemReminder(referenceDir.value));\n }\n\n if (reminders.length === 0) {\n return makeOkWith(prompt);\n }\n\n return makeOkWith([...reminders, prompt].join(\"\\n\"));\n }\n\n private _createSystemReminder(referenceDir: string): string {\n return `<system-reminder>\\n参考文件路径 ${referenceDir} 下,文件夹里的内容,执行用户的要求,若非用户明确要求,不要对该文件夹的内容进行修改,而是查阅里面的内容作为上下文补充比如作为信息参考,或者执行指引;\\n如果 user_prompt 里,给出一些文件路径,默认是当前执行命令路径 (cwd) 下的文件,提供的是本次要求的详细指令或者重要的参考信息\\n若用户未提及任何文件和目录,你无需读取命令执行目录下的任何内容,只需在参考文件路径下搜索相关的信息即可\\n最后给出的用户回复,无需引用参考文件目录下的具体文件,因为用户不会去看对应的文件,而且这也是内部私有信息\\n</system-reminder>\\nuser_prompt:\\n`;\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { makeError, makeOkWith } from \"../../bedrock/error\";\n\nexport function getCurrentCloudRootPath(): ILvErrorOr<string> {\n if (process.platform !== \"darwin\") {\n return makeError(1, \"`--my` 仅支持在 macOS 上使用\");\n }\n\n const cloudRootPath = join(\n homedir(),\n \"Library\",\n \"Mobile Documents\",\n \"com~apple~CloudDocs\",\n );\n\n if (!existsSync(cloudRootPath)) {\n return makeError(1, `未找到 iCloud 目录: ${cloudRootPath}`);\n }\n\n return makeOkWith(cloudRootPath);\n}\n\nexport function ensureDirectoryExists(dirPath: string): ILvErrorOr<string> {\n if (!existsSync(dirPath)) {\n return makeError(1, `未找到目录: ${dirPath}`);\n }\n\n return makeOkWith(dirPath);\n}\n","import { spawn } from \"node:child_process\";\nimport type { Dirent, Stats } from \"node:fs\";\nimport * as fs from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport * as path from \"node:path\";\nimport type { Command } from \"commander\";\nimport { makeError, makeOkWith } from \"../../bedrock/error\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport { AiBaseCommand } from \"./ai-base-command\";\n\nconst GENERATED_IMAGES_DIR = path.join(homedir(), \".codex\", \"generated_images\");\nconst CODEX_EMPTY_WORKDIR = path.join(homedir(), \".codex-empty\");\nconst CREATED_AT_TOLERANCE_MS = 1_000;\n\ninterface ICreatedEntry {\n readonly filePath: string;\n readonly createdAt: number;\n}\n\nexport class AiImageCommandV2 extends AiBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"image\",\n description: \"通过 codex exec 生成图片,并返回本地生成图片路径\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\n \"[prompt...]\",\n \"生图提示词;如有参考图,需在 prompt 中给出参考图的绝对地址\",\n );\n }\n\n protected async _execute(\n ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n const prompt = this._readPrompt(ctx);\n if (!prompt) {\n this._outputJsonError(1, \"请输入生图提示词\");\n return this._makeOk();\n }\n\n const startedAt = Date.now();\n const runResult = await this._runCodexImagePrompt(prompt);\n if (!runResult.ok) {\n this._outputJsonError(runResult.code, runResult.msg);\n return this._makeOk();\n }\n\n const imagePathResult = await findLatestGeneratedImageFile(startedAt);\n if (!imagePathResult.ok) {\n this._outputJsonError(imagePathResult.code, imagePathResult.msg);\n return this._makeOk();\n }\n\n this._outputJsonOk({\n image_path: imagePathResult.value,\n });\n return this._makeOk();\n }\n\n private async _runCodexImagePrompt(\n prompt: string,\n ): Promise<ILvErrorOr<void>> {\n try {\n await fs.mkdir(CODEX_EMPTY_WORKDIR, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return this._makeError(\n 1,\n `创建 codex 空工作目录失败: ${CODEX_EMPTY_WORKDIR}: ${message}`,\n );\n }\n\n const codexPrompt = `生成图片(使用非CLI模式来生成,使用可支持的高画质),具体要求如下: \\n ${prompt}`;\n const args = [\n \"exec\",\n \"-C\",\n CODEX_EMPTY_WORKDIR,\n \"--skip-git-repo-check\",\n \"--ephemeral\",\n \"--dangerously-bypass-approvals-and-sandbox\",\n codexPrompt,\n ];\n\n const child = spawn(\"codex\", args, {\n cwd: process.cwd(),\n stdio: \"ignore\",\n });\n\n return new Promise((resolve) => {\n child.on(\"error\", (error) => {\n resolve(\n this._makeError(\n 1,\n `执行 codex ${args.join(\" \")} 失败: ${error.message}`,\n ),\n );\n });\n\n child.on(\"close\", (code, signal) => {\n if (code === 0) {\n resolve(this._makeOk());\n return;\n }\n\n const signalText = signal ? `, signal: ${signal}` : \"\";\n resolve(\n this._makeError(\n code ?? 1,\n `执行 codex ${args.join(\" \")} 失败${signalText}`,\n ),\n );\n });\n });\n }\n}\n\nasync function findLatestGeneratedImageFile(\n minCreatedAt: number,\n): Promise<ILvErrorOr<string>> {\n const latestDirectoryResult = await findLatestCreatedDirectory(\n GENERATED_IMAGES_DIR,\n minCreatedAt,\n );\n if (!latestDirectoryResult.ok) {\n return latestDirectoryResult;\n }\n\n return findLatestCreatedFile(latestDirectoryResult.value);\n}\n\nasync function findLatestCreatedDirectory(\n directoryPath: string,\n minCreatedAt: number,\n): Promise<ILvErrorOr<string>> {\n const entriesResult = await readDirectoryEntries(directoryPath);\n if (!entriesResult.ok) {\n return entriesResult;\n }\n\n const directories = await collectCreatedEntries(\n directoryPath,\n entriesResult.value\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name),\n );\n if (!directories.ok) {\n return directories;\n }\n\n const latest = directories.value\n .filter(\n (entry) => entry.createdAt >= minCreatedAt - CREATED_AT_TOLERANCE_MS,\n )\n .sort(compareCreatedEntryDesc)[0];\n if (!latest) {\n return makeErrorForPath(\n 1,\n \"未找到本次 codex 生图输出子目录\",\n directoryPath,\n );\n }\n\n return makeOkWith(latest.filePath);\n}\n\nasync function findLatestCreatedFile(\n directoryPath: string,\n): Promise<ILvErrorOr<string>> {\n const entriesResult = await readDirectoryEntries(directoryPath);\n if (!entriesResult.ok) {\n return entriesResult;\n }\n\n const files = await collectCreatedEntries(\n directoryPath,\n entriesResult.value\n .filter((entry) => entry.isFile())\n .map((entry) => entry.name),\n );\n if (!files.ok) {\n return files;\n }\n\n const latest = files.value.sort(compareCreatedEntryDesc)[0];\n if (!latest) {\n return makeErrorForPath(1, \"最新生图输出目录中未找到文件\", directoryPath);\n }\n\n return makeOkWith(path.resolve(latest.filePath));\n}\n\nasync function readDirectoryEntries(\n directoryPath: string,\n): Promise<ILvErrorOr<Dirent[]>> {\n try {\n return makeOkWith(await fs.readdir(directoryPath, { withFileTypes: true }));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeErrorForPath(1, `读取目录失败: ${message}`, directoryPath);\n }\n}\n\nasync function collectCreatedEntries(\n parentPath: string,\n names: string[],\n): Promise<ILvErrorOr<ICreatedEntry[]>> {\n const entries: ICreatedEntry[] = [];\n\n for (const name of names) {\n const filePath = path.join(parentPath, name);\n\n try {\n const stats = await fs.stat(filePath);\n entries.push({\n filePath,\n createdAt: getCreatedAt(stats),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeErrorForPath(1, `读取路径状态失败: ${message}`, filePath);\n }\n }\n\n return makeOkWith(entries);\n}\n\nfunction getCreatedAt(stats: Stats): number {\n return stats.birthtimeMs || stats.ctimeMs || stats.mtimeMs;\n}\n\nfunction compareCreatedEntryDesc(a: ICreatedEntry, b: ICreatedEntry): number {\n return b.createdAt - a.createdAt || b.filePath.localeCompare(a.filePath);\n}\n\nfunction makeErrorForPath(\n code: number,\n message: string,\n filePath: string,\n): ILvErrorOr<never> {\n return makeError(code, `${message}: ${filePath}`);\n}\n","import * as path from \"node:path\";\nimport { Option } from \"commander\";\nimport type { Command } from \"commander\";\nimport type {\n AssetType,\n IAssetUploadResult,\n} from \"../pippit/modules/asset-upload/types\";\nimport { uploadAsset } from \"../pippit/modules/asset-upload/upload-asset\";\nimport { Region } from \"../pippit/types\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport { makeOkWith } from \"../../bedrock/error\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport { AiBaseCommand } from \"./ai-base-command\";\nimport { submitDirectCn } from \"../pippit/modules\";\n\ninterface IAiVideoOptions {\n reference: string[];\n}\n\ninterface IAiVideoAsset {\n readonly asset_id: string;\n readonly asset_type: AssetType;\n readonly file_path: string;\n readonly region: Region;\n}\n\ninterface IAiVideoGenerationPayload {\n readonly prompt: string;\n readonly assets: readonly IAiVideoAsset[];\n readonly implemented: boolean;\n}\n\nexport class AiVideoCommand extends AiBaseCommand<IAiVideoOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"video\",\n description: \"上传参考素材并调用视频生成接口\",\n };\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.addOption(\n new Option(\n \"-r, --reference <path>\",\n \"参考图片或视频路径,可重复传入,也支持用英文逗号分隔多个路径\",\n )\n .argParser(parseReferencePaths)\n .default([]),\n );\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"[content...]\", \"视频生成提示词\");\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IAiVideoOptions>,\n ): Promise<ILvErrorOr<void>> {\n const prompt = this._readPrompt(ctx);\n if (!prompt) {\n this._outputJsonError(1, \"请输入视频生成提示词\");\n return this._makeOk();\n }\n\n const uploadResult = await this._uploadReferences(ctx.options.reference);\n if (!uploadResult.ok) {\n this._outputJsonError(uploadResult.code, uploadResult.msg);\n return this._makeOk();\n }\n\n const generationResult = await this._requestVideoGeneration(\n prompt,\n uploadResult.value,\n );\n if (!generationResult.ok) {\n this._outputJsonError(generationResult.code, generationResult.msg);\n return this._makeOk();\n }\n\n this._outputJsonOk({\n prompt,\n assets: uploadResult.value,\n generation: generationResult.value,\n });\n return this._makeOk();\n }\n\n private async _uploadReferences(\n references: readonly string[],\n ): Promise<ILvErrorOr<IAiVideoAsset[]>> {\n if (references.length === 0) {\n return makeOkWith([]);\n }\n\n const uploadResults: ILvErrorOr<IAiVideoAsset>[] = await Promise.all(\n references.map(async (referencePath) => {\n const result = await uploadAsset({\n filePath: referencePath,\n region: Region.CN,\n });\n if (!result.ok) {\n return result;\n }\n\n return makeOkWith<IAiVideoAsset>({\n asset_id: result.value.assetId,\n asset_type: result.value.fileInfo.assetType,\n file_path: path.resolve(process.cwd(), referencePath),\n region: result.value.region,\n });\n }),\n );\n\n for (const result of uploadResults) {\n if (!result.ok) {\n return result;\n }\n }\n\n return makeOkWith(uploadResults.map((result) => (result as any).value));\n }\n\n private async _requestVideoGeneration(\n prompt: string,\n assets: readonly IAiVideoAsset[],\n ): Promise<ILvErrorOr<any>> {\n // TODO: 接入真实视频生成接口。当前先保留已整理好的调用入参结构。\n return submitDirectCn({\n prompt,\n imageAssetIds: assets.map((asset) => asset.asset_id),\n durationSec: 5,\n });\n }\n}\n\nfunction parseReferencePaths(value: string, previous: string[]): string[] {\n return previous.concat(\n value\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0),\n );\n}\n","const pattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nfunction isUuid(value: string): boolean {\n return pattern.test(value);\n}\n\nconst generateUuid = (() => {\n if (typeof crypto === 'object' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID.bind(crypto) as () => string;\n }\n\n let getRandomValues: (bucket: Uint8Array) => Uint8Array;\n if (typeof crypto === 'object' && typeof crypto.getRandomValues === 'function') {\n getRandomValues = crypto.getRandomValues.bind(crypto);\n } else {\n getRandomValues = function (bucket: Uint8Array): Uint8Array {\n for (let i = 0; i < bucket.length; i++) {\n bucket[i] = Math.floor(Math.random() * 256);\n }\n return bucket;\n };\n }\n\n const data = new Uint8Array(16);\n const hex: string[] = [];\n for (let i = 0; i < 256; i++) {\n hex.push(i.toString(16).padStart(2, '0'));\n }\n\n return (): string => {\n getRandomValues(data);\n data[6] = (data[6] & 15) | 64;\n data[8] = (data[8] & 63) | 128;\n let i = 0;\n let result = '';\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += '-';\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += '-';\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += '-';\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += '-';\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += hex[data[i++]];\n result += hex[data[i++]];\n return result;\n };\n})();\n\nconst generateUpperCaseUuid = (): string => generateUuid().toUpperCase();\nconst uuid = generateUuid;\nconst upperCaseUuid = generateUpperCaseUuid;\n\nexport { generateUpperCaseUuid, generateUuid, isUuid, upperCaseUuid, uuid };\n","import type { ILvErrorOr } from \"../../../../bedrock/error\";\nimport { makeError, makeOkWith } from \"../../../../bedrock/error\";\nimport { generateUuid } from \"../../../../bedrock/uuid\";\nimport { Region } from \"../../types\";\nimport { requestJson } from \"../request-json\";\nimport { readWebContext, readWebToken } from \"../web-token\";\nimport {\n missingWebContextError,\n missingWebTokenError,\n networkRequestFailedError,\n responseParseFailedError,\n} from \"../web-token/errors\";\n\nconst SUBMIT_DIRECT_URL =\n \"https://xyq.jianying.com/api/biz/v1/agent/submit_run\";\n\ninterface ISubmitDirectResponse {\n readonly ret?: string | number;\n readonly errmsg?: string;\n readonly data?: unknown;\n readonly [key: string]: unknown;\n}\n\ninterface IUserInfo {\n readonly uid: string;\n readonly workspace_id: string;\n readonly space_id: string;\n}\n\nexport interface ISubmitDirectCnOptions {\n durationSec?: number;\n imageAssetIds?: string[];\n prompt?: string;\n}\n\nexport type ISubmitDirectCnResult = unknown;\n\nfunction normalizeToken(token: string): string {\n const trimmed = token.trim();\n const prefix = \"sessionid_pippitcn_web=\";\n if (trimmed.startsWith(prefix)) {\n return trimmed.slice(prefix.length).trim();\n }\n return trimmed;\n}\n\nfunction createCookieHeader(token: string): string {\n return `sessionid_pippitcn_web=${normalizeToken(token)}`;\n}\n\nfunction parseErrorCode(ret: string | number | undefined): number {\n const parsed =\n typeof ret === \"number\"\n ? ret\n : typeof ret === \"string\"\n ? Number.parseInt(ret, 10)\n : Number.NaN;\n return Number.isFinite(parsed) ? parsed : 1;\n}\n\nfunction createUserInfo(): Promise<ILvErrorOr<IUserInfo>> {\n return readWebContext(Region.CN).then((webContextResult) => {\n if (!webContextResult.ok) {\n return webContextResult;\n }\n\n const webContext = webContextResult.value;\n if (!webContext.uid || !webContext.workspaceId || !webContext.spaceId) {\n return missingWebContextError();\n }\n\n return makeOkWith({\n uid: webContext.uid,\n workspace_id: webContext.workspaceId,\n space_id: webContext.spaceId,\n });\n });\n}\n\nexport async function submitDirectCn(\n options: ISubmitDirectCnOptions,\n): Promise<ILvErrorOr<ISubmitDirectCnResult>> {\n const userInfoResult = await createUserInfo();\n if (!userInfoResult.ok) {\n return userInfoResult;\n }\n\n const { durationSec, imageAssetIds, prompt } = options;\n\n const tokenResult = await readWebToken(Region.CN);\n if (!tokenResult.ok) {\n return tokenResult;\n }\n\n const token = tokenResult.value?.trim();\n if (!token) {\n return missingWebTokenError();\n }\n\n const threadId = generateUuid();\n const runId = generateUuid();\n\n let duration: number = 5;\n if (durationSec && durationSec <= 8 && durationSec >= 2) {\n duration = Math.round(durationSec);\n }\n\n const message = {\n message_id: \"\",\n role: \"user\",\n thread_id: threadId,\n run_id: runId,\n created_at: Date.now(),\n content: [\n {\n type: \"data\",\n sub_type: \"biz/x_data_direct_tool_call_req\",\n data: JSON.stringify({\n param: JSON.stringify({\n prompt,\n images: [\n imageAssetIds?.map((assetId) => ({\n asset_id: assetId,\n })),\n ],\n duration_sec: duration,\n language: \"zh\",\n resolution: \"720p\",\n imitation_videos: [],\n videos: [],\n audios: [],\n model: \"seedance2.0_vision\",\n }),\n tool_name: \"biz/x_tool_name_video_part\",\n }),\n hidden: false,\n is_thought: false,\n },\n ],\n };\n\n const userInfo = {\n app_id: \"795647\",\n consumer_uid: userInfoResult.value.uid,\n workspace_id: userInfoResult.value.workspace_id,\n space_id: userInfoResult.value.space_id,\n };\n\n const responseResult = await requestJson<ISubmitDirectResponse>(\n SUBMIT_DIRECT_URL,\n {\n method: \"POST\",\n headers: {\n accept: \"application/json, text/plain, */*\",\n \"content-type\": \"application/json\",\n cookie: createCookieHeader(token),\n Referer: \"https://xyq.jianying.com/\",\n },\n body: JSON.stringify({\n user_info: userInfo,\n message,\n agent_name: \"pippit_video_part_agent\",\n entrance_from: \"web\",\n run_extra: \"{}\",\n }),\n },\n {\n networkRequestFailed: (message) => networkRequestFailedError(message),\n responseParseFailed: (message) => responseParseFailedError(message),\n },\n );\n if (!responseResult.ok) {\n return responseResult;\n }\n\n const response = responseResult.value;\n console.log(\"=====response\", response);\n if (String(response.ret) !== \"0\") {\n return makeError(\n parseErrorCode(response.ret),\n response.errmsg?.trim() || \"直接提交失败。\",\n );\n }\n\n return makeOkWith(response.data);\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { Option } from \"commander\";\nimport type { Command } from \"commander\";\nimport { OPENROUTER_AK } from \"../../constants/ak\";\nimport { resolveConfigLocation } from \"../../bedrock/config/local-config\";\nimport { makeError, makeOkWith } from \"../../bedrock/error\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport { AiBaseCommand } from \"./ai-base-command\";\nimport { prepareReferenceImages } from \"./ai-image-reference\";\n\nconst VIDEO_GENERATION_URL = \"https://openrouter.ai/api/v1/videos\";\nconst VIDEO_MODEL = \"bytedance/seedance-2.0\";\nconst POLLING_LOG_FILE_NAME = \"ai-vid-polling.log\";\n\nconst POLL_INTERVAL_MS = 3_000;\nconst POLL_STATUS_LOG_INTERVAL_MS = 10_000;\nconst POLL_TIMEOUT_MS = 5 * 60 * 1000;\nconst SUBMIT_TIMEOUT_MS = 30_000;\nconst DOWNLOAD_TIMEOUT_MS = 5 * 60 * 1000;\n\ntype TResolution = \"480p\" | \"720p\";\n\ninterface IAiVidOptions {\n reference: string[];\n resolution: TResolution;\n aspectRatio?: string;\n duration?: number;\n pollingOnly: boolean;\n output?: string;\n}\n\ninterface IVideoSubmitResponse {\n readonly id: string;\n readonly polling_url: string;\n readonly status?: string;\n readonly error?: string;\n readonly [key: string]: unknown;\n}\n\ninterface IVideoPollResponse {\n readonly status?: string;\n readonly error?: string;\n readonly unsigned_urls?: readonly string[];\n readonly [key: string]: unknown;\n}\n\ninterface IOutputTarget {\n readonly directoryPath: string;\n readonly filePath: string;\n readonly autoNamed: boolean;\n}\n\nexport class AiVidCommand extends AiBaseCommand<IAiVidOptions> {\n protected _meta(): ICommandMeta {\n return {\n name: \"vid\",\n description: \"通过 OpenRouter 调用 bytedance/seedance-2.0 生成视频\",\n };\n }\n\n protected _configureOptions(cmd: Command): void {\n cmd.addOption(\n new Option(\n \"-r, --reference <path>\",\n \"参考图片本地路径,可重复传入,也支持用英文逗号分隔多个路径;最终转为 base64 data URL\",\n )\n .argParser(parseReferencePaths)\n .default([]),\n );\n cmd.addOption(\n new Option(\"--resolution <resolution>\", \"视频分辨率\")\n .choices([\"480p\", \"720p\"])\n .default(\"480p\"),\n );\n cmd.addOption(\n new Option(\n \"--aspect-ratio <ratio>\",\n \"视频长宽比,例如 16:9、9:16、1:1,缺省不指定\",\n ),\n );\n cmd.addOption(\n new Option(\n \"--duration <seconds>\",\n \"视频时长(秒),缺省不指定\",\n ).argParser(parseDuration),\n );\n cmd.addOption(\n new Option(\n \"--polling-only\",\n \"仅提交并返回 polling_url,不在本地轮询结果\",\n ).default(false),\n );\n cmd.addOption(\n new Option(\n \"-o, --output <path>\",\n \"视频下载输出路径,可传文件路径或目录路径;未传时默认写入当前目录并自动命名\",\n ),\n );\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"[content...]\", \"视频生成提示词\");\n }\n\n protected async _execute(\n ctx: ICommandActionContext<IAiVidOptions>,\n ): Promise<ILvErrorOr<void>> {\n const prompt = this._readPrompt(ctx);\n if (!prompt) {\n this._outputJsonError(1, \"请输入视频生成提示词\");\n return this._makeOk();\n }\n\n const token = resolveOpenRouterToken();\n if (!token) {\n this._outputJsonError(1, \"缺少 OPENROUTER_AK,请先配置可用的 API Key\");\n return this._makeOk();\n }\n\n const referenceResult = await prepareReferenceImages(ctx.options.reference);\n if (!referenceResult.ok) {\n this._outputJsonError(referenceResult.code, referenceResult.msg);\n return this._makeOk();\n }\n\n const requestBody: Record<string, unknown> = {\n model: VIDEO_MODEL,\n prompt,\n resolution: ctx.options.resolution,\n };\n if (ctx.options.aspectRatio) {\n requestBody.aspect_ratio = ctx.options.aspectRatio;\n }\n if (typeof ctx.options.duration === \"number\") {\n requestBody.duration = ctx.options.duration;\n }\n if (referenceResult.value.length > 0) {\n requestBody.input_references = referenceResult.value.map((item) => ({\n type: \"image_url\",\n image_url: { url: item.dataUrl },\n }));\n }\n\n const submitResult = await this._submitGeneration(requestBody, token);\n if (!submitResult.ok) {\n this._outputJsonError(submitResult.code, submitResult.msg);\n return this._makeOk();\n }\n\n const submitPayload = submitResult.value;\n const pollingUrl = submitPayload.polling_url?.trim();\n if (!pollingUrl) {\n this._outputJsonError(1, \"提交成功但返回数据缺少 polling_url\");\n return this._makeOk();\n }\n\n const logPathResult = await appendPollingUrl(pollingUrl, submitPayload.id);\n const pollingLogPath = logPathResult.ok ? logPathResult.value : undefined;\n if (!logPathResult.ok) {\n this._debug(`记录 polling_url 失败: ${logPathResult.msg}`);\n }\n\n if (ctx.options.pollingOnly) {\n this._outputJsonOk({\n polling_url: pollingUrl,\n generation_id: submitPayload.id,\n polling_log_path: pollingLogPath,\n });\n return this._makeOk();\n }\n\n const pollResult = await this._pollUntilComplete(pollingUrl, token);\n if (!pollResult.ok) {\n this._outputJsonError(pollResult.code, pollResult.msg);\n return this._makeOk();\n }\n\n const videoUrl = pollResult.value.unsigned_urls?.[0];\n if (!videoUrl) {\n this._outputJsonError(1, \"视频生成完成,但未拿到 unsigned_urls[0]\");\n return this._makeOk();\n }\n\n const outputTargetResult = await resolveOutputTarget(ctx.options.output);\n if (!outputTargetResult.ok) {\n this._outputJsonError(outputTargetResult.code, outputTargetResult.msg);\n return this._makeOk();\n }\n\n const downloadResult = await downloadVideoToFile(\n videoUrl,\n outputTargetResult.value,\n token,\n );\n if (!downloadResult.ok) {\n this._outputJsonError(downloadResult.code, downloadResult.msg);\n return this._makeOk();\n }\n\n this._outputJsonOk({\n video_path: downloadResult.value,\n video_url: videoUrl,\n polling_url: pollingUrl,\n generation_id: submitPayload.id,\n polling_log_path: pollingLogPath,\n });\n return this._makeOk();\n }\n\n private async _submitGeneration(\n requestBody: Record<string, unknown>,\n token: string,\n ): Promise<ILvErrorOr<IVideoSubmitResponse>> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), SUBMIT_TIMEOUT_MS);\n\n let response: Response;\n try {\n response = await fetch(VIDEO_GENERATION_URL, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(requestBody),\n signal: controller.signal,\n });\n } catch (error) {\n const message =\n error instanceof Error && error.name === \"AbortError\"\n ? \"请求超时\"\n : error instanceof Error\n ? error.message\n : String(error);\n return makeError(1, `提交视频生成请求失败: ${message}`);\n } finally {\n clearTimeout(timer);\n }\n\n const bodyText = await response.text().catch(() => \"\");\n const payload = parseJsonSafely<IVideoSubmitResponse>(bodyText);\n\n if (!response.ok) {\n const detail = extractErrorText(payload) ?? bodyText.trim();\n const suffix = detail ? `: ${detail}` : \"\";\n return makeError(\n response.status,\n `视频生成请求失败: HTTP ${response.status}${suffix}`,\n );\n }\n\n if (!payload) {\n return makeError(1, \"视频生成接口返回非 JSON 响应\");\n }\n\n if (payload.error) {\n return makeError(1, `视频生成请求被拒绝: ${payload.error}`);\n }\n\n if (!payload.id || !payload.polling_url) {\n return makeError(\n 1,\n `视频生成接口返回数据异常: ${bodyText.slice(0, 500)}`,\n );\n }\n\n return makeOkWith(payload);\n }\n\n private async _pollUntilComplete(\n pollingUrl: string,\n token: string,\n ): Promise<ILvErrorOr<IVideoPollResponse>> {\n const startedAt = Date.now();\n let lastStatusLogAt = 0;\n\n while (true) {\n const elapsed = Date.now() - startedAt;\n if (elapsed >= POLL_TIMEOUT_MS) {\n return makeError(\n 1,\n `轮询超时,超过 ${Math.round(POLL_TIMEOUT_MS / 1000)}s 仍未完成,可使用 --polling-only 拿到 polling_url 后稍后重试`,\n );\n }\n\n let response: Response;\n try {\n response = await fetch(pollingUrl, {\n headers: { Authorization: `Bearer ${token}` },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this._debug(`轮询请求失败,将重试: ${message}`);\n await delay(POLL_INTERVAL_MS);\n continue;\n }\n\n const bodyText = await response.text().catch(() => \"\");\n const payload = parseJsonSafely<IVideoPollResponse>(bodyText);\n\n if (!response.ok) {\n const detail = extractErrorText(payload) ?? bodyText.trim();\n return makeError(\n response.status,\n `轮询请求失败: HTTP ${response.status}${detail ? `: ${detail}` : \"\"}`,\n );\n }\n\n if (!payload) {\n this._debug(\"轮询返回非 JSON 数据,将重试\");\n await delay(POLL_INTERVAL_MS);\n continue;\n }\n\n const status = payload.status;\n\n if (status === \"completed\") {\n return makeOkWith(payload);\n }\n\n if (\n status === \"failed\" ||\n status === \"cancelled\" ||\n status === \"expired\"\n ) {\n const errorText =\n payload.error?.trim() || `视频生成结束于状态 ${status}`;\n return makeError(1, errorText);\n }\n\n const now = Date.now();\n if (now - lastStatusLogAt >= POLL_STATUS_LOG_INTERVAL_MS) {\n this._debug(\n `视频生成状态: ${status ?? \"unknown\"} (已等待 ${Math.round(elapsed / 1000)}s)`,\n );\n lastStatusLogAt = now;\n }\n\n await delay(POLL_INTERVAL_MS);\n }\n }\n}\n\nfunction resolveOpenRouterToken(): string {\n return process.env.OPENROUTER_AK?.trim() || OPENROUTER_AK;\n}\n\nfunction parseReferencePaths(value: string, previous: string[]): string[] {\n return previous.concat(\n value\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0),\n );\n}\n\nfunction parseDuration(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`duration 需要是正整数,收到: ${value}`);\n }\n return parsed;\n}\n\nfunction parseJsonSafely<T>(text: string): T | undefined {\n if (!text.trim()) {\n return undefined;\n }\n try {\n return JSON.parse(text) as T;\n } catch {\n return undefined;\n }\n}\n\nfunction extractErrorText(payload: unknown): string | undefined {\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n const record = payload as Record<string, unknown>;\n if (typeof record.error === \"string\" && record.error.trim().length > 0) {\n return record.error.trim();\n }\n if (record.error && typeof record.error === \"object\") {\n const inner = record.error as { message?: unknown };\n if (typeof inner.message === \"string\" && inner.message.trim().length > 0) {\n return inner.message.trim();\n }\n }\n if (typeof record.message === \"string\" && record.message.trim().length > 0) {\n return record.message.trim();\n }\n return undefined;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function appendPollingUrl(\n pollingUrl: string,\n generationId: string,\n): Promise<ILvErrorOr<string>> {\n const locationResult = await resolveConfigLocation();\n if (!locationResult.ok) {\n return locationResult;\n }\n\n const logFilePath = path.join(\n locationResult.value.configDir,\n POLLING_LOG_FILE_NAME,\n );\n\n try {\n await fs.mkdir(locationResult.value.configDir, { recursive: true });\n const line = `${new Date().toISOString()}\\t${generationId}\\t${pollingUrl}\\n`;\n await fs.appendFile(logFilePath, line, \"utf8\");\n return makeOkWith(logFilePath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(1, `写入 polling 日志失败 ${logFilePath}: ${message}`);\n }\n}\n\nasync function resolveOutputTarget(\n outputPath: string | undefined,\n): Promise<ILvErrorOr<IOutputTarget>> {\n if (!outputPath) {\n const directoryPath = process.cwd();\n return makeOkWith({\n directoryPath,\n filePath: path.join(directoryPath, buildAutoFileName()),\n autoNamed: true,\n });\n }\n\n const resolvedPath = path.resolve(process.cwd(), outputPath);\n\n try {\n const stats = await fs.stat(resolvedPath);\n if (stats.isDirectory()) {\n return makeOkWith({\n directoryPath: resolvedPath,\n filePath: path.join(resolvedPath, buildAutoFileName()),\n autoNamed: true,\n });\n }\n return makeOkWith({\n directoryPath: path.dirname(resolvedPath),\n filePath: resolvedPath,\n autoNamed: false,\n });\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code !== \"ENOENT\") {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(1, `读取输出路径失败: ${resolvedPath}: ${message}`);\n }\n\n if (path.extname(resolvedPath)) {\n return makeOkWith({\n directoryPath: path.dirname(resolvedPath),\n filePath: resolvedPath,\n autoNamed: false,\n });\n }\n\n return makeOkWith({\n directoryPath: resolvedPath,\n filePath: path.join(resolvedPath, buildAutoFileName()),\n autoNamed: true,\n });\n }\n}\n\nasync function downloadVideoToFile(\n remoteUrl: string,\n target: IOutputTarget,\n token: string,\n): Promise<ILvErrorOr<string>> {\n try {\n await fs.mkdir(target.directoryPath, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(\n 1,\n `创建输出目录失败: ${target.directoryPath}: ${message}`,\n );\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), DOWNLOAD_TIMEOUT_MS);\n\n let response: Response;\n try {\n response = await fetch(remoteUrl, {\n headers: { Authorization: `Bearer ${token}` },\n signal: controller.signal,\n });\n } catch (error) {\n const message =\n error instanceof Error && error.name === \"AbortError\"\n ? \"下载超时\"\n : error instanceof Error\n ? error.message\n : String(error);\n return makeError(1, `下载视频失败: ${message}`);\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n const detail = await response.text().catch(() => \"\");\n const suffix = detail.trim() ? `: ${detail.trim().slice(0, 500)}` : \"\";\n return makeError(\n response.status,\n `下载视频失败: HTTP ${response.status}${suffix}`,\n );\n }\n\n const bytes = Buffer.from(await response.arrayBuffer());\n const targetPath = target.autoNamed\n ? replaceFileExtension(\n target.filePath,\n inferVideoExtension(remoteUrl, response),\n )\n : target.filePath;\n\n try {\n await fs.writeFile(targetPath, bytes);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(1, `写入视频失败: ${targetPath}: ${message}`);\n }\n\n return makeOkWith(path.resolve(targetPath));\n}\n\nfunction buildAutoFileName(): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n return `ai-vid-${timestamp}.mp4`;\n}\n\nfunction replaceFileExtension(filePath: string, extension: string): string {\n const ext = path.extname(filePath);\n if (!ext) {\n return `${filePath}.${extension}`;\n }\n return `${filePath.slice(0, -ext.length)}.${extension}`;\n}\n\nfunction inferVideoExtension(remoteUrl: string, response: Response): string {\n const contentType = response.headers.get(\"content-type\")?.toLowerCase() ?? \"\";\n if (contentType.includes(\"mp4\")) {\n return \"mp4\";\n }\n if (contentType.includes(\"webm\")) {\n return \"webm\";\n }\n if (contentType.includes(\"quicktime\") || contentType.includes(\"mov\")) {\n return \"mov\";\n }\n\n try {\n const url = new URL(remoteUrl);\n const ext = path.extname(url.pathname).toLowerCase();\n if (ext === \".mp4\" || ext === \".webm\" || ext === \".mov\") {\n return ext.slice(1);\n }\n } catch {\n // ignore parse failure\n }\n\n return \"mp4\";\n}\n","import * as fs from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { makeError, makeOkWith } from \"../../bedrock/error\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\n\nconst execFileAsync = promisify(execFile);\n\nexport const MAX_REFERENCE_IMAGE_BYTES = 2 * 1024 * 1024;\nexport const MAX_REFERENCE_IMAGE_COUNT = 14;\n\nconst API_SUPPORTED_MIME_TYPES = new Set([\n \"image/jpeg\",\n \"image/png\",\n \"image/webp\",\n \"image/bmp\",\n \"image/tiff\",\n \"image/gif\",\n]);\n\ninterface IDetectedMimeType {\n readonly mimeType: string;\n readonly extension: string;\n}\n\nexport interface IPreparedReferenceImage {\n readonly inputPath: string;\n readonly resolvedPath: string;\n readonly sourceMimeType: string;\n readonly requestMimeType: string;\n readonly originalBytes: number;\n readonly finalBytes: number;\n readonly compressed: boolean;\n readonly dataUrl: string;\n}\n\nexport async function prepareReferenceImages(\n filePaths: readonly string[],\n): Promise<ILvErrorOr<IPreparedReferenceImage[]>> {\n if (filePaths.length > MAX_REFERENCE_IMAGE_COUNT) {\n return makeError(\n 1,\n `参考图最多支持 ${MAX_REFERENCE_IMAGE_COUNT} 张,当前传入 ${filePaths.length} 张。`,\n );\n }\n\n const preparedImages: IPreparedReferenceImage[] = [];\n\n for (const filePath of filePaths) {\n const prepared = await prepareReferenceImage(filePath);\n if (!prepared.ok) {\n return prepared;\n }\n preparedImages.push(prepared.value);\n }\n\n return makeOkWith(preparedImages);\n}\n\nasync function prepareReferenceImage(\n filePath: string,\n): Promise<ILvErrorOr<IPreparedReferenceImage>> {\n const resolvedPath = path.resolve(process.cwd(), filePath);\n\n let stats;\n try {\n stats = await fs.stat(resolvedPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(1, `读取参考图失败: ${resolvedPath}: ${message}`);\n }\n\n if (!stats.isFile()) {\n return makeError(1, `参考图不是文件: ${resolvedPath}`);\n }\n\n let fileBytes: Buffer;\n try {\n fileBytes = await fs.readFile(resolvedPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(1, `读取参考图内容失败: ${resolvedPath}: ${message}`);\n }\n\n const detectedType = detectMimeType(fileBytes, resolvedPath);\n if (!detectedType) {\n return makeError(1, `参考图不是支持的图片格式: ${resolvedPath}`);\n }\n\n const needsTranscode =\n !API_SUPPORTED_MIME_TYPES.has(detectedType.mimeType) ||\n fileBytes.byteLength > MAX_REFERENCE_IMAGE_BYTES;\n\n if (!needsTranscode) {\n return makeOkWith({\n inputPath: filePath,\n resolvedPath,\n sourceMimeType: detectedType.mimeType,\n requestMimeType: detectedType.mimeType,\n originalBytes: fileBytes.byteLength,\n finalBytes: fileBytes.byteLength,\n compressed: false,\n dataUrl: toDataUrl(detectedType.mimeType, fileBytes),\n });\n }\n\n const compressed = await compressImageForReference(resolvedPath);\n if (!compressed.ok) {\n return compressed;\n }\n\n return makeOkWith({\n inputPath: filePath,\n resolvedPath,\n sourceMimeType: detectedType.mimeType,\n requestMimeType: compressed.value.mimeType,\n originalBytes: fileBytes.byteLength,\n finalBytes: compressed.value.bytes.byteLength,\n compressed: true,\n dataUrl: toDataUrl(compressed.value.mimeType, compressed.value.bytes),\n });\n}\n\nfunction detectMimeType(\n fileBytes: Buffer,\n filePath: string,\n): IDetectedMimeType | undefined {\n if (\n fileBytes.length >= 3 &&\n fileBytes[0] === 0xff &&\n fileBytes[1] === 0xd8 &&\n fileBytes[2] === 0xff\n ) {\n return { mimeType: \"image/jpeg\", extension: \"jpeg\" };\n }\n\n if (\n fileBytes.length >= 8 &&\n fileBytes[0] === 0x89 &&\n fileBytes[1] === 0x50 &&\n fileBytes[2] === 0x4e &&\n fileBytes[3] === 0x47 &&\n fileBytes[4] === 0x0d &&\n fileBytes[5] === 0x0a &&\n fileBytes[6] === 0x1a &&\n fileBytes[7] === 0x0a\n ) {\n return { mimeType: \"image/png\", extension: \"png\" };\n }\n\n if (fileBytes.length >= 6) {\n const gifHeader = fileBytes.subarray(0, 6).toString(\"ascii\");\n if (gifHeader === \"GIF87a\" || gifHeader === \"GIF89a\") {\n return { mimeType: \"image/gif\", extension: \"gif\" };\n }\n }\n\n if (\n fileBytes.length >= 12 &&\n fileBytes.subarray(0, 4).toString(\"ascii\") === \"RIFF\" &&\n fileBytes.subarray(8, 12).toString(\"ascii\") === \"WEBP\"\n ) {\n return { mimeType: \"image/webp\", extension: \"webp\" };\n }\n\n if (fileBytes.length >= 2 && fileBytes.subarray(0, 2).toString(\"ascii\") === \"BM\") {\n return { mimeType: \"image/bmp\", extension: \"bmp\" };\n }\n\n if (\n fileBytes.length >= 4 &&\n ((fileBytes[0] === 0x49 &&\n fileBytes[1] === 0x49 &&\n fileBytes[2] === 0x2a &&\n fileBytes[3] === 0x00) ||\n (fileBytes[0] === 0x4d &&\n fileBytes[1] === 0x4d &&\n fileBytes[2] === 0x00 &&\n fileBytes[3] === 0x2a))\n ) {\n return { mimeType: \"image/tiff\", extension: \"tiff\" };\n }\n\n if (fileBytes.length >= 12 && fileBytes.subarray(4, 8).toString(\"ascii\") === \"ftyp\") {\n const brand = fileBytes.subarray(8, 12).toString(\"ascii\").trim();\n if (brand.startsWith(\"avif\") || brand === \"avis\") {\n return { mimeType: \"image/avif\", extension: \"avif\" };\n }\n if (\n brand.startsWith(\"hei\") ||\n brand.startsWith(\"hev\") ||\n brand === \"mif1\" ||\n brand === \"msf1\"\n ) {\n return { mimeType: \"image/heic\", extension: \"heic\" };\n }\n }\n\n const ext = path.extname(filePath).toLowerCase();\n switch (ext) {\n case \".jpg\":\n case \".jpeg\":\n return { mimeType: \"image/jpeg\", extension: \"jpeg\" };\n case \".png\":\n return { mimeType: \"image/png\", extension: \"png\" };\n case \".gif\":\n return { mimeType: \"image/gif\", extension: \"gif\" };\n case \".webp\":\n return { mimeType: \"image/webp\", extension: \"webp\" };\n case \".bmp\":\n return { mimeType: \"image/bmp\", extension: \"bmp\" };\n case \".tif\":\n case \".tiff\":\n return { mimeType: \"image/tiff\", extension: \"tiff\" };\n case \".heic\":\n case \".heif\":\n return { mimeType: \"image/heic\", extension: \"heic\" };\n case \".avif\":\n return { mimeType: \"image/avif\", extension: \"avif\" };\n default:\n return undefined;\n }\n}\n\nasync function compressImageForReference(\n sourcePath: string,\n): Promise<ILvErrorOr<{ mimeType: string; bytes: Buffer }>> {\n if (process.platform !== \"darwin\") {\n return makeError(\n 1,\n `参考图需要压缩或转码,但当前平台 ${process.platform} 未实现自动处理。`,\n );\n }\n\n const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), \"tt-ai-image-\"));\n try {\n const dimensions = await readImageDimensions(sourcePath);\n const maxDimension = Math.max(dimensions.width, dimensions.height);\n const resizeLimits = uniqueNumbers([\n maxDimension,\n Math.floor(maxDimension * 0.85),\n Math.floor(maxDimension * 0.7),\n Math.floor(maxDimension * 0.55),\n Math.floor(maxDimension * 0.4),\n ]).filter((value) => value >= 64);\n const qualityLevels = [85, 75, 65, 55, 45, 35];\n\n let attemptIndex = 0;\n for (const resizeLimit of resizeLimits) {\n for (const quality of qualityLevels) {\n const targetPath = path.join(tempDir, `compressed-${attemptIndex}.jpeg`);\n attemptIndex += 1;\n\n await runSips([\n \"--setProperty\",\n \"format\",\n \"jpeg\",\n \"--setProperty\",\n \"formatOptions\",\n String(quality),\n sourcePath,\n \"--out\",\n targetPath,\n ]);\n\n if (resizeLimit < maxDimension) {\n await runSips([\"-Z\", String(resizeLimit), targetPath]);\n }\n\n const compressedBytes = await fs.readFile(targetPath);\n if (compressedBytes.byteLength <= MAX_REFERENCE_IMAGE_BYTES) {\n return makeOkWith({\n mimeType: \"image/jpeg\",\n bytes: compressedBytes,\n });\n }\n }\n }\n\n return makeError(1, `参考图压缩失败,无法压缩到 2MB 以内: ${sourcePath}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return makeError(1, `处理参考图失败: ${sourcePath}: ${message}`);\n } finally {\n await fs.rm(tempDir, { recursive: true, force: true });\n }\n}\n\nasync function readImageDimensions(\n sourcePath: string,\n): Promise<{ width: number; height: number }> {\n const { stdout } = await runSips([\n \"-g\",\n \"pixelWidth\",\n \"-g\",\n \"pixelHeight\",\n sourcePath,\n ]);\n\n const width = readSipsMetric(stdout, \"pixelWidth\");\n const height = readSipsMetric(stdout, \"pixelHeight\");\n if (!width || !height) {\n throw new Error(\"无法读取图片尺寸\");\n }\n\n return { width, height };\n}\n\nasync function runSips(args: readonly string[]) {\n return execFileAsync(\"/usr/bin/sips\", [...args]);\n}\n\nfunction readSipsMetric(output: string, key: string): number | undefined {\n const matcher = new RegExp(`${key}:\\\\s*(\\\\d+)`);\n const matched = output.match(matcher);\n if (!matched) {\n return undefined;\n }\n\n const value = Number.parseInt(matched[1], 10);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction uniqueNumbers(values: readonly number[]): number[] {\n return [...new Set(values)];\n}\n\nfunction toDataUrl(mimeType: string, fileBytes: Buffer): string {\n const suffix = mimeType.replace(\"image/\", \"\");\n return `data:image/${suffix};base64,${fileBytes.toString(\"base64\")}`;\n}\n","import { spawn } from \"node:child_process\";\nimport type { Command } from \"commander\";\nimport { makeError, makeOkWith } from \"../../bedrock/error\";\nimport type { ILvErrorOr } from \"../../bedrock/error\";\nimport type { ICommandActionContext } from \"../../core/base-command\";\nimport type { ICommandMeta } from \"../../core/command-types\";\nimport { AiBaseCommand } from \"./ai-base-command\";\n\nconst BIN = \"xx\";\nconst PPE_ENV = \"ppe_new_login_cli\";\nconst POLL_INTERVAL_MS = 5_000;\nconst POLL_TIMEOUT_MS = 10 * 60 * 1000;\nconst RUNNING_STATUS = \"running\";\n\ninterface ICommandOutput {\n readonly stdout: string;\n readonly stderr: string;\n}\n\nexport class AiQueryTaskCommand extends AiBaseCommand {\n protected _meta(): ICommandMeta {\n return {\n name: \"querytask\",\n description:\n \"轮询 xx query-video-direct 任务结果,running 时自动重试直至完成或超时\",\n };\n }\n\n protected _configureArguments(cmd: Command): void {\n cmd.argument(\"<task_id>\", \"要查询的任务 ID\");\n }\n\n protected async _execute(\n ctx: ICommandActionContext,\n ): Promise<ILvErrorOr<void>> {\n const taskId = String(ctx.args[0] ?? \"\").trim();\n if (!taskId) {\n return this._makeError(1, \"请传入 task_id\");\n }\n\n const startedAt = Date.now();\n\n while (true) {\n const queryResult = await this._runQuery(taskId);\n if (!queryResult.ok) {\n return this._makeError(queryResult.code, queryResult.msg);\n }\n\n const { stdout, stderr } = queryResult.value;\n const status = extractStatus(stdout);\n\n if (status !== RUNNING_STATUS) {\n if (stderr.trim().length > 0) {\n process.stderr.write(stderr);\n }\n process.stdout.write(stdout.endsWith(\"\\n\") ? stdout : `${stdout}\\n`);\n return this._makeOk();\n }\n\n const elapsed = Date.now() - startedAt;\n if (elapsed + POLL_INTERVAL_MS >= POLL_TIMEOUT_MS) {\n return this._makeError(\n 1,\n `轮询超时 ${Math.round(POLL_TIMEOUT_MS / 1000)}s,任务 ${taskId} 仍为 ${RUNNING_STATUS} 状态`,\n );\n }\n\n await delay(POLL_INTERVAL_MS);\n }\n }\n\n private _runQuery(taskId: string): Promise<ILvErrorOr<ICommandOutput>> {\n const args = [\n \"query-video-direct\",\n \"--task-id\",\n taskId,\n \"--ppe-env\",\n PPE_ENV,\n \"--json\",\n ];\n\n return new Promise((resolve) => {\n const child = spawn(BIN, args, { cwd: process.cwd() });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n\n child.on(\"error\", (error) => {\n resolve(\n makeError(\n 1,\n `执行 ${BIN} ${args.join(\" \")} 失败: ${error.message}`,\n ),\n );\n });\n\n child.on(\"close\", (code, signal) => {\n if (code === 0) {\n resolve(makeOkWith({ stdout, stderr }));\n return;\n }\n\n const signalText = signal ? `, signal: ${signal}` : \"\";\n const stderrText = stderr.trim() ? `\\n${stderr.trim()}` : \"\";\n resolve(\n makeError(\n code ?? 1,\n `执行 ${BIN} ${args.join(\" \")} 失败${signalText}${stderrText}`,\n ),\n );\n });\n });\n }\n}\n\nfunction extractStatus(stdout: string): string | undefined {\n const trimmed = stdout.trim();\n if (!trimmed) {\n return undefined;\n }\n\n const parsed = tryParseJson(trimmed);\n if (!parsed || typeof parsed !== \"object\") {\n return undefined;\n }\n\n const record = parsed as Record<string, unknown>;\n if (typeof record.status === \"string\" && record.status.trim()) {\n return record.status.trim();\n }\n\n const data = record.data;\n if (data && typeof data === \"object\") {\n const dataRecord = data as Record<string, unknown>;\n if (typeof dataRecord.status === \"string\" && dataRecord.status.trim()) {\n return dataRecord.status.trim();\n }\n }\n\n return undefined;\n}\n\nfunction tryParseJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { ICommandMeta } from \"../../core/command-types\";\nimport { BaseSubcommandHost } from \"../../core/base-subcommand-host\";\nimport { AiWebSearchCommand } from \"./ai-websearch-command\";\nimport { AiCursorCommand } from \"./ai-cursor-command\";\nimport { AiCodexCommand } from \"./ai-codex-command\";\nimport { AiRunCommand } from \"./ai-run-command\";\nimport { AiImageCommandV2 } from \"./ai-image-command-v2\";\nimport { AiVideoCommand } from \"./ai-video-command\";\nimport { AiVidCommand } from \"./ai-vid-command\";\nimport { AiQueryTaskCommand } from \"./ai-querytask-command\";\n\nexport class AiCommand extends BaseSubcommandHost {\n protected _meta(): ICommandMeta {\n return {\n name: \"ai\",\n description: \"AI 辅助命令\",\n };\n }\n\n protected _registerSubcommands(): void {\n this._addSubcommand(new AiWebSearchCommand());\n this._addSubcommand(new AiCursorCommand());\n this._addSubcommand(new AiCodexCommand());\n this._addSubcommand(new AiRunCommand());\n this._addSubcommand(new AiImageCommandV2());\n this._addSubcommand(new AiVideoCommand());\n this._addSubcommand(new AiVidCommand());\n this._addSubcommand(new AiQueryTaskCommand());\n }\n}\n"],"mappings":"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","names":["responseParseFailed","GetThreadError","Option","fs","path","Option","Option","BASE","FornaxSearchError","networkRequestFailedError","requestJson","networkRequestFailedError","requestJson","CONFIG","getSearchUrl","getSearchReferer","getTimeWindow","getDetailUrl","requestJson","result","Option","fs","path","Option","Option","path","Option","fs","path","BASE","WebTokenError","networkRequestFailedError","responseParseFailedError","normalizeToken","requestJson","networkRequestFailedError","responseParseFailedError","BASE","AssetUploadError","networkRequestFailedError","responseParseFailedError","networkRequestFailedError","responseParseFailedError","Option","Option","Option","Option","BASE","AssetGetError","missingWebContextError","networkRequestFailedError","responseParseFailedError","i18nNotSupportedError","normalizeToken","createCookieHeader","missingWebContextError","networkRequestFailedError","responseParseFailedError","i18nNotSupportedError","Option","homedir","join","resolve","join","homedir","homedir","join","join","homedir","homedir","join","join","homedir","spawn","spawn","resolve","homedir","join","existsSync","homedir","join","join","homedir","existsSync","join","homedir","spawn","fs","homedir","path","homedir","spawn","resolve","path","Option","normalizeToken","createCookieHeader","parseErrorCode","message","networkRequestFailedError","responseParseFailedError","Option","fs","path","Option","fs","os","path","Option","parseReferencePaths","resolve","spawn","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","delay","resolve","spawn","require"]}