maoda-commander-tt 0.0.10 → 0.0.12
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 +4 -2
- package/dist/main.js.map +1 -1
- package/package.json +3 -2
package/dist/main.js
CHANGED
|
@@ -2423,8 +2423,10 @@ var AiRunCommand = class extends AiBaseCommand {
|
|
|
2423
2423
|
}
|
|
2424
2424
|
_createSystemReminder(referenceDir) {
|
|
2425
2425
|
return `<system-reminder>
|
|
2426
|
-
\u53C2\u8003 ${referenceDir} \u6587\u4EF6\u5939\u7684\u5185\u5BB9\uFF0C\u6267\u884C\u7528\u6237\u7684\u8981\u6C42\uFF0C\u82E5\u975E\u7528\u6237\u660E\u786E\u8981\u6C42\uFF0C\u4E0D\u8981\u5BF9\u8BE5\u6587\u4EF6\u5939\u7684\u5185\u5BB9\u8FDB\u884C\u4FEE\u6539\uFF0C\u800C\u662F\u67E5\u9605\u91CC\u9762\u7684\u5185\u5BB9\u4F5C\u4E3A\u4E0A\u4E0B\u6587\u8865\u5145\u6BD4\u5982\u4F5C\u4E3A\u4FE1\u606F\u53C2\u8003\uFF0C\u6216\u8005\u6267\u884C\u6307\u5F15\uFF1B
|
|
2427
|
-
\u5982\u679C user_prompt \u91CC\uFF0C\u7ED9\u51FA\u4E00\u4E9B\u6587\u4EF6\
|
|
2426
|
+
\u53C2\u8003\u6587\u4EF6\u8DEF\u5F84 ${referenceDir} \u6587\u4EF6\u5939\u7684\u5185\u5BB9\uFF0C\u6267\u884C\u7528\u6237\u7684\u8981\u6C42\uFF0C\u82E5\u975E\u7528\u6237\u660E\u786E\u8981\u6C42\uFF0C\u4E0D\u8981\u5BF9\u8BE5\u6587\u4EF6\u5939\u7684\u5185\u5BB9\u8FDB\u884C\u4FEE\u6539\uFF0C\u800C\u662F\u67E5\u9605\u91CC\u9762\u7684\u5185\u5BB9\u4F5C\u4E3A\u4E0A\u4E0B\u6587\u8865\u5145\u6BD4\u5982\u4F5C\u4E3A\u4FE1\u606F\u53C2\u8003\uFF0C\u6216\u8005\u6267\u884C\u6307\u5F15\uFF1B
|
|
2427
|
+
\u5982\u679C user_prompt \u91CC\uFF0C\u7ED9\u51FA\u4E00\u4E9B\u6587\u4EF6\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u662F\u5F53\u524D\u6267\u884C\u547D\u4EE4\u8DEF\u5F84 (cwd) \u4E0B\u7684\u6587\u4EF6\uFF0C\u63D0\u4F9B\u7684\u662F\u672C\u6B21\u8981\u6C42\u7684\u8BE6\u7EC6\u6307\u4EE4\u6216\u8005\u91CD\u8981\u7684\u53C2\u8003\u4FE1\u606F
|
|
2428
|
+
\u82E5\u7528\u6237\u672A\u63D0\u53CA\u4EFB\u4F55\u6587\u4EF6\u548C\u76EE\u5F55\uFF0C\u4F60\u65E0\u9700\u8BFB\u53D6\u547D\u4EE4\u6267\u884C\u76EE\u5F55\u4E0B\u7684\u4EFB\u4F55\u5185\u5BB9\uFF0C\u53EA\u9700\u5728\u53C2\u8003\u6587\u4EF6\u8DEF\u5F84\u4E0B\u641C\u7D22\u76F8\u5173\u7684\u4FE1\u606F\u5373\u53EF
|
|
2429
|
+
\u6700\u540E\u7ED9\u51FA\u7684\u7528\u6237\u56DE\u590D\uFF0C\u65E0\u9700\u5F15\u7528\u53C2\u8003\u6587\u4EF6\u76EE\u5F55\u4E0B\u7684\u5177\u4F53\u6587\u4EF6\uFF0C\u56E0\u4E3A\u7528\u6237\u4E0D\u4F1A\u53BB\u770B\u5BF9\u5E94\u7684\u6587\u4EF6\uFF0C\u800C\u4E14\u8FD9\u4E5F\u662F\u5185\u90E8\u79C1\u6709\u4FE1\u606F
|
|
2428
2430
|
</system-reminder>
|
|
2429
2431
|
user_prompt:
|
|
2430
2432
|
`;
|
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-command.ts","../src/commands/shortcut/shortcut-command.ts","../src/commands/ai/ai-base-command.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-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]\", \"提交消息\", \"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(1, `执行 git ${args.join(\" \")} 失败: ${result.error.message}`);\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(\n result.status ?? 1,\n `打开浏览器失败${signalText}`,\n );\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 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 { 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 }\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","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\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 = \"45442605-446b-4184-aac4-9d577aa1764c\";\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</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 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\";\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 }\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","spawn","spawn","resolve","homedir","join","existsSync","homedir","join","join","homedir","existsSync","join","homedir","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-command.ts","../src/commands/shortcut/shortcut-command.ts","../src/commands/ai/ai-base-command.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-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]\", \"提交消息\", \"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(1, `执行 git ${args.join(\" \")} 失败: ${result.error.message}`);\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(\n result.status ?? 1,\n `打开浏览器失败${signalText}`,\n );\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 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 { 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 }\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","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\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 = \"45442605-446b-4184-aac4-9d577aa1764c\";\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 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\";\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 }\n}\n"],"mappings":";;;;;;;;;;;AAEA,SAAS,qBAAqB;;;ACQvB,IAAM,oBAAN,cAAgC,YAAgC;AAAA,EAC3D,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEU,oBAAoB,KAAoB;AAChD,QAAI,SAAS,UAAU,oDAAY,OAAO;AAAA,EAC5C;AAAA,EAEU,kBAAkB,KAAoB;AAC9C,QAAI,OAAO,mBAAmB,8CAAW,KAAK;AAAA,EAChD;AAAA,EAEA,MAAgB,SACd,KAC2B;AAC3B,UAAM,OAAO,IAAI,KAAK,CAAC;AACvB,UAAM,EAAE,UAAU,IAAI,IAAI;AAE1B,QAAI,UAAU,UAAU,IAAI;AAC5B,QAAI,WAAW;AACb,gBAAU,QAAQ,YAAY;AAAA,IAChC;AAEA,SAAK,cAAc,EAAE,QAAQ,CAAC;AAC9B,WAAO,KAAK,QAAQ;AAAA,EACtB;AACF;;;ACnCO,IAAM,mBAAN,cAA+B,YAAY;AAAA,EACtC,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAgB,SACd,MAC2B;AAC3B,SAAK,cAAc;AAAA,MACjB,SAAS;AAAA,MACT,aAAa;AAAA,IACf,CAAC;AACD,WAAO,KAAK,QAAQ;AAAA,EACtB;AACF;;;ACjBO,IAAM,eAAN,cAA2B,mBAAmB;AAAA,EACzC,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS,CAAC,IAAI;AAAA,IAChB;AAAA,EACF;AAAA,EAEU,uBAA6B;AACrC,SAAK,eAAe,IAAI,kBAAkB,CAAC;AAC3C,SAAK,eAAe,IAAI,iBAAiB,CAAC;AAAA,EAC5C;AACF;;;ACdA,SAAS,cAA4B;;;ACQrC,eAAe,aACb,UACA,KACAA,sBACwB;AACxB,QAAM,WAAW,MAAM,SAAS,KAAK;AACrC,MAAI;AACF,WAAO,WAAW,KAAK,MAAM,QAAQ,CAAM;AAAA,EAC7C,SAAS,OAAO;AACd,UAAM,QAAQ,iBAAiB,QAAQ,KAAK,MAAM,OAAO,MAAM;AAC/D,WAAOA,qBAAoB,qDAAkB,GAAG,GAAG,KAAK,EAAE;AAAA,EAC5D;AACF;AAEA,eAAsB,YACpB,KACA,MACA,UACwB;AACxB,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,MAAM,KAAK,IAAI;AAAA,EAClC,SAAS,OAAO;AACd,UAAM,QAAQ,iBAAiB,QAAQ,KAAK,MAAM,OAAO,MAAM;AAC/D,WAAO,SAAS,qBAAqB,yCAAW,GAAG,GAAG,KAAK,EAAE;AAAA,EAC/D;AAEA,MACE,SAAS,sBACR,SAAS,WAAW,OAAO,SAAS,WAAW,MAChD;AACA,WAAO,SAAS,kBAAkB;AAAA,EACpC;AAEA,MAAI,SAAS,aAAa,CAAC,SAAS,IAAI;AACtC,WAAO,SAAS;AAAA,MACd,iCAAa,SAAS,MAAM,IAAI,SAAS,UAAU,KAAK,GAAG;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAEA,SAAO,aAAgB,UAAU,KAAK,SAAS,mBAAmB;AACpE;;;ACpDA,IAAM,OAAO;AAEN,IAAK,kBAAL,CAAKC,oBAAL;AACL,EAAAA,gCAAA,qBAAkB,OAAO,KAAzB;AACA,EAAAA,gCAAA,0BAAuB,OAAO,KAA9B;AACA,EAAAA,gCAAA,yBAAsB,OAAO,KAA7B;AACA,EAAAA,gCAAA,oBAAiB,OAAO,KAAxB;AAJU,SAAAA;AAAA,GAAA;AAOL,IAAM,uBAAuB;AAAA,EAClC,eAAe;AAAA,EACf;AACF;AAEO,IAAM,4BAA4B;AAAA,EACvC,eAAe;AAAA,EACf;AACF;AAEO,IAAM,sBAAsB;AAAA,EACjC,eAAe;AAAA,EACf;AACF;AAEO,IAAM,sBAAsB;AAAA,EACjC,eAAe;AAAA,EACf;AACF;;;AClBA,IAAM,iBAAyC;AAAA,EAC7C,cAAU,GACR;AAAA,EACF,kBAAY,GACV;AACJ;AAEA,IAAM,qBAA6C;AAAA,EACjD,cAAU,GAAG;AAAA,EACb,kBAAY,GAAG;AACjB;AAEA,eAAsB,YACpB,UACA,QACkC;AAClC,QAAM,MAAM,eAAe,MAAM;AACjC,QAAM,UAAU,mBAAmB,MAAM;AAEzC,QAAM,SAAS,MAAM,YAAiD,KAAK;AAAA,IACzE,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,mBAAmB;AAAA,MACnB,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,SAAS;AAAA,IACX;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB,QAAQ,CAAC,qBAAqB;AAAA,MAC9B,WAAW;AAAA,IACb,CAAC;AAAA,EACH,GAAG;AAAA,IACD,sBAAsB,CAAC,YAAY,0BAA0B,OAAO;AAAA,IACpE,qBAAqB,CAAC,YAAY,oBAAoB,OAAO;AAAA,EAC/D,CAAC;AACD,MAAI,CAAC,OAAO,IAAI;AACd,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,OAAO,MAAM;AACnC,MAAI,CAAC,QAAQ,UAAU;AACrB,WAAO,oBAAoB;AAAA,EAC7B;AAEA,SAAO,WAAW,MAAM;AAC1B;;;ACvDA,IAAM,iBAAoC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,qBAAwC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,kBAAqC,CAAC,QAAQ,UAAU;AAE9D,SAAS,SACP,KACA,MACM;AACN,aAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,QAAI,CAAC,KAAK,SAAS,GAAG,GAAG;AACvB,aAAO,IAAI,GAAG;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,aAAa,UAAkD;AACtE,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI;AACF,UAAM,QAAQ,KAAK,MAAM,QAAQ;AACjC,WAAO,OAAO;AAAA,EAChB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,YAAY,SAA+B;AAClD,WAAS,SAAS,kBAAkB;AACpC,MAAI,MAAM,QAAQ,QAAQ,OAAO,GAAG;AAClC,eAAW,QAAQ,QAAQ,SAA0B;AACnD,eAAS,MAAM,eAAe;AAAA,IAChC;AAAA,EACF;AACF;AAEA,SAAS,QAAQ,KAAiB,QAAuB;AACvD,QAAM,QAAQ,SAAS,aAAa,IAAI,KAAK,IAAI;AAEjD,WAAS,KAAK,cAAc;AAE5B,MAAI,OAAO;AACT,QAAI,iBAAiB;AAAA,EACvB;AAEA,MAAI,CAAC,IAAI,WAAY;AAErB,QAAM,WAA6B,CAAC;AACpC,aAAW,SAAS,IAAI,YAAY;AAClC,UAAM,MAAM,MAAM,YAAY,MAAM;AACpC,QAAI,KAAK;AACP,kBAAY,GAAG;AACf,eAAS,KAAK,GAAG;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,WAAW,SAAS;AACxB,MAAI,WAAW,KAAK,GAAI,QAAkB;AAC5C;AAMO,SAAS,WAAW,QAA2B;AACpD,QAAM,EAAE,SAAS,IAAI;AACrB,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAQ,SAAS,CAAC,GAAG,MAAM,SAAS,SAAS,CAAC;AAAA,EAChD;AACF;;;ACtEA,IAAM,sBAAyC,iCAAuB;AAStE,eAAsB,UACpB,SACuC;AACvC,QAAM,EAAE,UAAU,QAAQ,OAAO,KAAK,IAAI;AAE1C,MAAI,CAAC,UAAU;AACb,WAAO,qBAAqB;AAAA,EAC9B;AAEA,MAAI,QAAQ;AACV,WAAO,iBAAiB,UAAU,QAAQ,IAAI;AAAA,EAChD;AAEA,MAAI;AAEJ,aAAW,KAAK,qBAAqB;AACnC,UAAM,SAAS,MAAM,iBAAiB,UAAU,GAAG,IAAI;AACvD,QAAI,OAAO,IAAI;AACb,aAAO;AAAA,IACT;AACA,QAAI,OAAO,SAAS,eAAe,gBAAgB;AACjD,6BAAuB;AAAA,IACzB;AAAA,EACF;AAEA,SAAO,wBAAwB,oBAAoB;AACrD;AAEA,eAAe,iBACb,UACA,QACA,MACuC;AACvC,QAAM,SAAS,MAAM,YAAY,UAAU,MAAM;AACjD,MAAI,CAAC,OAAO,IAAI;AACd,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO;AACtB,MAAI,MAAM;AACR,eAAW,MAAM;AAAA,EACnB;AAEA,SAAO,WAAW,EAAE,QAAQ,OAAO,CAAC;AACtC;;;ALzDO,IAAM,yBAAN,cAAqC,YAAY;AAAA,EAC5C,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEU,oBAAoB,KAAoB;AAChD,QAAI,SAAS,eAAe,oCAAgB;AAAA,EAC9C;AAAA,EAEU,kBAAkB,KAAoB;AAC9C,QAAI;AAAA,MACF,IAAI;AAAA,QACF;AAAA,QACA;AAAA,MACF,EAAE,QAAQ,CAAC,MAAM,MAAM,CAAC;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAgB,SACd,MAC2B;AAC3B,UAAM,WAAW,KAAK,KAAK,CAAC;AAC5B,UAAM,SAAS,KAAK,QAAQ;AAE5B,UAAM,SAAS,MAAM,UAAU,EAAE,UAAU,OAAO,CAAC;AAEnD,QAAI,CAAC,OAAO,IAAI;AACd,WAAK,iBAAiB,OAAO,MAAM,OAAO,GAAG;AAC7C,aAAO,KAAK,QAAQ;AAAA,IACtB;AAEA,SAAK,cAAc,OAAO,KAAK;AAC/B,WAAO,KAAK,QAAQ;AAAA,EACtB;AACF;;;AM5CA,SAAS,UAAAC,eAAc;;;ACDvB,YAAYC,SAAQ;AACpB,YAAY,QAAQ;AACpB,YAAYC,WAAU;;;ACFtB,YAAY,UAAU;AACtB,YAAY,QAAQ;AACpB,SAAS,qBAAqB;AAI9B,IAAM,WAAgB,aAAQ,cAAc,YAAY,GAAG,CAAC;AAC5D,IAAM,oBAAoB;AAMnB,SAAS,uBACd,WAAmB,mBACC;AACpB,MAAI,aAAa;AAEjB,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,UAAM,YAAiB,UAAK,YAAY,cAAc;AACtD,QAAO,cAAW,SAAS,GAAG;AAC5B,aAAO,WAAW,SAAS;AAAA,IAC7B;AAEA,UAAM,YAAiB,aAAQ,UAAU;AACzC,QAAI,cAAc,YAAY;AAC5B;AAAA,IACF;AACA,iBAAa;AAAA,EACf;AAEA,SAAO,UAAU,GAAG,iCAAiC,QAAQ,gBAAgB,QAAQ,EAAE;AACzF;;;ADlBA,SAAS,iBAAiB,SAAyB;AACjD,QAAM,cAAc,QAAQ,MAAM,GAAG,EAAE,IAAI,KAAK;AAChD,QAAM,YAAY,YACf,KAAK,EACL,QAAQ,8BAA8B,GAAG,EACzC,QAAQ,OAAO,GAAG,EAClB,QAAQ,kBAAkB,EAAE;AAC/B,SAAO,UAAU,SAAS,IAAI,YAAY;AAC5C;AAEA,eAAe,yBAAsD;AACnE,QAAM,oBAAoB,uBAAuB;AACjD,MAAI,CAAC,kBAAkB,IAAI;AACzB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,MAAS,aAAS,kBAAkB,OAAO,MAAM;AACjE,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,QAAI,OAAO,OAAO,SAAS,YAAY,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AACtE,aAAO;AAAA,QACL;AAAA,QACA,mBAAmB,kBAAkB,KAAK;AAAA,MAC5C;AAAA,IACF;AACA,WAAO,WAAW,iBAAiB,OAAO,IAAI,CAAC;AAAA,EACjD,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO;AAAA,MACL;AAAA,MACA,oCAAoC,kBAAkB,KAAK,KAAK,OAAO;AAAA,IACzE;AAAA,EACF;AACF;AAEA,eAAe,mBAAoC;AACjD,MAAI,QAAQ,aAAa,SAAS;AAChC,WAAO,QAAQ,IAAI,WAAgB,WAAQ,WAAQ,GAAG,WAAW,SAAS;AAAA,EAC5E;AAEA,SAAO,QAAQ,IAAI,mBAAwB,WAAQ,WAAQ,GAAG,SAAS;AACzE;AAEA,eAAsB,wBAEpB;AACA,QAAM,gBAAgB,MAAM,uBAAuB;AACnD,MAAI,CAAC,cAAc,IAAI;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,iBAAiB;AACvC,QAAM,YAAiB,WAAK,SAAS,cAAc,KAAK;AACxD,SAAO,WAAW;AAAA,IAChB,aAAa,cAAc;AAAA,IAC3B;AAAA,IACA,gBAAqB,WAAK,WAAW,GAAG,cAAc,KAAK,OAAO;AAAA,EACpE,CAAC;AACH;AAEO,SAAS,gBACd,YACwB;AACxB,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,WAAO,WAAW,MAAM;AAAA,EAC1B;AAEA,QAAM,WAAmC,CAAC;AAC1C,QAAM,UAAU;AAChB,aAAW,QAAQ,SAAS,CAAC,OAAO,UAAU;AAC5C,QAAI,UAAU,QAAW;AACvB,eAAS,KAAK,OAAO,KAAK,CAAC;AAAA,IAC7B,OAAO;AACL,eAAS,KAAK,KAAK;AAAA,IACrB;AACA,WAAO;AAAA,EACT,CAAC;AACD,SAAO;AACT;AAEA,SAAS,YACP,OACmD;AACnD,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,sBACP,OACkC;AAClC,SAAO;AACT;AAEA,SAAS,eACP,QACA,YACA,cACG;AACH,QAAM,WAAW,gBAAgB,UAAU;AAC3C,MAAI,SAAS,WAAW,GAAG;AACzB,WAAQ,WAAW,SAAY,eAAe;AAAA,EAChD;AAEA,MAAI,UAAmB;AACvB,aAAW,WAAW,UAAU;AAC9B,QAAI,CAAC,YAAY,OAAO,GAAG;AACzB,aAAO;AAAA,IACT;AACA,cAAU,sBAAsB,OAAO,EAAE,OAAO;AAChD,QAAI,YAAY,QAAW;AACzB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAQ,YAAY,SAAY,eAAe;AACjD;AAEA,SAAS,oBACP,aAC0C;AAC1C,SAAO,OAAO,gBAAgB,WAAW,CAAC,IAAI,CAAC;AACjD;AAEA,SAAS,eACP,QACA,YACA,OACM;AACN,QAAM,WAAW,gBAAgB,UAAU;AAC3C,MAAI,SAAS,WAAW,GAAG;AACzB;AAAA,EACF;AAEA,MAAI,UAAoD;AACxD,WAAS,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS;AACpD,UAAM,UAAU,SAAS,KAAK;AAC9B,UAAM,SAAS,UAAU,SAAS,SAAS;AAC3C,UAAM,mBAAmB,sBAAsB,OAAO;AAEtD,QAAI,QAAQ;AACV,uBAAiB,OAAO,IAAI;AAC5B;AAAA,IACF;AAEA,UAAM,cAAc,SAAS,QAAQ,CAAC;AACtC,UAAM,WAAW,iBAAiB,OAAO;AACzC,QAAI,CAAC,YAAY,QAAQ,GAAG;AAC1B,uBAAiB,OAAO,IAAI,oBAAoB,WAAW;AAAA,IAC7D;AACA,cAAU,iBAAiB,OAAO;AAAA,EAGpC;AACF;AAEA,eAAe,iBACb,gBAC2B;AAC3B,MAAI;AACF,UAAS,UAAW,cAAQ,cAAc,GAAG,EAAE,WAAW,KAAK,CAAC;AAChE,UAAS,WAAO,cAAc,EAAE,MAAM,YAAY;AAChD,YAAS,cAAU,gBAAgB,QAAQ,MAAM;AAAA,IACnD,CAAC;AACD,WAAO,WAAW,MAAS;AAAA,EAC7B,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO;AAAA,MACL;AAAA,MACA,gCAAgC,cAAc,KAAK,OAAO;AAAA,IAC5D;AAAA,EACF;AACF;AAEA,eAAsB,aAEM;AAC1B,QAAM,iBAAiB,MAAM,sBAAsB;AACnD,MAAI,CAAC,eAAe,IAAI;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,MAAM;AAAA,IACzB,eAAe,MAAM;AAAA,EACvB;AACA,MAAI,CAAC,aAAa,IAAI;AACpB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,MAAS;AAAA,MACvB,eAAe,MAAM;AAAA,MACrB;AAAA,IACF;AACA,QAAI,QAAQ,KAAK,EAAE,WAAW,GAAG;AAC/B,aAAO,WAAW,CAAC,CAAM;AAAA,IAC3B;AACA,WAAO,WAAW,KAAK,MAAM,OAAO,CAAM;AAAA,EAC5C,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO;AAAA,MACL;AAAA,MACA,8BAA8B,eAAe,MAAM,cAAc,KAAK,OAAO;AAAA,IAC/E;AAAA,EACF;AACF;AAEA,eAAsB,YACpB,QAC2B;AAC3B,QAAM,iBAAiB,MAAM,sBAAsB;AACnD,MAAI,CAAC,eAAe,IAAI;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,MAAM;AAAA,IACzB,eAAe,MAAM;AAAA,EACvB;AACA,MAAI,CAAC,aAAa,IAAI;AACpB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA;AAClD,UAAS,cAAU,eAAe,MAAM,gBAAgB,SAAS,MAAM;AACvE,WAAO,WAAW,MAAS;AAAA,EAC7B,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO;AAAA,MACL;AAAA,MACA,6BAA6B,eAAe,MAAM,cAAc,KAAK,OAAO;AAAA,IAC9E;AAAA,EACF;AACF;AAEA,eAAsB,gBACpB,YACA,cACwB;AACxB,QAAM,eAAe,MAAM,WAAoC;AAC/D,MAAI,CAAC,aAAa,IAAI;AACpB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,eAAe,aAAa,OAAO,YAAY,YAAY;AAAA,EAC7D;AACF;AAEA,eAAsB,iBACpB,YACA,OAC2B;AAC3B,QAAM,eAAe,MAAM,WAAoC;AAC/D,MAAI,CAAC,aAAa,IAAI;AACpB,WAAO;AAAA,EACT;AAEA,iBAAe,aAAa,OAAO,YAAY,KAAK;AACpD,SAAO,YAAY,aAAa,KAAK;AACvC;;;AE5QA,IAAM,2BAA2B,CAAC,UAAU,OAAO;AAEnD,eAAsB,iBACpB,QACA,OAC2B;AAC3B,SAAO,iBAAiB,CAAC,GAAG,0BAA0B,MAAM,GAAG,KAAK;AACtE;AAEA,eAAsB,gBACpB,QACyC;AACzC,SAAO,gBAAgB,CAAC,GAAG,0BAA0B,MAAM,CAAC;AAC9D;;;AHJO,IAAM,2BAAN,cAAuC,YAAuC;AAAA,EACzE,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEU,oBAAoB,KAAoB;AAChD,QAAI,SAAS,WAAW,uCAAmB;AAAA,EAC7C;AAAA,EAEU,kBAAkB,KAAoB;AAC9C,QAAI;AAAA,MACF,IAAIC,QAAO,yBAAyB,gCAAY,EAC7C,QAAQ,CAAC,MAAM,MAAM,CAAC,EACtB,oBAAoB;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAgB,SACd,KAC2B;AAC3B,UAAM,QAAQ,IAAI,KAAK,CAAC;AACxB,UAAM,EAAE,OAAO,IAAI,IAAI;AAEvB,UAAM,SAAS,MAAM,iBAAiB,QAAQ,KAAK;AACnD,QAAI,CAAC,OAAO,IAAI;AACd,aAAO,KAAK,WAAW,OAAO,MAAM,OAAO,GAAG;AAAA,IAChD;AAEA,SAAK,cAAc;AAAA,MACjB;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AACD,WAAO,KAAK,QAAQ;AAAA,EACtB;AACF;;;AIjDA,SAAS,UAAAC,eAAc;;;ACCvB,IAAMC,QAAO;AAEN,IAAK,qBAAL,CAAKC,uBAAL;AACL,EAAAA,sCAAA,kBAAeD,QAAO,KAAtB;AACA,EAAAC,sCAAA,wBAAqBD,QAAO,KAA5B;AACA,EAAAC,sCAAA,0BAAuBD,QAAO,KAA9B;AACA,EAAAC,sCAAA,yBAAsBD,QAAO,KAA7B;AACA,EAAAC,sCAAA,0BAAuBD,QAAO,KAA9B;AACA,EAAAC,sCAAA,wBAAqBD,QAAO,KAA5B;AACA,EAAAC,sCAAA,qBAAkBD,QAAO,KAAzB;AACA,EAAAC,sCAAA,wBAAqBD,QAAO,KAA5B;AACA,EAAAC,sCAAA,mBAAgBD,QAAO,KAAvB;AACA,EAAAC,sCAAA,wBAAqBD,QAAO,MAA5B;AAVU,SAAAC;AAAA,GAAA;AAaL,IAAM,oBAAoB;AAAA,EAC/B,kBAAkB;AAAA,EAClB;AACF;AAEO,IAAM,qBAAqB;AAAA,EAChC,kBAAkB;AAAA,EAClB;AACF;AAEO,IAAM,4BACX;AAEK,IAAM,0BAA0B;AAAA,EACrC,kBAAkB;AAAA,EAClB,8IACE;AACJ;AAEO,IAAM,0BAA0B;AAAA,EACrC,kBAAkB;AAAA,EAClB,0JACE;AACJ;AAEO,IAAMC,6BAA4B;AAAA,EACvC,kBAAkB;AAAA,EAClB;AACF;AAEO,IAAM,2BAA2B;AAAA,EACtC,kBAAkB;AAAA,EAClB;AACF;AAEO,IAAM,4BAA4B;AAAA,EACvC,kBAAkB;AAAA,EAClB;AACF;AAEO,IAAM,0BAA0B;AAAA,EACrC,kBAAkB;AAAA,EAClB;AACF;AAEO,IAAM,uBAAuB;AAAA,EAClC,kBAAkB;AAAA,EAClB;AACF;AAEO,IAAM,0BAA0B;AAAA,EACrC,kBAAkB;AAAA,EAClB;AACF;;;ACvDO,SAAS,eAAe,OAAuB;AACpD,QAAM,UAAU,MAAM,KAAK;AAC3B,QAAM,SAAS;AACf,MAAI,QAAQ,WAAW,MAAM,GAAG;AAC9B,WAAO,QAAQ,MAAM,OAAO,MAAM,EAAE,KAAK;AAAA,EAC3C;AACA,SAAO;AACT;AAEO,SAAS,cAAc,OAAe,SAAsB;AACjE,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,aACE;AAAA,IACF,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,QAAQ,2BAA2B,eAAe,KAAK,CAAC;AAAA,IACxD,SAAS;AAAA,EACX;AACF;AAEA,eAAsBC,aACpB,KACA,SACwB;AACxB,SAAO,YAAqB,KAAK,SAAS;AAAA,IACxC,sBAAsB,CAAC,YAAY;AACjC,aAAOC,2BAA0B,OAAO;AAAA,IAC1C;AAAA,IACA,qBAAqB,CAAC,YAAY;AAChC,aAAO,yBAAyB,OAAO;AAAA,IACzC;AAAA,IACA,mBAAmB,QAAQ,qBAAqB;AAAA,IAChD,WAAW,CAAC,YAAY;AACtB,aAAOA,2BAA0B,OAAO;AAAA,IAC1C;AAAA,EACF,CAAC;AACH;AAEO,SAAS,kBACd,kBACA,WACwC;AACxC,QAAM,cAAc,KAAK,IAAI;AAC7B,SAAO;AAAA,IACL,WAAW,OAAO,cAAc,MAAO,KAAK,KAAK,KAAK,gBAAgB;AAAA,IACtE,SAAS,OAAO,cAAc,MAAO,KAAK,KAAK,KAAK,SAAS;AAAA,EAC/D;AACF;AAEO,SAAS,mBAAsB,OAA+B;AACnE,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI;AACF,aAAO,WAAW,KAAK,MAAM,KAAK,CAAY;AAAA,IAChD,SAAS,OAAO;AACd,aAAO;AAAA,QACL,iBAAiB,QAAQ,QAAQ;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C,WAAO,WAAW,KAAU;AAAA,EAC9B;AAEA,SAAO,qBAAqB;AAC9B;AAEO,SAAS,iBACd,OACyB;AACzB,SAAO,MAAM,SAAS,CAAC,SAAS;AAC9B,WACE,MAAM,SAAS,WAAW,MAAM,iBAAiB;AAAA,EAErD,CAAC;AACH;;;AC1EA,IAAM,SAAS;AAAA,EACb,UAAU;AAAA,EACV,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,WAAW;AACb;AAOA,SAAS,kBACP,WACA,WACA,QACA,WACA,WAAW,OACX;AACA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,MACV,cAAc;AAAA,MACd,eAAe,CAAC;AAAA,IAClB;AAAA,EACF;AACF;AAEA,SAAS,eAAe,OAA+C;AACrE,MAAI;AACJ,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO,KAAK,YAAY,YAAY,OAAO,KAAK,aAAa,UAAU;AACzE;AAAA,IACF;AACA,QACE,CAAC,aACA,KAAK,YAAY,cAAc,SAAS,YAAY,YACrD;AACA,iBAAW;AAAA,IACb;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAuB;AAC9B,SAAO,GAAG,OAAO,QAAQ;AAC3B;AAEA,SAAS,mBAA2B;AAClC,SAAO,aAAa;AACtB;AAEA,SAAS,gBAAwD;AAC/D,SAAO,kBAAkB,OAAO,UAAU,OAAO,UAAU;AAC7D;AAEA,SAAS,cAAc,OAAuB;AAC5C,QAAM,EAAE,WAAW,QAAQ,IAAI,cAAc;AAC7C,SAAO,KAAK,UAAU;AAAA,IACpB,cAAc,OAAO;AAAA,IACrB,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,SAAS;AAAA,MACP,cAAc;AAAA,MACd,eAAe;AAAA,QACb,kBAAkB,kBAAkB,UAAU,CAAC,KAAK,GAAG,QAAQ;AAAA,QAC/D,kBAAkB,OAAO,UAAU,CAAC,uBAAuB,GAAG,IAAI;AAAA,QAClE,kBAAkB,SAAS,UAAU,CAAC,KAAK,GAAG,IAAI;AAAA,MACpD;AAAA,IACF;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,WAAW;AAAA,MACT;AAAA,QACE,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,eAAe,OAAO;AAAA,IACtB,gBAAgB;AAAA,EAClB,CAAC;AACH;AAEA,SAAS,aAAqB;AAC5B,SAAO,GAAG,OAAO,QAAQ;AAC3B;AAEA,SAAS,aAAa,SAAiB,QAAwB;AAC7D,QAAM,EAAE,WAAW,QAAQ,IAAI,cAAc;AAC7C,SAAO,GAAG,OAAO,QAAQ,+BAA+B,OAAO,iBAAiB,OAAO,YAAY,eAAe,SAAS,aAAa,OAAO,kBAAkB,OAAO,aAAa,aAAa,MAAM;AAC1M;AAEA,eAAsB,YACpB,SACwC;AACxC,QAAM,EAAE,MAAM,IAAI;AAClB,MAAI,CAAC,OAAO;AACV,WAAO,kBAAkB;AAAA,EAC3B;AAEA,QAAM,cAAc,MAAM,6BAAyB;AACnD,MAAI,CAAC,YAAY,IAAI;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,YAAY,OAAO,KAAK;AACtC,MAAI,CAAC,OAAO;AACV,WAAO,wBAAwB;AAAA,EACjC;AAEA,QAAM,eAAe,MAAMC,aAAgC,aAAa,GAAG;AAAA,IACzE,QAAQ;AAAA,IACR,SAAS,cAAc,OAAO,iBAAiB,CAAC;AAAA,IAChD,MAAM,cAAc,KAAK;AAAA,IACzB,mBAAmB;AAAA,EACrB,CAAC;AACD,MAAI,CAAC,aAAa,IAAI;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,aAAa,MAAM,SAAS,CAAC;AACjD,MAAI,YAAY,WAAW,GAAG;AAC5B,WAAO,0BAA0B;AAAA,EACnC;AAEA,QAAM,WAAW,eAAe,WAAW;AAC3C,MAAI,CAAC,UAAU,UAAU;AACvB,WAAO,wBAAwB;AAAA,EACjC;AAEA,QAAM,aAAa,MAAMA,aAAgC,WAAW,GAAG;AAAA,IACrE,QAAQ;AAAA,IACR,SAAS,cAAc,OAAO,iBAAiB,CAAC;AAAA,IAChD,MAAM,KAAK,UAAU;AAAA,MACnB,cAAc,OAAO;AAAA,MACrB,UAAU,SAAS;AAAA,MACnB,YAAY,cAAc,EAAE;AAAA,MAC5B,UAAU,cAAc,EAAE;AAAA,MAC1B,eAAe,OAAO;AAAA,IACxB,CAAC;AAAA,IACD,mBAAmB;AAAA,EACrB,CAAC;AACD,MAAI,CAAC,WAAW,IAAI;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,iBAAiB,WAAW,MAAM,SAAS,CAAC,CAAC;AAChE,MAAI,CAAC,YAAY,YAAY,CAAC,WAAW,SAAS;AAChD,WAAO,wBAAwB;AAAA,EACjC;AAEA,QAAM,eAAe,MAAMA;AAAA,IACzB,aAAa,WAAW,UAAU,WAAW,OAAO;AAAA,IACpD;AAAA,MACE,QAAQ;AAAA,MACR,SAAS,cAAc,OAAO,iBAAiB,CAAC;AAAA,MAChD,mBAAmB;AAAA,IACrB;AAAA,EACF;AACA,MAAI,CAAC,aAAa,IAAI;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU;AAAA,IACd,aAAa,MAAM,QAAQ,CAAC,GAAG;AAAA,EACjC;AACA,MAAI,CAAC,QAAQ,IAAI;AACf,WAAO;AAAA,EACT;AAEA,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,MACJ;AAAA,MACA,UAAU,WAAW,aAAa;AAAA,IACpC;AAAA,IACA,MAAM,QAAQ;AAAA,EAChB,CAAC;AACH;;;ACxLA,IAAMC,UAAS;AAAA,EACb,UAAU;AAAA,EACV,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,YAAY;AACd;AAOA,SAASC,gBAAuB;AAC9B,SAAO,GAAGD,QAAO,QAAQ;AAC3B;AAEA,SAASE,kBAAiB,OAAuB;AAC/C,SAAO,GAAGF,QAAO,QAAQ,UAAUA,QAAO,YAAY,6CAA6CA,QAAO,iBAAiB,YAAY,KAAK;AAC9I;AAEA,SAASG,iBAAwD;AAC/D,SAAO,kBAAkBH,QAAO,UAAUA,QAAO,UAAU;AAC7D;AAEA,SAASI,cAAa,SAAiB,QAAwB;AAC7D,QAAM,EAAE,WAAW,QAAQ,IAAID,eAAc;AAC7C,SAAO,GAAGH,QAAO,QAAQ,gCAAgC,OAAO,iBAAiBA,QAAO,YAAY,eAAe,SAAS,aAAa,OAAO,wCAAwC,MAAM;AAChM;AAEA,eAAsB,cACpB,SACwC;AACxC,QAAM,EAAE,MAAM,IAAI;AAClB,MAAI,CAAC,OAAO;AACV,WAAO,kBAAkB;AAAA,EAC3B;AAEA,QAAM,cAAc,MAAM,iCAA2B;AACrD,MAAI,CAAC,YAAY,IAAI;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,YAAY,OAAO,KAAK;AACtC,MAAI,CAAC,OAAO;AACV,WAAO,wBAAwB;AAAA,EACjC;AAEA,QAAM,eAAe,MAAMK,aAAgCJ,cAAa,GAAG;AAAA,IACzE,QAAQ;AAAA,IACR,SAAS,cAAc,OAAOC,kBAAiB,KAAK,CAAC;AAAA,IACrD,MAAM,KAAK,UAAU;AAAA,MACnB,cAAcF,QAAO;AAAA,MACrB,aAAa;AAAA,MACb,IAAI;AAAA,MACJ,mBAAmBA,QAAO;AAAA,IAC5B,CAAC;AAAA,IACD,mBAAmB;AAAA,EACrB,CAAC;AACD,MAAI,CAAC,aAAa,IAAI;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,iBAAiB,aAAa,MAAM,SAAS,CAAC,CAAC;AAClE,MAAI,CAAC,YAAY,YAAY,CAAC,WAAW,SAAS;AAChD,WAAO,0BAA0B;AAAA,EACnC;AAEA,QAAM,eAAe,MAAMK;AAAA,IACzBD,cAAa,WAAW,UAAU,WAAW,OAAO;AAAA,IACpD;AAAA,MACE,QAAQ;AAAA,MACR,SAAS,cAAc,OAAOF,kBAAiB,KAAK,CAAC;AAAA,MACrD,mBAAmB;AAAA,IACrB;AAAA,EACF;AACA,MAAI,CAAC,aAAa,IAAI;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,iBAAiB,aAAa,MAAM,SAAS,CAAC,CAAC;AAClE,MAAI,CAAC,YAAY,YAAY,CAAC,WAAW,SAAS;AAChD,WAAO,wBAAwB;AAAA,EACjC;AAEA,QAAM,UAAU,mBAAmC,WAAW,KAAK;AACnE,MAAI,CAAC,QAAQ,IAAI;AACf,WAAO;AAAA,EACT;AAEA,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,MACJ;AAAA,MACA,UAAU,WAAW,aAAa;AAAA,IACpC;AAAA,IACA,MAAM,QAAQ;AAAA,EAChB,CAAC;AACH;;;ACjHA,SAAS,mBAAmB,MAA4B;AACtD,MAAI,CAAC,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACjC;AAAA,EACF;AAEA,aAAW,WAAW,KAAK,UAAU;AACnC,QAAI,YAAY,QAAQ,OAAO,YAAY,UAAU;AACnD;AAAA,IACF;AAEA,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,UAAU,GAAG;AAC7D,WAAK,QAAQ,eAAe,SAAoC,UAAU;AAAA,IAC5E;AAAA,EACF;AACF;AAEA,eAAsB,UACpB,SACwC;AACxC,QAAM,EAAE,OAAO,QAAQ,OAAO,KAAK,IAAI;AACvC,MAAI,CAAC,OAAO;AACV,WAAO,kBAAkB;AAAA,EAC3B;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO,mBAAmB;AAAA,EAC5B;AAEA,MAAI,0BAAsB;AACxB,UAAMI,UAAS,MAAM,YAAY,EAAE,OAAO,OAAO,CAAC;AAClD,QAAIA,QAAO,MAAM,MAAM;AACrB,yBAAmBA,QAAO,MAAM,IAAI;AAAA,IACtC;AACA,WAAOA;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,cAAc,EAAE,OAAO,OAAO,CAAC;AACpD,MAAI,OAAO,MAAM,MAAM;AACrB,uBAAmB,OAAO,MAAM,IAAI;AAAA,EACtC;AACA,SAAO;AACT;;;ALpCO,IAAM,+BAAN,cAA2C,YAA2C;AAAA,EACjF,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEU,oBAAoB,KAAoB;AAChD,QAAI,SAAS,YAAY,iCAAa;AAAA,EACxC;AAAA,EAEU,kBAAkB,KAAoB;AAC9C,QAAI;AAAA,MACF,IAAIC,QAAO,yBAAyB,0BAAM,EACvC,QAAQ,CAAC,MAAM,MAAM,CAAC,EACtB,oBAAoB;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAgB,SACd,KAC2B;AAC3B,UAAM,QAAQ,IAAI,KAAK,CAAC;AACxB,UAAM,SAAS,IAAI,QAAQ;AAE3B,UAAM,SAAS,MAAM,UAAU,EAAE,OAAO,OAAO,CAAC;AAChD,QAAI,CAAC,OAAO,IAAI;AACd,WAAK,iBAAiB,OAAO,MAAM,OAAO,GAAG;AAC7C,aAAO,KAAK,QAAQ;AAAA,IACtB;AAEA,SAAK,cAAc,OAAO,KAAK;AAC/B,WAAO,KAAK,QAAQ;AAAA,EACtB;AACF;;;AMhDA,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AAEtB,SAAS,UAAAC,eAAc;AAchB,IAAM,gCAAN,cAA4C,YAA4C;AAAA,EACnF,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEU,oBAAoB,KAAoB;AAChD,QAAI,SAAS,eAAe,sDAAmB;AAAA,EACjD;AAAA,EAEU,kBAAkB,KAAoB;AAC9C,QAAI;AAAA,MACF,IAAIC,QAAO,0BAA0B,kGAAkB;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,MAAgB,SACd,KAC2B;AAC3B,UAAM,WAAW,IAAI,KAAK,CAAC;AAC3B,UAAM,YAAY,IAAI,QAAQ;AAE9B,UAAM,eAAe,MAAM,UAAU,EAAE,UAAU,MAAM,KAAK,CAAC;AAC7D,QAAI,CAAC,aAAa,IAAI;AACpB,aAAO,KAAK,eAAe,aAAa,MAAM,aAAa,GAAG;AAAA,IAChE;AAEA,UAAM,aAAa,aAAa,MAAM;AACtC,UAAM,SAAS,aAAa,MAAM;AAClC,UAAM,QAAQ,KAAK,qBAAqB,UAAU;AAClD,QAAI,CAAC,OAAO;AACV,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,UAAU,EAAE,OAAO,OAAO,CAAC;AACtD,QAAI,CAAC,aAAa,IAAI;AACpB,aAAO,KAAK,eAAe,aAAa,MAAM,aAAa,GAAG;AAAA,IAChE;AAEA,UAAM,YAAY,KAAK,kBAAkB,UAAU,SAAS;AAC5D,UAAM,aAAkB,WAAK,WAAW,aAAa;AACrD,UAAM,aAAkB,WAAK,WAAW,aAAa;AAErD,QAAI;AACF,YAAS,UAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC7C,YAAS;AAAA,QACP;AAAA,QACA,GAAG,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAAA;AAAA,QACtC;AAAA,MACF;AACA,YAAS;AAAA,QACP;AAAA,QACA,GAAG,KAAK,UAAU,aAAa,MAAM,MAAM,MAAM,CAAC,CAAC;AAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,aAAO,KAAK,eAAe,GAAG,yCAAW,OAAO,EAAE;AAAA,IACpD;AAEA,SAAK,cAAc;AAAA,MACjB,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AACD,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEQ,eAAe,MAAc,KAA+B;AAClE,SAAK,iBAAiB,MAAM,GAAG;AAC/B,YAAQ,WAAW;AACnB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEQ,kBAAkB,UAAkB,WAA4B;AACtE,UAAM,UAAU,YACP,cAAQ,QAAQ,IAAI,GAAG,SAAS,IACrC,QAAQ,IAAI;AAChB,WAAY,WAAK,SAAS,QAAQ;AAAA,EACpC;AAAA,EAEQ,qBAAqB,QAAyC;AACpE,UAAM,UAAU,OAAO,SAAS,GAAG,EAAE;AACrC,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,QAAQ,mBAAmB,UAAU;AAC9C,YAAM,eAAe,QAAQ,eAAe,KAAK;AACjD,UAAI,aAAa,SAAS,GAAG;AAC3B,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ,UAAU,YAAY,QAAQ,MAAM,WAAW,GAAG;AACnE,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,QAAQ,KAAK,MAAM,QAAQ,KAAK;AAGtC,UAAI,OAAO,MAAM,mBAAmB,UAAU;AAC5C,eAAO;AAAA,MACT;AAEA,YAAM,eAAe,MAAM,eAAe,KAAK;AAC/C,aAAO,aAAa,SAAS,IAAI,eAAe;AAAA,IAClD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACzIA,YAAYC,WAAU;AAEtB,SAAS,UAAAC,eAAc;;;ACFvB,YAAYC,SAAQ;AACpB,YAAYC,WAAU;;;ACUtB,SAAS,sBAAsB,QAAoC;AACjE,SAAO,2BACH,CAAC,UAAU,wBAAwB,IACnC,CAAC,aAAa,QAAQ;AAC5B;AAEA,SAAS,qBAAqB,QAAmC;AAC/D,SAAO,2BAAuB,CAAC,QAAQ,IAAI,CAAC,WAAW;AACzD;AAEA,eAAsB,cACpB,QACA,OAC2B;AAC3B,QAAM,YAAY,qBAAqB,MAAM;AAC7C,QAAM,kBAAkB,MAAM;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,gBAAgB,IAAI;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,aAAgC;AAAA,IACpC,CAAC,sBAAsB,MAAM,EAAE,CAAC,CAAC,GAAG;AAAA,EACtC;AAEA,SAAO,iBAAiB,WAAkB,UAAU;AACtD;AAEA,eAAsB,aACpB,QACyC;AACzC,SAAO,gBAAgB,sBAAsB,MAAM,CAAQ;AAC7D;;;AC3CA,IAAMC,QAAO;AAEN,IAAK,iBAAL,CAAKC,mBAAL;AACL,EAAAA,8BAAA,qBAAkBD,QAAO,KAAzB;AACA,EAAAC,8BAAA,0BAAuBD,QAAO,KAA9B;AACA,EAAAC,8BAAA,yBAAsBD,QAAO,KAA7B;AACA,EAAAC,8BAAA,2BAAwBD,QAAO,KAA/B;AACA,EAAAC,8BAAA,sBAAmBD,QAAO,KAA1B;AACA,EAAAC,8BAAA,4BAAyBD,QAAO,KAAhC;AACA,EAAAC,8BAAA,uBAAoBD,QAAO,KAA3B;AACA,EAAAC,8BAAA,yBAAsBD,QAAO,KAA7B;AACA,EAAAC,8BAAA,uBAAoBD,QAAO,KAA3B;AATU,SAAAC;AAAA,GAAA;AAYL,IAAM,uBAAuB;AAAA,EAClC,cAAc;AAAA,EACd;AACF;AAEO,IAAMC,6BAA4B;AAAA,EACvC,cAAc;AAAA,EACd;AACF;AAEO,IAAMC,4BAA2B;AAAA,EACtC,cAAc;AAAA,EACd;AACF;AAEO,IAAM,6BAA6B;AAAA,EACxC,cAAc;AAAA,EACd;AACF;AAEO,IAAM,wBAAwB;AAAA,EACnC,cAAc;AAAA,EACd;AACF;AAEO,IAAM,8BAA8B;AAAA,EACzC,cAAc;AAAA,EACd;AACF;AAEO,IAAM,yBAAyB;AAAA,EACpC,cAAc;AAAA,EACd;AACF;AAEO,IAAM,2BAA2B;AAAA,EACtC,cAAc;AAAA,EACd;AACF;AAEO,IAAM,yBAAyB;AAAA,EACpC,cAAc;AAAA,EACd;AACF;;;AC3CA,IAAM,gBACJ;AACF,IAAM,gBACJ;AAEF,IAAM,qBAAqB,CAAC,UAAU,WAAW;AA6BjD,SAASC,gBAAe,OAAuB;AAC7C,QAAM,UAAU,MAAM,KAAK;AAC3B,QAAM,SAAS;AACf,MAAI,QAAQ,WAAW,MAAM,GAAG;AAC9B,WAAO,QAAQ,MAAM,OAAO,MAAM,EAAE,KAAK;AAAA,EAC3C;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAuB;AACjD,SAAO,0BAA0BA,gBAAe,KAAK,CAAC;AACxD;AAEA,SAAS,YAAY,OAAwD;AAC3E,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,OAAO,SAAS,KAAK,IAAI,OAAO,KAAK,IAAI;AAAA,EAClD;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAEA,SAAS,gBAAgB,OAA6C;AACpE,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,WAAO;AAAA,EACT;AAEA,QAAM,SAAS;AACf,QAAM,MAAM,YAAY,OAAO,GAAkC;AACjE,QAAM,cAAc;AAAA,IAClB,OAAO;AAAA,EACT;AACA,QAAM,UAAU,YAAY,OAAO,QAAuC;AAE1E,MAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS;AACpC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAeC,aACb,KACA,MACwB;AACxB,SAAO,YAAqB,KAAK,MAAM;AAAA,IACrC,sBAAsB,CAAC,YAAY;AACjC,aAAOC,2BAA0B,OAAO;AAAA,IAC1C;AAAA,IACA,qBAAqB,CAAC,YAAY;AAChC,aAAOC,0BAAyB,OAAO;AAAA,IACzC;AAAA,EACF,CAAC;AACH;AAEA,eAAe,YAAY,OAA4C;AACrE,QAAM,iBAAiB,MAAMF,aAA4B,eAAe;AAAA,IACtE,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,QAAQ,mBAAmB,KAAK;AAAA,MAChC,SAAS;AAAA,IACX;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB,KAAK;AAAA,IACP,CAAC;AAAA,EACH,CAAC;AACD,MAAI,CAAC,eAAe,IAAI;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,eAAe;AAC5B,MAAI,OAAO,MAAM,GAAG,MAAM,KAAK;AAC7B,WAAO,2BAA2B,MAAM,MAAM;AAAA,EAChD;AAEA,QAAM,MAAM,YAAY,MAAM,MAAM,GAAG;AACvC,MAAI,CAAC,KAAK;AACR,WAAO,sBAAsB;AAAA,EAC/B;AAEA,SAAO,WAAW,GAAG;AACvB;AAEA,eAAe,eACb,OACA,KACsC;AACtC,QAAM,iBAAiB,MAAMA,aAAgC,eAAe;AAAA,IAC1E,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,QAAQ,mBAAmB,KAAK;AAAA,MAChC,SAAS;AAAA,IACX;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACD,MAAI,CAAC,eAAe,IAAI;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,eAAe;AAC5B,MAAI,OAAO,MAAM,GAAG,MAAM,KAAK;AAC7B,WAAO,4BAA4B,MAAM,MAAM;AAAA,EACjD;AAEA,QAAM,cAAc,YAAY,MAAM,MAAM,YAAY;AACxD,QAAM,UAAU,YAAY,MAAM,MAAM,QAAQ;AAChD,MAAI,CAAC,eAAe,CAAC,SAAS;AAC5B,WAAO,uBAAuB;AAAA,EAChC;AAEA,SAAO,WAAW;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,kBACpB,QACA,OACsC;AACtC,MAAI,0BAAsB;AACxB,WAAO,yBAAyB;AAAA,EAClC;AAEA,QAAM,kBAAkBD,gBAAe,KAAK;AAC5C,MAAI,CAAC,iBAAiB;AACpB,WAAO,qBAAqB;AAAA,EAC9B;AAEA,QAAM,YAAY,MAAM,YAAY,eAAe;AACnD,MAAI,CAAC,UAAU,IAAI;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,MAAM;AAAA,IAC5B;AAAA,IACA,UAAU;AAAA,EACZ;AACA,MAAI,CAAC,gBAAgB,IAAI;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,MAAM,iBAAiB,oBAAoB;AAAA,IAC7D,KAAK,gBAAgB,MAAM;AAAA,IAC3B,cAAc,gBAAgB,MAAM;AAAA,IACpC,UAAU,gBAAgB,MAAM;AAAA,EAClC,CAAC;AACD,MAAI,CAAC,YAAY,IAAI;AACnB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAsB,eACpB,QACsC;AACtC,MAAI,0BAAsB;AACxB,WAAO,yBAAyB;AAAA,EAClC;AAEA,QAAM,eAAe,MAAM;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,aAAa,IAAI;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,gBAAgB,aAAa,KAAK;AACrD,MAAI,CAAC,YAAY;AACf,WAAO,uBAAuB;AAAA,EAChC;AAEA,SAAO,WAAW,UAAU;AAC9B;;;AC9OA,IAAMI,QAAO;AAEN,IAAK,oBAAL,CAAKC,sBAAL;AACL,EAAAA,oCAAA,qBAAkBD,QAAO,KAAzB;AACA,EAAAC,oCAAA,wBAAqBD,QAAO,KAA5B;AACA,EAAAC,oCAAA,0BAAuBD,QAAO,KAA9B;AACA,EAAAC,oCAAA,0BAAuBD,QAAO,KAA9B;AACA,EAAAC,oCAAA,yBAAsBD,QAAO,KAA7B;AACA,EAAAC,oCAAA,sBAAmBD,QAAO,KAA1B;AACA,EAAAC,oCAAA,oBAAiBD,QAAO,KAAxB;AAPU,SAAAC;AAAA,GAAA;AAUL,IAAM,uBAAuB;AAAA,EAClC,iBAAiB;AAAA,EACjB;AACF;AAEO,IAAM,0BAA0B;AAAA,EACrC,iBAAiB;AAAA,EACjB;AACF;AAEO,IAAM,4BAA4B;AAAA,EACvC,iBAAiB;AAAA,EACjB;AACF;AAEO,IAAMC,6BAA4B;AAAA,EACvC,iBAAiB;AAAA,EACjB;AACF;AAEO,IAAMC,4BAA2B;AAAA,EACtC,iBAAiB;AAAA,EACjB;AACF;AAEO,IAAM,wBAAwB;AAAA,EACnC,iBAAiB;AAAA,EACjB;AACF;AAEO,IAAM,sBAAsB;AAAA,EACjC,iBAAiB;AAAA,EACjB;AACF;;;AJhBA,IAAM,aAAa;AAEnB,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,sBAAsB,OAAuB;AACpD,QAAM,UAAU,MAAM,KAAK;AAC3B,QAAM,SAAS;AACf,MAAI,QAAQ,WAAW,MAAM,GAAG;AAC9B,WAAO,QAAQ,MAAM,OAAO,MAAM,EAAE,KAAK;AAAA,EAC3C;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,SAAO,0BAA0B,sBAAsB,KAAK,CAAC;AAC/D;AAEA,SAAS,gBAAgB,UAAoD;AAC3E,QAAM,eAAoB,cAAQ,QAAQ,IAAI,GAAG,QAAQ;AACzD,QAAM,WAAgB,eAAS,YAAY;AAC3C,QAAM,MAAW,cAAQ,QAAQ,EAAE,YAAY;AAE/C,MAAI;AACJ,MAAI,iBAAiB,IAAI,GAAG,GAAG;AAC7B,gBAAY;AAAA,EACd,WAAW,iBAAiB,IAAI,GAAG,GAAG;AACpC,gBAAY;AAAA,EACd;AAEA,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,sBACP,KACA,QACA;AACA,QAAM,aACJ,OAAO,QAAQ,WACX,MACA,OAAO,QAAQ,WACb,OAAO,SAAS,KAAK,EAAE,IACvB,OAAO;AACf,QAAM,OAAO,OAAO,SAAS,UAAU,IAAI,aAAa;AACxD,QAAM,UAAU,QAAQ,KAAK;AAC7B,SAAO;AAAA,IACL;AAAA,IACA,WAAW,QAAQ,SAAS,IACxB,UACA,qDAAa,OAAO,OAAO,SAAS,CAAC;AAAA,EAC3C;AACF;AAEA,eAAsB,cACpB,SACyC;AACzC,QAAM,cAAc,MAAM,0BAAsB;AAChD,MAAI,CAAC,YAAY,IAAI;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,YAAY,OAAO,KAAK;AACtC,MAAI,CAAC,OAAO;AACV,WAAO,wBAAwB;AAAA,EACjC;AAEA,QAAM,WAAW,gBAAgB,QAAQ,QAAQ;AACjD,MAAI,CAAC,UAAU;AACb,WAAO,0BAA0B;AAAA,EACnC;AAEA,MAAI;AACJ,MAAI;AACF,gBAAY,MAAS,aAAS,SAAS,YAAY;AAAA,EACrD,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO,oBAAoB,OAAO;AAAA,EACpC;AAEA,QAAM,WAAW,IAAI,SAAS;AAC9B,WAAS,OAAO,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,GAAG,SAAS,QAAQ;AAChE,WAAS,OAAO,cAAc,OAAO,SAAS,SAAS,CAAC;AAExD,QAAM,SAAS,MAAM,YAA6B,YAAY;AAAA,IAC5D,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ,gBAAgB,KAAK;AAAA,MAC7B,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,EACR,GAAG;AAAA,IACD,sBAAsB,CAAC,YAAYC,2BAA0B,OAAO;AAAA,IACpE,qBAAqB,CAAC,YAAYC,0BAAyB,OAAO;AAAA,EACpE,CAAC;AACD,MAAI,CAAC,OAAO,IAAI;AACd,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO;AACvB,QAAM,MAAM,SAAS;AACrB,MAAI,OAAO,GAAG,MAAM,KAAK;AACvB,WAAO,sBAAsB,KAAK,SAAS,MAAM;AAAA,EACnD;AAEA,QAAM,UAAU,SAAS,MAAM,UAAU,KAAK;AAC9C,MAAI,CAAC,SAAS;AACZ,WAAO,UAAU,GAAG,uEAAqB;AAAA,EAC3C;AAEA,SAAO,WAAW;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;;;AK/KA,eAAsB,gBACpB,UACyC;AACzC,SAAO,sBAAsB;AAC/B;;;ACFA,eAAsB,YACpB,SACyC;AACzC,MAAI,QAAQ,0BAAsB;AAChC,WAAO,cAAc,OAAO;AAAA,EAC9B;AAEA,SAAO,gBAAgB,OAAO;AAChC;;;APCO,IAAM,2BAAN,cAAuC,YAAuC;AAAA,EACzE,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEU,oBAAoB,KAAoB;AAChD,QAAI,SAAS,eAAe,gFAAe;AAAA,EAC7C;AAAA,EAEU,kBAAkB,KAAoB;AAC9C,QAAI;AAAA,MACF,IAAIC,QAAO,yBAAyB,0BAAM,EACvC,QAAQ,iCAAuB,CAAC,EAChC,oBAAoB;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAgB,SACd,KAC2B;AAC3B,UAAM,WAAW,IAAI,KAAK,CAAC;AAC3B,UAAM,SAAS,IAAI,QAAQ;AAE3B,QAAI,CAAC,UAAU;AACb,YAAM,QAAQ,qBAAqB;AACnC,WAAK,iBAAiB,MAAM,MAAM,MAAM,GAAG;AAC3C,aAAO,KAAK,QAAQ;AAAA,IACtB;AAEA,UAAM,SAAS,MAAM,YAAY,EAAE,UAAU,OAAO,CAAC;AACrD,QAAI,CAAC,OAAO,IAAI;AACd,WAAK,iBAAiB,OAAO,MAAM,OAAO,GAAG;AAC7C,aAAO,KAAK,QAAQ;AAAA,IACtB;AAEA,SAAK,cAAc;AAAA,MACjB,UAAU,OAAO,MAAM;AAAA,MACvB,WAAgB,cAAQ,QAAQ,IAAI,GAAG,QAAQ;AAAA,MAC/C,QAAQ,OAAO,MAAM;AAAA,MACrB,YAAY,OAAO,MAAM,SAAS;AAAA,IACpC,CAAC;AACD,WAAO,KAAK,QAAQ;AAAA,EACtB;AACF;;;AQ5DA,SAAS,UAAAC,eAAc;AAYhB,IAAM,wBAAN,cAAoC,YAAoC;AAAA,EACnE,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEU,oBAAoB,KAAoB;AAChD,QAAI,SAAS,WAAW,2CAAuB;AAAA,EACjD;AAAA,EAEU,kBAAkB,KAAoB;AAC9C,QAAI;AAAA,MACF,IAAIC,QAAO,yBAAyB,gCAAY,EAC7C,QAAQ,CAAC,MAAM,MAAM,CAAC,EACtB,oBAAoB;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAgB,SACd,KAC2B;AAC3B,UAAM,QAAQ,IAAI,KAAK,CAAC;AACxB,UAAM,EAAE,OAAO,IAAI,IAAI;AAEvB,UAAM,SAAS,MAAM,cAAc,QAAQ,KAAK;AAChD,QAAI,CAAC,OAAO,IAAI;AACd,aAAO,KAAK,WAAW,OAAO,MAAM,OAAO,GAAG;AAAA,IAChD;AAEA,QAAI,0BAAsB;AACxB,YAAM,gBAAgB,MAAM,kBAAkB,QAAQ,KAAK;AAC3D,UAAI,CAAC,cAAc,IAAI;AACrB,eAAO,KAAK,WAAW,cAAc,MAAM,cAAc,GAAG;AAAA,MAC9D;AAEA,WAAK,cAAc;AAAA,QACjB;AAAA,QACA,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,KAAK;AAAA,UACH,KAAK,cAAc,MAAM;AAAA,UACzB,cAAc,cAAc,MAAM;AAAA,UAClC,UAAU,cAAc,MAAM;AAAA,QAChC;AAAA,MACF,CAAC;AACD,aAAO,KAAK,QAAQ;AAAA,IACtB;AAEA,SAAK,cAAc;AAAA,MACjB;AAAA,MACA,QAAQ;AAAA,MACR,WAAW;AAAA,IACb,CAAC;AACD,WAAO,KAAK,QAAQ;AAAA,EACtB;AACF;;;ACrEA,SAAS,UAAAC,eAAc;;;ACCvB,IAAMC,QAAO;AAEN,IAAK,iBAAL,CAAKC,mBAAL;AACL,EAAAA,8BAAA,qBAAkBD,QAAO,KAAzB;AACA,EAAAC,8BAAA,uBAAoBD,QAAO,KAA3B;AACA,EAAAC,8BAAA,0BAAuBD,QAAO,KAA9B;AACA,EAAAC,8BAAA,yBAAsBD,QAAO,KAA7B;AACA,EAAAC,8BAAA,mBAAgBD,QAAO,KAAvB;AACA,EAAAC,8BAAA,sBAAmBD,QAAO,KAA1B;AANU,SAAAC;AAAA,GAAA;AASL,IAAM,uBAAuB;AAAA,EAClC,cAAc;AAAA,EACd;AACF;AAEO,IAAMC,0BAAyB;AAAA,EACpC,cAAc;AAAA,EACd;AACF;AAEO,IAAMC,6BAA4B;AAAA,EACvC,cAAc;AAAA,EACd;AACF;AAEO,IAAMC,4BAA2B;AAAA,EACtC,cAAc;AAAA,EACd;AACF;AAEO,IAAM,qBAAqB;AAAA,EAChC,cAAc;AAAA,EACd;AACF;AAEO,IAAMC,yBAAwB;AAAA,EACnC,cAAc;AAAA,EACd;AACF;;;ACrBA,IAAM,YAAY;AAClB,IAAM,eAAe,oBAAI,IAAI;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAASC,gBAAe,OAAuB;AAC7C,QAAM,UAAU,MAAM,KAAK;AAC3B,QAAM,SAAS;AACf,MAAI,QAAQ,WAAW,MAAM,GAAG;AAC9B,WAAO,QAAQ,MAAM,OAAO,MAAM,EAAE,KAAK;AAAA,EAC3C;AACA,SAAO;AACT;AAEA,SAASC,oBAAmB,OAAuB;AACjD,SAAO,0BAA0BD,gBAAe,KAAK,CAAC;AACxD;AAEA,SAAS,kBAAkB,MAAoD;AAC7E,MAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,MAAM,QAAQ,IAAI,GAAG;AACpE,WAAO;AAAA,EACT;AAEA,QAAM,SAAS;AACf,QAAM,UAAU,OAAO;AACvB,MAAI,OAAO,YAAY,YAAY,QAAQ,KAAK,EAAE,WAAW,GAAG;AAC9D,WAAO;AAAA,EACT;AAEA,aAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AACrC,QAAI,CAAC,aAAa,IAAI,GAAG,GAAG;AAC1B,WAAK,QAAQ,eAAe,QAAQ,GAAG;AAAA,IACzC;AAAA,EACF;AAEA,SAAO,WAAW,QAAQ,KAAK;AAC/B,SAAO;AACT;AAEA,SAAS,eAAe,MAA4C;AAClE,MAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,SAA0B,CAAC;AACjC,aAAW,QAAQ,MAAM;AACvB,UAAM,YAAY,kBAAkB,IAAI;AACxC,QAAI,WAAW;AACb,aAAO,KAAK,SAAS;AAAA,IACvB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,KAA0C;AAChE,QAAM,SACJ,OAAO,QAAQ,WACX,MACA,OAAO,QAAQ,WACb,OAAO,SAAS,KAAK,EAAE,IACvB,OAAO;AACf,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,eAAsB,eACpB,SACsC;AACtC,QAAM,mBAAmB,MAAM,4BAAwB;AACvD,MAAI,CAAC,iBAAiB,IAAI;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,MAAM,0BAAsB;AAChD,MAAI,CAAC,YAAY,IAAI;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,YAAY,OAAO,KAAK;AACtC,MAAI,CAAC,OAAO;AACV,WAAOE,wBAAuB;AAAA,EAChC;AAEA,QAAM,iBAAiB,MAAM;AAAA,IAC3B;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,QAAQD,oBAAmB,KAAK;AAAA,QAChC,SAAS;AAAA,MACX;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,cAAc,iBAAiB,MAAM;AAAA,QACrC,WAAW,QAAQ;AAAA,QACnB,KAAK,iBAAiB,MAAM;AAAA,QAC5B,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACE,sBAAsB,CAAC,YAAYE,2BAA0B,OAAO;AAAA,MACpE,qBAAqB,CAAC,YAAYC,0BAAyB,OAAO;AAAA,IACpE;AAAA,EACF;AACA,MAAI,CAAC,eAAe,IAAI;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,eAAe;AAChC,MAAI,OAAO,SAAS,GAAG,MAAM,KAAK;AAChC,WAAO;AAAA,MACL,eAAe,SAAS,GAAG;AAAA,MAC3B,SAAS,QAAQ,KAAK,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,SAAS,eAAe,SAAS,IAAI;AAC3C,MAAI,CAAC,QAAQ;AACX,WAAO,mBAAmB,wDAAgB;AAAA,EAC5C;AAEA,SAAO,WAAW,MAAM;AAC1B;;;AChJA,eAAsB,iBACpB,UACsC;AACtC,SAAOC,uBAAsB;AAC/B;;;ACFA,eAAsB,aACpB,SACsC;AACtC,MAAI,QAAQ,0BAAsB;AAChC,WAAO,eAAe,OAAO;AAAA,EAC/B;AAEA,SAAO,iBAAiB,OAAO;AACjC;;;AJAO,IAAM,wBAAN,cAAoC,YAAoC;AAAA,EACnE,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEU,oBAAoB,KAAoB;AAChD,QAAI,SAAS,iBAAiB,iEAAoB;AAAA,EACpD;AAAA,EAEU,kBAAkB,KAAoB;AAC9C,QAAI;AAAA,MACF,IAAIC,QAAO,yBAAyB,0BAAM,EACvC,QAAQ,iCAAuB,CAAC,EAChC,oBAAoB;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAgB,SACd,KAC2B;AAC3B,UAAM,WAAY,IAAI,KAAK,CAAC,KAA8B,CAAC;AAC3D,UAAM,SAAS,IAAI,QAAQ;AAE3B,UAAM,qBAAqB,SACxB,IAAI,CAAC,YAAY,QAAQ,KAAK,CAAC,EAC/B,OAAO,CAAC,YAAY,QAAQ,SAAS,CAAC;AAEzC,QAAI,mBAAmB,WAAW,GAAG;AACnC,YAAM,QAAQ,qBAAqB;AACnC,WAAK,iBAAiB,MAAM,MAAM,MAAM,GAAG;AAC3C,aAAO,KAAK,QAAQ;AAAA,IACtB;AAEA,UAAM,SAAS,MAAM,aAAa;AAAA,MAChC;AAAA,MACA,UAAU;AAAA,IACZ,CAAC;AACD,QAAI,CAAC,OAAO,IAAI;AACd,WAAK,iBAAiB,OAAO,MAAM,OAAO,GAAG;AAC7C,aAAO,KAAK,QAAQ;AAAA,IACtB;AAEA,SAAK,cAAc,OAAO,KAAK;AAC/B,WAAO,KAAK,QAAQ;AAAA,EACtB;AACF;;;AKpDO,IAAM,gBAAN,cAA4B,mBAAmB;AAAA,EAC1C,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS,CAAC,MAAM,KAAK;AAAA,IACvB;AAAA,EACF;AAAA,EAEU,uBAA6B;AACrC,SAAK,eAAe,IAAI,uBAAuB,CAAC;AAChD,SAAK,eAAe,IAAI,yBAAyB,CAAC;AAClD,SAAK,eAAe,IAAI,6BAA6B,CAAC;AACtD,SAAK,eAAe,IAAI,8BAA8B,CAAC;AACvD,SAAK,eAAe,IAAI,yBAAyB,CAAC;AAClD,SAAK,eAAe,IAAI,sBAAsB,CAAC;AAC/C,SAAK,eAAe,IAAI,sBAAsB,CAAC;AAAA,EACjD;AACF;;;AC5BA,SAAS,iBAAiB;AAYnB,IAAe,iBAAf,cAAsC,YAAgC;AAAA,EACjE,oBAAoB,KAAoB;AAChD,QAAI,SAAS,SAAS,4BAAQ,QAAQ;AAAA,EACxC;AAAA,EAEU,kBAAkB,KAAoB;AAC9C,QAAI,OAAO,mBAAmB,oCAAgB;AAAA,EAChD;AAAA,EAEU,QAAQ,MAAkC;AAClD,UAAM,SAAS,UAAU,OAAO,MAAM;AAAA,MACpC,KAAK,QAAQ,IAAI;AAAA,MACjB,OAAO;AAAA,IACT,CAAC;AAED,QAAI,OAAO,OAAO;AAChB,aAAO,KAAK;AAAA,QACV;AAAA,QACA,oBAAU,KAAK,KAAK,GAAG,CAAC,kBAAQ,OAAO,MAAM,OAAO;AAAA,MACtD;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,aAAa,OAAO,SAAS,aAAa,OAAO,MAAM,KAAK;AAClE,aAAO,KAAK;AAAA,QACV,OAAO,UAAU;AAAA,QACjB,oBAAU,KAAK,KAAK,GAAG,CAAC,gBAAM,UAAU;AAAA,MAC1C;AAAA,IACF;AAEA,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEU,eAAe,MAAoC;AAC3D,UAAM,SAAS,UAAU,OAAO,MAAM;AAAA,MACpC,KAAK,QAAQ,IAAI;AAAA,MACjB,UAAU;AAAA,IACZ,CAAC;AAED,QAAI,OAAO,OAAO;AAChB,aAAO,UAAU,GAAG,oBAAU,KAAK,KAAK,GAAG,CAAC,kBAAQ,OAAO,MAAM,OAAO,EAAE;AAAA,IAC5E;AAEA,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,aAAa,OAAO,SAAS,aAAa,OAAO,MAAM,KAAK;AAClE,YAAM,aACJ,OAAO,OAAO,WAAW,YAAY,OAAO,OAAO,KAAK,IACpD,KAAK,OAAO,OAAO,KAAK,CAAC,KACzB;AACN,aAAO;AAAA,QACL,OAAO,UAAU;AAAA,QACjB,oBAAU,KAAK,KAAK,GAAG,CAAC,gBAAM,UAAU,GAAG,UAAU;AAAA,MACvD;AAAA,IACF;AAEA,WAAO,YAAY,OAAO,UAAU,IAAI,KAAK,CAAC;AAAA,EAChD;AAAA,EAEU,aAA+B;AACvC,WAAO,KAAK,QAAQ,CAAC,OAAO,GAAG,CAAC;AAAA,EAClC;AAAA,EAEU,WAAW,KAAa,UAAqC;AACrE,UAAM,OAAO,CAAC,UAAU,MAAM,GAAG;AACjC,QAAI,UAAU;AACZ,WAAK,KAAK,aAAa;AAAA,IACzB;AACA,WAAO,KAAK,QAAQ,IAAI;AAAA,EAC1B;AAAA,EAEU,SAAS,UAAqC;AACtD,UAAM,OAAO,CAAC,MAAM;AACpB,QAAI,UAAU;AACZ,WAAK,KAAK,aAAa;AAAA,IACzB;AACA,WAAO,KAAK,QAAQ,IAAI;AAAA,EAC1B;AAAA,EAEU,sBAAsB,YAAsC;AACpE,WAAO,KAAK,QAAQ,CAAC,YAAY,MAAM,UAAU,CAAC;AAAA,EACpD;AAAA,EAEU,qBAAqB,YAAsC;AACnE,WAAO,KAAK,QAAQ,CAAC,QAAQ,YAAY,UAAU,UAAU,CAAC;AAAA,EAChE;AAAA,EAEU,qBAAqB,YAAsC;AACnE,WAAO,KAAK,QAAQ,CAAC,QAAQ,MAAM,UAAU,UAAU,CAAC;AAAA,EAC1D;AAAA,EAEU,oBAAwC;AAChD,UAAM,SAAS,KAAK,eAAe,CAAC,UAAU,gBAAgB,CAAC;AAC/D,QAAI,CAAC,OAAO,IAAI;AACd,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,OAAO,OAAO;AACjB,aAAO,UAAU,GAAG,oHAAqB;AAAA,IAC3C;AAEA,WAAO;AAAA,EACT;AAAA,EAEU,gBAAoC;AAC5C,WAAO,KAAK,eAAe,CAAC,UAAU,SAAS,mBAAmB,CAAC;AAAA,EACrE;AAAA,EAEU,kBAAkB,WAA2B;AACrD,UAAM,UAAU,UAAU,KAAK,EAAE,QAAQ,UAAU,EAAE;AAErD,QAAI,QAAQ,WAAW,SAAS,KAAK,QAAQ,WAAW,UAAU,GAAG;AACnE,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,QAAQ,MAAM,oBAAoB;AAClD,QAAI,SAAS;AACX,aAAO,WAAW,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC;AAAA,IAC5C;AAEA,UAAM,aAAa,QAAQ,MAAM,6BAA6B;AAC9D,QAAI,YAAY;AACd,aAAO,WAAW,WAAW,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC;AAAA,IAClD;AAEA,WAAO;AAAA,EACT;AAAA,EAEU,kBAAkB,KAA+B;AACzD,UAAM,SACJ,QAAQ,aAAa,WACjB,UAAU,QAAQ,CAAC,GAAG,GAAG;AAAA,MACvB,KAAK,QAAQ,IAAI;AAAA,MACjB,OAAO;AAAA,IACT,CAAC,IACD,QAAQ,aAAa,UACnB,UAAU,OAAO,CAAC,MAAM,SAAS,IAAI,GAAG,GAAG;AAAA,MACzC,KAAK,QAAQ,IAAI;AAAA,MACjB,OAAO;AAAA,IACT,CAAC,IACD,UAAU,YAAY,CAAC,GAAG,GAAG;AAAA,MAC3B,KAAK,QAAQ,IAAI;AAAA,MACjB,OAAO;AAAA,IACT,CAAC;AAET,QAAI,OAAO,OAAO;AAChB,aAAO,KAAK,WAAW,GAAG,+CAAY,OAAO,MAAM,OAAO,EAAE;AAAA,IAC9D;AAEA,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,aAAa,OAAO,SAAS,aAAa,OAAO,MAAM,KAAK;AAClE,aAAO,KAAK;AAAA,QACV,OAAO,UAAU;AAAA,QACjB,6CAAU,UAAU;AAAA,MACtB;AAAA,IACF;AAEA,WAAO,KAAK,QAAQ;AAAA,EACtB;AAOF;;;AC1KO,IAAM,qBAAN,cAAiC,eAAe;AAAA,EAC3C,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS,CAAC,GAAG;AAAA,IACf;AAAA,EACF;AAAA,EAEU,oBAAoB,KAAoB;AAChD,QAAI,SAAS,YAAY,kDAAU;AAAA,EACrC;AAAA,EAEA,MAAgB,SACd,KAC2B;AAC3B,UAAM,aAAa,IAAI,KAAK,CAAC;AAE7B,UAAM,sBAAsB,KAAK,kBAAkB;AACnD,QAAI,CAAC,oBAAoB,IAAI;AAC3B,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,KAAK,qBAAqB,oBAAoB,KAAK;AACtE,QAAI,CAAC,WAAW,IAAI;AAClB,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,KAAK,sBAAsB,UAAU;AAC5D,QAAI,CAAC,eAAe,IAAI;AACtB,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,qBAAqB,UAAU;AAAA,EAC7C;AACF;;;ACpCO,IAAM,eAAN,cAA2B,eAAe;AAAA,EACrC,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAgB,SACd,KAC2B;AAC3B,UAAM,MAAM,IAAI,KAAK,CAAC;AACtB,UAAM,EAAE,OAAO,IAAI,IAAI;AACvB,UAAM,UAAU,WAAW;AAE3B,UAAM,YAAY,KAAK,WAAW;AAClC,QAAI,CAAC,UAAU,IAAI;AACjB,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,WAAW,KAAK,OAAO;AAAA,EACrC;AACF;;;ACtBO,IAAM,eAAN,cAA2B,eAAe;AAAA,EACrC,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAgB,SACd,MAC2B;AAC3B,UAAM,sBAAsB,KAAK,kBAAkB;AACnD,QAAI,CAAC,oBAAoB,IAAI;AAC3B,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,KAAK,cAAc;AAC3C,QAAI,CAAC,gBAAgB,IAAI;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,KAAK,kBAAkB,gBAAgB,KAAK;AAC5D,UAAM,QACJ,GAAG,OAAO,oDAAoD,mBAAmB,oBAAoB,KAAK,CAAC;AAE7G,SAAK,QAAQ,KAAK;AAElB,UAAM,aAAa,KAAK,kBAAkB,KAAK;AAC/C,QAAI,CAAC,WAAW,IAAI;AAClB,WAAK,OAAO,WAAW,GAAG;AAAA,IAC5B;AAEA,WAAO,KAAK,QAAQ;AAAA,EACtB;AACF;;;AClCO,IAAM,eAAN,cAA2B,eAAe;AAAA,EACrC,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAgB,SACd,KAC2B;AAC3B,UAAM,MAAM,IAAI,KAAK,CAAC;AACtB,UAAM,EAAE,OAAO,IAAI,IAAI;AACvB,UAAM,UAAU,WAAW;AAE3B,UAAM,YAAY,KAAK,WAAW;AAClC,QAAI,CAAC,UAAU,IAAI;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,KAAK,WAAW,KAAK,OAAO;AACjD,QAAI,CAAC,aAAa,IAAI;AACpB,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AACF;;;ACzBO,IAAM,aAAN,cAAyB,mBAAmB;AAAA,EACvC,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS,CAAC,GAAG;AAAA,IACf;AAAA,EACF;AAAA,EAEU,uBAA6B;AACrC,SAAK,eAAe,IAAI,aAAa,CAAC;AACtC,SAAK,eAAe,IAAI,aAAa,CAAC;AACtC,SAAK,eAAe,IAAI,mBAAmB,CAAC;AAC5C,SAAK,eAAe,IAAI,aAAa,CAAC;AAAA,EACxC;AACF;;;ACtBA,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;;;ACDrB,SAAS,aAAa;AAIf,IAAe,sBAAf,cAA2C,YAAY;AAAA,EAClD,gBACR,SACA,MAAc,QAAQ,IAAI,GAC1B,YAA+B,CAAC,GACL;AAC3B,UAAM,QAAQ,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA,KAAK,EAAE,GAAG,QAAQ,KAAK,GAAG,UAAU;AAAA,MACpC,OAAO;AAAA,MACP,OAAO;AAAA,IACT,CAAC;AAED,WAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,YAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,QAAAA;AAAA,UACE,KAAK;AAAA,YACH;AAAA,YACA,gBAAM,OAAO,kBAAQ,MAAM,OAAO;AAAA,UACpC;AAAA,QACF;AAAA,MACF,CAAC;AAED,YAAM,GAAG,SAAS,CAAC,MAAM,WAAW;AAClC,YAAI,SAAS,GAAG;AACd,UAAAA,SAAQ,KAAK,QAAQ,CAAC;AACtB;AAAA,QACF;AAEA,cAAM,aAAa,SAAS,aAAa,MAAM,KAAK;AACpD,QAAAA;AAAA,UACE,KAAK;AAAA,YACH,QAAQ;AAAA,YACR,gBAAM,OAAO,gBAAM,UAAU;AAAA,UAC/B;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;;;ADpCO,IAAM,yBAAN,cAAqC,oBAAoB;AAAA,EACpD,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS,CAAC,IAAI;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,MAAgB,SACd,MAC2B;AAC3B,UAAM,MAAMC,MAAKC,SAAQ,GAAG,QAAQ,SAAS;AAC7C,WAAO,KAAK,gBAAgB,iCAAiC,GAAG;AAAA,EAClE;AACF;;;AEtBA,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;AAMd,IAAM,2BAAN,cAAuC,oBAAoB;AAAA,EACtD,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS,CAAC,IAAI;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,MAAgB,SACd,MAC2B;AAC3B,UAAM,MAAMC,MAAKC,SAAQ,GAAG,QAAQ,QAAQ;AAC5C,WAAO,KAAK,gBAAgB,2CAA2C,GAAG;AAAA,EAC5E;AACF;;;ACjBO,IAAM,kBAAN,cAA8B,mBAAmB;AAAA,EAC5C,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS,CAAC,IAAI;AAAA,IAChB;AAAA,EACF;AAAA,EAEU,uBAA6B;AACrC,SAAK,eAAe,IAAI,uBAAuB,CAAC;AAChD,SAAK,eAAe,IAAI,yBAAyB,CAAC;AAAA,EACpD;AACF;;;AClBA,SAAS,SAAAC,cAAa;AAKf,IAAe,gBAAf,cAEG,YAAsB;AAAA,EACpB,YAAY,KAA8C;AAClE,UAAM,QAAkB,CAAC;AAEzB,eAAW,OAAO,IAAI,MAAM;AAC1B,UAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,cAAM,KAAK,GAAG,IAAI,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC,CAAC;AAAA,MAC/C,WAAW,QAAQ,UAAa,QAAQ,MAAM;AAC5C,cAAM,KAAK,OAAO,GAAG,CAAC;AAAA,MACxB;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,GAAG,EAAE,KAAK;AAAA,EAC9B;AAAA,EAEU,YACR,SACA,MAC2B;AAC3B,UAAM,QAAQC,OAAM,SAAS,MAAM;AAAA,MACjC,KAAK,QAAQ,IAAI;AAAA,MACjB,OAAO;AAAA,IACT,CAAC;AAED,WAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,YAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,QAAAA;AAAA,UACE,KAAK;AAAA,YACH;AAAA,YACA,gBAAM,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC,kBAAQ,MAAM,OAAO;AAAA,UACtD;AAAA,QACF;AAAA,MACF,CAAC;AAED,YAAM,GAAG,SAAS,CAAC,MAAM,WAAW;AAClC,YAAI,SAAS,GAAG;AACd,UAAAA,SAAQ,KAAK,QAAQ,CAAC;AACtB;AAAA,QACF;AAEA,cAAM,aAAa,SAAS,aAAa,MAAM,KAAK;AACpD,QAAAA;AAAA,UACE,KAAK;AAAA,YACH,QAAQ;AAAA,YACR,gBAAM,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC,gBAAM,UAAU;AAAA,UACjD;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;;;AC/CO,IAAM,qBAAN,cAAiC,cAAc;AAAA,EAC1C,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEU,oBAAoB,KAAoB;AAChD,QAAI,SAAS,gBAAgB,0BAAM;AAAA,EACrC;AAAA,EAEA,MAAgB,SACd,KAC2B;AAC3B,UAAM,UAAU,KAAK,YAAY,GAAG;AACpC,QAAI,CAAC,SAAS;AACZ,aAAO,KAAK,WAAW,GAAG,4CAAS;AAAA,IACrC;AAEA,UAAM,MAAM;AACZ,UAAM,QAAQ;AAEd,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,KAAK;AAAA,QAC9B,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,OAAO;AAAA,QACP,OAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,UACR;AAAA,QACF;AAAA,QACA,OAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,WAAW,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACrD,YAAM,SAAS,WAAW,KAAK,QAAQ,KAAK;AAC5C,aAAO,KAAK;AAAA,QACV,SAAS;AAAA,QACT,8CAAgB,SAAS,MAAM,GAAG,MAAM;AAAA,MAC1C;AAAA,IACF;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,aAAa,KAAK;AAExB,QAAI,CAAC,MAAM,QAAQ,UAAU,KAAK,WAAW,WAAW,GAAG;AACzD,aAAO,KAAK,WAAW,GAAG,kDAAU;AAAA,IACtC;AAEA,QAAI,YAAY;AAChB,eAAW,QAAQ,YAAY;AAC7B,UAAI,QAAQ,OAAO,SAAS,YAAY,aAAa,MAAM;AACzD,cAAM,eAAgB,KAAwC;AAC9D,YAAI,iBAAiB,QAAW;AAC9B,sBAAY,KAAK,UAAU,YAAY;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,SAAK,QAAQ,SAAS;AACtB,WAAO,KAAK,QAAQ;AAAA,EACtB;AACF;;;ACnFO,IAAM,kBAAN,cAA8B,cAAc;AAAA,EACvC,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEU,oBAAoB,KAAoB;AAChD,QAAI,SAAS,gBAAgB,6CAAe;AAAA,EAC9C;AAAA,EAEA,MAAgB,SACd,KAC2B;AAC3B,UAAM,SAAS,KAAK,YAAY,GAAG;AACnC,QAAI,CAAC,QAAQ;AACX,aAAO,KAAK,WAAW,GAAG,gCAAO;AAAA,IACnC;AAEA,WAAO,KAAK,YAAY,SAAS,CAAC,WAAW,kBAAkB,MAAM,MAAM,CAAC;AAAA,EAC9E;AACF;;;AClBO,IAAM,iBAAN,cAA6B,cAA+B;AAAA,EACvD,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEU,kBAAkB,KAAoB;AAC9C,QAAI,OAAO,UAAU,mEAAgC,KAAK;AAAA,EAC5D;AAAA,EAEU,oBAAoB,KAAoB;AAChD,QAAI,SAAS,gBAAgB,6CAAe;AAAA,EAC9C;AAAA,EAEA,MAAgB,SACd,KAC2B;AAC3B,UAAM,SAAS,KAAK,YAAY,GAAG;AACnC,QAAI,CAAC,QAAQ;AACX,aAAO,KAAK,WAAW,GAAG,gCAAO;AAAA,IACnC;AAEA,UAAM,QAAQ,IAAI,QAAQ,OAAO,iBAAiB;AAElD,WAAO,KAAK,YAAY,SAAS;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC5CA,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;;;ACDrB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;AAId,SAAS,0BAA8C;AAC5D,MAAI,QAAQ,aAAa,UAAU;AACjC,WAAO,UAAU,GAAG,0DAAuB;AAAA,EAC7C;AAEA,QAAM,gBAAgBC;AAAA,IACpBC,SAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,CAACC,YAAW,aAAa,GAAG;AAC9B,WAAO,UAAU,GAAG,2CAAkB,aAAa,EAAE;AAAA,EACvD;AAEA,SAAO,WAAW,aAAa;AACjC;AAEO,SAAS,sBAAsB,SAAqC;AACzE,MAAI,CAACA,YAAW,OAAO,GAAG;AACxB,WAAO,UAAU,GAAG,mCAAU,OAAO,EAAE;AAAA,EACzC;AAEA,SAAO,WAAW,OAAO;AAC3B;;;ADVA,IAAM,yBAAwD;AAAA,EAC5D;AAAA,IACE,YAAY;AAAA,IACZ,mBACE;AAAA,IACF,qBAAqB,MAAM;AACzB,YAAM,YAAY,wBAAwB;AAC1C,UAAI,CAAC,UAAU,IAAI;AACjB,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,QACLC,MAAK,UAAU,OAAO,cAAc,qBAAqB;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,mBAAmB;AAAA,IACnB,qBAAqB,MAAM;AACzB,aAAO;AAAA,QACLA,MAAKC,SAAQ,GAAG,QAAQ,eAAe,gBAAgB;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,eAAN,cAA2B,cAA6B;AAAA,EACnD,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEU,kBAAkB,KAAoB;AAC9C,eAAW,SAAS,wBAAwB;AAC1C,UAAI,OAAO,KAAK,MAAM,UAAU,IAAI,MAAM,mBAAmB,KAAK;AAAA,IACpE;AAAA,EACF;AAAA,EAEU,oBAAoB,KAAoB;AAChD,QAAI,SAAS,gBAAgB,6CAAe;AAAA,EAC9C;AAAA,EAEA,MAAgB,SACd,KAC2B;AAC3B,UAAM,SAAS,KAAK,YAAY,GAAG;AACnC,QAAI,CAAC,QAAQ;AACX,aAAO,KAAK,WAAW,GAAG,gCAAO;AAAA,IACnC;AAEA,UAAM,iBAAiB,KAAK,wBAAwB,IAAI,SAAS,MAAM;AACvE,QAAI,CAAC,eAAe,IAAI;AACtB,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,YAAY,SAAS;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEQ,wBACN,SACA,QACoB;AACpB,UAAM,YAAsB,CAAC;AAE7B,eAAW,SAAS,wBAAwB;AAC1C,UAAI,CAAC,QAAQ,MAAM,UAAU,GAAG;AAC9B;AAAA,MACF;AAEA,YAAM,eAAe,MAAM,oBAAoB;AAC/C,UAAI,CAAC,aAAa,IAAI;AACpB,eAAO;AAAA,MACT;AAEA,gBAAU,KAAK,KAAK,sBAAsB,aAAa,KAAK,CAAC;AAAA,IAC/D;AAEA,QAAI,UAAU,WAAW,GAAG;AAC1B,aAAO,WAAW,MAAM;AAAA,IAC1B;AAEA,WAAO,WAAW,CAAC,GAAG,WAAW,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,EACrD;AAAA,EAEQ,sBAAsB,cAA8B;AAC1D,WAAO;AAAA,uCAA6B,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAClD;AACF;;;AE9GO,IAAM,YAAN,cAAwB,mBAAmB;AAAA,EACtC,QAAsB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEU,uBAA6B;AACrC,SAAK,eAAe,IAAI,mBAAmB,CAAC;AAC5C,SAAK,eAAe,IAAI,gBAAgB,CAAC;AACzC,SAAK,eAAe,IAAI,eAAe,CAAC;AACxC,SAAK,eAAe,IAAI,aAAa,CAAC;AAAA,EACxC;AACF;;;ApDTA,IAAMC,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,MAAMA,SAAQ,iBAAiB;AASrC,eAAe,YAA2B;AACxC,QAAM,UAAU,OAAO,KAAK,IAAI,GAAG,EAAE,CAAC;AAEtC,QAAM,MAAM,IAAI,OAAO;AAAA,IACrB,MAAM;AAAA,IACN,SAAS,IAAI;AAAA,IACb,aAAa,IAAI;AAAA,EACnB,CAAC;AAED,MAAI,gBAAgB,IAAI,aAAa,GAAG,EAAE,QAAQ,KAAK,CAAC;AACxD,MAAI,gBAAgB,IAAI,cAAc,CAAC;AACvC,MAAI,gBAAgB,IAAI,WAAW,GAAG,EAAE,QAAQ,KAAK,CAAC;AACtD,MAAI,gBAAgB,IAAI,gBAAgB,GAAG,EAAE,QAAQ,KAAK,CAAC;AAC3D,MAAI,gBAAgB,IAAI,UAAU,GAAG,EAAE,QAAQ,KAAK,CAAC;AAErD,QAAM,SAAS,MAAM,IAAI,IAAI;AAE7B,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,OAAO,MAAM,UAAU,OAAO,GAAG;AAAA,CAAI;AAC7C,YAAQ,WAAW;AAAA,EACrB;AAEA,MAAI,QAAQ;AACd;AAEA,UAAU;","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","spawn","spawn","resolve","homedir","join","existsSync","homedir","join","join","homedir","existsSync","join","homedir","require"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "maoda-commander-tt",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.12",
|
|
4
4
|
"description": "一个通用命令行工具",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -28,7 +28,8 @@
|
|
|
28
28
|
"prerelease": "pnpm run clean && pnpm run build",
|
|
29
29
|
"release": "pnpm version patch && npm publish --registry=https://registry.npmjs.org",
|
|
30
30
|
"pub": "pnpm prerelease && pnpm release",
|
|
31
|
-
"upd": "npm i maoda-commander-tt@latest -g --registry=https://registry.npmjs.org"
|
|
31
|
+
"upd": "npm i maoda-commander-tt@latest -g --registry=https://registry.npmjs.org",
|
|
32
|
+
"login": "npm login --registry=https://registry.npmjs.org"
|
|
32
33
|
},
|
|
33
34
|
"keywords": [
|
|
34
35
|
"cli",
|