@h-ai/cli 1.0.0-beta.5 → 1.0.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +24 -10
- package/README.ja.md +24 -10
- package/README.md +24 -10
- package/dist/{chunk-YHSX7AQX.js → chunk-7DNIMG2H.js} +89 -14
- package/dist/chunk-7DNIMG2H.js.map +1 -0
- package/dist/{chunk-YVNNMC4H.js → chunk-RT5OZJKM.js} +644 -11
- package/dist/chunk-RT5OZJKM.js.map +1 -0
- package/dist/{chunk-VUWM43KR.js → chunk-XI5SKOOR.js} +6673 -723
- package/dist/chunk-XI5SKOOR.js.map +1 -0
- package/dist/cli-config-templates-5KS3AE4H.js +5 -0
- package/dist/{cli-config-templates-LUJGDQNW.js.map → cli-config-templates-5KS3AE4H.js.map} +1 -1
- package/dist/{cli-skill-templates-COTP767H.js → cli-skill-templates-S2YH642Z.js} +3 -3
- package/dist/{cli-skill-templates-COTP767H.js.map → cli-skill-templates-S2YH642Z.js.map} +1 -1
- package/dist/index.js +395 -387
- package/dist/index.js.map +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/src-CX5IJGYM.js +5 -0
- package/dist/src-CX5IJGYM.js.map +1 -0
- package/package.json +11 -11
- package/templates/README.md +4 -0
- package/templates/apps/api/apps/{{projectName}}-serv/README.md.hbs +1 -1
- package/templates/apps/api/apps/{{projectName}}-serv/package.json.hbs +4 -4
- package/templates/apps/api/apps/{{projectName}}-serv/src/lib/server/init.ts.hbs +41 -2
- package/templates/apps/api/images/serv.Dockerfile.hbs +11 -6
- package/templates/apps/fullstack/docs/security-configuration.md.hbs +1 -1
- package/templates/apps/fullstack/images/serv.Dockerfile.hbs +11 -6
- package/templates/apps/fullstack/images/web.Dockerfile.hbs +11 -5
- package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +6 -6
- package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +4 -4
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +1 -2
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/runtime.ts.hbs +26 -2
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +0 -1
- package/templates/base/images/web.Dockerfile.hbs +20 -10
- package/templates/base/package.json.hbs +8 -3
- package/templates/base/src/lib/server/init.ts.hbs +40 -2
- package/templates/shared/run-node.mjs +45 -0
- package/templates/skills/hai-ai/SKILL.md +6 -2
- package/templates/skills/hai-ai/acp.md +143 -0
- package/templates/skills/hai-ai/guide.md +2 -2
- package/templates/skills/hai-ai/resources.md +69 -0
- package/templates/skills/hai-app-create/development.md +9 -8
- package/templates/skills/hai-app-create/reference.md +1 -1
- package/templates/skills/hai-build/SKILL.md +5 -2
- package/templates/skills/hai-build/reference.md +16 -2
- package/templates/skills/hai-ci/SKILL.md +2 -0
- package/templates/skills/hai-core/SKILL.md +2 -2
- package/templates/skills/hai-core/reference.md +3 -3
- package/templates/skills/hai-core/request-access.md +1 -1
- package/templates/skills/hai-crypto/reference.md +1 -1
- package/templates/skills/hai-deploy/SKILL.md +8 -4
- package/templates/skills/hai-deploy/middleware.md +9 -9
- package/templates/skills/hai-iam/reference.md +2 -2
- package/templates/skills/hai-serv/reference.md +1 -1
- package/dist/chunk-VUWM43KR.js.map +0 -1
- package/dist/chunk-YHSX7AQX.js.map +0 -1
- package/dist/chunk-YVNNMC4H.js.map +0 -1
- package/dist/cli-config-templates-LUJGDQNW.js +0 -5
- package/dist/src-24PXSKE6.js +0 -5
- package/dist/src-24PXSKE6.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli-utils.ts","../src/commands/cli-template-engine.ts","../src/commands/cli-create.ts","../src/commands/cli-project-config.ts","../src/commands/cli-add.ts","../src/commands/cli-build-app.ts","../src/commands/cli-build.ts","../src/commands/cli-deploy-secrets.ts","../../reldb/src/reldb-config.ts","../src/commands/cli-deploy-middleware.ts","../src/commands/cli-deploy.ts","../../../node_modules/fflate/esm/index.mjs","../../feedback/src/bundle/feedback-bundle-viewer.ts","../../feedback/src/bundle/feedback-bundle-functions.ts","../src/commands/cli-feedback.ts","../src/commands/cli-generate-serv.ts","../src/commands/cli-generate-target.ts","../src/commands/cli-generate.ts","../src/commands/cli-init.ts","../src/commands/cli-upgrade.ts","../src/cli-main.ts"],"names":["process","fs","path","i","Handlebars","fileURLToPath","DEFAULT_FULLSTACK_FRONTENDS","fse","generateConfigFile","generateProductionEnvironment","parse","ora","chalk","prompts","generatedFiles","pkg","execSync","run","visit","existsSync","join","readFileSync","resolve","relative","execFileSync","dirname","directory","runtime","randomBytes","readdirSync","parsed","mkdirSync","writeFileSync","previous","provider","ask","createRequire","pathToFileURL","imageNames","parseEnv","require","l","_a","core","offset","err","address","name","randomUUID","isAbsolute","pattern","glob","createHash","bytes"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @h-ai/cli — 工具函数\n * @module cli-utils\n */\n\nimport type { TemplateContext } from './cli-types.js'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { fileURLToPath } from 'node:url'\nimport { wrapAnsi } from 'fast-wrap-ansi'\nimport fs from 'fs-extra'\nimport Handlebars from 'handlebars'\n\nconst CAMEL_CASE_SEPARATOR_REGEX = /[-_\\s]+(.)?/g\nconst LEADING_CHAR_REGEX = /^./\n\n/**\n * CLI 交互提示直接写终端,不能交给异步 JSON 日志 transport。\n * @param message - 已完成本地化的终端文案。\n * @example 模块内部上下文\n * ```ts\n * writeCliMessage('hai --help') // 调用方先完成用户文案的本地化。\n * ```\n */\nexport function writeCliMessage(message: string): void {\n process.stdout.write(`${message}\\n`)\n}\n\n/**\n * 显示异常的 message,保留子命令输出;Error 的不可枚举属性不能依赖 JSON 序列化。\n * @param message - 已完成本地化的终端文案。\n * @param error - 可选原始错误或包装对象,用于提取诊断信息。\n * @example 模块内部上下文\n * ```ts\n * writeCliError('Build failed', new Error('The compile command exited with code 1'))\n * ```\n */\nexport function writeCliError(message: string, error?: unknown): void {\n process.stderr.write(`${message}\\n`)\n if (error && typeof error === 'object' && 'error' in error)\n error = error.error\n if (error !== undefined)\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`)\n}\n\n/**\n * 显式按显示宽度换行,为 prompts 的前缀和缩进预留空间,避免中文自动折行后擦除不足。\n * @param description - 需按终端显示宽度折行的描述。\n * @returns 为提示前缀预留显示宽度后的文本。\n * @example 模块内部上下文\n * ```ts\n * const description = formatPromptDescription('Redis stores shared sessions across application instances.')\n * ```\n */\nexport function formatPromptDescription(description: string): string {\n return wrapAnsi(description, Math.max(1, (process.stdout.columns || 80) - 32), { hard: true })\n}\n\n/**\n * 转换为驼峰命名\n * @param str - 待转换的名称。\n * @returns 首字母小写的驼峰名称。\n * @example 模块内部上下文\n * ```ts\n * const name = toCamelCase('order-item') // orderItem\n * ```\n */\nexport function toCamelCase(str: string): string {\n return str\n .replace(CAMEL_CASE_SEPARATOR_REGEX, (_, c) => c ? c.toUpperCase() : '')\n .replace(LEADING_CHAR_REGEX, c => c.toLowerCase())\n}\n\n/**\n * 转换为帕斯卡命名\n * @param str - 待转换的名称。\n * @returns 首字母大写的名称。\n * @example 模块内部上下文\n * ```ts\n * const name = toPascalCase('order-item') // OrderItem\n * ```\n */\nexport function toPascalCase(str: string): string {\n const camel = toCamelCase(str)\n return camel.charAt(0).toUpperCase() + camel.slice(1)\n}\n\n/**\n * 转换为短横线命名\n * @param str - 待转换的名称。\n * @returns 小写连字符名称。\n * @example 模块内部上下文\n * ```ts\n * const name = toKebabCase('orderItem') // order-item\n * ```\n */\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase()\n}\n\n/**\n * 转换为下划线命名\n * @param str - 待转换的名称。\n * @returns 小写下划线名称。\n * @example 模块内部上下文\n * ```ts\n * const name = toSnakeCase('orderItem') // order_item\n * ```\n */\nexport function toSnakeCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toLowerCase()\n}\n\n/**\n * 创建模板上下文\n * @param name - 生成对象名称;用于派生四种大小写形式。\n * @param extra - 附加模板字段;同名字段会覆盖自动生成的名称。\n * @returns 四种名称及附加数据组成的模板对象。\n * @example 模块内部上下文\n * ```ts\n * const context = createTemplateContext('order-item', { projectName: 'shop' })\n * const filename = `${context.kebabCase}.ts`\n * ```\n */\nexport function createTemplateContext(name: string, extra: Record<string, unknown> = {}): TemplateContext {\n return {\n camelCase: toCamelCase(name),\n pascalCase: toPascalCase(name),\n kebabCase: toKebabCase(name),\n snakeCase: toSnakeCase(name),\n ...extra,\n }\n}\n\n/**\n * 渲染模板\n * @param template - 可信 Handlebars 模板文本;不自动转义为目标语言字面量。\n * @param context - 已解析的模板上下文。\n * @returns 不进行 HTML 转义的渲染文本。\n * @example 模块内部上下文\n * ```ts\n * const source = renderTemplate('export interface {{pascalCase}} {}', createTemplateContext('order-item'))\n * ```\n */\nexport function renderTemplate(template: string, context: TemplateContext): string {\n const compiled = Handlebars.compile(template, { noEscape: true })\n return compiled(context)\n}\n\n/**\n * 渲染模板文件\n * @param templatePath - 可信模板文件路径。\n * @param context - 已解析的模板上下文。\n * @returns 读取模板后渲染得到的文本。\n * @example 模块内部上下文\n * ```ts\n * // 使用当前项目中已存在的可信模板文件;读取失败向调用方抛出。\n * const source = await renderTemplateFile(path.join(process.cwd(), 'templates/model.hbs'), createTemplateContext('order-item'))\n * ```\n */\nexport async function renderTemplateFile(\n templatePath: string,\n context: TemplateContext,\n): Promise<string> {\n const template = await fs.readFile(templatePath, 'utf-8')\n return renderTemplate(template, context)\n}\n\n/**\n * 写入文件(创建目录)\n * @param filePath - 已由调用方校验的目标文件路径。\n * @param content - 待渲染、解析或写入的完整文本。\n * @returns 父目录创建及文件写入完成。\n * @example 模块内部上下文\n * ```ts\n * // 覆盖目标文件;调用方负责先验证目标路径与覆盖权限。\n * await writeFile(path.join(process.cwd(), 'src/lib/models/order-item.ts'), 'export interface OrderItem { id: string }\\n')\n * ```\n */\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n await fs.ensureDir(path.dirname(filePath))\n await fs.writeFile(filePath, content, 'utf-8')\n}\n\n/**\n * 检查文件是否存在\n * @param filePath - 已由调用方校验的目标文件路径。\n * @returns 可访问时为 true;访问失败时为 false。\n * @example 模块内部上下文\n * ```ts\n * const hasManifest = await fileExists(path.join(process.cwd(), 'package.json'))\n * ```\n */\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath)\n return true\n }\n catch {\n return false\n }\n}\n\n/**\n * 获取包版本\n * @param pkgPath - package.json 文件路径。\n * @returns 读取的版本号;读取或解析失败时为 null。\n * @example 模块内部上下文\n * ```ts\n * const version = await getPackageVersion(path.join(process.cwd(), 'package.json'))\n * if (version === null) writeCliError('Cannot read package version')\n * ```\n */\nexport async function getPackageVersion(pkgPath: string): Promise<string | null> {\n try {\n const pkg = await fs.readJson(pkgPath)\n return pkg.version\n }\n catch {\n return null\n }\n}\n\n/**\n * 读取 CLI 自身版本号\n *\n * 从当前模块所在目录向上查找 `@h-ai/cli` 的 package.json,\n * 兼容源码布局(src/)与打包产物布局(dist/)以及 npm 安装后的 node_modules 布局。\n * 用于生成项目时固定 `@h-ai/*` 依赖版本,避免硬编码与预发布版本漂移。\n * @returns CLI 自身版本;在限定父目录中找不到时为 0.0.0。\n * @example 模块内部上下文\n * ```ts\n * const version = getCliVersion() // 从 CLI 自身 package.json 查找,不读取目标应用版本。\n * ```\n */\nexport function getCliVersion(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url))\n for (let i = 0; i < 6; i++) {\n try {\n const pkg = fs.readJsonSync(path.join(dir, 'package.json')) as { name?: string, version?: string }\n if (pkg.name === '@h-ai/cli')\n return pkg.version ?? '0.0.0'\n }\n catch {\n // 当前目录无 package.json,继续向上查找\n }\n const parent = path.dirname(dir)\n if (parent === dir)\n break\n dir = parent\n }\n return '0.0.0'\n}\n\n/**\n * 检测包管理器\n * @param cwd - 项目所在目录。\n * @returns 优先 pnpm,其次 yarn,否则 npm。\n * @example 模块内部上下文\n * ```ts\n * const manager = await detectPackageManager(process.cwd()) // pnpm-lock 优先于 yarn.lock;均不存在时使用 npm。\n * ```\n */\nexport async function detectPackageManager(cwd: string): Promise<'pnpm' | 'npm' | 'yarn'> {\n if (await fileExists(path.join(cwd, 'pnpm-lock.yaml'))) {\n return 'pnpm'\n }\n if (await fileExists(path.join(cwd, 'yarn.lock'))) {\n return 'yarn'\n }\n return 'npm'\n}\n\n/**\n * 格式化字节\n * @param bytes - 字节数,以 1024 为单位递进。\n * @returns 最多以 GB 表示且保留一位小数的大小。\n * @example 模块内部上下文\n * ```ts\n * const size = formatBytes(1536) // 1.5 KB(1024 进制,保留一位小数)\n * ```\n */\nexport function formatBytes(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB']\n let size = bytes\n let unitIndex = 0\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024\n unitIndex++\n }\n\n return `${size.toFixed(1)} ${units[unitIndex]}`\n}\n\n/**\n * 格式化时间\n * @param ms - 耗时,单位毫秒。\n * @returns 小于一秒使用 ms,其余使用两位小数秒。\n * @example 模块内部上下文\n * ```ts\n * const elapsed = formatDuration(1250) // 1.25s;小于 1000 使用 ms。\n * ```\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`\n }\n return `${(ms / 1000).toFixed(2)}s`\n}\n\n/**\n * 注册 Handlebars helpers\n * @example 模块内部上下文\n * ```ts\n * registerHelpers()\n * const source = renderTemplate('{{upper camelCase}}', createTemplateContext('order-item')) // ORDERITEM\n * ```\n */\nexport function registerHelpers(): void {\n // 条件判断\n Handlebars.registerHelper('if_eq', function (this: unknown, a: unknown, b: unknown, options: Handlebars.HelperOptions) {\n return a === b ? options.fn(this) : options.inverse(this)\n })\n\n // 日期格式化\n Handlebars.registerHelper('date', () => {\n return new Date().toISOString().split('T')[0]\n })\n\n // 年份\n Handlebars.registerHelper('year', () => {\n return new Date().getFullYear()\n })\n\n // 大写\n Handlebars.registerHelper('upper', (str: string) => {\n return str.toUpperCase()\n })\n\n // 小写\n Handlebars.registerHelper('lower', (str: string) => {\n return str.toLowerCase()\n })\n}\n\n// 初始化时注册 helpers\nregisterHelpers()\n","/**\n * @h-ai/cli — 模板引擎\n *\n * 基于模板目录的项目生成逻辑:\n * 1. 拷贝 base 模板(骨架)\n * 2. 拷贝 apps/{type} 模板(应用类型路由)\n * 3. 叠加 features/{feat} 模板(可选功能路由,静态文件)\n * 4. 渲染 Handlebars 动态模板(base + apps + features 的 .hbs 文件)\n * 5. 拷贝 i18n 脚手架(project.inlang + messages)(当 hasI18n 为 true)\n *\n * @module cli-template-engine\n */\n\nimport type { AppType, FeatureId, FrontendTarget, ModuleConfigs } from '../cli-types.js'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport fse from 'fs-extra'\nimport Handlebars from 'handlebars'\nimport { parse, stringify } from 'yaml'\nimport { getCliVersion } from '../cli-utils.js'\nimport { documentConfig, parameterizeConfig } from './cli-config-environment.js'\nimport { generateConfigFile } from './cli-config-templates.js'\n\n// 注册自定义 Handlebars helpers\nHandlebars.registerHelper('deploymentConfig', () => JSON.stringify(parse(generateConfigFile('deploy')), null, 2))\nHandlebars.registerHelper('if_eq', function (this: unknown, a: unknown, b: unknown, options: Handlebars.HelperOptions) {\n return a === b ? options.fn(this) : options.inverse(this)\n})\n\n// 配置中的显示名称可包含引号、空格和换行,嵌入 TS / JSON / YAML 时必须作为字面量编码。\nHandlebars.registerHelper('json', (value: unknown) => JSON.stringify(value))\nHandlebars.registerHelper('html', (value: string) => Handlebars.escapeExpression(value))\nHandlebars.registerHelper('yaml', (key: string, value: unknown) => stringify({ [key]: value }).trim())\nHandlebars.registerHelper('jsString', (value: string) => `'${JSON.stringify(value).slice(1, -1).replace(/\\\\\"/g, '\"').replace(/'/g, '\\\\\\'')}'`)\n\n// 同一份模块配置供直接渲染和 create 命令使用,避免精简配置覆盖完整模板。\n// 未选择的模块只输出注释;说明也加两层注释,整文件去掉外层后仍是合法 YAML。\nHandlebars.registerHelper('moduleConfig', function (this: TemplateContext, moduleKey: string, enabled: boolean) {\n // 文件模板自身保留结尾换行,helper 不再重复输出空行。\n const generated = generateConfigFile(moduleKey, this.moduleConfigs).trimEnd()\n const content = moduleKey === 'feedback'\n ? generated.replace('HAI_FEEDBACK_APPID:my-app', `HAI_FEEDBACK_APPID:${this.projectName}`)\n : generated\n const configured = this.appType === 'fullstack' && moduleKey === 'iam'\n ? content.replace('HAI_IAM_SEEDDEFAULTDATA:true', 'HAI_IAM_SEEDDEFAULTDATA:false').replace('variant: card', 'variant: split')\n : content\n return enabled\n ? configured\n : `# # 未启用:安装对应模块并在服务端 runtime 中初始化,再取消所需配置的注释。\\n${configured.split('\\n').map(line => line ? `# ${line}` : '').join('\\n')}`\n})\n\nconst TEMPLATE_SKIP_IF_EMPTY_MARKER = '@skipIfEmpty'\nconst NORMALIZED_RENDER_EXTENSIONS = new Set(['.ts', '.js', '.svelte', '.json', '.css'])\n\n// Capacitor 应用为纯客户端 SPA(Svelte 5 + Vite),没有服务端运行时。\n// 服务端专属产物(hooks、server init)必须跳过,否则预渲染会因访问 url.searchParams 报错。\nconst CAPACITOR_SKIPPED_SERVER_FILES = new Set([\n 'src/hooks.server.ts',\n 'src/lib/server/init.ts',\n])\n\n// 以下版本号与生成项目的 pnpm-workspace.yaml catalog 保持一致;\n// 单包脚手架直接写具体版本,pnpm fullstack workspace 会通过 catalog: 引用这些版本。\nconst VERSIONS = {\n tauriFs: '2.7.1',\n tauriDialog: '2.8.3',\n capacitorShare: '8.0.3',\n capacitorFilesystem: '8.1.5',\n antfuEslintConfig: '9.5.1',\n capacitorSecureStorage: '8.0.1',\n // UI / Icon\n bitsUi: '2.19.5',\n iconifyJsonTabler: '1.2.42',\n iconifyTailwind: '1.2.3',\n // Capacitor\n capacitorAndroid: '8.5.3',\n capacitorApp: '8.1.2',\n capacitorCamera: '8.2.5',\n capacitorCli: '8.5.3',\n capacitorCore: '8.5.3',\n capacitorDevice: '8.0.3',\n capacitorIos: '8.5.3',\n capacitorPreferences: '8.0.1',\n capacitorPushNotifications: '8.1.3',\n capacitorStatusBar: '8.0.4',\n // Tailwind / DaisyUI\n daisyui: '5.7.47',\n tailwindcss: '4.3.3',\n tailwindcssVite: '4.3.3',\n // i18n\n inlangParaglide: '2.27.0',\n inlangMessageFormat: '4.5.0',\n // Svelte / Vite\n svelte: '5.57.2',\n svelteKit: '2.70.3',\n svelteAdapterNode: '5.5.7',\n svelteAdapterStatic: '^3.0.10',\n svelteCheck: '4.7.6',\n sveltePlugin: '7.3.1',\n // Build / Test\n vite: '8.3.4',\n vitest: '4.1.11',\n tsup: '8.5.1',\n pinoPretty: '^13.2.0',\n rimraf: '6.1.3',\n // ESLint\n eslint: '10.12.0',\n eslintPluginFormat: '2.0.1',\n eslintPluginSvelte: '3.23.1',\n svelteEslintParser: '1.9.0',\n // Node / TS\n nodeTypes: '26.6.5',\n // Svelte / ESLint / tsup 继续使用稳定的 JavaScript 编译 API。\n typescript: '6.0.3',\n // E2E\n playwright: '1.64.0',\n // Validation\n zod: '4.6.5',\n // Tauri\n tauriCli: '2.12.1',\n} as const\n\n/**\n * 有真实可构建入口的前端目标;miniapp 只生成占位,不进入可启动应用列表。\n * @example 模块内部上下文\n * ```ts\n * const target: ImplementedFrontendTarget = 'web'\n * const port = FRONTEND_PORTS_DEFAULT[target]\n * ```\n */\ntype ImplementedFrontendTarget = Exclude<FrontendTarget, 'miniapp'>\n\nconst FRONTEND_PORTS_DEFAULT: Record<ImplementedFrontendTarget, number> = {\n web: 4173,\n app: 5175,\n desktop: 5176,\n}\n\nconst FRONTEND_LABELS: Record<FrontendTarget, string> = {\n web: 'Web',\n app: 'App',\n miniapp: 'Miniapp',\n desktop: 'Desktop',\n}\n\nconst IMPLEMENTED_FRONTENDS: readonly FrontendTarget[] = ['web', 'app', 'desktop']\nconst DEFAULT_FULLSTACK_FRONTENDS: readonly FrontendTarget[] = ['web', 'app', 'desktop']\nconst DEFAULT_THEMES = ['light', 'dark', 'high-contrast', 'formal'] as const\nconst DEFAULT_THEME_NAME = 'light'\n// 框架与模板同步发布;范围版本会把旧命名 alpha9 视为比 alpha.58 更新。\nconst HAI_PACKAGE_VERSION = getCliVersion()\nconst HAI_PACKAGE_SPECIFIER_CATALOG = 'catalog:'\n/**\n * 模板版本表各键对应的依赖说明符;pnpm 使用 catalog:,其他包管理器使用受测版本。\n * @example 模块内部上下文\n * ```ts\n * const specifiers: FullstackPackageSpecifiers = buildFullstackPackageSpecifiers(true)\n * const version = specifiers.svelte // catalog:\n * ```\n */\ntype FullstackPackageSpecifiers = { [Key in keyof typeof VERSIONS]: string }\n/**\n * 写入 pnpm workspace catalog 的包名与具体版本;不把 catalog: 再嵌套为版本值。\n * @example 模块内部上下文\n * ```ts\n * const catalog: CatalogPackageVersions = { '@h-ai/core': getCliVersion(), svelte: VERSIONS.svelte }\n * ```\n */\ntype CatalogPackageVersions = Readonly<Record<string, string>>\n\nconst HAI_CATALOG_PACKAGE_NAMES = [\n '@h-ai/ai',\n '@h-ai/api-client',\n '@h-ai/api-contract',\n '@h-ai/audit',\n '@h-ai/cache',\n '@h-ai/capacitor',\n '@h-ai/cli',\n '@h-ai/core',\n '@h-ai/crypto',\n '@h-ai/datapipe',\n '@h-ai/deploy',\n '@h-ai/feedback',\n '@h-ai/iam',\n '@h-ai/kit',\n '@h-ai/payment',\n '@h-ai/reach',\n '@h-ai/reldb',\n '@h-ai/scheduler',\n '@h-ai/serv',\n '@h-ai/storage',\n '@h-ai/ui',\n '@h-ai/vecdb',\n] as const\nconst HAI_CATALOG_PACKAGES: Record<string, string> = Object.fromEntries(\n HAI_CATALOG_PACKAGE_NAMES.map(packageName => [packageName, HAI_PACKAGE_VERSION]),\n)\n\nconst FULLSTACK_EXTERNAL_CATALOG_PACKAGES: CatalogPackageVersions = {\n '@tauri-apps/plugin-fs': VERSIONS.tauriFs,\n '@tauri-apps/plugin-dialog': VERSIONS.tauriDialog,\n '@capacitor/share': VERSIONS.capacitorShare,\n '@capacitor/filesystem': VERSIONS.capacitorFilesystem,\n '@antfu/eslint-config': VERSIONS.antfuEslintConfig,\n '@aparajita/capacitor-secure-storage': VERSIONS.capacitorSecureStorage,\n '@capacitor/android': VERSIONS.capacitorAndroid,\n '@capacitor/app': VERSIONS.capacitorApp,\n '@capacitor/camera': VERSIONS.capacitorCamera,\n '@capacitor/cli': VERSIONS.capacitorCli,\n '@capacitor/core': VERSIONS.capacitorCore,\n '@capacitor/device': VERSIONS.capacitorDevice,\n '@capacitor/ios': VERSIONS.capacitorIos,\n '@capacitor/preferences': VERSIONS.capacitorPreferences,\n '@capacitor/push-notifications': VERSIONS.capacitorPushNotifications,\n '@capacitor/status-bar': VERSIONS.capacitorStatusBar,\n '@iconify-json/tabler': VERSIONS.iconifyJsonTabler,\n '@iconify/tailwind4': VERSIONS.iconifyTailwind,\n '@inlang/paraglide-js': VERSIONS.inlangParaglide,\n '@inlang/plugin-message-format': VERSIONS.inlangMessageFormat,\n '@playwright/test': VERSIONS.playwright,\n '@sveltejs/vite-plugin-svelte': VERSIONS.sveltePlugin,\n '@tailwindcss/vite': VERSIONS.tailwindcssVite,\n '@tauri-apps/cli': VERSIONS.tauriCli,\n '@types/node': VERSIONS.nodeTypes,\n 'bits-ui': VERSIONS.bitsUi,\n 'daisyui': VERSIONS.daisyui,\n 'eslint': VERSIONS.eslint,\n 'eslint-plugin-format': VERSIONS.eslintPluginFormat,\n 'eslint-plugin-svelte': VERSIONS.eslintPluginSvelte,\n 'pino-pretty': VERSIONS.pinoPretty,\n 'rimraf': VERSIONS.rimraf,\n 'svelte': VERSIONS.svelte,\n 'svelte-check': VERSIONS.svelteCheck,\n 'svelte-eslint-parser': VERSIONS.svelteEslintParser,\n 'tailwindcss': VERSIONS.tailwindcss,\n 'tsup': VERSIONS.tsup,\n 'typescript': VERSIONS.typescript,\n 'vite': VERSIONS.vite,\n 'vitest': VERSIONS.vitest,\n 'zod': VERSIONS.zod,\n}\n\nconst FULLSTACK_CATALOG_PACKAGES: CatalogPackageVersions = {\n ...HAI_CATALOG_PACKAGES,\n ...FULLSTACK_EXTERNAL_CATALOG_PACKAGES,\n}\n\nconst FULLSTACK_ROOT_CATALOG_PACKAGE_NAMES = [\n '@antfu/eslint-config',\n '@playwright/test',\n '@sveltejs/vite-plugin-svelte',\n '@types/node',\n 'eslint',\n 'eslint-plugin-format',\n 'eslint-plugin-svelte',\n 'rimraf',\n 'svelte',\n 'svelte-check',\n 'svelte-eslint-parser',\n 'tsup',\n 'typescript',\n 'vite',\n 'vitest',\n] as const\n\nconst FULLSTACK_CONTRACT_CATALOG_PACKAGE_NAMES = [\n '@h-ai/api-contract',\n '@h-ai/core',\n 'zod',\n] as const\n\nconst FULLSTACK_SERV_CATALOG_PACKAGE_NAMES = [\n 'pino-pretty',\n '@h-ai/audit',\n '@h-ai/cache',\n '@h-ai/core',\n '@h-ai/crypto',\n '@h-ai/iam',\n '@h-ai/reach',\n '@h-ai/reldb',\n '@h-ai/scheduler',\n '@h-ai/serv',\n '@h-ai/storage',\n 'zod',\n] as const\n\nconst FULLSTACK_SHARED_CATALOG_PACKAGE_NAMES = [\n '@h-ai/api-client',\n '@h-ai/api-contract',\n '@h-ai/core',\n '@h-ai/crypto',\n '@h-ai/ui',\n '@inlang/paraglide-js',\n '@inlang/plugin-message-format',\n 'svelte',\n 'svelte-check',\n 'typescript',\n 'vite',\n 'vitest',\n] as const\n\nconst FULLSTACK_WEB_CATALOG_PACKAGE_NAMES = [\n '@antfu/eslint-config',\n '@h-ai/ui',\n '@iconify-json/tabler',\n '@iconify/tailwind4',\n '@inlang/paraglide-js',\n '@inlang/plugin-message-format',\n '@sveltejs/vite-plugin-svelte',\n '@tailwindcss/vite',\n 'bits-ui',\n 'daisyui',\n 'eslint',\n 'eslint-plugin-format',\n 'eslint-plugin-svelte',\n 'svelte',\n 'svelte-check',\n 'svelte-eslint-parser',\n 'tailwindcss',\n 'typescript',\n 'vite',\n 'vitest',\n] as const\n\nconst FULLSTACK_APP_CATALOG_PACKAGE_NAMES = [\n '@capacitor/share',\n '@capacitor/filesystem',\n ...FULLSTACK_WEB_CATALOG_PACKAGE_NAMES,\n '@aparajita/capacitor-secure-storage',\n '@capacitor/android',\n '@capacitor/app',\n '@capacitor/camera',\n '@capacitor/cli',\n '@capacitor/core',\n '@capacitor/device',\n '@capacitor/ios',\n '@capacitor/preferences',\n '@capacitor/push-notifications',\n '@capacitor/status-bar',\n '@h-ai/capacitor',\n] as const\n\nconst FULLSTACK_DESKTOP_CATALOG_PACKAGE_NAMES = [\n '@tauri-apps/plugin-fs',\n '@tauri-apps/plugin-dialog',\n ...FULLSTACK_WEB_CATALOG_PACKAGE_NAMES,\n '@tauri-apps/cli',\n] as const\n\nconst API_WORKSPACE_EXTERNAL_CATALOG_PACKAGE_NAMES = [\n 'pino-pretty',\n '@antfu/eslint-config',\n '@playwright/test',\n '@types/node',\n 'eslint',\n 'eslint-plugin-format',\n 'rimraf',\n 'tsup',\n 'typescript',\n 'vitest',\n 'zod',\n] as const\n\nfunction pickCatalogPackages(\n packageNames: readonly string[],\n availableCatalogPackages: CatalogPackageVersions,\n): Record<string, string> {\n return Object.fromEntries(\n [...new Set(packageNames)]\n .sort((left, right) => left.localeCompare(right))\n .map((packageName) => {\n const version = availableCatalogPackages[packageName]\n if (!version) {\n throw new Error(`Missing catalog version for package \"${packageName}\"`)\n }\n return [packageName, version]\n }),\n )\n}\n\nfunction buildFullstackPackageSpecifiers(useCatalogProtocol: boolean): FullstackPackageSpecifiers {\n return Object.fromEntries(\n Object.entries(VERSIONS).map(([key, version]) => [key, useCatalogProtocol ? HAI_PACKAGE_SPECIFIER_CATALOG : version]),\n ) as FullstackPackageSpecifiers\n}\n\nfunction buildApiWorkspaceCatalogPackages(featureMap: Record<string, boolean>): Record<string, string> {\n const packageNames: string[] = [\n ...API_WORKSPACE_EXTERNAL_CATALOG_PACKAGE_NAMES,\n '@h-ai/cli',\n '@h-ai/api-client',\n '@h-ai/api-contract',\n '@h-ai/core',\n '@h-ai/serv',\n ]\n\n if (featureMap.db)\n packageNames.push('@h-ai/reldb')\n if (featureMap.cache)\n packageNames.push('@h-ai/cache')\n if (featureMap.iam)\n packageNames.push('@h-ai/iam')\n if (featureMap.crypto)\n packageNames.push('@h-ai/crypto')\n if (featureMap.storage)\n packageNames.push('@h-ai/storage')\n if (featureMap.ai)\n packageNames.push('@h-ai/ai')\n if (featureMap.audit)\n packageNames.push('@h-ai/audit')\n if (featureMap.reach)\n packageNames.push('@h-ai/reach')\n if (featureMap.feedback)\n packageNames.push('@h-ai/feedback')\n if (featureMap.payment)\n packageNames.push('@h-ai/payment')\n if (featureMap.vecdb)\n packageNames.push('@h-ai/vecdb')\n if (featureMap.datapipe)\n packageNames.push('@h-ai/datapipe')\n if (featureMap.scheduler)\n packageNames.push('@h-ai/scheduler')\n if (featureMap.deploy)\n packageNames.push('@h-ai/deploy')\n\n return pickCatalogPackages(packageNames, FULLSTACK_CATALOG_PACKAGES)\n}\n\nfunction buildAppHaiCatalogPackages(options: {\n featureMap: Record<string, boolean>\n hasUi: boolean\n isCapacitorApp: boolean\n isSvelteOnlyApp: boolean\n}): Record<string, string> {\n const packageNames: string[] = ['@h-ai/cli']\n\n if (options.isSvelteOnlyApp) {\n packageNames.push('@h-ai/api-client', '@h-ai/api-contract', '@h-ai/capacitor', '@h-ai/ui')\n if (options.featureMap.crypto)\n packageNames.push('@h-ai/crypto')\n return pickCatalogPackages(packageNames, HAI_CATALOG_PACKAGES)\n }\n\n packageNames.push('@h-ai/core', '@h-ai/kit')\n if (options.hasUi)\n packageNames.push('@h-ai/ui')\n if (options.featureMap.db)\n packageNames.push('@h-ai/reldb')\n if (options.featureMap.cache)\n packageNames.push('@h-ai/cache')\n if (options.featureMap.iam)\n packageNames.push('@h-ai/iam')\n if (options.featureMap.crypto)\n packageNames.push('@h-ai/crypto')\n if (options.featureMap.storage)\n packageNames.push('@h-ai/storage')\n if (options.featureMap.ai)\n packageNames.push('@h-ai/ai')\n if (options.featureMap.audit)\n packageNames.push('@h-ai/audit')\n if (options.featureMap.reach)\n packageNames.push('@h-ai/reach')\n if (options.featureMap.feedback)\n packageNames.push('@h-ai/feedback')\n if (options.featureMap.payment)\n packageNames.push('@h-ai/payment')\n if (options.featureMap.vecdb)\n packageNames.push('@h-ai/vecdb')\n if (options.featureMap.datapipe)\n packageNames.push('@h-ai/datapipe')\n if (options.featureMap.scheduler)\n packageNames.push('@h-ai/scheduler')\n if (options.featureMap.deploy)\n packageNames.push('@h-ai/deploy')\n if (options.featureMap['api-client'])\n packageNames.push('@h-ai/api-client')\n if (options.featureMap.capacitor)\n packageNames.push('@h-ai/capacitor')\n if (options.isCapacitorApp && !options.featureMap['api-client'])\n packageNames.push('@h-ai/api-client')\n if (options.isCapacitorApp && !options.featureMap.capacitor)\n packageNames.push('@h-ai/capacitor')\n\n return pickCatalogPackages(packageNames, HAI_CATALOG_PACKAGES)\n}\n\nfunction buildFullstackCatalogPackages(frontends: readonly FrontendTarget[], deploy = false, features: Record<string, boolean> = {}): Record<string, string> {\n const packageNames: string[] = [\n ...FULLSTACK_ROOT_CATALOG_PACKAGE_NAMES,\n '@h-ai/cli',\n ...FULLSTACK_CONTRACT_CATALOG_PACKAGE_NAMES,\n ...FULLSTACK_SERV_CATALOG_PACKAGE_NAMES,\n ...FULLSTACK_SHARED_CATALOG_PACKAGE_NAMES,\n ]\n\n if (frontends.includes('web'))\n packageNames.push(...FULLSTACK_WEB_CATALOG_PACKAGE_NAMES)\n if (frontends.includes('app'))\n packageNames.push(...FULLSTACK_APP_CATALOG_PACKAGE_NAMES)\n if (frontends.includes('desktop'))\n packageNames.push(...FULLSTACK_DESKTOP_CATALOG_PACKAGE_NAMES)\n if (deploy)\n packageNames.push('@h-ai/deploy')\n if (features.feedback)\n packageNames.push('@h-ai/feedback')\n if (features.ai)\n packageNames.push('@h-ai/ai')\n if (features.vecdb)\n packageNames.push('@h-ai/vecdb')\n if (features.payment)\n packageNames.push('@h-ai/payment')\n if (features.datapipe)\n packageNames.push('@h-ai/datapipe')\n\n return pickCatalogPackages(packageNames, FULLSTACK_CATALOG_PACKAGES)\n}\n\n// =============================================================================\n// 类型\n// =============================================================================\n\n/**\n * 模板渲染上下文\n * @example 模块内部上下文\n * ```ts\n * const context: TemplateContext = buildTemplateContext({ name: 'shop', appType: 'fullstack', features: ['ai'], frontends: ['web'], packageManager: 'pnpm' })\n * const dbEnabled = context.features.db // AI 补齐 db/vecdb。\n * ```\n */\nexport interface TemplateContext {\n /** 所有应用模板共用的第三方依赖版本,避免单包与 workspace 版本表漂移。 */\n versions: typeof VERSIONS\n /** 项目名称 */\n projectName: string\n /** 是否对 @h-ai/* 依赖启用 pnpm catalog 协议 */\n useCatalogProtocol: boolean\n /** @h-ai/* 依赖写入 package.json 时使用的版本说明符 */\n haiPackageSpecifier: string\n /** 生成项目时引用的 @h-ai/* 发布版本 */\n haiPackageVersion: string\n /** 生成项目时写入 pnpm-workspace.yaml 的 catalog 条目 */\n haiCatalogPackages: Record<string, string>\n /** 应用类型 */\n appType: AppType\n /** 选中的 feature 集合(用于 {{#if features.xxx}}) */\n features: Record<string, boolean>\n /** 创建时指定的模块配置;配置模板需保留这些值。 */\n moduleConfigs?: ModuleConfigs\n /** 是否有 UI(非 api / fullstack 类型) */\n hasUi: boolean\n /** 是否有 i18n(非 api / fullstack 类型) */\n hasI18n: boolean\n /** website静态模式须拒绝的已选服务端业务模块;部署开发工具和纯展示能力除外。 */\n websiteServerFeatures: string[]\n /** 是否为 Capacitor 原生移动应用(mobile-app) */\n isCapacitorApp: boolean\n /** 是否为 API workspace(service + contract) */\n isApiWorkspace: boolean\n /** 是否为不依赖 SvelteKit 的纯 Svelte 5 应用 */\n isSvelteOnlyApp: boolean\n /** 默认语言 */\n defaultLocale: string\n /** 包管理器 */\n packageManager: string\n /** API workspace 专用上下文 */\n api?: ApiWorkspaceTemplateContext\n /** 前后端分离工程专用上下文 */\n fullstack?: FullstackTemplateContext\n}\n\n/**\n * API workspace 的 contract/service 包命名及真实工厂标识,用于让生成入口与消费者一致。\n * @example 模块内部上下文\n * ```ts\n * const context = buildTemplateContext({ name: 'shop', appType: 'api', features: [], packageManager: 'pnpm' })\n * if (context.api) {\n * const api: ApiWorkspaceTemplateContext = context.api\n * const contractPackage = api.contractPackageName\n * }\n * ```\n */\nexport interface ApiWorkspaceTemplateContext {\n /** 依赖版本集合 */\n versions: typeof VERSIONS\n /** 写入 package.json 的依赖说明符(pnpm 时为 catalog:) */\n packageSpecifiers: FullstackPackageSpecifiers\n /** 共享 contract 包名 */\n contractPackageName: string\n /** 共享 contract 导出变量名 */\n contractExportName: string\n /** 后端 service 包名 */\n servPackageName: string\n /** Service App 工厂函数名 */\n serviceAppFactoryName: string\n /** procedures 聚合函数名 */\n serviceProceduresFactoryName: string\n}\n\n/**\n * 已实现目标对应的应用信息;miniapp 不会被列为可启动前端。\n * @example 模块内部上下文\n * ```ts\n * const app: FullstackFrontendApp = { target: 'web', packageName: 'shop-web', label: 'Web', port: 4173 }\n * ```\n */\nexport interface FullstackFrontendApp {\n /** 前端目标 */\n target: ImplementedFrontendTarget\n /** 包名 */\n packageName: string\n /** 展示名称 */\n label: string\n /** 本地端口 */\n port: number\n}\n\n/**\n * 国际化配置(已解析后的最终值)\n * @example 模块内部上下文\n * ```ts\n * const i18n: FullstackI18nContext = { baseLocale: 'zh-CN', locales: ['zh-CN', 'en-US'] }\n * const includesBase = i18n.locales.includes(i18n.baseLocale)\n * ```\n */\nexport interface FullstackI18nContext {\n baseLocale: string\n locales: readonly string[]\n}\n\n/**\n * 主题配置(已解析后的最终值)\n * @example 模块内部上下文\n * ```ts\n * const theme: FullstackThemeContext = { defaultTheme: 'light', themes: ['light', 'dark'] }\n * const includesDefault = theme.themes.includes(theme.defaultTheme)\n * ```\n */\nexport interface FullstackThemeContext {\n defaultTheme: string\n themes: readonly string[]\n}\n\n/**\n * 前后端分离工程最终模板数据;前端列表、共享主题/语言与端口按默认值和选项统一解析;语言及主题缺省项会补齐。\n * @example 模块内部上下文\n * ```ts\n * const context = buildTemplateContext({ name: 'shop', appType: 'fullstack', features: ['ai'], frontends: ['web'], packageManager: 'pnpm' })\n * if (context.fullstack) {\n * const fullstack: FullstackTemplateContext = context.fullstack\n * const appNames = fullstack.frontendApps.map(app => app.packageName)\n * }\n * ```\n */\nexport interface FullstackTemplateContext {\n /** 显示名称来自 core 配置。 */\n appName: string\n /** 依赖版本集合 */\n versions: typeof VERSIONS\n /** 写入 package.json 的依赖说明符(pnpm 时为 catalog:) */\n packageSpecifiers: FullstackPackageSpecifiers\n /** 共享 contract 包名 */\n contractPackageName: string\n /** 共享 contract 导出变量名 */\n contractExportName: string\n /** 后端 service 包名 */\n servPackageName: string\n /** 原生壳 appId / bundle identifier 使用的安全短名 */\n nativeAppIdSegment: string\n /** 前端共享代码包名 */\n sharedPackageName: string\n /** 所有已选择前端 */\n selectedFrontends: readonly FrontendTarget[]\n /** 已选择前端 JSON 字面量 */\n selectedFrontendsJson: string\n /** 可运行前端应用 */\n frontendApps: readonly FullstackFrontendApp[]\n /** Playwright 默认验证前端 */\n e2eFrontend?: FullstackFrontendApp\n /** 前端选择布尔表,用于模板条件创建 */\n frontends: Record<FrontendTarget, boolean>\n /** 各前端端口(key 为 target) */\n ports: Record<ImplementedFrontendTarget, number>\n /** 是否选择小程序预留 */\n hasMiniapp: boolean\n /** i18n 配置 */\n i18n: FullstackI18nContext\n /** 主题配置 */\n theme: FullstackThemeContext\n}\n\n/**\n * feature 对应的路由目录映射\n *\n * 每个 feature 可以有:\n * - `routes-shared/` — 所有应用类型共用(如 API 端点)\n * - `routes-{appType}/` — 特定应用类型专用(如 UI 页面)\n * - `routes/` — 通用路由(任何类型都拷贝)\n */\nconst FEATURE_ROUTE_DIRS: Record<string, string[]> = {\n iam: ['routes-shared'],\n storage: ['routes'],\n ai: ['routes'],\n payment: ['routes'],\n vecdb: ['routes'],\n datapipe: ['routes'],\n reach: ['routes'],\n scheduler: ['routes'],\n audit: ['routes'],\n}\n\n/**\n * feature 的 appType 专用路由\n */\nconst FEATURE_APP_ROUTE_DIRS: Record<string, string[]> = {\n iam: ['admin', 'h5', 'website'],\n}\n\nconst FEATURE_ID_REGEX = /^[a-z0-9-]+$/\nconst HBS_SUFFIX_REGEX = /\\.hbs$/\nconst FULLSTACK_FRONTEND_TEMPLATE_PATH_REGEX = /^apps\\/\\{\\{projectName\\}\\}-(web|app|desktop|miniapp)\\//\nconst NON_IDENTIFIER_CHAR_REGEX = /[^a-z0-9]+/i\nconst IDENTIFIER_START_REGEX = /^[a-z_$]/i\n\n// =============================================================================\n// 路径工具\n// =============================================================================\n\n/**\n * 获取 templates/ 目录的绝对路径\n *\n * 兼容两种运行环境:\n * - 构建后:dist/cli-template-engine.js → ../templates\n * - 测试时:src/commands/cli-template-engine.ts → ../../templates\n */\nfunction getTemplatesRoot(): string {\n const currentDir = path.dirname(fileURLToPath(import.meta.url))\n // 优先尝试 dist 模式(../templates),再尝试 src 模式(../../templates)\n const distPath = path.resolve(currentDir, '..', 'templates')\n if (fse.pathExistsSync(distPath)) {\n return distPath\n }\n return path.resolve(currentDir, '..', '..', 'templates')\n}\n\n// =============================================================================\n// 拷贝工具\n// =============================================================================\n\n/**\n * 拷贝目录,自动跳过 .hbs 文件(这些由 renderDynamicFiles 处理)\n *\n * @param src - 源目录\n * @param dest - 目标目录\n * @param excludePaths - 需要排除的相对路径前缀(如 'messages')\n */\nasync function copyStaticDir(src: string, dest: string, excludePaths?: string[]): Promise<void> {\n if (!(await fse.pathExists(src))) {\n return\n }\n\n await fse.copy(src, dest, {\n overwrite: true,\n filter: (filePath: string) => {\n const rel = path.relative(src, filePath)\n // 含 Handlebars 占位符的路径必须走动态渲染,避免复制出字面量目录\n if (rel.includes('{{') || rel.includes('}}')) {\n return false\n }\n // 跳过 .hbs 模板文件\n if (filePath.endsWith('.hbs')) {\n return false\n }\n // 跳过排除路径\n if (excludePaths && excludePaths.length > 0) {\n return !excludePaths.some(p => rel === p || rel.startsWith(`${p}${path.sep}`))\n }\n return true\n },\n })\n}\n\n/**\n * 查找目录中所有 .hbs 文件并返回相对路径\n */\nasync function findHbsFiles(dir: string): Promise<string[]> {\n if (!(await fse.pathExists(dir))) {\n return []\n }\n\n const results: string[] = []\n\n async function walk(current: string): Promise<void> {\n const entries = await fse.readdir(current, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(fullPath)\n }\n else if (entry.name.endsWith('.hbs')) {\n results.push(path.relative(dir, fullPath))\n }\n }\n }\n\n await walk(dir)\n return results\n}\n\n/**\n * 查找位于动态路径中的静态资源。\n *\n * 普通静态文件已经由 copyStaticDir 复制;这里专门补上带 Handlebars 路径片段\n * 的资源,例如 fullstack Tauri 图标目录。\n */\nasync function findRenderedStaticPathFiles(dir: string): Promise<string[]> {\n if (!(await fse.pathExists(dir))) {\n return []\n }\n\n const results: string[] = []\n\n async function walk(current: string): Promise<void> {\n const entries = await fse.readdir(current, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(fullPath)\n continue\n }\n\n const relPath = path.relative(dir, fullPath)\n if (!entry.name.endsWith('.hbs') && (relPath.includes('{{') || relPath.includes('}}'))) {\n results.push(relPath)\n }\n }\n }\n\n await walk(dir)\n return results\n}\n\n// =============================================================================\n// 构建上下文\n// =============================================================================\n\n/**\n * 根据用户选项构建模板渲染上下文\n * 纯上下文构建,不创建文件、不安装依赖;始终补齐应用骨架及功能的硬依赖。\n * 不执行创建命令的交互输入校验;直接调用者仍须验证用户输入。\n * @param options - 工程类型、启用功能、包管理器与模块默认值。\n * @param options.name - 新工程名称。\n * @param options.appType - 应用骨架类型。\n * @param options.features - 启用的功能,函数补齐硬依赖。\n * @param options.frontends - fullstack 前端目标;省略使用默认目标。\n * @param options.moduleConfigs - 用户指定模块、语言、主题和端口。\n * @param options.packageManager - pnpm 使用 catalog,其他管理器使用具体版本。\n * @param options.deploy - 默认 true;false 明确关闭部署开发依赖。\n * @returns 已补硬依赖与默认值的模板上下文。\n * @example 模块内部上下文\n * ```ts\n * const context = buildTemplateContext({ name: 'shop', appType: 'fullstack', features: ['ai'], frontends: ['web'], packageManager: 'pnpm' })\n * const usesSharedAi = context.features.db && context.features.vecdb\n * ```\n */\nexport function buildTemplateContext(options: {\n name: string\n appType: AppType\n features: FeatureId[]\n frontends?: readonly FrontendTarget[]\n moduleConfigs?: ModuleConfigs\n packageManager: string\n deploy?: boolean\n}): TemplateContext {\n const featureMap: Record<string, boolean> = {}\n for (const f of options.features) {\n featureMap[f] = true\n }\n featureMap.deploy = options.deploy !== false\n\n // fullstack 默认交付完整 mini 管理功能,不能移除其必需模块。\n if (options.appType === 'fullstack') {\n for (const feature of ['iam', 'db', 'cache', 'crypto', 'storage', 'audit']) featureMap[feature] = true\n }\n\n // feedback 默认使用独立控制台通知;HTTP 接入仍复用可信认证、持久化和附件。\n if (featureMap.feedback) {\n for (const feature of ['db', 'storage', 'iam']) featureMap[feature] = true\n }\n\n // 强制补全模块硬依赖,防止调用方未经过 resolveFeatureDependencies 时遗漏依赖\n // iam 依赖 reldb(用户/角色/权限持久化)和 cache(会话/OTP 缓存),以及 crypto(密码哈希)\n if (featureMap.iam) {\n featureMap.db = true\n featureMap.cache = true\n featureMap.crypto = true\n }\n // audit / scheduler / payment 依赖 reldb\n if (featureMap.audit || featureMap.scheduler || featureMap.payment || featureMap.crypto) {\n featureMap.db = true\n }\n // AI 的共享会话、记忆和知识依赖持久关系库与向量库。\n if (featureMap.ai) {\n featureMap.db = true\n featureMap.vecdb = true\n }\n\n const isApi = options.appType === 'api'\n const isFullstack = options.appType === 'fullstack'\n const isCapacitorApp = options.appType === 'mobile-app'\n const isSvelteOnlyApp = isCapacitorApp\n const useCatalogProtocol = options.packageManager === 'pnpm'\n const hasUi = !isApi && !isFullstack\n const selectedFrontends = options.frontends ?? DEFAULT_FULLSTACK_FRONTENDS\n let haiCatalogPackages: TemplateContext['haiCatalogPackages']\n if (isFullstack) {\n haiCatalogPackages = buildFullstackCatalogPackages(selectedFrontends, featureMap.deploy, featureMap)\n }\n else if (isApi) {\n haiCatalogPackages = buildApiWorkspaceCatalogPackages(featureMap)\n }\n else {\n haiCatalogPackages = buildAppHaiCatalogPackages({\n featureMap,\n hasUi,\n isCapacitorApp,\n isSvelteOnlyApp,\n })\n }\n\n return {\n projectName: options.name,\n versions: VERSIONS,\n useCatalogProtocol,\n haiPackageSpecifier: useCatalogProtocol ? HAI_PACKAGE_SPECIFIER_CATALOG : HAI_PACKAGE_VERSION,\n haiPackageVersion: HAI_PACKAGE_VERSION,\n haiCatalogPackages,\n appType: options.appType,\n features: featureMap,\n moduleConfigs: options.moduleConfigs,\n hasUi,\n hasI18n: !isApi && !isFullstack,\n websiteServerFeatures: Object.keys(featureMap).filter(feature => featureMap[feature] && !['deploy', 'ui', 'kit', 'datapipe'].includes(feature)),\n isCapacitorApp,\n isApiWorkspace: isApi,\n isSvelteOnlyApp,\n defaultLocale: options.moduleConfigs?.core?.defaultLocale ?? 'zh-CN',\n packageManager: options.packageManager,\n api: isApi\n ? buildApiWorkspaceTemplateContext(options.name, useCatalogProtocol)\n : undefined,\n fullstack: isFullstack\n ? buildFullstackTemplateContext(\n options.name,\n selectedFrontends,\n options.moduleConfigs,\n useCatalogProtocol,\n )\n : undefined,\n }\n}\n\nfunction buildApiWorkspaceTemplateContext(\n projectName: string,\n useCatalogProtocol = false,\n): ApiWorkspaceTemplateContext {\n const identifier = toIdentifier(projectName)\n const pascalName = toPascalIdentifier(identifier)\n\n return {\n versions: VERSIONS,\n packageSpecifiers: buildFullstackPackageSpecifiers(useCatalogProtocol),\n contractPackageName: `${projectName}-contract`,\n contractExportName: `${identifier}Contract`,\n servPackageName: `${projectName}-serv`,\n serviceAppFactoryName: `create${pascalName}App`,\n serviceProceduresFactoryName: `create${pascalName}Procedures`,\n }\n}\n\nfunction buildFullstackTemplateContext(\n projectName: string,\n frontendsInput: readonly FrontendTarget[],\n moduleConfigs?: ModuleConfigs,\n useCatalogProtocol = false,\n): FullstackTemplateContext {\n const selectedFrontends = [...new Set(frontendsInput.length > 0 ? frontendsInput : DEFAULT_FULLSTACK_FRONTENDS)]\n\n const portsConfig = moduleConfigs?.fullstack?.ports ?? {}\n const portFor = (target: ImplementedFrontendTarget): number =>\n portsConfig[target] ?? FRONTEND_PORTS_DEFAULT[target]\n\n const frontendApps = selectedFrontends\n .filter(isImplementedFrontend)\n .map(target => ({\n target,\n packageName: `${projectName}-${target}`,\n label: FRONTEND_LABELS[target],\n port: portFor(target),\n }))\n\n return {\n appName: moduleConfigs?.core?.name ?? projectName,\n versions: VERSIONS,\n packageSpecifiers: buildFullstackPackageSpecifiers(useCatalogProtocol),\n contractPackageName: `${projectName}-contract`,\n contractExportName: `${toIdentifier(projectName)}Contract`,\n servPackageName: `${projectName}-serv`,\n nativeAppIdSegment: toIdentifier(projectName).toLowerCase(),\n sharedPackageName: `${projectName}-shared`,\n selectedFrontends,\n selectedFrontendsJson: `[${selectedFrontends.map(f => `'${f}'`).join(', ')}]`,\n frontendApps,\n e2eFrontend: frontendApps[0],\n frontends: {\n web: selectedFrontends.includes('web'),\n app: selectedFrontends.includes('app'),\n miniapp: selectedFrontends.includes('miniapp'),\n desktop: selectedFrontends.includes('desktop'),\n },\n ports: {\n web: portFor('web'),\n app: portFor('app'),\n desktop: portFor('desktop'),\n },\n hasMiniapp: selectedFrontends.includes('miniapp'),\n i18n: resolveI18nContext(moduleConfigs),\n theme: resolveThemeContext(moduleConfigs),\n }\n}\n\n/**\n * 按用户配置、core 默认语言与框架回退语言解析列表;去重并补入基础语言,不执行 locale 名称合法性校验。\n * @param moduleConfigs - 创建选项中的模块配置。\n * @returns 至少包含基础语言的最终 i18n 数据。\n * @example 模块内部上下文\n * ```ts\n * const i18n = resolveI18nContext({ fullstack: { i18n: { baseLocale: 'en-US', locales: ['zh-CN'] } } })\n * const base = i18n.locales[0] // en-US 会补在首位。\n * ```\n */\nfunction resolveI18nContext(moduleConfigs?: ModuleConfigs): FullstackI18nContext {\n const coreLocale = moduleConfigs?.core?.defaultLocale ?? 'zh-CN'\n const baseLocale = moduleConfigs?.fullstack?.i18n?.baseLocale ?? coreLocale\n const requested = moduleConfigs?.fullstack?.i18n?.locales\n const locales = requested && requested.length > 0\n ? [...new Set(requested)]\n : [...new Set([baseLocale, 'zh-CN', 'en-US', 'ja-JP'])]\n if (!locales.includes(baseLocale)) {\n locales.unshift(baseLocale)\n }\n return { baseLocale, locales }\n}\n\n/**\n * 去重主题列表并确保默认主题可选;未配置时提供亮/暗、高对比与直角商务主题。\n * @param moduleConfigs - 创建选项中的模块配置。\n * @returns 包含默认主题的最终主题数据。\n * @example 模块内部上下文\n * ```ts\n * const theme = resolveThemeContext({ fullstack: { theme: { defaultTheme: 'dark', themes: ['light'] } } })\n * const first = theme.themes[0] // dark\n * ```\n */\nfunction resolveThemeContext(moduleConfigs?: ModuleConfigs): FullstackThemeContext {\n const defaultTheme = moduleConfigs?.fullstack?.theme?.defaultTheme ?? DEFAULT_THEME_NAME\n const requested = moduleConfigs?.fullstack?.theme?.themes\n const themes = requested && requested.length > 0\n ? [...new Set(requested)]\n : [...DEFAULT_THEMES]\n if (!themes.includes(defaultTheme)) {\n themes.unshift(defaultTheme)\n }\n return { defaultTheme, themes }\n}\n\nfunction isImplementedFrontend(target: FrontendTarget): target is ImplementedFrontendTarget {\n return IMPLEMENTED_FRONTENDS.includes(target)\n}\n\nfunction toIdentifier(value: string): string {\n const words = value\n .split(NON_IDENTIFIER_CHAR_REGEX)\n .filter(Boolean)\n const camel = words\n .map((word, index) => {\n const normalized = word.toLowerCase()\n return index === 0\n ? normalized\n : `${normalized.charAt(0).toUpperCase()}${normalized.slice(1)}`\n })\n .join('')\n if (!camel)\n return 'app'\n return IDENTIFIER_START_REGEX.test(camel) ? camel : `app${camel}`\n}\n\nfunction toPascalIdentifier(value: string): string {\n if (!value)\n return 'App'\n return `${value.charAt(0).toUpperCase()}${value.slice(1)}`\n}\n\n// =============================================================================\n// 核心:生成项目\n// =============================================================================\n\n/**\n * 从模板生成项目\n *\n * 执行流程:\n * 1. 拷贝 base 静态文件\n * 2. 拷贝 apps/{appType} 路由\n * 3. 叠加选中 feature 的路由\n * 4. 渲染所有 .hbs 动态模板\n *\n * 将模板骨架、功能路由与共享脚本写入指定目录;不会安装依赖或初始化 Git。\n * @param projectPath - 项目目标目录\n * @param context - 模板渲染上下文\n * @throws Error - 模板读取、渲染、路径校验或文件写入失败。\n * @returns 模板文件与共享脚本写入完成。\n * @example 模块内部上下文\n * ```ts\n * const context = buildTemplateContext({ name: 'shop', appType: 'api', features: ['ai'], packageManager: 'pnpm' })\n * // 目标为新工程目录;调用方先检查目录与选项。\n * await generateFromTemplates(path.resolve('shop'), context)\n * ```\n */\nexport async function generateFromTemplates(\n projectPath: string,\n context: TemplateContext,\n): Promise<void> {\n const root = getTemplatesRoot()\n const includeBaseTemplate = context.appType !== 'fullstack' && !context.isApiWorkspace\n\n // ─── ① 拷贝 base 骨架(静态文件) ───\n if (includeBaseTemplate) {\n await copyStaticDir(path.join(root, 'base'), projectPath)\n }\n else {\n // API/fullstack 自有骨架,质量门禁仍复用单包模板的同一份规则。\n await fse.copy(path.join(root, 'base', 'eslint-rules.js'), path.join(projectPath, 'eslint-rules.js'))\n }\n\n // ─── ② 拷贝 apps/{appType} 路由 ───\n // messages/ 目录仅在 hasI18n 时拷贝\n const appDir = path.join(root, 'apps', context.appType)\n if (await fse.pathExists(appDir)) {\n const appExcludes = context.hasI18n ? [] : ['messages']\n await copyStaticDir(appDir, projectPath, appExcludes)\n }\n\n // ─── ③ 叠加 feature 路由 ───\n if (!context.isApiWorkspace && context.appType !== 'fullstack') {\n for (const featureId of Object.keys(context.features)) {\n if (context.isSvelteOnlyApp) {\n continue\n }\n\n if (!context.features[featureId]) {\n continue\n }\n\n // 安全校验:featureId 只允许字母、数字和连字符,防止路径遍历\n if (!FEATURE_ID_REGEX.test(featureId)) {\n continue\n }\n\n const featureDir = path.join(root, 'features', featureId)\n if (!(await fse.pathExists(featureDir))) {\n continue\n }\n\n // 通用路由(routes/)\n const sharedDirs = FEATURE_ROUTE_DIRS[featureId] || []\n for (const dirName of sharedDirs) {\n // Capacitor SPA 无服务端运行时,跳过服务端 API 路由(routes-shared)\n if (context.isCapacitorApp && dirName === 'routes-shared') {\n continue\n }\n const routesSrc = path.join(featureDir, dirName)\n if (await fse.pathExists(routesSrc)) {\n await copyStaticDir(routesSrc, path.join(projectPath, 'src', 'routes'))\n }\n }\n\n // appType 专用路由(routes-{appType})\n const appSpecificTypes = FEATURE_APP_ROUTE_DIRS[featureId] || []\n if (appSpecificTypes.includes(context.appType)) {\n const appRouteSrc = path.join(featureDir, `routes-${context.appType}`)\n if (await fse.pathExists(appRouteSrc)) {\n await copyStaticDir(appRouteSrc, path.join(projectPath, 'src', 'routes'))\n }\n }\n }\n }\n\n // ─── ④ 渲染 .hbs 动态模板 ───\n await renderDynamicFiles(root, projectPath, context)\n\n // 多包模板不继承 base;所有应用统一复制同一份 E2E 清理入口。\n await fse.copy(path.join(root, 'shared', 'run-e2e.mjs'), path.join(projectPath, 'scripts', 'run-e2e.mjs'))\n await fse.copy(path.join(root, 'shared', 'e2e-env.ts'), path.join(projectPath, 'scripts', 'e2e-env.ts'))\n await fse.copy(path.join(root, 'shared', 'build-metadata.ts'), path.join(projectPath, 'scripts', 'build-metadata.ts'))\n await fse.copy(path.join(root, 'shared', 'public-base-path.mjs'), path.join(projectPath, 'scripts', 'public-base-path.mjs'))\n await fse.ensureDir(path.join(projectPath, 'images', 'dependencies'))\n await fse.writeFile(path.join(projectPath, 'images', 'dependencies', '.gitkeep'), '')\n await fse.copy(path.join(root, 'shared', '.gitattributes'), path.join(projectPath, '.gitattributes'))\n if (context.isSvelteOnlyApp) {\n await fse.copy(path.join(root, 'shared', 'vite-runtime-config.ts'), path.join(projectPath, 'scripts', 'vite-runtime-config.ts'))\n await fse.copy(path.join(root, 'shared', 'container-runtime-config.sh'), path.join(projectPath, 'images', 'web', '19-runtime-config.sh'))\n }\n\n if (context.isSvelteOnlyApp || context.appType === 'fullstack') {\n const navigationDir = context.appType === 'fullstack'\n ? path.join(projectPath, 'packages', `${context.projectName}-shared`, 'src', 'lib', 'navigation')\n : path.join(projectPath, 'src', 'lib', 'navigation')\n await fse.copy(path.join(root, 'shared', 'hash-router.svelte.ts'), path.join(navigationDir, 'hash-router.svelte.ts'))\n }\n\n // ─── ⑤ 拷贝 i18n 脚手架(project.inlang + messages) ───\n if (context.hasI18n) {\n const i18nDir = path.join(root, 'i18n')\n if (await fse.pathExists(i18nDir)) {\n await fse.copy(i18nDir, projectPath, { overwrite: true })\n const settingsPath = path.join(projectPath, 'project.inlang', 'settings.json')\n const settings = await fse.readJson(settingsPath)\n await fse.writeJson(settingsPath, { ...settings, baseLocale: context.defaultLocale }, { spaces: 2 })\n }\n }\n\n // ─── ⑥ 确保 static 目录存在 ───\n if (includeBaseTemplate) {\n await fse.ensureDir(path.join(projectPath, 'static'))\n }\n}\n\n// =============================================================================\n// 动态模板渲染\n// =============================================================================\n\n/**\n * 渲染所有 .hbs 文件:base、apps/{appType}、以及选中 feature 的路由目录\n *\n * base / apps 的 .hbs 渲染后输出到 projectPath 根目录;\n * feature 的 .hbs 渲染后输出到 projectPath/src/routes/。\n */\nasync function renderDynamicFiles(\n templatesRoot: string,\n projectPath: string,\n context: TemplateContext,\n): Promise<void> {\n // ── base + apps/{appType} → 输出到项目根 ──\n const rootDirs = context.appType === 'fullstack' || context.isApiWorkspace\n ? [path.join(templatesRoot, 'apps', context.appType)]\n : [\n path.join(templatesRoot, 'base'),\n path.join(templatesRoot, 'apps', context.appType),\n ]\n\n for (const dir of rootDirs) {\n await renderHbsInDir(dir, projectPath, context)\n await copyRenderedStaticPathFiles(dir, projectPath, context)\n }\n\n // ── feature 路由 → 输出到 src/routes/ ──\n if (context.isApiWorkspace || context.appType === 'fullstack') {\n return\n }\n\n const routesDest = path.join(projectPath, 'src', 'routes')\n for (const featureId of Object.keys(context.features)) {\n if (context.isSvelteOnlyApp) {\n continue\n }\n\n if (!context.features[featureId]) {\n continue\n }\n\n const featureDir = path.join(templatesRoot, 'features', featureId)\n if (!(await fse.pathExists(featureDir))) {\n continue\n }\n\n // 通用路由(routes-shared / routes 等)\n const sharedDirs = FEATURE_ROUTE_DIRS[featureId] || []\n for (const dirName of sharedDirs) {\n // Capacitor SPA 无服务端运行时,跳过服务端 API 路由(routes-shared)\n if (context.isCapacitorApp && dirName === 'routes-shared') {\n continue\n }\n await renderHbsInDir(path.join(featureDir, dirName), routesDest, context)\n }\n\n // appType 专用路由(routes-{appType})\n const appSpecificTypes = FEATURE_APP_ROUTE_DIRS[featureId] || []\n if (appSpecificTypes.includes(context.appType)) {\n await renderHbsInDir(\n path.join(featureDir, `routes-${context.appType}`),\n routesDest,\n context,\n )\n }\n }\n}\n\n/**\n * 渲染指定目录下所有 .hbs 文件并输出到目标目录(去掉 .hbs 后缀)\n */\nasync function renderHbsInDir(\n dir: string,\n destRoot: string,\n context: TemplateContext,\n): Promise<void> {\n const hbsFiles = await findHbsFiles(dir)\n for (const relPath of hbsFiles) {\n const srcPath = path.join(dir, relPath)\n const outRelPathTemplate = relPath.replace(HBS_SUFFIX_REGEX, '')\n\n const template = await fse.readFile(srcPath, 'utf-8')\n const compiled = Handlebars.compile(template, { noEscape: true })\n const rendered = compiled(context)\n if (shouldSkipRenderedFile(template, rendered)) {\n continue\n }\n\n const outRelPath = renderOutputPath(outRelPathTemplate, context)\n if (!isSafeRelativePath(outRelPath)) {\n continue\n }\n\n // Capacitor SPA 跳过服务端专属文件(hooks / server init)\n if (context.isCapacitorApp && CAPACITOR_SKIPPED_SERVER_FILES.has(outRelPath.split(path.sep).join('/'))) {\n continue\n }\n\n const destPath = path.join(destRoot, outRelPath)\n const configMatch = /(?:^|[/\\\\])config[/\\\\]_([^/\\\\]+)\\.ya?ml$/.exec(outRelPath)\n const normalizedRendered = normalizeRenderedContent(configMatch ? documentConfig(configMatch[1], parameterizeConfig(configMatch[1], rendered)) : rendered, outRelPath)\n\n await fse.ensureDir(path.dirname(destPath))\n await fse.writeFile(destPath, normalizedRendered, 'utf-8')\n }\n}\n\nasync function copyRenderedStaticPathFiles(\n dir: string,\n destRoot: string,\n context: TemplateContext,\n): Promise<void> {\n const staticFiles = await findRenderedStaticPathFiles(dir)\n for (const relPath of staticFiles) {\n if (!shouldCopyRenderedStaticPathFile(relPath, context)) {\n continue\n }\n\n const outRelPath = renderOutputPath(relPath, context)\n if (!isSafeRelativePath(outRelPath)) {\n continue\n }\n\n const srcPath = path.join(dir, relPath)\n const destPath = path.join(destRoot, outRelPath)\n await fse.ensureDir(path.dirname(destPath))\n await fse.copyFile(srcPath, destPath)\n }\n}\n\nfunction shouldCopyRenderedStaticPathFile(relPath: string, context: TemplateContext): boolean {\n if (context.appType !== 'fullstack' || !context.fullstack) {\n return true\n }\n\n const normalizedPath = relPath.split(path.sep).join('/')\n const frontendMatch = FULLSTACK_FRONTEND_TEMPLATE_PATH_REGEX.exec(normalizedPath)\n if (!frontendMatch) {\n return true\n }\n\n const target = frontendMatch[1] as FrontendTarget\n return Boolean(context.fullstack.frontends[target])\n}\n\nfunction normalizeRenderedContent(content: string, outRelPath: string): string {\n // 项目工具配置由多个模板分区组合,写入前统一校验 JSON 并规范缩进。\n if (path.basename(outRelPath) === 'hai.json')\n return `${JSON.stringify(JSON.parse(content), null, 2)}\\n`\n const normalizedLineEndings = content.replace(/\\r\\n/g, '\\n')\n const ext = path.extname(outRelPath)\n const normalized = NORMALIZED_RENDER_EXTENSIONS.has(ext)\n ? normalizedLineEndings.replace(/\\n{3,}/g, '\\n\\n')\n : normalizedLineEndings\n if (normalized.trim().length === 0) {\n return ''\n }\n return normalized.endsWith('\\n') ? normalized : `${normalized}\\n`\n}\n\nfunction shouldSkipRenderedFile(template: string, rendered: string): boolean {\n return template.includes(TEMPLATE_SKIP_IF_EMPTY_MARKER) && rendered.trim().length === 0\n}\n\nfunction renderOutputPath(pathTemplate: string, context: TemplateContext): string {\n const normalizedTemplate = pathTemplate.split(path.sep).join('/')\n return Handlebars.compile(normalizedTemplate, { noEscape: true })(context)\n}\n\n/**\n * 渲染后的输出路径只允许根内相对路径,拒绝绝对路径与任意 .. 段;不能替代已有目录的 realpath 检查。\n * @param relativePath - 模板渲染后的相对输出路径。\n * @returns 路径符合模板输出边界时为 true。\n * @example 模块内部上下文\n * ```ts\n * const valid = isSafeRelativePath('src/server/orders.ts')\n * const escaped = isSafeRelativePath('../outside.ts') // false\n * ```\n */\nfunction isSafeRelativePath(relativePath: string): boolean {\n const normalized = path.normalize(relativePath)\n return !path.isAbsolute(normalized) && normalized !== '..' && !normalized.startsWith(`..${path.sep}`)\n}\n","/**\n * @h-ai/cli — 项目创建命令\n *\n * 基于模板的交互式项目创建:\n * 1. 交互式收集选项(appType / features / moduleConfigs)\n * 2. 拷贝 base 骨架 + appType 路由 + feature 路由\n * 3. 渲染动态模板(init.ts / hooks.server.ts / package.json)\n * 4. 生成配置文件、.env、Skill 文件\n *\n * @module cli-create\n */\n\nimport type { AppType, CreateProjectOptions, FeatureDefinition, FeatureId, FrontendTarget, ModuleConfigs, ProjectInfo } from '../cli-types.js'\nimport type { ConfigEnvironmentVariable } from './cli-config-environment.js'\nimport { Buffer } from 'node:buffer'\nimport { execFileSync, execSync } from 'node:child_process'\nimport { createECDH, randomBytes } from 'node:crypto'\nimport path from 'node:path'\nimport process from 'node:process'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { detectPackageManager, fileExists, formatPromptDescription, writeCliError, writeCliMessage, writeFile } from '../cli-utils.js'\nimport { renderEnvironment, runtimeEnvironmentVariables } from './cli-config-environment.js'\nimport { buildTemplateContext, generateFromTemplates } from './cli-template-engine.js'\n\n// =============================================================================\n// 应用类型定义\n// =============================================================================\n\n/** Git 远程地址校验 */\nconst RE_HTTPS_URL = /^https:\\/\\/.+/\nconst RE_GIT_SSH_URL = /^git@.+:.+/\n\n/**\n * 应用类型定义;展示字段延迟读取当前 locale,避免模块首次导入时固定语言。\n */\nconst APP_TYPES: Record<AppType, { name: string, description: string }> = {\n 'admin': {\n get name() {\n return cliM('cli_appAdminName')\n },\n get description() {\n return cliM('cli_appAdminDescription')\n },\n },\n 'website': {\n get name() {\n return cliM('cli_appWebsiteName')\n },\n get description() {\n return cliM('cli_appWebsiteDescription')\n },\n },\n 'h5': {\n get name() {\n return cliM('cli_appH5Name')\n },\n get description() {\n return cliM('cli_appH5Description')\n },\n },\n 'api': {\n get name() {\n return cliM('cli_appApiName')\n },\n get description() {\n return cliM('cli_appApiDescription')\n },\n },\n 'mobile-app': {\n get name() {\n return cliM('cli_appMobileName')\n },\n get description() {\n return cliM('cli_appMobileDescription')\n },\n },\n 'fullstack': {\n get name() {\n return cliM('cli_appFullstackName')\n },\n get description() {\n return cliM('cli_appFullstackDescription')\n },\n },\n}\n\nconst FRONTEND_TARGETS: Record<FrontendTarget, { name: string, description: string, implemented: boolean }> = {\n web: { name: 'Web', get description() {\n return cliM('cli_frontendWebDescription')\n }, implemented: true },\n app: { name: 'App', get description() {\n return cliM('cli_frontendAppDescription')\n }, implemented: true },\n miniapp: {\n get name() {\n return cliM('cli_frontendMiniappName')\n },\n get description() {\n return cliM('cli_frontendMiniappDescription')\n },\n implemented: false,\n },\n desktop: {\n get name() {\n return cliM('cli_frontendDesktopName')\n },\n get description() {\n return cliM('cli_frontendDesktopDescription')\n },\n implemented: true,\n },\n}\n\nconst DEFAULT_FULLSTACK_FRONTENDS: FrontendTarget[] = ['web', 'app', 'desktop']\n\n// =============================================================================\n// 功能定义\n// =============================================================================\n\n/**\n * 功能定义\n */\nconst FEATURES: Record<string, FeatureDefinition> = {\n 'iam': {\n id: 'iam',\n get name() {\n return cliM('cli_featureIamName')\n },\n get description() {\n return cliM('cli_featureIamDescription')\n },\n packages: ['@h-ai/iam'],\n dependencies: ['crypto', 'db', 'cache'],\n },\n 'db': {\n id: 'db',\n get name() {\n return cliM('cli_featureDbName')\n },\n get description() {\n return cliM('cli_featureDbDescription')\n },\n packages: ['@h-ai/reldb'],\n },\n 'cache': {\n id: 'cache',\n get name() {\n return cliM('cli_featureCacheName')\n },\n get description() {\n return cliM('cli_featureCacheDescription')\n },\n packages: ['@h-ai/cache'],\n },\n 'ai': {\n id: 'ai',\n get name() {\n return cliM('cli_featureAiName')\n },\n get description() {\n return cliM('cli_featureAiDescription')\n },\n packages: ['@h-ai/ai'],\n dependencies: ['db', 'vecdb'],\n },\n 'storage': {\n id: 'storage',\n get name() {\n return cliM('cli_featureStorageName')\n },\n get description() {\n return cliM('cli_featureStorageDescription')\n },\n packages: ['@h-ai/storage'],\n },\n 'crypto': {\n id: 'crypto',\n get name() {\n return cliM('cli_featureCryptoName')\n },\n get description() {\n return cliM('cli_featureCryptoDescription')\n },\n packages: ['@h-ai/crypto'],\n dependencies: ['db'],\n },\n 'audit': {\n id: 'audit',\n get name() {\n return cliM('cli_featureAuditName')\n },\n get description() {\n return cliM('cli_featureAuditDescription')\n },\n packages: ['@h-ai/audit'],\n dependencies: ['db'],\n },\n 'reach': {\n id: 'reach',\n get name() {\n return cliM('cli_featureReachName')\n },\n get description() {\n return cliM('cli_featureReachDescription')\n },\n packages: ['@h-ai/reach'],\n },\n 'feedback': {\n id: 'feedback',\n get name() {\n return cliM('cli_featureFeedbackName')\n },\n get description() {\n return cliM('cli_featureFeedbackDescription')\n },\n packages: ['@h-ai/feedback'],\n dependencies: ['db', 'storage', 'iam'],\n },\n 'payment': {\n id: 'payment',\n get name() {\n return cliM('cli_featurePaymentName')\n },\n get description() {\n return cliM('cli_featurePaymentDescription')\n },\n packages: ['@h-ai/payment'],\n dependencies: ['db'],\n },\n 'vecdb': {\n id: 'vecdb',\n get name() {\n return cliM('cli_featureVecdbName')\n },\n get description() {\n return cliM('cli_featureVecdbDescription')\n },\n packages: ['@h-ai/vecdb'],\n },\n 'datapipe': {\n id: 'datapipe',\n get name() {\n return cliM('cli_featureDatapipeName')\n },\n get description() {\n return cliM('cli_featureDatapipeDescription')\n },\n packages: ['@h-ai/datapipe'],\n },\n 'scheduler': {\n id: 'scheduler',\n get name() {\n return cliM('cli_featureSchedulerName')\n },\n get description() {\n return cliM('cli_featureSchedulerDescription')\n },\n packages: ['@h-ai/scheduler'],\n dependencies: ['db'],\n },\n 'deploy': {\n id: 'deploy',\n get name() {\n return cliM('cli_featureDeployName')\n },\n get description() {\n return cliM('cli_featureDeployDescription')\n },\n packages: ['@h-ai/deploy'],\n },\n 'api-client': {\n id: 'api-client',\n get name() {\n return cliM('cli_featureApiClientName')\n },\n get description() {\n return cliM('cli_featureApiClientDescription')\n },\n packages: ['@h-ai/api-client'],\n },\n 'capacitor': {\n id: 'capacitor',\n get name() {\n return cliM('cli_featureCapacitorName')\n },\n get description() {\n return cliM('cli_featureCapacitorDescription')\n },\n packages: ['@h-ai/capacitor'],\n },\n}\n\n/**\n * 可选择的功能列表\n */\nconst FULL_FEATURES: FeatureId[] = ['iam', 'db', 'cache', 'crypto', 'ai', 'storage', 'audit', 'reach', 'feedback', 'payment', 'vecdb', 'datapipe', 'scheduler', 'deploy', 'api-client', 'capacitor']\nconst PROJECT_NAME_REGEX = /^[a-z0-9-]+$/\n\n/**\n * 创建项目\n * 按应用类型生成工程并补齐功能硬依赖;--no-install 不安装依赖,--no-git 不初始化仓库。\n * @throws Error - 选项、目标目录、模板生成、依赖安装或 Git 初始化失败。\n * @param options - 命令参数;对应命令的工作目录、非交互与可选功能。\n * @returns 生成及所选安装/Git 步骤完成。\n * @example 模块内部上下文\n * ```ts\n * // 在当前目录创建新的 shop 子目录;目标必须不存在或为空。\n * await createProject({ cwd: process.cwd(), name: 'shop', appType: 'api', packageManager: 'pnpm', defaults: true, install: false, git: false, deploy: false })\n * // 对应 hai create shop --type api --defaults --no-install --no-git --no-deploy。\n * ```\n */\nexport async function createProject(options: CreateProjectOptions): Promise<void> {\n const spinner = ora()\n\n try {\n if (['template', 'features', 'examples', 'yes'].some(key => Object.hasOwn(options, key)))\n throw new Error(cliM('cli_createOptionsRemoved'))\n // 交互式获取选项\n const resolvedOptions = await resolveOptions(options)\n\n // 安全校验:项目名必须仅含小写字母、数字和连字符,防止路径遍历\n if (!PROJECT_NAME_REGEX.test(resolvedOptions.name))\n throw new Error(cliM('cli_createInvalidName', { params: { name: resolvedOptions.name } }))\n\n const projectPath = path.resolve(resolvedOptions.cwd ?? '.', resolvedOptions.name)\n\n // 检查目录是否存在\n if (await fileExists(projectPath)) {\n if (resolvedOptions.defaults)\n throw new Error(cliM('cli_createDirectoryExists'))\n const { overwrite } = await prompts({\n type: 'confirm',\n active: cliM('cli_yes'),\n inactive: cliM('cli_no'),\n name: 'overwrite',\n message: cliM('cli_createOverwrite', { params: { name: resolvedOptions.name } }),\n initial: false,\n })\n\n if (!overwrite) {\n writeCliMessage(chalk.yellow(cliM('cli_cancelled')))\n return\n }\n\n await fse.remove(projectPath)\n }\n\n spinner.start(cliM('cli_createDirectory'))\n await fse.ensureDir(projectPath)\n spinner.succeed()\n\n // ─── 基于模板生成项目文件 ───\n spinner.start(cliM('cli_createFiles'))\n\n const context = buildTemplateContext({\n name: resolvedOptions.name,\n appType: resolvedOptions.appType,\n features: resolvedOptions.features,\n deploy: resolvedOptions.deploy,\n frontends: resolvedOptions.frontends,\n moduleConfigs: resolvedOptions.moduleConfigs,\n packageManager: resolvedOptions.packageManager!,\n })\n\n // 拷贝模板 + 渲染动态文件\n await generateFromTemplates(projectPath, context)\n\n {\n // 生成配置文件(config/*.yml)\n const { generateConfigFile, generateEnvExample, generateProductionEnvironment } = await import('./cli-config-templates.js')\n const configs = resolvedOptions.moduleConfigs\n const isApiWorkspace = resolvedOptions.appType === 'api'\n const isFullstack = resolvedOptions.appType === 'fullstack'\n const configDir = isApiWorkspace\n ? path.join(projectPath, 'apps', `${resolvedOptions.name}-serv`, 'config')\n : isFullstack\n ? path.join(projectPath, 'packages', `${resolvedOptions.name}-serv`, 'config')\n : path.join(projectPath, 'config')\n const envExamplePath = isApiWorkspace\n ? path.join(projectPath, 'apps', `${resolvedOptions.name}-serv`, '.env.example')\n : path.join(projectPath, '.env.example')\n\n for (const featureId of resolvedOptions.features) {\n const configKey = getFeatureConfigKey(featureId)\n if (!context.isSvelteOnlyApp && configKey && configKey !== 'deploy') {\n const configPath = path.join(configDir, `_${configKey}.yml`)\n // fullstack 已用模块配置 helper 渲染完整配置,不能再覆盖 Reach 模板等应用默认值。\n if (isFullstack && await fse.pathExists(configPath))\n continue\n const baseConfig = generateConfigFile(configKey, configs)\n const renderedConfig = baseConfig\n await writeFile(configPath, configKey === 'feedback' ? renderedConfig.replace('HAI_FEEDBACK_APPID:my-app', `HAI_FEEDBACK_APPID:${resolvedOptions.name}`) : renderedConfig)\n }\n }\n\n if (!isApiWorkspace && !isFullstack) {\n // 始终生成 core 配置\n await writeFile(\n path.join(configDir, '_core.yml'),\n generateConfigFile('core', configs),\n )\n if (!context.isSvelteOnlyApp)\n await writeFile(path.join(configDir, '_kit.yml'), generateConfigFile('kit', configs))\n }\n\n const configContents: Record<string, string> = {}\n for (const file of await fse.readdir(configDir)) {\n if (/^_.*\\.yml$/.test(file))\n configContents[file.slice(1, -4)] = await fse.readFile(path.join(configDir, file), 'utf8')\n }\n const envFeatures: FeatureId[] = context.isSvelteOnlyApp ? [] : isFullstack ? [...new Set<FeatureId>([...resolvedOptions.features, 'reach'])] : resolvedOptions.features\n const envContents = generateEnvExample(envFeatures, configs, isFullstack, configContents)\n let envExample = isApiWorkspace\n ? envContents\n : isFullstack\n ? `${envContents}\\n# First-start administrator password; must satisfy the IAM password policy.\\nHAI_ADMIN_DEFAULT_PASSWORD=\\n# Independent first-start audit/configuration administrator passwords.\\nHAI_AUDIT_ADMIN_PASSWORD=\\nHAI_CONFIG_ADMIN_PASSWORD=\\nHAI_BUSINESS_OPERATOR_PASSWORD=\\n\\n# Public API origin; never include credentials.\\nPUBLIC_API_BASE=http://127.0.0.1:3000\\n`\n : context.isSvelteOnlyApp\n ? `${envContents}\\n# Public API URL including /api/v1; never include credentials.\\nPUBLIC_API_BASE=http://10.0.2.2:3000/api/v1\\n`\n : envContents\n\n const runtimeVariables = new Map<string, ConfigEnvironmentVariable>()\n for (const file of await fse.readdir(projectPath, { recursive: true, encoding: 'utf8' })) {\n if (!/\\.(?:ts|js|mjs|svelte|envsh)$/.test(file))\n continue\n for (const variable of runtimeEnvironmentVariables(await fse.readFile(path.join(projectPath, file), 'utf8')))\n runtimeVariables.set(variable.name, variable)\n }\n const existingNames = new Set([...envExample.matchAll(/^(?:#\\s*)?([A-Z][A-Z0-9_]*)=/gm)].map(match => match[1]))\n const runtimeExample = renderEnvironment([...runtimeVariables.values()].filter(variable => !existingNames.has(variable.name)))\n if (runtimeExample)\n envExample += `\\n# 可选运行入口(按用途注入,不进入公共默认值):\\n${runtimeExample.split('\\n').map(line => line && !line.startsWith('#') ? `# ${line}` : line).join('\\n')}\\n`\n\n await writeFile(envExamplePath, envExample)\n const envDirectory = path.dirname(envExamplePath)\n const sharedVariables = envExample.split('\\n').filter(line => /^[A-Z][A-Z0-9_]*=/.test(line))\n await writeFile(path.join(envDirectory, '.env'), `# 公共基础配置(可提交);完整字段说明见 .env.example。\\n${sharedVariables.join('\\n')}\\n`)\n for (const [mode, environment] of [['dev', 'development'], ['test', 'test'], ['prod', 'production']] as const) {\n let values = mode === 'prod'\n ? generateProductionEnvironment(envFeatures, configs)\n : `# 公共 ${mode} 环境配置;本机私有值放 .env.local,进程环境变量优先。\\nHAI_CORE_ENV=${environment}\\nHAI_CORE_LOGGING_LEVEL=${mode === 'test' ? 'warn' : 'debug'}\\n`\n if (isFullstack) {\n // 沿用各环境共享配置;各职责账号分别生成独立随机初始密码。\n for (const name of ['HAI_ADMIN_DEFAULT_PASSWORD', 'HAI_AUDIT_ADMIN_PASSWORD', 'HAI_CONFIG_ADMIN_PASSWORD', 'HAI_BUSINESS_OPERATOR_PASSWORD'])\n values += `\\n${name}=Aa1!${randomBytes(24).toString('base64url')}\\n`\n }\n if (isFullstack || (!context.isSvelteOnlyApp && resolvedOptions.features.includes('crypto'))) {\n // 每个环境独立生成版本化密钥环;运行时不隐式生成或轮换。\n const key = createECDH('SM2')\n key.generateKeys()\n const id = `${mode}-${randomBytes(6).toString('hex')}`\n const ring = { activeKeyId: id, keys: { [id]: { publicKey: key.getPublicKey('hex'), privateKey: key.getPrivateKey('hex').padStart(64, '0') } } }\n values += `\\nHAI_CRYPTO_TRANSPORT_SERVERKEYRING='${JSON.stringify(ring)}'\\n`\n }\n await writeFile(path.join(envDirectory, `.env.${mode}`), values)\n }\n await fse.writeFile(path.join(envDirectory, '.env.local'), '# 本机私有覆盖,不提交 Git;初始管理员密码和传输密钥环见 .env.dev / .env.test / .env.prod。\\n', { mode: 0o600 })\n }\n\n // 生成 Skill 文件\n const { generateSkillFiles } = await import('./cli-skill-templates.js')\n await generateSkillFiles(\n projectPath,\n resolvedOptions.features,\n resolvedOptions.appType,\n resolvedOptions.name,\n )\n\n // 生成 README\n const appTypeLabel = cliM(`cli_app${({ 'admin': 'Admin', 'website': 'Website', 'h5': 'H5', 'api': 'Api', 'mobile-app': 'Mobile', 'fullstack': 'Fullstack' } as const)[resolvedOptions.appType]}Name`, { locale: 'zh-CN' })\n const readmeContent = resolvedOptions.appType === 'fullstack'\n ? generateFullstackReadme(resolvedOptions.name, resolvedOptions.packageManager!, resolvedOptions.frontends, resolvedOptions.features.includes('feedback'))\n : resolvedOptions.appType === 'api'\n ? generateApiWorkspaceReadme(resolvedOptions.name, resolvedOptions.packageManager!)\n : generateReadme(resolvedOptions.name, appTypeLabel, resolvedOptions.packageManager!, resolvedOptions.appType)\n await writeFile(\n path.join(projectPath, 'README.md'),\n resolvedOptions.deploy === false\n ? readmeContent.replace(/### 构建与部署[\\s\\S]*?(?=\\n#{2,3} |$)/, '### 构建\\n\\npnpm build\\npnpm build --target image\\n\\n本项目创建时关闭了部署工具。\\n')\n : readmeContent,\n )\n\n spinner.succeed()\n\n // 初始化 Git\n if (resolvedOptions.git) {\n spinner.start(cliM('cli_createGit'))\n execSync('git init', { cwd: projectPath, stdio: 'ignore' })\n if (resolvedOptions.gitRemote) {\n // 使用 execFileSync + 数组参数,避免 shell 注入\n // 同时在非交互模式下补充校验(交互模式在 prompts.validate 中已校验)\n const gitRemote = resolvedOptions.gitRemote\n if (!RE_HTTPS_URL.test(gitRemote) && !RE_GIT_SSH_URL.test(gitRemote)) {\n spinner.fail()\n throw new Error(cliM('cli_createRemoteFailure', { params: { remote: gitRemote } }))\n }\n execFileSync('git', ['remote', 'add', 'origin', gitRemote], { cwd: projectPath, stdio: 'ignore' })\n }\n spinner.succeed()\n }\n\n // 安装依赖\n if (resolvedOptions.install) {\n spinner.start(cliM('cli_createInstall', { params: { manager: resolvedOptions.packageManager } }))\n installDependencies(projectPath, resolvedOptions.packageManager!)\n spinner.succeed()\n }\n\n // 完成提示\n printCompletionMessage(resolvedOptions)\n }\n catch (error) {\n spinner.fail()\n writeCliError(chalk.red(cliM('cli_createFailed')), error)\n throw error\n }\n}\n\n// =============================================================================\n// 交互式选项解析\n// =============================================================================\n\n/**\n * 解析选项(交互式)\n */\nasync function resolveOptions(options: CreateProjectOptions): Promise<Required<CreateProjectOptions> & { features: FeatureId[] }> {\n const useDefaults = options.defaults ?? false\n\n writeCliMessage('')\n writeCliMessage(chalk.bold.cyan(' 🚀 hai Agent Framework'))\n writeCliMessage(chalk.gray(cliM('cli_createTagline')))\n writeCliMessage('')\n\n const onCancel = () => {\n writeCliMessage(chalk.red(cliM('cli_cancelledLine')))\n process.exit(1)\n }\n\n // 项目名称(逐条询问,避免 prompts 数组模式在 Windows 终端重复渲染)\n let projectName = options.name\n if (!projectName && useDefaults) {\n projectName = 'my-app'\n }\n else if (!projectName) {\n const { name } = await prompts({\n type: 'text',\n name: 'name',\n message: cliM('cli_createNamePrompt'),\n initial: 'my-app',\n validate: (value: string) => {\n if (!value.trim())\n return cliM('cli_createNameRequired')\n if (!PROJECT_NAME_REGEX.test(value))\n return cliM('cli_createNamePattern')\n return true\n },\n }, { onCancel })\n projectName = name\n }\n\n // 应用类型\n let resolvedAppType = options.appType\n if (!resolvedAppType && useDefaults) {\n resolvedAppType = 'admin'\n }\n else if (!resolvedAppType) {\n const { appType } = await prompts({\n type: 'select',\n name: 'appType',\n message: cliM('cli_createTypePrompt'),\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n choices: Object.entries(APP_TYPES).map(([key, t]) => ({\n title: t.name,\n description: formatPromptDescription(t.description),\n value: key,\n })),\n initial: 0,\n }, { onCancel })\n resolvedAppType = appType\n }\n\n const selectedAppType = (resolvedAppType || 'admin') as AppType\n\n const selectedFrontends = selectedAppType === 'fullstack'\n ? await resolveFrontendTargets(options.frontends, useDefaults, onCancel)\n : []\n\n // 所有新工程使用完整模块及示例;客户端模板仍遵守自身的服务端隔离边界。\n let selectedFeatures: FeatureId[] = selectedAppType === 'mobile-app'\n ? ['iam', 'crypto', 'api-client', 'capacitor']\n : resolveFeatureDependencies(FULL_FEATURES)\n\n selectedFeatures = selectedFeatures.filter(feature => feature !== 'deploy')\n if (options.deploy !== false)\n selectedFeatures.push('deploy')\n\n // 模块配置\n const moduleConfigs = selectedAppType === 'fullstack' || selectedAppType === 'mobile-app'\n ? { ...buildDefaultModuleConfigs(selectedFeatures, projectName!), ...options.moduleConfigs }\n : options.moduleConfigs ?? (useDefaults\n ? buildDefaultModuleConfigs(selectedFeatures, projectName!)\n : await promptModuleConfigs(selectedFeatures, projectName!))\n\n // 包管理器\n const detected = await detectPackageManager(options.cwd ?? '.')\n let packageManager = selectedAppType === 'fullstack' || selectedAppType === 'api'\n ? 'pnpm'\n : options.packageManager\n if (!packageManager && useDefaults) {\n packageManager = detected\n }\n if (!packageManager) {\n const { pm } = await prompts({\n type: 'select',\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n name: 'pm',\n message: cliM('cli_createManagerPrompt'),\n choices: [\n { title: cliM('cli_createPnpmRecommended'), value: 'pnpm' },\n { title: 'npm', value: 'npm' },\n { title: 'yarn', value: 'yarn' },\n ],\n initial: detected === 'pnpm' ? 0 : detected === 'npm' ? 1 : 2,\n }, { onCancel })\n packageManager = pm\n }\n\n // 安装依赖\n let install = options.install\n if (install === undefined && useDefaults) {\n install = true\n }\n else if (install === undefined) {\n const { doInstall } = await prompts({\n type: 'confirm',\n active: cliM('cli_yes'),\n inactive: cliM('cli_no'),\n name: 'doInstall',\n message: cliM('cli_createInstallPrompt'),\n initial: true,\n }, { onCancel })\n install = doInstall\n }\n\n // Git\n let git = options.git\n if (git === undefined && useDefaults) {\n git = true\n }\n else if (git === undefined) {\n const { initGit } = await prompts({\n type: 'confirm',\n active: cliM('cli_yes'),\n inactive: cliM('cli_no'),\n name: 'initGit',\n message: cliM('cli_createGitPrompt'),\n initial: true,\n }, { onCancel })\n git = initGit\n }\n\n // Git 远程仓库地址\n let gitRemote = options.gitRemote\n if (git && gitRemote === undefined && useDefaults) {\n gitRemote = ''\n }\n else if (git && gitRemote === undefined) {\n const { remote } = await prompts({\n type: 'text',\n name: 'remote',\n message: cliM('cli_createRemotePrompt'),\n initial: '',\n validate: (value: string) => {\n if (!value.trim())\n return true\n if (RE_HTTPS_URL.test(value) || RE_GIT_SSH_URL.test(value))\n return true\n return cliM('cli_createRemoteInvalid')\n },\n }, { onCancel })\n gitRemote = remote?.trim() || ''\n }\n\n return {\n name: projectName!,\n appType: selectedAppType,\n frontends: selectedFrontends,\n features: selectedFeatures,\n deploy: options.deploy !== false,\n moduleConfigs,\n install: install ?? true,\n packageManager: packageManager || 'pnpm',\n git: git ?? true,\n gitRemote: gitRemote ?? '',\n defaults: useDefaults,\n verbose: options.verbose ?? false,\n cwd: options.cwd ?? '.',\n }\n}\n\nfunction buildDefaultModuleConfigs(features: FeatureId[], projectName: string): ModuleConfigs {\n const configs: ModuleConfigs = {\n core: { name: projectName, defaultLocale: 'zh-CN' },\n }\n\n if (features.includes('db')) {\n configs.db = { type: 'sqlite', database: './data/app.db' }\n }\n if (features.includes('cache')) {\n configs.cache = { type: 'memory' }\n }\n if (features.includes('iam')) {\n configs.iam = { loginPassword: true, loginOtp: false }\n }\n if (features.includes('storage')) {\n configs.storage = { type: 'local', localPath: './data/uploads' }\n }\n if (features.includes('ai')) {\n configs.ai = { defaultProvider: 'openai', model: 'gpt-4o-mini' }\n }\n\n return configs\n}\n\nasync function resolveFrontendTargets(\n frontends: FrontendTarget[] | undefined,\n useDefaults: boolean,\n onCancel: () => void,\n): Promise<FrontendTarget[]> {\n if (frontends && frontends.length > 0) {\n return normalizeFrontendTargets(frontends)\n }\n if (useDefaults) {\n return DEFAULT_FULLSTACK_FRONTENDS\n }\n\n const { selectedFrontends } = await prompts({\n type: 'multiselect',\n name: 'selectedFrontends',\n message: cliM('cli_frontendsPrompt'),\n choices: Object.entries(FRONTEND_TARGETS).map(([id, target]) => ({\n title: target.name,\n description: formatPromptDescription(target.description),\n value: id,\n selected: DEFAULT_FULLSTACK_FRONTENDS.includes(id as FrontendTarget),\n })),\n // 独立行显示帮助,避免宽字符让 prompts 按字符数清除时遗留折行。\n hint: `\\n${formatPromptDescription(cliM('cli_multiselectHint'))}`,\n instructions: false,\n }, { onCancel })\n\n return normalizeFrontendTargets(selectedFrontends ?? DEFAULT_FULLSTACK_FRONTENDS)\n}\n\nfunction normalizeFrontendTargets(frontends: FrontendTarget[]): FrontendTarget[] {\n const validTargets = new Set(Object.keys(FRONTEND_TARGETS))\n const result = frontends.filter(target => validTargets.has(target))\n return [...new Set(result.length > 0 ? result : DEFAULT_FULLSTACK_FRONTENDS)]\n}\n\n// =============================================================================\n// 功能依赖解析\n// =============================================================================\n\n/**\n * 迭代展开功能硬依赖直到集合稳定,避免仅处理一层依赖导致初始化缺项;保留输入顺序并去重。\n * @param features - 调用方选择的功能。\n * @returns 包含传递硬依赖的功能列表。\n * @example 模块内部上下文\n * ```ts\n * const features = resolveFeatureDependencies(['iam', 'ai'])\n * const complete = ['db', 'cache', 'crypto', 'vecdb'].every(feature => features.some(selected => selected === feature))\n * ```\n */\nfunction resolveFeatureDependencies(features: FeatureId[]): FeatureId[] {\n const result = new Set(features)\n\n let changed = true\n while (changed) {\n changed = false\n for (const featureId of result) {\n const feature = FEATURES[featureId]\n if (feature?.dependencies) {\n for (const dep of feature.dependencies) {\n if (!result.has(dep)) {\n result.add(dep)\n changed = true\n }\n }\n }\n }\n }\n\n return Array.from(result)\n}\n\n// =============================================================================\n// 模块配置交互\n// =============================================================================\n\n/**\n * 交互式收集模块配置\n */\nasync function promptModuleConfigs(features: FeatureId[], projectName: string): Promise<ModuleConfigs> {\n const configs: ModuleConfigs = {}\n const onCancel = () => {\n writeCliMessage(chalk.red(cliM('cli_cancelledLine')))\n process.exit(1)\n }\n\n writeCliMessage('')\n writeCliMessage(chalk.bold(cliM('cli_createModuleConfig')))\n writeCliMessage(chalk.gray(cliM('cli_createModuleConfigHint')))\n writeCliMessage('')\n\n // core 配置(始终收集)\n configs.core = await promptCoreConfig(projectName, onCancel)\n\n if (features.includes('db')) {\n configs.db = await promptDbConfig(projectName, onCancel)\n }\n if (features.includes('cache')) {\n configs.cache = await promptCacheConfig(onCancel)\n }\n if (features.includes('iam')) {\n configs.iam = await promptIamConfig(onCancel)\n }\n if (features.includes('storage')) {\n configs.storage = await promptStorageConfig(onCancel)\n }\n if (features.includes('ai')) {\n configs.ai = await promptAiConfig(onCancel)\n }\n\n return configs\n}\n\n/**\n * 收集 core 模块配置\n */\nasync function promptCoreConfig(projectName: string, onCancel: () => void): Promise<ModuleConfigs['core']> {\n writeCliMessage(chalk.cyan(cliM('cli_createCoreConfig')))\n const { defaultLocale } = await prompts({\n type: 'select',\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n name: 'defaultLocale',\n message: cliM('cli_createLocalePrompt'),\n choices: [\n { title: cliM('cli_createChineseLocale'), value: 'zh-CN' },\n { title: cliM('cli_createEnglishLocale'), value: 'en-US' },\n { title: cliM('cli_createJapaneseLocale'), value: 'ja-JP' },\n ],\n initial: 0,\n }, { onCancel })\n return { name: projectName, defaultLocale }\n}\n\n/**\n * 收集 db 模块配置\n */\nasync function promptDbConfig(projectName: string, onCancel: () => void): Promise<ModuleConfigs['db']> {\n writeCliMessage(chalk.cyan(cliM('cli_createDbConfig')))\n const { type } = await prompts({\n type: 'select',\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n name: 'type',\n message: cliM('cli_createDbTypePrompt'),\n choices: [\n { title: cliM('cli_createSqliteOption'), value: 'sqlite' },\n { title: 'PostgreSQL', value: 'postgresql' },\n { title: 'MySQL', value: 'mysql' },\n ],\n initial: 0,\n }, { onCancel })\n\n if (type === 'sqlite') {\n const { database } = await prompts({\n type: 'text',\n name: 'database',\n message: cliM('cli_createSqlitePathPrompt'),\n initial: './data/app.db',\n }, { onCancel })\n return { type, database }\n }\n\n const answers = await prompts([\n { type: 'text', name: 'host', message: cliM('cli_createDbHostPrompt', { params: { backend: type === 'postgresql' ? 'PostgreSQL' : 'MySQL' } }), initial: 'localhost' },\n { type: 'number', name: 'port', message: cliM('cli_createPortPrompt'), initial: type === 'postgresql' ? 5432 : 3306 },\n { type: 'text', name: 'database', message: cliM('cli_createDatabasePrompt'), initial: projectName },\n ], { onCancel })\n\n return { type, host: answers.host, port: answers.port, database: answers.database }\n}\n\n/**\n * 收集 cache 模块配置\n */\nasync function promptCacheConfig(onCancel: () => void): Promise<ModuleConfigs['cache']> {\n writeCliMessage(chalk.cyan(cliM('cli_createCacheConfig')))\n const { type } = await prompts({\n type: 'select',\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n name: 'type',\n message: cliM('cli_createCacheTypePrompt'),\n choices: [\n { title: cliM('cli_createMemoryOption'), value: 'memory' },\n { title: 'Redis', value: 'redis' },\n ],\n initial: 0,\n }, { onCancel })\n\n if (type === 'memory')\n return { type }\n\n const answers = await prompts([\n { type: 'text', name: 'host', message: cliM('cli_createRedisHostPrompt'), initial: 'localhost' },\n { type: 'number', name: 'port', message: cliM('cli_createRedisPortPrompt'), initial: 6379 },\n ], { onCancel })\n\n return { type, host: answers.host, port: answers.port }\n}\n\n/**\n * 收集 iam 模块配置\n */\nasync function promptIamConfig(onCancel: () => void): Promise<ModuleConfigs['iam']> {\n writeCliMessage(chalk.cyan(cliM('cli_createIamConfig')))\n const answers = await prompts([\n { type: 'confirm', active: cliM('cli_yes'), inactive: cliM('cli_no'), name: 'loginPassword', message: cliM('cli_createPasswordPrompt'), initial: true },\n { type: 'confirm', active: cliM('cli_yes'), inactive: cliM('cli_no'), name: 'loginOtp', message: cliM('cli_createOtpPrompt'), initial: false },\n ], { onCancel })\n return { loginPassword: answers.loginPassword, loginOtp: answers.loginOtp }\n}\n\n/**\n * 收集 storage 模块配置\n */\nasync function promptStorageConfig(onCancel: () => void): Promise<ModuleConfigs['storage']> {\n writeCliMessage(chalk.cyan(cliM('cli_createStorageConfig')))\n const { type } = await prompts({\n type: 'select',\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n name: 'type',\n message: cliM('cli_createStorageTypePrompt'),\n choices: [\n { title: cliM('cli_createLocalStorageOption'), value: 'local' },\n { title: 'S3 / MinIO / OSS', value: 's3' },\n ],\n initial: 0,\n }, { onCancel })\n\n if (type === 'local') {\n const { localPath } = await prompts({\n type: 'text',\n name: 'localPath',\n message: cliM('cli_createStoragePathPrompt'),\n initial: './data/uploads',\n }, { onCancel })\n return { type, localPath }\n }\n\n return { type }\n}\n\n/**\n * 收集 ai 模块配置\n */\nasync function promptAiConfig(onCancel: () => void): Promise<ModuleConfigs['ai']> {\n writeCliMessage(chalk.cyan(cliM('cli_createAiConfig')))\n const { defaultProvider } = await prompts({\n type: 'select',\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n name: 'defaultProvider',\n message: cliM('cli_createProviderPrompt'),\n choices: [\n { title: 'OpenAI', value: 'openai' },\n { title: 'Anthropic (Claude)', value: 'anthropic' },\n { title: cliM('cli_createCompatibleAiOption'), value: 'custom' },\n ],\n initial: 0,\n }, { onCancel })\n\n const defaultModel = defaultProvider === 'openai'\n ? 'gpt-4o-mini'\n : defaultProvider === 'anthropic'\n ? 'claude-3-sonnet'\n : ''\n\n const { model } = await prompts({\n type: 'text',\n name: 'model',\n message: cliM('cli_createModelPrompt'),\n initial: defaultModel,\n }, { onCancel })\n\n return { defaultProvider, model }\n}\n\n// =============================================================================\n// 工具函数\n// =============================================================================\n\n/**\n * 获取功能对应的配置 key\n */\nfunction getFeatureConfigKey(featureId: FeatureId): string | null {\n const map: Record<string, string> = {\n db: 'db',\n cache: 'cache',\n iam: 'iam',\n storage: 'storage',\n ai: 'ai',\n deploy: 'deploy',\n vecdb: 'vecdb',\n reach: 'reach',\n feedback: 'feedback',\n scheduler: 'scheduler',\n audit: 'audit',\n payment: 'payment',\n }\n return map[featureId] ?? null\n}\n\n/**\n * 获取安装命令\n */\nfunction getInstallCommand(pm: 'pnpm' | 'npm' | 'yarn'): string {\n switch (pm) {\n case 'pnpm': return 'pnpm install'\n case 'yarn': return 'yarn'\n default: return 'npm install'\n }\n}\n\n/**\n * 生成运行 package.json 脚本的命令\n *\n * npm 需要 `npm run <script>`(lifecycle 脚本除外),pnpm / yarn 可直接 `<pm> <script>`。\n */\nfunction getRunCommand(pm: 'pnpm' | 'npm' | 'yarn', script: string): string {\n return pm === 'npm' ? `npm run ${script}` : `${pm} ${script}`\n}\n\nfunction installDependencies(projectPath: string, pm: 'pnpm' | 'npm' | 'yarn'): void {\n const installCmd = getInstallCommand(pm)\n try {\n execSync(installCmd, {\n cwd: projectPath,\n stdio: 'pipe',\n encoding: 'utf-8',\n maxBuffer: 10 * 1024 * 1024,\n })\n }\n catch (error) {\n const details = formatCommandFailure(installCmd, error)\n throw new Error(`${cliM('cli_installFailed', { params: { pm } })}\\n${details}`)\n }\n}\n\n/**\n * 同步子命令异常中可读取的诊断字段;输出可能为 Buffer 或字符串,因此先以 unknown 接收并规范化。\n * @example 模块内部上下文\n * ```ts\n * const failure: CommandFailureLike = { status: 1, signal: null, stderr: Buffer.from('Install failed'), stdout: '' }\n * const details = formatCommandFailure('pnpm install', failure)\n * ```\n */\ninterface CommandFailureLike {\n stdout?: unknown\n stderr?: unknown\n status?: number | null\n signal?: string | null\n}\n\nfunction formatCommandFailure(command: string, error: unknown): string {\n if (!error || typeof error !== 'object') {\n return cliM('cli_commandLabel', { params: { command } })\n }\n\n const failure = error as CommandFailureLike\n const stdout = normalizeChildOutput(failure.stdout)\n const stderr = normalizeChildOutput(failure.stderr)\n const status = typeof failure.status === 'number' ? cliM('cli_exitCode', { params: { code: failure.status } }) : ''\n const signal = typeof failure.signal === 'string' ? cliM('cli_signal', { params: { signal: failure.signal } }) : ''\n const output = [\n cliM('cli_commandLabel', { params: { command } }),\n status,\n signal,\n stderr ? `stderr:\\n${stderr}` : '',\n stdout ? `stdout:\\n${stdout}` : '',\n ].filter(Boolean)\n\n return output.join('\\n\\n')\n}\n\nfunction normalizeChildOutput(output: unknown): string {\n if (typeof output === 'string') {\n return output.trim()\n }\n if (Buffer.isBuffer(output)) {\n return output.toString('utf-8').trim()\n }\n return ''\n}\n\n/** 生成各类项目共用的 AI 开发入口说明。 */\nfunction generateAiDevelopmentReadme(): string {\n return `### AI 辅助开发\n\n从本项目根目录打开所用编码工具,先读取 [AGENTS.md](./AGENTS.md)。Claude Code 通过 [CLAUDE.md](./CLAUDE.md) 加载项目规则;GitHub Copilot 使用 [.github/copilot-instructions.md](./.github/copilot-instructions.md),OpenCode 使用 AGENTS.md 和 [opencode.json](./opencode.json)。\n\n生成的页面和业务规则是起点,可以按需求调整。把功能、权限和验收条件告诉 AI,再让它读取对应技能与当前安装版本的 API。\n\n普通功能开发使用 [应用开发 Skill](./.agents/skills/hai-app-create/SKILL.md)。需求文档较多时,先用 [文档审查 Skill](./.agents/skills/hai-spec-review/SKILL.md) 找出缺失和矛盾,再用 [文档实施 Skill](./.agents/skills/hai-spec-implement/SKILL.md) 维护 docs/task-list.md 与 docs/tasks/,逐项实现、测试和交付。\n\n已有项目可运行 hai init 补齐缺失的 AI 入口;它保留已有自定义内容。升级框架使用 [框架升级 Skill](./.agents/skills/hai-framework-sync/SKILL.md),同时核对依赖、配置、代码和技能。\n\n`\n}\n\n/** 生成各类工程共用的配置与命令说明,放在开发/部署章节之间。 */\nfunction generateEnvironmentReadme(): string {\n return `### 分环境配置\n\n运行参数在 \\`.env.example\\` 中逐项说明用途、枚举和范围。\\`.env\\` 为公共基础,\\`.env.dev\\` / \\`.env.test\\` / \\`.env.prod\\` 为环境覆盖,均提交 Git;\\`.env.local\\` 为本机私有覆盖,不提交 Git。优先级为进程环境 > \\`.env.local\\` > 环境文件 > \\`.env\\`。YAML 显式引用 \\`HAI_<配置名>_<路径>\\` 并保留本地回退,camelCase 不拆词。完整命令、加载优先级和 Provider 切换见 [环境配置](.agents/skills/hai-app-create/development.md#环境配置)。\n\n生产 .env.prod 按已启用模块选择共享 PostgreSQL(明确选择 MySQL 时保留)、Redis、S3、Qdrant,默认使用 Compose 内部服务名 db/cache/storage/vecdb。密码、S3 凭据、模型 Key 与受保护 Qdrant 的 Key 只由私有环境注入;容器外运行覆盖内部连接地址。生产 Reach 必须注入真实 HAI_REACH_PROVIDERS JSON,公共空数组会拒绝启动。AI 自动补全 db+vecdb 依赖,并在二者就绪后初始化,失败逆序清理。\n\n| 用途 | 命令 |\n| --- | --- |\n| 开发 / 测试模式 / 生产模式预览 | \\`pnpm dev\\` / \\`dev:test\\` / \\`dev:prod\\` |\n| 类型检查(check 为别名) | \\`pnpm typecheck\\` |\n| 检查 / 自动修复格式 | \\`pnpm lint\\` / \\`lint:fix\\` |\n| 源码构建 / 镜像构建 | \\`pnpm build\\` / \\`pnpm build --target image\\` |\n| 单元测试 / 监听 / 浏览器验收 | \\`pnpm test\\` / \\`test:watch\\` / \\`test:e2e\\` |\n| Node 服务按环境启动(构建后) | \\`pnpm start\\` / \\`start:test\\` / \\`start:prod\\` |\n\nVite 客户端使用 \\`preview\\` 预览静态产物,Node 服务使用 \\`start\\`;纯 contract/shared 库只提供适用的构建和质量命令。API workspace 的环境文件位于 \\`apps/<name>-serv\\`,fullstack 位于工程根。`\n}\n\n/** 生成与项目脚本一致的构建、离线交付和增量更新说明。 */\nfunction generateBuildDeploymentReadme(pm: string, appDir: string): string {\n return `### 构建与部署\n\n创建时默认包含部署工具;不需要时使用 hai create --no-deploy。\n后端serv、浏览器站点web(静态或SSR)、手机原生包app、桌面原生包desktop。--images/--services使用serv/web,--target app/desktop用于原生交付。镜像和容器身份取工程根package.json.name,去scope、转小写并归一化字符;缺失或无效时报错,不使用目录名。根目录制品格式4,非根目录格式5及webBasePath,两者都记录primaryService/hasWeb;只有serv + web生成同源API代理。旧工程先同步build.images、Dockerfile及API workspace的-serv包名与引用,安装依赖并重建完整制品;旧部署先备份、核对项目名、卷与受管凭据,再建立完整基线。完整部署按Compose规则清理同项目旧服务,不自动跨项目迁移数据。\n\n网站地址含/yyy/等目录时,在构建进程显式设置PUBLIC_BASE_PATH=/yyy,默认空字符串;不从私有dotenv读取。SvelteKit编译时固定base,Vite默认相对资源与hash路由;API地址独立配置。Docker网站制品由SDK处理代理与健康路径,使用匹配CLI/Deploy;所有部分构建保持同一目录,即使只构建serv。目录变化使用全量部署,操作和验证见[网站挂载目录](.agents/skills/hai-build/paths.md)。\n\n自建S3的内部endpoint与浏览器publicEndpoint分开。publicEndpoint可设置为https://example.com/delivery/files等带目录地址,不含桶名、凭据或查询;返回URL保留桶名,Web Nginx或SSR/API gateway去掉入口前缀,保留原始S3路径、Host与查询后直接转发storage,大文件不经过Serv。外层代理保留完整入口路径,不重复去前缀;外部S3/CORS按实际服务配置,Local不公开私有目录。增加网关、改变桶或公开地址时全量部署,应用增量与回滚保持原配置;详见[存储使用规范](.agents/skills/hai-storage/SKILL.md)。\n每个镜像对应 images/ 中一个 Dockerfile,根 hai.json 的 build 分区指定文件,deploy 分区保存整个项目的部署配置。\n下载、安装和整理生产依赖复用同一份包缓存与 SQLite 驱动缓存,依赖安装先于源码复制。前后端默认最多并行构建两项,--concurrency 1可降低资源占用。运行镜像去除应用自身的声明文件、源码映射和说明文件。\n默认容器用于 CPU 运行或连接远程 AI 服务,不额外下载 GPU 运行库;需要使用部署机器上的 GPU 时,自行定制镜像和容器运行参数。\n\n\\`\\`\\`sh\n${pm} build\n${pm} build --target image\n# 构建和部署一次完成\n${pm} exec hai deploy ${appDir} --env test --build\n# 复用已有镜像;只生成完整离线包及跨平台部署脚本\n${pm} exec hai deploy ${appDir} --env prod --bundle-only\n# 只更新前端(工程存在 web 镜像时)\n${pm} build --target image --images web\n${pm} exec hai deploy ${appDir} --env prod --services web\n\\`\\`\\`\n\n构建不读取部署环境;产物位于 .hai/build/docker/<buildId>,用 --artifact-dir 精确选择。\n应用根 package.json.version 驱动版本,同版本允许重新构建和发布;清单记录独立构建编号与校验和。\n完整离线包自动携带自建中间件镜像;准备中间件镜像需要构建机有可用 Podman/Docker,缺镜像时在打包阶段拉取。\n服务器需要 Linux、Docker/Podman、Docker Compose v2 或 podman-compose 1.6.0 及以上、sh、tar、sha256sum、awk、curl、util-linux flock 和支持 flock 的文件系统,启动阶段不联网拉取。\n固定 .deploy.lock 内核锁覆盖部署及恢复;禁止删除或替换,所有持有进程退出或重启后自动释放。强杀后须核对结果文件、current 和容器状态,再用新包恢复。\n每次离线交付生成独立目录,默认tar.gz(显式--output release.tar可保留未压缩),外层仅含归档、deploy.ps1(Windows)、deploy.sh(Linux/macOS)、deploy-target.json、read-target.awk、deploy-local.sh 和 README.txt;Compose、运行环境和清单仅在归档内,README不重复。中间件归档按镜像内容ID缓存并在复用前验证摘要。成功后清理本次incoming上传与解包目录,release保留恢复配置和状态,镜像由引擎保存。交互式打包在构建和中间件配置后最后询问是否保存或修改 SSH 信息,写入 .env.<环境>.local 并用于本次和后续 target;--yes 复用已有配置,复制整个目录即可。脚本按已保存的 SSH 参数上传、导入、启动并验证 HTTP或HTTPS。\n部署向导可选已有PEM证书与私钥路径(相对工程根,校验后复制到私有包)或Let’s Encrypt。官方Certbot申请并每12小时检查续期,Nginx自动重载;需要条款确认、真实邮箱、公网DNS、80端口及CA网络。HTTPS默认443、HTTP跳转开启,未配置仍为HTTP;启停或改模式/域名/端口/本地证书须全量。证书状态保留在服务器并备份,隔离目标使用已有证书。--plan中的root表示工程根,serviceDir表示部署服务源码与配置目录。\n完全隔离时复制整个交付目录,运行 sh deploy-local.sh 自动解包并部署;可传入部署目录覆盖默认位置。\nNode后端默认在启动时重读实际挂载的releases/<后端发布ID>/.env.runtime,修改后restart容器即可;无需新开关或override,旧部署先用新版CLI发布一次。仅更新Web/中间件后,按后端容器Mounts确认源文件,不能根据current猜路径。托管连接middleware.env仍优先;端口/挂载/Node启动参数、静态Web和中间件按原流程更新。手工修改先备份,长期配置同步源环境,下次后端发布会重新生成。\n部分更新要求已有成功的完整部署,保留未选服务及数据卷;失败返回非零退出码,已有部署尝试恢复选中服务。\n中间件连接齐全时使用 --skip-middleware 跳过配置向导。包中包含私有配置,不提交 Git。\n`\n}\n\nfunction generateReadme(name: string, appTypeLabel: string, pm: 'pnpm' | 'npm' | 'yarn', appType: AppType): string {\n const install = getInstallCommand(pm)\n const staticWebsite = appType === 'website'\n ? `### 静态网站与 GitHub Pages\n\n默认使用Node SSR,包含完整模块和示例。静态发布前先移除服务端业务依赖、初始化及API/actions,保留Core/UI;已有动态模块不能仅打开开关静态发布。\n\n\\`HAI_BUILD_STATIC=1\\`显式预渲染,\\`PUBLIC_BASE_PATH=/${name}\\`指定项目站目录(无末尾/,根站留空);在PowerShell设置本次构建环境:\n\n\\`\\`\\`powershell\n$env:HAI_BUILD_STATIC = '1'\n$env:PUBLIC_BASE_PATH = '/${name}'\n${getRunCommand(pm, 'build')}\n${getRunCommand(pm, 'preview')}\n\\`\\`\\`\n\n检查build/index.html、各页面目录、_app、.nojekyll与子路径刷新;build/api/health不应存在。构建不读取根.env;static是公开资产目录,图片、字体和其他正常资源会原样发布,禁止放入私密内容,检测到.env/.env.*或符号链接会停止构建。服务端模块、自定义API、actions或未预渲染页面会明确拒绝;不会放宽生产守卫或用SPA回退掩盖。清除HAI_BUILD_STATIC后恢复普通SSR构建;PUBLIC_BASE_PATH可继续用于SSR或Docker网站目录,原生app/desktop目标不接受网站目录。\n\nGitHub Pages选择Actions发布静态build目录;上传步骤显式include-hidden-files:true以保留.nojekyll,不上传config、data、.env或源码。发布前核对仓库项目名和PUBLIC_BASE_PATH一致。联系表单是未接真实服务的界面示例,提交时通过Toast说明尚未开通并保留输入;投入使用前应接实际留言服务并验证加载、成功与失败状态。\n\n`\n : ''\n return `# ${name}\n\n## 简介\n\n基于 hai Agent Framework 构建的${appTypeLabel}应用。\n\n## 核心功能清单\n\n- 开发服务器、源码编译与浏览器测试。\n- 按所选模块提供页面和服务配置。\n- 独立 Dockerfile 与镜像归档,便于交付。\n\n## 使用入门\n\n### 页面布局与路由\n\n页面统一继承根布局的 header/footer。${appType === 'mobile-app' ? '页面放 src/lib/pages/**/*.svelte,hash 路由自动发现,刷新与前进后退恢复当前页。' : '使用 SvelteKit 自动文件路由,新增 +page.svelte 无需维护路由表;刷新定位与服务端鉴权保持一致。'}${appType === 'mobile-app' ? '\\n\\n选择 IAM 或 crypto 的移动客户端默认启用加密 transport,先初始化 crypto,再初始化 typed API client;结束时按相反顺序关闭。仅明确连接匹配的明文 API 时设置 PUBLIC_API_TRANSPORT=off;PUBLIC_API_KEY_EXCHANGE_PATH 仅覆盖公开协商子路径。握手失败不会退回明文,服务端私钥不进入客户端。未选择 crypto 的客户端保留明文 API 模式。' : ''}\n\n### 开发\n\n\\`\\`\\`bash\n${install}\n${getRunCommand(pm, 'dev')}\n\\`\\`\\`\n\n${generateEnvironmentReadme()}\n\n### 构建\n\n\\`\\`\\`bash\n${getRunCommand(pm, 'build')}\n${getRunCommand(pm, 'paraglide:compile')}\n${getRunCommand(pm, 'preview')}\n\\`\\`\\`\n\n${staticWebsite}${generateBuildDeploymentReadme(pm, `.`)}\n\n${generateAiDevelopmentReadme()}### 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [Svelte 5](https://svelte.dev/)\n\n## 开发测试\n\n\\`\\`\\`sh\n${getRunCommand(pm, 'typecheck')}\n${getRunCommand(pm, 'lint')}\n${getRunCommand(pm, 'build')}\n${getRunCommand(pm, 'test')}\n${getRunCommand(pm, 'test:e2e')}\n\\`\\`\\`\n\n## 许可证\n\nApache-2.0\n`\n}\n\nfunction generateApiWorkspaceReadme(name: string, pm: 'pnpm' | 'npm' | 'yarn'): string {\n return `# ${name}\n\n## 简介\n\n后端 API 工程,接口定义与服务实现分包维护,客户端可复用同一份接口类型。\n\n## 核心功能清单\n\n- 共享 contract、输入输出校验与服务 procedures。\n- 模块配置、健康检查和 HTTP 服务。\n- 独立镜像构建与离线交付。\n\n## 使用入门\n\n### 工程结构\n\n- \\`apps/${name}-contract\\`:共享 API contract、Zod schema 与类型\n- \\`apps/${name}-serv\\`:后端 API service,基于 \\`@h-ai/serv\\` 暴露 HTTP 应用\n\n### 开发\n\n\\`\\`\\`bash\n${pm} install\n${pm} dev\n\\`\\`\\`\n\n${generateEnvironmentReadme()}\n\n\n${generateBuildDeploymentReadme(pm, `apps/${name}-serv`)}\n\n### 扩展建议\n\n- 在 \\`${name}-contract\\` 中维护应用级 contract,前后端共用同一份类型与路径定义。\n- 在 \\`${name}-serv\\` 中扩展 procedures、模块初始化与配置。\n- 需要 IAM / storage / ai 时,优先复用 \\`@h-ai/api-contract\\` 与 \\`@h-ai/serv/features/*\\`。\n\n${generateAiDevelopmentReadme()}### 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [@h-ai/serv](./.agents/skills/hai-serv/SKILL.md)\n- [@h-ai/api-contract](./.agents/skills/hai-api-contract/SKILL.md)\n- [@h-ai/api-client](./.agents/skills/hai-api-client/SKILL.md)\n\n## 开发测试\n\n\\`\\`\\`bash\n${pm} typecheck\n${pm} lint\n${pm} build\n${pm} test\n${pm} test:e2e\n\\`\\`\\`\n\n## 许可证\n\nApache-2.0\n`\n}\n\nfunction generateFullstackReadme(name: string, pm: string, frontends: FrontendTarget[], hasFeedback: boolean): string {\n const enabledFrontends = frontends.map(target => FRONTEND_TARGETS[target].name).join(' / ')\n return `# ${name}\n\n## 简介\n\n前后端分离工程,API 与 Web、移动端、桌面端共享接口类型和管理界面,可按实际业务调整。\n\n## 核心功能清单\n\n- API 服务、共享界面与按需生成的客户端。\n- 用户管理、角色、审计和个人设置示例。\n- 登录、主题、语言、新手引导和帮助中心。\n- API/Web 独立 Dockerfile 与镜像归档。\n\n## 使用入门\n\n### 工程结构\n\n- \\`packages/${name}-contract\\`:前后端共享 API 契约、Zod Schema 与类型\n- \\`packages/${name}-serv\\`:后端 API Service(通过 \\`@h-ai/serv\\` 暴露最小 HTTP App 抽象,不直接暴露 Hono)\n- \\`packages/${name}-shared\\`:跨端共享 Shell、主题、语言切换、API client 与共享 messages\n- \\`apps/${name}-web\\`:Web 前端${frontends.includes('web') ? '' : '(未启用)'}\n- \\`apps/${name}-app\\`:移动端 App/H5 前端${frontends.includes('app') ? '' : '(未启用)'}\n- \\`apps/${name}-desktop\\`:桌面端前端${frontends.includes('desktop') ? '' : '(未启用)'}\n- \\`apps/${name}-miniapp\\`:小程序预留说明与本端 inlang messages${frontends.includes('miniapp') ? '(占位,不参与构建)' : '(未启用)'}\n\n已启用前端:${enabledFrontends || 'Web / App / Desktop'}\n\n### 页面布局与路由\n\nWeb/App/Desktop 共享 AppShell 的 header/footer。新增页面放 shared/src/lib/pages/**/*.svelte,由 HashRouter 自动发现并按需加载;菜单只维护入口。地址使用 #/页面路径,支持刷新、查询串与浏览器前进后退;API 权限仍由服务端校验。\n\n### 默认管理功能\n\n以下描述可运行示例的初始业务,可按实际需求调整或移除,并同步代码、数据、鉴权、界面、测试和文档。\n\n默认启用 IAM、reldb、cache、audit、storage、scheduler 和 crypto${hasFeedback ? '、feedback 和 Reach' : ''}。示例将职责分为 admin(账号和角色管理)、audit_admin(审计查询、统计与备份)、config_admin(公开业务公告配置)、business_operator(业务处理)及 user(个人自助)。服务端限制跨职责授权和账号接管,系统管理员可配置基础成员;角色名称及业务权限由应用维护,可按项目需求调整,不写死为 IAM 规则。密码修改后全部会话失效,需要重新登录。\n\n${hasFeedback ? '普通成员和业务操作员可从顶部“问题反馈”提交说明、截图与日志;只有 business_operator 显示反馈管理菜单并能查看、处理、撤销和导出问题包。服务端继续按可信身份与应用范围授权。开发通知使用 Console,生产须在 _feedback.yml 与 _reach.yml 配置收件人和真实邮件。' : ''}\n\nCLI 在根目录 .env.dev、.env.test、.env.prod 中为 admin、audit_admin、config_admin、business_operator 分别生成独立随机强密码,对应 HAI_ADMIN_DEFAULT_PASSWORD、HAI_AUDIT_ADMIN_PASSWORD、HAI_CONFIG_ADMIN_PASSWORD、HAI_BUSINESS_OPERATOR_PASSWORD。同一环境的配置随项目提交供克隆后共享;被忽略的 .env.local 或同名进程环境可覆盖。已有账号不改密、不重新分配职责;未配置密码的独立职责账号不创建。密码须符合 _iam.yml 策略;启动失败保留模块、配置字段、错误码和端口占用诊断。\n\n\\`_iam.yml\\` 可按业务启用账号闲置扫描、密码复杂度/期限、ALTCHA 挑战、失败窗口锁定、一次性邀请、首次改密、敏感操作再认证、登录时间/IP 和会话期限/并发策略。敏感操作清单使用服务端操作标识;界面通过短期单次票据完成再认证。\\`session.endOnPageHide\\` 默认关闭,开启时页面离开尝试撤销,但浏览器通知仅最佳努力,需配合服务端闲置/绝对期限。\\`_audit.yml\\` 配置保留保护、私有备份及 Reach 告警;手动备份失败复用同一编号重试,回执含 key/记录数/SHA-256,不公开下载。归档不是原子数据库快照,严格恢复须暂停写入/清理或使用原生备份,在独立环境核验恢复。\n\n安全策略的配置位置、默认开关、逐项启用步骤及使用影响见[配置化安全使用指南](docs/security-configuration.md)。\n\n本地开发默认 \\`PUBLIC_API_BASE=http://127.0.0.1:3000\\`,Vite 使用同源代理;部署时改为实际公网 API Origin,Android 模拟器访问宿主机时使用 \\`http://10.0.2.2:3000\\`。不要将密钥放入任何 \\`PUBLIC_\\` 或 \\`VITE_\\` 变量。\n\n服务端版本化传输密钥环在创建时分别写入 \\`.env.dev\\`、\\`.env.test\\`、\\`.env.prod\\`,变量为 \\`HAI_CRYPTO_TRANSPORT_SERVERKEYRING\\`,各环境密钥不同;运行时不生成密钥。同一环境的所有节点使用同一 ring 和共享 registry,也可通过进程环境或 Secret Manager 覆盖。私钥不进入 PUBLIC_/VITE_、日志或浏览器。\n\n所有业务 JSON 请求和响应默认通过 \\`@h-ai/crypto\\` transport 双向加密(含登录、刷新、头像上传);前端统一使用共享 typed API client。Web 访问令牌仅存内存、刷新令牌由 HttpOnly Cookie 保存;受信原生端使用平台安全存储或内存。头像为随机路径只读图片资源,支持 PNG/JPEG/WebP,最大 512 KiB。健康检查和只读头像图片可直接访问。\n\n应用显示名称、版本、环境、默认语言和日志设置来自后端 \\`config/_core.yml\\`,前端通过 \\`app.info\\` 获取安全元信息。开发默认 SQLite、本地存储与内存缓存;生产启动拒绝这些本地 Provider,必须将所有节点连接到同一共享数据库、Redis 与 S3。传输必须在所有节点注入相同受管版本化密钥环与共享 registry,无需会话粘性;重启读取原 ring,轮换先分发新旧版本再切 activeKeyId。生产需显式配置允许的 CORS Origin。业务提交后的审计写入采用最大努力,失败记录结构化错误日志,保留已完成业务的原始结果。\n\n### 配置扩展\n\n服务端 \\`packages/${name}-serv/config/\\` 始终保留 core、serv、db、cache、iam、storage、audit、reach、ai、vecdb、payment、scheduler、feedback 共 13 份 YAML;构建部署配置统一位于项目根 hai.json。已用模块保留工作默认值,未启用模块整份注释,可选字段和替代 Provider 按块注释;根 \\`.env.example\\` 也保留未启用模块的凭据示例。Reach 默认为开发控制台通知,feedback 使用 email 别名;生产按 \\`_reach.yml\\` 注释替换为 SMTP、短信或 API Provider,并保持名称唯一。\n\n自动生成的 \\`.env\\` 包含已启用模块的环境参数;YAML 显式引用相同变量并保留本地回退。编辑环境参数优先修改对应 \\`.env\\`;未启用模块仍保留注释。\n\n扩展时先在服务端 workspace 安装需要的包,在 \\`src/server/runtime.ts\\` 按模块公开 Schema 校验配置、初始化并反序关闭,再接入 contract/procedure 和界面。整份注释文件先去掉一层外层注释,可选块继续按需开启;配置文件存在不代表业务功能已接入。\\`crypto.init()\\` 无配置参数,datapipe 为纯函数,不生成虚构 YAML。\n\n环境变量只覆盖 YAML 已有路径,注释键须先启用,或用 \\`HAI_DB\\` / \\`HAI_CACHE\\` 等整体对象覆盖。camelCase 不拆词,例如 \\`connectTimeout\\` 对应 \\`HAI_CACHE_CONNECTTIMEOUT\\`。修改配置后重启服务;语言列表在各前端/shared 的 \\`project.inlang/settings.json\\` 中同步。\\`**/data/\\` 忽略任意层级的数据目录及 \\`.gitkeep\\`,运行数据不入 Git,运行时自动创建目录。\n\n${generateEnvironmentReadme()}\n\n### 开发与构建\n\n\\`\\`\\`bash\n${pm} install\n${pm} dev\n${pm} typecheck\n${pm} build\n${pm} test\n${pm} test:e2e\n${frontends.includes('desktop') ? `${pm} build --target desktop --platform windows # Windows 主机;Linux/macOS 在对应主机构建` : ''}\n\\`\\`\\`\n\nTauri 需要目标系统的 Rust target、SDK 和打包工具。测试产生的临时工程、截图、报告、容器、镜像与进程应在 finally/teardown 中自动清理,失败也执行。\n\n${generateBuildDeploymentReadme(pm, `packages/${name}-serv`)}\n\n### i18n 与 shared 协同\n\n- shared:\\`packages/${name}-shared/project.inlang\\` + \\`messages/\\`,只放跨端共享组件文案。\n- web/app/desktop:每个应用都有自己的 \\`project.inlang\\` + \\`messages/\\`,用于本端页面与产品文案。\n- miniapp:当前是占位,但也有自己的 \\`project.inlang\\` + \\`messages/\\`,便于后续接入真实小程序框架。\n- 新增 locale 时,shared 与所有启用前端的 \\`locales\\` 必须同步;语言切换器会同时更新 shared runtime 与宿主应用 runtime。\n- \\`${pm} i18n:compile\\` 会统一编译 shared 与每个启用前端的 Paraglide 输出;各前端也可单独运行 \\`${pm} --filter ${name}-web paraglide:compile\\` 等命令。\n\n### 自定义建议\n\n- 改全局 Shell/主题/语言切换:编辑 \\`packages/${name}-shared\\`。\n- 改某个前端页面和文案:编辑共享 \\`packages/${name}-shared/src/lib/pages\\`、本端入口与 \\`apps/${name}-*/messages\\`。\n- 改主题列表:调整脚手架配置中的 \\`fullstack.theme.themes\\`,或直接编辑各端 \\`src/app.css\\` 的 daisyUI \\`themes\\`。\n\n\n${generateAiDevelopmentReadme()}### 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [@h-ai/serv](./.agents/skills/hai-serv/SKILL.md)\n- [@h-ai/ui](./.agents/skills/hai-ui/SKILL.md)\n\n## 开发测试\n\n\\`\\`\\`bash\n${pm} typecheck\n${pm} lint\n${pm} build\n${pm} test\n${pm} test:e2e\n\\`\\`\\`\n\n## 许可证\n\nApache-2.0\n`\n}\n\n/**\n * 打印完成提示\n */\nfunction printCompletionMessage(options: Required<CreateProjectOptions> & { features: FeatureId[] }): void {\n writeCliMessage('')\n writeCliMessage(chalk.green(cliM('cli_createSuccess')))\n writeCliMessage('')\n\n // 功能摘要\n if (options.features.length > 0) {\n writeCliMessage(chalk.bold(cliM('cli_createFeatures')))\n for (const featureId of options.features) {\n const feature = FEATURES[featureId]\n if (feature) {\n writeCliMessage(chalk.gray(` • ${feature.name} (${featureId})`))\n }\n }\n writeCliMessage('')\n }\n\n writeCliMessage(cliM('cli_nextSteps'))\n writeCliMessage(chalk.cyan(` cd ${options.name}`))\n if (options.appType === 'fullstack')\n writeCliMessage(chalk.cyan(cliM('cli_adminPasswordSaved')))\n if (!options.install) {\n writeCliMessage(chalk.cyan(` ${getInstallCommand(options.packageManager)}`))\n }\n if (options.appType === 'fullstack' || options.appType === 'api') {\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'dev')}`))\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'typecheck')}`))\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'test')}`))\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'test:e2e')}`))\n }\n else {\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'dev')}`))\n }\n writeCliMessage('')\n}\n\n// =============================================================================\n// 项目检测(供 init 命令使用)\n// =============================================================================\n\n/**\n * 检测项目信息\n * 缺少或无法解析 package.json 时返回 null;isHaiProject 仅表示依赖中含 @h-ai/*,不是业务配置验证。\n * @param cwd - 项目所在目录。\n * @returns 解析后的项目信息,文件缺失或解析失败时为 null。\n * @example 模块内部上下文\n * ```ts\n * const project = await detectProject(process.cwd())\n * if (project && project.isHaiProject) writeCliMessage(project.haiPackages.join(', '))\n * ```\n */\nexport async function detectProject(cwd: string): Promise<ProjectInfo | null> {\n const pkgPath = path.join(cwd, 'package.json')\n\n if (!(await fileExists(pkgPath))) {\n return null\n }\n\n try {\n const pkg = await fse.readJson(pkgPath)\n const deps = { ...pkg.dependencies, ...pkg.devDependencies }\n\n const haiPackages = Object.keys(deps).filter(name => name.startsWith('@h-ai/'))\n\n return {\n name: pkg.name,\n version: pkg.version,\n description: pkg.description,\n isHaiProject: haiPackages.length > 0,\n haiPackages,\n }\n }\n catch {\n return null\n }\n}\n","/** 项目工具配置的定位;运行时 YAML 配置仍由各服务目录管理。 */\nimport { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join, resolve } from 'node:path'\nimport { cliM } from '../cli-i18n.js'\n\n/**\n * 从服务目录向上查找最近的 hai.json;不存在时返回当前目录中的预期位置。\n * @param directory - 项目根或服务 workspace 目录。\n * @returns 工具配置文件的绝对路径。\n * @example 模块内部上下文\n * ```ts\n * const configPath = projectConfigPath('/workspace/shop/packages/shop-serv')\n * // 找到项目根 hai.json 后,CLI 仍在 shop-serv 扫描运行时配置。\n * ```\n */\nexport function projectConfigPath(directory: string): string {\n const start = resolve(directory)\n let current = start\n while (!existsSync(join(current, 'hai.json')) && dirname(current) !== current)\n current = dirname(current)\n return join(existsSync(join(current, 'hai.json')) ? current : start, 'hai.json')\n}\n\n/**\n * 严格读取项目工具配置,解析失败只报告路径,不输出可能包含凭据的 JSON 片段。\n * @param path - hai.json 文件的绝对路径。\n * @returns 项目根配置对象;各分区继续由消费者按实际 Schema 校验。\n * @throws Error - 文件不可读、JSON 无效或根节点不是对象。\n * @example 模块内部上下文\n * ```ts\n * const project = readProjectConfig(projectConfigPath('/workspace/shop'))\n * const deployment = project.deploy // 部署分区仍需校验并解析环境变量。\n * ```\n */\nexport function readProjectConfig(path: string): Record<string, unknown> {\n try {\n const config: unknown = JSON.parse(readFileSync(path, 'utf8'))\n if (config && typeof config === 'object' && !Array.isArray(config))\n return config as Record<string, unknown>\n }\n catch { /* 统一返回脱敏诊断,不能输出配置片段。 */ }\n throw new Error(cliM('cli_project_config_invalid', { params: { path } }))\n}\n","/**\n * @h-ai/cli — 模块增量添加命令\n *\n * 向现有 hai 项目增量启用模块。\n * @module cli-add\n */\n\nimport type { FeatureId, GlobalOptions } from '../cli-types.js'\nimport path from 'node:path'\nimport { parseEnv } from 'node:util'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { parse } from 'yaml'\nimport { cliM } from '../cli-i18n.js'\nimport { detectPackageManager, fileExists, getCliVersion, writeCliError, writeCliMessage, writeFile } from '../cli-utils.js'\nimport { generateConfigFile, generateProductionEnvironment } from './cli-config-templates.js'\nimport { detectProject } from './cli-create.js'\nimport { projectConfigPath, readProjectConfig } from './cli-project-config.js'\n\n/**\n * 为部署工具补齐根配置分区,保留已有构建配置和用户字段。\n * @param cwd - 当前项目或服务目录。\n * @returns 根配置已包含 deploy 分区。\n * @example 模块内部上下文\n * ```ts\n * await ensureDeployConfig('/workspace/shop/packages/shop-serv')\n * // 已有 hai.json.build 和 deploy 自定义项保持不变。\n * ```\n */\nasync function ensureDeployConfig(cwd: string): Promise<void> {\n const configPath = projectConfigPath(cwd)\n const project = await fileExists(configPath) ? readProjectConfig(configPath) : {}\n if (project.deploy === undefined) {\n project.deploy = parse(generateConfigFile('deploy'))\n await fse.writeJson(configPath, project, { spaces: 2 })\n }\n}\n\n/**\n * add 命令选项\n * 省略 module 时交互选择;install=false 只写项目依赖/配置与支持文件,不安装依赖。\n * @example 模块内部上下文\n * ```ts\n * const options: AddModuleOptions = { cwd: '/workspace/shop', module: 'ai', install: false }\n * ```\n */\nexport interface AddModuleOptions extends GlobalOptions {\n /** 要添加的模块 */\n module?: FeatureId\n /** 是否安装依赖 */\n install?: boolean\n}\n\n// 可添加的模块与对应包\nconst MODULE_MAP: Record<string, { packages: string[], deps?: string[], configKey?: string, description: string }> = {\n // iam 依赖 crypto(password hash)/ db(user 存储)/ cache(session 缓存)\n 'iam': { packages: ['@h-ai/iam'], deps: ['crypto', 'db', 'cache'], configKey: 'iam', get description() {\n return cliM('cli_featureIamName')\n } },\n // 'db' 和 'reldb' 都映射到 @h-ai/reldb,兼容用户习惯(hai add db 和 hai add reldb 均可)\n 'db': { packages: ['@h-ai/reldb'], configKey: 'db', get description() {\n return cliM('cli_featureDbName')\n } },\n 'reldb': { packages: ['@h-ai/reldb'], configKey: 'db', get description() {\n return cliM('cli_featureDbName')\n } },\n 'cache': { packages: ['@h-ai/cache'], configKey: 'cache', get description() {\n return cliM('cli_featureCacheName')\n } },\n 'ai': { packages: ['@h-ai/ai'], deps: ['db', 'vecdb'], configKey: 'ai', get description() {\n return cliM('cli_featureAiName')\n } },\n 'storage': { packages: ['@h-ai/storage'], configKey: 'storage', get description() {\n return cliM('cli_featureStorageName')\n } },\n 'crypto': { packages: ['@h-ai/crypto'], deps: ['db'], get description() {\n return cliM('cli_featureCryptoName')\n } },\n 'kit': { packages: ['@h-ai/kit'], get description() {\n return cliM('cli_featureKitName')\n } },\n 'ui': { packages: ['@h-ai/ui'], get description() {\n return cliM('cli_featureUiName')\n } },\n 'deploy': { packages: ['@h-ai/deploy'], configKey: 'deploy', get description() {\n return cliM('cli_featureDeployName')\n } },\n 'vecdb': { packages: ['@h-ai/vecdb'], configKey: 'vecdb', get description() {\n return cliM('cli_featureVecdbName')\n } },\n 'datapipe': { packages: ['@h-ai/datapipe'], get description() {\n return cliM('cli_featureDatapipeName')\n } },\n 'reach': { packages: ['@h-ai/reach'], configKey: 'reach', get description() {\n return cliM('cli_featureReachName')\n } },\n 'feedback': { packages: ['@h-ai/feedback'], deps: ['crypto', 'db', 'cache', 'storage', 'iam'], configKey: 'feedback', get description() {\n return cliM('cli_featureFeedbackName')\n } },\n 'scheduler': { packages: ['@h-ai/scheduler'], deps: ['db'], configKey: 'scheduler', get description() {\n return cliM('cli_featureSchedulerName')\n } },\n 'audit': { packages: ['@h-ai/audit'], deps: ['db'], configKey: 'audit', get description() {\n return cliM('cli_featureAuditName')\n } },\n 'payment': { packages: ['@h-ai/payment'], configKey: 'payment', get description() {\n return cliM('cli_featurePaymentName')\n } },\n 'capacitor': { packages: ['@h-ai/capacitor'], get description() {\n return cliM('cli_featureCapacitorName')\n } },\n 'api-client': { packages: ['@h-ai/api-client'], get description() {\n return cliM('cli_featureApiClientName')\n } },\n}\n\n/**\n * 增量添加模块到现有项目\n * 写入失败与安装失败会抛出异常;未检测到项目、未知或已安装模块等分支打印诊断后返回。\n * @param options - 命令参数;对应命令的工作目录、非交互与可选功能。\n * @returns 依赖/配置与支持文件处理结束;部分诊断分支打印提示后直接返回。\n * @example 模块内部上下文\n * ```ts\n * // 前提:当前目录是要修改的现有 hai 项目。\n * await addModule({ cwd: process.cwd(), module: 'ai', install: false })\n * // 然后自行安装依赖,并在应用启动链路初始化新增模块;此命令不修改业务启动代码。\n * ```\n */\nexport async function addModule(options: AddModuleOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? '.'\n\n try {\n // 检测项目\n const project = await detectProject(cwd)\n if (!project) {\n writeCliError(chalk.red(cliM('cli_projectNotFound')))\n return\n }\n\n // 交互式选择模块\n let moduleName = options.module\n if (!moduleName) {\n // 过滤已安装的模块\n const installed = new Set(project.haiPackages)\n const choices = Object.entries(MODULE_MAP)\n .filter(([, def]) => !def.packages.every(p => installed.has(p)))\n .map(([key, def]) => ({\n title: `${chalk.bold(key.padEnd(10))} ${chalk.gray(def.description)}`,\n value: key,\n }))\n\n if (choices.length === 0) {\n writeCliMessage(chalk.green(cliM('cli_addAllInstalled')))\n return\n }\n\n const { selected } = await prompts({\n type: 'select',\n hint: cliM('cli_selectHint'),\n name: 'selected',\n message: cliM('cli_addModulePrompt'),\n choices,\n })\n\n if (!selected)\n return\n moduleName = selected as FeatureId\n }\n\n const moduleDef = MODULE_MAP[moduleName]\n if (!moduleDef) {\n writeCliError(chalk.red(cliM('cli_addUnknownModule', { params: { module: moduleName } })))\n writeCliMessage(cliM('cli_addAvailableModules', { params: { modules: Object.keys(MODULE_MAP).join(', ') } }))\n return\n }\n\n const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates.js')\n\n // 检查是否已安装\n if (moduleDef.packages.every(p => project.haiPackages.includes(p))) {\n if (moduleName === 'deploy')\n await ensureDeployConfig(cwd)\n const generatedFiles = await generateProjectAiSupport(\n cwd,\n resolveSkillNamesForPackages(project.haiPackages),\n {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n },\n )\n if (generatedFiles.length > 0) {\n writeCliMessage(chalk.yellow(cliM('cli_addSupportCompleted', { params: { module: moduleName } })))\n for (const generatedFile of generatedFiles) {\n writeCliMessage(chalk.gray(cliM('cli_addSupportFile', { params: { file: generatedFile } })))\n }\n }\n else {\n writeCliMessage(chalk.yellow(cliM('cli_addAlreadyInstalled', { params: { module: moduleName } })))\n }\n return\n }\n\n // 收集所有需要安装的包(含依赖模块)\n const allPackages = new Set(moduleDef.packages)\n if (moduleDef.deps) {\n for (const dep of moduleDef.deps) {\n const depDef = MODULE_MAP[dep]\n if (depDef) {\n for (const pkg of depDef.packages) {\n allPackages.add(pkg)\n }\n }\n }\n }\n\n // 更新 package.json\n spinner.start(cliM('cli_addUpdateManifest'))\n const pkgPath = path.join(cwd, 'package.json')\n const pkg = await fse.readJson(pkgPath)\n if (!pkg.dependencies)\n pkg.dependencies = {}\n\n const existingHaiSpecifier = Object.entries(pkg.dependencies as Record<string, string>)\n .find(([pkgName]) => pkgName.startsWith('@h-ai/'))?.[1]\n\n // 已存在的 @h-ai/* 依赖若使用 catalog:,新增模块保持一致;否则固定当前 CLI 对应版本。\n const depVersion = existingHaiSpecifier === 'catalog:' ? 'catalog:' : getCliVersion()\n\n for (const pkgName of allPackages) {\n if (pkgName === '@h-ai/deploy') {\n pkg.devDependencies ??= {}\n pkg.devDependencies[pkgName] ??= depVersion\n }\n else if (!pkg.dependencies[pkgName]) {\n pkg.dependencies[pkgName] = depVersion\n }\n }\n await fse.writeJson(pkgPath, pkg, { spaces: 2 })\n spinner.succeed()\n\n // 生成配置文件\n if (moduleDef.configKey === 'deploy') {\n await ensureDeployConfig(cwd)\n }\n else if (moduleDef.configKey) {\n const configDir = path.join(cwd, 'config')\n const configPath = path.join(configDir, `_${moduleDef.configKey}.yml`)\n if (!(await fileExists(configPath))) {\n spinner.start(cliM('cli_addConfig', { params: { config: moduleDef.configKey } }))\n const content = generateConfigFile(moduleDef.configKey)\n await writeFile(configPath, content)\n spinner.succeed()\n }\n else {\n writeCliMessage(chalk.gray(cliM('cli_addConfigExists', { params: { config: moduleDef.configKey } })))\n }\n }\n\n // 生成依赖模块的配置文件\n if (moduleDef.deps) {\n for (const dep of moduleDef.deps) {\n const depDef = MODULE_MAP[dep]\n if (depDef?.configKey) {\n const depConfigPath = path.join(cwd, 'config', `_${depDef.configKey}.yml`)\n if (!(await fileExists(depConfigPath))) {\n const content = generateConfigFile(depDef.configKey)\n await writeFile(depConfigPath, content)\n writeCliMessage(chalk.gray(cliM('cli_addDependencyConfig', { params: { config: depDef.configKey } })))\n }\n }\n }\n }\n\n const skillPackages = [...project.haiPackages, ...allPackages]\n const generatedFiles = await generateProjectAiSupport(\n cwd,\n resolveSkillNamesForPackages(skillPackages),\n {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n },\n )\n if (generatedFiles.length > 0) {\n for (const generatedFile of generatedFiles) {\n writeCliMessage(chalk.gray(cliM('cli_addSupportFile', { params: { file: generatedFile } })))\n }\n }\n\n // 安装依赖\n const productionPath = path.join(cwd, '.env.prod')\n const previousProduction = await fileExists(productionPath) ? await fse.readFile(productionPath, 'utf8') : ''\n const configured = new Set([...previousProduction.matchAll(/^([A-Z][A-Z0-9_]*)=/gm)].map(match => match[1]))\n const previousValues = parseEnv(previousProduction)\n const production = generateProductionEnvironment([moduleName, ...(moduleDef.deps ?? [])] as FeatureId[], previousValues.HAI_DB_TYPE === 'mysql' ? { db: { type: 'mysql', database: previousValues.HAI_DB_DATABASE } } : undefined)\n .split('\\n')\n .filter(line => !/^[A-Z][A-Z0-9_]*=/.test(line) || !configured.has(line.split('=')[0]))\n await writeFile(productionPath, `${previousProduction.trimEnd()}\\n\\n${production.join('\\n')}`)\n\n const doInstall = options.install !== false\n if (doInstall) {\n spinner.start(cliM('cli_addInstall'))\n const { execSync } = await import('node:child_process')\n const pm = await detectPackageManager(cwd)\n execSync(`${pm} install`, { cwd, stdio: 'ignore' })\n spinner.succeed()\n }\n\n writeCliMessage('')\n writeCliMessage(chalk.green(cliM('cli_addSuccess', { params: { module: moduleName } })))\n writeCliMessage('')\n writeCliMessage(cliM('cli_addPackages'))\n for (const pkg of allPackages) {\n writeCliMessage(chalk.cyan(` ${pkg}`))\n }\n writeCliMessage('')\n }\n catch (error) {\n spinner.fail()\n writeCliError(chalk.red(cliM('cli_addFailed')), { error })\n throw error\n }\n}\n","/** Capacitor 同步与真正原生产物打包分开;只接受受控工程内路径。 */\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'\nimport { isAbsolute, join, relative, resolve } from 'node:path'\nimport process from 'node:process'\nimport { cliM } from '../cli-i18n.js'\n\n/**\n * 原生打包前检查工程和平台,结束后检查本次产物;工具链错误由真实构建命令返回。\n * @example 模块内部上下文\n * ```ts\n * async function build(run: (args: string[], cwd: string) => Promise<void>) {\n * return buildMobileApp('/project', ['apps/shop-app'], 'android', run)\n * }\n * ```\n */\nexport async function buildMobileApp(root: string, directories: readonly string[], platform: 'android' | 'ios', run: (args: string[], cwd: string) => Promise<void>): Promise<string[]> {\n if (!directories.length || (platform === 'ios' && process.platform !== 'darwin'))\n throw new Error(cliM('cli_build_app_platform'))\n const outputs: string[] = []\n for (const item of directories) {\n const directory = resolve(root, item)\n const rel = relative(root, directory)\n // 独立手机工程可直接使用根目录;跨盘绝对路径和父目录仍不能越过工程边界。\n if (isAbsolute(rel) || rel.startsWith('..') || !existsSync(join(directory, platform)) || !existsSync(join(directory, 'capacitor.config.ts')))\n throw new Error(cliM('cli_build_app_missing', { params: { platform } }))\n const before = Date.now()\n await run(['run', 'build'], directory)\n await run(['exec', 'cap', 'sync', platform], directory)\n // sync 后核验最终写入原生工程的配置,禁止开发热更新地址进入制品。\n const nativeConfig = platform === 'android' ? join(directory, 'android/app/src/main/assets/capacitor.config.json') : join(directory, 'ios/App/App/capacitor.config.json')\n const config: { server?: { url?: unknown } } = JSON.parse(readFileSync(nativeConfig, 'utf8'))\n if (config.server?.url)\n throw new Error(cliM('cli_build_app_reload'))\n await run(['exec', 'cap', 'build', platform, ...(platform === 'android' ? ['--androidreleasetype', 'APK'] : [])], directory)\n const artifactRoot = platform === 'android' ? join(directory, 'android/app/build/outputs/apk') : join(directory, 'ios/App/output')\n function visit(path: string): void {\n if (!existsSync(path))\n return\n for (const entry of readdirSync(path, { withFileTypes: true })) {\n const file = join(path, entry.name)\n if (entry.isDirectory()) {\n visit(file)\n }\n else if (entry.isFile() && file.endsWith(platform === 'android' ? '.apk' : '.ipa')) {\n const info = statSync(file)\n if (info.size > 4 && info.mtimeMs >= before - 1000 && readFileSync(file).subarray(0, 2).toString() === 'PK')\n outputs.push(file)\n }\n }\n }\n const count = outputs.length\n visit(artifactRoot)\n if (outputs.length === count)\n throw new Error(cliM('cli_build_app_artifact'))\n }\n return outputs\n}\n","/** `pnpm build` 的环境无关构建入口:源码、OCI 镜像或 Tauri 安装包。 */\nimport type { DeploymentArtifact } from '@h-ai/deploy'\nimport type { GlobalOptions } from '../cli-types.js'\nimport { execFileSync, spawn } from 'node:child_process'\nimport { createHash, randomBytes, randomUUID } from 'node:crypto'\nimport { appendFileSync, copyFileSync, createReadStream, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport process from 'node:process'\nimport { normalizeProjectName } from '@h-ai/deploy'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliMessage } from '../cli-utils.js'\nimport { buildMobileApp } from './cli-build-app.js'\nimport { projectConfigPath, readProjectConfig } from './cli-project-config.js'\n\n/**\n * 构建参数,不接受部署环境。\n * 对应 hai build --target image --images serv,web --runtime podman --no-http-proxy;镜像参数仅用于 image。\n * @example 模块内部上下文\n * ```ts\n * const options: BuildCommandOptions = { cwd: '/workspace/shop', target: 'image', images: 'serv,web', runtime: 'podman', httpProxy: false }\n * ```\n */\nexport interface BuildCommandOptions extends GlobalOptions {\n /** compile 编译源码,image 导出 serv/web 镜像,app 调用 Capacitor,desktop 调用 Tauri。 */\n target?: 'compile' | 'image' | 'desktop' | 'app'\n /** 逗号分隔的应用镜像名;省略时构建全部。 */\n images?: string\n /** 并行镜像任务数,默认 2;内存受限时设为 1。 */\n concurrency?: number\n /** auto 优先使用可达的 Podman。 */\n runtime?: 'auto' | 'podman' | 'docker'\n /** 容器构建网络,默认采用引擎设置;例如 rootless Podman 的 pasta。 */\n network?: string\n /** 原生目标平台;desktop 须与主机一致,iOS 须使用 macOS,Android 须具备对应 SDK。 */\n platform?: 'windows' | 'linux' | 'macos' | 'android' | 'ios'\n /** Rust 目标架构,默认当前主机架构。 */\n arch?: 'x64' | 'arm64'\n /** 可信 SQLite 预编译包根地址,不包含凭据。 */\n sqlitePrebuildMirror?: string\n /** Podman 是否继承代理。 */\n httpProxy?: boolean\n}\n\n/**\n * 项目构建描述;serv/web 共用 buildId,app/desktop 单独生成原生安装包。\n * 从 hai.json 的 build 分区读取;镜像名称为 serv/web,构建命令还会校验唯一性与路径边界。\n * @example 模块内部上下文\n * ```ts\n * const config: BuildConfig = { images: [{ name: 'serv', context: '.', dockerfile: 'images/serv.Dockerfile', containerPort: 3000 }], desktop: ['apps/shop-desktop'] }\n * ```\n */\ninterface BuildConfig {\n images?: Array<{ name: 'serv' | 'web', context?: string, dockerfile: string, containerPort?: number }>\n desktop?: string[]\n app?: string[]\n}\n\n/** 子进程不经过 shell;pnpm 使用当前原生或 JS 入口,兼容 Windows 路径。 */\nasync function run(command: string, args: string[], cwd: string, quiet = false, identity?: { buildId: string, commit: string }, compileEnvironment?: Record<string, string>): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const env = Object.fromEntries(Object.entries(process.env).filter(([key]) => !/^(?:HAI_|PUBLIC_|VITE_)/.test(key)))\n Object.assign(env, compileEnvironment)\n // 仅显式加入本次构建器生成的身份,不透传调用者的同名环境变量。\n if (identity) {\n env.HAI_BUILD_ID = identity.buildId\n env.HAI_BUILD_COMMIT = identity.commit\n }\n env.NODE_ENV = 'production'\n delete env.CAPACITOR_SERVER_URL\n // Tauri 的 CI 参数只接受 true/false,兼容 CI 平台常用的 1/0 写法。\n if (env.CI === '1' || env.CI === '0')\n env.CI = env.CI === '1' ? 'true' : 'false'\n const child = spawn(command, args, { cwd, env, windowsHide: true, stdio: quiet ? 'ignore' : 'inherit', shell: false })\n child.once('error', reject)\n child.once('exit', code => code === 0 ? resolve() : reject(new Error(cliM('cli_build_failed', { params: { command, code: String(code) } }))))\n })\n}\n\n/** 使用已安装的 pnpm,不通过 Corepack 下载另一套工具链。 */\nasync function pnpm(args: string[], cwd: string, identity: { buildId: string, commit: string }, compileEnvironment?: Record<string, string>): Promise<void> {\n const entry = process.env.npm_execpath\n if (entry && /(?:^|[/\\\\])pnpm(?:-native)?(?:\\.exe|\\.[cm]?js)?$/i.test(entry))\n return /\\.[cm]?js$/i.test(entry) ? run(process.execPath, [entry, ...args], cwd, false, identity, compileEnvironment) : run(entry, args, cwd, false, identity, compileEnvironment)\n // CLI 直接调用时从 PATH 定位原生或 JS 入口;Windows 的 .cmd 不能由无 shell spawn 执行。\n if (process.platform === 'win32') {\n const directories = (process.env.PATH ?? '').split(';')\n for (const directory of directories) {\n const executable = join(directory, 'pnpm.exe')\n if (existsSync(executable))\n return run(executable, args, cwd, false, identity, compileEnvironment)\n for (const relative of ['node_modules/pnpm/bin/pnpm.cjs', 'pnpm.cjs']) {\n const candidate = join(directory, relative)\n if (existsSync(candidate))\n return run(process.execPath, [candidate, ...args], cwd, false, identity, compileEnvironment)\n }\n }\n throw new Error(cliM('cli_build_use_pnpm'))\n }\n return run('pnpm', args, cwd, false, identity, compileEnvironment)\n}\n\n/** 网站只放行显式公开的构建控制值;镜像只接收目录参数,原生目标保持隔离。 */\nfunction staticCompileEnvironment(target: string): Record<string, string> {\n const flag = process.env.HAI_BUILD_STATIC\n const base = process.env.PUBLIC_BASE_PATH\n if (flag !== undefined && flag !== '' && flag !== '0' && flag !== '1')\n throw new Error(cliM('cli_build_static_flag'))\n if (base && (!/^\\/[\\w.-]+(?:\\/[\\w.-]+)*$/.test(base) || base.split('/').some(segment => segment === '.' || segment === '..')))\n throw new Error(cliM('cli_build_static_base'))\n if (target !== 'compile') {\n if (flag === '1' || (base && target !== 'image'))\n throw new Error(cliM('cli_build_static_target'))\n return target === 'image' && base ? { PUBLIC_BASE_PATH: base } : {}\n }\n return { ...(flag ? { HAI_BUILD_STATIC: flag } : {}), ...(base ? { PUBLIC_BASE_PATH: base } : {}) }\n}\n\n/** 只有工程 manifest 受当前仓库管理时,才将其 HEAD 作为源码事实。 */\nfunction sourceCommit(cwd: string): string {\n try {\n const options = { cwd, encoding: 'utf8' as const, stdio: 'pipe' as const, windowsHide: true }\n const root = execFileSync('git', ['rev-parse', '--show-toplevel'], options).trim()\n const manifest = relative(root, join(cwd, 'package.json')).replaceAll('\\\\', '/')\n if (manifest.startsWith('../'))\n return 'unknown'\n execFileSync('git', ['ls-files', '--error-unmatch', '--', manifest], { ...options, cwd: root })\n const commit = execFileSync('git', ['rev-parse', 'HEAD'], options).trim()\n return /^(?:[a-f\\d]{40}|[a-f\\d]{64})$/i.test(commit) ? commit : 'unknown'\n }\n catch {\n return 'unknown'\n }\n}\n\n/**\n * 构建已有项目;镜像清单仅在全部镜像导出成功后发布。\n * compile 调用项目 compile 脚本;docker 发布完整产物清单后才更新 latest;desktop 仅允许当前主机对应平台。\n * @throws Error - 参数、构建配置、运行时探测或子进程执行失败。\n * @param options - 命令参数;对应命令的工作目录、非交互与可选功能。\n * @returns 所选目标构建完成;失败时抛出异常。\n * @example 模块内部上下文\n * ```ts\n * // 前提:当前项目已有 compile 脚本及已安装依赖。\n * await buildCommand({ cwd: process.cwd(), target: 'compile' })\n * // 等价命令:hai build --target compile;失败抛出异常。\n * ```\n */\nexport async function buildCommand(options: BuildCommandOptions): Promise<void> {\n const directory = resolve(options.cwd ?? process.cwd())\n const target = options.target ?? 'compile'\n const concurrency = Number(options.concurrency ?? 2)\n if (![1, 2].includes(concurrency))\n throw new Error(cliM('cli_build_concurrency_invalid'))\n const cwd = target === 'compile' ? directory : dirname(projectConfigPath(directory))\n if (!['compile', 'image', 'desktop', 'app'].includes(target))\n throw new Error(cliM('cli_build_target_invalid'))\n const compileEnvironment = staticCompileEnvironment(target)\n if ((target !== 'image' && (options.images !== undefined || options.concurrency !== undefined || options.runtime !== undefined || options.network !== undefined || options.sqlitePrebuildMirror !== undefined || options.httpProxy === false))\n || (!['desktop', 'app'].includes(target) && (options.platform !== undefined || options.arch !== undefined)) || (target === 'app' && options.arch !== undefined)) {\n throw new Error(cliM('cli_build_options_invalid'))\n }\n if (target === 'compile') {\n await pnpm(['run', 'compile'], cwd, { buildId: randomUUID(), commit: sourceCommit(cwd) }, compileEnvironment)\n return\n }\n const metadata: { name?: unknown, version?: unknown } = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8'))\n // 版本同时进入文件名和镜像标签;拒绝路径字符,保留预发布和构建元数据。\n const appVersion = metadata.version\n if (typeof appVersion !== 'string' || appVersion.length > 80 || !/^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9a-z-]+(?:\\.[0-9a-z-]+)*)?(?:\\+[0-9a-z-]+(?:\\.[0-9a-z-]+)*)?$/i.test(appVersion))\n throw new Error(cliM('cli_build_version_invalid'))\n const project = readProjectConfig(join(cwd, 'hai.json'))\n const config = (project.build ?? {}) as BuildConfig\n if (target === 'app') {\n if (!['android', 'ios'].includes(options.platform ?? ''))\n throw new Error(cliM('cli_build_app_platform'))\n const identity = { buildId: randomUUID(), commit: sourceCommit(cwd) }\n const files = await buildMobileApp(cwd, config.app ?? [], options.platform as 'android' | 'ios', (args, directory) => pnpm(args, directory, identity))\n for (const file of files) writeCliMessage(file)\n return\n }\n if (target === 'desktop') {\n const platforms = { win32: 'windows', linux: 'linux', darwin: 'macos' } as const\n const host = platforms[process.platform as keyof typeof platforms]\n const platform = options.platform ?? host\n const arch = options.arch ?? process.arch\n if (!platform || platform !== host || !['x64', 'arm64'].includes(arch))\n throw new Error(cliM('cli_build_native_host'))\n if (!config.desktop?.length)\n throw new Error(cliM('cli_build_desktop_missing'))\n const rustTarget = `${arch === 'x64' ? 'x86_64' : 'aarch64'}-${platform === 'windows' ? 'pc-windows-msvc' : platform === 'macos' ? 'apple-darwin' : 'unknown-linux-gnu'}`\n const bundles = platform === 'windows' ? 'nsis' : platform === 'macos' ? 'app,dmg' : 'deb,appimage'\n const identity = { buildId: randomUUID(), commit: sourceCommit(cwd) }\n for (const directory of config.desktop)\n await pnpm(['exec', 'tauri', 'build', '--target', rustTarget, '--bundles', bundles, '--config', JSON.stringify({ version: appVersion })], resolve(cwd, directory), identity)\n writeCliMessage(cliM('cli_build_native_ready', { params: { target: rustTarget } }))\n return\n }\n if (typeof metadata.name !== 'string' || !metadata.name.trim())\n throw new Error(cliM('cli_build_project_name_required'))\n const projectName = normalizeProjectName(metadata.name)\n if (!Array.isArray(config.images) || !config.images.length || config.images.some(image => !image || typeof image !== 'object') || config.images.length > 2 || new Set(config.images.map(image => image.name)).size !== config.images.length\n || config.images.some(image => !['serv', 'web'].includes(image.name) || typeof image.dockerfile !== 'string' || !image.dockerfile || 'target' in image || (image.containerPort !== undefined && (!Number.isInteger(image.containerPort) || image.containerPort < 1 || image.containerPort > 65535)))) {\n throw new Error(cliM('cli_build_images_missing'))\n }\n const selected = options.images?.split(',').map(name => name.trim())\n if (selected && (selected.some(name => !config.images!.some(image => image.name === name)) || new Set(selected).size !== selected.length))\n throw new Error(cliM('cli_build_selection_invalid'))\n const images = config.images.filter(image => !selected || selected.includes(image.name))\n const webBasePath = compileEnvironment.PUBLIC_BASE_PATH\n if (webBasePath && !config.images.some(image => image.name === 'web'))\n throw new Error(cliM('cli_build_base_requires_web'))\n for (const image of images) {\n if (!existsSync(resolve(cwd, image.dockerfile)))\n throw new Error(cliM('cli_build_dockerfile_missing', { params: { path: image.dockerfile } }))\n }\n const candidates = options.runtime && options.runtime !== 'auto' ? [options.runtime] : ['podman', 'docker']\n if (candidates.some(runtime => !['podman', 'docker'].includes(runtime)))\n throw new Error(cliM('cli_build_runtime_missing'))\n let runtime: string | undefined\n for (const candidate of candidates) {\n try {\n await run(candidate, ['version'], cwd, true)\n runtime = candidate\n break\n }\n catch { /* 尝试下一个可达的引擎。 */ }\n }\n if (!runtime)\n throw new Error(cliM('cli_build_runtime_missing'))\n if (options.sqlitePrebuildMirror) {\n const url = new URL(options.sqlitePrebuildMirror)\n if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password || url.search || url.hash)\n throw new Error(cliM('cli_build_mirror_invalid'))\n }\n const buildId = `${appVersion}-${Date.now()}-${randomBytes(3).toString('hex')}`\n const commit = sourceCommit(cwd)\n const artifact: DeploymentArtifact = { version: 4, primaryService: config.images.some(image => image.name === 'serv') ? 'serv' : 'web', appVersion, buildId, partial: images.length !== config.images.length, hasWeb: config.images.some(image => image.name === 'web'), images: [] }\n if (webBasePath) {\n artifact.version = 5\n artifact.webBasePath = webBasePath\n }\n // 部分构建仍保留工程显式声明的端口,不用构建默认值覆盖部署配置。\n for (const image of config.images) {\n if (image.containerPort !== undefined)\n artifact[image.name === 'serv' ? 'servContainerPort' : 'webContainerPort'] = image.containerPort\n }\n const parent = join(cwd, '.hai/build/docker')\n mkdirSync(parent, { recursive: true })\n const staging = mkdtempSync(join(parent, '.building-'))\n const built: string[] = []\n try {\n for (const context of new Set(images.map(image => resolve(cwd, image.context ?? '.'))))\n prepareDependencyInputs(context)\n const buildImage = async (image: (typeof images)[number]): Promise<DeploymentArtifact['images'][number]> => {\n if (!['serv', 'web'].includes(image.name))\n throw new Error(cliM('cli_build_images_missing'))\n const context = resolve(cwd, image.context ?? '.')\n const imageRef = `localhost/hai-${projectName}-${image.name}:${buildId.toLowerCase().replaceAll('+', '_')}`\n const args = ['build', '-f', resolve(cwd, image.dockerfile), '-t', imageRef]\n // 仅仓库 Vitest 托管构建使用这对内部变量;正常构建保留缓存与镜像。\n const testRun = process.env.HAI_TEST_IMAGE_RUN\n const testLedger = process.env.HAI_TEST_IMAGE_LEDGER\n if (testLedger && /^[a-f0-9-]{36}$/.test(testRun ?? '')) {\n const label = `org.h-ai.test.image-run=${testRun}`\n args.push('--label', label)\n if (runtime === 'podman')\n args.push('--layer-label', label)\n // 启动前写入明确的构建 tag;构建失败的中间层也在 teardown 按本轮 owner 回收。\n appendFileSync(testLedger, `${JSON.stringify({ runtime, imageRef })}\\n`)\n }\n args.push('--build-arg', `HAI_BUILD_ID=${buildId}`, '--build-arg', `HAI_BUILD_COMMIT=${commit}`)\n if (options.network !== undefined)\n args.push('--network', options.network)\n const ignore = `${resolve(cwd, image.dockerfile)}.dockerignore`\n if (runtime === 'podman' && existsSync(ignore))\n args.push('--ignorefile', ignore)\n if (runtime === 'podman') {\n args.push('--format', 'docker', '--jobs', '1', ...(options.httpProxy === false ? ['--http-proxy=false'] : []))\n // Windows/macOS 的远程 Podman 默认读取服务端代理;显式传递预定义构建参数。\n if (options.httpProxy !== false) {\n for (const key of ['HTTP_PROXY', 'HTTPS_PROXY', 'FTP_PROXY', 'NO_PROXY', 'http_proxy', 'https_proxy', 'ftp_proxy', 'no_proxy']) {\n if (process.env[key])\n args.push('--build-arg', `${key}=${process.env[key]}`)\n }\n }\n }\n if (options.sqlitePrebuildMirror)\n args.push('--build-arg', `SQLITE_PREBUILD_MIRROR=${options.sqlitePrebuildMirror}`)\n if (image.name === 'web' && compileEnvironment.PUBLIC_BASE_PATH)\n args.push('--build-arg', `PUBLIC_BASE_PATH=${compileEnvironment.PUBLIC_BASE_PATH}`)\n built.push(imageRef)\n await run(runtime, [...args, context], cwd)\n const file = `${image.name}-${appVersion}.tar`\n await run(runtime, ['save', ...(runtime === 'podman' ? ['--format', 'docker-archive'] : []), '-o', join(staging, file), imageRef], cwd)\n const hash = createHash('sha256')\n for await (const chunk of createReadStream(join(staging, file)))\n hash.update(chunk)\n return { name: image.name, file, imageRef, sha256: hash.digest('hex'), ...(image.containerPort ? { containerPort: image.containerPort } : {}) }\n }\n for (let offset = 0; offset < images.length; offset += concurrency) {\n // 等待同批任务全部退出后再处理失败,避免清理仍在写入的归档或镜像。\n const results = await Promise.allSettled(images.slice(offset, offset + concurrency).map(buildImage))\n for (const result of results) {\n if (result.status === 'rejected')\n throw result.reason\n artifact.images.push(result.value)\n }\n }\n // 不覆盖以前成功的构建;manifest 是一次完整构建的提交点。\n const output = join(parent, buildId)\n // 文件名固定于 manifest 同层;通过构建 ID 子目录中的清单消费,latest 仅存相对路径。\n writeFileSync(join(staging, 'manifest.json'), `${JSON.stringify(artifact, null, 2)}\\n`)\n renameSync(staging, output)\n writeFileSync(join(parent, `latest-${buildId}`), `${buildId}\\n`)\n renameSync(join(parent, `latest-${buildId}`), join(parent, 'latest'))\n writeCliMessage(cliM('cli_build_ready', { params: { path: output, runtime } }))\n }\n catch (error) {\n for (const imageRef of built) {\n try {\n await run(runtime, ['image', 'rm', imageRef], cwd, true)\n }\n catch { /* 构建失败不掩盖原始错误。 */ }\n }\n throw error\n }\n finally {\n rmSync(staging, { recursive: true, force: true })\n }\n}\n\n/** 生成稳定的依赖上下文;包配置、补丁和本地归档改变才使下载层失效。 */\nfunction prepareDependencyInputs(cwd: string): void {\n const destination = join(cwd, 'images', 'dependencies')\n mkdirSync(destination, { recursive: true })\n const tracking = join(destination, '.managed.json')\n const previous: string[] = existsSync(tracking) ? JSON.parse(readFileSync(tracking, 'utf8')) : []\n const files: string[] = []\n const walk = (directory: string): void => {\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n const source = join(directory, entry.name)\n if (source === destination || ['node_modules', '.git', '.hai', '.turbo', '.svelte-kit', '.pnpm-store', '.cache', 'dist', 'build', 'data', 'tmp', 'test-results', 'playwright-report'].includes(entry.name))\n continue\n if (entry.isDirectory()) {\n walk(source)\n continue\n }\n if (!entry.isFile() || !(entry.name === 'package.json' || entry.name === '.pnpmfile.cjs' || /\\.(?:tgz|patch)$/.test(entry.name)))\n continue\n const file = relative(cwd, source)\n mkdirSync(dirname(join(destination, file)), { recursive: true })\n const target = join(destination, file)\n if (!existsSync(target) || !readFileSync(source).equals(readFileSync(target)))\n copyFileSync(source, target)\n files.push(file)\n }\n }\n walk(cwd)\n for (const file of previous) {\n const target = resolve(destination, file)\n if (!files.includes(file) && !relative(destination, target).startsWith('..'))\n rmSync(target, { force: true })\n }\n const content = `${JSON.stringify(files)}\\n`\n if (!existsSync(tracking) || readFileSync(tracking, 'utf8') !== content)\n writeFileSync(tracking, content)\n}\n","/** 服务器本机执行的旧凭据预检/导入入口;不连接默认 SSH 目标。 */\nimport { createRequire } from 'node:module'\nimport { resolve } from 'node:path'\nimport process from 'node:process'\nimport { pathToFileURL } from 'node:url'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliMessage } from '../cli-utils.js'\n\n/**\n * 默认为只读验证;只有显式 apply 才保存目标服务器的凭据状态。\n * @example 模块内部上下文\n * ```ts\n * await deploySecretsCommand('/opt/hai/apps/shop-test', { import: '/private/shop-import.json', runtime: 'docker' })\n * ```\n */\nexport async function deploySecretsCommand(directory: string, options: { import?: string, apply?: boolean, runtime?: string, cwd?: string }): Promise<void> {\n if (!options.import || !['docker', 'podman'].includes(options.runtime ?? 'docker'))\n throw new Error(cliM('cli_deploy_secrets_options'))\n const cwd = resolve(options.cwd ?? process.cwd())\n const local = createRequire(resolve(cwd, 'package.json'))\n let module: typeof import('@h-ai/deploy')\n try {\n module = await import(pathToFileURL(local.resolve('@h-ai/deploy')).href)\n }\n catch {\n throw new Error(cliM('cli_deploy_module_missing'))\n }\n const result = await module.importDeploymentSecrets({ directory: resolve(cwd, directory), inputFile: resolve(cwd, options.import), runtime: options.runtime === 'podman' ? 'podman' : 'docker', dryRun: options.apply !== true })\n if (!result.success) {\n const context = result.error.ext\n throw new Error(`${result.error.message}\\n${JSON.stringify({ phase: context?.phase, state: context?.state })}`)\n }\n writeCliMessage(JSON.stringify(result.data, null, 2))\n}\n","/**\n * @h-ai/reldb — 数据库配置 Schema\n *\n * 本文件定义数据库模块的配置结构,使用 Zod 进行运行时校验。\n * @module reldb-config\n */\n\nimport { z } from 'zod'\n// ─── 数据库配置 Schema ───\n\n/**\n * 数据库类型枚举\n *\n * 支持的数据库类型:\n * - `sqlite` - SQLite 嵌入式数据库(使用 better-sqlite3)\n * - `postgresql` - PostgreSQL 数据库(使用 pg)\n * - `mysql` - MySQL 数据库(使用 mysql2)\n * @example\n * ```ts\n * import { ReldbTypeSchema } from '@h-ai/reldb/schemas'\n *\n * const value = ReldbTypeSchema.parse('postgresql')\n * void value\n * ```\n */\nexport const ReldbTypeSchema = z.enum(['sqlite', 'postgresql', 'mysql'])\n\n/**\n * 数据库类型\n * @example\n * ```ts\n * import type { DbType } from '@h-ai/reldb/schemas'\n *\n * const value: DbType = 'postgresql'\n * void value\n * ```\n */\nexport type DbType = z.infer<typeof ReldbTypeSchema>\n\n/**\n * ReldbOperationLogConfigSchema 的数据约束与操作契约。\n * @example\n * ```ts\n * import { ReldbOperationLogConfigSchema } from '@h-ai/reldb/schemas'\n *\n * const value = ReldbOperationLogConfigSchema.parse({ read: false, write: true, maxLength: 100, level: 'debug' })\n * void value\n * ```\n */\nexport const ReldbOperationLogConfigSchema = z.object({\n read: z.boolean().default(false),\n write: z.boolean().default(false),\n /** 安全数量摘要的最大字符数;0 表示省略摘要,永不记录 SQL 原文或参数值。 */\n maxLength: z.number().int().min(0).default(1000),\n level: z.enum(['info', 'debug', 'trace']).default('debug'),\n})\n\n/**\n * ReldbOperationLogConfig 的数据约束与操作契约。\n * @example\n * ```ts\n * import { ReldbOperationLogConfigSchema, type ReldbOperationLogConfig } from '@h-ai/reldb/schemas'\n *\n * const value: ReldbOperationLogConfig = ReldbOperationLogConfigSchema.parse({ read: false, write: true, maxLength: 100, level: 'debug' })\n * void value\n * ```\n */\nexport type ReldbOperationLogConfig = z.infer<typeof ReldbOperationLogConfigSchema>\n\nconst OperationLogConfigFieldSchema = {\n operationLog: ReldbOperationLogConfigSchema.optional(),\n}\n\n/**\n * PostgreSQL 连接池配置 Schema\n *\n * min 是已建立连接的保留下限,不主动预建连接。\n * MySQL 使用独立的 MysqlPoolConfigSchema;SQLite 不使用连接池。\n * @example\n * ```ts\n * import { PoolConfigSchema } from '@h-ai/reldb/schemas'\n *\n * const value = PoolConfigSchema.parse({ max: 10, acquireTimeout: 5000 })\n * void value\n * ```\n */\nexport const PoolConfigSchema = z.object({\n /** PostgreSQL 已建立连接的最小保留数(默认 1,不主动预建) */\n min: z.number().int().min(0).default(1),\n /** 最大连接数(默认 10) */\n max: z.number().int().min(1).default(10),\n /** PostgreSQL 空闲连接超时,毫秒(默认 30000;0 禁用) */\n idleTimeout: z.number().int().min(0).default(30000),\n /** 获取连接超时,毫秒(默认10000);PostgreSQL >=0,0禁用;MySQL排队+建连总期限为1–2147483647 */\n acquireTimeout: z.number().int().min(0).default(10000),\n})\n\n/**\n * PostgreSQL 连接池配置类型。\n * @example\n * ```ts\n * import { PoolConfigSchema, type PoolConfig } from '@h-ai/reldb/schemas'\n *\n * const value: PoolConfig = PoolConfigSchema.parse({ max: 10, acquireTimeout: 5000 })\n * void value\n * ```\n */\nexport type PoolConfig = z.infer<typeof PoolConfigSchema>\n\n/**\n * MySQL 连接池配置:有界 FIFO 等待,拒绝没有可靠驱动语义的 min/idleTimeout。\n *\n * acquireTimeout 覆盖排队和建立连接,不是 SQL 执行时限。驱动建连也使用此值作为 connectTimeout。\n * 空闲连接由 mysql2/服务端管理;本模块不承诺最小保留数或可配置的空闲回收期限。\n * @example\n * ```ts\n * import { MysqlPoolConfigSchema } from '@h-ai/reldb/schemas'\n *\n * const value = MysqlPoolConfigSchema.parse({ max: 10, acquireTimeout: 5000, queueLimit: 100 })\n * void value\n * ```\n */\nexport const MysqlPoolConfigSchema = z.object({\n /** 最大连接数(默认 10) */\n max: z.number().int().min(1).default(10),\n /** 获取连接超时,毫秒(默认10000);PostgreSQL >=0,0禁用;MySQL排队+建连总期限为1–2147483647 */\n acquireTimeout: z.number().int().min(1).max(2147483647).default(10000),\n /** MySQL 等待队列最大请求数(默认 1000;正整数,不支持无限队列) */\n queueLimit: z.number().int().min(1).default(1000),\n}).strict()\n\n/**\n * MySQL 解析后的连接池配置。\n * @example\n * ```ts\n * import { MysqlPoolConfigSchema, type MysqlPoolConfig } from '@h-ai/reldb/schemas'\n *\n * const value: MysqlPoolConfig = MysqlPoolConfigSchema.parse({ max: 10, acquireTimeout: 5000, queueLimit: 100 })\n * void value\n * ```\n */\nexport type MysqlPoolConfig = z.infer<typeof MysqlPoolConfigSchema>\n\n/**\n * PostgreSQL SSL 配置 Schema\n *\n * 支持多种配置方式:\n * - `true/false` - 简单开关\n * - `'require'/'prefer'/'allow'/'disable'` - SSL 模式\n * - 自定义对象 - 详细 SSL 配置\n * @example\n * ```ts\n * import { SslConfigSchema } from '@h-ai/reldb/schemas'\n *\n * const value = SslConfigSchema.parse({ rejectUnauthorized: true })\n * void value\n * ```\n */\nexport const SslConfigSchema = z.union([\n z.boolean(),\n z.enum(['require', 'prefer', 'allow', 'disable']),\n z.record(z.string(), z.unknown()),\n])\n\n/**\n * PostgreSQL SSL 配置类型\n * @example\n * ```ts\n * import { SslConfigSchema, type SslConfig } from '@h-ai/reldb/schemas'\n *\n * const value: SslConfig = SslConfigSchema.parse({ rejectUnauthorized: true })\n * void value\n * ```\n */\nexport type SslConfig = z.infer<typeof SslConfigSchema>\n\n/**\n * MySQL TLS 配置;空对象默认校验证书链和 DNS 主机身份,只接收明确支持的 PEM 字段。\n *\n * cert/key 必须成对。verifyIdentity 在当前驱动仅支持 DNS 主机,不能宣称验证 IP 身份。\n * 显式关闭验证会记录风险日志;本模块不提供任意 TLS 参数或回调透传。\n * @example\n * ```ts\n * import { MysqlSslConfigSchema } from '@h-ai/reldb/schemas'\n *\n * const value = MysqlSslConfigSchema.parse({ rejectUnauthorized: true, verifyIdentity: true })\n * void value\n * ```\n */\nexport const MysqlSslConfigSchema = z.union([\n z.literal(false),\n z.object({\n /** MySQL 是否校验证书链(默认 true);false 明确放弃服务端认证 */\n rejectUnauthorized: z.boolean().default(true),\n /** MySQL 是否验证 DNS 主机身份(默认 true);仅证书链验证开启时有效 */\n verifyIdentity: z.boolean().default(true),\n /** MySQL 信任的 CA,PEM 内容;省略时使用 Node 信任库 */\n ca: z.string().min(1).optional(),\n /** MySQL 客户端证书,PEM 内容;必须同时提供 key */\n cert: z.string().min(1).optional(),\n /** MySQL 客户端私钥,PEM 内容;必须同时提供 cert */\n key: z.string().min(1).optional(),\n }).strict().refine(ssl => Boolean(ssl.cert) === Boolean(ssl.key), { path: ['key'] }),\n])\n\n/**\n * SQLite 特定选项 Schema\n * @example\n * ```ts\n * import { SqliteOptionsSchema } from '@h-ai/reldb/schemas'\n *\n * const value = SqliteOptionsSchema.parse({ walMode: true, executor: 'worker' })\n * void value\n * ```\n */\nexport const SqliteOptionsSchema = z.object({\n /** 是否启用 WAL 模式(默认 true),可提高并发读写性能 */\n walMode: z.boolean().default(true),\n /** 是否只读模式(默认 false) */\n readonly: z.boolean().default(false),\n /**\n * 执行方式(默认 sync)。\n *\n * - `sync`:主线程直接执行 better-sqlite3(同步阻塞主线程事件循环)。\n * - `worker`:在专用 worker 线程持有唯一连接执行,把阻塞移出主线程。\n * 注意 WAL 只改善数据库锁并发,无法避免 better-sqlite3 同步调用占用调用线程。\n */\n executor: z.enum(['sync', 'worker']).default('sync'),\n /** worker 执行方式下等待连接打开的超时(毫秒,默认 10000) */\n workerConnectTimeoutMs: z.number().int().positive().default(10_000),\n})\n\n/**\n * MySQL 特定选项 Schema\n * @example\n * ```ts\n * import { MysqlOptionsSchema } from '@h-ai/reldb/schemas'\n *\n * const value = MysqlOptionsSchema.parse({ charset: 'utf8mb4' })\n * void value\n * ```\n */\nexport const MysqlOptionsSchema = z.object({\n /** 字符集(默认 utf8mb4),推荐使用 utf8mb4 支持完整 Unicode */\n charset: z.string().default('utf8mb4'),\n}).strict()\n\n// ─── 网络数据库共享字段 ───\n\nconst NetworkConfigSchema = z.object({\n /**\n * 连接字符串(可选)\n * 如果提供 url,将优先使用,忽略 host/port 等字段\n */\n url: z.string().optional(),\n\n /** 数据库主机地址(默认 localhost) */\n host: z.string().default('localhost'),\n\n /**\n * 数据库端口\n * - PostgreSQL 默认 5432\n * - MySQL 默认 3306\n */\n port: z.number().int().min(1).max(65535).optional(),\n\n /** 数据库名称 */\n database: z.string(),\n\n /** 数据库用户名 */\n user: z.string().optional(),\n\n /** 数据库密码 */\n password: z.string().optional(),\n\n /** SSL/TLS 连接配置 */\n ssl: SslConfigSchema.optional(),\n\n /** 连接池配置 */\n pool: PoolConfigSchema.optional(),\n})\n\n// ─── 各数据库类型配置 Schema ───\n\n/**\n * SQLite 配置 Schema\n * @example\n * ```ts\n * import { SqliteConfigSchema } from '@h-ai/reldb/schemas'\n *\n * const value = SqliteConfigSchema.parse({ type: 'sqlite', database: './data/app.db' })\n * void value\n * ```\n */\nexport const SqliteConfigSchema = z.object({\n type: z.literal('sqlite'),\n /** 数据库文件路径(如 './data.db')或 ':memory:'(内存数据库) */\n database: z.string(),\n /** SQLite 特定选项 */\n sqlite: SqliteOptionsSchema.optional(),\n ...OperationLogConfigFieldSchema,\n})\n\n/**\n * PostgreSQL 配置 Schema\n * @example\n * ```ts\n * import { PostgresqlConfigSchema } from '@h-ai/reldb/schemas'\n *\n * const value = PostgresqlConfigSchema.parse({ type: 'postgresql', database: 'app', host: 'db', pool: { max: 10 } })\n * void value\n * ```\n */\nexport const PostgresqlConfigSchema = NetworkConfigSchema.extend({\n type: z.literal('postgresql'),\n ...OperationLogConfigFieldSchema,\n})\n\n/**\n * MySQL 配置 Schema\n * @example\n * ```ts\n * import { MysqlConfigSchema } from '@h-ai/reldb/schemas'\n *\n * const value = MysqlConfigSchema.parse({ type: 'mysql', database: 'app', host: 'db', pool: { max: 10, queueLimit: 100 } })\n * void value\n * ```\n */\nexport const MysqlConfigSchema = NetworkConfigSchema.extend({\n type: z.literal('mysql'),\n /** 网络数据库URL;MySQL空串表示使用分字段,非空仅mysql://且拒绝query/fragment,优先于host/port/database/user/password */\n url: z.union([z.literal('').transform(() => undefined), z.url({ protocol: /^mysql$/ }).refine(value => !value.includes('?') && !value.includes('#'))]).optional(),\n /** 数据库:SQLite文件路径或:memory:;PostgreSQL必填名称;MySQL无URL时必填,URL模式从URL读取 */\n database: z.string().min(1).optional(),\n /** TLS:PostgreSQL使用其模式;MySQL仅false或严格对象,空对象默认校验证书链和DNS身份 */\n ssl: MysqlSslConfigSchema.optional(),\n /** 连接池配置:PostgreSQL支持min/idleTimeout;MySQL仅max/acquireTimeout/queueLimit,拒绝其他字段 */\n pool: MysqlPoolConfigSchema.optional(),\n /** MySQL 特定选项 */\n mysql: MysqlOptionsSchema.optional(),\n ...OperationLogConfigFieldSchema,\n}).refine(config => Boolean(config.url) || Boolean(config.database), { path: ['database'] })\n\n/**\n * 统一数据库配置 Schema(判别联合体)\n *\n * 根据 `type` 字段区分不同数据库类型的配置。\n * @example\n * ```ts\n * import { ReldbConfigSchema } from '@h-ai/reldb/schemas'\n *\n * const value = ReldbConfigSchema.parse({ type: 'postgresql', database: 'app', host: 'db' })\n * void value\n * ```\n */\nexport const ReldbConfigSchema = z.discriminatedUnion('type', [\n SqliteConfigSchema,\n PostgresqlConfigSchema,\n MysqlConfigSchema,\n])\n\n/**\n * 数据库配置类型(判别联合体)\n * @example\n * ```ts\n * import { ReldbConfigSchema, type ReldbConfig } from '@h-ai/reldb/schemas'\n *\n * const value: ReldbConfig = ReldbConfigSchema.parse({ type: 'postgresql', database: 'app', host: 'db' })\n * void value\n * ```\n */\nexport type ReldbConfig = z.infer<typeof ReldbConfigSchema>\n\n/**\n * SQLite 配置类型\n * @example\n * ```ts\n * import { SqliteConfigSchema, type SqliteConfig } from '@h-ai/reldb/schemas'\n *\n * const value: SqliteConfig = SqliteConfigSchema.parse({ type: 'sqlite', database: './data/app.db' })\n * void value\n * ```\n */\nexport type SqliteConfig = z.infer<typeof SqliteConfigSchema>\n\n/**\n * PostgreSQL 配置类型\n * @example\n * ```ts\n * import { PostgresqlConfigSchema, type PostgresqlConfig } from '@h-ai/reldb/schemas'\n *\n * const value: PostgresqlConfig = PostgresqlConfigSchema.parse({ type: 'postgresql', database: 'app', host: 'db', pool: { max: 10 } })\n * void value\n * ```\n */\nexport type PostgresqlConfig = z.infer<typeof PostgresqlConfigSchema>\n\n/**\n * MySQL 配置类型\n * @example\n * ```ts\n * import { MysqlConfigSchema, type MysqlConfig } from '@h-ai/reldb/schemas'\n *\n * const value: MysqlConfig = MysqlConfigSchema.parse({ type: 'mysql', database: 'app', host: 'db', pool: { max: 10, queueLimit: 100 } })\n * void value\n * ```\n */\nexport type MysqlConfig = z.infer<typeof MysqlConfigSchema>\n\n/**\n * 数据库配置输入类型(用于 init 等入口)\n *\n * 说明:Zod 的 default 会让输入端字段可省略,但输出端字段为必填。\n * 因此对外 API(如 reldb.init)更适合接收 ReldbConfigInput。\n * @example\n * ```ts\n * import type { ReldbConfigInput } from '@h-ai/reldb/schemas'\n *\n * const value: ReldbConfigInput = { type: 'postgresql', host: 'db', database: 'app' }\n * void value\n * ```\n */\nexport type ReldbConfigInput = z.input<typeof ReldbConfigSchema>\n","/** 部署向导:逐项配置实际依赖的中间件,不以文件存在代替有效连接配置。 */\nimport type { DeploymentEnvironment, MiddlewareBackend, MiddlewareField, MiddlewareMode, MiddlewareRequirement, ScanResult } from '@h-ai/deploy'\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { MysqlSslConfigSchema, ReldbConfigSchema, SslConfigSchema } from '@h-ai/reldb/schemas'\nimport prompts from 'prompts'\nimport { parseDocument } from 'yaml'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliMessage } from '../cli-utils.js'\nimport { moduleEnvironmentVariables } from './cli-config-environment.js'\nimport { projectConfigPath, readProjectConfig } from './cli-project-config.js'\n\n/**\n * 部署包的真实运行时命名空间类型,仅供向导依赖注入,不重新仿造部署 API。\n * @example 模块内部上下文\n * ```ts\n * const module: DeployModule = await import('@h-ai/deploy')\n * const backends = module.DEPLOY_MIDDLEWARE.db\n * ```\n */\ntype DeployModule = typeof import('@h-ai/deploy')\n\n/** 凭据输入字段,名称与 deploy 公开配置 Schema 相同。 */\nconst CLOUD_FIELDS: Record<string, string[]> = {\n 'neon': ['apiKey'],\n 'upstash': ['email', 'apiKey'],\n 'cloudflare-r2': ['accountId', 'apiToken', 'accessKeyId', 'secretAccessKey'],\n 'resend': ['apiKey', 'from'],\n 'aliyun': ['accessKeyId', 'accessKeySecret', 'signName'],\n}\n\n/** 解析目标环境显式声明的配置,仅用于判断是否允许跳过。 */\nfunction targetConfig(requirement: MiddlewareRequirement, environment: DeploymentEnvironment): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n const parent = environment.targetValues[requirement.envPrefix]\n if (parent) {\n try {\n Object.assign(result, JSON.parse(parent))\n }\n catch { return {} }\n }\n for (const [key, value] of Object.entries(environment.targetValues)) {\n if (key.startsWith(`${requirement.envPrefix}_`))\n result[key.slice(requirement.envPrefix.length + 1).toLowerCase()] = value\n }\n return result\n}\n\n/**\n * 只有目标文件显式声明了当前后端及必要连接项,才允许保持不变。\n * 凭据仍可来自 .env.local/进程;其他环境的配置不能让此选项出现。\n * @param requirement - 扫描出的实际中间件需求。\n * @param backend - 部署目录中选定的后端。\n * @param environment - 已合并变量与目标文件显式值的环境快照。\n * @returns 仅当目标文件明确声明后端与必要连接项时为 true。\n * @example 模块内部上下文\n * ```ts\n * const module = await import('@h-ai/deploy')\n * const requirement: MiddlewareRequirement = { service: 'db', backend: 'postgresql', source: '@h-ai/reldb', configName: 'db', configPath: [], envPrefix: 'HAI_DB', config: { host: 'db', port: 5432, database: 'shop' } }\n * const environment: DeploymentEnvironment = { environment: 'prod', envDir: '/workspace/shop', values: {}, targetValues: { HAI_DB_TYPE: 'postgresql', HAI_DB_HOST: 'db', HAI_DB_PORT: '5432', HAI_DB_DATABASE: 'shop' } }\n * const backend = module.DEPLOY_MIDDLEWARE.db.find(item => item.backend === 'postgresql')\n * if (backend) {\n * const keep = canKeepMiddleware(requirement, backend, environment)\n * }\n * ```\n */\nexport function canKeepMiddleware(requirement: MiddlewareRequirement, backend: MiddlewareBackend, environment: DeploymentEnvironment): boolean {\n const target = targetConfig(requirement, environment)\n if (requirement.service === 'ldap' && backend.backend === 'disabled')\n return environment.targetValues.HAI_IAM_LOGIN_LDAP === 'false'\n if (requirement.service === 'ldap') {\n if (!Object.keys(target).length)\n return false\n }\n else if (target.type !== backend.backend) {\n return false\n }\n return backend.fields.filter(field => field.required && !field.secret).every((field) => {\n if ((target.url || (requirement.config.url && Object.keys(target).length)) && ['host', 'port'].includes(field.name))\n return true\n return (target[field.name] !== undefined && target[field.name] !== '') || (target[field.name.toLowerCase()] !== undefined && target[field.name.toLowerCase()] !== '')\n }) && backend.fields.filter(field => field.required && field.secret).every(field => Boolean(requirement.config[field.name] || environment.values[`${requirement.envPrefix}_${field.name.toUpperCase()}`]))\n}\n\n/** 用户取消与缺少非交互输入都必须停止,禁止使用未回答的隐含默认值。 */\nasync function ask(question: prompts.PromptObject): Promise<unknown> {\n const answer = await prompts({ ...question, name: 'value' })\n if (answer.value === undefined)\n throw new Error(cliM('cli_deploy_cancelled'))\n return answer.value\n}\n\n/** 校验连接字段;数据库 TLS 复用所选后端的真实公开 Schema。 */\nfunction validateField(value: string, field: MiddlewareField, backend: string): boolean | string {\n if (value === '')\n return field.required ? cliM('cli_deploy_required') : true\n if (field.kind === 'port')\n return (/^\\d+$/.test(value) && Number(value) >= 1 && Number(value) <= 65535) || cliM('cli_deploy_invalid_value')\n if (field.kind === 'number')\n return (/^\\d+$/.test(value) && Number(value) >= (field.minimum ?? 0) && Number(value) <= (field.maximum ?? Number.MAX_SAFE_INTEGER)) || cliM('cli_deploy_invalid_value')\n if (field.kind === 'boolean')\n return ['true', 'false'].includes(value) || cliM('cli_deploy_invalid_value')\n if (field.kind === 'url') {\n try {\n return Boolean(new URL(value).protocol)\n }\n catch { return cliM('cli_deploy_invalid_value') }\n }\n if (field.name === 'ssl') {\n const parsed = parseDocument(value)\n const schema = backend === 'mysql' ? MysqlSslConfigSchema : SslConfigSchema\n return (parsed.errors.length === 0 && schema.safeParse(parsed.toJS()).success) || cliM('cli_deploy_invalid_value')\n }\n if (field.name === 'headers') {\n try {\n const headers: unknown = JSON.parse(value)\n return (headers !== null && typeof headers === 'object' && !Array.isArray(headers) && Object.values(headers).every(item => typeof item === 'string')) || cliM('cli_deploy_invalid_value')\n }\n catch {\n return cliM('cli_deploy_invalid_value')\n }\n }\n if (field.name === 'method')\n return ['POST', 'PUT'].includes(value) || cliM('cli_deploy_invalid_value')\n return true\n}\n\n/** 连接配置的声明节点必须存在,约定变量才能覆盖原 YAML 未启用的可选功能。 */\nfunction ensureConfigNode(appDir: string, requirement: MiddlewareRequirement, backend: string): void {\n if (requirement.service === 'ldap' && backend === 'disabled')\n return\n const directory = join(appDir, 'config')\n mkdirSync(directory, { recursive: true })\n const path = join(directory, `_${requirement.configName}.yml`)\n const document = parseDocument(existsSync(path) ? readFileSync(path, 'utf8') : '{}\\n')\n if (document.errors.length)\n throw new Error(cliM('cli_deploy_invalid_value'))\n if (requirement.configPath.length && !document.hasIn(requirement.configPath))\n document.setIn(requirement.configPath, document.createNode(requirement.configName === 'reach' ? { name: requirement.config.name ?? requirement.service, type: backend } : {}))\n if (requirement.service === 'ldap') {\n if (!document.hasIn(['login']))\n document.set('login', document.createNode({}))\n if (!document.hasIn(['login', 'ldap']))\n document.setIn(['login', 'ldap'], `\\${HAI_IAM_LOGIN_LDAP:false}`)\n }\n const content = document.toString()\n if (!existsSync(path) || readFileSync(path, 'utf8') !== content)\n writeFileSync(path, content)\n}\n\n/** 保存单个连接对象;整体覆盖可避免旧 URL 或不兼容后端字段残留。 */\nfunction connectionEnv(requirement: MiddlewareRequirement, backend: string, config: Record<string, unknown>): Record<string, string> {\n if (requirement.service === 'ldap')\n return backend === 'disabled' ? { HAI_IAM_LOGIN_LDAP: 'false' } : { HAI_IAM_LOGIN_LDAP: 'true', [requirement.envPrefix]: JSON.stringify(config) }\n return { [requirement.envPrefix]: JSON.stringify({ ...config, type: backend }) }\n}\n\n/**\n * 逐项收集处理方式、后端和连接参数;返回值用于过滤云开通器和 Compose 服务。\n * 会持久化公共连接信息与私有凭据;yes 仅跳过已可确定的选择,缺少必要输入仍抛错。\n * @throws Error - 用户取消、必要非交互输入缺失、字段校验或配置持久化失败。\n * @param module - 实际加载的 @h-ai/deploy 运行时命名空间。\n * @param scan - 扫描得到的应用和中间件需求。\n * @param environment - 已合并变量与目标文件显式值的环境快照。\n * @param config - 正在补齐的部署配置对象。\n * @param yes - 非交互模式;不能绕过必需输入缺失。\n * @returns 每项中间件的最终处理模式。\n * @example 模块内部上下文\n * ```ts\n * const module: DeployModule = await import('@h-ai/deploy')\n * const result = await module.deploy.scan(process.cwd(), { environment: 'prod' })\n * if (!result.success) throw new Error(result.error.message)\n * const environment = module.loadDeploymentEnvironment({ environment: 'prod', envDir: process.cwd() })\n * if (!environment.success) throw new Error(environment.error.message)\n * const modes = await configureDeployMiddleware(module, result.data, environment.data, {}, true)\n * ```\n */\nexport async function configureDeployMiddleware(module: DeployModule, scan: ScanResult, environment: DeploymentEnvironment, config: Record<string, unknown>, yes = false): Promise<Partial<Record<string, MiddlewareMode>>> {\n const modes: Partial<Record<string, MiddlewareMode>> = {}\n const services: Record<string, unknown> = {}\n const existingServices = config.services && typeof config.services === 'object' ? config.services as Record<string, unknown> : {}\n const provider = config.provider as { type?: string } | undefined\n for (const requirement of scan.middlewares ?? []) {\n const choices = module.DEPLOY_MIDDLEWARE[requirement.service]\n const current = choices.find(item => item.backend === requirement.backend)\n if (!current)\n throw new Error(cliM('cli_deploy_cloud_unsupported', { params: { backend: requirement.backend } }))\n writeCliMessage(cliM('cli_deploy_middleware', { params: { service: requirement.service, backend: current.label, purpose: module.describeMiddlewareBackend(current), source: requirement.source } }))\n const canKeep = canKeepMiddleware(requirement, current, environment)\n const mode = yes\n ? canKeep ? 'keep' : 'default'\n : await ask({\n type: 'select',\n name: 'value',\n message: cliM('cli_deploy_action', { params: { service: requirement.service } }),\n choices: [\n { title: cliM('cli_deploy_default'), value: 'default' },\n { title: cliM('cli_deploy_custom'), value: 'custom' },\n ...(canKeep ? [{ title: cliM('cli_deploy_keep'), value: 'keep' }] : []),\n ],\n }) as MiddlewareMode\n modes[requirement.envPrefix] = mode\n // 同类服务可有多个 Provider;保留每项选择,聚合值仅用于选择云开通器。\n const previous = modes[requirement.service]\n modes[requirement.service] = previous === 'default' || mode === 'default' ? 'default' : previous === 'custom' || mode === 'custom' ? 'custom' : 'keep'\n if (mode === 'keep') {\n if (!canKeep)\n throw new Error(cliM('cli_deploy_missing_keep', { params: { service: requirement.service } }))\n continue\n }\n const backendName = yes ? current.backend : String(await ask({ type: 'select', name: 'value', message: cliM('cli_deploy_backend', { params: { service: requirement.service } }), initial: choices.indexOf(current), choices: choices.map(item => ({ title: `${item.label} — ${module.describeMiddlewareBackend(item)}`, value: item.backend })) }))\n const backend = choices.find(item => item.backend === backendName)\n if (!backend)\n throw new Error(cliM('cli_deploy_invalid_value'))\n requirement.backend = backendName\n const updates: Record<string, string> = {}\n if (mode === 'default' && backendName === 's3' && provider?.type === 'docker-ssh') {\n const container = config.container && typeof config.container === 'object' ? config.container as Record<string, unknown> : {}\n const currentEngine = container.s3Engine === 'minio' ? 'minio' : 'rustfs'\n const engine = yes ? currentEngine : String(await ask({ type: 'select', name: 'value', message: cliM('cli_deploy_s3_engine'), initial: currentEngine === 'rustfs' ? 0 : 1, choices: [{ title: 'RustFS', value: 'rustfs' }, { title: 'MinIO', value: 'minio' }] }))\n if (!['rustfs', 'minio'].includes(engine))\n throw new Error(cliM('cli_deploy_invalid_value'))\n config.container = { ...container, s3Engine: engine }\n updates.HAI_DEPLOY_CONTAINER_S3ENGINE = engine\n const deploymentFile = projectConfigPath(scan.appDir ?? environment.envDir)\n const project: { deploy?: { container?: Record<string, unknown> | null } } = readProjectConfig(deploymentFile)\n project.deploy ??= {}\n if (project.deploy.container != null && (typeof project.deploy.container !== 'object' || Array.isArray(project.deploy.container)))\n throw new Error(cliM('cli_deploy_config_node', { params: { path: deploymentFile, field: 'deploy.container' } }))\n project.deploy.container ??= {}\n if (!('s3Engine' in project.deploy.container)) {\n project.deploy.container.s3Engine = `\\${HAI_DEPLOY_CONTAINER_S3ENGINE:rustfs}`\n writeFileSync(deploymentFile, `${JSON.stringify(project, null, 2)}\\n`)\n }\n }\n if (mode === 'default' && provider?.type === 'vercel') {\n if (!backend.provisioner)\n throw new Error(cliM('cli_deploy_cloud_unsupported', { params: { backend: backend.label } }))\n const prior = existingServices[requirement.service]\n const priorConfig = prior && typeof prior === 'object' ? prior as Record<string, unknown> : {}\n const cloud: Record<string, string> = { provisioner: backend.provisioner }\n for (const name of CLOUD_FIELDS[backend.provisioner]) {\n const key = `HAI_DEPLOY_SERVICES_${requirement.service.toUpperCase()}_${name.toUpperCase()}`\n const initial = String(priorConfig[name] ?? environment.values[key] ?? '')\n const label = `${backend.label} — ${cliM(`cli_deploy_cloud_input_${name}` as Parameters<typeof cliM>[0])}`\n const value = yes ? initial : String(await ask({ type: /key|token|secret/i.test(name) ? 'password' : 'text', name: 'value', message: label, initial, validate: input => Boolean(input) || cliM('cli_deploy_required') }))\n if (!value)\n throw new Error(`${label}: ${cliM('cli_deploy_required')}`)\n cloud[name] = value\n updates[key] = value\n }\n services[requirement.service] = cloud\n }\n else {\n if (mode === 'default' && ['aliyun-sms', 'api'].includes(backendName))\n throw new Error(cliM('cli_deploy_cloud_unsupported', { params: { backend: backend.label } }))\n // 默认与自定义都从同后端的有效配置继续,不能用表单字段重建并丢失未展示选项。\n const connection: Record<string, unknown> = backendName === current.backend ? { ...requirement.config } : requirement.configName === 'reach' ? { name: requirement.config.name ?? requirement.service } : {}\n for (const field of backend.fields) {\n const previous = backendName === current.backend ? requirement.config[field.name] : undefined\n const initial = previous === undefined ? field.defaultValue ?? '' : typeof previous === 'object' ? JSON.stringify(previous) : String(previous)\n const variable = `${requirement.envPrefix}_${field.name.toUpperCase()}`\n const info = moduleEnvironmentVariables(requirement.configName).find(item => item.name === variable)\n const value = mode === 'custom' && !yes ? String(await ask({ type: field.secret ? 'password' : 'text', name: 'value', message: cliM('cli_deploy_field', { params: { description: info?.description ?? field.name, constraint: info?.constraint ?? field.kind ?? 'string' } }), initial, validate: input => validateField(String(input), field, backendName) })) : initial\n // TLS 交互返回值与非交互值保存前再次校验,不依赖 prompts UI 曾调用 validate。\n if (field.name === 'ssl' && validateField(value, field, backendName) !== true)\n throw new Error(cliM('cli_deploy_invalid_value'))\n // 默认的服务端凭据由 sidecar/云开通器生成,不要求用户填写。\n if (value !== '') {\n connection[field.name] = field.kind === 'number' || field.kind === 'port' ? Number(value) : field.kind === 'boolean' ? value === 'true' : field.name === 'headers' || field.name === 'ssl' ? parseDocument(value).toJS() : value\n }\n else {\n delete connection[field.name]\n }\n }\n if (requirement.service === 'db') {\n const validated = ReldbConfigSchema.safeParse({ ...connection, type: backendName })\n if (!validated.success)\n throw new Error(cliM('cli_deploy_config_invalid', { params: { path: join(scan.appDir ?? '.', 'config', '_db.yml'), fields: validated.error.issues.map(issue => issue.path.join('.')).join(', ') } }))\n }\n Object.assign(updates, connectionEnv(requirement, backendName, connection))\n }\n ensureConfigNode(scan.appDir ?? '.', requirement, backendName)\n const saved = module.saveDeploymentEnvironment(environment, updates)\n if (!saved.success)\n throw new Error(saved.error.message)\n writeCliMessage(cliM('cli_deploy_saved', { params: { service: requirement.service } }))\n }\n // 仅默认选项对应的云服务参与初始化/开通;custom/keep 不认证、不创建。\n config.services = Object.keys(services).length ? services : undefined\n return modes\n}\n","/**\n * @h-ai/cli — 部署命令\n *\n * 使用: hai deploy [appDir]\n * @module cli-deploy\n */\n\nimport type { DeploymentEnvironment } from '@h-ai/deploy'\nimport type { GlobalOptions } from '../cli-types.js'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { dirname, resolve } from 'node:path'\nimport process from 'node:process'\nimport { pathToFileURL } from 'node:url'\nimport { parseEnv } from 'node:util'\nimport { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliError, writeCliMessage } from '../cli-utils.js'\nimport { buildCommand } from './cli-build.js'\nimport { configureDeployMiddleware } from './cli-deploy-middleware.js'\nimport { projectConfigPath, readProjectConfig } from './cli-project-config.js'\n\n/**\n * deploy 命令选项\n * 构建与部署分离;bundleOnly 只打包,不表示服务已上线。SSH 中断后的远端状态需按部署 ID 与结果文件核对。\n * @example 模块内部上下文\n * ```ts\n * const options: DeployCommandOptions = { cwd: '/workspace/shop', appDir: 'packages/shop-serv', env: 'prod', yes: true, bundleOnly: true, output: '.hai/shop.tar' }\n * ```\n */\nexport interface DeployCommandOptions extends GlobalOptions {\n /** 只读检查,不初始化 Provider、不写配置、不构建、不连接目标。 */\n plan?: boolean\n /** 配合 plan,只读检查目标 current 与成功发布目录。 */\n inspectRemote?: boolean\n /** 部署环境;省略时必须交互输入。 */\n env?: string\n /** 环境文件目录,默认扫描应用/workspace 根。 */\n envDir?: string\n /** 非交互模式:保留完整的目标配置,其余采用当前后端默认配置。 */\n yes?: boolean\n /** 应用目录 */\n appDir?: string\n /** 已配置完备,跳过全部中间件处理并直接部署。 */\n skipMiddleware?: boolean\n /** 已构建镜像目录。 */\n artifactDir?: string\n /** 本次更新的服务,逗号分隔。 */\n services?: string\n /** 先构建镜像。 */\n build?: boolean\n /** 同时构建的应用镜像数,默认 2。 */\n concurrency?: number\n /** 本地容器引擎。 */\n runtime?: 'auto' | 'podman' | 'docker'\n /** 构建阶段的网络与原生依赖设置。 */\n network?: string\n sqlitePrebuildMirror?: string\n httpProxy?: boolean\n /** 只生成 tar,手工搬运。 */\n bundleOnly?: boolean\n /** 部署 tar 输出路径。 */\n output?: string\n}\n\n/** 配置输入中的可选对象;不让未完成的配置绕过最终 Provider Schema。 */\nfunction configObject(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {}\n}\n\n/**\n * 补齐部署目标,完整配置直接复用;SSH 参数和平台 Token 只写 `.env.<环境>.local`。\n * @example 首次输入主机和密钥或密码后,下次执行 `hai deploy --env prod` 自动复用。\n */\nasync function configureDeployTarget(module: typeof import('@h-ai/deploy'), config: Record<string, unknown>, environment: DeploymentEnvironment, nonInteractive?: boolean, bundleOnly?: boolean): Promise<void> {\n const original = configObject(config.provider)\n let editBundleTarget = false\n if (bundleOnly) {\n const existing = original\n if (existing.type && existing.type !== 'docker-ssh')\n throw new Error(cliM('cli_deploy_bundle_provider'))\n config.provider = { type: 'docker-ssh', remote: { runtime: 'auto' }, expose: { hostPort: 3000 }, ...existing }\n const candidate = module.ProviderConfigSchema.safeParse(config.provider)\n // 仅打包不依赖 SSH;未填写完整的连接由交付目录中的目标文件补齐。\n if (!candidate.success && candidate.error.issues.some(issue => issue.path[0] === 'ssh')) {\n const provider = configObject(config.provider)\n delete provider.ssh\n }\n if (!nonInteractive) {\n const answer = await prompts({ type: 'confirm', name: 'value', message: cliM('cli_deploy_bundle_configure_ssh'), initial: false })\n if (answer.value === undefined)\n throw new Error(cliM('cli_deploy_cancelled'))\n editBundleTarget = answer.value === true\n }\n }\n const current = module.ProviderConfigSchema.safeParse(config.provider)\n if (!editBundleTarget && current.success && (bundleOnly || current.data.type !== 'docker-ssh' || current.data.ssh)) {\n config.provider = current.data\n writeCliMessage(bundleOnly\n ? cliM('cli_deploy_bundle_target')\n : cliM('cli_deploy_target_reused', { params: { target: current.data.type === 'docker-ssh' && current.data.ssh ? `${current.data.ssh.username}@${current.data.ssh.host}:${current.data.ssh.port}` : 'Vercel' } }))\n return\n }\n if (nonInteractive || (bundleOnly && !editBundleTarget))\n throw new Error(cliM('cli_deploy_target_missing', { params: { fields: current.success ? 'provider.ssh' : current.error.issues.map(issue => `provider.${issue.path.join('.')}`).join(', ') } }))\n\n const platform = bundleOnly\n ? { value: 'docker-ssh' }\n : await prompts({\n type: 'select',\n name: 'value',\n message: cliM('cli_deploy_target_platform'),\n choices: [{ title: cliM('cli_deploy_target_ssh'), value: 'docker-ssh' }, { title: 'Vercel', value: 'vercel' }],\n initial: original.type === 'vercel' ? 1 : 0,\n })\n if (!platform.value)\n throw new Error(cliM('cli_deploy_cancelled'))\n\n const input = async (name: string, initial: unknown, options: { optional?: boolean, secret?: boolean, keepSecret?: boolean, port?: boolean, trim?: boolean } = {}): Promise<string> => {\n const answer = await prompts({\n type: options.secret ? 'password' : 'text',\n name: 'value',\n message: options.keepSecret ? cliM('cli_deploy_inputPASSWORDKEEP') : cliM(`cli_deploy_input${name.split('_').at(-1)}` as Parameters<typeof cliM>[0]),\n initial: options.secret ? undefined : initial === undefined ? '' : String(initial),\n validate: (value: string) => options.port\n ? (/^\\d+$/.test(value) && Number(value) >= 1 && Number(value) <= 65535) || cliM('cli_deploy_port_invalid')\n : options.optional || !!(options.trim === false ? value : value.trim()) || cliM('cli_deploy_invalid_value'),\n })\n if (answer.value === undefined)\n throw new Error(cliM('cli_deploy_cancelled'))\n return options.trim === false ? String(answer.value) : String(answer.value).trim()\n }\n let provider: Record<string, unknown>\n if (platform.value === 'docker-ssh') {\n writeCliMessage(cliM('cli_deploy_target_ssh_hint'))\n const ssh = configObject(original.ssh)\n const remote = configObject(original.remote)\n const expose = configObject(original.expose)\n const host = await input('HAI_DEPLOY_PROVIDER_SSH_HOST', ssh.host)\n const port = Number(await input('HAI_DEPLOY_PROVIDER_SSH_PORT', ssh.port ?? 22, { port: true }))\n const username = await input('HAI_DEPLOY_PROVIDER_SSH_USERNAME', ssh.username)\n const previousPasswordMode = ssh.auth === 'password' || (ssh.auth !== 'key' && typeof ssh.password === 'string' && ssh.password.length > 0)\n const authentication = await prompts({\n type: 'select',\n name: 'value',\n message: cliM('cli_deploy_target_auth'),\n choices: [{ title: cliM('cli_deploy_target_auth_key'), value: 'key' }, { title: cliM('cli_deploy_target_auth_password'), value: 'password' }],\n initial: previousPasswordMode ? 1 : 0,\n })\n if (!['key', 'password'].includes(authentication.value))\n throw new Error(cliM('cli_deploy_cancelled'))\n const auth = authentication.value as 'key' | 'password'\n const previousPassword = previousPasswordMode && typeof ssh.password === 'string' && ssh.password.length > 0 ? ssh.password : undefined\n const password = auth === 'password'\n ? previousPassword && !editBundleTarget ? previousPassword : await input('HAI_DEPLOY_PROVIDER_SSH_PASSWORD', undefined, { secret: true, trim: false, optional: !!previousPassword, keepSecret: !!previousPassword }) || previousPassword\n : undefined\n const identityFile = auth === 'key' ? await input('HAI_DEPLOY_PROVIDER_SSH_IDENTITYFILE', ssh.identityFile, { optional: true }) : undefined\n const knownHostsFile = await input('HAI_DEPLOY_PROVIDER_SSH_KNOWNHOSTSFILE', ssh.knownHostsFile, { optional: true })\n const baseDir = await input('HAI_DEPLOY_PROVIDER_REMOTE_BASEDIR', remote.baseDir || '/opt/hai/apps')\n const runtime = await prompts({ type: 'select', name: 'value', message: cliM('cli_deploy_target_runtime'), choices: ['auto', 'podman', 'docker'].map(value => ({ title: value, value })), initial: ['auto', 'podman', 'docker'].indexOf(String(remote.runtime ?? 'auto')) })\n if (!runtime.value)\n throw new Error(cliM('cli_deploy_cancelled'))\n const hostPort = Number(await input('HAI_DEPLOY_PROVIDER_EXPOSE_HOSTPORT', expose.hostPort || 3000, { port: true }))\n const containerPort = Number(await input('HAI_DEPLOY_PROVIDER_EXPOSE_CONTAINERPORT', expose.containerPort || 3000, { port: true }))\n provider = {\n type: 'docker-ssh',\n ssh: { ...ssh, host, port, username, auth, password, identityFile: identityFile || undefined, knownHostsFile: knownHostsFile || undefined },\n remote: { ...remote, baseDir, runtime: runtime.value },\n expose: { ...expose, type: 'port', hostPort, containerPort },\n }\n }\n else {\n provider = { type: 'vercel', token: await input('HAI_DEPLOY_PROVIDER_TOKEN', undefined, { secret: true }) }\n }\n const validated = module.ProviderConfigSchema.safeParse(provider)\n if (!validated.success)\n throw new Error(cliM('cli_deploy_invalid_value'))\n const saved = module.saveDeploymentEnvironment(environment, { HAI_DEPLOY_PROVIDER: JSON.stringify(validated.data) }, { private: true })\n if (!saved.success)\n throw new Error(saved.error.message)\n config.provider = validated.data\n writeCliMessage(cliM('cli_deploy_target_saved'))\n}\n\n/** 所有模板共用的可选 HTTPS 环节;配置保存到选中环境的私有层。 */\nasync function configureDeployHttps(module: typeof import('@h-ai/deploy'), config: Record<string, unknown>, environment: DeploymentEnvironment, nonInteractive?: boolean, partial?: boolean): Promise<void> {\n const provider = configObject(config.provider)\n if (provider.type !== 'docker-ssh' || nonInteractive || partial)\n return\n const expose = configObject(provider.expose)\n const previous = configObject(expose.https)\n const selection = await prompts({\n type: 'select',\n name: 'httpsMode',\n message: cliM('cli_deploy_https_mode'),\n choices: [\n { title: cliM(previous.type ? 'cli_deploy_https_keep' : 'cli_deploy_https_off'), value: 'keep' },\n { title: cliM('cli_deploy_https_files'), value: 'files' },\n { title: 'Let\\'s Encrypt (Certbot)', value: 'letsencrypt' },\n ...(previous.type ? [{ title: cliM('cli_deploy_https_off'), value: 'off' }] : []),\n ],\n })\n if (selection.httpsMode === undefined)\n throw new Error(cliM('cli_deploy_cancelled'))\n if (selection.httpsMode === 'keep')\n return\n let https: Record<string, unknown> | undefined\n if (selection.httpsMode !== 'off') {\n const ask = async (name: string, initial?: unknown): Promise<string> => {\n const answer = await prompts({ type: 'text', name, message: cliM((`cli_deploy_${name}`) as Parameters<typeof cliM>[0]), initial: initial === undefined ? '' : String(initial), validate: (value: string) => !!value.trim() || cliM('cli_deploy_invalid_value') })\n if (answer[name] === undefined)\n throw new Error(cliM('cli_deploy_cancelled'))\n return String(answer[name]).trim()\n }\n https = { type: selection.httpsMode, domain: await ask('httpsDomain', previous.domain), port: Number(await ask('httpsPort', previous.port ?? 443)), redirectHttp: true }\n if (https.type === 'files') {\n https.certificateFile = await ask('httpsCertificate', previous.certificateFile)\n https.privateKeyFile = await ask('httpsPrivateKey', previous.privateKeyFile)\n }\n else {\n writeCliMessage(cliM('cli_deploy_https_requirements'))\n https.email = await ask('httpsEmail', previous.email)\n const consent = await prompts({ type: 'confirm', name: 'acceptTerms', message: cliM('cli_deploy_https_terms'), initial: previous.acceptTerms === true })\n if (consent.acceptTerms !== true)\n throw new Error(cliM('cli_deploy_cancelled'))\n https.acceptTerms = true\n }\n }\n const parsed = module.ProviderConfigSchema.safeParse({ ...provider, expose: { ...expose, ...(https?.type === 'letsencrypt' ? { hostPort: 80 } : {}), https } })\n if (!parsed.success)\n throw new Error(cliM('cli_deploy_invalid_value'))\n const saved = module.saveDeploymentEnvironment(environment, { HAI_DEPLOY_PROVIDER: JSON.stringify(parsed.data) }, { private: true })\n if (!saved.success)\n throw new Error(saved.error.message)\n config.provider = parsed.data\n writeCliMessage(cliM('cli_deploy_https_saved'))\n}\n\n/**\n * 执行部署命令\n *\n * @param options - 部署选项\n * 显式加载目标环境、配置中间件并检查 HaiResult;退出时恢复原进程环境并关闭部署模块。\n * @throws Error - 扫描、配置、构建、打包或部署失败;SSH 本地终止不等于远端部署已停止。\n * @returns 部署或仅打包流程结束;具体模式见 bundleOnly。\n * @example 模块内部上下文\n * ```ts\n * // 前提:当前工程已构建镜像产物,且有根 hai.json.deploy 与生产公共/私有环境。\n * await deployCommand({ cwd: process.cwd(), env: 'prod', yes: true, bundleOnly: true, output: '.hai/shop.tar' })\n * // 等价:hai deploy --env prod --yes --bundle-only --output .hai/shop.tar。\n * ```\n */\nexport async function deployCommand(options: DeployCommandOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? process.cwd()\n let appDir = resolve(cwd, options.appDir ?? '.')\n let closeDeploy: (() => Promise<void>) | null = null\n let restoreProjectLogger: (() => void) | undefined\n const originalEnv = { ...process.env }\n const previousLogLevel = core.logger.getLevel()\n core.logger.setLevel('fatal')\n\n try {\n if (options.inspectRemote && !options.plan)\n throw new Error(cliM('cli_deploy_plan_options'))\n if (options.runtime && !['auto', 'podman', 'docker'].includes(options.runtime))\n throw new Error(cliM('cli_build_runtime_missing'))\n if (options.artifactDir && options.build)\n throw new Error(cliM('cli_deploy_build_artifact_conflict'))\n if (!options.build && (options.concurrency !== undefined || options.network !== undefined || options.sqlitePrebuildMirror !== undefined || options.httpProxy === false))\n throw new Error(cliM('cli_deploy_build_options_required'))\n let selectedServices = options.services?.split(',').map(name => name.trim())\n if (selectedServices && (!selectedServices.length || selectedServices.some(name => !/^[a-z][a-z0-9-]*$/.test(name)) || new Set(selectedServices).size !== selectedServices.length))\n throw new Error(cliM('cli_build_selection_invalid'))\n // 环境选择是第一步;取消、无 TTY 或缺文件均不能继续认证/开通资源。\n let environmentName = options.env\n if (!environmentName) {\n if (!process.stdin.isTTY)\n throw new Error(cliM('cli_deploy_environment_hint'))\n const answer = await prompts({ type: 'text', name: 'environment', message: cliM('cli_deploy_environment'), initial: 'prod' })\n environmentName = answer.environment\n if (!environmentName)\n throw new Error(cliM('cli_deploy_cancelled'))\n }\n if (!options.plan && !options.yes && !process.stdin.isTTY)\n throw new Error(cliM('cli_deploy_environment_hint'))\n // 动态导入 @h-ai/deploy(允许 CLI 在未安装 deploy 时仍可使用其他命令)\n let deployModule: typeof import('@h-ai/deploy')\n try {\n // 全局安装的 CLI 先使用目标工程的 deploy 版本,不依赖 CLI 的开发依赖。\n const localRequire = createRequire(resolve(appDir, 'package.json'))\n try {\n const { core: projectCore } = await import(pathToFileURL(localRequire.resolve('@h-ai/core')).href) as typeof import('@h-ai/core')\n if (projectCore !== core) {\n const level = projectCore.logger.getLevel()\n projectCore.logger.setLevel('fatal')\n restoreProjectLogger = () => projectCore.logger.setLevel(level)\n }\n }\n catch { /* 未安装项目依赖时,由 deploy 导入错误统一提示。 */ }\n let localModule: string | undefined\n try {\n localModule = localRequire.resolve('@h-ai/deploy')\n }\n catch { /* 源码仓库或直接模块测试可使用 CLI 本身可解析的安装。 */ }\n deployModule = localModule ? await import(pathToFileURL(localModule).href) : await import('@h-ai/deploy')\n }\n catch {\n writeCliError(chalk.red(cliM('cli_deploy_module_missing')))\n writeCliMessage(chalk.cyan(' pnpm add -D @h-ai/deploy'))\n throw new Error(cliM('cli_deploy_module_missing'))\n }\n\n const { deploy } = deployModule\n\n const scanResult = await deploy.scan(appDir, { environment: environmentName, envDir: options.envDir ? resolve(cwd, options.envDir) : undefined })\n if (!scanResult.success)\n throw new Error(cliM('cli_deploy_scan_failed', { params: { message: scanResult.error.message } }))\n const scan = scanResult.data\n appDir = scan.appDir ?? appDir\n const buildFile = projectConfigPath(appDir)\n const buildRoot = dirname(buildFile)\n const project = existsSync(buildFile) ? readProjectConfig(buildFile) : {}\n const buildConfig = configObject(project.build)\n const imageNames = Array.isArray(buildConfig.images)\n ? buildConfig.images.flatMap((image) => {\n const name = configObject(image).name\n return typeof name === 'string' ? [name] : []\n })\n : ['serv', 'web']\n const names = [...imageNames, ...(scan.middlewares ?? []).filter(item => !['sqlite', 'local', 'memory', 'disabled', 'console', 'lancedb'].includes(item.backend)).map(item => item.service)]\n const available = [...new Set(names)]\n if (selectedServices?.some(name => !available.includes(name)))\n throw new Error(cliM('cli_deploy_services_invalid', { params: { services: available.join(', ') } }))\n const environment = deployModule.loadDeploymentEnvironment({ environment: environmentName, envDir: scan.envDir ?? appDir })\n if (!environment.success)\n throw new Error(environment.error.message)\n if (options.plan) {\n if (options.build || options.bundleOnly || options.output)\n throw new Error(cliM('cli_deploy_plan_options'))\n const loaded = deployModule.loadDeploymentConfig('deploy', buildFile, { ...process.env, ...environment.data.values })\n if (!loaded.success)\n throw new Error(loaded.error.message)\n const validated = deployModule.DeployConfigSchema.safeParse(loaded.data)\n if (!validated.success)\n throw new Error(cliM('cli_deploy_config_invalid', { params: { path: buildFile, fields: validated.error.issues.map(issue => issue.path.join('.')).join(', ') } }))\n const plan = await deployModule.createDeploymentPlan(appDir, validated.data, { inspectRemote: options.inspectRemote, environment: environmentName, envDir: environment.data.envDir, selectedServices, skipMiddleware: options.skipMiddleware, artifactDir: options.artifactDir ? resolve(cwd, options.artifactDir) : undefined, runtime: options.runtime })\n if (!plan.success)\n throw new Error(plan.error.message)\n writeCliMessage(JSON.stringify(plan.data, null, 2))\n return\n }\n Object.assign(process.env, environment.data.values)\n\n // 1. 加载凭证\n spinner.start(cliM('cli_deploy_load_credentials'))\n const credResult = deploy.credentials.load()\n if (!credResult.success) {\n throw new Error(cliM('cli_deploy_credentials_failed', { params: { message: credResult.error.message } }))\n }\n spinner.succeed(cliM('cli_deploy_credentials_loaded', { params: { count: credResult.data.length } }))\n\n // 2. 读取部署配置\n spinner.start(cliM('cli_deploy_load_config'))\n const configPath = buildFile\n if (!existsSync(configPath)) {\n spinner.fail(chalk.red(cliM('cli_deploy_config_missing', { params: { path: configPath } })))\n writeCliMessage(chalk.cyan(cliM('cli_deploy_config_hint')))\n throw new Error(cliM('cli_deploy_config_missing', { params: { path: configPath } }))\n }\n\n const loadedConfig = deployModule.loadDeploymentConfig('deploy', configPath, process.env)\n if (!loadedConfig.success)\n throw new Error(loadedConfig.error.message)\n const deployConfig = loadedConfig.data\n spinner.succeed(cliM('cli_deploy_config_loaded'))\n if (!options.build && !selectedServices && configObject(deployConfig.provider).type === 'docker-ssh') {\n let artifactDirectory = options.artifactDir ? resolve(cwd, options.artifactDir) : resolve(buildRoot, '.hai/build/docker')\n if (existsSync(resolve(artifactDirectory, 'latest'))) {\n const pointer = readFileSync(resolve(artifactDirectory, 'latest'), 'utf8').trim()\n if (!/^[a-z0-9][\\w.+-]*$/i.test(pointer))\n throw new Error(cliM('cli_deploy_artifact_invalid'))\n artifactDirectory = resolve(artifactDirectory, pointer)\n }\n if (existsSync(resolve(artifactDirectory, 'manifest.json'))) {\n try {\n const artifact = await deployModule.readDeploymentArtifact(artifactDirectory)\n if (artifact.partial)\n selectedServices = artifact.images.map(image => image.name)\n }\n catch {\n throw new Error(cliM('cli_deploy_artifact_invalid'))\n }\n }\n }\n if (options.bundleOnly) {\n const provider = configObject(deployConfig.provider)\n if (provider.type && provider.type !== 'docker-ssh')\n throw new Error(cliM('cli_deploy_bundle_provider'))\n deployConfig.provider = { type: 'docker-ssh', remote: { runtime: 'auto' }, expose: { hostPort: 3000 }, ...provider }\n }\n else {\n await configureDeployTarget(deployModule, deployConfig, environment.data, options.yes)\n }\n if (configObject(deployConfig.provider).type !== 'docker-ssh' && (selectedServices || options.build))\n throw new Error(cliM('cli_deploy_bundle_provider'))\n\n if (!options.yes && !selectedServices && configObject(deployConfig.provider).type === 'docker-ssh') {\n if (existsSync(buildFile)) {\n if (available.length > 1) {\n const choice = await prompts({ type: 'multiselect', name: 'value', message: cliM('cli_deploy_choose_services'), choices: available.map(name => ({ title: name, value: name, selected: true })), min: 1 })\n if (!Array.isArray(choice.value) || choice.value.length === 0)\n throw new Error(cliM('cli_deploy_cancelled'))\n if (choice.value.length !== available.length)\n selectedServices = choice.value\n }\n }\n }\n\n spinner.succeed(cliM('cli_deploy_scanned', { params: { name: scan.appName, sveltekit: String(scan.isSvelteKit), services: scan.requiredServices.join(', ') || cliM('cli_deploy_none') } }))\n\n if (options.build) {\n if (!existsSync(buildFile))\n throw new Error(cliM('cli_build_images_missing'))\n const imageNames = selectedServices?.filter(name => ['serv', 'web'].includes(name))\n if (!selectedServices || imageNames?.length) {\n writeCliMessage(cliM('cli_deploy_build_started'))\n await buildCommand({ cwd: buildRoot, target: 'image', images: imageNames?.join(','), concurrency: options.concurrency, runtime: options.runtime, network: options.network, sqlitePrebuildMirror: options.sqlitePrebuildMirror, httpProxy: options.httpProxy })\n }\n }\n if (selectedServices)\n writeCliMessage(cliM('cli_deploy_services', { params: { services: selectedServices.join(', ') } }))\n let skipMiddleware = options.skipMiddleware || selectedServices?.every(name => ['serv', 'web'].includes(name))\n if (!skipMiddleware && !options.yes && scan.requiredServices.length) {\n const action = await prompts({\n type: 'select',\n name: 'value',\n message: cliM('cli_deploy_middleware_plan'),\n choices: [{ title: cliM('cli_deploy_middleware_configure'), value: 'configure' }, { title: cliM('cli_deploy_middleware_skip'), value: 'skip' }],\n })\n if (!action.value)\n throw new Error(cliM('cli_deploy_cancelled'))\n skipMiddleware = action.value === 'skip'\n }\n if (skipMiddleware)\n writeCliMessage(cliM('cli_deploy_middleware_skipped'))\n const serviceModes = skipMiddleware\n ? Object.fromEntries(scan.requiredServices.map(service => [service, 'keep' as const]))\n : await configureDeployMiddleware(deployModule, { ...scan, middlewares: scan.middlewares?.filter(item => !selectedServices || selectedServices.includes(item.service)) }, environment.data, deployConfig, options.yes)\n if (skipMiddleware)\n deployConfig.services = undefined\n // 离线模式在构建和中间件配置之后最后询问;生成 tar 和 target 时使用同一份目标。\n if (options.bundleOnly)\n await configureDeployTarget(deployModule, deployConfig, environment.data, options.yes, true)\n await configureDeployHttps(deployModule, deployConfig, environment.data, options.yes, selectedServices !== undefined)\n // 刚写入文件的值不能被本次命令之前注入的快照覆盖;保留用户原有进程变量优先级。\n for (const key of Object.keys(process.env)) {\n if (originalEnv[key] === undefined)\n delete process.env[key]\n }\n Object.assign(process.env, originalEnv)\n const refreshed = deployModule.loadDeploymentEnvironment({ environment: environment.data.environment, envDir: environment.data.envDir })\n if (!refreshed.success)\n throw new Error(refreshed.error.message)\n Object.assign(process.env, refreshed.data.values)\n\n // 4. 初始化 deploy 模块\n spinner.start(cliM('cli_deploy_initializing'))\n const validatedConfig = deployModule.DeployConfigSchema.safeParse(deployConfig)\n if (!validatedConfig.success)\n throw new Error(cliM('cli_deploy_config_invalid', { params: { path: configPath, fields: validatedConfig.error.issues.map(issue => issue.path.join('.')).join(', ') } }))\n const initResult = await deploy.init(validatedConfig.data)\n if (!initResult.success) {\n throw new Error(cliM('cli_deploy_init_failed', { params: { message: initResult.error.message } }))\n }\n closeDeploy = () => deploy.close()\n spinner.succeed(cliM('cli_deploy_initialized'))\n\n // 5. 执行部署\n spinner.start(cliM('cli_deploy_deploying'))\n const deployResult = await deploy.deployApp(appDir, {\n selectedServices,\n runtime: options.runtime,\n onProgress: stage => writeCliMessage(cliM(`cli_deploy_stage_${stage}`)),\n skipMiddleware,\n artifactDir: options.artifactDir ? resolve(cwd, options.artifactDir) : undefined,\n bundleOnly: options.bundleOnly,\n output: options.output ? resolve(cwd, options.output) : undefined,\n environment: environment.data.environment,\n envDir: environment.data.envDir,\n serviceModes,\n })\n\n if (!deployResult.success) {\n const execution = deployModule.getDeployCommandState(deployResult.error)\n if (execution) {\n const localKey = execution.localTermination === 'not-started' ? 'cli_deploy_local_not_started' : execution.localTermination === 'confirmed' ? 'cli_deploy_local_confirmed' : 'cli_deploy_local_unknown'\n writeCliMessage(cliM(localKey))\n if (execution.remoteExecution)\n writeCliMessage(cliM(execution.remoteExecution === 'finished' ? 'cli_deploy_remote_finished' : 'cli_deploy_remote_unknown'))\n if (execution.remoteRecovery) {\n const recoveryKeys = {\n 'not-needed': 'cli_deploy_recovery_not_needed',\n 'passed': 'cli_deploy_recovery_passed',\n 'failed': 'cli_deploy_recovery_failed',\n 'stopped': 'cli_deploy_recovery_stopped',\n } as const\n writeCliMessage(cliM(recoveryKeys[execution.remoteRecovery]))\n }\n if (execution.deploymentId && execution.resultFile)\n writeCliMessage(cliM('cli_deploy_result_check', { params: { id: execution.deploymentId, path: execution.resultFile } }))\n }\n if (deployResult.error.ext?.recovery) {\n writeCliMessage(deployResult.error.suggestion ?? cliM('cli_deploy_command_failed'))\n }\n throw new Error(cliM('cli_deploy_failed', { params: { message: deployResult.error.message } }))\n }\n\n spinner.succeed(chalk.green(cliM(deployResult.data.status === 'packaged' ? 'cli_deploy_bundle_ready' : 'cli_deploy_success')))\n writeCliMessage('')\n if (deployResult.data.bundlePath && (deployResult.data.status !== 'packaged' || !deployResult.data.instructions))\n writeCliMessage(cliM('cli_deploy_bundle_path', { params: { path: deployResult.data.bundlePath } }))\n if (deployResult.data.status === 'packaged')\n writeCliMessage(deployResult.data.instructions ?? '')\n else\n writeCliMessage(chalk.cyan(cliM('cli_deploy_url', { params: { url: deployResult.data.url } })))\n writeCliMessage(chalk.gray(cliM('cli_deploy_id', { params: { id: deployResult.data.deploymentId } })))\n if (refreshed.data.values.HAI_ADMIN_DEFAULT_PASSWORD && (!selectedServices || selectedServices.includes(imageNames.includes('serv') ? 'serv' : 'web'))) {\n const passwordKey = 'HAI_ADMIN_DEFAULT_PASSWORD'\n const source = originalEnv[passwordKey] !== undefined\n ? cliM('cli_deploy_processEnvironment')\n : [`.env.${refreshed.data.environment}.local`, '.env.local', `.env.${refreshed.data.environment}`, '.env']\n .map(file => resolve(refreshed.data.envDir, file))\n .find(file => existsSync(file) && parseEnv(readFileSync(file, 'utf8'))[passwordKey] !== undefined)\n if (source)\n writeCliMessage(chalk.cyan(cliM('cli_deploy_adminPasswordSource', { params: { source } })))\n }\n writeCliMessage('')\n }\n catch (error) {\n spinner.fail(chalk.red(cliM('cli_deploy_command_failed')))\n writeCliError(error instanceof Error ? error.message : String(error))\n throw error\n }\n finally {\n if (closeDeploy) {\n try {\n await closeDeploy()\n }\n catch (error) {\n writeCliError('Failed to close deploy module', error)\n process.exitCode = 1\n }\n }\n for (const key of Object.keys(process.env)) {\n if (originalEnv[key] === undefined)\n delete process.env[key]\n }\n Object.assign(process.env, originalEnv)\n core.logger.setLevel(previousLogLevel)\n restoreProjectLogger?.()\n }\n}\n","import { createRequire } from 'module';\nvar require = createRequire('/');\n// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar _a;\n// Mediocre shim\nvar Worker;\nvar isMarkedAsUntransferable;\nvar workerAdd = \";var __w=require('worker_threads');__w.parentPort.on('message',function(m){onmessage({data:m})}),postMessage=function(m,t){__w.parentPort.postMessage(m,t)},close=process.exit;self=global\";\ntry {\n (_a = require('worker_threads'), Worker = _a.Worker, isMarkedAsUntransferable = _a.isMarkedAsUntransferable);\n}\ncatch (e) {\n}\nvar wk = Worker ? function (c, _, msg, transfer, cb) {\n var done = false;\n var w = new Worker(c + workerAdd, { eval: true })\n .on('error', function (e) { return cb(e, null); })\n .on('message', function (m) { return cb(null, m); })\n .on('exit', function (c) {\n if (c && !done)\n cb(new Error('exited with code ' + c), null);\n });\n if (isMarkedAsUntransferable)\n transfer = transfer.filter(function (t) { return !isMarkedAsUntransferable(t); });\n w.postMessage(msg, transfer);\n w.terminate = function () {\n done = true;\n return Worker.prototype.terminate.call(w);\n };\n return w;\n} : function (_, __, ___, ____, cb) {\n setImmediate(function () { return cb(new Error('async operations unsupported - update to Node 12+ (or Node 10-11 with the --experimental-worker CLI flag)'), null); });\n var NOP = function () { };\n return {\n terminate: NOP,\n postMessage: NOP\n };\n};\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new i32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 1; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n , // determined by compression function\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n // source length dict length\n var sl = dat.length, dl = dict ? dict.length : 0;\n if (!sl || st.f && !st.l)\n return buf || new u8(0);\n var noBuf = !buf;\n // have to estimate size\n var resize = noBuf || st.i != 2;\n // no state\n var noSt = st.i;\n // Assumes roughly 33% compression ratio average\n if (noBuf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (resize)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17\n if (resize)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (resize)\n cbuf(bt + 131072);\n var end = bt + add;\n if (bt < dt) {\n var shift = dl - dt, dend = Math.min(dt, end);\n if (shift + bt < 0)\n err(3);\n for (; bt < dend; ++bt)\n buf[bt] = dict[shift + bt];\n }\n for (; bt < end; ++bt)\n buf[bt] = buf[bt - dt];\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n // don't reallocate for streams or user buffers\n return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return { t: et, l: 0 };\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return { t: v, l: 1 };\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n ++lcfreq[lclt[i] & 31];\n for (var i = 0; i < lcdt.length; ++i)\n ++lcfreq[lcdt[i] & 31];\n var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n var sym = syms[i];\n if (sym > 255) {\n var len = (sym >> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n var dst = sym & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[sym]), p += ll[sym];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n var s = st.z || dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var lst = st.l;\n var pos = (st.r || 0) & 7;\n if (lvl) {\n if (pos)\n w[0] = st.r >> 3;\n var opt = deo[lvl - 1];\n var n = opt >> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new i32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx blkpos\n var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n for (; i + 2 < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j & 32767;\n var pti = prev[ti];\n var cd = ti - pti & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one int32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n for (i = Math.max(i, wi); i < s; ++i) {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n if (!lst) {\n st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n // shft(pos) now 1 less if pos & 7 != 0\n pos -= 7;\n st.h = head, st.p = prev, st.i = i, st.w = wi;\n }\n }\n else {\n for (var i = st.w || 0; i < s + lst; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[(pos / 8) | 0] = lst;\n e = s;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n st.i = s;\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Adler32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n if (!st) {\n st = { l: 1 };\n if (opt.dictionary) {\n var dict = opt.dictionary.subarray(-32768);\n var newDat = new u8(dict.length + dat.length);\n newDat.set(dict);\n newDat.set(dat, dict.length);\n dat = newDat;\n st.w = dict.length;\n }\n }\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n fnStr = wcln(fns[i], fnStr, td_1);\n ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n }\n var td = mrg({}, ch[id].e);\n return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n out: o.size && new u8(o.size),\n dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) {\n if (ev.data[0]) {\n strm.push(ev.data[0], ev.data[1]);\n postMessage([ev.data[0].length]);\n }\n else\n strm.flush(ev.data[1]);\n };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else if (!Array.isArray(dat))\n ext(dat);\n else if (dat.length == 1) {\n strm.queuedSize -= dat[0];\n if (strm.ondrain)\n strm.ondrain(dat[0]);\n }\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.queuedSize = 0;\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n strm.queuedSize += d.length;\n // can fail for cross-realm Uint8Array, but ok - only a small performance penalty\n w.postMessage([d, t = f], d.buffer instanceof ArrayBuffer ? [d.buffer] : []);\n };\n strm.terminate = function () { w.terminate(); };\n if (flush) {\n strm.flush = function (sync) { w.postMessage([0, sync]); };\n }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\n// read 8 bytes\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += (d[10] | d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n if (o.dictionary) {\n var h = adler();\n h.p(o.dictionary);\n wbytes(c, 2, h.d());\n }\n};\n// zlib start\nvar zls = function (d, dict) {\n if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if ((d[1] >> 5 & 1) == +!dict)\n err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n // 98304 = 32768 (lookback) + 65536 (common chunk size)\n this.b = new u8(98304);\n if (this.o.dictionary) {\n var dict = this.o.dictionary.subarray(-32768);\n this.b.set(dict, 32768 - dict.length);\n this.s.i = 32768 - dict.length;\n }\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n var endLen = chunk.length + this.s.z;\n if (endLen > this.b.length) {\n if (endLen > 2 * this.b.length - 32768) {\n var newBuf = new u8(endLen & -32768);\n newBuf.set(this.b.subarray(0, this.s.z));\n this.b = newBuf;\n }\n var split = this.b.length - this.s.z;\n this.b.set(chunk.subarray(0, split), this.s.z);\n this.s.z = this.b.length;\n this.p(this.b, false);\n this.b.set(this.b.subarray(-32768));\n this.b.set(chunk.subarray(split), 32768);\n this.s.z = chunk.length - split + 32768;\n this.s.i = 32766, this.s.w = 32768;\n }\n else {\n this.b.set(chunk, this.s.z);\n this.s.z += chunk.length;\n }\n this.s.l = final & 1;\n if (this.s.z > this.s.w + 8191 || final) {\n this.p(this.b, final || false);\n this.s.w = this.s.i, this.s.i -= 2;\n }\n if (final) {\n // cleanup unneeded buffers/state to reduce memory usage\n this.s = this.o = {};\n this.b = et;\n }\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * deflated output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible. A separate DEFLATE stream may be concatenated\n * with the current output after a sync flush.\n */\n Deflate.prototype.flush = function (sync) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n this.p(this.b, false);\n this.s.w = this.s.i, this.s.i -= 2;\n // could technically skip writing the type-0 block for (this.s.r & 7) == 0,\n // but the deterministic trailer (00 00 FF FF) is useful in some situations\n if (sync) {\n var c = new u8(6);\n c[0] = this.s.r >> 3;\n // write empty, non-final type-0 block\n var ep = wfblk(c, this.s.r, et);\n this.s.r = 0;\n this.ondata(c.subarray(0, ep >> 3), false);\n }\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6, 1);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n function Inflate(opts, cb) {\n // no StrmOpt here to avoid adding to workerizer\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n this.s = { i: 0, b: dict ? dict.length : 0 };\n this.o = new u8(32768);\n this.p = new u8(0);\n if (dict)\n this.o.set(dict);\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n if (!this.p.length)\n this.p = c;\n else if (c.length) {\n var n = new u8(this.p.length + c.length);\n n.set(this.p), n.set(c, this.p.length), this.p = n;\n }\n };\n Inflate.prototype.c = function (final) {\n this.s.i = +(this.d = final || false);\n var bts = this.s.b;\n var dt = inflt(this.p, this.s, this.o);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n function AsyncInflate(opts, cb) {\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Inflate(ev.data);\n onmessage = astrm(strm);\n }, 7, 0);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\nexport function inflateSync(data, opts) {\n return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n this.l += chunk.length;\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * GZIPped output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Gzip.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8, 1);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n function Gunzip(opts, cb) {\n this.v = 1;\n this.r = 0;\n Inflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n this.r += chunk.length;\n if (this.v) {\n var p = this.p.subarray(this.v - 1);\n var s = p.length > 3 ? gzs(p) : 4;\n if (s > p.length) {\n if (!final)\n return;\n }\n else if (this.v > 1 && this.onmember) {\n this.onmember(this.r - p.length);\n }\n this.p = p.subarray(s), this.v = 0;\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, 0);\n // process concatenated GZIP\n if (this.s.f && !this.s.l) {\n this.v = shft(this.s.p) + 9;\n this.s = { i: 0 };\n this.o = new u8(0);\n this.push(new u8(0), final);\n }\n else if (final) {\n Inflate.prototype.c.call(this, final);\n }\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n function AsyncGunzip(opts, cb) {\n var _this = this;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gunzip(ev.data);\n strm.onmember = function (offset) { return postMessage(offset); };\n onmessage = astrm(strm);\n }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\nexport function gunzipSync(data, opts) {\n var st = gzs(data);\n if (st + 8 > data.length)\n err(6, 'invalid gzip data');\n return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * zlibbed output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Zlib.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10, 1);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n function Unzlib(opts, cb) {\n Inflate.call(this, opts, cb);\n this.v = opts && opts.dictionary ? 2 : 1;\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 6 && !final)\n return;\n this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n function AsyncUnzlib(opts, cb) {\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Unzlib(ev.data);\n onmessage = astrm(strm);\n }, 11, 0);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\nexport function unzlibSync(data, opts) {\n return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n function Decompress(opts, cb) {\n this.o = StrmOpt.call(this, opts, cb) || {};\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n }\n // init substream\n // overriden by AsyncDecompress\n Decompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (dat, final) {\n _this.ondata(dat, final);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(this.o)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(this.o)\n : new this.Z(this.o);\n this.i();\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n function AsyncDecompress(opts, cb) {\n Decompress.call(this, opts, cb);\n this.queuedSize = 0;\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n }\n AsyncDecompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (err, dat, final) {\n _this.ondata(err, dat, final);\n };\n this.s.ondrain = function (size) {\n _this.queuedSize -= size;\n if (_this.ondrain)\n _this.ondrain(size);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n this.queuedSize += chunk.length;\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, opts)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, opts)\n : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (ArrayBuffer.isView(val))\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return { s: r, r: slc(d, i - 1) };\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (final) {\n if (r.length)\n err(8);\n this.p = null;\n }\n else\n this.p = r;\n this.ondata(s, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td) {\n return td.decode(dat);\n }\n else {\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (r.length)\n err(8);\n return s;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), efl = b2(d, b + 30), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl;\n var _a = z64hs(d, es, efl, z, b4(d, b + 20), b4(d, b + 24), b4(d, b + 42)), sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + efl + b2(d, b + 32), off];\n};\n// read zip64 header sizes\nvar z64hs = function (d, b, l, z, sc, su, off) {\n var nsc = sc == 4294967295, nsu = su == 4294967295, noff = off == 4294967295, e = b + l;\n var nf = nsc + nsu + noff;\n if (z && nf) {\n for (; b + 4 < e; b += 4 + b2(d, b + 2)) {\n if (b2(d, b) == 1) {\n return [\n nsc ? b8(d, b + 4 + 8 * nsu) : sc,\n nsu ? b8(d, b + 4) : su,\n noff ? b8(d, b + 4 + 8 * (nsu + nsc)) : off,\n 1\n ];\n }\n }\n // z == 2 for unknown whether or not zip64\n if (z < 2)\n err(13);\n }\n return [sc, su, off, 0];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n if (c != -1) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n // we shouldn't really do this cast, but properly handling ArrayBufferLike\n // makes the API unergonomic with Buffer\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u, -1);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this.ondata(err, dat, final);\n _this.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this.d & 1))\n return;\n _this.u.splice(-1, 1);\n _this.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (chunk, final) {\n // same as ZipPassThrough: cast to retain Buffer ergonomics\n this.ondata(null, chunk, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this = this;\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (chunk, final) {\n try {\n this.i.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (chunk, final) {\n if (this.i.terminate)\n chunk = slc(chunk, 0);\n this.i.push(chunk, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var lsc = b4(buf, i + 18), lsu = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n var _a = z64hs(buf, i, es, 2, lsc, lsu, 0), sc_1 = _a[0], su_1 = _a[1], z64 = _a[3];\n if (dd)\n sc_1 = -1 - z64;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this.k[0] == chks_3 && _this.c)\n _this.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = lft = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n // Synchronously decompress under 512KB, or barely-compressed data\n if (su < 524288 || sc > 0.8 * su) {\n try {\n cbl(null, inflateSync(infl, { out: new u8(su) }));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n","import { strToU8 } from 'fflate'\n\ndeclare const __FEEDBACK_REPLAY_SCRIPT__: string\n\n/** 查看器只使用 textContent 与受限图片,不执行原应用或用户附件脚本。 */\nconst VIEWER_SCRIPT = `\nconst messages = {\n zh: {title:'问题反馈',facts:'采集事实',user:'用户描述',evidence:'证据',attachments:'截图与附件',missing:'缺失材料',history:'处理记录',error:'问题包读取失败',all:'全部',next:'下一页',previous:'上一页',download:'下载',empty:'未填写',replay:'页面回放',play:'播放',pause:'暂停',unavailable:'回放不可用,已保留原始证据',boundary:'回放展示采集的页面快照与交互,不执行原应用脚本。未内嵌的外部图片、字体和样式被离线策略阻止;缺失记录见下方。'},\n en: {title:'Feedback report',facts:'Collected facts',user:'User description',evidence:'Evidence',attachments:'Screenshots and attachments',missing:'Missing evidence',history:'Processing history',error:'Unable to read the bundle',all:'All',next:'Next',previous:'Previous',download:'Download',empty:'Not provided',replay:'Page replay',play:'Play',pause:'Pause',unavailable:'Replay unavailable; original evidence is preserved',boundary:'Replay shows captured snapshots and interactions without running application scripts. External images, fonts and styles that were not embedded are blocked by offline policy. See missing evidence below.'},\n ja: {title:'問題フィードバック',facts:'収集した事実',user:'ユーザーの説明',evidence:'証拠',attachments:'スクリーンショットと添付',missing:'不足資料',history:'処理記録',error:'パッケージを読み込めません',all:'すべて',next:'次へ',previous:'前へ',download:'ダウンロード',empty:'未入力',replay:'ページ再生',play:'再生',pause:'一時停止',unavailable:'再生できません。元の証拠は保持されています',boundary:'収集したスナップショットと操作を再生し、元のアプリのスクリプトは実行しません。埋め込まれていない外部画像、フォント、スタイルはオフライン方針で遮断されます。不足資料も確認してください。'}\n};\nconst language = navigator.language.startsWith('ja') ? 'ja' : navigator.language.startsWith('zh') ? 'zh' : 'en';\nconst m = messages[language];\nfunction text(tag,value,parent){const node=document.createElement(tag);node.textContent=String(value??'');parent.append(node);return node;}\nfunction section(title){const block=document.createElement('section');text('h2',title,block);document.querySelector('main').append(block);return block;}\nfunction safeImage(file){return ['image/png','image/jpeg','image/webp'].includes(file.contentType);}\nasync function load(path){const response=await fetch('../'+path);if(!response.ok)throw Error('Missing file');return response.json();}\ntry {\n const [manifest,report,evidence,history]=await Promise.all([load('manifest.json'),load('report.json'),load('evidence/records.json'),load('evidence/history.json')]);\n text('h1',m.title+' '+(report.number||report.id),document.querySelector('header'));\n text('pre',JSON.stringify(report,null,2),section(m.facts));\n text('p',report.description||m.empty,section(m.user));\n const attachments=section(m.attachments);\n for(const file of manifest.files.filter(item=>item.kind==='attachment')){\n if(!/^attachments\\\\/[\\\\w-]+\\\\.(png|jpg|webp|webm|mp4|txt|json|bin)$/.test(file.path))continue;\n const figure=document.createElement('figure');attachments.append(figure);text('figcaption',file.name||file.attachmentId,figure);\n if(safeImage(file)){const image=document.createElement('img');image.src='../'+file.path;image.alt=file.name||'';image.loading='lazy';figure.append(image);}\n if(['video/webm','video/mp4'].includes(file.contentType)){const video=document.createElement('video');video.src='../'+file.path;video.controls=true;video.preload='metadata';video.style.maxWidth='100%';figure.append(video);}\n const link=text('a',m.download,figure);link.href='../'+file.path;link.download=file.name||file.path.split('/').pop();\n }\n const replayEvents=evidence.filter(item=>item.kind==='replay'&&item.data&&item.data.event).map(item=>item.data.event).sort((a,b)=>a.timestamp-b.timestamp);\n\n if(replayEvents.length){\n const replay=section(m.replay);text('p',m.boundary,replay);\n try{\n await import('./replay.js');\n if(typeof globalThis.__HAI_FEEDBACK_REPLAY__!=='function')throw Error('Replay unavailable');\n const fullSnapshot=replayEvents.find(event=>event.type===2);\n if(!fullSnapshot)throw Error('Replay full snapshot unavailable');\n const target=document.createElement('div');replay.append(target);\n let player;\n const origin=replayEvents[0].timestamp;\n const duration=Math.max(0,replayEvents.at(-1).timestamp-origin);\n const snapshotOffset=Math.max(0,fullSnapshot.timestamp-origin);\n const play=text('button',m.play,replay);const pause=text('button',m.pause,replay);\n const slider=document.createElement('input');slider.type='range';slider.min='0';slider.max=String(Math.max(1,duration));slider.value='0';slider.setAttribute('aria-label',m.replay);replay.append(slider);\n let current=0;let playing=false;let frame=0;\n function position(value){return Math.max(0,Math.min(duration,Number.isFinite(value)?value:0));}\n function stop(){if(frame)cancelAnimationFrame(frame);frame=0;}\n // 每次定位重建实例,隔离旧回放末尾延迟到达的 finish,避免覆盖新的进度。\n function construct(){const instance=globalThis.__HAI_FEEDBACK_REPLAY__(replayEvents,target);player=instance;instance.on('finish',()=>{if(instance!==player||!playing)return;playing=false;stop();current=duration;slider.value=String(current);});}\n function update(){if(!playing)return;current=position(player.getCurrentTime());slider.value=String(current);frame=requestAnimationFrame(update);}\n // rrweb 仅同步应用严格早于偏移的事件;增加 1ms 使精确事件时间与首帧边界都包含在内。\n function seek(value){playing=false;stop();const requested=position(value);player?.destroy();construct();player.pause(Math.max(requested,snapshotOffset)+1);current=requested;slider.value=String(current);}\n\n play.onclick=()=>{stop();current=position(Number(slider.value));if(current>=duration)seek(0);playing=true;player.play(Math.max(current,snapshotOffset));update();};\n pause.onclick=()=>{player.pause();playing=false;stop();current=position(player.getCurrentTime());slider.value=String(current);};\n slider.oninput=()=>seek(Number(slider.value));\n window.addEventListener('pagehide',()=>{playing=false;stop();player.destroy();},{once:true});\n seek(0);\n }catch{text('p',m.unavailable,replay);}\n }\n const block=section(m.evidence);const filter=document.createElement('select');block.append(filter);const all=text('option',m.all,filter);all.value='';\n for(const kind of [...new Set(evidence.map(item=>item.kind))]){const option=text('option',kind,filter);option.value=kind;}\n const request=document.createElement('input');request.placeholder='requestId';request.setAttribute('aria-label','requestId');block.append(request);\n const output=text('pre','',block);const previous=text('button',m.previous,block);const next=text('button',m.next,block);const counter=text('span','',block);let page=1;\n function render(){const rows=evidence.filter(item=>(!filter.value||item.kind===filter.value)&&(!request.value||item.requestId===request.value));const pages=Math.max(1,Math.ceil(rows.length/20));page=Math.min(page,pages);output.textContent=JSON.stringify(rows.slice((page-1)*20,page*20),null,2);counter.textContent=' '+page+' / '+pages+' ('+rows.length+')';previous.disabled=page<=1;next.disabled=page>=pages;}\n filter.onchange=()=>{page=1;render();};request.oninput=()=>{page=1;render();};previous.onclick=()=>{page--;render();};next.onclick=()=>{page++;render();};render();\n text('pre',JSON.stringify(history,null,2),section(m.history));text('pre',manifest.missing.join('\\\\n')||'—',section(m.missing));\n} catch {text('p',m.error,document.querySelector('main'));}\n`\n\n/**\n * 包内可信查看器资源,CLI 从内置资源提供代码,绝不执行导入包自带的任意脚本。\n * @example 模块内部上下文\n * ```ts\n * const html = feedbackViewerFiles()['viewer/index.html']\n * const source: string = new TextDecoder().decode(html)\n * ```\n */\nexport function feedbackViewerFiles(): Record<string, Uint8Array> {\n return {\n 'viewer/index.html': strToU8(`<!doctype html><html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' blob: data:; media-src 'self' blob:; connect-src 'self'; frame-src 'self' about: blob:; font-src 'self' data:; base-uri 'none'; form-action 'none'\"><title>Feedback</title><link rel=\"stylesheet\" href=\"style.css\"></head><body><header></header><main></main><script type=\"module\" src=\"app.js\"></script></body></html>`),\n 'viewer/style.css': strToU8('body{font:15px system-ui,sans-serif;line-height:1.6;margin:0;background:#f5f6f8;color:#172033}header,main{max-width:1080px;margin:auto;padding:24px}section{background:white;padding:24px;margin-bottom:20px;border:1px solid #dce1e8;border-radius:12px}h1{font-size:26px}h2{font-size:19px;margin-top:0}pre{white-space:pre-wrap;overflow-wrap:anywhere;font:13px/1.6 ui-monospace,monospace}img{max-width:100%;height:auto;border:1px solid #dce1e8}figure{margin:16px 0}input,select,button{font:inherit;padding:8px;margin:4px;border:1px solid #ccd2dc;border-radius:6px}button{cursor:pointer}a{display:block;color:#215dc0}'),\n 'viewer/app.js': strToU8(VIEWER_SCRIPT),\n 'viewer/replay.js': strToU8(typeof __FEEDBACK_REPLAY_SCRIPT__ === 'string' ? __FEEDBACK_REPLAY_SCRIPT__ : '/* Replay is available in built package artifacts. */'),\n }\n}\n","import type { HaiResult } from '@h-ai/core'\nimport type { FeedbackBundle, FeedbackBundleEvidence, FeedbackBundleEvidencePage, FeedbackBundleFile, FeedbackBundleInput, FeedbackBundleManifest, FeedbackBundleQuery, FeedbackBundleReadOptions } from './feedback-bundle-types.js'\nimport { core, err, HaiCommonError, ok } from '@h-ai/core'\nimport { strFromU8, strToU8, unzipSync, zipSync } from 'fflate'\nimport { feedbackViewerFiles } from './feedback-bundle-viewer.js'\n\nconst bundleM = core.i18n.createMessageGetter({\n 'zh-CN': { invalid: '问题包格式、容量或完整性校验失败', title: '问题反馈', facts: '采集事实', missing: '缺失材料', user: '用户描述', empty: '未填写', evidence: '证据', attachments: '附件' },\n 'en-US': { invalid: 'The feedback bundle failed format, size or integrity validation', title: 'Feedback report', facts: 'Collected facts', missing: 'Missing evidence', user: 'User description', empty: 'Not provided', evidence: 'Evidence', attachments: 'Attachments' },\n 'ja-JP': { invalid: '問題パッケージの形式、容量または整合性の検証に失敗しました', title: '問題フィードバック', facts: '収集した事実', missing: '不足している資料', user: 'ユーザーの説明', empty: '未入力', evidence: '証拠', attachments: '添付ファイル' },\n})\n\nconst MAX_FILES = 1024\nconst MAX_BYTES = 64 * 1024 * 1024\nconst MAX_FILE_BYTES = 16 * 1024 * 1024\nconst SHA256 = /^[a-f0-9]{64}$/\nconst SAFE_ID = /^[\\w-]{1,128}$/\n\n/** JSON 仅做数据边界,禁止保留原型和可执行值。 */\nfunction jsonObject(value: unknown): Record<string, unknown> {\n const parsed: unknown = JSON.parse(JSON.stringify(value))\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))\n throw new Error('Expected object')\n return parsed as Record<string, unknown>\n}\n\nfunction safePath(value: string): boolean {\n return /^[a-z0-9][\\w./-]*$/i.test(value) && !value.endsWith('/')\n && !value.split('/').some(segment => !segment || segment === '.' || segment === '..')\n}\n\nasync function checksum(bytes: Uint8Array): Promise<string> {\n const hash = await globalThis.crypto.subtle.digest('SHA-256', new Uint8Array(bytes).buffer)\n return Array.from(new Uint8Array(hash), byte => byte.toString(16).padStart(2, '0')).join('')\n}\n\nfunction objectFromFile(files: Readonly<Record<string, Uint8Array>>, path: string): Record<string, unknown> {\n const bytes = files[path]\n if (!bytes)\n throw new Error('Missing file')\n const parsed: unknown = JSON.parse(strFromU8(bytes))\n return jsonObject(parsed)\n}\n\nfunction evidenceFrom(value: unknown): FeedbackBundleEvidence {\n const record = jsonObject(value)\n if (typeof record.source !== 'string' || typeof record.kind !== 'string' || typeof record.timestamp !== 'number' || !Number.isFinite(record.timestamp))\n throw new Error('Invalid evidence')\n for (const key of ['id', 'requestId', 'errorId', 'missingReason']) {\n if (record[key] !== undefined && typeof record[key] !== 'string')\n throw new Error('Invalid evidence field')\n }\n if (record.sequence !== undefined && (typeof record.sequence !== 'number' || !Number.isSafeInteger(record.sequence) || record.sequence < 0))\n throw new Error('Invalid evidence sequence')\n return {\n source: record.source,\n kind: record.kind,\n timestamp: record.timestamp,\n ...(typeof record.id === 'string' ? { id: record.id } : {}),\n ...(typeof record.sequence === 'number' ? { sequence: record.sequence } : {}),\n ...(typeof record.requestId === 'string' ? { requestId: record.requestId } : {}),\n ...(typeof record.errorId === 'string' ? { errorId: record.errorId } : {}),\n ...(typeof record.missingReason === 'string' ? { missingReason: record.missingReason } : {}),\n ...(record.data !== undefined ? { data: record.data } : {}),\n }\n}\n\nfunction limitsFor(options: FeedbackBundleReadOptions = {}) {\n const limits = { maxFiles: options.maxFiles ?? MAX_FILES, maxBytes: options.maxBytes ?? MAX_BYTES, maxFileBytes: options.maxFileBytes ?? MAX_FILE_BYTES }\n if (Object.values(limits).some(value => !Number.isSafeInteger(value) || value <= 0))\n throw new Error('Invalid limits')\n return limits\n}\n\n/** 先检查 ZIP 中央目录,避免解压后才发现重复路径、符号链接或压缩炸弹。 */\nfunction preflight(bytes: Uint8Array, limits: ReturnType<typeof limitsFor>): void {\n if (bytes.byteLength > limits.maxBytes || bytes.byteLength < 22)\n throw new Error('Invalid archive size')\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n let end = -1\n for (let offset = bytes.length - 22; offset >= Math.max(0, bytes.length - 65557); offset--) {\n if (view.getUint32(offset, true) === 0x06054B50 && offset + 22 + view.getUint16(offset + 20, true) === bytes.length) {\n end = offset\n break\n }\n }\n if (end < 0 || view.getUint16(end + 4, true) !== 0 || view.getUint16(end + 6, true) !== 0)\n throw new Error('Invalid archive directory')\n const count = view.getUint16(end + 10, true)\n const size = view.getUint32(end + 12, true)\n let offset = view.getUint32(end + 16, true)\n if (count === 0 || count > limits.maxFiles || count !== view.getUint16(end + 8, true) || offset + size !== end)\n throw new Error('Invalid archive directory size')\n let total = 0\n const names = new Set<string>()\n for (let index = 0; index < count; index++) {\n if (offset + 46 > end || view.getUint32(offset, true) !== 0x02014B50)\n throw new Error('Invalid archive entry')\n const nameLength = view.getUint16(offset + 28, true)\n const next = offset + 46 + nameLength + view.getUint16(offset + 30, true) + view.getUint16(offset + 32, true)\n if (next > end)\n throw new Error('Invalid archive entry length')\n const name = strFromU8(bytes.subarray(offset + 46, offset + 46 + nameLength))\n const originalSize = view.getUint32(offset + 24, true)\n const method = view.getUint16(offset + 10, true)\n const mode = (view.getUint32(offset + 38, true) >>> 16) & 0xF000\n if (!safePath(name) || names.has(name.toLowerCase()) || originalSize > limits.maxFileBytes\n || (view.getUint16(offset + 8, true) & 1) || ![0, 8].includes(method) || (mode !== 0 && mode !== 0x8000)) {\n throw new Error('Unsafe archive entry')\n }\n total += originalSize\n if (total > limits.maxBytes)\n throw new Error('Archive expansion limit')\n names.add(name.toLowerCase())\n offset = next\n }\n if (offset !== end)\n throw new Error('Unexpected archive entry')\n}\n\nfunction parseManifest(value: Record<string, unknown>): FeedbackBundleManifest {\n if (value.format !== 'hai-feedback' || value.version !== 1 || typeof value.reportId !== 'string'\n || typeof value.evidenceRevision !== 'number' || !Number.isSafeInteger(value.evidenceRevision) || value.evidenceRevision < 0\n || typeof value.createdAt !== 'number' || !Number.isFinite(value.createdAt) || !Array.isArray(value.files)\n || !Array.isArray(value.missing) || value.missing.some(item => typeof item !== 'string')) {\n throw new Error('Unsupported manifest')\n }\n const files: FeedbackBundleFile[] = value.files.map((item) => {\n const file = jsonObject(item)\n if (typeof file.path !== 'string' || !safePath(file.path) || file.path === 'manifest.json'\n || typeof file.size !== 'number' || !Number.isSafeInteger(file.size) || file.size < 0\n || typeof file.sha256 !== 'string' || !SHA256.test(file.sha256)\n || !['report', 'evidence', 'history', 'attachment', 'summary', 'viewer'].includes(String(file.kind))) {\n throw new Error('Invalid manifest file')\n }\n return {\n path: file.path,\n size: file.size,\n sha256: file.sha256,\n kind: file.kind as FeedbackBundleFile['kind'],\n ...(typeof file.attachmentId === 'string' ? { attachmentId: file.attachmentId } : {}),\n ...(typeof file.name === 'string' ? { name: file.name } : {}),\n ...(typeof file.contentType === 'string' ? { contentType: file.contentType } : {}),\n }\n })\n if (new Set(files.map(file => file.path)).size !== files.length)\n throw new Error('Duplicate manifest file')\n return { format: 'hai-feedback', version: 1, reportId: value.reportId, evidenceRevision: value.evidenceRevision, createdAt: value.createdAt, missing: value.missing as string[], files }\n}\n\n/**\n * 生成含摘要、证据索引、附件与静态查看器的 ZIP;调用前应完成授权与脱敏。\n * @example\n * ```ts\n * import { createFeedbackBundle } from '@h-ai/feedback/bundle'\n * const result = await createFeedbackBundle({ report: { id: 'fb_1' }, evidence: [] })\n * if (result.success) { const bytes: Uint8Array = result.data }\n * ```\n */\nexport async function createFeedbackBundle<TReport extends { id: string }>(input: FeedbackBundleInput<TReport>): Promise<HaiResult<Uint8Array>> {\n try {\n if (input.createdAt !== undefined && (!Number.isSafeInteger(input.createdAt) || input.createdAt < 0))\n throw new Error('Invalid bundle creation time')\n const report = jsonObject(input.report)\n if (typeof report.id !== 'string' || !SAFE_ID.test(report.id))\n throw new Error('Invalid report')\n if (['appVersion', 'buildId', 'commit'].some(key => report[key] !== undefined && (typeof report[key] !== 'string' || report[key].length > 128)))\n throw new Error('Invalid build metadata')\n if (report.evidenceRevision !== undefined && (typeof report.evidenceRevision !== 'number' || !Number.isSafeInteger(report.evidenceRevision) || report.evidenceRevision < 0))\n throw new Error('Invalid evidence revision')\n const evidence = input.evidence.map(evidenceFrom)\n const history = (input.history ?? []).map(jsonObject)\n const missing = [...(input.missing ?? [])]\n if (missing.some(item => typeof item !== 'string'))\n throw new Error('Invalid missing evidence')\n const files: Record<string, Uint8Array> = {\n 'report.json': strToU8(JSON.stringify(report)),\n 'timeline.ndjson': strToU8(evidence.map(record => JSON.stringify(record)).join('\\n')),\n 'evidence/records.json': strToU8(JSON.stringify(evidence)),\n 'evidence/history.json': strToU8(JSON.stringify(history)),\n ...feedbackViewerFiles(),\n }\n const manifestFiles: FeedbackBundleFile[] = []\n const ids = new Set<string>()\n for (const attachment of input.attachments ?? []) {\n if (typeof attachment.id !== 'string' || attachment.id.length < 1 || attachment.id.length > 128 || ids.has(attachment.id) || attachment.bytes.byteLength > MAX_FILE_BYTES)\n throw new Error('Invalid attachment')\n ids.add(attachment.id)\n const suffix = ({ 'image/png': 'png', 'image/jpeg': 'jpg', 'image/webp': 'webp', 'video/webm': 'webm', 'video/mp4': 'mp4', 'text/plain': 'txt', 'application/json': 'json', 'application/pdf': 'pdf' } as Record<string, string>)[attachment.contentType] ?? 'bin'\n // 原始标识仅保存在清单,使用区分大小写且保留字符串编码的摘要构造安全路径。\n const path = `attachments/${await checksum(strToU8(JSON.stringify(attachment.id)))}.${suffix}`\n const hash = await checksum(attachment.bytes)\n if (attachment.checksum && attachment.checksum !== hash)\n throw new Error('Attachment checksum mismatch')\n files[path] = new Uint8Array(attachment.bytes)\n manifestFiles.push({ path, size: attachment.bytes.byteLength, sha256: hash, kind: 'attachment', attachmentId: attachment.id, name: attachment.name, contentType: attachment.contentType })\n }\n const manifest: FeedbackBundleManifest = { format: 'hai-feedback', version: 1, reportId: report.id, evidenceRevision: typeof report.evidenceRevision === 'number' ? report.evidenceRevision : 0, createdAt: input.createdAt ?? Date.now(), missing, files: manifestFiles }\n const temporary: FeedbackBundle = { report: { ...report, id: report.id }, evidence, history, manifest, files }\n files['summary.md'] = strToU8(summarizeFeedbackBundle(temporary))\n for (const [path, bytes] of Object.entries(files)) {\n if (manifestFiles.some(file => file.path === path))\n continue\n const kind = path === 'report.json' ? 'report' : path === 'summary.md' ? 'summary' : path.startsWith('viewer/') ? 'viewer' : path.endsWith('history.json') ? 'history' : 'evidence'\n manifest.files.push({ path, size: bytes.byteLength, sha256: await checksum(bytes), kind })\n }\n files['manifest.json'] = strToU8(JSON.stringify(manifest, null, 2))\n const total = Object.values(files).reduce((sum, file) => sum + file.byteLength, 0)\n if (Object.keys(files).length > MAX_FILES || total > Math.min(input.maxBytes ?? MAX_BYTES, MAX_BYTES) || Object.values(files).some(file => file.byteLength > MAX_FILE_BYTES))\n throw new Error('Bundle limits exceeded')\n return ok(zipSync(files, { level: 1, mtime: new Date(1980, 0, 1) }))\n }\n catch {\n return err(HaiCommonError.VALIDATION_ERROR, bundleM('invalid'))\n }\n}\n\n/**\n * 校验 ZIP 路径、容量、协议与所有文件的 SHA-256 后读取;不执行包内代码。\n * @example\n * ```ts\n * import { createFeedbackBundle, readFeedbackBundle } from '@h-ai/feedback/bundle'\n * const created = await createFeedbackBundle({ report: { id: 'fb_1' }, evidence: [] })\n * if (created.success) {\n * const parsed = await readFeedbackBundle(created.data, { maxBytes: 32 * 1024 * 1024 })\n * if (parsed.success) { const reportId: string = parsed.data.report.id }\n * }\n * ```\n */\nexport async function readFeedbackBundle(bytes: Uint8Array, options?: FeedbackBundleReadOptions): Promise<HaiResult<FeedbackBundle>> {\n try {\n const limits = limitsFor(options)\n preflight(bytes, limits)\n const files = unzipSync(bytes)\n const manifest = parseManifest(objectFromFile(files, 'manifest.json'))\n if (Object.keys(files).length !== manifest.files.length + 1)\n throw new Error('Unexpected bundle file')\n let total = 0\n for (const file of manifest.files) {\n const content = files[file.path]\n if (!content || content.byteLength !== file.size || content.byteLength > limits.maxFileBytes || await checksum(content) !== file.sha256)\n throw new Error('File integrity failed')\n total += content.byteLength\n }\n if (total > limits.maxBytes)\n throw new Error('Bundle expansion limit')\n const report = objectFromFile(files, 'report.json')\n if (['appVersion', 'buildId', 'commit'].some(key => report[key] !== undefined && (typeof report[key] !== 'string' || report[key].length > 128)))\n throw new Error('Invalid build metadata')\n if (typeof report.id !== 'string' || report.id !== manifest.reportId)\n throw new Error('Report mismatch')\n const records: unknown = JSON.parse(strFromU8(files['evidence/records.json'] ?? new Uint8Array()))\n const history: unknown = JSON.parse(strFromU8(files['evidence/history.json'] ?? new Uint8Array()))\n if (!Array.isArray(records) || !Array.isArray(history))\n throw new Error('Invalid evidence collection')\n return ok({ manifest, report: { ...report, id: report.id }, evidence: records.map(evidenceFrom), history: history.map(jsonObject), files })\n }\n catch {\n return err(HaiCommonError.VALIDATION_ERROR, bundleM('invalid'))\n }\n}\n\n/**\n * 生成人工与 AI 可读摘要,明确用户描述与采集事实。\n * @example\n * ```ts\n * import { createFeedbackBundle, readFeedbackBundle, summarizeFeedbackBundle } from '@h-ai/feedback/bundle'\n * const created = await createFeedbackBundle({ report: { id: 'fb_1' }, evidence: [] })\n * if (created.success) {\n * const parsed = await readFeedbackBundle(created.data)\n * if (parsed.success) { const markdown: string = summarizeFeedbackBundle(parsed.data) }\n * }\n * ```\n */\nexport function summarizeFeedbackBundle(bundle: FeedbackBundle): string {\n const report = bundle.report\n const safeText = (value: unknown) => typeof value === 'string' || typeof value === 'number' ? String(value).replaceAll('\\r', '').replaceAll('\\n', ' ') : ''\n return [\n `# ${bundleM('title')} ${safeText(report.number ?? report.id)}`,\n '',\n `## ${bundleM('user')}`,\n '',\n safeText(report.description) || bundleM('empty'),\n '',\n `## ${bundleM('facts')}`,\n '',\n `- ID: ${safeText(report.id)}`,\n `- App: ${safeText(report.appId)} ${safeText(report.appVersion)}`,\n `- Build: ${safeText(report.buildId)} ${safeText(report.commit)}`,\n `- Revision: ${bundle.manifest.evidenceRevision}`,\n `- ${bundleM('evidence')}: ${bundle.evidence.length}`,\n `- ${bundleM('attachments')}: ${bundle.manifest.files.filter(file => file.kind === 'attachment').length}`,\n '',\n `## ${bundleM('missing')}`,\n '',\n ...bundle.manifest.missing.map(reason => `- ${safeText(reason)}`),\n '',\n ].join('\\n')\n}\n\n/**\n * 通过时间、请求、错误与类型筛选离线证据;错误按锚点来源和请求取前后各 100 条,分页最大 100 条。\n * @example\n * ```ts\n * import { createFeedbackBundle, queryFeedbackBundle, readFeedbackBundle } from '@h-ai/feedback/bundle'\n * const created = await createFeedbackBundle({ report: { id: 'fb_1' }, evidence: [] })\n * if (created.success) {\n * const parsed = await readFeedbackBundle(created.data)\n * if (parsed.success) { const page = queryFeedbackBundle(parsed.data, { requestId: 'req_1', page: 1, pageSize: 20 }) }\n * }\n * ```\n */\nexport function queryFeedbackBundle(bundle: FeedbackBundle, query: FeedbackBundleQuery = {}): FeedbackBundleEvidencePage {\n const page = Number.isSafeInteger(query.page) && (query.page ?? 0) > 0 ? query.page! : 1\n const pageSize = Number.isSafeInteger(query.pageSize) && (query.pageSize ?? 0) > 0 ? Math.min(100, query.pageSize!) : 20\n let candidates = bundle.evidence\n if (query.errorId) {\n const anchor = candidates.find(item => item.kind === 'error' && item.errorId === query.errorId)\n if (!anchor)\n return { items: [], total: 0, page, pageSize }\n const anchorSequence = anchor.sequence ?? anchor.timestamp\n const context = candidates.filter(item => item.source === anchor.source && item.requestId === anchor.requestId && ['log', 'error'].includes(item.kind))\n const before = context.filter(item => (item.sequence ?? item.timestamp) <= anchorSequence).sort((left, right) => (right.sequence ?? right.timestamp) - (left.sequence ?? left.timestamp)).slice(0, 101)\n const after = context.filter(item => (item.sequence ?? item.timestamp) > anchorSequence).sort((left, right) => (left.sequence ?? left.timestamp) - (right.sequence ?? right.timestamp)).slice(0, 100)\n const window = new Set([...before, ...after])\n candidates = candidates.filter(item => window.has(item))\n }\n const records = candidates.filter(item => (!query.kind || item.kind === query.kind)\n && (!query.requestId || item.requestId === query.requestId)\n && (query.from === undefined || item.timestamp >= query.from) && (query.to === undefined || item.timestamp <= query.to))\n .sort((left, right) => left.timestamp - right.timestamp || left.source.localeCompare(right.source) || (left.sequence ?? 0) - (right.sequence ?? 0))\n return { items: records.slice((page - 1) * pageSize, page * pageSize), total: records.length, page, pageSize }\n}\n\n/**\n * 获取内置可信离线查看器;本地服务必须使用此资源而不是执行导入包中的脚本。\n * @example\n * ```ts\n * import { getFeedbackBundleViewerFiles } from '@h-ai/feedback/bundle'\n * const html: Uint8Array | undefined = getFeedbackBundleViewerFiles()['viewer/index.html']\n * ```\n */\nexport function getFeedbackBundleViewerFiles(): Readonly<Record<string, Uint8Array>> {\n return feedbackViewerFiles()\n}\n","import type { FeedbackBundle } from '@h-ai/feedback/bundle'\nimport type { GlobalOptions } from '../cli-types.js'\nimport { randomBytes } from 'node:crypto'\nimport { readFile, stat } from 'node:fs/promises'\nimport { createServer } from 'node:http'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { getFeedbackBundleViewerFiles, queryFeedbackBundle, readFeedbackBundle, summarizeFeedbackBundle } from '@h-ai/feedback/bundle'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliMessage } from '../cli-utils.js'\n\n/**\n * 本地离线分析选项,不包含任何生产连接或凭据。\n * @example\n * ```ts\n * import type { FeedbackCommandOptions } from './cli-feedback.js'\n * const options: FeedbackCommandOptions = { page: 1, pageSize: 20, requestId: 'request-1' }\n * ```\n */\nexport interface FeedbackCommandOptions extends GlobalOptions {\n page?: number\n pageSize?: number\n kind?: string\n requestId?: string\n errorId?: string\n from?: number\n to?: number\n port?: number\n}\n\n/**\n * 本机查看器句柄,宿主负责在取消或退出时关闭。\n * @example\n * ```ts\n * import type { FeedbackViewer } from './cli-feedback.js'\n * async function closeViewer(viewer: FeedbackViewer) { await viewer.close() }\n * ```\n */\nexport interface FeedbackViewer {\n url: string\n close: () => Promise<void>\n}\n\n/**\n * 启动只监听 loopback 的离线查看器,使用内置代码和已校验数据。\n * @throws Error - 端口或本机监听失败。\n * @example\n * ```ts\n * import { createFeedbackBundle, readFeedbackBundle } from '@h-ai/feedback/bundle'\n * import { startFeedbackViewer } from './cli-feedback.js'\n * const created = await createFeedbackBundle({ report: { id: 'report-1' }, evidence: [] })\n * if (created.success) {\n * const parsed = await readFeedbackBundle(created.data)\n * if (parsed.success) {\n * const viewer = await startFeedbackViewer(parsed.data)\n * try { await fetch(viewer.url) } finally { await viewer.close() }\n * }\n * }\n * ```\n */\nexport async function startFeedbackViewer(bundle: FeedbackBundle, options: { port?: number } = {}): Promise<FeedbackViewer> {\n const port = options.port ?? 0\n if (!Number.isSafeInteger(port) || port < 0 || port > 65535)\n throw new Error(cliM('cli_feedback_invalidOptions'))\n const prefix = `/${randomBytes(18).toString('hex')}/`\n const trustedViewer = getFeedbackBundleViewerFiles()\n const server = createServer((request, response) => {\n response.setHeader('X-Content-Type-Options', 'nosniff')\n response.setHeader('Cache-Control', 'no-store')\n response.setHeader('Cross-Origin-Resource-Policy', 'same-origin')\n response.setHeader('Content-Security-Policy', 'default-src \\'none\\'; script-src \\'self\\'; style-src \\'self\\' \\'unsafe-inline\\'; img-src \\'self\\' blob: data:; media-src \\'self\\' blob:; connect-src \\'self\\'; frame-src \\'self\\' about: blob:; font-src \\'self\\' data:; base-uri \\'none\\'; form-action \\'none\\'; frame-ancestors \\'none\\'')\n const address = server.address()\n const host = address && typeof address === 'object' ? `127.0.0.1:${address.port}` : ''\n if (request.headers.host !== host || request.method !== 'GET' || !request.url?.startsWith(prefix)) {\n response.writeHead(404).end()\n return\n }\n const requested = request.url.slice(prefix.length).split('?')[0]\n if (!requested) {\n response.writeHead(302, { Location: `${prefix}viewer/index.html` }).end()\n return\n }\n // 包内同名 JS 即使重算 checksum 也不能替换框架内置查看器。\n const bytes = requested.startsWith('viewer/') ? trustedViewer[requested] : bundle.files[requested]\n if (!bytes || requested.includes('%') || requested.includes('..') || requested.includes('\\\\')) {\n response.writeHead(404).end()\n return\n }\n const viewerTypes: Record<string, string> = { 'viewer/index.html': 'text/html; charset=utf-8', 'viewer/app.js': 'text/javascript; charset=utf-8', 'viewer/replay.js': 'text/javascript; charset=utf-8', 'viewer/style.css': 'text/css; charset=utf-8' }\n const attachment = bundle.manifest.files.find(file => file.path === requested && file.kind === 'attachment')\n const mediaType = attachment && ['image/png', 'image/jpeg', 'image/webp', 'video/webm', 'video/mp4'].includes(attachment.contentType ?? '') ? attachment.contentType : undefined\n const contentType = viewerTypes[requested] ?? mediaType ?? (requested.endsWith('.json') ? 'application/json; charset=utf-8' : 'text/plain; charset=utf-8')\n response.setHeader('Content-Type', contentType)\n if (requested.startsWith('attachments/') && !mediaType)\n response.setHeader('Content-Disposition', 'attachment')\n response.writeHead(200).end(bytes)\n })\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject)\n server.listen(port, '127.0.0.1', () => {\n server.removeListener('error', reject)\n resolve()\n })\n })\n const address = server.address()\n if (!address || typeof address !== 'object')\n throw new Error(cliM('cli_feedback_invalidOptions'))\n return {\n url: `http://127.0.0.1:${address.port}${prefix}viewer/index.html`,\n close: () => new Promise<void>((resolve, reject) => {\n server.close(error => error ? reject(error) : resolve())\n server.closeAllConnections()\n }),\n }\n}\n\n/**\n * 离线读取问题包,输出摘要、manifest 或证据分页,或启动本机查看器。\n * @throws Error - 参数、文件或包校验失败。\n * @example\n * ```ts\n * import { feedbackCommand } from './cli-feedback.js'\n * await feedbackCommand('summary', './feedback-FB-1.zip', { page: 1 })\n * ```\n */\nexport async function feedbackCommand(action: string, bundlePath: string, options: FeedbackCommandOptions = {}): Promise<void> {\n if (!['inspect', 'summary', 'evidence', 'view'].includes(action))\n throw new Error(cliM('cli_feedback_invalidAction'))\n const filePath = path.resolve(options.cwd ?? process.cwd(), bundlePath)\n const metadata = await stat(filePath)\n if (!metadata.isFile() || metadata.size > 64 * 1024 * 1024)\n throw new Error(cliM('cli_feedback_invalidBundle'))\n const result = await readFeedbackBundle(await readFile(filePath))\n if (!result.success)\n throw new Error(result.error.message)\n const bundle = result.data\n if (action === 'summary') {\n writeCliMessage(summarizeFeedbackBundle(bundle))\n return\n }\n if (action === 'inspect') {\n writeCliMessage(JSON.stringify(bundle.manifest, null, 2))\n return\n }\n if (action === 'evidence') {\n for (const value of [options.page, options.pageSize]) {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 1))\n throw new Error(cliM('cli_feedback_invalidOptions'))\n }\n for (const value of [options.from, options.to]) {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 0))\n throw new Error(cliM('cli_feedback_invalidOptions'))\n }\n if (options.from !== undefined && options.to !== undefined && options.from > options.to)\n throw new Error(cliM('cli_feedback_invalidOptions'))\n writeCliMessage(JSON.stringify(queryFeedbackBundle(bundle, options), null, 2))\n return\n }\n const viewer = await startFeedbackViewer(bundle, options)\n writeCliMessage(cliM('cli_feedback_viewerStarted', { params: { url: viewer.url } }))\n await new Promise<void>((resolve, reject) => {\n const stop = () => {\n process.off('SIGINT', stop)\n process.off('SIGTERM', stop)\n viewer.close().then(resolve, reject)\n }\n process.once('SIGINT', stop)\n process.once('SIGTERM', stop)\n })\n}\n","import type { TemplateContext } from '../cli-types.js'\nimport type { GenerateTarget } from './cli-generate-target.js'\nimport path from 'node:path'\nimport fse from 'fs-extra'\nimport { cliM } from '../cli-i18n.js'\n\n/**\n * 一批经过预检后统一写入的生成文件。\n * 普通生成文件不携带 previousContent;已有聚合入口必须携带原内容,用于提交前检测并发修改。\n * @example 模块内部上下文\n * ```ts\n * const file: GeneratedFile = { path: path.resolve('src/server/procedures/orders.ts'), content: 'export const orderName = \\'orders\\'\\n' }\n * ```\n */\nexport interface GeneratedFile {\n /** 输出文件的绝对路径。 */\n path: string\n /** 写入后的完整源码。 */\n content: string\n /** 仅聚合文件编辑携带原内容;写入前校验文件没有被其他操作修改。 */\n previousContent?: string\n}\n\n/**\n * 只在唯一生成标记前插入一项;import 保持组内相对顺序,重复完整行保持原文。\n * @param source - 现有聚合文件的完整内容。\n * @param marker - 模板约定的唯一标记。\n * @param entry - 待插入的完整 import/export 或对象项。\n * @returns 更新后的完整文件内容;标记重复或缺失时抛错。\n * @example 模块内部上下文\n * ```ts\n * const marker = '// @hai-generator:contracts:entries'\n * const source = appendAt(`const contracts = {\\n${marker}\\n}`, marker, ' orders: ordersContract,')\n * ```\n */\nfunction appendAt(source: string, marker: string, entry: string): string {\n if (source.split(marker).length !== 2)\n throw new Error(cliM('cli_generateUnsupportedAggregator'))\n if (source.split(/\\r?\\n/).some(line => line.trim() === entry.trim()))\n return source\n // 模板的相对 import 均为单行;插在同组正确位置,避免增量生成破坏排序门禁。\n const moduleName = /^import .+ from ['\"](.+)['\"]$/.exec(entry)?.[1]\n if (moduleName) {\n for (const match of source.matchAll(/^import (?!type\\b)[^\\r\\n]+ from ['\"](\\.[^'\"]+)['\"]\\r?$/gm)) {\n if (match[1]!.localeCompare(moduleName) > 0)\n return `${source.slice(0, match.index)}${entry}\\n${source.slice(match.index)}`\n }\n }\n return source.replace(marker, `${entry}\\n${marker}`)\n}\n\n/**\n * 沿服务端依赖图生成 contract 与 procedure,并接入模板已有的聚合入口。\n * @param context - 已通过标识符校验的名称。\n * @param target - 解析后的后端 workspace 与共享 contract 包。\n * @returns 新源码及现有入口的完整修改计划,不在本函数落盘。\n * @throws Error - contract 包不唯一或入口不再具有可识别的生成标记。\n * @example 模块内部上下文\n * ```ts\n * // 前提:在 CLI 生成的 fullstack 根执行;后端包为 shop-serv。\n * const { resolveGenerateTarget } = await import('./cli-generate-target.js')\n * const { createTemplateContext } = await import('../cli-utils.js')\n * const target = await resolveGenerateTarget({ cwd: process.cwd(), type: 'api', name: 'orders', workspace: 'shop-serv' })\n * const files = await generateServApi(createTemplateContext('orders'), target)\n * // 这里只返回计划;由 generate 统一预检、写入与失败回滚。\n * ```\n */\nexport async function generateServApi(context: TemplateContext, target: GenerateTarget): Promise<GeneratedFile[]> {\n const contracts = target.packages.filter(pkg => pkg.dependencies['@h-ai/api-contract'] && pkg.dependencies.zod && pkg.name in target.target.dependencies)\n if (contracts.length !== 1)\n throw new Error(cliM('cli_generateUnsupportedAggregator'))\n const contract = contracts[0]!\n const contractSources = await fse.readdir(path.join(contract.directory, 'src'))\n const aggregators: Array<{ path: string, content: string }> = []\n for (const name of contractSources.filter(name => name.endsWith('.ts'))) {\n const file = path.join(contract.directory, 'src', name)\n const content = await fse.readFile(file, 'utf8')\n if (content.includes('// @hai-generator:contracts:entries'))\n aggregators.push({ path: file, content })\n }\n if (aggregators.length !== 1)\n throw new Error(cliM('cli_generateUnsupportedAggregator'))\n const aggregator = aggregators[0]!\n const contractIndex = path.join(contract.directory, 'src/index.ts')\n const procedureIndex = path.join(target.target.directory, 'src/server/procedures/index.ts')\n const indexSource = await fse.readFile(contractIndex, 'utf8')\n const procedureSource = await fse.readFile(procedureIndex, 'utf8')\n const contractName = `${context.camelCase}Contract`\n const factoryName = `create${context.pascalCase}Procedures`\n const domainMarker = `// @hai-generator:domain ${context.camelCase}`\n const contractFile = path.join(contract.directory, 'src', `${context.kebabCase}-contract.ts`)\n const procedureFile = path.join(target.target.directory, 'src/server/procedures', `${context.kebabCase}-procedures.ts`)\n const importLine = `import { ${contractName} } from './${context.kebabCase}-contract.js'`\n const entryLine = ` ${context.camelCase}: ${contractName},`\n const factoryImport = `import { ${factoryName} } from './${context.kebabCase}-procedures.js'`\n const domainProperty = new RegExp(`^\\\\s*(?:${context.camelCase}|['\"]${context.camelCase}['\"]):`, 'm')\n if (domainProperty.test(aggregator.content) || domainProperty.test(procedureSource)) {\n for (const file of [contractFile, procedureFile]) {\n if (!await fse.pathExists(file) || !(await fse.readFile(file, 'utf8')).includes(domainMarker))\n throw new Error(cliM('cli_generateDomainExists', { params: { name: context.camelCase } }))\n }\n }\n const contractContent = `${domainMarker}\nimport { apiContract } from '@h-ai/api-contract'\nimport { z } from 'zod'\n\n/**\n * ${context.pascalCase} 示例契约:GET 列表与 POST 校验回显,不执行持久写入。\n * @example client.${context.camelCase}.create({ name: 'Example' })\n */\nexport const ${contractName} = {\n list: apiContract\n .route({ method: 'GET', path: '/${context.kebabCase}', operationId: '${context.camelCase}.list', tags: ['${context.kebabCase}'] })\n .output(apiContract.haiResultSchema(z.object({ items: z.array(z.object({ name: z.string() })) }))),\n create: apiContract\n .route({ method: 'POST', path: '/${context.kebabCase}', operationId: '${context.camelCase}.create', tags: ['${context.kebabCase}'] })\n .input(z.object({ name: z.string().min(1) }))\n .output(apiContract.haiResultSchema(z.object({ name: z.string() }))),\n}\n`\n const procedureContent = `${domainMarker}\nimport type { ServContext } from '@h-ai/serv'\nimport { ok } from '@h-ai/core'\nimport { serv } from '@h-ai/serv'\nimport { ${contractName} } from '${contract.name}'\n\n/**\n * 创建 ${context.pascalCase} 示例过程;新增持久写入前接入授权与业务服务。\n * @returns 与共享契约一致的公开过程;示例不访问用户数据。\n * @example const procedures = { ${context.camelCase}: ${factoryName}() }\n */\nexport function ${factoryName}() {\n return serv\n .implement(${contractName})\n .context<ServContext>()\n .route('list', () => ok({ items: [] }))\n .route('create', ({ input }) => ok({ name: input.name }))\n .build()\n}\n`\n return [\n { path: contractFile, content: contractContent },\n { path: procedureFile, content: procedureContent },\n { path: aggregator.path, previousContent: aggregator.content, content: appendAt(appendAt(aggregator.content, '// @hai-generator:contracts:imports', importLine), ' // @hai-generator:contracts:entries', entryLine) },\n { path: contractIndex, previousContent: indexSource, content: appendAt(indexSource, '// @hai-generator:contracts:exports', `export * from './${context.kebabCase}-contract.js'`) },\n { path: procedureIndex, previousContent: procedureSource, content: appendAt(appendAt(procedureSource, '// @hai-generator:procedures:imports', factoryImport), ' // @hai-generator:procedures:entries', ` ${context.camelCase}: ${factoryName}(),`) },\n ]\n}\n","import type { GenerateOptions } from '../cli-types.js'\nimport { glob } from 'node:fs/promises'\nimport path from 'node:path'\nimport fse from 'fs-extra'\nimport { parse } from 'yaml'\nimport { cliM } from '../cli-i18n.js'\n\n/**\n * 生成目标与实际 workspace 清单;根目录同时作为跨包输出的安全边界。\n * @example 模块内部上下文\n * ```ts\n * const pkg: GeneratePackage = { directory: path.resolve('apps/shop'), name: 'shop', dependencies: { '@sveltejs/kit': '^2' } }\n * const target: GenerateTarget = { root: path.resolve('.'), target: pkg, packages: [pkg] }\n * ```\n */\nexport interface GenerateTarget {\n /** 真实工作区根路径。 */\n root: string\n /** 当前命令选中的应用包。 */\n target: GeneratePackage\n /** 工作区中可消费的包;仅包含根目录内的真实路径。 */\n packages: GeneratePackage[]\n}\n\n/**\n * 生成器实际使用的 package.json 字段。\n * @example 模块内部上下文\n * ```ts\n * const pkg: GeneratePackage = { directory: path.resolve('packages/shop-serv'), name: 'shop-serv', dependencies: { '@h-ai/serv': '*' } }\n * const architecture = generateArchitecture(pkg) // serv\n * ```\n */\nexport interface GeneratePackage {\n /** 包的绝对真实目录。 */\n directory: string\n /** package.json.name,缺省使用目录名。 */\n name: string\n /** 运行依赖和开发依赖的合并视图。 */\n dependencies: Record<string, string>\n}\n\n/**\n * 以 path.relative 检查真实路径包含关系,拒绝同名前缀的兄弟目录;调用方先解析符号链接。\n * @param root - 允许输出的真实根目录。\n * @param file - 已解析的绝对目标或现存祖先目录。\n * @returns 目标等于根目录或位于根目录内时为 true。\n * @example 模块内部上下文\n * ```ts\n * const root = path.resolve('shop')\n * const valid = isInside(root, path.join(root, 'src/orders.ts')) // true\n * const sibling = isInside(root, `${root}-other/orders.ts`) // false\n * ```\n */\nfunction isInside(root: string, file: string): boolean {\n const relative = path.relative(root, file)\n return relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative)\n}\n\n/** 只读取生成器需要的已校验包字段,不执行应用配置。 */\nasync function readPackage(directory: string): Promise<GeneratePackage | undefined> {\n if (!await fse.pathExists(path.join(directory, 'package.json')))\n return undefined\n const value: unknown = await fse.readJson(path.join(directory, 'package.json'))\n if (!value || typeof value !== 'object' || Array.isArray(value))\n throw new Error(cliM('cli_generateUnsupportedProject'))\n const dependencies: Record<string, string> = {}\n for (const key of ['dependencies', 'devDependencies']) {\n const entries = key in value ? Reflect.get(value, key) : undefined\n if (entries && typeof entries === 'object' && !Array.isArray(entries)) {\n for (const [name, version] of Object.entries(entries)) {\n if (typeof version === 'string')\n dependencies[name] = version\n }\n }\n }\n const name = 'name' in value && typeof value.name === 'string' ? value.name : path.basename(directory)\n if (!/^(?:@[\\w.-]+\\/)?[\\w.-]+$/.test(name))\n throw new Error(cliM('cli_generateUnsupportedProject'))\n return { directory, name, dependencies }\n}\n\n/**\n * 按实际依赖辨认路由能力;纯 Vite 不具备 SvelteKit 的文件路由。\n * @param pkg - 已校验的包清单。\n * @returns 应用实际安装的框架类型。\n * @example 模块内部上下文\n * ```ts\n * const architecture = generateArchitecture({ directory: path.resolve('.'), name: 'shop-serv', dependencies: { '@h-ai/serv': '*' } }) // serv\n * ```\n */\nexport function generateArchitecture(pkg: GeneratePackage): 'sveltekit' | 'serv' | 'svelte' | 'other' {\n if (pkg.dependencies['@sveltejs/kit'])\n return 'sveltekit'\n if (pkg.dependencies['@h-ai/serv'])\n return 'serv'\n return pkg.dependencies.svelte ? 'svelte' : 'other'\n}\n\n/**\n * 从当前包或 pnpm 工作区解析唯一可消费的目标;歧义要求显式 --workspace。\n * @param options - 命令选项;workspace 可为包名或根目录内相对路径。\n * @returns 目标包及受信路径边界。\n * @throws Error - 项目类型未知、包不存在、路径越界或存在多个适用包。\n * @example 模块内部上下文\n * ```ts\n * // 前提:当前 fullstack 工程中存在 shop-serv 后端包。\n * const target = await resolveGenerateTarget({ cwd: process.cwd(), type: 'api', name: 'orders', workspace: 'shop-serv' })\n * const serviceDirectory = target.target.directory\n * ```\n */\nexport async function resolveGenerateTarget(options: GenerateOptions): Promise<GenerateTarget> {\n const cwd = await fse.realpath(path.resolve(options.cwd ?? '.'))\n let root = cwd\n for (let current = cwd; ; current = path.dirname(current)) {\n if (await fse.pathExists(path.join(current, 'pnpm-workspace.yaml'))) {\n root = current\n break\n }\n if (path.dirname(current) === current)\n break\n }\n const packages: GeneratePackage[] = []\n const addPackage = async (directory: string) => {\n if (!isInside(root, directory))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n const real = await fse.realpath(directory)\n if (!isInside(root, real))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n const pkg = await readPackage(real)\n if (pkg && !packages.some(value => value.directory === real))\n packages.push(pkg)\n }\n await addPackage(root)\n if (await fse.pathExists(path.join(root, 'pnpm-workspace.yaml'))) {\n const workspace: unknown = parse(await fse.readFile(path.join(root, 'pnpm-workspace.yaml'), 'utf8'))\n const patterns = workspace && typeof workspace === 'object' && 'packages' in workspace && Array.isArray(workspace.packages) ? workspace.packages : []\n for (const pattern of patterns) {\n if (typeof pattern !== 'string' || pattern.startsWith('!') || pattern.split(/[\\\\/]/).includes('..') || path.isAbsolute(pattern))\n throw new Error(cliM('cli_generateUnsupportedProject'))\n for await (const manifest of glob(`${pattern}/package.json`, { cwd: root, exclude: ['**/node_modules/**'] }))\n await addPackage(path.dirname(path.resolve(root, manifest)))\n }\n }\n if (cwd !== root)\n await addPackage(cwd)\n const selected = options.workspace\n ? packages.filter(pkg => pkg.name === options.workspace || pkg.directory === path.resolve(root, options.workspace!))\n : packages.filter(pkg => pkg.directory === cwd)\n const applicable = (pkg: GeneratePackage) => {\n const architecture = generateArchitecture(pkg)\n return options.type === 'api'\n ? architecture === 'serv' || (architecture === 'sveltekit' && Boolean(pkg.dependencies['@h-ai/kit']) && Boolean(pkg.dependencies.zod))\n : options.type === 'page'\n ? architecture === 'sveltekit'\n : options.type === 'component'\n ? ['sveltekit', 'svelte'].includes(architecture)\n : Object.keys(pkg.dependencies).some(name => name.startsWith('@h-ai/'))\n }\n const candidates = options.workspace || (selected.length === 1 && (cwd !== root || applicable(selected[0]!))) ? selected.filter(applicable) : packages.filter(applicable)\n if (candidates.length !== 1)\n throw new Error(cliM(candidates.length > 1 ? 'cli_generateAmbiguousWorkspace' : 'cli_generateUnsupportedProject'))\n const target = candidates[0]!\n if (generateArchitecture(target) === 'sveltekit' && (options.type === 'page' || options.type === 'api')) {\n // 不执行应用 JS 配置;明确使用 kit.files 定制布局时拒绝猜测默认路由目录。\n for (const name of ['svelte.config.js', 'svelte.config.mjs', 'svelte.config.cjs', 'svelte.config.ts']) {\n const configFile = path.join(target.directory, name)\n if (await fse.pathExists(configFile) && /\\bfiles\\s*[:.[(]/.test(await fse.readFile(configFile, 'utf8')))\n throw new Error(cliM('cli_generateCustomRoutes'))\n }\n }\n return { root, target, packages }\n}\n","/**\n * @h-ai/cli — 代码生成命令\n * @module cli-generate\n */\n\nimport type { GenerateOptions, GeneratorType, TemplateContext } from '../cli-types.js'\nimport type { GeneratedFile } from './cli-generate-serv.js'\nimport { randomUUID } from 'node:crypto'\nimport path from 'node:path'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { createTemplateContext, writeCliError, writeCliMessage } from '../cli-utils.js'\nimport { generateServApi } from './cli-generate-serv.js'\nimport { generateArchitecture, resolveGenerateTarget } from './cli-generate-target.js'\n\n/**\n * 生成器配置\n */\nconst GENERATORS: Record<GeneratorType, {\n description: () => string\n defaultPath: string\n generate: (context: TemplateContext, outputDir: string) => Promise<Array<{ path: string, content: string }>>\n}> = {\n page: {\n description: () => cliM('cli_generatePageDescription'),\n defaultPath: 'src/routes',\n generate: generatePage,\n },\n component: {\n description: () => cliM('cli_generateComponentDescription'),\n defaultPath: 'src/lib/components',\n generate: generateComponent,\n },\n api: {\n description: () => cliM('cli_generateApiDescription'),\n defaultPath: 'src/routes/api',\n generate: generateApi,\n },\n model: {\n description: () => cliM('cli_generateModelDescription'),\n defaultPath: 'src/lib/models',\n generate: generateModel,\n },\n migration: {\n description: () => cliM('cli_generateMigrationDescription'),\n defaultPath: 'migrations',\n generate: generateMigration,\n },\n}\n\n/**\n * 按实际应用/workspace 架构生成代码,并在文件写入失败时回滚本次修改。\n * @param options - 生成类型、名称、workspace 及覆盖选项。\n * @returns 文件生成并接入已有路由入口后完成。\n * @throws Error | AggregateError - 架构不支持、路径/覆盖冲突,或写入及回滚失败。\n * @example 模块内部上下文\n * ```ts\n * // 前提:当前工程是 CLI 创建的 fullstack,shop-serv 含可识别的聚合标记。\n * await generate({ cwd: process.cwd(), workspace: 'shop-serv', type: 'api', name: 'orders' })\n * // 等价:hai g api orders --workspace shop-serv;不支持纯 Vite 文件路由时会拒绝。\n * ```\n */\nexport async function generate(options: GenerateOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? '.'\n\n try {\n // 交互式获取选项\n const resolvedOptions = await resolveGenerateOptions(options)\n const generator = GENERATORS[resolvedOptions.type]\n\n // 名称会同时进入路径、标识符与源码字符串,禁止路径片段和代码字符。\n if (!/^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/i.test(resolvedOptions.name))\n throw new Error(cliM('cli_invalidGenerateName'))\n\n const target = await resolveGenerateTarget(resolvedOptions)\n const architecture = generateArchitecture(target.target)\n const outputDir = path.resolve(target.target.directory, resolvedOptions.output || generator.defaultPath)\n // 文件路由必须在真实应用的路由目录内,不能生成不会被消费的“页面”。\n if (['page', 'api'].includes(resolvedOptions.type) && architecture === 'sveltekit') {\n const routes = path.join(target.target.directory, 'src/routes')\n if (!outputDir.startsWith(routes + path.sep) && outputDir !== routes)\n throw new Error(cliM('cli_generateInvalidRouteOutput'))\n }\n if (resolvedOptions.type === 'api' && architecture === 'serv' && resolvedOptions.output)\n throw new Error(cliM('cli_generateInvalidRouteOutput'))\n const relativeOutput = path.relative(target.root, outputDir)\n if (relativeOutput === '..' || relativeOutput.startsWith(`..${path.sep}`) || path.isAbsolute(relativeOutput))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n\n const context = createTemplateContext(resolvedOptions.name, {\n projectName: target.target.name,\n })\n\n spinner.start(cliM('cli_generateProgress', { params: { description: generator.description() } }))\n\n const files = resolvedOptions.type === 'api' && architecture === 'serv'\n ? await generateServApi(context, target)\n : await generator.generate(context, outputDir)\n await writeGeneratedFiles(files, target.root, resolvedOptions.force)\n\n spinner.succeed(cliM('cli_generateComplete'))\n\n writeCliMessage('')\n writeCliMessage(cliM('cli_generateFiles'))\n files.forEach((file) => {\n writeCliMessage(chalk.cyan(` ${path.relative(cwd, file.path)}`))\n })\n writeCliMessage('')\n }\n catch (error) {\n spinner.fail(cliM('cli_generateFailed'))\n writeCliError(cliM('cli_generateFailureDetail'), { error })\n if (error instanceof AggregateError) {\n for (const cause of error.errors)\n writeCliError(cliM('cli_generateFailureDetail'), { error: cause })\n }\n throw error\n }\n}\n\n/**\n * 解析生成选项\n */\nasync function resolveGenerateOptions(options: GenerateOptions): Promise<Required<GenerateOptions>> {\n const questions: prompts.PromptObject<'type' | 'name'>[] = []\n\n if (!options.type) {\n questions.push({\n type: 'select',\n name: 'type',\n message: cliM('cli_generateTypePrompt'),\n choices: Object.entries(GENERATORS).map(([key, value]) => ({\n title: `${key} - ${value.description()}`,\n value: key,\n })),\n })\n }\n\n if (!options.name) {\n questions.push({\n type: 'text',\n name: 'name',\n message: cliM('cli_generateNamePrompt'),\n validate: (value: string) => {\n if (!value.trim())\n return cliM('cli_generateNameRequired')\n return true\n },\n })\n }\n\n const answers = questions.length > 0\n ? await prompts<'type' | 'name'>(questions, { onCancel: () => { throw new Error(cliM('cli_generateCancelled')) } })\n : {}\n const type: unknown = options.type || ('type' in answers ? answers.type : undefined)\n const name: unknown = options.name || ('name' in answers ? answers.name : undefined)\n if (!isGeneratorType(type))\n throw new Error(cliM('cli_generateUnknownType', { params: { type: String(type ?? '') } }))\n if (typeof name !== 'string' || !name.trim())\n throw new Error(cliM('cli_generateNameRequired'))\n\n return {\n type,\n name,\n output: options.output ?? '',\n force: options.force ?? false,\n verbose: options.verbose ?? false,\n cwd: options.cwd ?? '.',\n workspace: options.workspace ?? '',\n }\n}\n\n/** 校验真实生成类型,避免未识别参数或对象原型成员绕过提示。 */\nfunction isGeneratorType(value: unknown): value is GeneratorType {\n return typeof value === 'string' && Object.hasOwn(GENERATORS, value)\n}\n\n/**\n * 先校验全部路径与覆盖条件,再暂存并逐个提交;失败时只回滚仍等于本次内容的文件,保留外部并发修改。\n * @param files - 生成文件计划;聚合入口必须携带原内容。\n * @param root - 已解析的真实 workspace 根目录。\n * @param force - 仅允许覆盖普通生成文件,不绕过聚合入口的原内容检查。\n * @returns 所有文件提交及临时文件清理完成。\n * @example 模块内部上下文\n * ```ts\n * const root = await fse.realpath(process.cwd())\n * const file = path.join(root, 'src/lib/models/order-item.ts')\n * await writeGeneratedFiles([{ path: file, content: 'export interface OrderItem { id: string }\\n' }], root, false)\n * ```\n */\nasync function writeGeneratedFiles(files: GeneratedFile[], root: string, force: boolean): Promise<void> {\n if (new Set(files.map(file => path.resolve(file.path))).size !== files.length)\n throw new Error(cliM('cli_generateUnsupportedAggregator'))\n const previous = new Map<string, string | undefined>()\n const stages = new Map<string, string>()\n const written: GeneratedFile[] = []\n const failures: unknown[] = []\n for (const file of files) {\n const relativeFile = path.relative(root, file.path)\n if (relativeFile === '..' || relativeFile.startsWith(`..${path.sep}`) || path.isAbsolute(relativeFile))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n let ancestor = file.path\n while (!await fse.pathExists(ancestor))\n ancestor = path.dirname(ancestor)\n const relative = path.relative(root, await fse.realpath(ancestor))\n if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n const content = await fse.pathExists(file.path) ? await fse.readFile(file.path, 'utf8') : undefined\n if (file.previousContent !== undefined ? content !== file.previousContent : content !== undefined && !force)\n throw new Error(cliM('cli_generateExists', { params: { path: file.path } }))\n previous.set(file.path, content)\n }\n try {\n for (const file of files) {\n await fse.ensureDir(path.dirname(file.path))\n const stage = path.join(path.dirname(file.path), `.${path.basename(file.path)}.${randomUUID()}.tmp`)\n stages.set(file.path, stage)\n await fse.writeFile(stage, file.content, { encoding: 'utf8', flag: 'wx' })\n }\n for (const file of files) {\n const current = await fse.pathExists(file.path) ? await fse.readFile(file.path, 'utf8') : undefined\n if (current !== previous.get(file.path))\n throw new Error(cliM('cli_generateExists', { params: { path: file.path } }))\n await fse.rename(stages.get(file.path)!, file.path)\n written.push(file)\n }\n }\n catch (error) {\n failures.push(error)\n for (const file of written.reverse()) {\n try {\n if (await fse.readFile(file.path, 'utf8') !== file.content)\n throw new Error(cliM('cli_generateExists', { params: { path: file.path } }))\n const original = previous.get(file.path)\n if (original === undefined)\n await fse.unlink(file.path)\n else\n await fse.writeFile(file.path, original, 'utf8')\n }\n catch (rollbackError) {\n failures.push(rollbackError)\n }\n }\n }\n finally {\n for (const stage of stages.values()) {\n try {\n await fse.unlink(stage)\n }\n catch (error) {\n // 已提交的 stage 被 rename 移走;其余清理失败逐项保留,不遮盖主错误。\n if (!error || typeof error !== 'object' || !('code' in error) || error.code !== 'ENOENT')\n failures.push(error)\n }\n }\n }\n if (failures.length > 1)\n throw new AggregateError(failures, cliM('cli_generateRollbackFailed'))\n if (failures.length === 1)\n throw failures[0]\n}\n\n/**\n * 生成页面\n */\nasync function generatePage(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n const pageDir = path.join(outputDir, context.kebabCase)\n\n // +page.svelte\n const pageContent = `<!-- ${context.pascalCase} 页面 -->\n<svelte:head>\n <title>${context.pascalCase}</title>\n</svelte:head>\n\n<div class='container mx-auto p-4'>\n <h1 class='text-2xl font-bold mb-4'>${context.pascalCase}</h1>\n\n <!-- 页面内容 -->\n</div>\n`\n\n const pagePath = path.join(pageDir, '+page.svelte')\n files.push({ path: pagePath, content: pageContent })\n\n // +page.server.ts\n const serverContent = `/**\n * ${context.pascalCase} 页面服务端\n */\nimport type { Actions, PageServerLoad } from './$types'\n\nexport const load: PageServerLoad = async () => {\n return {\n // 页面数据\n }\n}\n\nexport const actions: Actions = {\n default: async () => {\n // 表单处理\n },\n}\n`\n\n const serverPath = path.join(pageDir, '+page.server.ts')\n files.push({ path: serverPath, content: serverContent })\n\n return files\n}\n\n/**\n * 生成组件\n */\nasync function generateComponent(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n\n // Component.svelte\n const componentContent = `<script lang='ts'>\n import type { Snippet } from 'svelte'\n\n /**\n * ${context.pascalCase} 组件\n */\n\n interface Props {\n /** 自定义 class */\n class?: string\n /** 子内容(Svelte 5 snippet) */\n children?: Snippet\n }\n\n const { class: className = '', children }: Props = $props()\n</script>\n\n<div class={className}>\n <!-- 组件内容 -->\n {@render children?.()}\n</div>\n`\n\n const componentPath = path.join(outputDir, `${context.pascalCase}.svelte`)\n files.push({ path: componentPath, content: componentContent })\n\n return files\n}\n\n/**\n * 生成 API 端点\n */\nasync function generateApi(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n const apiDir = path.join(outputDir, context.kebabCase)\n\n // +server.ts\n const serverContent = `/**\n * ${context.pascalCase} API\n */\nimport type { RequestHandler } from './$types'\nimport { kit } from '@h-ai/kit'\nimport { z } from 'zod'\n\n/** 示例输入;添加业务逻辑前扩展字段和约束。 */\nconst InputSchema = z.object({\n /** 业务名称(非空) */\n name: z.string().min(1),\n})\n\n/**\n * GET ${context.kebabCase}\n */\nexport const GET: RequestHandler = kit.handler(async ({ locals }) => {\n return kit.response.ok({ items: [] }, locals.requestId)\n})\n\n/**\n * POST ${context.kebabCase}\n */\nexport const POST: RequestHandler = kit.handler(async ({ request, locals }) => {\n const body = await kit.validate.body(request, InputSchema)\n // 校验通过后再执行业务操作;示例仅回传数据,不执行写入。\n return kit.response.ok(body, locals.requestId)\n})\n`\n\n const serverPath = path.join(apiDir, '+server.ts')\n files.push({ path: serverPath, content: serverContent })\n\n return files\n}\n\n/**\n * 生成数据模型\n */\nasync function generateModel(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n\n // model.ts\n const modelContent = `/**\n * ${context.pascalCase} 模型\n */\nimport { z } from 'zod'\n\n/**\n * ${context.pascalCase} Schema\n */\nexport const ${context.camelCase}Schema = z.object({\n /** 记录唯一标识 */\n id: z.string(),\n /** 显示名称 */\n name: z.string().min(1),\n /** 创建时间 */\n createdAt: z.date(),\n /** 最后修改时间 */\n updatedAt: z.date(),\n})\n\n/**\n * 创建 ${context.pascalCase} Schema\n */\nexport const create${context.pascalCase}Schema = ${context.camelCase}Schema.omit({\n id: true,\n createdAt: true,\n updatedAt: true,\n})\n\n/**\n * 更新 ${context.pascalCase} Schema\n */\nexport const update${context.pascalCase}Schema = create${context.pascalCase}Schema.partial()\n\n/**\n * ${context.pascalCase} 类型\n */\nexport type ${context.pascalCase} = z.infer<typeof ${context.camelCase}Schema>\nexport type Create${context.pascalCase} = z.infer<typeof create${context.pascalCase}Schema>\nexport type Update${context.pascalCase} = z.infer<typeof update${context.pascalCase}Schema>\n`\n\n const modelPath = path.join(outputDir, `${context.kebabCase}.ts`)\n files.push({ path: modelPath, content: modelContent })\n\n return files\n}\n\n/**\n * 生成迁移\n */\nasync function generateMigration(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n const timestamp = Date.now()\n\n // migration.ts\n const migrationContent = `/**\n * 迁移: ${context.pascalCase}\n * 时间: ${new Date().toISOString()}\n */\nimport { reldb } from '@h-ai/reldb'\n\n/** 升级:调用前初始化 reldb,调用方必须检查返回的 HaiResult。 */\nexport function up() {\n return reldb.ddl.createTable('hai_app_${context.snakeCase}', {\n id: { type: 'TEXT', primaryKey: true },\n name: { type: 'TEXT', notNull: true },\n created_at: { type: 'TIMESTAMP', notNull: true },\n updated_at: { type: 'TIMESTAMP', notNull: true },\n })\n}\n\n/** 回滚会删除整张表;由应用确认数据可删除后显式调用。 */\nexport function down() {\n return reldb.ddl.dropTable('hai_app_${context.snakeCase}')\n}\n`\n\n const migrationPath = path.join(outputDir, `${timestamp}_${context.snakeCase}.ts`)\n files.push({ path: migrationPath, content: migrationContent })\n\n return files\n}\n","/**\n * @h-ai/cli — 项目初始化/校验命令\n *\n * 校验现有项目配置完整性,补全缺失的配置文件。\n * @module cli-init\n */\n\nimport type { GlobalOptions, ProjectInfo } from '../cli-types.js'\nimport path from 'node:path'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { cliM } from '../cli-i18n.js'\nimport { fileExists, writeCliError, writeCliMessage, writeFile } from '../cli-utils.js'\nimport { generateConfigFile } from './cli-config-templates.js'\nimport { detectProject } from './cli-create.js'\n\n/**\n * init 命令选项\n * @example 模块内部上下文\n * ```ts\n * const options: InitOptions = { cwd: '/workspace/shop', force: false } // force=true 会覆盖已有模块 YAML。\n * ```\n */\nexport interface InitOptions extends GlobalOptions {\n /** 强制重新生成配置 */\n force?: boolean\n}\n\n/**\n * 模块到配置文件的映射\n */\nconst MODULE_CONFIG_MAP: Record<string, { configKey: string, label: string }> = {\n '@h-ai/core': { configKey: 'core', get label() { return cliM('cli_coreLabel') } },\n '@h-ai/serv': { configKey: 'serv', get label() { return cliM('cli_serviceLabel') } },\n '@h-ai/reldb': { configKey: 'db', get label() { return cliM('cli_featureDbName') } },\n '@h-ai/cache': { configKey: 'cache', get label() { return cliM('cli_featureCacheName') } },\n '@h-ai/iam': { configKey: 'iam', get label() { return cliM('cli_featureIamName') } },\n '@h-ai/storage': { configKey: 'storage', get label() { return cliM('cli_featureStorageName') } },\n '@h-ai/ai': { configKey: 'ai', get label() { return cliM('cli_featureAiName') } },\n '@h-ai/vecdb': { configKey: 'vecdb', get label() { return cliM('cli_featureVecdbName') } },\n '@h-ai/reach': { configKey: 'reach', get label() { return cliM('cli_featureReachName') } },\n '@h-ai/scheduler': { configKey: 'scheduler', get label() { return cliM('cli_featureSchedulerName') } },\n '@h-ai/audit': { configKey: 'audit', get label() { return cliM('cli_featureAuditName') } },\n '@h-ai/payment': { configKey: 'payment', get label() { return cliM('cli_featurePaymentName') } },\n '@h-ai/deploy': { configKey: 'deploy', get label() { return cliM('cli_featureDeployName') } },\n}\n\n/**\n * 校验结果\n * 项目包声明与配置文件存在性的检查结果;不表示连接可用或配置已通过模块 Schema。\n * @example 模块内部上下文\n * ```ts\n * const validation: ValidationResult = { existing: ['core'], missing: [{ pkg: '@h-ai/reldb', configKey: 'db', label: 'Database' }], project: { name: 'shop', version: '1.0.0', isHaiProject: true, haiPackages: ['@h-ai/core', '@h-ai/reldb'] } }\n * ```\n */\ninterface ValidationResult {\n /** 已存在的配置 */\n existing: string[]\n /** 缺失的配置 */\n missing: Array<{ pkg: string, configKey: string, label: string }>\n /** 项目信息 */\n project: ProjectInfo\n}\n\n/**\n * 校验项目配置完整性\n */\nasync function validateProject(cwd: string): Promise<ValidationResult | null> {\n const project = await detectProject(cwd)\n if (!project) {\n return null\n }\n\n const existing: string[] = []\n const missing: ValidationResult['missing'] = []\n\n for (const pkg of project.haiPackages) {\n const mapping = MODULE_CONFIG_MAP[pkg]\n if (!mapping)\n continue\n\n const configPath = path.join(cwd, 'config', `_${mapping.configKey}.yml`)\n if (await fileExists(configPath)) {\n existing.push(mapping.configKey)\n }\n else {\n missing.push({ pkg, configKey: mapping.configKey, label: mapping.label })\n }\n }\n\n return { existing, missing, project }\n}\n\n/**\n * 初始化/校验项目配置\n * force=true 会重新生成已安装模块的配置;文件操作失败抛错,未检测到项目时打印提示并返回。\n * @param options - 命令参数;对应命令的工作目录、非交互与可选功能。\n * @returns 缺失配置补齐或 force 模式覆盖完成。\n * @example 模块内部上下文\n * ```ts\n * // 前提:当前目录已有 hai 项目的 package.json。\n * await initProject({ cwd: process.cwd(), force: false }) // 等价 hai init;只补缺失配置。\n * ```\n */\nexport async function initProject(options: InitOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? '.'\n\n try {\n // 检测项目\n spinner.start(cliM('cli_initDetecting'))\n const result = await validateProject(cwd)\n\n if (!result) {\n spinner.fail(chalk.red(cliM('cli_projectNotFound')))\n return\n }\n\n const { project, existing, missing } = result\n spinner.succeed(cliM('cli_initDetected', { params: { name: chalk.cyan(project.name) } }))\n\n // 即使配置齐备,也补全新增 AI 参考资源;已有项目规则与 Skill 不覆盖。\n if (project.isHaiProject) {\n const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates.js')\n const generatedFiles = await generateProjectAiSupport(cwd, resolveSkillNamesForPackages(project.haiPackages), {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n })\n for (const generatedFile of generatedFiles) {\n writeCliMessage(chalk.gray(` + ${generatedFile}`))\n }\n }\n\n // 显示项目状态\n writeCliMessage('')\n writeCliMessage(chalk.bold(cliM('cli_initStatus')))\n writeCliMessage(cliM('cli_initName', { params: { name: chalk.cyan(project.name) } }))\n writeCliMessage(cliM('cli_initVersion', { params: { version: project.version } }))\n writeCliMessage(cliM('cli_initModules', { params: { modules: project.haiPackages.length > 0 ? project.haiPackages.map(p => chalk.cyan(p)).join(', ') : chalk.gray(cliM('cli_none')) } }))\n writeCliMessage('')\n\n // 显示配置状态\n if (existing.length > 0) {\n writeCliMessage(chalk.bold(cliM('cli_initExisting')))\n for (const key of existing) {\n writeCliMessage(chalk.green(` ✔ config/_${key}.yml`))\n }\n }\n\n // 无缺失配置\n if (missing.length === 0 && !options.force) {\n writeCliMessage('')\n writeCliMessage(chalk.green(cliM('cli_initReady')))\n return\n }\n\n // 补全缺失配置\n if (missing.length > 0) {\n writeCliMessage('')\n writeCliMessage(chalk.bold(cliM('cli_initMissing')))\n for (const item of missing) {\n writeCliMessage(chalk.yellow(` ✘ config/_${item.configKey}.yml (${item.label})`))\n }\n writeCliMessage('')\n\n spinner.start(cliM('cli_initGenerating'))\n let generated = 0\n for (const item of missing) {\n const configPath = path.join(cwd, 'config', `_${item.configKey}.yml`)\n const content = generateConfigFile(item.configKey)\n await writeFile(configPath, content)\n generated++\n }\n spinner.succeed(cliM('cli_initGenerated', { params: { count: generated } }))\n }\n\n // 强制模式:重新生成所有配置\n if (options.force && existing.length > 0) {\n writeCliMessage('')\n spinner.start(cliM('cli_initRegenerating'))\n let regenerated = 0\n for (const pkg of project.haiPackages) {\n const mapping = MODULE_CONFIG_MAP[pkg]\n if (!mapping)\n continue\n const configPath = path.join(cwd, 'config', `_${mapping.configKey}.yml`)\n const content = generateConfigFile(mapping.configKey)\n await writeFile(configPath, content)\n regenerated++\n }\n spinner.succeed(cliM('cli_initRegenerated', { params: { count: regenerated } }))\n }\n\n // 检查 core 配置(始终需要)\n const coreConfigPath = path.join(cwd, 'config', '_core.yml')\n if (!(await fileExists(coreConfigPath))) {\n spinner.start(cliM('cli_initCore'))\n const content = generateConfigFile('core')\n await writeFile(coreConfigPath, content)\n spinner.succeed()\n }\n\n writeCliMessage('')\n writeCliMessage(chalk.green(cliM('cli_initSuccess')))\n writeCliMessage('')\n writeCliMessage(chalk.gray(cliM('cli_nextSteps')))\n writeCliMessage(chalk.gray(cliM('cli_initEditConfig')))\n writeCliMessage(chalk.gray(cliM('cli_initStartDev')))\n writeCliMessage('')\n }\n catch (error) {\n spinner.fail()\n writeCliError(chalk.red(cliM('cli_initFailed')), { error })\n throw error\n }\n}\n","/** 精确版本升级诊断;只读本地工程和发布制品,不安装、不改文件、不覆盖业务 skill。 */\nimport { execFileSync } from 'node:child_process'\nimport { createHash } from 'node:crypto'\nimport { existsSync, readFileSync, realpathSync } from 'node:fs'\nimport { glob } from 'node:fs/promises'\nimport { findPackageJSON } from 'node:module'\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path'\nimport process from 'node:process'\nimport { pathToFileURL } from 'node:url'\nimport { gunzipSync } from 'node:zlib'\nimport { parse, parseAllDocuments } from 'yaml'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliMessage } from '../cli-utils.js'\n\nfunction object(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {}\n}\n\n/** 只识别发布声明的值导出;注释、字符串、私有声明和 type 导出不构成迁移能力。 */\nfunction declaresValueExport(source: string, name: string): boolean {\n const declarations = source.replace(/\\/\\*[\\s\\S]*?\\*\\/|\\/\\/[^\\n]*|\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|`(?:\\\\.|[^`\\\\])*`/g, ' ')\n if (new RegExp(`\\\\bexport\\\\s+(?:declare\\\\s+)?(?:function|const|let|var)\\\\s+${name}\\\\b`).test(declarations))\n return true\n return [...declarations.matchAll(/\\bexport\\s*\\{([^}]+)\\}/g)].some(match => match[1]!.split(',').some((item) => {\n const value = item.trim()\n return !value.startsWith('type ') && (value.split(/\\s+as\\s+/).at(-1)?.trim() === name)\n }))\n}\n\n/** 有界检查 npm tar 内容,仅读取,不解压到工程。 */\nfunction tarFiles(bytes: Uint8Array): Map<string, Uint8Array> {\n const tar = gunzipSync(bytes, { maxOutputLength: 64 * 1024 * 1024 })\n const files = new Map<string, Uint8Array>()\n for (let offset = 0; offset + 512 <= tar.length;) {\n const name = tar.subarray(offset, offset + 100).toString().replace(/\\0.*$/, '')\n if (!name)\n break\n const size = Number.parseInt(tar.subarray(offset + 124, offset + 136).toString().replace(/\\0.*$/, '').trim(), 8)\n if (!Number.isSafeInteger(size) || size < 0 || offset + 512 + size > tar.length)\n throw new Error('Invalid archive')\n if (tar[offset + 156] === 0 || tar[offset + 156] === 48)\n files.set(name, tar.subarray(offset + 512, offset + 512 + size))\n offset += 512 + Math.ceil(size / 512) * 512\n }\n return files\n}\n\n/**\n * 指定精确版本检查全部消费包、CLI/deploy 制品和工作区漂移;不完整发布不会修改工程。\n * @example 模块内部上下文\n * ```ts\n * const result = await inspectFrameworkUpgrade('/workspace/shop', '0.1.0-alpha.71')\n * // result.releaseComplete 为真后再安排停机、备份与模块迁移;此函数始终只读。\n * ```\n */\nexport async function inspectFrameworkUpgrade(directory: string, version: string) {\n if (!/^\\d+\\.\\d+\\.\\d+(?:-[\\da-z.-]+)?(?:\\+[\\da-z.-]+)?$/i.test(version))\n throw new Error(cliM('cli_upgrade_exact_version'))\n const root = realpathSync(resolve(directory))\n const workspaceFile = join(root, 'pnpm-workspace.yaml')\n const workspace = existsSync(workspaceFile) ? object(parse(readFileSync(workspaceFile, 'utf8'))) : {}\n const rootManifest = object(JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')))\n const patterns: unknown[] = Array.isArray(workspace.packages) ? workspace.packages : Array.isArray(rootManifest.workspaces) ? rootManifest.workspaces : Array.isArray(object(rootManifest.workspaces).packages) ? object(rootManifest.workspaces).packages as unknown[] : []\n const directories = new Set([root])\n const safePatterns = patterns.filter((pattern): pattern is string => typeof pattern === 'string' && !isAbsolute(pattern.replace(/^!/, '')) && !pattern.split(/[\\\\/]/).includes('..'))\n const exclude = ['**/node_modules/**', ...safePatterns.filter(pattern => pattern.startsWith('!')).map(pattern => `${pattern.slice(1)}/package.json`)]\n for (const pattern of safePatterns.filter(pattern => !pattern.startsWith('!'))) {\n for await (const manifest of glob(`${pattern}/package.json`, { cwd: root, exclude })) {\n const location = realpathSync(dirname(join(root, manifest)))\n const fromRoot = relative(root, location)\n if (!isAbsolute(fromRoot) && fromRoot !== '..' && !fromRoot.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`))\n directories.add(location)\n }\n }\n const packages = new Set(['@h-ai/cli', '@h-ai/deploy'])\n const drift: Array<{ package: string, source: string, declared: string, installed?: string, issues: string[] }> = []\n const catalog = object(workspace.catalog)\n const lockPath = join(root, 'pnpm-lock.yaml')\n const lock = existsSync(lockPath)\n ? parseAllDocuments(readFileSync(lockPath, 'utf8')).reduce<Record<string, unknown>>((all, document) => {\n if (document.errors.length)\n throw new Error(cliM('cli_upgrade_lock_invalid'))\n const part = object(document.toJS())\n return { ...all, ...part, importers: { ...object(all.importers), ...object(part.importers) } }\n }, {})\n : {}\n for (const location of directories) {\n const manifest = object(JSON.parse(readFileSync(join(location, 'package.json'), 'utf8')))\n const dependencies = { ...object(manifest.dependencies), ...object(manifest.devDependencies), ...object(manifest.optionalDependencies) }\n const importer = object(object(lock.importers)[relative(root, location).replaceAll('\\\\', '/') || '.'])\n for (const [name, specifier] of Object.entries(dependencies)) {\n if (!/^@h-ai\\/[\\w-]+$/.test(name) || typeof specifier !== 'string')\n continue\n packages.add(name)\n const declared = specifier.startsWith('catalog:') ? String(object(specifier === 'catalog:' ? catalog : object(workspace.catalogs)[specifier.slice(8)])[name] ?? '') : specifier\n const issues: string[] = []\n if (declared !== version && !declared.startsWith('workspace:'))\n issues.push('declared-version-drift')\n let installed: string | undefined\n try {\n // 使用消费者的 ESM 包解析,不执行入口,也不要求包公开 package.json 子路径。\n const path = findPackageJSON(name, pathToFileURL(join(location, 'package.json')))\n if (path) {\n const candidate = object(JSON.parse(readFileSync(path, 'utf8')))\n if (candidate.name === name && typeof candidate.version === 'string')\n installed = candidate.version\n }\n }\n catch { /* 已安装版本缺失作为诊断输出,不触发安装。 */ }\n if (installed !== version)\n issues.push(installed ? 'installed-version-drift' : 'not-installed')\n const locked = object(object(importer.dependencies)[name] ?? object(importer.devDependencies)[name] ?? object(importer.optionalDependencies)[name])\n if (typeof locked.version !== 'string' || (!locked.version.startsWith('link:') && locked.version.split('(')[0] !== version))\n issues.push('lock-version-drift')\n drift.push({ package: name, source: relative(root, join(location, 'package.json')).replaceAll('\\\\', '/'), declared, installed, issues })\n }\n }\n const registry = new URL(process.env.npm_config_registry ?? 'https://registry.npmjs.org/')\n if (registry.username || registry.password || registry.protocol !== 'https:')\n throw new Error(cliM('cli_upgrade_registry'))\n const releases: Array<{ package: string, available: boolean, issues: string[] }> = []\n const migrationPreflight: string[] = []\n const skills: Array<{ name: string, state: string }> = []\n const pending = [...packages]\n for (let index = 0; index < pending.length; index++) {\n const name = pending[index]!\n const item = { package: name, available: false, issues: [] as string[] }\n releases.push(item)\n try {\n const response = await fetch(new URL(`${encodeURIComponent(name)}/${encodeURIComponent(version)}`, registry), { signal: AbortSignal.timeout(20000) })\n if (!response.ok)\n throw new Error('Release missing')\n const metadata = object(await response.json())\n const dist = object(metadata.dist)\n if (metadata.version !== version || typeof dist.tarball !== 'string' || typeof dist.integrity !== 'string')\n throw new Error('Invalid metadata')\n for (const dependency of Object.keys(object(metadata.dependencies))) {\n if (/^@h-ai\\/[\\w-]+$/.test(dependency) && !packages.has(dependency)) {\n packages.add(dependency)\n pending.push(dependency)\n }\n }\n const url = new URL(dist.tarball)\n if (url.protocol !== 'https:' || url.username || url.password)\n throw new Error('Invalid tarball')\n const available = await fetch(url, { method: 'HEAD', signal: AbortSignal.timeout(20000) })\n if (!available.ok)\n throw new Error('Artifact missing')\n if (['@h-ai/cli', '@h-ai/deploy', '@h-ai/iam', '@h-ai/reach', '@h-ai/scheduler', '@h-ai/audit'].includes(name)) {\n const archive = await fetch(url, { signal: AbortSignal.timeout(30000) })\n if (!archive.ok || Number(archive.headers.get('content-length')) > 32 * 1024 * 1024)\n throw new Error('Artifact missing')\n const bytes = new Uint8Array(await archive.arrayBuffer())\n if (bytes.length > 32 * 1024 * 1024)\n throw new Error('Artifact too large')\n const integrity = dist.integrity.split(' ').find(value => value.startsWith('sha512-'))\n if (!integrity || createHash('sha512').update(bytes).digest('base64') !== integrity.slice(7))\n throw new Error('Integrity mismatch')\n const files = tarFiles(bytes)\n const manifest = files.get('package/package.json')\n if (!manifest || object(JSON.parse(new TextDecoder().decode(manifest))).version !== version || !files.has('package/dist/index.js'))\n throw new Error('Incomplete artifact')\n const migration = { '@h-ai/iam': 'migrateIam', '@h-ai/reach': 'migrateReach', '@h-ai/scheduler': 'migrateScheduler', '@h-ai/audit': 'migrateAudit' }[name]\n if (migration && declaresValueExport(new TextDecoder().decode(files.get('package/dist/index.d.ts')), migration) && declaresValueExport(new TextDecoder().decode(files.get('package/dist/index.js')), migration))\n migrationPreflight.push(`${migration}({ dryRun: true })`)\n if (name === '@h-ai/cli') {\n if (!files.has('package/templates/skills/hai-feedback/SKILL.md'))\n throw new Error('Skills missing')\n for (const [path, bytes] of files) {\n const match = /^package\\/templates\\/skills\\/([^/]+)\\/SKILL.md$/.exec(path)\n if (!match)\n continue\n const local = join(root, '.agents/skills', match[1]!, 'SKILL.md')\n skills.push({ name: match[1]!, state: !existsSync(local) ? 'missing' : createHash('sha256').update(readFileSync(local)).digest('hex') === createHash('sha256').update(bytes).digest('hex') ? 'current' : 'customized-or-older' })\n }\n }\n }\n item.available = true\n }\n catch {\n item.issues.push('release-or-artifact-unavailable')\n }\n }\n let dirtyFiles: string[] = []\n try {\n dirtyFiles = execFileSync('git', ['status', '--porcelain', '--', '.'], { cwd: root, encoding: 'utf8', windowsHide: true, stdio: 'pipe' }).trim().split('\\n').filter(Boolean)\n }\n catch { /* 非 Git 工程仍可检查发布齐备性。 */ }\n return { version, releaseComplete: releases.every(item => item.available), modified: false, releases, drift, skills, dirtyFiles, customizations: { overrides: [...new Set([...Object.keys(object(workspace.overrides)), ...Object.keys(object(rootManifest.overrides)), ...Object.keys(object(object(rootManifest.pnpm).overrides))])], patches: [...new Set([...Object.keys(object(workspace.patchedDependencies)), ...Object.keys(object(object(rootManifest.pnpm).patchedDependencies))])] }, migration: { preflight: migrationPreflight, inspectModuleReadmes: true, exclusiveAccess: true, backup: ['database', 'shared-session-cache'], rollback: 'restore-compatible-database-and-binaries', sessions: 'legacy-credential-sessions-require-login' } }\n}\n\n/**\n * 只读升级诊断 CLI 入口。\n * @example 模块内部上下文\n * ```ts\n * await upgradeCommand('0.1.0-alpha.71', { cwd: '/workspace/shop' })\n * ```\n */\nexport async function upgradeCommand(version: string, options: { cwd?: string } = {}): Promise<void> {\n const report = await inspectFrameworkUpgrade(options.cwd ?? process.cwd(), version)\n writeCliMessage(JSON.stringify(report, null, 2))\n if (!report.releaseComplete)\n process.exitCode = 1\n}\n","/**\n * @h-ai/cli — 主入口\n *\n * hai Agent Framework CLI\n * @module cli-main\n */\n\nimport type { AppType, CreateProjectOptions, FeatureId, FrontendTarget, GeneratorType } from './cli-types.js'\nimport process from 'node:process'\nimport { cac } from 'cac'\nimport chalk from 'chalk'\nimport { cliM } from './cli-i18n.js'\nimport { getCliVersion, writeCliMessage } from './cli-utils.js'\nimport { addModule, buildCommand, createProject, deployCommand, deploySecretsCommand, feedbackCommand, generate, initProject, upgradeCommand } from './commands/cli-commands.js'\n\n// CLI 版本(从 package.json 动态读取,避免硬编码与 npm 发布版本不一致)\nconst VERSION = getCliVersion()\n\n// 创建 CLI\nconst cli = cac('hai')\n\n// 全局选项\ncli.option('-v, --verbose', cliM('cli_help_verbose'))\ncli.option('-C, --cwd <path>', cliM('cli_help_cwd'))\n\n// 创建项目命令\ncli\n .command('create [name]', cliM('cli_help_create'))\n .option('--type <type>', cliM('cli_help_appType'))\n .option('--frontends <targets>', cliM('cli_help_frontends'))\n .option('--no-install', cliM('cli_help_noInstall'))\n .option('--no-deploy', cliM('cli_help_noDeploy'))\n .option('-p, --package-manager <pm>', cliM('cli_help_packageManager'))\n .option('--no-git', cliM('cli_help_noGit'))\n .option('--git-remote <url>', cliM('cli_help_gitRemote'))\n .option('--defaults', cliM('cli_help_defaults'))\n .action(async (name: string | undefined, options: Record<string, unknown>) => {\n try {\n const frontends = typeof options.frontends === 'string'\n ? options.frontends.split(',').map(f => f.trim()).filter(Boolean) as FrontendTarget[]\n : undefined\n\n await createProject({\n name: name ?? '',\n appType: options.type as AppType,\n frontends,\n deploy: options.deploy as boolean,\n install: options.install as boolean,\n packageManager: options.packageManager as CreateProjectOptions['packageManager'],\n git: options.git as boolean,\n gitRemote: options.gitRemote as string,\n defaults: options.defaults as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n // 保留自然退出,让终端/管道中的失败详情写完。\n process.exitCode = 1\n }\n })\n\n// 增量添加模块\ncli\n .command('add [module]', cliM('cli_help_add'))\n .option('--no-install', cliM('cli_help_noInstall'))\n .action(async (module: string | undefined, options: Record<string, unknown>) => {\n try {\n await addModule({\n module: module as FeatureId,\n install: options.install as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 初始化/校验配置\ncli\n .command('init', cliM('cli_help_init'))\n .option('-f, --force', cliM('cli_help_forceConfig'))\n .action(async (options: Record<string, unknown>) => {\n try {\n await initProject({\n force: options.force as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 代码生成命令\ncli\n .command('generate [type] [name]', cliM('cli_help_generate'))\n .option('-w, --workspace <name>', cliM('cli_help_workspace'))\n .alias('g')\n .option('-o, --output <path>', cliM('cli_help_output'))\n .option('-f, --force', cliM('cli_help_force'))\n .action(async (type: string | undefined, name: string | undefined, options: Record<string, unknown>) => {\n try {\n await generate({\n type: type as GeneratorType,\n name: name ?? '',\n output: options.output as string,\n ...(options.workspace ? { workspace: String(options.workspace) } : {}),\n force: options.force as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 构建与部署分别执行;构建不读取部署环境配置。\ncli\n .command('build', cliM('cli_help_build'))\n .option('--target <target>', cliM('cli_help_target'))\n .option('--images <names>', cliM('cli_help_images'))\n .option('--concurrency <count>', cliM('cli_help_buildConcurrency'))\n .option('--runtime <runtime>', cliM('cli_help_buildRuntime'))\n .option('--network <network>', cliM('cli_help_buildNetwork'))\n .option('--platform <platform>', cliM('cli_help_platform'))\n .option('--arch <arch>', cliM('cli_help_arch'))\n .option('--sqlite-prebuild-mirror <url>', cliM('cli_help_sqliteMirror'))\n .option('--no-http-proxy', cliM('cli_help_noHttpProxy'))\n .action(async (options: Parameters<typeof buildCommand>[0]) => {\n try {\n await buildCommand(options)\n }\n catch (error) {\n writeCliMessage(error instanceof Error ? error.message : String(error))\n process.exitCode = 1\n }\n })\n\n// 部署命令\ncli.command('upgrade <version>', cliM('cli_help_upgrade')).action(async (version: string, options: { cwd?: string }) => {\n try {\n await upgradeCommand(version, options)\n }\n catch (error) {\n writeCliMessage(error instanceof Error ? error.message : String(error))\n process.exitCode = 1\n }\n})\n\n// 部署命令\ncli\n .command('deploy [appDir]', cliM('cli_help_deploy'))\n .option('--plan', cliM('cli_help_deployPlan'))\n .option('--inspect-remote', cliM('cli_help_inspectRemote'))\n .option('--env <environment>', cliM('cli_help_environment'))\n .option('--env-dir <path>', cliM('cli_help_envDir'))\n .option('-y, --yes', cliM('cli_help_deployYes'))\n .option('--skip-middleware', cliM('cli_help_skipMiddleware'))\n .option('--artifact-dir <path>', cliM('cli_help_artifactDir'))\n .option('--services <names>', cliM('cli_help_services'))\n .option('--build', cliM('cli_help_deployBuild'))\n .option('--concurrency <count>', cliM('cli_help_buildConcurrency'))\n .option('--network <network>', cliM('cli_help_deployNetwork'))\n .option('--sqlite-prebuild-mirror <url>', cliM('cli_help_deploySqliteMirror'))\n .option('--no-http-proxy', cliM('cli_help_deployNoProxy'))\n .option('--runtime <runtime>', cliM('cli_help_deployRuntime'))\n .option('--bundle-only', cliM('cli_help_bundleOnly'))\n .option('--output <path>', cliM('cli_help_bundleOutput'))\n .action(async (appDir: string | undefined, options: Record<string, unknown>) => {\n try {\n await deployCommand({\n appDir,\n plan: options.plan as boolean,\n inspectRemote: options.inspectRemote as boolean,\n env: options.env as string,\n envDir: options.envDir as string,\n yes: options.yes as boolean,\n skipMiddleware: options.skipMiddleware as boolean,\n artifactDir: options.artifactDir as string,\n services: options.services as string,\n build: options.build as boolean,\n concurrency: options.concurrency as number,\n network: options.network as string,\n sqlitePrebuildMirror: options.sqlitePrebuildMirror as string,\n httpProxy: options.httpProxy as boolean,\n runtime: options.runtime as 'auto' | 'podman' | 'docker',\n bundleOnly: options.bundleOnly as boolean,\n output: options.output as string,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exitCode = 1\n }\n })\n\n// 服务器本机凭据迁移,不复用普通部署的默认目标或配置保存逻辑。\ncli.command('deploy-secrets <directory>', cliM('cli_help_deploySecrets'))\n .option('--import <file>', cliM('cli_help_secretImport'))\n .option('--apply', cliM('cli_help_secretApply'))\n .option('--runtime <runtime>', cliM('cli_help_deployRuntime'))\n .action(async (directory: string, options: { import?: string, apply?: boolean, runtime?: string, cwd?: string }) => {\n try {\n await deploySecretsCommand(directory, options)\n }\n catch (error) {\n writeCliMessage(error instanceof Error ? error.message : String(error))\n process.exitCode = 1\n }\n })\n\n// 快捷生成命令\ncli\n .command('feedback <action> <bundle>', cliM('cli_help_feedback'))\n .option('--page <number>', cliM('cli_feedback_page'))\n .option('--page-size <number>', cliM('cli_feedback_pageSize'))\n .option('--kind <kind>', cliM('cli_feedback_kind'))\n .option('--request-id <id>', cliM('cli_feedback_requestId'))\n .option('--error-id <id>', cliM('cli_feedback_errorId'))\n .option('--from <timestamp>', cliM('cli_feedback_from'))\n .option('--to <timestamp>', cliM('cli_feedback_to'))\n .option('--port <number>', cliM('cli_feedback_port'))\n .action(async (action: string, bundle: string, options: Record<string, unknown>) => {\n try {\n const numberOption = (value: unknown) => value === undefined ? undefined : Number(value)\n await feedbackCommand(action, bundle, {\n cwd: options.cwd as string,\n page: numberOption(options.page),\n pageSize: numberOption(options.pageSize),\n kind: options.kind as string,\n requestId: options.requestId as string,\n errorId: options.errorId as string,\n from: numberOption(options.from),\n to: numberOption(options.to),\n port: numberOption(options.port),\n })\n }\n catch (error) {\n writeCliMessage(error instanceof Error ? error.message : String(error))\n process.exitCode = 1\n }\n })\n\n// 快捷生成命令\ncli\n .command('g:page <name>', cliM('cli_help_generatePage'))\n .option('-w, --workspace <name>', cliM('cli_help_workspace'))\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'page', name, cwd: options.cwd as string, ...(options.workspace ? { workspace: String(options.workspace) } : {}) })\n })\n\ncli\n .command('g:component <name>', cliM('cli_help_generateComponent'))\n .option('-w, --workspace <name>', cliM('cli_help_workspace'))\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'component', name, cwd: options.cwd as string, ...(options.workspace ? { workspace: String(options.workspace) } : {}) })\n })\n\ncli\n .command('g:api <name>', cliM('cli_help_generateApi'))\n .option('-w, --workspace <name>', cliM('cli_help_workspace'))\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'api', name, cwd: options.cwd as string, ...(options.workspace ? { workspace: String(options.workspace) } : {}) })\n })\n\ncli\n .command('g:model <name>', cliM('cli_help_generateModel'))\n .option('-w, --workspace <name>', cliM('cli_help_workspace'))\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'model', name, cwd: options.cwd as string, ...(options.workspace ? { workspace: String(options.workspace) } : {}) })\n })\n\n// 版本和帮助\ncli.version(VERSION, '-V, --version')\ncli.help()\n\n// 解析参数\nconst parsed = cli.parse()\n\n// 无命令且未请求帮助/版本时显示帮助\nif (!cli.matchedCommand && !parsed.options.help && !parsed.options.version) {\n writeCliMessage('')\n writeCliMessage(chalk.cyan('hai Agent Framework CLI'))\n writeCliMessage('')\n cli.outputHelp()\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli-utils.ts","../src/commands/cli-template-engine.ts","../src/commands/cli-create.ts","../src/commands/cli-project-config.ts","../src/commands/cli-add.ts","../src/commands/cli-build-app.ts","../src/commands/cli-build-downloads.ts","../src/commands/cli-build-output.ts","../src/commands/cli-build.ts","../src/commands/cli-deploy-secrets.ts","../src/commands/cli-deploy-middleware.ts","../src/commands/cli-deploy.ts","../../../node_modules/fflate/esm/index.mjs","../../feedback/src/bundle/feedback-bundle-viewer.ts","../../feedback/src/bundle/feedback-bundle-functions.ts","../src/commands/cli-feedback.ts","../src/commands/cli-generate-serv.ts","../src/commands/cli-generate-target.ts","../src/commands/cli-generate.ts","../src/commands/cli-init.ts","../src/commands/cli-upgrade.ts","../src/cli-main.ts"],"names":["process","fs","path","i","Handlebars","fileURLToPath","DEFAULT_FULLSTACK_FRONTENDS","fse","generateConfigFile","generateProductionEnvironment","parse","ora","chalk","prompts","generatedFiles","pkg","execSync","run","visit","existsSync","join","readFileSync","resolve","execFileSync","relative","dirname","directory","runtime","randomBytes","writeFileSync","readdirSync","previous","parsed","provider","ask","createRequire","pathToFileURL","imageNames","parseEnv","require","l","_a","core","offset","err","address","name","randomUUID","object","isAbsolute","pattern","glob","createHash","bytes"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @h-ai/cli — 工具函数\n * @module cli-utils\n */\n\nimport type { TemplateContext } from './cli-types.js'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { fileURLToPath } from 'node:url'\nimport { wrapAnsi } from 'fast-wrap-ansi'\nimport fs from 'fs-extra'\nimport Handlebars from 'handlebars'\n\nconst CAMEL_CASE_SEPARATOR_REGEX = /[-_\\s]+(.)?/g\nconst LEADING_CHAR_REGEX = /^./\n\n/**\n * CLI 交互提示直接写终端,不能交给异步 JSON 日志 transport。\n * @param message - 已完成本地化的终端文案。\n * @example 模块内部上下文\n * ```ts\n * writeCliMessage('hai --help') // 调用方先完成用户文案的本地化。\n * ```\n */\nexport function writeCliMessage(message: string): void {\n process.stdout.write(`${message}\\n`)\n}\n\n/**\n * 显示异常的 message,保留子命令输出;Error 的不可枚举属性不能依赖 JSON 序列化。\n * @param message - 已完成本地化的终端文案。\n * @param error - 可选原始错误或包装对象,用于提取诊断信息。\n * @example 模块内部上下文\n * ```ts\n * writeCliError('Build failed', new Error('The compile command exited with code 1'))\n * ```\n */\nexport function writeCliError(message: string, error?: unknown): void {\n process.stderr.write(`${message}\\n`)\n if (error && typeof error === 'object' && 'error' in error)\n error = error.error\n if (error !== undefined)\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`)\n}\n\n/**\n * 显式按显示宽度换行,为 prompts 的前缀和缩进预留空间,避免中文自动折行后擦除不足。\n * @param description - 需按终端显示宽度折行的描述。\n * @returns 为提示前缀预留显示宽度后的文本。\n * @example 模块内部上下文\n * ```ts\n * const description = formatPromptDescription('Redis stores shared sessions across application instances.')\n * ```\n */\nexport function formatPromptDescription(description: string): string {\n return wrapAnsi(description, Math.max(1, (process.stdout.columns || 80) - 32), { hard: true })\n}\n\n/**\n * 转换为驼峰命名\n * @param str - 待转换的名称。\n * @returns 首字母小写的驼峰名称。\n * @example 模块内部上下文\n * ```ts\n * const name = toCamelCase('order-item') // orderItem\n * ```\n */\nexport function toCamelCase(str: string): string {\n return str\n .replace(CAMEL_CASE_SEPARATOR_REGEX, (_, c) => c ? c.toUpperCase() : '')\n .replace(LEADING_CHAR_REGEX, c => c.toLowerCase())\n}\n\n/**\n * 转换为帕斯卡命名\n * @param str - 待转换的名称。\n * @returns 首字母大写的名称。\n * @example 模块内部上下文\n * ```ts\n * const name = toPascalCase('order-item') // OrderItem\n * ```\n */\nexport function toPascalCase(str: string): string {\n const camel = toCamelCase(str)\n return camel.charAt(0).toUpperCase() + camel.slice(1)\n}\n\n/**\n * 转换为短横线命名\n * @param str - 待转换的名称。\n * @returns 小写连字符名称。\n * @example 模块内部上下文\n * ```ts\n * const name = toKebabCase('orderItem') // order-item\n * ```\n */\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase()\n}\n\n/**\n * 转换为下划线命名\n * @param str - 待转换的名称。\n * @returns 小写下划线名称。\n * @example 模块内部上下文\n * ```ts\n * const name = toSnakeCase('orderItem') // order_item\n * ```\n */\nexport function toSnakeCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toLowerCase()\n}\n\n/**\n * 创建模板上下文\n * @param name - 生成对象名称;用于派生四种大小写形式。\n * @param extra - 附加模板字段;同名字段会覆盖自动生成的名称。\n * @returns 四种名称及附加数据组成的模板对象。\n * @example 模块内部上下文\n * ```ts\n * const context = createTemplateContext('order-item', { projectName: 'shop' })\n * const filename = `${context.kebabCase}.ts`\n * ```\n */\nexport function createTemplateContext(name: string, extra: Record<string, unknown> = {}): TemplateContext {\n return {\n camelCase: toCamelCase(name),\n pascalCase: toPascalCase(name),\n kebabCase: toKebabCase(name),\n snakeCase: toSnakeCase(name),\n ...extra,\n }\n}\n\n/**\n * 渲染模板\n * @param template - 可信 Handlebars 模板文本;不自动转义为目标语言字面量。\n * @param context - 已解析的模板上下文。\n * @returns 不进行 HTML 转义的渲染文本。\n * @example 模块内部上下文\n * ```ts\n * const source = renderTemplate('export interface {{pascalCase}} {}', createTemplateContext('order-item'))\n * ```\n */\nexport function renderTemplate(template: string, context: TemplateContext): string {\n const compiled = Handlebars.compile(template, { noEscape: true })\n return compiled(context)\n}\n\n/**\n * 渲染模板文件\n * @param templatePath - 可信模板文件路径。\n * @param context - 已解析的模板上下文。\n * @returns 读取模板后渲染得到的文本。\n * @example 模块内部上下文\n * ```ts\n * // 使用当前项目中已存在的可信模板文件;读取失败向调用方抛出。\n * const source = await renderTemplateFile(path.join(process.cwd(), 'templates/model.hbs'), createTemplateContext('order-item'))\n * ```\n */\nexport async function renderTemplateFile(\n templatePath: string,\n context: TemplateContext,\n): Promise<string> {\n const template = await fs.readFile(templatePath, 'utf-8')\n return renderTemplate(template, context)\n}\n\n/**\n * 写入文件(创建目录)\n * @param filePath - 已由调用方校验的目标文件路径。\n * @param content - 待渲染、解析或写入的完整文本。\n * @returns 父目录创建及文件写入完成。\n * @example 模块内部上下文\n * ```ts\n * // 覆盖目标文件;调用方负责先验证目标路径与覆盖权限。\n * await writeFile(path.join(process.cwd(), 'src/lib/models/order-item.ts'), 'export interface OrderItem { id: string }\\n')\n * ```\n */\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n await fs.ensureDir(path.dirname(filePath))\n await fs.writeFile(filePath, content, 'utf-8')\n}\n\n/**\n * 检查文件是否存在\n * @param filePath - 已由调用方校验的目标文件路径。\n * @returns 可访问时为 true;访问失败时为 false。\n * @example 模块内部上下文\n * ```ts\n * const hasManifest = await fileExists(path.join(process.cwd(), 'package.json'))\n * ```\n */\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath)\n return true\n }\n catch {\n return false\n }\n}\n\n/**\n * 获取包版本\n * @param pkgPath - package.json 文件路径。\n * @returns 读取的版本号;读取或解析失败时为 null。\n * @example 模块内部上下文\n * ```ts\n * const version = await getPackageVersion(path.join(process.cwd(), 'package.json'))\n * if (version === null) writeCliError('Cannot read package version')\n * ```\n */\nexport async function getPackageVersion(pkgPath: string): Promise<string | null> {\n try {\n const pkg = await fs.readJson(pkgPath)\n return pkg.version\n }\n catch {\n return null\n }\n}\n\n/**\n * 读取 CLI 自身版本号\n *\n * 从当前模块所在目录向上查找 `@h-ai/cli` 的 package.json,\n * 兼容源码布局(src/)与打包产物布局(dist/)以及 npm 安装后的 node_modules 布局。\n * 用于生成项目时固定 `@h-ai/*` 依赖版本,避免硬编码与预发布版本漂移。\n * @returns CLI 自身版本;在限定父目录中找不到时为 0.0.0。\n * @example 模块内部上下文\n * ```ts\n * const version = getCliVersion() // 从 CLI 自身 package.json 查找,不读取目标应用版本。\n * ```\n */\nexport function getCliVersion(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url))\n for (let i = 0; i < 6; i++) {\n try {\n const pkg = fs.readJsonSync(path.join(dir, 'package.json')) as { name?: string, version?: string }\n if (pkg.name === '@h-ai/cli')\n return pkg.version ?? '0.0.0'\n }\n catch {\n // 当前目录无 package.json,继续向上查找\n }\n const parent = path.dirname(dir)\n if (parent === dir)\n break\n dir = parent\n }\n return '0.0.0'\n}\n\n/**\n * 检测包管理器\n * @param cwd - 项目所在目录。\n * @returns 优先 pnpm,其次 yarn,否则 npm。\n * @example 模块内部上下文\n * ```ts\n * const manager = await detectPackageManager(process.cwd()) // pnpm-lock 优先于 yarn.lock;均不存在时使用 npm。\n * ```\n */\nexport async function detectPackageManager(cwd: string): Promise<'pnpm' | 'npm' | 'yarn'> {\n if (await fileExists(path.join(cwd, 'pnpm-lock.yaml'))) {\n return 'pnpm'\n }\n if (await fileExists(path.join(cwd, 'yarn.lock'))) {\n return 'yarn'\n }\n return 'npm'\n}\n\n/**\n * 格式化字节\n * @param bytes - 字节数,以 1024 为单位递进。\n * @returns 最多以 GB 表示且保留一位小数的大小。\n * @example 模块内部上下文\n * ```ts\n * const size = formatBytes(1536) // 1.5 KB(1024 进制,保留一位小数)\n * ```\n */\nexport function formatBytes(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB']\n let size = bytes\n let unitIndex = 0\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024\n unitIndex++\n }\n\n return `${size.toFixed(1)} ${units[unitIndex]}`\n}\n\n/**\n * 格式化时间\n * @param ms - 耗时,单位毫秒。\n * @returns 小于一秒使用 ms,其余使用两位小数秒。\n * @example 模块内部上下文\n * ```ts\n * const elapsed = formatDuration(1250) // 1.25s;小于 1000 使用 ms。\n * ```\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`\n }\n return `${(ms / 1000).toFixed(2)}s`\n}\n\n/**\n * 注册 Handlebars helpers\n * @example 模块内部上下文\n * ```ts\n * registerHelpers()\n * const source = renderTemplate('{{upper camelCase}}', createTemplateContext('order-item')) // ORDERITEM\n * ```\n */\nexport function registerHelpers(): void {\n // 条件判断\n Handlebars.registerHelper('if_eq', function (this: unknown, a: unknown, b: unknown, options: Handlebars.HelperOptions) {\n return a === b ? options.fn(this) : options.inverse(this)\n })\n\n // 日期格式化\n Handlebars.registerHelper('date', () => {\n return new Date().toISOString().split('T')[0]\n })\n\n // 年份\n Handlebars.registerHelper('year', () => {\n return new Date().getFullYear()\n })\n\n // 大写\n Handlebars.registerHelper('upper', (str: string) => {\n return str.toUpperCase()\n })\n\n // 小写\n Handlebars.registerHelper('lower', (str: string) => {\n return str.toLowerCase()\n })\n}\n\n// 初始化时注册 helpers\nregisterHelpers()\n","/**\n * @h-ai/cli — 模板引擎\n *\n * 基于模板目录的项目生成逻辑:\n * 1. 拷贝 base 模板(骨架)\n * 2. 拷贝 apps/{type} 模板(应用类型路由)\n * 3. 叠加 features/{feat} 模板(可选功能路由,静态文件)\n * 4. 渲染 Handlebars 动态模板(base + apps + features 的 .hbs 文件)\n * 5. 拷贝 i18n 脚手架(project.inlang + messages)(当 hasI18n 为 true)\n *\n * @module cli-template-engine\n */\n\nimport type { AppType, FeatureId, FrontendTarget, ModuleConfigs } from '../cli-types.js'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport fse from 'fs-extra'\nimport Handlebars from 'handlebars'\nimport { parse, stringify } from 'yaml'\nimport { getCliVersion } from '../cli-utils.js'\nimport { documentConfig, parameterizeConfig } from './cli-config-environment.js'\nimport { generateConfigFile } from './cli-config-templates.js'\n\n// 注册自定义 Handlebars helpers\nHandlebars.registerHelper('deploymentConfig', () => JSON.stringify(parse(generateConfigFile('deploy')), null, 2))\nHandlebars.registerHelper('if_eq', function (this: unknown, a: unknown, b: unknown, options: Handlebars.HelperOptions) {\n return a === b ? options.fn(this) : options.inverse(this)\n})\n\n// 配置中的显示名称可包含引号、空格和换行,嵌入 TS / JSON / YAML 时必须作为字面量编码。\nHandlebars.registerHelper('json', (value: unknown) => JSON.stringify(value))\nHandlebars.registerHelper('html', (value: string) => Handlebars.escapeExpression(value))\nHandlebars.registerHelper('yaml', (key: string, value: unknown) => stringify({ [key]: value }).trim())\nHandlebars.registerHelper('jsString', (value: string) => `'${JSON.stringify(value).slice(1, -1).replace(/\\\\\"/g, '\"').replace(/'/g, '\\\\\\'')}'`)\n\n// 同一份模块配置供直接渲染和 create 命令使用,避免精简配置覆盖完整模板。\n// 未选择的模块只输出注释;说明也加两层注释,整文件去掉外层后仍是合法 YAML。\nHandlebars.registerHelper('moduleConfig', function (this: TemplateContext, moduleKey: string, enabled: boolean) {\n // 文件模板自身保留结尾换行,helper 不再重复输出空行。\n const generated = generateConfigFile(moduleKey, this.moduleConfigs, Boolean(enabled)).trimEnd()\n const content = moduleKey === 'feedback'\n ? generated.replace('HAI_FEEDBACK_APPID:my-app', `HAI_FEEDBACK_APPID:${this.projectName}`)\n : generated\n const configured = this.appType === 'fullstack' && moduleKey === 'iam'\n ? content.replace('HAI_IAM_SEEDDEFAULTDATA:true', 'HAI_IAM_SEEDDEFAULTDATA:false').replace('variant: card', 'variant: split')\n : content\n return configured\n})\n\nconst TEMPLATE_SKIP_IF_EMPTY_MARKER = '@skipIfEmpty'\nconst NORMALIZED_RENDER_EXTENSIONS = new Set(['.ts', '.js', '.svelte', '.json', '.css'])\n\n// Capacitor 应用为纯客户端 SPA(Svelte 5 + Vite),没有服务端运行时。\n// 服务端专属产物(hooks、server init)必须跳过,否则预渲染会因访问 url.searchParams 报错。\nconst CAPACITOR_SKIPPED_SERVER_FILES = new Set([\n 'src/hooks.server.ts',\n 'src/lib/server/init.ts',\n])\n\n// 以下版本号与生成项目的 pnpm-workspace.yaml catalog 保持一致;\n// 单包脚手架直接写具体版本,pnpm fullstack workspace 会通过 catalog: 引用这些版本。\nconst VERSIONS = {\n tauriFs: '2.7.1',\n tauriDialog: '2.8.3',\n capacitorShare: '8.0.3',\n capacitorFilesystem: '8.1.5',\n antfuEslintConfig: '9.5.1',\n capacitorSecureStorage: '8.0.1',\n // UI / Icon\n bitsUi: '2.19.5',\n iconifyJsonTabler: '1.2.42',\n iconifyTailwind: '1.2.3',\n // Capacitor\n capacitorAndroid: '8.5.3',\n capacitorApp: '8.1.2',\n capacitorCamera: '8.2.5',\n capacitorCli: '8.5.3',\n capacitorCore: '8.5.3',\n capacitorDevice: '8.0.3',\n capacitorIos: '8.5.3',\n capacitorPreferences: '8.0.1',\n capacitorPushNotifications: '8.1.3',\n capacitorStatusBar: '8.0.4',\n // Tailwind / DaisyUI\n daisyui: '5.7.47',\n tailwindcss: '4.3.3',\n tailwindcssVite: '4.3.3',\n // i18n\n inlangParaglide: '2.27.0',\n inlangMessageFormat: '4.5.0',\n // Svelte / Vite\n svelte: '5.57.2',\n svelteKit: '2.70.3',\n svelteAdapterNode: '5.5.7',\n svelteAdapterStatic: '^3.0.10',\n svelteCheck: '4.7.6',\n sveltePlugin: '7.3.1',\n // Build / Test\n vite: '8.3.4',\n vitest: '4.1.11',\n tsup: '8.5.1',\n pinoPretty: '^13.2.0',\n rimraf: '6.1.3',\n // ESLint\n eslint: '10.12.0',\n eslintPluginFormat: '2.0.1',\n eslintPluginSvelte: '3.23.1',\n svelteEslintParser: '1.9.0',\n // Node / TS\n nodeTypes: '26.6.5',\n // Svelte / ESLint / tsup 继续使用稳定的 JavaScript 编译 API。\n typescript: '6.0.3',\n // E2E\n playwright: '1.64.0',\n // Validation\n zod: '4.6.5',\n // Tauri\n tauriCli: '2.12.1',\n} as const\n\n/**\n * 有真实可构建入口的前端目标;miniapp 只生成占位,不进入可启动应用列表。\n * @example 模块内部上下文\n * ```ts\n * const target: ImplementedFrontendTarget = 'web'\n * const port = FRONTEND_PORTS_DEFAULT[target]\n * ```\n */\ntype ImplementedFrontendTarget = Exclude<FrontendTarget, 'miniapp'>\n\nconst FRONTEND_PORTS_DEFAULT: Record<ImplementedFrontendTarget, number> = {\n web: 4173,\n app: 5175,\n desktop: 5176,\n}\n\nconst FRONTEND_LABELS: Record<FrontendTarget, string> = {\n web: 'Web',\n app: 'App',\n miniapp: 'Miniapp',\n desktop: 'Desktop',\n}\n\nconst IMPLEMENTED_FRONTENDS: readonly FrontendTarget[] = ['web', 'app', 'desktop']\nconst DEFAULT_FULLSTACK_FRONTENDS: readonly FrontendTarget[] = ['web', 'app', 'desktop']\nconst DEFAULT_THEMES = ['light', 'dark', 'high-contrast', 'formal'] as const\nconst DEFAULT_THEME_NAME = 'light'\n// 框架与模板同步发布;范围版本会把旧命名 alpha9 视为比 alpha.58 更新。\nconst HAI_PACKAGE_VERSION = getCliVersion()\nconst HAI_PACKAGE_SPECIFIER_CATALOG = 'catalog:'\n/**\n * 模板版本表各键对应的依赖说明符;pnpm 使用 catalog:,其他包管理器使用受测版本。\n * @example 模块内部上下文\n * ```ts\n * const specifiers: FullstackPackageSpecifiers = buildFullstackPackageSpecifiers(true)\n * const version = specifiers.svelte // catalog:\n * ```\n */\ntype FullstackPackageSpecifiers = { [Key in keyof typeof VERSIONS]: string }\n/**\n * 写入 pnpm workspace catalog 的包名与具体版本;不把 catalog: 再嵌套为版本值。\n * @example 模块内部上下文\n * ```ts\n * const catalog: CatalogPackageVersions = { '@h-ai/core': getCliVersion(), svelte: VERSIONS.svelte }\n * ```\n */\ntype CatalogPackageVersions = Readonly<Record<string, string>>\n\nconst HAI_CATALOG_PACKAGE_NAMES = [\n '@h-ai/ai',\n '@h-ai/api-client',\n '@h-ai/api-contract',\n '@h-ai/audit',\n '@h-ai/cache',\n '@h-ai/capacitor',\n '@h-ai/cli',\n '@h-ai/core',\n '@h-ai/crypto',\n '@h-ai/datapipe',\n '@h-ai/deploy',\n '@h-ai/feedback',\n '@h-ai/iam',\n '@h-ai/kit',\n '@h-ai/payment',\n '@h-ai/reach',\n '@h-ai/reldb',\n '@h-ai/scheduler',\n '@h-ai/serv',\n '@h-ai/storage',\n '@h-ai/ui',\n '@h-ai/vecdb',\n] as const\nconst HAI_CATALOG_PACKAGES: Record<string, string> = Object.fromEntries(\n HAI_CATALOG_PACKAGE_NAMES.map(packageName => [packageName, HAI_PACKAGE_VERSION]),\n)\n\nconst FULLSTACK_EXTERNAL_CATALOG_PACKAGES: CatalogPackageVersions = {\n '@tauri-apps/plugin-fs': VERSIONS.tauriFs,\n '@tauri-apps/plugin-dialog': VERSIONS.tauriDialog,\n '@capacitor/share': VERSIONS.capacitorShare,\n '@capacitor/filesystem': VERSIONS.capacitorFilesystem,\n '@antfu/eslint-config': VERSIONS.antfuEslintConfig,\n '@aparajita/capacitor-secure-storage': VERSIONS.capacitorSecureStorage,\n '@capacitor/android': VERSIONS.capacitorAndroid,\n '@capacitor/app': VERSIONS.capacitorApp,\n '@capacitor/camera': VERSIONS.capacitorCamera,\n '@capacitor/cli': VERSIONS.capacitorCli,\n '@capacitor/core': VERSIONS.capacitorCore,\n '@capacitor/device': VERSIONS.capacitorDevice,\n '@capacitor/ios': VERSIONS.capacitorIos,\n '@capacitor/preferences': VERSIONS.capacitorPreferences,\n '@capacitor/push-notifications': VERSIONS.capacitorPushNotifications,\n '@capacitor/status-bar': VERSIONS.capacitorStatusBar,\n '@iconify-json/tabler': VERSIONS.iconifyJsonTabler,\n '@iconify/tailwind4': VERSIONS.iconifyTailwind,\n '@inlang/paraglide-js': VERSIONS.inlangParaglide,\n '@inlang/plugin-message-format': VERSIONS.inlangMessageFormat,\n '@playwright/test': VERSIONS.playwright,\n '@sveltejs/vite-plugin-svelte': VERSIONS.sveltePlugin,\n '@tailwindcss/vite': VERSIONS.tailwindcssVite,\n '@tauri-apps/cli': VERSIONS.tauriCli,\n '@types/node': VERSIONS.nodeTypes,\n 'bits-ui': VERSIONS.bitsUi,\n 'daisyui': VERSIONS.daisyui,\n 'eslint': VERSIONS.eslint,\n 'eslint-plugin-format': VERSIONS.eslintPluginFormat,\n 'eslint-plugin-svelte': VERSIONS.eslintPluginSvelte,\n 'pino-pretty': VERSIONS.pinoPretty,\n 'rimraf': VERSIONS.rimraf,\n 'svelte': VERSIONS.svelte,\n 'svelte-check': VERSIONS.svelteCheck,\n 'svelte-eslint-parser': VERSIONS.svelteEslintParser,\n 'tailwindcss': VERSIONS.tailwindcss,\n 'tsup': VERSIONS.tsup,\n 'typescript': VERSIONS.typescript,\n 'vite': VERSIONS.vite,\n 'vitest': VERSIONS.vitest,\n 'zod': VERSIONS.zod,\n}\n\nconst FULLSTACK_CATALOG_PACKAGES: CatalogPackageVersions = {\n ...HAI_CATALOG_PACKAGES,\n ...FULLSTACK_EXTERNAL_CATALOG_PACKAGES,\n}\n\nconst FULLSTACK_ROOT_CATALOG_PACKAGE_NAMES = [\n '@antfu/eslint-config',\n '@playwright/test',\n '@sveltejs/vite-plugin-svelte',\n '@types/node',\n 'eslint',\n 'eslint-plugin-format',\n 'eslint-plugin-svelte',\n 'rimraf',\n 'svelte',\n 'svelte-check',\n 'svelte-eslint-parser',\n 'tsup',\n 'typescript',\n 'vite',\n 'vitest',\n] as const\n\nconst FULLSTACK_CONTRACT_CATALOG_PACKAGE_NAMES = [\n '@h-ai/api-contract',\n '@h-ai/core',\n 'zod',\n] as const\n\nconst FULLSTACK_SERV_CATALOG_PACKAGE_NAMES = [\n 'pino-pretty',\n '@h-ai/audit',\n '@h-ai/cache',\n '@h-ai/core',\n '@h-ai/crypto',\n '@h-ai/iam',\n '@h-ai/reach',\n '@h-ai/reldb',\n '@h-ai/scheduler',\n '@h-ai/serv',\n '@h-ai/storage',\n 'zod',\n] as const\n\nconst FULLSTACK_SHARED_CATALOG_PACKAGE_NAMES = [\n '@h-ai/api-client',\n '@h-ai/api-contract',\n '@h-ai/core',\n '@h-ai/crypto',\n '@h-ai/ui',\n '@inlang/paraglide-js',\n '@inlang/plugin-message-format',\n 'svelte',\n 'svelte-check',\n 'typescript',\n 'vite',\n 'vitest',\n] as const\n\nconst FULLSTACK_WEB_CATALOG_PACKAGE_NAMES = [\n '@antfu/eslint-config',\n '@h-ai/ui',\n '@iconify-json/tabler',\n '@iconify/tailwind4',\n '@inlang/paraglide-js',\n '@inlang/plugin-message-format',\n '@sveltejs/vite-plugin-svelte',\n '@tailwindcss/vite',\n 'bits-ui',\n 'daisyui',\n 'eslint',\n 'eslint-plugin-format',\n 'eslint-plugin-svelte',\n 'svelte',\n 'svelte-check',\n 'svelte-eslint-parser',\n 'tailwindcss',\n 'typescript',\n 'vite',\n 'vitest',\n] as const\n\nconst FULLSTACK_APP_CATALOG_PACKAGE_NAMES = [\n '@capacitor/share',\n '@capacitor/filesystem',\n ...FULLSTACK_WEB_CATALOG_PACKAGE_NAMES,\n '@aparajita/capacitor-secure-storage',\n '@capacitor/android',\n '@capacitor/app',\n '@capacitor/camera',\n '@capacitor/cli',\n '@capacitor/core',\n '@capacitor/device',\n '@capacitor/ios',\n '@capacitor/preferences',\n '@capacitor/push-notifications',\n '@capacitor/status-bar',\n '@h-ai/capacitor',\n] as const\n\nconst FULLSTACK_DESKTOP_CATALOG_PACKAGE_NAMES = [\n '@tauri-apps/plugin-fs',\n '@tauri-apps/plugin-dialog',\n ...FULLSTACK_WEB_CATALOG_PACKAGE_NAMES,\n '@tauri-apps/cli',\n] as const\n\nconst API_WORKSPACE_EXTERNAL_CATALOG_PACKAGE_NAMES = [\n 'pino-pretty',\n '@antfu/eslint-config',\n '@playwright/test',\n '@types/node',\n 'eslint',\n 'eslint-plugin-format',\n 'rimraf',\n 'tsup',\n 'typescript',\n 'vitest',\n 'zod',\n] as const\n\nfunction pickCatalogPackages(\n packageNames: readonly string[],\n availableCatalogPackages: CatalogPackageVersions,\n): Record<string, string> {\n return Object.fromEntries(\n [...new Set(packageNames)]\n .sort((left, right) => left.localeCompare(right))\n .map((packageName) => {\n const version = availableCatalogPackages[packageName]\n if (!version) {\n throw new Error(`Missing catalog version for package \"${packageName}\"`)\n }\n return [packageName, version]\n }),\n )\n}\n\nfunction buildFullstackPackageSpecifiers(useCatalogProtocol: boolean): FullstackPackageSpecifiers {\n return Object.fromEntries(\n Object.entries(VERSIONS).map(([key, version]) => [key, useCatalogProtocol ? HAI_PACKAGE_SPECIFIER_CATALOG : version]),\n ) as FullstackPackageSpecifiers\n}\n\nfunction buildApiWorkspaceCatalogPackages(featureMap: Record<string, boolean>): Record<string, string> {\n const packageNames: string[] = [\n ...API_WORKSPACE_EXTERNAL_CATALOG_PACKAGE_NAMES,\n '@h-ai/cli',\n '@h-ai/api-client',\n '@h-ai/api-contract',\n '@h-ai/core',\n '@h-ai/serv',\n ]\n\n if (featureMap.db)\n packageNames.push('@h-ai/reldb')\n if (featureMap.cache)\n packageNames.push('@h-ai/cache')\n if (featureMap.iam)\n packageNames.push('@h-ai/iam')\n if (featureMap.crypto)\n packageNames.push('@h-ai/crypto')\n if (featureMap.storage)\n packageNames.push('@h-ai/storage')\n if (featureMap.ai)\n packageNames.push('@h-ai/ai')\n if (featureMap.audit)\n packageNames.push('@h-ai/audit')\n if (featureMap.reach)\n packageNames.push('@h-ai/reach')\n if (featureMap.feedback)\n packageNames.push('@h-ai/feedback')\n if (featureMap.payment)\n packageNames.push('@h-ai/payment')\n if (featureMap.vecdb)\n packageNames.push('@h-ai/vecdb')\n if (featureMap.datapipe)\n packageNames.push('@h-ai/datapipe')\n if (featureMap.scheduler)\n packageNames.push('@h-ai/scheduler')\n if (featureMap.deploy)\n packageNames.push('@h-ai/deploy')\n\n return pickCatalogPackages(packageNames, FULLSTACK_CATALOG_PACKAGES)\n}\n\nfunction buildAppHaiCatalogPackages(options: {\n featureMap: Record<string, boolean>\n hasUi: boolean\n isCapacitorApp: boolean\n isSvelteOnlyApp: boolean\n}): Record<string, string> {\n const packageNames: string[] = ['@h-ai/cli']\n\n if (options.isSvelteOnlyApp) {\n packageNames.push('@h-ai/api-client', '@h-ai/capacitor', '@h-ai/core', '@h-ai/ui')\n if (options.featureMap.iam)\n packageNames.push('@h-ai/api-contract')\n if (options.featureMap.deploy)\n packageNames.push('@h-ai/deploy')\n if (options.featureMap.crypto)\n packageNames.push('@h-ai/crypto')\n return pickCatalogPackages(packageNames, HAI_CATALOG_PACKAGES)\n }\n\n packageNames.push('@h-ai/core', '@h-ai/kit')\n if (options.hasUi)\n packageNames.push('@h-ai/ui')\n if (options.featureMap.db)\n packageNames.push('@h-ai/reldb')\n if (options.featureMap.cache)\n packageNames.push('@h-ai/cache')\n if (options.featureMap.iam)\n packageNames.push('@h-ai/iam')\n if (options.featureMap.crypto)\n packageNames.push('@h-ai/crypto')\n if (options.featureMap.storage)\n packageNames.push('@h-ai/storage')\n if (options.featureMap.ai)\n packageNames.push('@h-ai/ai')\n if (options.featureMap.audit)\n packageNames.push('@h-ai/audit')\n if (options.featureMap.reach)\n packageNames.push('@h-ai/reach')\n if (options.featureMap.feedback)\n packageNames.push('@h-ai/feedback')\n if (options.featureMap.payment)\n packageNames.push('@h-ai/payment')\n if (options.featureMap.vecdb)\n packageNames.push('@h-ai/vecdb')\n if (options.featureMap.datapipe)\n packageNames.push('@h-ai/datapipe')\n if (options.featureMap.scheduler)\n packageNames.push('@h-ai/scheduler')\n if (options.featureMap.deploy)\n packageNames.push('@h-ai/deploy')\n if (options.featureMap['api-client'])\n packageNames.push('@h-ai/api-client')\n if (options.featureMap.capacitor)\n packageNames.push('@h-ai/capacitor')\n if (options.isCapacitorApp && !options.featureMap['api-client'])\n packageNames.push('@h-ai/api-client')\n if (options.isCapacitorApp && !options.featureMap.capacitor)\n packageNames.push('@h-ai/capacitor')\n\n return pickCatalogPackages(packageNames, HAI_CATALOG_PACKAGES)\n}\n\nfunction buildFullstackCatalogPackages(frontends: readonly FrontendTarget[], deploy = false, features: Record<string, boolean> = {}): Record<string, string> {\n const packageNames: string[] = [\n ...FULLSTACK_ROOT_CATALOG_PACKAGE_NAMES,\n '@h-ai/cli',\n ...FULLSTACK_CONTRACT_CATALOG_PACKAGE_NAMES,\n ...FULLSTACK_SERV_CATALOG_PACKAGE_NAMES,\n ...FULLSTACK_SHARED_CATALOG_PACKAGE_NAMES,\n ]\n\n if (frontends.includes('web'))\n packageNames.push(...FULLSTACK_WEB_CATALOG_PACKAGE_NAMES)\n if (frontends.includes('app'))\n packageNames.push(...FULLSTACK_APP_CATALOG_PACKAGE_NAMES)\n if (frontends.includes('desktop'))\n packageNames.push(...FULLSTACK_DESKTOP_CATALOG_PACKAGE_NAMES)\n if (deploy)\n packageNames.push('@h-ai/deploy')\n if (features.feedback)\n packageNames.push('@h-ai/feedback')\n if (features.ai)\n packageNames.push('@h-ai/ai')\n if (features.vecdb)\n packageNames.push('@h-ai/vecdb')\n if (features.payment)\n packageNames.push('@h-ai/payment')\n if (features.datapipe)\n packageNames.push('@h-ai/datapipe')\n\n return pickCatalogPackages(packageNames, FULLSTACK_CATALOG_PACKAGES)\n}\n\n// =============================================================================\n// 类型\n// =============================================================================\n\n/**\n * 模板渲染上下文\n * @example 模块内部上下文\n * ```ts\n * const context: TemplateContext = buildTemplateContext({ name: 'shop', appType: 'fullstack', features: ['ai'], frontends: ['web'], packageManager: 'pnpm' })\n * const dbEnabled = context.features.db // AI 补齐 db/vecdb。\n * ```\n */\nexport interface TemplateContext {\n /** 所有应用模板共用的第三方依赖版本,避免单包与 workspace 版本表漂移。 */\n versions: typeof VERSIONS\n /** 项目名称 */\n projectName: string\n /** 是否对 @h-ai/* 依赖启用 pnpm catalog 协议 */\n useCatalogProtocol: boolean\n /** @h-ai/* 依赖写入 package.json 时使用的版本说明符 */\n haiPackageSpecifier: string\n /** 生成项目时引用的 @h-ai/* 发布版本 */\n haiPackageVersion: string\n /** 生成项目时写入 pnpm-workspace.yaml 的 catalog 条目 */\n haiCatalogPackages: Record<string, string>\n /** 应用类型 */\n appType: AppType\n /** 选中的 feature 集合(用于 {{#if features.xxx}}) */\n features: Record<string, boolean>\n /** 创建时指定的模块配置;配置模板需保留这些值。 */\n moduleConfigs?: ModuleConfigs\n /** 是否有 UI(非 api / fullstack 类型) */\n hasUi: boolean\n /** 是否有 i18n(非 api / fullstack 类型) */\n hasI18n: boolean\n /** website静态模式须拒绝的已选服务端业务模块;部署开发工具和纯展示能力除外。 */\n websiteServerFeatures: string[]\n /** 是否为 Capacitor 原生移动应用(mobile-app) */\n isCapacitorApp: boolean\n /** 是否为 API workspace(service + contract) */\n isApiWorkspace: boolean\n /** 是否为不依赖 SvelteKit 的纯 Svelte 5 应用 */\n isSvelteOnlyApp: boolean\n /** 默认语言 */\n defaultLocale: string\n /** 包管理器 */\n packageManager: string\n /** API workspace 专用上下文 */\n api?: ApiWorkspaceTemplateContext\n /** 前后端分离工程专用上下文 */\n fullstack?: FullstackTemplateContext\n}\n\n/**\n * API workspace 的 contract/service 包命名及真实工厂标识,用于让生成入口与消费者一致。\n * @example 模块内部上下文\n * ```ts\n * const context = buildTemplateContext({ name: 'shop', appType: 'api', features: [], packageManager: 'pnpm' })\n * if (context.api) {\n * const api: ApiWorkspaceTemplateContext = context.api\n * const contractPackage = api.contractPackageName\n * }\n * ```\n */\nexport interface ApiWorkspaceTemplateContext {\n /** 依赖版本集合 */\n versions: typeof VERSIONS\n /** 写入 package.json 的依赖说明符(pnpm 时为 catalog:) */\n packageSpecifiers: FullstackPackageSpecifiers\n /** 共享 contract 包名 */\n contractPackageName: string\n /** 共享 contract 导出变量名 */\n contractExportName: string\n /** 后端 service 包名 */\n servPackageName: string\n /** Service App 工厂函数名 */\n serviceAppFactoryName: string\n /** procedures 聚合函数名 */\n serviceProceduresFactoryName: string\n}\n\n/**\n * 已实现目标对应的应用信息;miniapp 不会被列为可启动前端。\n * @example 模块内部上下文\n * ```ts\n * const app: FullstackFrontendApp = { target: 'web', packageName: 'shop-web', label: 'Web', port: 4173 }\n * ```\n */\nexport interface FullstackFrontendApp {\n /** 前端目标 */\n target: ImplementedFrontendTarget\n /** 包名 */\n packageName: string\n /** 展示名称 */\n label: string\n /** 本地端口 */\n port: number\n}\n\n/**\n * 国际化配置(已解析后的最终值)\n * @example 模块内部上下文\n * ```ts\n * const i18n: FullstackI18nContext = { baseLocale: 'zh-CN', locales: ['zh-CN', 'en-US'] }\n * const includesBase = i18n.locales.includes(i18n.baseLocale)\n * ```\n */\nexport interface FullstackI18nContext {\n baseLocale: string\n locales: readonly string[]\n}\n\n/**\n * 主题配置(已解析后的最终值)\n * @example 模块内部上下文\n * ```ts\n * const theme: FullstackThemeContext = { defaultTheme: 'light', themes: ['light', 'dark'] }\n * const includesDefault = theme.themes.includes(theme.defaultTheme)\n * ```\n */\nexport interface FullstackThemeContext {\n defaultTheme: string\n themes: readonly string[]\n}\n\n/**\n * 前后端分离工程最终模板数据;前端列表、共享主题/语言与端口按默认值和选项统一解析;语言及主题缺省项会补齐。\n * @example 模块内部上下文\n * ```ts\n * const context = buildTemplateContext({ name: 'shop', appType: 'fullstack', features: ['ai'], frontends: ['web'], packageManager: 'pnpm' })\n * if (context.fullstack) {\n * const fullstack: FullstackTemplateContext = context.fullstack\n * const appNames = fullstack.frontendApps.map(app => app.packageName)\n * }\n * ```\n */\nexport interface FullstackTemplateContext {\n /** 显示名称来自 core 配置。 */\n appName: string\n /** 依赖版本集合 */\n versions: typeof VERSIONS\n /** 写入 package.json 的依赖说明符(pnpm 时为 catalog:) */\n packageSpecifiers: FullstackPackageSpecifiers\n /** 共享 contract 包名 */\n contractPackageName: string\n /** 共享 contract 导出变量名 */\n contractExportName: string\n /** 后端 service 包名 */\n servPackageName: string\n /** 原生壳 appId / bundle identifier 使用的安全短名 */\n nativeAppIdSegment: string\n /** 前端共享代码包名 */\n sharedPackageName: string\n /** 所有已选择前端 */\n selectedFrontends: readonly FrontendTarget[]\n /** 已选择前端 JSON 字面量 */\n selectedFrontendsJson: string\n /** 可运行前端应用 */\n frontendApps: readonly FullstackFrontendApp[]\n /** Playwright 默认验证前端 */\n e2eFrontend?: FullstackFrontendApp\n /** 前端选择布尔表,用于模板条件创建 */\n frontends: Record<FrontendTarget, boolean>\n /** 各前端端口(key 为 target) */\n ports: Record<ImplementedFrontendTarget, number>\n /** 是否选择小程序预留 */\n hasMiniapp: boolean\n /** i18n 配置 */\n i18n: FullstackI18nContext\n /** 主题配置 */\n theme: FullstackThemeContext\n}\n\n/**\n * feature 对应的路由目录映射\n *\n * 每个 feature 可以有:\n * - `routes-shared/` — 所有应用类型共用(如 API 端点)\n * - `routes-{appType}/` — 特定应用类型专用(如 UI 页面)\n * - `routes/` — 通用路由(任何类型都拷贝)\n */\nconst FEATURE_ROUTE_DIRS: Record<string, string[]> = {\n iam: ['routes-shared'],\n storage: ['routes'],\n ai: ['routes'],\n payment: ['routes'],\n vecdb: ['routes'],\n datapipe: ['routes'],\n reach: ['routes'],\n scheduler: ['routes'],\n audit: ['routes'],\n}\n\n/**\n * feature 的 appType 专用路由\n */\nconst FEATURE_APP_ROUTE_DIRS: Record<string, string[]> = {\n iam: ['admin', 'h5', 'website'],\n}\n\nconst FEATURE_ID_REGEX = /^[a-z0-9-]+$/\nconst HBS_SUFFIX_REGEX = /\\.hbs$/\nconst FULLSTACK_FRONTEND_TEMPLATE_PATH_REGEX = /^apps\\/\\{\\{projectName\\}\\}-(web|app|desktop|miniapp)\\//\nconst NON_IDENTIFIER_CHAR_REGEX = /[^a-z0-9]+/i\nconst IDENTIFIER_START_REGEX = /^[a-z_$]/i\n\n// =============================================================================\n// 路径工具\n// =============================================================================\n\n/**\n * 获取 templates/ 目录的绝对路径\n *\n * 兼容两种运行环境:\n * - 构建后:dist/cli-template-engine.js → ../templates\n * - 测试时:src/commands/cli-template-engine.ts → ../../templates\n */\nfunction getTemplatesRoot(): string {\n const currentDir = path.dirname(fileURLToPath(import.meta.url))\n // 优先尝试 dist 模式(../templates),再尝试 src 模式(../../templates)\n const distPath = path.resolve(currentDir, '..', 'templates')\n if (fse.pathExistsSync(distPath)) {\n return distPath\n }\n return path.resolve(currentDir, '..', '..', 'templates')\n}\n\n// =============================================================================\n// 拷贝工具\n// =============================================================================\n\n/**\n * 拷贝目录,自动跳过 .hbs 文件(这些由 renderDynamicFiles 处理)\n *\n * @param src - 源目录\n * @param dest - 目标目录\n * @param excludePaths - 需要排除的相对路径前缀(如 'messages')\n */\nasync function copyStaticDir(src: string, dest: string, excludePaths?: string[]): Promise<void> {\n if (!(await fse.pathExists(src))) {\n return\n }\n\n await fse.copy(src, dest, {\n overwrite: true,\n filter: (filePath: string) => {\n const rel = path.relative(src, filePath)\n // 含 Handlebars 占位符的路径必须走动态渲染,避免复制出字面量目录\n if (rel.includes('{{') || rel.includes('}}')) {\n return false\n }\n // 跳过 .hbs 模板文件\n if (filePath.endsWith('.hbs')) {\n return false\n }\n // 跳过排除路径\n if (excludePaths && excludePaths.length > 0) {\n return !excludePaths.some(p => rel === p || rel.startsWith(`${p}${path.sep}`))\n }\n return true\n },\n })\n}\n\n/**\n * 查找目录中所有 .hbs 文件并返回相对路径\n */\nasync function findHbsFiles(dir: string): Promise<string[]> {\n if (!(await fse.pathExists(dir))) {\n return []\n }\n\n const results: string[] = []\n\n async function walk(current: string): Promise<void> {\n const entries = await fse.readdir(current, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(fullPath)\n }\n else if (entry.name.endsWith('.hbs')) {\n results.push(path.relative(dir, fullPath))\n }\n }\n }\n\n await walk(dir)\n return results\n}\n\n/**\n * 查找位于动态路径中的静态资源。\n *\n * 普通静态文件已经由 copyStaticDir 复制;这里专门补上带 Handlebars 路径片段\n * 的资源,例如 fullstack Tauri 图标目录。\n */\nasync function findRenderedStaticPathFiles(dir: string): Promise<string[]> {\n if (!(await fse.pathExists(dir))) {\n return []\n }\n\n const results: string[] = []\n\n async function walk(current: string): Promise<void> {\n const entries = await fse.readdir(current, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(fullPath)\n continue\n }\n\n const relPath = path.relative(dir, fullPath)\n if (!entry.name.endsWith('.hbs') && (relPath.includes('{{') || relPath.includes('}}'))) {\n results.push(relPath)\n }\n }\n }\n\n await walk(dir)\n return results\n}\n\n// =============================================================================\n// 构建上下文\n// =============================================================================\n\n/**\n * 根据用户选项构建模板渲染上下文\n * 纯上下文构建,不创建文件、不安装依赖;始终补齐应用骨架及功能的硬依赖。\n * 不执行创建命令的交互输入校验;直接调用者仍须验证用户输入。\n * @param options - 工程类型、启用功能、包管理器与模块默认值。\n * @param options.name - 新工程名称。\n * @param options.appType - 应用骨架类型。\n * @param options.features - 启用的功能,函数补齐硬依赖。\n * @param options.frontends - fullstack 前端目标;省略使用默认目标。\n * @param options.moduleConfigs - 用户指定模块、语言、主题和端口。\n * @param options.packageManager - pnpm 使用 catalog,其他管理器使用具体版本。\n * @param options.deploy - 默认 true;false 明确关闭部署开发依赖。\n * @returns 已补硬依赖与默认值的模板上下文。\n * @example 模块内部上下文\n * ```ts\n * const context = buildTemplateContext({ name: 'shop', appType: 'fullstack', features: ['ai'], frontends: ['web'], packageManager: 'pnpm' })\n * const usesSharedAi = context.features.db && context.features.vecdb\n * ```\n */\nexport function buildTemplateContext(options: {\n name: string\n appType: AppType\n features: FeatureId[]\n frontends?: readonly FrontendTarget[]\n moduleConfigs?: ModuleConfigs\n packageManager: string\n deploy?: boolean\n}): TemplateContext {\n const featureMap: Record<string, boolean> = {}\n for (const f of options.features) {\n featureMap[f] = true\n }\n featureMap.deploy = options.deploy !== false\n\n // fullstack 默认交付完整 mini 管理功能,不能移除其必需模块。\n if (options.appType === 'fullstack') {\n for (const feature of ['iam', 'db', 'cache', 'crypto', 'storage', 'audit']) featureMap[feature] = true\n }\n\n // feedback 默认使用独立控制台通知;HTTP 接入仍复用可信认证、持久化和附件。\n if (featureMap.feedback) {\n for (const feature of ['db', 'storage', 'iam']) featureMap[feature] = true\n }\n\n // 强制补全模块硬依赖,防止调用方未经过 resolveFeatureDependencies 时遗漏依赖\n // iam 依赖 reldb(用户/角色/权限持久化)和 cache(会话/OTP 缓存),以及 crypto(密码哈希)\n if (featureMap.iam) {\n featureMap.db = true\n featureMap.cache = true\n featureMap.crypto = true\n }\n // audit / scheduler / payment 依赖 reldb\n if (featureMap.audit || featureMap.scheduler || featureMap.payment || featureMap.crypto) {\n featureMap.db = true\n }\n // AI 的共享会话、记忆和知识依赖持久关系库与向量库。\n if (featureMap.ai) {\n featureMap.db = true\n featureMap.vecdb = true\n }\n\n const isApi = options.appType === 'api'\n const isFullstack = options.appType === 'fullstack'\n const isCapacitorApp = options.appType === 'mobile-app'\n const isSvelteOnlyApp = isCapacitorApp\n const useCatalogProtocol = options.packageManager === 'pnpm'\n const hasUi = !isApi && !isFullstack\n const selectedFrontends = options.frontends ?? DEFAULT_FULLSTACK_FRONTENDS\n let haiCatalogPackages: TemplateContext['haiCatalogPackages']\n if (isFullstack) {\n haiCatalogPackages = buildFullstackCatalogPackages(selectedFrontends, featureMap.deploy, featureMap)\n }\n else if (isApi) {\n haiCatalogPackages = buildApiWorkspaceCatalogPackages(featureMap)\n }\n else {\n haiCatalogPackages = buildAppHaiCatalogPackages({\n featureMap,\n hasUi,\n isCapacitorApp,\n isSvelteOnlyApp,\n })\n }\n\n return {\n projectName: options.name,\n versions: VERSIONS,\n useCatalogProtocol,\n haiPackageSpecifier: useCatalogProtocol ? HAI_PACKAGE_SPECIFIER_CATALOG : HAI_PACKAGE_VERSION,\n haiPackageVersion: HAI_PACKAGE_VERSION,\n haiCatalogPackages,\n appType: options.appType,\n features: featureMap,\n moduleConfigs: options.moduleConfigs,\n hasUi,\n hasI18n: !isApi && !isFullstack,\n websiteServerFeatures: Object.keys(featureMap).filter(feature => featureMap[feature] && !['deploy', 'ui', 'kit', 'datapipe'].includes(feature)),\n isCapacitorApp,\n isApiWorkspace: isApi,\n isSvelteOnlyApp,\n defaultLocale: options.moduleConfigs?.core?.defaultLocale ?? 'zh-CN',\n packageManager: options.packageManager,\n api: isApi\n ? buildApiWorkspaceTemplateContext(options.name, useCatalogProtocol)\n : undefined,\n fullstack: isFullstack\n ? buildFullstackTemplateContext(\n options.name,\n selectedFrontends,\n options.moduleConfigs,\n useCatalogProtocol,\n )\n : undefined,\n }\n}\n\nfunction buildApiWorkspaceTemplateContext(\n projectName: string,\n useCatalogProtocol = false,\n): ApiWorkspaceTemplateContext {\n const identifier = toIdentifier(projectName)\n const pascalName = toPascalIdentifier(identifier)\n\n return {\n versions: VERSIONS,\n packageSpecifiers: buildFullstackPackageSpecifiers(useCatalogProtocol),\n contractPackageName: `${projectName}-contract`,\n contractExportName: `${identifier}Contract`,\n servPackageName: `${projectName}-serv`,\n serviceAppFactoryName: `create${pascalName}App`,\n serviceProceduresFactoryName: `create${pascalName}Procedures`,\n }\n}\n\nfunction buildFullstackTemplateContext(\n projectName: string,\n frontendsInput: readonly FrontendTarget[],\n moduleConfigs?: ModuleConfigs,\n useCatalogProtocol = false,\n): FullstackTemplateContext {\n const selectedFrontends = [...new Set(frontendsInput.length > 0 ? frontendsInput : DEFAULT_FULLSTACK_FRONTENDS)]\n\n const portsConfig = moduleConfigs?.fullstack?.ports ?? {}\n const portFor = (target: ImplementedFrontendTarget): number =>\n portsConfig[target] ?? FRONTEND_PORTS_DEFAULT[target]\n\n const frontendApps = selectedFrontends\n .filter(isImplementedFrontend)\n .map(target => ({\n target,\n packageName: `${projectName}-${target}`,\n label: FRONTEND_LABELS[target],\n port: portFor(target),\n }))\n\n return {\n appName: moduleConfigs?.core?.name ?? projectName,\n versions: VERSIONS,\n packageSpecifiers: buildFullstackPackageSpecifiers(useCatalogProtocol),\n contractPackageName: `${projectName}-contract`,\n contractExportName: `${toIdentifier(projectName)}Contract`,\n servPackageName: `${projectName}-serv`,\n nativeAppIdSegment: toIdentifier(projectName).toLowerCase(),\n sharedPackageName: `${projectName}-shared`,\n selectedFrontends,\n selectedFrontendsJson: `[${selectedFrontends.map(f => `'${f}'`).join(', ')}]`,\n frontendApps,\n e2eFrontend: frontendApps[0],\n frontends: {\n web: selectedFrontends.includes('web'),\n app: selectedFrontends.includes('app'),\n miniapp: selectedFrontends.includes('miniapp'),\n desktop: selectedFrontends.includes('desktop'),\n },\n ports: {\n web: portFor('web'),\n app: portFor('app'),\n desktop: portFor('desktop'),\n },\n hasMiniapp: selectedFrontends.includes('miniapp'),\n i18n: resolveI18nContext(moduleConfigs),\n theme: resolveThemeContext(moduleConfigs),\n }\n}\n\n/**\n * 按用户配置、core 默认语言与框架回退语言解析列表;去重并补入基础语言,不执行 locale 名称合法性校验。\n * @param moduleConfigs - 创建选项中的模块配置。\n * @returns 至少包含基础语言的最终 i18n 数据。\n * @example 模块内部上下文\n * ```ts\n * const i18n = resolveI18nContext({ fullstack: { i18n: { baseLocale: 'en-US', locales: ['zh-CN'] } } })\n * const base = i18n.locales[0] // en-US 会补在首位。\n * ```\n */\nfunction resolveI18nContext(moduleConfigs?: ModuleConfigs): FullstackI18nContext {\n const coreLocale = moduleConfigs?.core?.defaultLocale ?? 'zh-CN'\n const baseLocale = moduleConfigs?.fullstack?.i18n?.baseLocale ?? coreLocale\n const requested = moduleConfigs?.fullstack?.i18n?.locales\n const locales = requested && requested.length > 0\n ? [...new Set(requested)]\n : [...new Set([baseLocale, 'zh-CN', 'en-US', 'ja-JP'])]\n if (!locales.includes(baseLocale)) {\n locales.unshift(baseLocale)\n }\n return { baseLocale, locales }\n}\n\n/**\n * 去重主题列表并确保默认主题可选;未配置时提供亮/暗、高对比与直角商务主题。\n * @param moduleConfigs - 创建选项中的模块配置。\n * @returns 包含默认主题的最终主题数据。\n * @example 模块内部上下文\n * ```ts\n * const theme = resolveThemeContext({ fullstack: { theme: { defaultTheme: 'dark', themes: ['light'] } } })\n * const first = theme.themes[0] // dark\n * ```\n */\nfunction resolveThemeContext(moduleConfigs?: ModuleConfigs): FullstackThemeContext {\n const defaultTheme = moduleConfigs?.fullstack?.theme?.defaultTheme ?? DEFAULT_THEME_NAME\n const requested = moduleConfigs?.fullstack?.theme?.themes\n const themes = requested && requested.length > 0\n ? [...new Set(requested)]\n : [...DEFAULT_THEMES]\n if (!themes.includes(defaultTheme)) {\n themes.unshift(defaultTheme)\n }\n return { defaultTheme, themes }\n}\n\nfunction isImplementedFrontend(target: FrontendTarget): target is ImplementedFrontendTarget {\n return IMPLEMENTED_FRONTENDS.includes(target)\n}\n\nfunction toIdentifier(value: string): string {\n const words = value\n .split(NON_IDENTIFIER_CHAR_REGEX)\n .filter(Boolean)\n const camel = words\n .map((word, index) => {\n const normalized = word.toLowerCase()\n return index === 0\n ? normalized\n : `${normalized.charAt(0).toUpperCase()}${normalized.slice(1)}`\n })\n .join('')\n if (!camel)\n return 'app'\n return IDENTIFIER_START_REGEX.test(camel) ? camel : `app${camel}`\n}\n\nfunction toPascalIdentifier(value: string): string {\n if (!value)\n return 'App'\n return `${value.charAt(0).toUpperCase()}${value.slice(1)}`\n}\n\n// =============================================================================\n// 核心:生成项目\n// =============================================================================\n\n/**\n * 从模板生成项目\n *\n * 执行流程:\n * 1. 拷贝 base 静态文件\n * 2. 拷贝 apps/{appType} 路由\n * 3. 叠加选中 feature 的路由\n * 4. 渲染所有 .hbs 动态模板\n *\n * 将模板骨架、功能路由与共享脚本写入指定目录;不会安装依赖或初始化 Git。\n * @param projectPath - 项目目标目录\n * @param context - 模板渲染上下文\n * @throws Error - 模板读取、渲染、路径校验或文件写入失败。\n * @returns 模板文件与共享脚本写入完成。\n * @example 模块内部上下文\n * ```ts\n * const context = buildTemplateContext({ name: 'shop', appType: 'api', features: ['ai'], packageManager: 'pnpm' })\n * // 目标为新工程目录;调用方先检查目录与选项。\n * await generateFromTemplates(path.resolve('shop'), context)\n * ```\n */\nexport async function generateFromTemplates(\n projectPath: string,\n context: TemplateContext,\n): Promise<void> {\n const root = getTemplatesRoot()\n const includeBaseTemplate = context.appType !== 'fullstack' && !context.isApiWorkspace\n\n // ─── ① 拷贝 base 骨架(静态文件) ───\n if (includeBaseTemplate) {\n await copyStaticDir(path.join(root, 'base'), projectPath)\n }\n else {\n // API/fullstack 自有骨架,质量门禁仍复用单包模板的同一份规则。\n await fse.copy(path.join(root, 'base', 'eslint-rules.js'), path.join(projectPath, 'eslint-rules.js'))\n }\n\n // ─── ② 拷贝 apps/{appType} 路由 ───\n // messages/ 目录仅在 hasI18n 时拷贝\n const appDir = path.join(root, 'apps', context.appType)\n if (await fse.pathExists(appDir)) {\n const appExcludes = context.hasI18n ? [] : ['messages']\n await copyStaticDir(appDir, projectPath, appExcludes)\n }\n\n // ─── ③ 叠加 feature 路由 ───\n if (!context.isApiWorkspace && context.appType !== 'fullstack') {\n for (const featureId of Object.keys(context.features)) {\n if (context.isSvelteOnlyApp) {\n continue\n }\n\n if (!context.features[featureId]) {\n continue\n }\n\n // 安全校验:featureId 只允许字母、数字和连字符,防止路径遍历\n if (!FEATURE_ID_REGEX.test(featureId)) {\n continue\n }\n\n const featureDir = path.join(root, 'features', featureId)\n if (!(await fse.pathExists(featureDir))) {\n continue\n }\n\n // 通用路由(routes/)\n const sharedDirs = FEATURE_ROUTE_DIRS[featureId] || []\n for (const dirName of sharedDirs) {\n // Capacitor SPA 无服务端运行时,跳过服务端 API 路由(routes-shared)\n if (context.isCapacitorApp && dirName === 'routes-shared') {\n continue\n }\n const routesSrc = path.join(featureDir, dirName)\n if (await fse.pathExists(routesSrc)) {\n await copyStaticDir(routesSrc, path.join(projectPath, 'src', 'routes'))\n }\n }\n\n // appType 专用路由(routes-{appType})\n const appSpecificTypes = FEATURE_APP_ROUTE_DIRS[featureId] || []\n if (appSpecificTypes.includes(context.appType)) {\n const appRouteSrc = path.join(featureDir, `routes-${context.appType}`)\n if (await fse.pathExists(appRouteSrc)) {\n await copyStaticDir(appRouteSrc, path.join(projectPath, 'src', 'routes'))\n }\n }\n }\n }\n\n // ─── ④ 渲染 .hbs 动态模板 ───\n await renderDynamicFiles(root, projectPath, context)\n\n // 多包模板不继承 base;所有应用统一复制共享启动与 E2E 清理入口。\n await fse.copy(path.join(root, 'shared', 'run-e2e.mjs'), path.join(projectPath, 'scripts', 'run-e2e.mjs'))\n await fse.copy(path.join(root, 'shared', 'run-node.mjs'), path.join(projectPath, 'scripts', 'run-node.mjs'))\n await fse.copy(path.join(root, 'shared', 'e2e-env.ts'), path.join(projectPath, 'scripts', 'e2e-env.ts'))\n await fse.copy(path.join(root, 'shared', 'build-metadata.ts'), path.join(projectPath, 'scripts', 'build-metadata.ts'))\n await fse.copy(path.join(root, 'shared', 'public-base-path.mjs'), path.join(projectPath, 'scripts', 'public-base-path.mjs'))\n await fse.ensureDir(path.join(projectPath, 'images', 'dependencies'))\n await fse.writeFile(path.join(projectPath, 'images', 'dependencies', '.gitkeep'), '')\n await fse.copy(path.join(root, 'shared', '.gitattributes'), path.join(projectPath, '.gitattributes'))\n if (context.isSvelteOnlyApp) {\n await fse.copy(path.join(root, 'shared', 'vite-runtime-config.ts'), path.join(projectPath, 'scripts', 'vite-runtime-config.ts'))\n await fse.copy(path.join(root, 'shared', 'container-runtime-config.sh'), path.join(projectPath, 'images', 'web', '19-runtime-config.sh'))\n }\n\n if (context.isSvelteOnlyApp || context.appType === 'fullstack') {\n const navigationDir = context.appType === 'fullstack'\n ? path.join(projectPath, 'packages', `${context.projectName}-shared`, 'src', 'lib', 'navigation')\n : path.join(projectPath, 'src', 'lib', 'navigation')\n await fse.copy(path.join(root, 'shared', 'hash-router.svelte.ts'), path.join(navigationDir, 'hash-router.svelte.ts'))\n }\n\n // ─── ⑤ 拷贝 i18n 脚手架(project.inlang + messages) ───\n if (context.hasI18n) {\n const i18nDir = path.join(root, 'i18n')\n if (await fse.pathExists(i18nDir)) {\n await fse.copy(i18nDir, projectPath, { overwrite: true })\n const settingsPath = path.join(projectPath, 'project.inlang', 'settings.json')\n const settings = await fse.readJson(settingsPath)\n await fse.writeJson(settingsPath, { ...settings, baseLocale: context.defaultLocale }, { spaces: 2 })\n }\n }\n\n // ─── ⑥ 确保 static 目录存在 ───\n if (includeBaseTemplate) {\n await fse.ensureDir(path.join(projectPath, 'static'))\n }\n}\n\n// =============================================================================\n// 动态模板渲染\n// =============================================================================\n\n/**\n * 渲染所有 .hbs 文件:base、apps/{appType}、以及选中 feature 的路由目录\n *\n * base / apps 的 .hbs 渲染后输出到 projectPath 根目录;\n * feature 的 .hbs 渲染后输出到 projectPath/src/routes/。\n */\nasync function renderDynamicFiles(\n templatesRoot: string,\n projectPath: string,\n context: TemplateContext,\n): Promise<void> {\n // ── base + apps/{appType} → 输出到项目根 ──\n const rootDirs = context.appType === 'fullstack' || context.isApiWorkspace\n ? [path.join(templatesRoot, 'apps', context.appType)]\n : [\n path.join(templatesRoot, 'base'),\n path.join(templatesRoot, 'apps', context.appType),\n ]\n\n for (const dir of rootDirs) {\n await renderHbsInDir(dir, projectPath, context)\n await copyRenderedStaticPathFiles(dir, projectPath, context)\n }\n\n // ── feature 路由 → 输出到 src/routes/ ──\n if (context.isApiWorkspace || context.appType === 'fullstack') {\n return\n }\n\n const routesDest = path.join(projectPath, 'src', 'routes')\n for (const featureId of Object.keys(context.features)) {\n if (context.isSvelteOnlyApp) {\n continue\n }\n\n if (!context.features[featureId]) {\n continue\n }\n\n const featureDir = path.join(templatesRoot, 'features', featureId)\n if (!(await fse.pathExists(featureDir))) {\n continue\n }\n\n // 通用路由(routes-shared / routes 等)\n const sharedDirs = FEATURE_ROUTE_DIRS[featureId] || []\n for (const dirName of sharedDirs) {\n // Capacitor SPA 无服务端运行时,跳过服务端 API 路由(routes-shared)\n if (context.isCapacitorApp && dirName === 'routes-shared') {\n continue\n }\n await renderHbsInDir(path.join(featureDir, dirName), routesDest, context)\n }\n\n // appType 专用路由(routes-{appType})\n const appSpecificTypes = FEATURE_APP_ROUTE_DIRS[featureId] || []\n if (appSpecificTypes.includes(context.appType)) {\n await renderHbsInDir(\n path.join(featureDir, `routes-${context.appType}`),\n routesDest,\n context,\n )\n }\n }\n}\n\n/**\n * 渲染指定目录下所有 .hbs 文件并输出到目标目录(去掉 .hbs 后缀)\n */\nasync function renderHbsInDir(\n dir: string,\n destRoot: string,\n context: TemplateContext,\n): Promise<void> {\n const hbsFiles = await findHbsFiles(dir)\n for (const relPath of hbsFiles) {\n const srcPath = path.join(dir, relPath)\n const outRelPathTemplate = relPath.replace(HBS_SUFFIX_REGEX, '')\n\n const template = await fse.readFile(srcPath, 'utf-8')\n const compiled = Handlebars.compile(template, { noEscape: true })\n const rendered = compiled(context)\n if (shouldSkipRenderedFile(template, rendered)) {\n continue\n }\n\n const outRelPath = renderOutputPath(outRelPathTemplate, context)\n if (!isSafeRelativePath(outRelPath)) {\n continue\n }\n\n // Capacitor SPA 跳过服务端专属文件(hooks / server init)\n if (context.isCapacitorApp && CAPACITOR_SKIPPED_SERVER_FILES.has(outRelPath.split(path.sep).join('/'))) {\n continue\n }\n\n const destPath = path.join(destRoot, outRelPath)\n const configMatch = /(?:^|[/\\\\])config[/\\\\]_([^/\\\\]+)\\.ya?ml$/.exec(outRelPath)\n const normalizedRendered = normalizeRenderedContent(configMatch ? documentConfig(configMatch[1], parameterizeConfig(configMatch[1], rendered)) : rendered, outRelPath)\n\n await fse.ensureDir(path.dirname(destPath))\n await fse.writeFile(destPath, normalizedRendered, 'utf-8')\n }\n}\n\nasync function copyRenderedStaticPathFiles(\n dir: string,\n destRoot: string,\n context: TemplateContext,\n): Promise<void> {\n const staticFiles = await findRenderedStaticPathFiles(dir)\n for (const relPath of staticFiles) {\n if (!shouldCopyRenderedStaticPathFile(relPath, context)) {\n continue\n }\n\n const outRelPath = renderOutputPath(relPath, context)\n if (!isSafeRelativePath(outRelPath)) {\n continue\n }\n\n const srcPath = path.join(dir, relPath)\n const destPath = path.join(destRoot, outRelPath)\n await fse.ensureDir(path.dirname(destPath))\n await fse.copyFile(srcPath, destPath)\n }\n}\n\nfunction shouldCopyRenderedStaticPathFile(relPath: string, context: TemplateContext): boolean {\n if (context.appType !== 'fullstack' || !context.fullstack) {\n return true\n }\n\n const normalizedPath = relPath.split(path.sep).join('/')\n const frontendMatch = FULLSTACK_FRONTEND_TEMPLATE_PATH_REGEX.exec(normalizedPath)\n if (!frontendMatch) {\n return true\n }\n\n const target = frontendMatch[1] as FrontendTarget\n return Boolean(context.fullstack.frontends[target])\n}\n\nfunction normalizeRenderedContent(content: string, outRelPath: string): string {\n // 项目工具配置由多个模板分区组合,写入前统一校验 JSON 并规范缩进。\n if (path.basename(outRelPath) === 'hai.json')\n return `${JSON.stringify(JSON.parse(content), null, 2)}\\n`\n const normalizedLineEndings = content.replace(/\\r\\n/g, '\\n')\n const ext = path.extname(outRelPath)\n const normalized = NORMALIZED_RENDER_EXTENSIONS.has(ext)\n ? normalizedLineEndings.replace(/\\n{3,}/g, '\\n\\n')\n : normalizedLineEndings\n if (normalized.trim().length === 0) {\n return ''\n }\n return normalized.endsWith('\\n') ? normalized : `${normalized}\\n`\n}\n\nfunction shouldSkipRenderedFile(template: string, rendered: string): boolean {\n return template.includes(TEMPLATE_SKIP_IF_EMPTY_MARKER) && rendered.trim().length === 0\n}\n\nfunction renderOutputPath(pathTemplate: string, context: TemplateContext): string {\n const normalizedTemplate = pathTemplate.split(path.sep).join('/')\n return Handlebars.compile(normalizedTemplate, { noEscape: true })(context)\n}\n\n/**\n * 渲染后的输出路径只允许根内相对路径,拒绝绝对路径与任意 .. 段;不能替代已有目录的 realpath 检查。\n * @param relativePath - 模板渲染后的相对输出路径。\n * @returns 路径符合模板输出边界时为 true。\n * @example 模块内部上下文\n * ```ts\n * const valid = isSafeRelativePath('src/server/orders.ts')\n * const escaped = isSafeRelativePath('../outside.ts') // false\n * ```\n */\nfunction isSafeRelativePath(relativePath: string): boolean {\n const normalized = path.normalize(relativePath)\n return !path.isAbsolute(normalized) && normalized !== '..' && !normalized.startsWith(`..${path.sep}`)\n}\n","/**\n * @h-ai/cli — 项目创建命令\n *\n * 基于模板的交互式项目创建:\n * 1. 交互式收集选项(appType / features / moduleConfigs)\n * 2. 拷贝 base 骨架 + appType 路由 + feature 路由\n * 3. 渲染动态模板(init.ts / hooks.server.ts / package.json)\n * 4. 生成配置文件、.env、Skill 文件\n *\n * @module cli-create\n */\n\nimport type { AppType, CreateProjectOptions, FeatureDefinition, FeatureId, FrontendTarget, ModuleConfigs, ProjectInfo } from '../cli-types.js'\nimport type { ConfigEnvironmentVariable } from './cli-config-environment.js'\nimport { Buffer } from 'node:buffer'\nimport { execFileSync, execSync } from 'node:child_process'\nimport { createECDH, randomBytes } from 'node:crypto'\nimport path from 'node:path'\nimport process from 'node:process'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { detectPackageManager, fileExists, formatPromptDescription, writeCliError, writeCliMessage, writeFile } from '../cli-utils.js'\nimport { renderEnvironment, runtimeEnvironmentVariables } from './cli-config-environment.js'\nimport { buildTemplateContext, generateFromTemplates } from './cli-template-engine.js'\n\n// =============================================================================\n// 应用类型定义\n// =============================================================================\n\n/** Git 远程地址校验 */\nconst RE_HTTPS_URL = /^https:\\/\\/.+/\nconst RE_GIT_SSH_URL = /^git@.+:.+/\n\n/**\n * 应用类型定义;展示字段延迟读取当前 locale,避免模块首次导入时固定语言。\n */\nconst APP_TYPES: Record<AppType, { name: string, description: string }> = {\n 'admin': {\n get name() {\n return cliM('cli_appAdminName')\n },\n get description() {\n return cliM('cli_appAdminDescription')\n },\n },\n 'website': {\n get name() {\n return cliM('cli_appWebsiteName')\n },\n get description() {\n return cliM('cli_appWebsiteDescription')\n },\n },\n 'h5': {\n get name() {\n return cliM('cli_appH5Name')\n },\n get description() {\n return cliM('cli_appH5Description')\n },\n },\n 'api': {\n get name() {\n return cliM('cli_appApiName')\n },\n get description() {\n return cliM('cli_appApiDescription')\n },\n },\n 'mobile-app': {\n get name() {\n return cliM('cli_appMobileName')\n },\n get description() {\n return cliM('cli_appMobileDescription')\n },\n },\n 'fullstack': {\n get name() {\n return cliM('cli_appFullstackName')\n },\n get description() {\n return cliM('cli_appFullstackDescription')\n },\n },\n}\n\nconst FRONTEND_TARGETS: Record<FrontendTarget, { name: string, description: string, implemented: boolean }> = {\n web: { name: 'Web', get description() {\n return cliM('cli_frontendWebDescription')\n }, implemented: true },\n app: { name: 'App', get description() {\n return cliM('cli_frontendAppDescription')\n }, implemented: true },\n miniapp: {\n get name() {\n return cliM('cli_frontendMiniappName')\n },\n get description() {\n return cliM('cli_frontendMiniappDescription')\n },\n implemented: false,\n },\n desktop: {\n get name() {\n return cliM('cli_frontendDesktopName')\n },\n get description() {\n return cliM('cli_frontendDesktopDescription')\n },\n implemented: true,\n },\n}\n\nconst DEFAULT_FULLSTACK_FRONTENDS: FrontendTarget[] = ['web', 'app', 'desktop']\n\n// =============================================================================\n// 功能定义\n// =============================================================================\n\n/**\n * 功能定义\n */\nconst FEATURES: Record<string, FeatureDefinition> = {\n 'iam': {\n id: 'iam',\n get name() {\n return cliM('cli_featureIamName')\n },\n get description() {\n return cliM('cli_featureIamDescription')\n },\n packages: ['@h-ai/iam'],\n dependencies: ['crypto', 'db', 'cache'],\n },\n 'db': {\n id: 'db',\n get name() {\n return cliM('cli_featureDbName')\n },\n get description() {\n return cliM('cli_featureDbDescription')\n },\n packages: ['@h-ai/reldb'],\n },\n 'cache': {\n id: 'cache',\n get name() {\n return cliM('cli_featureCacheName')\n },\n get description() {\n return cliM('cli_featureCacheDescription')\n },\n packages: ['@h-ai/cache'],\n },\n 'ai': {\n id: 'ai',\n get name() {\n return cliM('cli_featureAiName')\n },\n get description() {\n return cliM('cli_featureAiDescription')\n },\n packages: ['@h-ai/ai'],\n dependencies: ['db', 'vecdb'],\n },\n 'storage': {\n id: 'storage',\n get name() {\n return cliM('cli_featureStorageName')\n },\n get description() {\n return cliM('cli_featureStorageDescription')\n },\n packages: ['@h-ai/storage'],\n },\n 'crypto': {\n id: 'crypto',\n get name() {\n return cliM('cli_featureCryptoName')\n },\n get description() {\n return cliM('cli_featureCryptoDescription')\n },\n packages: ['@h-ai/crypto'],\n dependencies: ['db'],\n },\n 'audit': {\n id: 'audit',\n get name() {\n return cliM('cli_featureAuditName')\n },\n get description() {\n return cliM('cli_featureAuditDescription')\n },\n packages: ['@h-ai/audit'],\n dependencies: ['db'],\n },\n 'reach': {\n id: 'reach',\n get name() {\n return cliM('cli_featureReachName')\n },\n get description() {\n return cliM('cli_featureReachDescription')\n },\n packages: ['@h-ai/reach'],\n },\n 'feedback': {\n id: 'feedback',\n get name() {\n return cliM('cli_featureFeedbackName')\n },\n get description() {\n return cliM('cli_featureFeedbackDescription')\n },\n packages: ['@h-ai/feedback'],\n dependencies: ['db', 'storage', 'iam'],\n },\n 'payment': {\n id: 'payment',\n get name() {\n return cliM('cli_featurePaymentName')\n },\n get description() {\n return cliM('cli_featurePaymentDescription')\n },\n packages: ['@h-ai/payment'],\n dependencies: ['db'],\n },\n 'vecdb': {\n id: 'vecdb',\n get name() {\n return cliM('cli_featureVecdbName')\n },\n get description() {\n return cliM('cli_featureVecdbDescription')\n },\n packages: ['@h-ai/vecdb'],\n },\n 'datapipe': {\n id: 'datapipe',\n get name() {\n return cliM('cli_featureDatapipeName')\n },\n get description() {\n return cliM('cli_featureDatapipeDescription')\n },\n packages: ['@h-ai/datapipe'],\n },\n 'scheduler': {\n id: 'scheduler',\n get name() {\n return cliM('cli_featureSchedulerName')\n },\n get description() {\n return cliM('cli_featureSchedulerDescription')\n },\n packages: ['@h-ai/scheduler'],\n dependencies: ['db'],\n },\n 'deploy': {\n id: 'deploy',\n get name() {\n return cliM('cli_featureDeployName')\n },\n get description() {\n return cliM('cli_featureDeployDescription')\n },\n packages: ['@h-ai/deploy'],\n },\n 'api-client': {\n id: 'api-client',\n get name() {\n return cliM('cli_featureApiClientName')\n },\n get description() {\n return cliM('cli_featureApiClientDescription')\n },\n packages: ['@h-ai/api-client'],\n },\n 'capacitor': {\n id: 'capacitor',\n get name() {\n return cliM('cli_featureCapacitorName')\n },\n get description() {\n return cliM('cli_featureCapacitorDescription')\n },\n packages: ['@h-ai/capacitor'],\n },\n}\n\n/** 各模板的实际功能;配置参考完整交付,不通过安装全部模块来保留示例。 */\nconst TEMPLATE_FEATURES: Record<AppType, FeatureId[]> = {\n 'admin': ['iam', 'reach'],\n 'website': [],\n 'h5': ['iam', 'reach'],\n 'api': ['iam', 'reach', 'storage', 'feedback'],\n 'mobile-app': ['iam', 'crypto', 'api-client', 'capacitor'],\n 'fullstack': ['iam', 'storage', 'audit', 'reach', 'scheduler', 'feedback'],\n}\nconst PROJECT_NAME_REGEX = /^[a-z0-9-]+$/\n\n/**\n * 创建项目\n * 按应用类型生成工程并补齐功能硬依赖;--no-install 不安装依赖,--no-git 不初始化仓库。\n * @throws Error - 选项、目标目录、模板生成、依赖安装或 Git 初始化失败。\n * @param options - 命令参数;对应命令的工作目录、非交互与可选功能。\n * @returns 生成及所选安装/Git 步骤完成。\n * @example 模块内部上下文\n * ```ts\n * // 在当前目录创建新的 shop 子目录;目标必须不存在或为空。\n * await createProject({ cwd: process.cwd(), name: 'shop', appType: 'api', packageManager: 'pnpm', defaults: true, install: false, git: false, deploy: false })\n * // 对应 hai create shop --type api --defaults --no-install --no-git --no-deploy。\n * ```\n */\nexport async function createProject(options: CreateProjectOptions): Promise<void> {\n const spinner = ora()\n\n try {\n if (['template', 'features', 'examples', 'yes'].some(key => Object.hasOwn(options, key)))\n throw new Error(cliM('cli_createOptionsRemoved'))\n // 交互式获取选项\n const resolvedOptions = await resolveOptions(options)\n\n // 安全校验:项目名必须仅含小写字母、数字和连字符,防止路径遍历\n if (!PROJECT_NAME_REGEX.test(resolvedOptions.name))\n throw new Error(cliM('cli_createInvalidName', { params: { name: resolvedOptions.name } }))\n\n const projectPath = path.resolve(resolvedOptions.cwd ?? '.', resolvedOptions.name)\n\n // 检查目录是否存在\n if (await fileExists(projectPath)) {\n if (resolvedOptions.defaults)\n throw new Error(cliM('cli_createDirectoryExists'))\n const { overwrite } = await prompts({\n type: 'confirm',\n active: cliM('cli_yes'),\n inactive: cliM('cli_no'),\n name: 'overwrite',\n message: cliM('cli_createOverwrite', { params: { name: resolvedOptions.name } }),\n initial: false,\n })\n\n if (!overwrite) {\n writeCliMessage(chalk.yellow(cliM('cli_cancelled')))\n return\n }\n\n await fse.remove(projectPath)\n }\n\n spinner.start(cliM('cli_createDirectory'))\n await fse.ensureDir(projectPath)\n spinner.succeed()\n\n // ─── 基于模板生成项目文件 ───\n spinner.start(cliM('cli_createFiles'))\n\n const context = buildTemplateContext({\n name: resolvedOptions.name,\n appType: resolvedOptions.appType,\n features: resolvedOptions.features,\n deploy: resolvedOptions.deploy,\n frontends: resolvedOptions.frontends,\n moduleConfigs: resolvedOptions.moduleConfigs,\n packageManager: resolvedOptions.packageManager!,\n })\n\n // 拷贝模板 + 渲染动态文件\n await generateFromTemplates(projectPath, context)\n\n {\n // 生成配置文件(config/*.yml)\n const { generateConfigFile, generateEnvExample, generateProductionEnvironment } = await import('./cli-config-templates.js')\n const configs = resolvedOptions.moduleConfigs\n const isApiWorkspace = resolvedOptions.appType === 'api'\n const isFullstack = resolvedOptions.appType === 'fullstack'\n const configDir = isApiWorkspace\n ? path.join(projectPath, 'apps', `${resolvedOptions.name}-serv`, 'config')\n : isFullstack\n ? path.join(projectPath, 'packages', `${resolvedOptions.name}-serv`, 'config')\n : path.join(projectPath, 'config')\n const envExamplePath = isApiWorkspace\n ? path.join(projectPath, 'apps', `${resolvedOptions.name}-serv`, '.env.example')\n : path.join(projectPath, '.env.example')\n\n const enabledConfigs = new Set(['core', ...(context.isSvelteOnlyApp ? [] : resolvedOptions.features.map(getFeatureConfigKey).filter(Boolean))])\n if (isApiWorkspace || isFullstack)\n enabledConfigs.add('serv')\n else if (!context.isSvelteOnlyApp)\n enabledConfigs.add('kit')\n for (const configKey of ['core', 'serv', 'kit', 'db', 'cache', 'iam', 'storage', 'audit', 'reach', 'ai', 'vecdb', 'payment', 'scheduler', 'feedback']) {\n const configPath = path.join(configDir, `_${configKey}.yml`)\n // workspace 模板已渲染其入口及应用默认值,不能覆盖 Reach 通知模板等配置。\n if ((isApiWorkspace || isFullstack) && await fse.pathExists(configPath))\n continue\n const content = generateConfigFile(configKey, configs, enabledConfigs.has(configKey))\n await writeFile(configPath, configKey === 'feedback' ? content.replace('HAI_FEEDBACK_APPID:my-app', `HAI_FEEDBACK_APPID:${resolvedOptions.name}`) : content)\n }\n\n const configContents: Record<string, string> = {}\n for (const file of await fse.readdir(configDir)) {\n if (/^_.*\\.yml$/.test(file))\n configContents[file.slice(1, -4)] = await fse.readFile(path.join(configDir, file), 'utf8')\n }\n const envFeatures: FeatureId[] = context.isSvelteOnlyApp ? [] : isFullstack ? [...new Set<FeatureId>([...resolvedOptions.features, 'reach'])] : resolvedOptions.features\n const envContents = generateEnvExample(envFeatures, configs, true, configContents)\n let envExample = isApiWorkspace\n ? envContents\n : isFullstack\n ? `${envContents}\\n# First-start administrator password; must satisfy the IAM password policy.\\nHAI_ADMIN_DEFAULT_PASSWORD=\\n# Independent first-start audit/configuration administrator passwords.\\nHAI_AUDIT_ADMIN_PASSWORD=\\nHAI_CONFIG_ADMIN_PASSWORD=\\nHAI_BUSINESS_OPERATOR_PASSWORD=\\n\\n# Public API origin; never include credentials.\\nPUBLIC_API_BASE=http://127.0.0.1:3000\\n`\n : context.isSvelteOnlyApp\n ? `${envContents}\\n# Public API URL including /api/v1; never include credentials.\\nPUBLIC_API_BASE=http://10.0.2.2:3000/api/v1\\n`\n : envContents\n\n const runtimeVariables = new Map<string, ConfigEnvironmentVariable>()\n for (const file of await fse.readdir(projectPath, { recursive: true, encoding: 'utf8' })) {\n if (!/\\.(?:ts|js|mjs|svelte|envsh)$/.test(file))\n continue\n for (const variable of runtimeEnvironmentVariables(await fse.readFile(path.join(projectPath, file), 'utf8')))\n runtimeVariables.set(variable.name, variable)\n }\n const existingNames = new Set([...envExample.matchAll(/^(?:#\\s*)?([A-Z][A-Z0-9_]*)=/gm)].map(match => match[1]))\n const runtimeExample = renderEnvironment([...runtimeVariables.values()].filter(variable => !existingNames.has(variable.name)))\n if (runtimeExample)\n envExample += `\\n# 可选运行入口(按用途注入,不进入公共默认值):\\n${runtimeExample.split('\\n').map(line => line && !line.startsWith('#') ? `# ${line}` : line).join('\\n')}\\n`\n\n await writeFile(envExamplePath, envExample)\n const envDirectory = path.dirname(envExamplePath)\n const sharedVariables = envExample.split('\\n').filter(line => /^[A-Z][A-Z0-9_]*=/.test(line))\n await writeFile(path.join(envDirectory, '.env'), `# 公共基础配置(可提交);完整字段说明见 .env.example。\\n${sharedVariables.join('\\n')}\\n`)\n for (const [mode, environment] of [['dev', 'development'], ['test', 'test'], ['prod', 'production']] as const) {\n let privateValues = '# 模式私有配置,不提交 Git;各节点通过受管配置共享对应秘密。\\n'\n const values = mode === 'prod'\n ? generateProductionEnvironment(envFeatures, configs)\n : `# 公共 ${mode} 环境配置;本机私有值放 .env.local,进程环境变量优先。\\nHAI_CORE_ENV=${environment}\\nHAI_CORE_LOGGING_LEVEL=${mode === 'test' ? 'warn' : 'debug'}\\n`\n if (isFullstack) {\n // 各职责账号分别生成初始密码,仅写入模式私有文件。\n for (const name of ['HAI_ADMIN_DEFAULT_PASSWORD', 'HAI_AUDIT_ADMIN_PASSWORD', 'HAI_CONFIG_ADMIN_PASSWORD', 'HAI_BUSINESS_OPERATOR_PASSWORD'])\n privateValues += `\\n${name}=Aa1!${randomBytes(24).toString('base64url')}\\n`\n }\n if (isFullstack || (!context.isSvelteOnlyApp && resolvedOptions.features.includes('crypto'))) {\n // 每个环境独立生成版本化密钥环;运行时不隐式生成或轮换。\n const key = createECDH('SM2')\n key.generateKeys()\n const id = `${mode}-${randomBytes(6).toString('hex')}`\n const ring = { activeKeyId: id, keys: { [id]: { publicKey: key.getPublicKey('hex'), privateKey: key.getPrivateKey('hex').padStart(64, '0') } } }\n privateValues += `\\nHAI_CRYPTO_TRANSPORT_SERVERKEYRING='${JSON.stringify(ring)}'\\n`\n }\n await writeFile(path.join(envDirectory, `.env.${mode}`), values)\n await fse.writeFile(path.join(envDirectory, `.env.${mode}.local`), privateValues, { mode: 0o600 })\n }\n await fse.writeFile(path.join(envDirectory, '.env.local'), '# 本机通用私有覆盖,不提交 Git;初始密码和传输密钥环分别位于 .env.dev.local / .env.test.local / .env.prod.local。\\n', { mode: 0o600 })\n }\n\n // 生成 Skill 文件\n const { generateSkillFiles } = await import('./cli-skill-templates.js')\n await generateSkillFiles(\n projectPath,\n resolvedOptions.features,\n resolvedOptions.appType,\n resolvedOptions.name,\n )\n\n // 生成 README\n const appTypeLabel = cliM(`cli_app${({ 'admin': 'Admin', 'website': 'Website', 'h5': 'H5', 'api': 'Api', 'mobile-app': 'Mobile', 'fullstack': 'Fullstack' } as const)[resolvedOptions.appType]}Name`, { locale: 'zh-CN' })\n const readmeContent = resolvedOptions.appType === 'fullstack'\n ? generateFullstackReadme(resolvedOptions.name, resolvedOptions.packageManager!, resolvedOptions.frontends, resolvedOptions.features.includes('feedback'))\n : resolvedOptions.appType === 'api'\n ? generateApiWorkspaceReadme(resolvedOptions.name, resolvedOptions.packageManager!)\n : generateReadme(resolvedOptions.name, appTypeLabel, resolvedOptions.packageManager!, resolvedOptions.appType)\n await writeFile(\n path.join(projectPath, 'README.md'),\n resolvedOptions.deploy === false\n ? readmeContent.replace(/### 构建与部署[\\s\\S]*?(?=\\n#{2,3} |$)/, '### 构建\\n\\npnpm build\\npnpm build --target image\\n\\n本项目创建时关闭了部署工具。\\n')\n : readmeContent,\n )\n\n spinner.succeed()\n\n // 初始化 Git\n if (resolvedOptions.git) {\n spinner.start(cliM('cli_createGit'))\n execSync('git init', { cwd: projectPath, stdio: 'ignore' })\n if (resolvedOptions.gitRemote) {\n // 使用 execFileSync + 数组参数,避免 shell 注入\n // 同时在非交互模式下补充校验(交互模式在 prompts.validate 中已校验)\n const gitRemote = resolvedOptions.gitRemote\n if (!RE_HTTPS_URL.test(gitRemote) && !RE_GIT_SSH_URL.test(gitRemote)) {\n spinner.fail()\n throw new Error(cliM('cli_createRemoteFailure', { params: { remote: gitRemote } }))\n }\n execFileSync('git', ['remote', 'add', 'origin', gitRemote], { cwd: projectPath, stdio: 'ignore' })\n }\n spinner.succeed()\n }\n\n // 安装依赖\n if (resolvedOptions.install) {\n spinner.start(cliM('cli_createInstall', { params: { manager: resolvedOptions.packageManager } }))\n installDependencies(projectPath, resolvedOptions.packageManager!)\n spinner.succeed()\n }\n\n // 完成提示\n printCompletionMessage(resolvedOptions)\n }\n catch (error) {\n spinner.fail()\n writeCliError(chalk.red(cliM('cli_createFailed')), error)\n throw error\n }\n}\n\n// =============================================================================\n// 交互式选项解析\n// =============================================================================\n\n/**\n * 解析选项(交互式)\n */\nasync function resolveOptions(options: CreateProjectOptions): Promise<Required<CreateProjectOptions> & { features: FeatureId[] }> {\n const useDefaults = options.defaults ?? false\n\n writeCliMessage('')\n writeCliMessage(chalk.bold.cyan(' 🚀 hai Agent Framework'))\n writeCliMessage(chalk.gray(cliM('cli_createTagline')))\n writeCliMessage('')\n\n const onCancel = () => {\n writeCliMessage(chalk.red(cliM('cli_cancelledLine')))\n process.exit(1)\n }\n\n // 项目名称(逐条询问,避免 prompts 数组模式在 Windows 终端重复渲染)\n let projectName = options.name\n if (!projectName && useDefaults) {\n projectName = 'my-app'\n }\n else if (!projectName) {\n const { name } = await prompts({\n type: 'text',\n name: 'name',\n message: cliM('cli_createNamePrompt'),\n initial: 'my-app',\n validate: (value: string) => {\n if (!value.trim())\n return cliM('cli_createNameRequired')\n if (!PROJECT_NAME_REGEX.test(value))\n return cliM('cli_createNamePattern')\n return true\n },\n }, { onCancel })\n projectName = name\n }\n\n // 应用类型\n let resolvedAppType = options.appType\n if (!resolvedAppType && useDefaults) {\n resolvedAppType = 'admin'\n }\n else if (!resolvedAppType) {\n const { appType } = await prompts({\n type: 'select',\n name: 'appType',\n message: cliM('cli_createTypePrompt'),\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n choices: Object.entries(APP_TYPES).map(([key, t]) => ({\n title: t.name,\n description: formatPromptDescription(t.description),\n value: key,\n })),\n initial: 0,\n }, { onCancel })\n resolvedAppType = appType\n }\n\n const selectedAppType = (resolvedAppType || 'admin') as AppType\n\n const selectedFrontends = selectedAppType === 'fullstack'\n ? await resolveFrontendTargets(options.frontends, useDefaults, onCancel)\n : []\n\n // 只启用模板实际使用的模块;纯客户端不展开服务端生命周期依赖。\n let selectedFeatures: FeatureId[] = selectedAppType === 'mobile-app'\n ? [...TEMPLATE_FEATURES[selectedAppType]]\n : resolveFeatureDependencies(TEMPLATE_FEATURES[selectedAppType])\n\n selectedFeatures = selectedFeatures.filter(feature => feature !== 'deploy')\n if (options.deploy !== false)\n selectedFeatures.push('deploy')\n\n // 模块配置\n const moduleConfigs = selectedAppType === 'fullstack' || selectedAppType === 'mobile-app'\n ? { ...buildDefaultModuleConfigs(selectedFeatures, projectName!), ...options.moduleConfigs }\n : options.moduleConfigs ?? (useDefaults\n ? buildDefaultModuleConfigs(selectedFeatures, projectName!)\n : await promptModuleConfigs(selectedFeatures, projectName!))\n\n // 包管理器\n const detected = await detectPackageManager(options.cwd ?? '.')\n let packageManager = selectedAppType === 'fullstack' || selectedAppType === 'api'\n ? 'pnpm'\n : options.packageManager\n if (!packageManager && useDefaults) {\n packageManager = detected\n }\n if (!packageManager) {\n const { pm } = await prompts({\n type: 'select',\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n name: 'pm',\n message: cliM('cli_createManagerPrompt'),\n choices: [\n { title: cliM('cli_createPnpmRecommended'), value: 'pnpm' },\n { title: 'npm', value: 'npm' },\n { title: 'yarn', value: 'yarn' },\n ],\n initial: detected === 'pnpm' ? 0 : detected === 'npm' ? 1 : 2,\n }, { onCancel })\n packageManager = pm\n }\n\n // 安装依赖\n let install = options.install\n if (install === undefined && useDefaults) {\n install = true\n }\n else if (install === undefined) {\n const { doInstall } = await prompts({\n type: 'confirm',\n active: cliM('cli_yes'),\n inactive: cliM('cli_no'),\n name: 'doInstall',\n message: cliM('cli_createInstallPrompt'),\n initial: true,\n }, { onCancel })\n install = doInstall\n }\n\n // Git\n let git = options.git\n if (git === undefined && useDefaults) {\n git = true\n }\n else if (git === undefined) {\n const { initGit } = await prompts({\n type: 'confirm',\n active: cliM('cli_yes'),\n inactive: cliM('cli_no'),\n name: 'initGit',\n message: cliM('cli_createGitPrompt'),\n initial: true,\n }, { onCancel })\n git = initGit\n }\n\n // Git 远程仓库地址\n let gitRemote = options.gitRemote\n if (git && gitRemote === undefined && useDefaults) {\n gitRemote = ''\n }\n else if (git && gitRemote === undefined) {\n const { remote } = await prompts({\n type: 'text',\n name: 'remote',\n message: cliM('cli_createRemotePrompt'),\n initial: '',\n validate: (value: string) => {\n if (!value.trim())\n return true\n if (RE_HTTPS_URL.test(value) || RE_GIT_SSH_URL.test(value))\n return true\n return cliM('cli_createRemoteInvalid')\n },\n }, { onCancel })\n gitRemote = remote?.trim() || ''\n }\n\n return {\n name: projectName!,\n appType: selectedAppType,\n frontends: selectedFrontends,\n features: selectedFeatures,\n deploy: options.deploy !== false,\n moduleConfigs,\n install: install ?? true,\n packageManager: packageManager || 'pnpm',\n git: git ?? true,\n gitRemote: gitRemote ?? '',\n defaults: useDefaults,\n verbose: options.verbose ?? false,\n cwd: options.cwd ?? '.',\n }\n}\n\nfunction buildDefaultModuleConfigs(features: FeatureId[], projectName: string): ModuleConfigs {\n const configs: ModuleConfigs = {\n core: { name: projectName, defaultLocale: 'zh-CN' },\n }\n\n if (features.includes('db')) {\n configs.db = { type: 'sqlite', database: './data/app.db' }\n }\n if (features.includes('cache')) {\n configs.cache = { type: 'memory' }\n }\n if (features.includes('iam')) {\n configs.iam = { loginPassword: true, loginOtp: false }\n }\n if (features.includes('storage')) {\n configs.storage = { type: 'local', localPath: './data/uploads' }\n }\n if (features.includes('ai')) {\n configs.ai = { defaultProvider: 'openai', model: 'gpt-4o-mini' }\n }\n\n return configs\n}\n\nasync function resolveFrontendTargets(\n frontends: FrontendTarget[] | undefined,\n useDefaults: boolean,\n onCancel: () => void,\n): Promise<FrontendTarget[]> {\n if (frontends && frontends.length > 0) {\n return normalizeFrontendTargets(frontends)\n }\n if (useDefaults) {\n return DEFAULT_FULLSTACK_FRONTENDS\n }\n\n const { selectedFrontends } = await prompts({\n type: 'multiselect',\n name: 'selectedFrontends',\n message: cliM('cli_frontendsPrompt'),\n choices: Object.entries(FRONTEND_TARGETS).map(([id, target]) => ({\n title: target.name,\n description: formatPromptDescription(target.description),\n value: id,\n selected: DEFAULT_FULLSTACK_FRONTENDS.includes(id as FrontendTarget),\n })),\n // 独立行显示帮助,避免宽字符让 prompts 按字符数清除时遗留折行。\n hint: `\\n${formatPromptDescription(cliM('cli_multiselectHint'))}`,\n instructions: false,\n }, { onCancel })\n\n return normalizeFrontendTargets(selectedFrontends ?? DEFAULT_FULLSTACK_FRONTENDS)\n}\n\nfunction normalizeFrontendTargets(frontends: FrontendTarget[]): FrontendTarget[] {\n const validTargets = new Set(Object.keys(FRONTEND_TARGETS))\n const result = frontends.filter(target => validTargets.has(target))\n return [...new Set(result.length > 0 ? result : DEFAULT_FULLSTACK_FRONTENDS)]\n}\n\n// =============================================================================\n// 功能依赖解析\n// =============================================================================\n\n/**\n * 迭代展开功能硬依赖直到集合稳定,避免仅处理一层依赖导致初始化缺项;保留输入顺序并去重。\n * @param features - 调用方选择的功能。\n * @returns 包含传递硬依赖的功能列表。\n * @example 模块内部上下文\n * ```ts\n * const features = resolveFeatureDependencies(['iam', 'ai'])\n * const complete = ['db', 'cache', 'crypto', 'vecdb'].every(feature => features.some(selected => selected === feature))\n * ```\n */\nfunction resolveFeatureDependencies(features: FeatureId[]): FeatureId[] {\n const result = new Set(features)\n\n let changed = true\n while (changed) {\n changed = false\n for (const featureId of result) {\n const feature = FEATURES[featureId]\n if (feature?.dependencies) {\n for (const dep of feature.dependencies) {\n if (!result.has(dep)) {\n result.add(dep)\n changed = true\n }\n }\n }\n }\n }\n\n return Array.from(result)\n}\n\n// =============================================================================\n// 模块配置交互\n// =============================================================================\n\n/**\n * 交互式收集模块配置\n */\nasync function promptModuleConfigs(features: FeatureId[], projectName: string): Promise<ModuleConfigs> {\n const configs: ModuleConfigs = {}\n const onCancel = () => {\n writeCliMessage(chalk.red(cliM('cli_cancelledLine')))\n process.exit(1)\n }\n\n writeCliMessage('')\n writeCliMessage(chalk.bold(cliM('cli_createModuleConfig')))\n writeCliMessage(chalk.gray(cliM('cli_createModuleConfigHint')))\n writeCliMessage('')\n\n // core 配置(始终收集)\n configs.core = await promptCoreConfig(projectName, onCancel)\n\n if (features.includes('db')) {\n configs.db = await promptDbConfig(projectName, onCancel)\n }\n if (features.includes('cache')) {\n configs.cache = await promptCacheConfig(onCancel)\n }\n if (features.includes('iam')) {\n configs.iam = await promptIamConfig(onCancel)\n }\n if (features.includes('storage')) {\n configs.storage = await promptStorageConfig(onCancel)\n }\n if (features.includes('ai')) {\n configs.ai = await promptAiConfig(onCancel)\n }\n\n return configs\n}\n\n/**\n * 收集 core 模块配置\n */\nasync function promptCoreConfig(projectName: string, onCancel: () => void): Promise<ModuleConfigs['core']> {\n writeCliMessage(chalk.cyan(cliM('cli_createCoreConfig')))\n const { defaultLocale } = await prompts({\n type: 'select',\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n name: 'defaultLocale',\n message: cliM('cli_createLocalePrompt'),\n choices: [\n { title: cliM('cli_createChineseLocale'), value: 'zh-CN' },\n { title: cliM('cli_createEnglishLocale'), value: 'en-US' },\n { title: cliM('cli_createJapaneseLocale'), value: 'ja-JP' },\n ],\n initial: 0,\n }, { onCancel })\n return { name: projectName, defaultLocale }\n}\n\n/**\n * 收集 db 模块配置\n */\nasync function promptDbConfig(projectName: string, onCancel: () => void): Promise<ModuleConfigs['db']> {\n writeCliMessage(chalk.cyan(cliM('cli_createDbConfig')))\n const { type } = await prompts({\n type: 'select',\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n name: 'type',\n message: cliM('cli_createDbTypePrompt'),\n choices: [\n { title: cliM('cli_createSqliteOption'), value: 'sqlite' },\n { title: 'PostgreSQL', value: 'postgresql' },\n { title: 'MySQL', value: 'mysql' },\n ],\n initial: 0,\n }, { onCancel })\n\n if (type === 'sqlite') {\n const { database } = await prompts({\n type: 'text',\n name: 'database',\n message: cliM('cli_createSqlitePathPrompt'),\n initial: './data/app.db',\n }, { onCancel })\n return { type, database }\n }\n\n const answers = await prompts([\n { type: 'text', name: 'host', message: cliM('cli_createDbHostPrompt', { params: { backend: type === 'postgresql' ? 'PostgreSQL' : 'MySQL' } }), initial: 'localhost' },\n { type: 'number', name: 'port', message: cliM('cli_createPortPrompt'), initial: type === 'postgresql' ? 5432 : 3306 },\n { type: 'text', name: 'database', message: cliM('cli_createDatabasePrompt'), initial: projectName },\n ], { onCancel })\n\n return { type, host: answers.host, port: answers.port, database: answers.database }\n}\n\n/**\n * 收集 cache 模块配置\n */\nasync function promptCacheConfig(onCancel: () => void): Promise<ModuleConfigs['cache']> {\n writeCliMessage(chalk.cyan(cliM('cli_createCacheConfig')))\n const { type } = await prompts({\n type: 'select',\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n name: 'type',\n message: cliM('cli_createCacheTypePrompt'),\n choices: [\n { title: cliM('cli_createMemoryOption'), value: 'memory' },\n { title: 'Redis', value: 'redis' },\n ],\n initial: 0,\n }, { onCancel })\n\n if (type === 'memory')\n return { type }\n\n const answers = await prompts([\n { type: 'text', name: 'host', message: cliM('cli_createRedisHostPrompt'), initial: 'localhost' },\n { type: 'number', name: 'port', message: cliM('cli_createRedisPortPrompt'), initial: 6379 },\n ], { onCancel })\n\n return { type, host: answers.host, port: answers.port }\n}\n\n/**\n * 收集 iam 模块配置\n */\nasync function promptIamConfig(onCancel: () => void): Promise<ModuleConfigs['iam']> {\n writeCliMessage(chalk.cyan(cliM('cli_createIamConfig')))\n const answers = await prompts([\n { type: 'confirm', active: cliM('cli_yes'), inactive: cliM('cli_no'), name: 'loginPassword', message: cliM('cli_createPasswordPrompt'), initial: true },\n { type: 'confirm', active: cliM('cli_yes'), inactive: cliM('cli_no'), name: 'loginOtp', message: cliM('cli_createOtpPrompt'), initial: false },\n ], { onCancel })\n return { loginPassword: answers.loginPassword, loginOtp: answers.loginOtp }\n}\n\n/**\n * 收集 storage 模块配置\n */\nasync function promptStorageConfig(onCancel: () => void): Promise<ModuleConfigs['storage']> {\n writeCliMessage(chalk.cyan(cliM('cli_createStorageConfig')))\n const { type } = await prompts({\n type: 'select',\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n name: 'type',\n message: cliM('cli_createStorageTypePrompt'),\n choices: [\n { title: cliM('cli_createLocalStorageOption'), value: 'local' },\n { title: 'S3 / MinIO / OSS', value: 's3' },\n ],\n initial: 0,\n }, { onCancel })\n\n if (type === 'local') {\n const { localPath } = await prompts({\n type: 'text',\n name: 'localPath',\n message: cliM('cli_createStoragePathPrompt'),\n initial: './data/uploads',\n }, { onCancel })\n return { type, localPath }\n }\n\n return { type }\n}\n\n/**\n * 收集 ai 模块配置\n */\nasync function promptAiConfig(onCancel: () => void): Promise<ModuleConfigs['ai']> {\n writeCliMessage(chalk.cyan(cliM('cli_createAiConfig')))\n const { defaultProvider } = await prompts({\n type: 'select',\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n name: 'defaultProvider',\n message: cliM('cli_createProviderPrompt'),\n choices: [\n { title: 'OpenAI', value: 'openai' },\n { title: 'Anthropic (Claude)', value: 'anthropic' },\n { title: cliM('cli_createCompatibleAiOption'), value: 'custom' },\n ],\n initial: 0,\n }, { onCancel })\n\n const defaultModel = defaultProvider === 'openai'\n ? 'gpt-4o-mini'\n : defaultProvider === 'anthropic'\n ? 'claude-3-sonnet'\n : ''\n\n const { model } = await prompts({\n type: 'text',\n name: 'model',\n message: cliM('cli_createModelPrompt'),\n initial: defaultModel,\n }, { onCancel })\n\n return { defaultProvider, model }\n}\n\n// =============================================================================\n// 工具函数\n// =============================================================================\n\n/**\n * 获取功能对应的配置 key\n */\nfunction getFeatureConfigKey(featureId: FeatureId): string | null {\n const map: Record<string, string> = {\n db: 'db',\n cache: 'cache',\n iam: 'iam',\n storage: 'storage',\n ai: 'ai',\n deploy: 'deploy',\n vecdb: 'vecdb',\n reach: 'reach',\n feedback: 'feedback',\n scheduler: 'scheduler',\n audit: 'audit',\n payment: 'payment',\n }\n return map[featureId] ?? null\n}\n\n/**\n * 获取安装命令\n */\nfunction getInstallCommand(pm: 'pnpm' | 'npm' | 'yarn'): string {\n switch (pm) {\n case 'pnpm': return 'pnpm install'\n case 'yarn': return 'yarn'\n default: return 'npm install'\n }\n}\n\n/**\n * 生成运行 package.json 脚本的命令\n *\n * npm 需要 `npm run <script>`(lifecycle 脚本除外),pnpm / yarn 可直接 `<pm> <script>`。\n */\nfunction getRunCommand(pm: 'pnpm' | 'npm' | 'yarn', script: string): string {\n return pm === 'npm' ? `npm run ${script}` : `${pm} ${script}`\n}\n\nfunction installDependencies(projectPath: string, pm: 'pnpm' | 'npm' | 'yarn'): void {\n const installCmd = getInstallCommand(pm)\n try {\n execSync(installCmd, {\n cwd: projectPath,\n stdio: 'pipe',\n encoding: 'utf-8',\n maxBuffer: 10 * 1024 * 1024,\n })\n }\n catch (error) {\n const details = formatCommandFailure(installCmd, error)\n throw new Error(`${cliM('cli_installFailed', { params: { pm } })}\\n${details}`)\n }\n}\n\n/**\n * 同步子命令异常中可读取的诊断字段;输出可能为 Buffer 或字符串,因此先以 unknown 接收并规范化。\n * @example 模块内部上下文\n * ```ts\n * const failure: CommandFailureLike = { status: 1, signal: null, stderr: Buffer.from('Install failed'), stdout: '' }\n * const details = formatCommandFailure('pnpm install', failure)\n * ```\n */\ninterface CommandFailureLike {\n stdout?: unknown\n stderr?: unknown\n status?: number | null\n signal?: string | null\n}\n\nfunction formatCommandFailure(command: string, error: unknown): string {\n if (!error || typeof error !== 'object') {\n return cliM('cli_commandLabel', { params: { command } })\n }\n\n const failure = error as CommandFailureLike\n const stdout = normalizeChildOutput(failure.stdout)\n const stderr = normalizeChildOutput(failure.stderr)\n const status = typeof failure.status === 'number' ? cliM('cli_exitCode', { params: { code: failure.status } }) : ''\n const signal = typeof failure.signal === 'string' ? cliM('cli_signal', { params: { signal: failure.signal } }) : ''\n const output = [\n cliM('cli_commandLabel', { params: { command } }),\n status,\n signal,\n stderr ? `stderr:\\n${stderr}` : '',\n stdout ? `stdout:\\n${stdout}` : '',\n ].filter(Boolean)\n\n return output.join('\\n\\n')\n}\n\nfunction normalizeChildOutput(output: unknown): string {\n if (typeof output === 'string') {\n return output.trim()\n }\n if (Buffer.isBuffer(output)) {\n return output.toString('utf-8').trim()\n }\n return ''\n}\n\n/** 生成各类项目共用的 AI 开发入口说明。 */\nfunction generateAiDevelopmentReadme(): string {\n return `### AI 辅助开发\n\n从本项目根目录打开所用编码工具,先读取 [AGENTS.md](./AGENTS.md)。Claude Code 通过 [CLAUDE.md](./CLAUDE.md) 加载项目规则;GitHub Copilot 使用 [.github/copilot-instructions.md](./.github/copilot-instructions.md),OpenCode 使用 AGENTS.md 和 [opencode.json](./opencode.json)。\n\n生成的页面和业务规则是起点,可以按需求调整。把功能、权限和验收条件告诉 AI,再让它读取对应技能与当前安装版本的 API。\n\n普通功能开发使用 [应用开发 Skill](./.agents/skills/hai-app-create/SKILL.md)。需求文档较多时,先用 [文档审查 Skill](./.agents/skills/hai-spec-review/SKILL.md) 找出缺失和矛盾,再用 [文档实施 Skill](./.agents/skills/hai-spec-implement/SKILL.md) 维护 docs/task-list.md 与 docs/tasks/,逐项实现、测试和交付。\n\n已有项目可运行 hai init 补齐缺失的 AI 入口;它保留已有自定义内容。升级框架使用 [框架升级 Skill](./.agents/skills/hai-framework-sync/SKILL.md),同时核对依赖、配置、代码和技能。\n\n`\n}\n\n/** 生成各类工程共用的配置与命令说明,放在开发/部署章节之间。 */\nfunction generateEnvironmentReadme(): string {\n return `### 分环境配置\n\n运行参数在 \\`.env.example\\` 中逐项说明用途、枚举和范围。\\`.env\\` 为公共基础,\\`.env.dev\\` / \\`.env.test\\` / \\`.env.prod\\` 为环境覆盖,均提交 Git;\\`.env.local\\` 为本机私有覆盖,不提交 Git。优先级为进程 > \\`.env.<mode>.local\\` > \\`.env.local\\` > \\`.env.<mode>\\` > \\`.env\\` > YAML。同来源先父 JSON 后细项,高来源整段替换先清除低来源细项。YAML 显式引用 \\`HAI_<配置名>_<路径>\\` 并保留本地回退,camelCase 不拆词。完整命令、加载优先级和 Provider 切换见 [环境配置](.agents/skills/hai-app-create/development.md#环境配置)。\n\n依赖只包含模板实际使用的模块;config 与 \\`.env.example\\` 保留所有模块的完整参考,未启用项以注释提供,不进入公共环境默认值。新增功能时添加依赖、启用所需配置,再接入初始化、反序关闭和业务代码;安装依赖不会自动接入模块。纯客户端的服务端配置仅供后续后端集成参考,秘密不得注入浏览器。\n\n生产 .env.prod 按已启用模块选择共享 PostgreSQL(明确选择 MySQL 时保留)、Redis、S3、Qdrant,默认使用 Compose 内部服务名 db/cache/storage/vecdb。密码、S3 凭据、模型 Key 与受保护 Qdrant 的 Key 只由私有环境注入;容器外运行覆盖内部连接地址。生产 Reach 必须注入真实 HAI_REACH_PROVIDERS JSON,公共空数组会拒绝启动。后续通过 hai add ai 补齐 db+vecdb 依赖时,还须在应用入口接入初始化和反序关闭,不能仅安装依赖。\n\n| 用途 | 命令 |\n| --- | --- |\n| 开发 / 测试模式 / 生产模式预览 | \\`pnpm dev\\` / \\`dev:test\\` / \\`dev:prod\\` |\n| 类型检查(check 为别名) | \\`pnpm typecheck\\` |\n| 检查 / 自动修复格式 | \\`pnpm lint\\` / \\`lint:fix\\` |\n| 源码构建 / 镜像构建 | \\`pnpm build\\` / \\`pnpm build --target image\\` |\n| 单元测试 / 监听 / 浏览器验收 | \\`pnpm test\\` / \\`test:watch\\` / \\`test:e2e\\` |\n| Node 服务按环境启动(构建后) | \\`pnpm start\\` / \\`start:test\\` / \\`start:prod\\` |\n\nVite 客户端使用 \\`preview\\` 预览静态产物,Node 服务使用 \\`start\\`;纯 contract/shared 库只提供适用的构建和质量命令。API workspace 的环境文件位于 \\`apps/<name>-serv\\`,fullstack 位于工程根。`\n}\n\n/** 生成与项目脚本一致的构建、离线交付和增量更新说明。 */\nfunction generateBuildDeploymentReadme(pm: string, appDir: string): string {\n return `### 构建与部署\n\n创建时默认包含部署工具;不需要时使用 hai create --no-deploy。\n后端serv、浏览器站点web(静态或SSR)、手机原生包app、桌面原生包desktop。--images/--services使用serv/web,--target app/desktop用于原生交付。镜像和容器身份取工程根package.json.name,去scope、转小写并归一化字符;缺失或无效时报错,不使用目录名。根目录制品格式4,非根目录格式5及webBasePath,两者都记录primaryService/hasWeb;只有serv + web生成同源API代理。旧工程先同步build.images、Dockerfile及API workspace的-serv包名与引用,安装依赖并重建完整制品;旧部署先备份、核对项目名、卷与受管凭据,再建立完整基线。完整部署按Compose规则清理同项目旧服务,不自动跨项目迁移数据。\n\n网站地址含/yyy/等目录时,在构建进程显式设置PUBLIC_BASE_PATH=/yyy,默认空字符串;不从私有dotenv读取。SvelteKit编译时固定base,Vite默认相对资源与hash路由;API地址独立配置。Docker网站制品由SDK处理代理与健康路径,使用匹配CLI/Deploy;所有部分构建保持同一目录,即使只构建serv。目录变化使用全量部署,操作和验证见[网站挂载目录](.agents/skills/hai-build/paths.md)。\n\n自建S3的内部endpoint与浏览器publicEndpoint分开。publicEndpoint可设置为https://example.com/delivery/files等带目录地址,不含桶名、凭据或查询;返回URL保留桶名,Web Nginx或SSR/API gateway去掉入口前缀,保留原始S3路径、Host与查询后直接转发storage,大文件不经过Serv。外层代理保留完整入口路径,不重复去前缀;外部S3/CORS按实际服务配置,Local不公开私有目录。增加网关、改变桶或公开地址时全量部署,应用增量与回滚保持原配置;详见[存储使用规范](.agents/skills/hai-storage/SKILL.md)。\n每个镜像对应 images/ 中一个 Dockerfile,根 hai.json 的 build 分区指定文件,deploy 分区保存整个项目的部署配置。\n镜像构建可加 --image-source cn --npm-source cn,分别选择中国大陆镜像源与 npm 源;还支持 official/custom。首次交互选择保存到 hai.json.build.sources,--yes 复用配置,未配置时使用官方源。代理用 --proxy-mode inherit|system|custom|none,自定义配合 --proxy-url;Docker/Podman 引擎拉取代理需在引擎侧设置,构建容器会单独检查代理可达性。自定义源和旧工程 Dockerfile 更新见 .agents/skills/hai-build/reference.md 的下载源与代理说明。\n下载、安装和整理生产依赖复用同一份包缓存与 SQLite 驱动缓存,依赖安装先于源码复制。前后端默认最多并行构建两项,--concurrency 1可降低资源占用。运行镜像去除应用自身的声明文件、源码映射和说明文件。\n默认容器用于 CPU 运行或连接远程 AI 服务,不额外下载 GPU 运行库;需要使用部署机器上的 GPU 时,自行定制镜像和容器运行参数。\n\n\\`\\`\\`sh\n${pm} build\n${pm} build --target image\n# 构建和部署一次完成\n${pm} exec hai deploy ${appDir} --env test --build\n# 复用已有镜像;只生成完整离线包及跨平台部署脚本\n${pm} exec hai deploy ${appDir} --env prod --bundle-only\n# 只更新前端(工程存在 web 镜像时)\n${pm} build --target image --images web\n${pm} exec hai deploy ${appDir} --env prod --services web\n\\`\\`\\`\n\n构建不读取部署环境;产物位于 .hai/build/docker/<buildId>,用 --artifact-dir 精确选择。\n应用根 package.json.version 驱动版本,同版本允许重新构建和发布;清单记录独立构建编号与校验和。\n完整离线包自动携带自建中间件镜像;准备中间件镜像需要构建机有可用 Podman/Docker,缺镜像时在打包阶段拉取。\n服务器需要 Linux、Docker/Podman、Docker Compose v2 或 podman-compose 1.6.0 及以上、sh、tar、sha256sum、awk、curl、util-linux flock 和支持 flock 的文件系统,启动阶段不联网拉取。\n固定 .deploy.lock 内核锁覆盖部署及恢复;禁止删除或替换,所有持有进程退出或重启后自动释放。强杀后须核对结果文件、current 和容器状态,再用新包恢复。\n每次离线交付生成独立目录,默认tar.gz(显式--output release.tar可保留未压缩),外层仅含归档、deploy.ps1(Windows)、deploy.sh(Linux/macOS)、deploy-target.json、read-target.awk、deploy-local.sh 和 README.txt;Compose、运行环境和清单仅在归档内,README不重复。中间件归档按镜像内容ID缓存并在复用前验证摘要。成功后清理本次incoming上传与解包目录,release保留恢复配置和状态,镜像由引擎保存。交互式打包在构建和中间件配置后最后询问是否保存或修改 SSH 信息,写入 .env.<环境>.local 并用于本次和后续 target;--yes 复用已有配置,复制整个目录即可。脚本按已保存的 SSH 参数上传、导入、启动并验证 HTTP或HTTPS。\n部署向导可选已有PEM证书与私钥路径(相对工程根,校验后复制到私有包)或Let’s Encrypt。官方Certbot申请并每12小时检查续期,Nginx自动重载;需要条款确认、真实邮箱、公网DNS、80端口及CA网络。HTTPS默认443、HTTP跳转开启,未配置仍为HTTP;启停或改模式/域名/端口/本地证书须全量。证书状态保留在服务器并备份,隔离目标使用已有证书。--plan中的root表示工程根,serviceDir表示部署服务源码与配置目录。\n完全隔离时复制整个交付目录,运行 sh deploy-local.sh 自动解包并部署;可传入部署目录覆盖默认位置。\nNode 后端启动时读取服务器 config/.env.runtime,应用配置和托管连接合并在此;修改细项后重启后端即可。同源细项覆盖 JSON,配置目录只读挂载到 /run/hai/config,原子替换文件也能读取。归档仅有 apply.sh、manifest.json、config/、images/、.hai/ 五个顶层入口;完整 Compose、加载器、原生环境、代理/TLS、策略和校验和位于 .hai/,辅助脚本内嵌 apply.sh。Web/中间件局部更新保留应用文件,失败先恢复应用配置再恢复服务;长期修改同步源环境。端口、挂载、Node 启动参数和代理变更需部署。\n部分更新要求已有成功的完整部署,保留未选服务及数据卷;失败返回非零退出码,已有部署尝试恢复选中服务。\n中间件连接齐全时使用 --skip-middleware 跳过配置向导。包中包含私有配置,不提交 Git。\n`\n}\n\nfunction generateReadme(name: string, appTypeLabel: string, pm: 'pnpm' | 'npm' | 'yarn', appType: AppType): string {\n const install = getInstallCommand(pm)\n const staticWebsite = appType === 'website'\n ? `### 静态网站与 GitHub Pages\n\n默认使用Node SSR,只安装展示功能所需的Core/Kit/UI,可直接切换静态发布;完整注释配置不启用模块。后续新增的服务端业务依赖、初始化及API/actions须先移除,已有动态模块不能仅打开开关静态发布。\n\n\\`HAI_BUILD_STATIC=1\\`显式预渲染,\\`PUBLIC_BASE_PATH=/${name}\\`指定项目站目录(无末尾/,根站留空);在PowerShell设置本次构建环境:\n\n\\`\\`\\`powershell\n$env:HAI_BUILD_STATIC = '1'\n$env:PUBLIC_BASE_PATH = '/${name}'\n${getRunCommand(pm, 'build')}\n${getRunCommand(pm, 'preview')}\n\\`\\`\\`\n\n检查build/index.html、各页面目录、_app、.nojekyll与子路径刷新;build/api/health不应存在。构建不读取根.env;static是公开资产目录,图片、字体和其他正常资源会原样发布,禁止放入私密内容,检测到.env/.env.*或符号链接会停止构建。服务端模块、自定义API、actions或未预渲染页面会明确拒绝;不会放宽生产守卫或用SPA回退掩盖。清除HAI_BUILD_STATIC后恢复普通SSR构建;PUBLIC_BASE_PATH可继续用于SSR或Docker网站目录,原生app/desktop目标不接受网站目录。\n\nGitHub Pages选择Actions发布静态build目录;上传步骤显式include-hidden-files:true以保留.nojekyll,不上传config、data、.env或源码。发布前核对仓库项目名和PUBLIC_BASE_PATH一致。联系表单是未接真实服务的界面示例,提交时通过Toast说明尚未开通并保留输入;投入使用前应接实际留言服务并验证加载、成功与失败状态。\n\n`\n : ''\n return `# ${name}\n\n## 简介\n\n基于 hai Agent Framework 构建的${appTypeLabel}应用。\n\n## 核心功能清单\n\n- 开发服务器、源码编译与浏览器测试。\n- 按所选模块提供页面和服务配置。\n- 独立 Dockerfile 与镜像归档,便于交付。\n\n## 使用入门\n\n### 页面布局与路由\n\n页面统一继承根布局的 header/footer。${appType === 'mobile-app' ? '页面放 src/lib/pages/**/*.svelte,hash 路由自动发现,刷新与前进后退恢复当前页。' : '使用 SvelteKit 自动文件路由,新增 +page.svelte 无需维护路由表;刷新定位与服务端鉴权保持一致。'}${appType === 'mobile-app' ? '\\n\\n选择 IAM 或 crypto 的移动客户端默认启用加密 transport,先初始化 crypto,再初始化 typed API client;结束时按相反顺序关闭。仅明确连接匹配的明文 API 时设置 PUBLIC_API_TRANSPORT=off;PUBLIC_API_KEY_EXCHANGE_PATH 仅覆盖公开协商子路径。握手失败不会退回明文,服务端私钥不进入客户端。未选择 crypto 的客户端保留明文 API 模式。' : ''}\n\n### 开发\n\n\\`\\`\\`bash\n${install}\n${getRunCommand(pm, 'dev')}\n\\`\\`\\`\n\n${generateEnvironmentReadme()}\n\n### 构建\n\n\\`\\`\\`bash\n${getRunCommand(pm, 'build')}\n${getRunCommand(pm, 'paraglide:compile')}\n${getRunCommand(pm, 'preview')}\n\\`\\`\\`\n\n${staticWebsite}${generateBuildDeploymentReadme(pm, `.`)}\n\n${generateAiDevelopmentReadme()}### 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [Svelte 5](https://svelte.dev/)\n\n## 开发测试\n\n\\`\\`\\`sh\n${getRunCommand(pm, 'typecheck')}\n${getRunCommand(pm, 'lint')}\n${getRunCommand(pm, 'build')}\n${getRunCommand(pm, 'test')}\n${getRunCommand(pm, 'test:e2e')}\n\\`\\`\\`\n\n## 许可证\n\nApache-2.0\n`\n}\n\nfunction generateApiWorkspaceReadme(name: string, pm: 'pnpm' | 'npm' | 'yarn'): string {\n return `# ${name}\n\n## 简介\n\n后端 API 工程,接口定义与服务实现分包维护,客户端可复用同一份接口类型。\n\n## 核心功能清单\n\n- 共享 contract、输入输出校验与服务 procedures。\n- 模块配置、健康检查和 HTTP 服务。\n- 独立镜像构建与离线交付。\n\n## 使用入门\n\n### 工程结构\n\n- \\`apps/${name}-contract\\`:共享 API contract、Zod schema 与类型\n- \\`apps/${name}-serv\\`:后端 API service,基于 \\`@h-ai/serv\\` 暴露 HTTP 应用\n\n### 开发\n\n\\`\\`\\`bash\n${pm} install\n${pm} dev\n\\`\\`\\`\n\n${generateEnvironmentReadme()}\n\n\n${generateBuildDeploymentReadme(pm, `apps/${name}-serv`)}\n\n### 扩展建议\n\n- 在 \\`${name}-contract\\` 中维护应用级 contract,前后端共用同一份类型与路径定义。\n- 在 \\`${name}-serv\\` 中扩展 procedures、模块初始化与配置。\n- 需要 IAM / storage / ai 时,优先复用 \\`@h-ai/api-contract\\` 与 \\`@h-ai/serv/features/*\\`。\n\n${generateAiDevelopmentReadme()}### 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [@h-ai/serv](./.agents/skills/hai-serv/SKILL.md)\n- [@h-ai/api-contract](./.agents/skills/hai-api-contract/SKILL.md)\n- [@h-ai/api-client](./.agents/skills/hai-api-client/SKILL.md)\n\n## 开发测试\n\n\\`\\`\\`bash\n${pm} typecheck\n${pm} lint\n${pm} build\n${pm} test\n${pm} test:e2e\n\\`\\`\\`\n\n## 许可证\n\nApache-2.0\n`\n}\n\nfunction generateFullstackReadme(name: string, pm: string, frontends: FrontendTarget[], hasFeedback: boolean): string {\n const enabledFrontends = frontends.map(target => FRONTEND_TARGETS[target].name).join(' / ')\n return `# ${name}\n\n## 简介\n\n前后端分离工程,API 与 Web、移动端、桌面端共享接口类型和管理界面,可按实际业务调整。\n\n## 核心功能清单\n\n- API 服务、共享界面与按需生成的客户端。\n- 用户管理、角色、审计和个人设置示例。\n- 登录、主题、语言、新手引导和帮助中心。\n- API/Web 独立 Dockerfile 与镜像归档。\n\n## 使用入门\n\n### 工程结构\n\n- \\`packages/${name}-contract\\`:前后端共享 API 契约、Zod Schema 与类型\n- \\`packages/${name}-serv\\`:后端 API Service(通过 \\`@h-ai/serv\\` 暴露最小 HTTP App 抽象,不直接暴露 Hono)\n- \\`packages/${name}-shared\\`:跨端共享 Shell、主题、语言切换、API client 与共享 messages\n- \\`apps/${name}-web\\`:Web 前端${frontends.includes('web') ? '' : '(未启用)'}\n- \\`apps/${name}-app\\`:移动端 App/H5 前端${frontends.includes('app') ? '' : '(未启用)'}\n- \\`apps/${name}-desktop\\`:桌面端前端${frontends.includes('desktop') ? '' : '(未启用)'}\n- \\`apps/${name}-miniapp\\`:小程序预留说明与本端 inlang messages${frontends.includes('miniapp') ? '(占位,不参与构建)' : '(未启用)'}\n\n已启用前端:${enabledFrontends || 'Web / App / Desktop'}\n\n### 页面布局与路由\n\nWeb/App/Desktop 共享 AppShell 的 header/footer。新增页面放 shared/src/lib/pages/**/*.svelte,由 HashRouter 自动发现并按需加载;菜单只维护入口。地址使用 #/页面路径,支持刷新、查询串与浏览器前进后退;API 权限仍由服务端校验。\n\n### 默认管理功能\n\n以下描述可运行示例的初始业务,可按实际需求调整或移除,并同步代码、数据、鉴权、界面、测试和文档。\n\n默认启用 IAM、reldb、cache、audit、storage、scheduler 和 crypto${hasFeedback ? '、feedback 和 Reach' : ''}。示例将职责分为 admin(账号和角色管理)、audit_admin(审计查询、统计与备份)、config_admin(公开业务公告配置)、business_operator(业务处理)及 user(个人自助)。服务端限制跨职责授权和账号接管,系统管理员可配置基础成员;角色名称及业务权限由应用维护,可按项目需求调整,不写死为 IAM 规则。密码修改后全部会话失效,需要重新登录。\n\n${hasFeedback ? '普通成员和业务操作员可从顶部“问题反馈”提交说明、截图与日志;只有 business_operator 显示反馈管理菜单并能查看、处理、撤销和导出问题包。服务端继续按可信身份与应用范围授权。开发通知使用 Console,生产须在 _feedback.yml 与 _reach.yml 配置收件人和真实邮件。' : ''}\n\nCLI 在根目录 .env.dev.local、.env.test.local、.env.prod.local 中为 admin、audit_admin、config_admin、business_operator 分别生成独立随机强密码,对应 HAI_ADMIN_DEFAULT_PASSWORD、HAI_AUDIT_ADMIN_PASSWORD、HAI_CONFIG_ADMIN_PASSWORD、HAI_BUSINESS_OPERATOR_PASSWORD。这些私有文件不提交 Git;克隆后通过受保护配置或 Secret Manager 分发对应环境秘密,同一环境各节点共享。共享 .env.local 或进程变量可覆盖公共值,模式私有文件优先于共享私有文件。已有账号不改密、不重新分配职责;未配置密码的独立职责账号不创建。密码须符合 _iam.yml 策略;启动失败保留模块、配置字段、错误码和端口占用诊断。\n\n\\`_iam.yml\\` 可按业务启用账号闲置扫描、密码复杂度/期限、ALTCHA 挑战、失败窗口锁定、一次性邀请、首次改密、敏感操作再认证、登录时间/IP 和会话期限/并发策略。敏感操作清单使用服务端操作标识;界面通过短期单次票据完成再认证。\\`session.endOnPageHide\\` 默认关闭,开启时页面离开尝试撤销,但浏览器通知仅最佳努力,需配合服务端闲置/绝对期限。\\`_audit.yml\\` 配置保留保护、私有备份及 Reach 告警;手动备份失败复用同一编号重试,回执含 key/记录数/SHA-256,不公开下载。归档不是原子数据库快照,严格恢复须暂停写入/清理或使用原生备份,在独立环境核验恢复。\n\n安全策略的配置位置、默认开关、逐项启用步骤及使用影响见[配置化安全使用指南](docs/security-configuration.md)。\n\n本地开发默认 \\`PUBLIC_API_BASE=http://127.0.0.1:3000\\`,Vite 使用同源代理;部署时改为实际公网 API Origin,Android 模拟器访问宿主机时使用 \\`http://10.0.2.2:3000\\`。不要将密钥放入任何 \\`PUBLIC_\\` 或 \\`VITE_\\` 变量。\n\n服务端版本化传输密钥环在创建时分别写入不提交 Git 的 \\`.env.dev.local\\`、\\`.env.test.local\\`、\\`.env.prod.local\\`,变量为 \\`HAI_CRYPTO_TRANSPORT_SERVERKEYRING\\`,各环境密钥不同;运行时不生成密钥。同一环境的所有节点使用同一 ring 和共享 registry,也可通过进程环境或 Secret Manager 覆盖。私钥不进入 PUBLIC_/VITE_、日志或浏览器。\n\n所有业务 JSON 请求和响应默认通过 \\`@h-ai/crypto\\` transport 双向加密(含登录、刷新、头像上传);前端统一使用共享 typed API client。Web 访问令牌仅存内存、刷新令牌由 HttpOnly Cookie 保存;受信原生端使用平台安全存储或内存。头像为随机路径只读图片资源,支持 PNG/JPEG/WebP,最大 512 KiB。健康检查和只读头像图片可直接访问。\n\n应用显示名称、版本、环境、默认语言和日志设置来自后端 \\`config/_core.yml\\`,前端通过 \\`app.info\\` 获取安全元信息。开发默认 SQLite、本地存储与内存缓存;生产启动拒绝这些本地 Provider,必须将所有节点连接到同一共享数据库、Redis 与 S3。传输必须在所有节点注入相同受管版本化密钥环与共享 registry,无需会话粘性;重启读取原 ring,轮换先分发新旧版本再切 activeKeyId。生产需显式配置允许的 CORS Origin。业务提交后的审计写入采用最大努力,失败记录结构化错误日志,保留已完成业务的原始结果。\n\n### 配置扩展\n\n服务端 \\`packages/${name}-serv/config/\\` 始终保留 core、serv、kit、db、cache、iam、storage、audit、reach、ai、vecdb、payment、scheduler、feedback 共 14 份 YAML;构建部署配置统一位于项目根 hai.json。只安装管理后台实际使用的模块;已用模块保留工作默认值,未启用模块整份注释,可选字段和替代 Provider 按块注释;根 \\`.env.example\\` 也保留未启用模块的凭据示例。新增功能时安装依赖并接入初始化、关闭及业务代码。Reach 默认为开发控制台通知,feedback 使用 email 别名;生产按 \\`_reach.yml\\` 注释替换为 SMTP、短信或 API Provider,并保持名称唯一。\n\n自动生成的 \\`.env\\` 包含已启用模块的环境参数;YAML 显式引用相同变量并保留本地回退。编辑环境参数优先修改对应 \\`.env\\`;未启用模块仍保留注释。\n\n扩展时先在服务端 workspace 安装需要的包,在 \\`src/server/runtime.ts\\` 按模块公开 Schema 校验配置、初始化并反序关闭,再接入 contract/procedure 和界面。整份注释文件先去掉一层外层注释,可选块继续按需开启;配置文件存在不代表业务功能已接入。\\`crypto.init()\\` 无配置参数,datapipe 为纯函数,不生成虚构 YAML。\n\n环境变量只覆盖 YAML 已有路径,注释键须先启用,或用 \\`HAI_DB\\` / \\`HAI_CACHE\\` 等整体对象覆盖。camelCase 不拆词,例如 \\`connectTimeout\\` 对应 \\`HAI_CACHE_CONNECTTIMEOUT\\`。修改配置后重启服务;语言列表在各前端/shared 的 \\`project.inlang/settings.json\\` 中同步。\\`**/data/\\` 忽略任意层级的数据目录及 \\`.gitkeep\\`,运行数据不入 Git,运行时自动创建目录。\n\n${generateEnvironmentReadme()}\n\n### 开发与构建\n\n\\`\\`\\`bash\n${pm} install\n${pm} dev\n${pm} typecheck\n${pm} build\n${pm} test\n${pm} test:e2e\n${frontends.includes('desktop') ? `${pm} build --target desktop --platform windows # Windows 主机;Linux/macOS 在对应主机构建` : ''}\n\\`\\`\\`\n\nTauri 需要目标系统的 Rust target、SDK 和打包工具。测试产生的临时工程、截图、报告、容器、镜像与进程应在 finally/teardown 中自动清理,失败也执行。\n\n${generateBuildDeploymentReadme(pm, `packages/${name}-serv`)}\n\n### i18n 与 shared 协同\n\n- shared:\\`packages/${name}-shared/project.inlang\\` + \\`messages/\\`,只放跨端共享组件文案。\n- web/app/desktop:每个应用都有自己的 \\`project.inlang\\` + \\`messages/\\`,用于本端页面与产品文案。\n- miniapp:当前是占位,但也有自己的 \\`project.inlang\\` + \\`messages/\\`,便于后续接入真实小程序框架。\n- 新增 locale 时,shared 与所有启用前端的 \\`locales\\` 必须同步;语言切换器会同时更新 shared runtime 与宿主应用 runtime。\n- \\`${pm} i18n:compile\\` 会统一编译 shared 与每个启用前端的 Paraglide 输出;各前端也可单独运行 \\`${pm} --filter ${name}-web paraglide:compile\\` 等命令。\n\n### 自定义建议\n\n- 改全局 Shell/主题/语言切换:编辑 \\`packages/${name}-shared\\`。\n- 改某个前端页面和文案:编辑共享 \\`packages/${name}-shared/src/lib/pages\\`、本端入口与 \\`apps/${name}-*/messages\\`。\n- 改主题列表:调整脚手架配置中的 \\`fullstack.theme.themes\\`,或直接编辑各端 \\`src/app.css\\` 的 daisyUI \\`themes\\`。\n\n\n${generateAiDevelopmentReadme()}### 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [@h-ai/serv](./.agents/skills/hai-serv/SKILL.md)\n- [@h-ai/ui](./.agents/skills/hai-ui/SKILL.md)\n\n## 开发测试\n\n\\`\\`\\`bash\n${pm} typecheck\n${pm} lint\n${pm} build\n${pm} test\n${pm} test:e2e\n\\`\\`\\`\n\n## 许可证\n\nApache-2.0\n`\n}\n\n/**\n * 打印完成提示\n */\nfunction printCompletionMessage(options: Required<CreateProjectOptions> & { features: FeatureId[] }): void {\n writeCliMessage('')\n writeCliMessage(chalk.green(cliM('cli_createSuccess')))\n writeCliMessage('')\n\n // 功能摘要\n if (options.features.length > 0) {\n writeCliMessage(chalk.bold(cliM('cli_createFeatures')))\n for (const featureId of options.features) {\n const feature = FEATURES[featureId]\n if (feature) {\n writeCliMessage(chalk.gray(` • ${feature.name} (${featureId})`))\n }\n }\n writeCliMessage('')\n }\n\n writeCliMessage(cliM('cli_nextSteps'))\n writeCliMessage(chalk.cyan(` cd ${options.name}`))\n if (options.appType === 'fullstack')\n writeCliMessage(chalk.cyan(cliM('cli_adminPasswordSaved')))\n if (!options.install) {\n writeCliMessage(chalk.cyan(` ${getInstallCommand(options.packageManager)}`))\n }\n if (options.appType === 'fullstack' || options.appType === 'api') {\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'dev')}`))\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'typecheck')}`))\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'test')}`))\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'test:e2e')}`))\n }\n else {\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'dev')}`))\n }\n writeCliMessage('')\n}\n\n// =============================================================================\n// 项目检测(供 init 命令使用)\n// =============================================================================\n\n/**\n * 检测项目信息\n * 缺少或无法解析 package.json 时返回 null;isHaiProject 仅表示依赖中含 @h-ai/*,不是业务配置验证。\n * @param cwd - 项目所在目录。\n * @returns 解析后的项目信息,文件缺失或解析失败时为 null。\n * @example 模块内部上下文\n * ```ts\n * const project = await detectProject(process.cwd())\n * if (project && project.isHaiProject) writeCliMessage(project.haiPackages.join(', '))\n * ```\n */\nexport async function detectProject(cwd: string): Promise<ProjectInfo | null> {\n const pkgPath = path.join(cwd, 'package.json')\n\n if (!(await fileExists(pkgPath))) {\n return null\n }\n\n try {\n const pkg = await fse.readJson(pkgPath)\n const deps = { ...pkg.dependencies, ...pkg.devDependencies }\n\n const haiPackages = Object.keys(deps).filter(name => name.startsWith('@h-ai/'))\n\n return {\n name: pkg.name,\n version: pkg.version,\n description: pkg.description,\n isHaiProject: haiPackages.length > 0,\n haiPackages,\n }\n }\n catch {\n return null\n }\n}\n","/** 项目工具配置的定位;运行时 YAML 配置仍由各服务目录管理。 */\nimport { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join, resolve } from 'node:path'\nimport { cliM } from '../cli-i18n.js'\n\n/**\n * 从服务目录向上查找最近的 hai.json;不存在时返回当前目录中的预期位置。\n * @param directory - 项目根或服务 workspace 目录。\n * @returns 工具配置文件的绝对路径。\n * @example 模块内部上下文\n * ```ts\n * const configPath = projectConfigPath('/workspace/shop/packages/shop-serv')\n * // 找到项目根 hai.json 后,CLI 仍在 shop-serv 扫描运行时配置。\n * ```\n */\nexport function projectConfigPath(directory: string): string {\n const start = resolve(directory)\n let current = start\n while (!existsSync(join(current, 'hai.json')) && dirname(current) !== current)\n current = dirname(current)\n return join(existsSync(join(current, 'hai.json')) ? current : start, 'hai.json')\n}\n\n/**\n * 严格读取项目工具配置,解析失败只报告路径,不输出可能包含凭据的 JSON 片段。\n * @param path - hai.json 文件的绝对路径。\n * @returns 项目根配置对象;各分区继续由消费者按实际 Schema 校验。\n * @throws Error - 文件不可读、JSON 无效或根节点不是对象。\n * @example 模块内部上下文\n * ```ts\n * const project = readProjectConfig(projectConfigPath('/workspace/shop'))\n * const deployment = project.deploy // 部署分区仍需校验并解析环境变量。\n * ```\n */\nexport function readProjectConfig(path: string): Record<string, unknown> {\n try {\n const config: unknown = JSON.parse(readFileSync(path, 'utf8'))\n if (config && typeof config === 'object' && !Array.isArray(config))\n return config as Record<string, unknown>\n }\n catch { /* 统一返回脱敏诊断,不能输出配置片段。 */ }\n throw new Error(cliM('cli_project_config_invalid', { params: { path } }))\n}\n","/**\n * @h-ai/cli — 模块增量添加命令\n *\n * 向现有 hai 项目增量启用模块。\n * @module cli-add\n */\n\nimport type { FeatureId, GlobalOptions } from '../cli-types.js'\nimport path from 'node:path'\nimport { parseEnv } from 'node:util'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { parse } from 'yaml'\nimport { cliM } from '../cli-i18n.js'\nimport { detectPackageManager, fileExists, getCliVersion, writeCliError, writeCliMessage, writeFile } from '../cli-utils.js'\nimport { generateConfigFile, generateProductionEnvironment } from './cli-config-templates.js'\nimport { detectProject } from './cli-create.js'\nimport { projectConfigPath, readProjectConfig } from './cli-project-config.js'\n\n/**\n * 为部署工具补齐根配置分区,保留已有构建配置和用户字段。\n * @param cwd - 当前项目或服务目录。\n * @returns 根配置已包含 deploy 分区。\n * @example 模块内部上下文\n * ```ts\n * await ensureDeployConfig('/workspace/shop/packages/shop-serv')\n * // 已有 hai.json.build 和 deploy 自定义项保持不变。\n * ```\n */\nasync function ensureDeployConfig(cwd: string): Promise<void> {\n const configPath = projectConfigPath(cwd)\n const project = await fileExists(configPath) ? readProjectConfig(configPath) : {}\n if (project.deploy === undefined) {\n project.deploy = parse(generateConfigFile('deploy'))\n await fse.writeJson(configPath, project, { spaces: 2 })\n }\n}\n\n/**\n * add 命令选项\n * 省略 module 时交互选择;install=false 只写项目依赖/配置与支持文件,不安装依赖。\n * @example 模块内部上下文\n * ```ts\n * const options: AddModuleOptions = { cwd: '/workspace/shop', module: 'ai', install: false }\n * ```\n */\nexport interface AddModuleOptions extends GlobalOptions {\n /** 要添加的模块 */\n module?: FeatureId\n /** 是否安装依赖 */\n install?: boolean\n}\n\n// 可添加的模块与对应包\nconst MODULE_MAP: Record<string, { packages: string[], deps?: string[], configKey?: string, description: string }> = {\n // iam 依赖 crypto(password hash)/ db(user 存储)/ cache(session 缓存)\n 'iam': { packages: ['@h-ai/iam'], deps: ['crypto', 'db', 'cache'], configKey: 'iam', get description() {\n return cliM('cli_featureIamName')\n } },\n // 'db' 和 'reldb' 都映射到 @h-ai/reldb,兼容用户习惯(hai add db 和 hai add reldb 均可)\n 'db': { packages: ['@h-ai/reldb'], configKey: 'db', get description() {\n return cliM('cli_featureDbName')\n } },\n 'reldb': { packages: ['@h-ai/reldb'], configKey: 'db', get description() {\n return cliM('cli_featureDbName')\n } },\n 'cache': { packages: ['@h-ai/cache'], configKey: 'cache', get description() {\n return cliM('cli_featureCacheName')\n } },\n 'ai': { packages: ['@h-ai/ai'], deps: ['db', 'vecdb'], configKey: 'ai', get description() {\n return cliM('cli_featureAiName')\n } },\n 'storage': { packages: ['@h-ai/storage'], configKey: 'storage', get description() {\n return cliM('cli_featureStorageName')\n } },\n 'crypto': { packages: ['@h-ai/crypto'], deps: ['db'], get description() {\n return cliM('cli_featureCryptoName')\n } },\n 'kit': { packages: ['@h-ai/kit'], get description() {\n return cliM('cli_featureKitName')\n } },\n 'ui': { packages: ['@h-ai/ui'], get description() {\n return cliM('cli_featureUiName')\n } },\n 'deploy': { packages: ['@h-ai/deploy'], configKey: 'deploy', get description() {\n return cliM('cli_featureDeployName')\n } },\n 'vecdb': { packages: ['@h-ai/vecdb'], configKey: 'vecdb', get description() {\n return cliM('cli_featureVecdbName')\n } },\n 'datapipe': { packages: ['@h-ai/datapipe'], get description() {\n return cliM('cli_featureDatapipeName')\n } },\n 'reach': { packages: ['@h-ai/reach'], configKey: 'reach', get description() {\n return cliM('cli_featureReachName')\n } },\n 'feedback': { packages: ['@h-ai/feedback'], deps: ['crypto', 'db', 'cache', 'storage', 'iam'], configKey: 'feedback', get description() {\n return cliM('cli_featureFeedbackName')\n } },\n 'scheduler': { packages: ['@h-ai/scheduler'], deps: ['db'], configKey: 'scheduler', get description() {\n return cliM('cli_featureSchedulerName')\n } },\n 'audit': { packages: ['@h-ai/audit'], deps: ['db'], configKey: 'audit', get description() {\n return cliM('cli_featureAuditName')\n } },\n 'payment': { packages: ['@h-ai/payment'], configKey: 'payment', get description() {\n return cliM('cli_featurePaymentName')\n } },\n 'capacitor': { packages: ['@h-ai/capacitor'], get description() {\n return cliM('cli_featureCapacitorName')\n } },\n 'api-client': { packages: ['@h-ai/api-client'], get description() {\n return cliM('cli_featureApiClientName')\n } },\n}\n\n/**\n * 增量添加模块到现有项目\n * 写入失败与安装失败会抛出异常;未检测到项目、未知或已安装模块等分支打印诊断后返回。\n * @param options - 命令参数;对应命令的工作目录、非交互与可选功能。\n * @returns 依赖/配置与支持文件处理结束;部分诊断分支打印提示后直接返回。\n * @example 模块内部上下文\n * ```ts\n * // 前提:当前目录是要修改的现有 hai 项目。\n * await addModule({ cwd: process.cwd(), module: 'ai', install: false })\n * // 然后自行安装依赖,并在应用启动链路初始化新增模块;此命令不修改业务启动代码。\n * ```\n */\nexport async function addModule(options: AddModuleOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? '.'\n\n try {\n // 检测项目\n const project = await detectProject(cwd)\n if (!project) {\n writeCliError(chalk.red(cliM('cli_projectNotFound')))\n return\n }\n\n // 交互式选择模块\n let moduleName = options.module\n if (!moduleName) {\n // 过滤已安装的模块\n const installed = new Set(project.haiPackages)\n const choices = Object.entries(MODULE_MAP)\n .filter(([, def]) => !def.packages.every(p => installed.has(p)))\n .map(([key, def]) => ({\n title: `${chalk.bold(key.padEnd(10))} ${chalk.gray(def.description)}`,\n value: key,\n }))\n\n if (choices.length === 0) {\n writeCliMessage(chalk.green(cliM('cli_addAllInstalled')))\n return\n }\n\n const { selected } = await prompts({\n type: 'select',\n hint: cliM('cli_selectHint'),\n name: 'selected',\n message: cliM('cli_addModulePrompt'),\n choices,\n })\n\n if (!selected)\n return\n moduleName = selected as FeatureId\n }\n\n const moduleDef = MODULE_MAP[moduleName]\n if (!moduleDef) {\n writeCliError(chalk.red(cliM('cli_addUnknownModule', { params: { module: moduleName } })))\n writeCliMessage(cliM('cli_addAvailableModules', { params: { modules: Object.keys(MODULE_MAP).join(', ') } }))\n return\n }\n\n const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates.js')\n\n // 检查是否已安装\n if (moduleDef.packages.every(p => project.haiPackages.includes(p))) {\n if (moduleName === 'deploy')\n await ensureDeployConfig(cwd)\n const generatedFiles = await generateProjectAiSupport(\n cwd,\n resolveSkillNamesForPackages(project.haiPackages),\n {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n },\n )\n if (generatedFiles.length > 0) {\n writeCliMessage(chalk.yellow(cliM('cli_addSupportCompleted', { params: { module: moduleName } })))\n for (const generatedFile of generatedFiles) {\n writeCliMessage(chalk.gray(cliM('cli_addSupportFile', { params: { file: generatedFile } })))\n }\n }\n else {\n writeCliMessage(chalk.yellow(cliM('cli_addAlreadyInstalled', { params: { module: moduleName } })))\n }\n return\n }\n\n // 收集所有需要安装的包(含依赖模块)\n const allPackages = new Set(moduleDef.packages)\n if (moduleDef.deps) {\n for (const dep of moduleDef.deps) {\n const depDef = MODULE_MAP[dep]\n if (depDef) {\n for (const pkg of depDef.packages) {\n allPackages.add(pkg)\n }\n }\n }\n }\n\n // 更新 package.json\n spinner.start(cliM('cli_addUpdateManifest'))\n const pkgPath = path.join(cwd, 'package.json')\n const pkg = await fse.readJson(pkgPath)\n if (!pkg.dependencies)\n pkg.dependencies = {}\n\n const existingHaiSpecifier = Object.entries(pkg.dependencies as Record<string, string>)\n .find(([pkgName]) => pkgName.startsWith('@h-ai/'))?.[1]\n\n // 已存在的 @h-ai/* 依赖若使用 catalog:,新增模块保持一致;否则固定当前 CLI 对应版本。\n const depVersion = existingHaiSpecifier === 'catalog:' ? 'catalog:' : getCliVersion()\n\n for (const pkgName of allPackages) {\n if (pkgName === '@h-ai/deploy') {\n pkg.devDependencies ??= {}\n pkg.devDependencies[pkgName] ??= depVersion\n }\n else if (!pkg.dependencies[pkgName]) {\n pkg.dependencies[pkgName] = depVersion\n }\n }\n await fse.writeJson(pkgPath, pkg, { spaces: 2 })\n spinner.succeed()\n\n // 生成配置文件\n if (moduleDef.configKey === 'deploy') {\n await ensureDeployConfig(cwd)\n }\n else if (moduleDef.configKey) {\n const configDir = path.join(cwd, 'config')\n const configPath = path.join(configDir, `_${moduleDef.configKey}.yml`)\n if (!(await fileExists(configPath))) {\n spinner.start(cliM('cli_addConfig', { params: { config: moduleDef.configKey } }))\n const content = generateConfigFile(moduleDef.configKey)\n await writeFile(configPath, content)\n spinner.succeed()\n }\n else {\n writeCliMessage(chalk.gray(cliM('cli_addConfigExists', { params: { config: moduleDef.configKey } })))\n }\n }\n\n // 生成依赖模块的配置文件\n if (moduleDef.deps) {\n for (const dep of moduleDef.deps) {\n const depDef = MODULE_MAP[dep]\n if (depDef?.configKey) {\n const depConfigPath = path.join(cwd, 'config', `_${depDef.configKey}.yml`)\n if (!(await fileExists(depConfigPath))) {\n const content = generateConfigFile(depDef.configKey)\n await writeFile(depConfigPath, content)\n writeCliMessage(chalk.gray(cliM('cli_addDependencyConfig', { params: { config: depDef.configKey } })))\n }\n }\n }\n }\n\n const skillPackages = [...project.haiPackages, ...allPackages]\n const generatedFiles = await generateProjectAiSupport(\n cwd,\n resolveSkillNamesForPackages(skillPackages),\n {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n },\n )\n if (generatedFiles.length > 0) {\n for (const generatedFile of generatedFiles) {\n writeCliMessage(chalk.gray(cliM('cli_addSupportFile', { params: { file: generatedFile } })))\n }\n }\n\n // 安装依赖\n const productionPath = path.join(cwd, '.env.prod')\n const previousProduction = await fileExists(productionPath) ? await fse.readFile(productionPath, 'utf8') : ''\n const configured = new Set([...previousProduction.matchAll(/^([A-Z][A-Z0-9_]*)=/gm)].map(match => match[1]))\n const previousValues = parseEnv(previousProduction)\n const production = generateProductionEnvironment([moduleName, ...(moduleDef.deps ?? [])] as FeatureId[], previousValues.HAI_DB_TYPE === 'mysql' ? { db: { type: 'mysql', database: previousValues.HAI_DB_DATABASE } } : undefined)\n .split('\\n')\n .filter(line => !/^[A-Z][A-Z0-9_]*=/.test(line) || !configured.has(line.split('=')[0]))\n await writeFile(productionPath, `${previousProduction.trimEnd()}\\n\\n${production.join('\\n')}`)\n\n const doInstall = options.install !== false\n if (doInstall) {\n spinner.start(cliM('cli_addInstall'))\n const { execSync } = await import('node:child_process')\n const pm = await detectPackageManager(cwd)\n execSync(`${pm} install`, { cwd, stdio: 'ignore' })\n spinner.succeed()\n }\n\n writeCliMessage('')\n writeCliMessage(chalk.green(cliM('cli_addSuccess', { params: { module: moduleName } })))\n writeCliMessage('')\n writeCliMessage(cliM('cli_addPackages'))\n for (const pkg of allPackages) {\n writeCliMessage(chalk.cyan(` ${pkg}`))\n }\n writeCliMessage('')\n }\n catch (error) {\n spinner.fail()\n writeCliError(chalk.red(cliM('cli_addFailed')), { error })\n throw error\n }\n}\n","/** Capacitor 同步与真正原生产物打包分开;只接受受控工程内路径。 */\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'\nimport { isAbsolute, join, relative, resolve } from 'node:path'\nimport process from 'node:process'\nimport { cliM } from '../cli-i18n.js'\n\n/**\n * 原生打包前检查工程和平台,结束后检查本次产物;工具链错误由真实构建命令返回。\n * @example 模块内部上下文\n * ```ts\n * async function build(run: (args: string[], cwd: string) => Promise<void>) {\n * return buildMobileApp('/project', ['apps/shop-app'], 'android', run)\n * }\n * ```\n */\nexport async function buildMobileApp(root: string, directories: readonly string[], platform: 'android' | 'ios', run: (args: string[], cwd: string) => Promise<void>): Promise<string[]> {\n if (!directories.length || (platform === 'ios' && process.platform !== 'darwin'))\n throw new Error(cliM('cli_build_app_platform'))\n const outputs: string[] = []\n for (const item of directories) {\n const directory = resolve(root, item)\n const rel = relative(root, directory)\n // 独立手机工程可直接使用根目录;跨盘绝对路径和父目录仍不能越过工程边界。\n if (isAbsolute(rel) || rel.startsWith('..') || !existsSync(join(directory, platform)) || !existsSync(join(directory, 'capacitor.config.ts')))\n throw new Error(cliM('cli_build_app_missing', { params: { platform } }))\n const before = Date.now()\n await run(['run', 'build'], directory)\n await run(['exec', 'cap', 'sync', platform], directory)\n // sync 后核验最终写入原生工程的配置,禁止开发热更新地址进入制品。\n const nativeConfig = platform === 'android' ? join(directory, 'android/app/src/main/assets/capacitor.config.json') : join(directory, 'ios/App/App/capacitor.config.json')\n const config: { server?: { url?: unknown } } = JSON.parse(readFileSync(nativeConfig, 'utf8'))\n if (config.server?.url)\n throw new Error(cliM('cli_build_app_reload'))\n await run(['exec', 'cap', 'build', platform, ...(platform === 'android' ? ['--androidreleasetype', 'APK'] : [])], directory)\n const artifactRoot = platform === 'android' ? join(directory, 'android/app/build/outputs/apk') : join(directory, 'ios/App/output')\n function visit(path: string): void {\n if (!existsSync(path))\n return\n for (const entry of readdirSync(path, { withFileTypes: true })) {\n const file = join(path, entry.name)\n if (entry.isDirectory()) {\n visit(file)\n }\n else if (entry.isFile() && file.endsWith(platform === 'android' ? '.apk' : '.ipa')) {\n const info = statSync(file)\n if (info.size > 4 && info.mtimeMs >= before - 1000 && readFileSync(file).subarray(0, 2).toString() === 'PK')\n outputs.push(file)\n }\n }\n }\n const count = outputs.length\n visit(artifactRoot)\n if (outputs.length === count)\n throw new Error(cliM('cli_build_app_artifact'))\n }\n return outputs\n}\n","/** 打包下载设置:项目保存选源,代理按本机环境解析。 */\nimport type { DownloadProxyConfig, ImageSourceConfig } from '@h-ai/deploy'\nimport { execFileSync } from 'node:child_process'\nimport { readFileSync, writeFileSync } from 'node:fs'\nimport { connect } from 'node:net'\nimport process from 'node:process'\nimport { resolveDownloadProxy, resolveImageReference } from '@h-ai/deploy'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliMessage } from '../cli-utils.js'\nimport { projectConfigPath, readProjectConfig } from './cli-project-config.js'\n\n/**\n * CLI 内部下载参数;构建与部署入口共同消费。\n * @example 模块内部上下文\n * ```ts\n * const options: BuildDownloadOptions = { imageSource: 'cn', npmSource: 'cn', proxyMode: 'inherit', yes: true }\n * ```\n */\nexport interface BuildDownloadOptions {\n imageSource?: 'official' | 'cn' | 'custom'\n imageMirrors?: string\n npmSource?: 'official' | 'cn' | 'custom'\n npmRegistry?: string\n proxyMode?: DownloadProxyConfig['mode']\n proxyUrl?: string\n proxyBypass?: string\n httpProxy?: boolean\n yes?: boolean\n}\n\n/**\n * 已解析的本次下载设置,不包含运行时应用配置。\n * @example 模块内部上下文\n * ```ts\n * const downloads: BuildDownloads = { imageSource: { type: 'cn' }, npmSource: { type: 'cn' }, npmRegistry: 'https://registry.npmmirror.com', proxy: { mode: 'inherit' } }\n * ```\n */\nexport interface BuildDownloads {\n imageSource: ImageSourceConfig\n npmRegistry: string\n npmSource: { type: 'official' | 'cn' | 'custom', registry?: string }\n proxy: DownloadProxyConfig\n}\n\n/** 可选分区也必须是对象,避免损坏配置静默回退。 */\nfunction object(value: unknown): Record<string, unknown> {\n if (value === undefined)\n return {}\n if (!value || typeof value !== 'object' || Array.isArray(value))\n throw new Error(cliM('cli_download_invalid'))\n return value as Record<string, unknown>\n}\n\n/** 校验 npm registry,拒绝把认证信息保存在项目配置中。 */\nfunction registryUrl(value: unknown): string {\n try {\n if (typeof value !== 'string')\n throw new Error('Missing registry')\n const url = new URL(value)\n if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password || url.search || url.hash)\n throw new Error('Invalid registry')\n return url.toString().replace(/\\/$/, '')\n }\n catch { throw new Error(cliM('cli_download_invalid')) }\n}\n\n/**\n * 首次交互选择保存项目默认;显式命令参数只覆盖本次。\n * @param directory - 含 hai.json 的项目根或服务目录。\n * @param options - 命令覆盖及非交互设置。\n * @returns 已校验的下载源和代理。\n * @throws Error - 配置无效、系统代理不可读或交互取消。\n * @example 模块内部上下文\n * ```ts\n * const downloads = await resolveBuildDownloads('/workspace/shop', { yes: true, imageSource: 'cn', npmSource: 'cn' })\n * ```\n */\nexport async function resolveBuildDownloads(directory: string, options: BuildDownloadOptions): Promise<BuildDownloads> {\n const path = projectConfigPath(directory)\n const project = readProjectConfig(path)\n const build = object(project.build)\n const sources = object(build.sources)\n const savedImage = object(sources.image)\n const savedNpm = object(sources.npm)\n const savedProxy = object(build.proxy)\n const interactive = !!process.stdin.isTTY && !options.yes\n const choose = async (message: string, values: Array<'official' | 'cn' | 'custom' | 'inherit' | 'system' | 'none'>): Promise<string> => {\n const answer = await prompts({ type: 'select', name: 'value', message, choices: values.map(value => ({ title: cliM(`cli_download_${value}`), value })) })\n if (typeof answer.value !== 'string')\n throw new Error(cliM('cli_deploy_cancelled'))\n return answer.value\n }\n const mirrorEntries = options.imageMirrors?.split(',').map((entry) => {\n const separator = entry.indexOf('=')\n if (separator <= 0 || separator === entry.length - 1)\n throw new Error(cliM('cli_download_invalid'))\n return [entry.slice(0, separator).trim(), entry.slice(separator + 1).trim()]\n })\n if (mirrorEntries && new Set(mirrorEntries.map(([key]) => key)).size !== mirrorEntries.length)\n throw new Error(cliM('cli_download_invalid'))\n let imageType = options.imageSource ?? (mirrorEntries ? 'custom' : savedImage.type)\n let npmType = options.npmSource ?? (options.npmRegistry ? 'custom' : savedNpm.type)\n const saveImage = imageType === undefined && interactive\n const saveNpm = npmType === undefined && interactive\n if (saveImage)\n imageType = await choose(cliM('cli_download_choose_image'), ['official', 'cn', 'custom'])\n if (saveNpm)\n npmType = await choose(cliM('cli_download_choose_npm'), ['official', 'cn', 'custom'])\n imageType ??= 'official'\n npmType ??= 'official'\n if (typeof imageType !== 'string' || !['official', 'cn', 'custom'].includes(imageType) || typeof npmType !== 'string' || !['official', 'cn', 'custom'].includes(npmType))\n throw new Error(cliM('cli_download_invalid'))\n let registries = mirrorEntries ? Object.fromEntries(mirrorEntries) : savedImage.registries\n if (imageType === 'custom' && !registries && interactive) {\n const answer = await prompts({ type: 'text', name: 'value', message: cliM('cli_download_image_mirrors') })\n if (typeof answer.value !== 'string' || !answer.value.trim())\n throw new Error(cliM('cli_deploy_cancelled'))\n registries = Object.fromEntries(answer.value.split(',').map((entry: string) => {\n const index = entry.indexOf('=')\n if (index <= 0)\n throw new Error(cliM('cli_download_invalid'))\n return [entry.slice(0, index).trim(), entry.slice(index + 1).trim()]\n }))\n }\n const mappings = registries === undefined ? undefined : object(registries)\n if (mappings && Object.entries(mappings).some(([key, value]) => !/^[\\w.-]+(?::\\d+)?$/.test(key) || typeof value !== 'string'))\n throw new Error(cliM('cli_download_invalid'))\n const imageSource: ImageSourceConfig = { type: imageType as ImageSourceConfig['type'], ...(imageType === 'custom' ? { registries: mappings as Record<string, string> | undefined } : {}) }\n if (mirrorEntries && imageType !== 'custom')\n throw new Error(cliM('cli_download_invalid'))\n if (imageType === 'custom') {\n if (!mappings || !Object.keys(mappings).length)\n throw new Error(cliM('cli_download_invalid'))\n for (const key of Object.keys(mappings)) resolveImageReference(`${key}/hai-source-check:1`, imageSource)\n }\n let customRegistry = options.npmRegistry ?? savedNpm.registry\n if (npmType === 'custom' && !customRegistry && interactive) {\n const answer = await prompts({ type: 'text', name: 'value', message: cliM('cli_download_npm_registry') })\n if (typeof answer.value !== 'string' || !answer.value.trim())\n throw new Error(cliM('cli_deploy_cancelled'))\n customRegistry = answer.value\n }\n if (options.npmRegistry && npmType !== 'custom')\n throw new Error(cliM('cli_download_invalid'))\n const npmRegistry = npmType === 'cn' ? 'https://registry.npmmirror.com' : npmType === 'official' ? 'https://registry.npmjs.org' : registryUrl(customRegistry)\n const npmSource: BuildDownloads['npmSource'] = { type: npmType as BuildDownloads['npmSource']['type'], ...(npmType === 'custom' ? { registry: npmRegistry } : {}) }\n let proxyMode = options.proxyMode ?? (options.proxyUrl ? 'custom' : savedProxy.mode)\n const saveProxy = proxyMode === undefined && interactive && options.httpProxy !== false\n if (saveProxy)\n proxyMode = await choose(cliM('cli_download_choose_proxy'), ['inherit', 'system', 'custom', 'none'])\n proxyMode ??= 'inherit'\n if (options.proxyUrl !== undefined && proxyMode !== 'custom')\n throw new Error(cliM('cli_download_invalid'))\n if (typeof proxyMode !== 'string' || !['inherit', 'system', 'custom', 'none'].includes(proxyMode))\n throw new Error(cliM('cli_download_invalid'))\n if (options.httpProxy === false && (options.proxyUrl !== undefined || (options.proxyMode !== undefined && options.proxyMode !== 'none')))\n throw new Error(cliM('cli_download_invalid'))\n let proxyUrl = options.proxyUrl ?? savedProxy.url\n if (proxyMode === 'custom' && !proxyUrl && interactive) {\n const answer = await prompts({ type: 'text', name: 'value', message: cliM('cli_download_proxy_url') })\n if (typeof answer.value !== 'string' || !answer.value.trim())\n throw new Error(cliM('cli_deploy_cancelled'))\n proxyUrl = answer.value\n }\n const bypass = options.proxyBypass ?? savedProxy.bypass\n if ((proxyUrl !== undefined && typeof proxyUrl !== 'string') || (bypass !== undefined && typeof bypass !== 'string'))\n throw new Error(cliM('cli_download_invalid'))\n const proxy: DownloadProxyConfig = { mode: options.httpProxy === false ? 'none' : proxyMode as DownloadProxyConfig['mode'], ...(proxyMode === 'custom' && options.httpProxy !== false ? { url: proxyUrl as string | undefined } : {}), ...(bypass !== undefined ? { bypass: bypass as string } : {}) }\n resolveDownloadProxy(proxy)\n if (saveImage || saveNpm || saveProxy) {\n project.build = { ...build, sources: { ...sources, ...(saveImage ? { image: imageSource } : {}), ...(saveNpm ? { npm: npmSource } : {}) }, ...(saveProxy ? { proxy } : {}) }\n writeFileSync(path, `${JSON.stringify(project, null, 2)}\\n`)\n }\n return { imageSource, npmRegistry, npmSource, proxy }\n}\n\n/**\n * 按显式构建网络处理回环代理;Podman 默认网络保留调用者地址。\n * @param proxy - 本次代理配置。\n * @param runtime - 实际构建引擎。\n * @param network - 显式构建网络;host 网络保留回环地址。\n * @returns 预定义代理构建参数。\n * @example 模块内部上下文\n * ```ts\n * const args = buildProxyArguments({ mode: 'custom', url: 'http://127.0.0.1:10808' }, 'podman', 'pasta')\n * ```\n */\nexport function buildProxyArguments(proxy: DownloadProxyConfig, runtime: string, network?: string): string[] {\n const environment = resolveDownloadProxy(proxy)\n for (const key of ['HTTP_PROXY', 'HTTPS_PROXY', 'http_proxy', 'https_proxy', 'ALL_PROXY', 'all_proxy']) {\n if (!environment[key])\n continue\n const url = new URL(environment[key])\n if (network !== 'host' && (runtime === 'docker' || network !== undefined) && ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname)) {\n url.hostname = runtime === 'podman' ? 'host.containers.internal' : 'host.docker.internal'\n environment[key] = url.toString().replace(/\\/$/, '')\n }\n }\n return Object.entries(environment).flatMap(([key, value]) => ['--build-arg', `${key}=${value}`])\n}\n\n/**\n * 打包前检查本机代理端口,并单独报告引擎拉取代理的配置边界。\n * @param runtime - 实际或待探测的容器引擎。\n * @param proxy - 本次代理配置。\n * @returns 本机端口检查完成;引擎侧无法核实时显示说明。\n * @throws Error - 代理端口不可达或代理配置非法。\n * @example 模块内部上下文\n * ```ts\n * await preflightDownloadProxy('auto', { mode: 'inherit' })\n * ```\n */\nexport async function preflightDownloadProxy(runtime: string, proxy: DownloadProxyConfig): Promise<void> {\n const environment = resolveDownloadProxy(proxy)\n for (const value of new Set([environment.HTTP_PROXY, environment.HTTPS_PROXY].filter(Boolean))) {\n const url = new URL(value)\n await new Promise<void>((resolve, reject) => {\n const socket = connect({ host: url.hostname.replace(/^\\[|\\]$/g, ''), port: Number(url.port || (url.protocol === 'https:' ? 443 : 80)) })\n socket.setTimeout(3000)\n socket.once('connect', () => {\n socket.destroy()\n resolve()\n })\n const fail = (): void => {\n socket.destroy()\n reject(new Error(cliM('cli_download_proxy_unreachable')))\n }\n socket.once('error', fail)\n socket.once('timeout', fail)\n })\n }\n if (!environment.HTTP_PROXY && !environment.HTTPS_PROXY)\n return\n for (const candidate of runtime === 'auto' ? ['podman', 'docker'] : [runtime]) {\n try {\n const data: { HTTPProxy?: string, HTTPSProxy?: string, host?: { serviceIsRemote?: boolean } } = JSON.parse(execFileSync(candidate, ['info', '--format', '{{json .}}'], { encoding: 'utf8', windowsHide: true, timeout: 5000, stdio: ['ignore', 'pipe', 'ignore'] }))\n writeCliMessage(cliM(candidate === 'docker' && (data.HTTPProxy || data.HTTPSProxy) ? 'cli_download_engine_proxy_configured' : candidate === 'podman' && !data.host?.serviceIsRemote ? 'cli_download_engine_proxy_local' : 'cli_download_engine_proxy_hint', { params: { runtime: candidate } }))\n return\n }\n catch { /* 继续检查另一可用引擎,不替用户启动或修改引擎。 */ }\n }\n writeCliMessage(cliM('cli_download_engine_proxy_hint', { params: { runtime } }))\n}\n\n/**\n * 新的 npm 源必须有模板支持,避免命令成功但选源未生效。\n * @param file - 实际 Dockerfile 路径。\n * @param downloads - 本次已校验的下载配置。\n * @throws Error - 旧 Dockerfile 不支持所选源。\n * @example 模块内部上下文\n * ```ts\n * const downloads = await resolveBuildDownloads('/workspace/shop', { yes: true })\n * validateDownloadDockerfile('/workspace/shop/images/serv.Dockerfile', downloads)\n * ```\n */\nexport function validateDownloadDockerfile(file: string, downloads: BuildDownloads): void {\n const content = readFileSync(file, 'utf8')\n if ((downloads.imageSource.type !== 'official' && !/^ARG HAI_NODE_IMAGE=/m.test(content))\n || (downloads.npmSource.type !== 'official' && !/^ARG HAI_NPM_REGISTRY[=\\s]/m.test(content))) {\n throw new Error(cliM('cli_download_template_required', { params: { path: file } }))\n }\n}\n","/** Windows 构建日志使用 CRLF,避免 Linux 工具的 LF 在终端中产生阶梯式缩进。 */\nimport type { Buffer } from 'node:buffer'\nimport type { Readable } from 'node:stream'\nimport { Transform, Writable } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport { StringDecoder } from 'node:string_decoder'\n\n/**\n * 规范构建输出,保留 UTF-8、已有 CRLF、警告与颜色序列。\n * @returns 支持背压的换行转换流;跨数据块的 CRLF 不重复添加 CR。\n * @example 模块内部上下文\n * ```ts\n * const output = createWindowsBuildOutput()\n * output.end('Progress: resolved 1\\n')\n * ```\n */\nfunction createWindowsBuildOutput(): Transform {\n const decoder = new StringDecoder('utf8')\n let previousCarriageReturn = false\n const normalize = (value: string): string => {\n const result = value.replace(/\\n/g, (newline, offset: number) => (offset === 0 ? previousCarriageReturn : value[offset - 1] === '\\r') ? newline : '\\r\\n')\n if (value.length)\n previousCarriageReturn = value.endsWith('\\r')\n return result\n }\n return new Transform({\n transform(chunk: Buffer, _encoding, callback) {\n callback(null, normalize(decoder.write(chunk)))\n },\n flush(callback) {\n callback(null, normalize(decoder.end()))\n },\n })\n}\n\n/**\n * 转发 Windows 构建日志,等待输出写完,不关闭宿主终端流。\n * @param source - 当前子进程的标准输出或错误流。\n * @param destination - 宿主进程的对应输出流。\n * @returns 所有 UTF-8 文本与换行转发完成。\n * @example 模块内部上下文\n * ```ts\n * const input = createWindowsBuildOutput()\n * input.end('Progress: resolved 1\\n')\n * await forwardWindowsBuildOutput(input, new Writable({ write(_chunk, _encoding, done) { done() } }))\n * ```\n */\nexport async function forwardWindowsBuildOutput(source: Readable, destination: Writable): Promise<void> {\n // 包装写入端,避免 pipeline 关闭终端或在多次构建后留下终端事件监听器。\n const forwarding = new Writable({\n write(chunk: Buffer, encoding, callback) {\n destination.write(chunk, encoding, callback)\n },\n })\n await pipeline(source, createWindowsBuildOutput(), forwarding)\n}\n","/** `pnpm build` 的环境无关构建入口:源码、OCI 镜像或 Tauri 安装包。 */\nimport type { DeploymentArtifact } from '@h-ai/deploy'\nimport type { GlobalOptions } from '../cli-types.js'\nimport type { BuildDownloadOptions } from './cli-build-downloads.js'\nimport { execFileSync, spawn } from 'node:child_process'\nimport { createHash, randomBytes, randomUUID } from 'node:crypto'\nimport { appendFileSync, copyFileSync, createReadStream, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport process from 'node:process'\nimport { normalizeProjectName, resolveImageReference } from '@h-ai/deploy'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliMessage } from '../cli-utils.js'\nimport { buildMobileApp } from './cli-build-app.js'\nimport { buildProxyArguments, preflightDownloadProxy, resolveBuildDownloads, validateDownloadDockerfile } from './cli-build-downloads.js'\nimport { forwardWindowsBuildOutput } from './cli-build-output.js'\nimport { projectConfigPath, readProjectConfig } from './cli-project-config.js'\n\n/**\n * 构建参数,不接受部署环境。\n * 对应 hai build --target image --images serv,web --runtime podman --no-http-proxy;镜像参数仅用于 image。\n * @example 模块内部上下文\n * ```ts\n * const options: BuildCommandOptions = { cwd: '/workspace/shop', target: 'image', images: 'serv,web', runtime: 'podman', httpProxy: false }\n * ```\n */\nexport interface BuildCommandOptions extends GlobalOptions, BuildDownloadOptions {\n /** compile 编译源码,image 导出 serv/web 镜像,app 调用 Capacitor,desktop 调用 Tauri。 */\n target?: 'compile' | 'image' | 'desktop' | 'app'\n /** 逗号分隔的应用镜像名;省略时构建全部。 */\n images?: string\n /** 并行镜像任务数,默认 2;内存受限时设为 1。 */\n concurrency?: number\n /** auto 优先使用可达的 Podman。 */\n runtime?: 'auto' | 'podman' | 'docker'\n /** 容器构建网络,默认采用引擎设置;例如 rootless Podman 的 pasta。 */\n network?: string\n /** 原生目标平台;desktop 须与主机一致,iOS 须使用 macOS,Android 须具备对应 SDK。 */\n platform?: 'windows' | 'linux' | 'macos' | 'android' | 'ios'\n /** Rust 目标架构,默认当前主机架构。 */\n arch?: 'x64' | 'arm64'\n /** 可信 SQLite 预编译包根地址,不包含凭据。 */\n sqlitePrebuildMirror?: string\n /** Podman 是否继承代理。 */\n httpProxy?: boolean\n}\n\n/**\n * 项目构建描述;serv/web 共用 buildId,app/desktop 单独生成原生安装包。\n * 从 hai.json 的 build 分区读取;镜像名称为 serv/web,构建命令还会校验唯一性与路径边界。\n * @example 模块内部上下文\n * ```ts\n * const config: BuildConfig = { images: [{ name: 'serv', context: '.', dockerfile: 'images/serv.Dockerfile', containerPort: 3000 }], desktop: ['apps/shop-desktop'] }\n * ```\n */\ninterface BuildConfig {\n images?: Array<{ name: 'serv' | 'web', context?: string, dockerfile: string, containerPort?: number }>\n desktop?: string[]\n app?: string[]\n}\n\n/** 子进程不经过 shell;pnpm 使用当前原生或 JS 入口,兼容 Windows 路径。 */\nasync function run(command: string, args: string[], cwd: string, quiet = false, identity?: { buildId: string, commit: string }, compileEnvironment?: Record<string, string>): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const env = Object.fromEntries(Object.entries(process.env).filter(([key]) => !/^(?:HAI_|PUBLIC_|VITE_)/.test(key)))\n Object.assign(env, compileEnvironment)\n // 仅显式加入本次构建器生成的身份,不透传调用者的同名环境变量。\n if (identity) {\n env.HAI_BUILD_ID = identity.buildId\n env.HAI_BUILD_COMMIT = identity.commit\n }\n env.NODE_ENV = 'production'\n // 子进程不使用交互进度条;保留每一条下载、警告和错误记录。\n if (process.platform === 'win32') {\n env.npm_config_reporter = 'append-only'\n env.pnpm_config_reporter = 'append-only'\n }\n delete env.CAPACITOR_SERVER_URL\n // Tauri 的 CI 参数只接受 true/false,兼容 CI 平台常用的 1/0 写法。\n if (env.CI === '1' || env.CI === '0')\n env.CI = env.CI === '1' ? 'true' : 'false'\n const windowsOutput = !quiet && process.platform === 'win32'\n const child = spawn(command, args, { cwd, env, windowsHide: true, stdio: quiet ? 'ignore' : windowsOutput ? ['inherit', 'pipe', 'pipe'] : 'inherit', shell: false })\n let output = Promise.resolve()\n if (windowsOutput && child.stdout && child.stderr) {\n output = Promise.all([\n forwardWindowsBuildOutput(child.stdout, process.stdout),\n forwardWindowsBuildOutput(child.stderr, process.stderr),\n ]).then(() => undefined)\n // 输出流异常时结束本次本地子进程,再由 close 等待剩余管道关闭。\n void output.catch(() => child.kill())\n }\n child.once('error', reject)\n child.once(windowsOutput && child.stdout && child.stderr ? 'close' : 'exit', (code) => {\n void output.then(() => code === 0 ? resolve() : reject(new Error(cliM('cli_build_failed', { params: { command, code: String(code) } }))), reject)\n })\n })\n}\n\n/** 使用已安装的 pnpm,不通过 Corepack 下载另一套工具链。 */\nasync function pnpm(args: string[], cwd: string, identity: { buildId: string, commit: string }, compileEnvironment?: Record<string, string>): Promise<void> {\n const entry = process.env.npm_execpath\n if (entry && /(?:^|[/\\\\])pnpm(?:-native)?(?:\\.exe|\\.[cm]?js)?$/i.test(entry))\n return /\\.[cm]?js$/i.test(entry) ? run(process.execPath, [entry, ...args], cwd, false, identity, compileEnvironment) : run(entry, args, cwd, false, identity, compileEnvironment)\n // CLI 直接调用时从 PATH 定位原生或 JS 入口;Windows 的 .cmd 不能由无 shell spawn 执行。\n if (process.platform === 'win32') {\n const directories = (process.env.PATH ?? '').split(';')\n for (const directory of directories) {\n const executable = join(directory, 'pnpm.exe')\n if (existsSync(executable))\n return run(executable, args, cwd, false, identity, compileEnvironment)\n for (const relative of ['node_modules/pnpm/bin/pnpm.cjs', 'pnpm.cjs']) {\n const candidate = join(directory, relative)\n if (existsSync(candidate))\n return run(process.execPath, [candidate, ...args], cwd, false, identity, compileEnvironment)\n }\n }\n throw new Error(cliM('cli_build_use_pnpm'))\n }\n return run('pnpm', args, cwd, false, identity, compileEnvironment)\n}\n\n/** 网站只放行显式公开的构建控制值;镜像只接收目录参数,原生目标保持隔离。 */\nfunction staticCompileEnvironment(target: string): Record<string, string> {\n const flag = process.env.HAI_BUILD_STATIC\n const base = process.env.PUBLIC_BASE_PATH\n if (flag !== undefined && flag !== '' && flag !== '0' && flag !== '1')\n throw new Error(cliM('cli_build_static_flag'))\n if (base && (!/^\\/[\\w.-]+(?:\\/[\\w.-]+)*$/.test(base) || base.split('/').some(segment => segment === '.' || segment === '..')))\n throw new Error(cliM('cli_build_static_base'))\n if (target !== 'compile') {\n if (flag === '1' || (base && target !== 'image'))\n throw new Error(cliM('cli_build_static_target'))\n return target === 'image' && base ? { PUBLIC_BASE_PATH: base } : {}\n }\n return { ...(flag ? { HAI_BUILD_STATIC: flag } : {}), ...(base ? { PUBLIC_BASE_PATH: base } : {}) }\n}\n\n/** 只有工程 manifest 受当前仓库管理时,才将其 HEAD 作为源码事实。 */\nfunction sourceCommit(cwd: string): string {\n try {\n const options = { cwd, encoding: 'utf8' as const, stdio: 'pipe' as const, windowsHide: true }\n const root = execFileSync('git', ['rev-parse', '--show-toplevel'], options).trim()\n const manifest = relative(root, join(cwd, 'package.json')).replaceAll('\\\\', '/')\n if (manifest.startsWith('../'))\n return 'unknown'\n execFileSync('git', ['ls-files', '--error-unmatch', '--', manifest], { ...options, cwd: root })\n const commit = execFileSync('git', ['rev-parse', 'HEAD'], options).trim()\n return /^(?:[a-f\\d]{40}|[a-f\\d]{64})$/i.test(commit) ? commit : 'unknown'\n }\n catch {\n return 'unknown'\n }\n}\n\n/**\n * 构建已有项目;镜像清单仅在全部镜像导出成功后发布。\n * compile 调用项目 compile 脚本;docker 发布完整产物清单后才更新 latest;desktop 仅允许当前主机对应平台。\n * @throws Error - 参数、构建配置、运行时探测或子进程执行失败。\n * @param options - 命令参数;对应命令的工作目录、非交互与可选功能。\n * @returns 所选目标构建完成;失败时抛出异常。\n * @example 模块内部上下文\n * ```ts\n * // 前提:当前项目已有 compile 脚本及已安装依赖。\n * await buildCommand({ cwd: process.cwd(), target: 'compile' })\n * // 等价命令:hai build --target compile;失败抛出异常。\n * ```\n */\nexport async function buildCommand(options: BuildCommandOptions): Promise<void> {\n const directory = resolve(options.cwd ?? process.cwd())\n const target = options.target ?? 'compile'\n const concurrency = Number(options.concurrency ?? 2)\n if (![1, 2].includes(concurrency))\n throw new Error(cliM('cli_build_concurrency_invalid'))\n const cwd = target === 'compile' ? directory : dirname(projectConfigPath(directory))\n if (!['compile', 'image', 'desktop', 'app'].includes(target))\n throw new Error(cliM('cli_build_target_invalid'))\n const compileEnvironment = staticCompileEnvironment(target)\n if ((target !== 'image' && (options.images !== undefined || options.concurrency !== undefined || options.runtime !== undefined || options.network !== undefined || options.sqlitePrebuildMirror !== undefined || options.httpProxy === false || options.imageSource !== undefined || options.imageMirrors !== undefined || options.npmSource !== undefined || options.npmRegistry !== undefined || options.proxyMode !== undefined || options.proxyUrl !== undefined || options.proxyBypass !== undefined))\n || (!['desktop', 'app'].includes(target) && (options.platform !== undefined || options.arch !== undefined)) || (target === 'app' && options.arch !== undefined)) {\n throw new Error(cliM('cli_build_options_invalid'))\n }\n if (target === 'compile') {\n await pnpm(['run', 'compile'], cwd, { buildId: randomUUID(), commit: sourceCommit(cwd) }, compileEnvironment)\n return\n }\n const metadata: { name?: unknown, version?: unknown } = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8'))\n // 版本同时进入文件名和镜像标签;拒绝路径字符,保留预发布和构建元数据。\n const appVersion = metadata.version\n if (typeof appVersion !== 'string' || appVersion.length > 80 || !/^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9a-z-]+(?:\\.[0-9a-z-]+)*)?(?:\\+[0-9a-z-]+(?:\\.[0-9a-z-]+)*)?$/i.test(appVersion))\n throw new Error(cliM('cli_build_version_invalid'))\n const project = readProjectConfig(join(cwd, 'hai.json'))\n const config = (project.build ?? {}) as BuildConfig\n if (target === 'app') {\n if (!['android', 'ios'].includes(options.platform ?? ''))\n throw new Error(cliM('cli_build_app_platform'))\n const identity = { buildId: randomUUID(), commit: sourceCommit(cwd) }\n const files = await buildMobileApp(cwd, config.app ?? [], options.platform as 'android' | 'ios', (args, directory) => pnpm(args, directory, identity))\n for (const file of files) writeCliMessage(file)\n return\n }\n if (target === 'desktop') {\n const platforms = { win32: 'windows', linux: 'linux', darwin: 'macos' } as const\n const host = platforms[process.platform as keyof typeof platforms]\n const platform = options.platform ?? host\n const arch = options.arch ?? process.arch\n if (!platform || platform !== host || !['x64', 'arm64'].includes(arch))\n throw new Error(cliM('cli_build_native_host'))\n if (!config.desktop?.length)\n throw new Error(cliM('cli_build_desktop_missing'))\n const rustTarget = `${arch === 'x64' ? 'x86_64' : 'aarch64'}-${platform === 'windows' ? 'pc-windows-msvc' : platform === 'macos' ? 'apple-darwin' : 'unknown-linux-gnu'}`\n const bundles = platform === 'windows' ? 'nsis' : platform === 'macos' ? 'app,dmg' : 'deb,appimage'\n const identity = { buildId: randomUUID(), commit: sourceCommit(cwd) }\n for (const directory of config.desktop)\n await pnpm(['exec', 'tauri', 'build', '--target', rustTarget, '--bundles', bundles, '--config', JSON.stringify({ version: appVersion })], resolve(cwd, directory), identity)\n writeCliMessage(cliM('cli_build_native_ready', { params: { target: rustTarget } }))\n return\n }\n if (typeof metadata.name !== 'string' || !metadata.name.trim())\n throw new Error(cliM('cli_build_project_name_required'))\n const projectName = normalizeProjectName(metadata.name)\n if (!Array.isArray(config.images) || !config.images.length || config.images.some(image => !image || typeof image !== 'object') || config.images.length > 2 || new Set(config.images.map(image => image.name)).size !== config.images.length\n || config.images.some(image => !['serv', 'web'].includes(image.name) || typeof image.dockerfile !== 'string' || !image.dockerfile || 'target' in image || (image.containerPort !== undefined && (!Number.isInteger(image.containerPort) || image.containerPort < 1 || image.containerPort > 65535)))) {\n throw new Error(cliM('cli_build_images_missing'))\n }\n const selected = options.images?.split(',').map(name => name.trim())\n if (selected && (selected.some(name => !config.images!.some(image => image.name === name)) || new Set(selected).size !== selected.length))\n throw new Error(cliM('cli_build_selection_invalid'))\n const images = config.images.filter(image => !selected || selected.includes(image.name))\n const webBasePath = compileEnvironment.PUBLIC_BASE_PATH\n if (webBasePath && !config.images.some(image => image.name === 'web'))\n throw new Error(cliM('cli_build_base_requires_web'))\n for (const image of images) {\n if (!existsSync(resolve(cwd, image.dockerfile)))\n throw new Error(cliM('cli_build_dockerfile_missing', { params: { path: image.dockerfile } }))\n }\n const downloads = await resolveBuildDownloads(cwd, options)\n for (const image of images) validateDownloadDockerfile(resolve(cwd, image.dockerfile), downloads)\n const candidates = options.runtime && options.runtime !== 'auto' ? [options.runtime] : ['podman', 'docker']\n if (candidates.some(runtime => !['podman', 'docker'].includes(runtime)))\n throw new Error(cliM('cli_build_runtime_missing'))\n let runtime: string | undefined\n for (const candidate of candidates) {\n try {\n await run(candidate, ['version'], cwd, true)\n runtime = candidate\n break\n }\n catch { /* 尝试下一个可达的引擎。 */ }\n }\n if (!runtime)\n throw new Error(cliM('cli_build_runtime_missing'))\n await preflightDownloadProxy(runtime, downloads.proxy)\n if (options.sqlitePrebuildMirror) {\n const url = new URL(options.sqlitePrebuildMirror)\n if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password || url.search || url.hash)\n throw new Error(cliM('cli_build_mirror_invalid'))\n }\n const buildId = `${appVersion}-${Date.now()}-${randomBytes(3).toString('hex')}`\n const commit = sourceCommit(cwd)\n const artifact: DeploymentArtifact = { version: 4, primaryService: config.images.some(image => image.name === 'serv') ? 'serv' : 'web', appVersion, buildId, partial: images.length !== config.images.length, hasWeb: config.images.some(image => image.name === 'web'), images: [] }\n if (webBasePath) {\n artifact.version = 5\n artifact.webBasePath = webBasePath\n }\n // 部分构建仍保留工程显式声明的端口,不用构建默认值覆盖部署配置。\n for (const image of config.images) {\n if (image.containerPort !== undefined)\n artifact[image.name === 'serv' ? 'servContainerPort' : 'webContainerPort'] = image.containerPort\n }\n const parent = join(cwd, '.hai/build/docker')\n mkdirSync(parent, { recursive: true })\n const staging = mkdtempSync(join(parent, '.building-'))\n const built: string[] = []\n try {\n for (const context of new Set(images.map(image => resolve(cwd, image.context ?? '.'))))\n prepareDependencyInputs(context)\n const buildImage = async (image: (typeof images)[number]): Promise<DeploymentArtifact['images'][number]> => {\n if (!['serv', 'web'].includes(image.name))\n throw new Error(cliM('cli_build_images_missing'))\n const context = resolve(cwd, image.context ?? '.')\n const imageRef = `localhost/hai-${projectName}-${image.name}:${buildId.toLowerCase().replaceAll('+', '_')}`\n const args = ['build', '-f', resolve(cwd, image.dockerfile), '-t', imageRef]\n // 仅仓库 Vitest 托管构建使用这对内部变量;正常构建保留缓存与镜像。\n const testRun = process.env.HAI_TEST_IMAGE_RUN\n const testLedger = process.env.HAI_TEST_IMAGE_LEDGER\n if (testLedger && /^[a-f0-9-]{36}$/.test(testRun ?? '')) {\n const label = `org.h-ai.test.image-run=${testRun}`\n args.push('--label', label)\n if (runtime === 'podman')\n args.push('--layer-label', label)\n // 启动前写入明确的构建 tag;构建失败的中间层也在 teardown 按本轮 owner 回收。\n appendFileSync(testLedger, `${JSON.stringify({ runtime, imageRef })}\\n`)\n }\n args.push('--build-arg', `HAI_BUILD_ID=${buildId}`, '--build-arg', `HAI_BUILD_COMMIT=${commit}`)\n const dockerfile = readFileSync(resolve(cwd, image.dockerfile), 'utf8')\n for (const match of dockerfile.matchAll(/^ARG (HAI_(?:NODE|NGINX)_IMAGE)=(\\S+)\\s*$/gm))\n args.push('--build-arg', `${match[1]}=${resolveImageReference(match[2], downloads.imageSource)}`)\n args.push('--build-arg', `HAI_NPM_REGISTRY=${downloads.npmRegistry}`, ...buildProxyArguments(downloads.proxy, runtime, options.network))\n if (runtime === 'docker' && process.platform === 'linux' && options.network !== 'host')\n args.push('--add-host', 'host.docker.internal:host-gateway')\n if (options.network !== undefined)\n args.push('--network', options.network)\n const ignore = `${resolve(cwd, image.dockerfile)}.dockerignore`\n if (runtime === 'podman' && existsSync(ignore))\n args.push('--ignorefile', ignore)\n if (runtime === 'podman') {\n args.push('--format', 'docker', '--jobs', '1', ...(downloads.proxy.mode === 'none' ? ['--http-proxy=false'] : []))\n }\n if (options.sqlitePrebuildMirror)\n args.push('--build-arg', `SQLITE_PREBUILD_MIRROR=${options.sqlitePrebuildMirror}`)\n if (image.name === 'web' && compileEnvironment.PUBLIC_BASE_PATH)\n args.push('--build-arg', `PUBLIC_BASE_PATH=${compileEnvironment.PUBLIC_BASE_PATH}`)\n built.push(imageRef)\n await run(runtime, [...args, context], cwd)\n const file = `${image.name}-${appVersion}.tar`\n await run(runtime, ['save', ...(runtime === 'podman' ? ['--format', 'docker-archive'] : []), '-o', join(staging, file), imageRef], cwd)\n const hash = createHash('sha256')\n for await (const chunk of createReadStream(join(staging, file)))\n hash.update(chunk)\n return { name: image.name, file, imageRef, sha256: hash.digest('hex'), ...(image.containerPort ? { containerPort: image.containerPort } : {}) }\n }\n for (let offset = 0; offset < images.length; offset += concurrency) {\n // 等待同批任务全部退出后再处理失败,避免清理仍在写入的归档或镜像。\n const results = await Promise.allSettled(images.slice(offset, offset + concurrency).map(buildImage))\n for (const result of results) {\n if (result.status === 'rejected')\n throw result.reason\n artifact.images.push(result.value)\n }\n }\n // 不覆盖以前成功的构建;manifest 是一次完整构建的提交点。\n const output = join(parent, buildId)\n // 文件名固定于 manifest 同层;通过构建 ID 子目录中的清单消费,latest 仅存相对路径。\n writeFileSync(join(staging, 'manifest.json'), `${JSON.stringify(artifact, null, 2)}\\n`)\n renameSync(staging, output)\n writeFileSync(join(parent, `latest-${buildId}`), `${buildId}\\n`)\n renameSync(join(parent, `latest-${buildId}`), join(parent, 'latest'))\n writeCliMessage(cliM('cli_build_ready', { params: { path: output, runtime } }))\n }\n catch (error) {\n for (const imageRef of built) {\n try {\n await run(runtime, ['image', 'rm', imageRef], cwd, true)\n }\n catch { /* 构建失败不掩盖原始错误。 */ }\n }\n throw error\n }\n finally {\n rmSync(staging, { recursive: true, force: true })\n }\n}\n\n/** 生成稳定的依赖上下文;包配置、补丁和本地归档改变才使下载层失效。 */\nfunction prepareDependencyInputs(cwd: string): void {\n const destination = join(cwd, 'images', 'dependencies')\n mkdirSync(destination, { recursive: true })\n const tracking = join(destination, '.managed.json')\n const previous: string[] = existsSync(tracking) ? JSON.parse(readFileSync(tracking, 'utf8')) : []\n const files: string[] = []\n const walk = (directory: string): void => {\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n const source = join(directory, entry.name)\n if (source === destination || ['node_modules', '.git', '.hai', '.turbo', '.svelte-kit', '.pnpm-store', '.cache', 'dist', 'build', 'data', 'tmp', 'test-results', 'playwright-report'].includes(entry.name))\n continue\n if (entry.isDirectory()) {\n walk(source)\n continue\n }\n if (!entry.isFile() || !(entry.name === 'package.json' || entry.name === '.pnpmfile.cjs' || /\\.(?:tgz|patch)$/.test(entry.name)))\n continue\n const file = relative(cwd, source)\n mkdirSync(dirname(join(destination, file)), { recursive: true })\n const target = join(destination, file)\n if (!existsSync(target) || !readFileSync(source).equals(readFileSync(target)))\n copyFileSync(source, target)\n files.push(file)\n }\n }\n walk(cwd)\n for (const file of previous) {\n const target = resolve(destination, file)\n if (!files.includes(file) && !relative(destination, target).startsWith('..'))\n rmSync(target, { force: true })\n }\n const content = `${JSON.stringify(files)}\\n`\n if (!existsSync(tracking) || readFileSync(tracking, 'utf8') !== content)\n writeFileSync(tracking, content)\n}\n","/** 服务器本机执行的旧凭据预检/导入入口;不连接默认 SSH 目标。 */\nimport { createRequire } from 'node:module'\nimport { resolve } from 'node:path'\nimport process from 'node:process'\nimport { pathToFileURL } from 'node:url'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliMessage } from '../cli-utils.js'\n\n/**\n * 默认为只读验证;只有显式 apply 才保存目标服务器的凭据状态。\n * @example 模块内部上下文\n * ```ts\n * await deploySecretsCommand('/opt/hai/apps/shop-test', { import: '/private/shop-import.json', runtime: 'docker' })\n * ```\n */\nexport async function deploySecretsCommand(directory: string, options: { import?: string, apply?: boolean, runtime?: string, cwd?: string }): Promise<void> {\n if (!options.import || !['docker', 'podman'].includes(options.runtime ?? 'docker'))\n throw new Error(cliM('cli_deploy_secrets_options'))\n const cwd = resolve(options.cwd ?? process.cwd())\n const local = createRequire(resolve(cwd, 'package.json'))\n let module: typeof import('@h-ai/deploy')\n try {\n module = await import(pathToFileURL(local.resolve('@h-ai/deploy')).href)\n }\n catch {\n throw new Error(cliM('cli_deploy_module_missing'))\n }\n const result = await module.importDeploymentSecrets({ directory: resolve(cwd, directory), inputFile: resolve(cwd, options.import), runtime: options.runtime === 'podman' ? 'podman' : 'docker', dryRun: options.apply !== true })\n if (!result.success) {\n const context = result.error.ext\n throw new Error(`${result.error.message}\\n${JSON.stringify({ phase: context?.phase, state: context?.state })}`)\n }\n writeCliMessage(JSON.stringify(result.data, null, 2))\n}\n","/** 部署向导:逐项配置实际依赖的中间件,不以文件存在代替有效连接配置。 */\nimport type { DeploymentEnvironment, MiddlewareMode, ScanResult } from '@h-ai/deploy'\nimport { writeFileSync } from 'node:fs'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliMessage } from '../cli-utils.js'\nimport { moduleEnvironmentVariables } from './cli-config-environment.js'\nimport { projectConfigPath, readProjectConfig } from './cli-project-config.js'\n\n/**\n * 部署包的真实运行时命名空间类型,仅供向导依赖注入,不重新仿造部署 API。\n * @example 模块内部上下文\n * ```ts\n * const module: DeployModule = await import('@h-ai/deploy')\n * const backends = module.DEPLOY_MIDDLEWARE.db\n * ```\n */\ntype DeployModule = typeof import('@h-ai/deploy')\n\n/** 用户取消与缺少非交互输入都必须停止,禁止使用未回答的隐含默认值。 */\nasync function ask(question: prompts.PromptObject): Promise<unknown> {\n const answer = await prompts({ ...question, name: 'value' })\n if (answer.value === undefined)\n throw new Error(cliM('cli_deploy_cancelled'))\n return answer.value\n}\n\n/**\n * 逐项收集处理方式、后端和连接参数;返回值用于过滤云开通器和 Compose 服务。\n * 会持久化公共连接信息与私有凭据;yes 仅跳过已可确定的选择,缺少必要输入仍抛错。\n * @throws Error - 用户取消、必要非交互输入缺失、字段校验或配置持久化失败。\n * @param module - 实际加载的 @h-ai/deploy 运行时命名空间。\n * @param scan - 扫描得到的应用和中间件需求。\n * @param environment - 已合并变量与目标文件显式值的环境快照。\n * @param config - 正在补齐的部署配置对象。\n * @param yes - 非交互模式;不能绕过必需输入缺失。\n * @returns 每项中间件的最终处理模式。\n * @example 模块内部上下文\n * ```ts\n * const module: DeployModule = await import('@h-ai/deploy')\n * const result = await module.deploy.scan(process.cwd(), { environment: 'prod' })\n * if (!result.success) throw new Error(result.error.message)\n * const environment = module.loadDeploymentEnvironment({ environment: 'prod', envDir: process.cwd() })\n * if (!environment.success) throw new Error(environment.error.message)\n * const modes = await configureDeployMiddleware(module, result.data, environment.data, {}, true)\n * ```\n */\nexport async function configureDeployMiddleware(module: DeployModule, scan: ScanResult, environment: DeploymentEnvironment, config: Record<string, unknown>, yes = false): Promise<Partial<Record<string, MiddlewareMode>>> {\n const modes: Partial<Record<string, MiddlewareMode>> = {}\n const services: Record<string, unknown> = {}\n const existingServices = config.services && typeof config.services === 'object' ? config.services as Record<string, unknown> : {}\n const provider = config.provider as { type?: string } | undefined\n for (const requirement of scan.middlewares ?? []) {\n const choices = module.DEPLOY_MIDDLEWARE[requirement.service]\n const current = choices.find(item => item.backend === requirement.backend)\n if (!current)\n throw new Error(cliM('cli_deploy_cloud_unsupported', { params: { backend: requirement.backend } }))\n writeCliMessage(cliM('cli_deploy_middleware', { params: { service: requirement.service, backend: current.label, purpose: module.describeMiddlewareBackend(current), source: requirement.source } }))\n const canKeep = module.canKeepMiddleware(requirement, current, environment)\n const mode = yes\n ? canKeep ? 'keep' : 'default'\n : await ask({\n type: 'select',\n name: 'value',\n message: cliM('cli_deploy_action', { params: { service: requirement.service } }),\n choices: [\n { title: cliM('cli_deploy_default'), value: 'default' },\n { title: cliM('cli_deploy_custom'), value: 'custom' },\n ...(canKeep ? [{ title: cliM('cli_deploy_keep'), value: 'keep' }] : []),\n ],\n }) as MiddlewareMode\n modes[requirement.envPrefix] = mode\n // 同类服务可有多个 Provider;保留每项选择,聚合值仅用于选择云开通器。\n const previous = modes[requirement.service]\n modes[requirement.service] = previous === 'default' || mode === 'default' ? 'default' : previous === 'custom' || mode === 'custom' ? 'custom' : 'keep'\n if (mode === 'keep') {\n if (!canKeep)\n throw new Error(cliM('cli_deploy_missing_keep', { params: { service: requirement.service } }))\n continue\n }\n const backendName = yes ? current.backend : String(await ask({ type: 'select', name: 'value', message: cliM('cli_deploy_backend', { params: { service: requirement.service } }), initial: choices.indexOf(current), choices: choices.map(item => ({ title: `${item.label} — ${module.describeMiddlewareBackend(item)}`, value: item.backend })) }))\n const backend = choices.find(item => item.backend === backendName)\n if (!backend)\n throw new Error(cliM('cli_deploy_invalid_value'))\n requirement.backend = backendName\n const updates: Record<string, unknown> = {}\n let configuration: Record<string, unknown> | undefined\n for (const option of mode === 'default' && provider?.type === 'docker-ssh' ? backend.containerOptions ?? [] : []) {\n const container = config.container && typeof config.container === 'object' ? config.container as Record<string, unknown> : {}\n const currentValue = String(container[option.field] ?? option.defaultValue)\n const selected = yes ? currentValue : String(await ask({ type: 'select', name: 'value', message: module.describeMiddlewareBackend(option), initial: Math.max(0, option.choices.findIndex(item => item.value === currentValue)), choices: option.choices.map(item => ({ title: item.label, value: item.value })) }))\n if (!option.choices.some(item => item.value === selected))\n throw new Error(cliM('cli_deploy_invalid_value'))\n config.container = { ...container, [option.field]: selected }\n updates[option.variable] = selected\n const deploymentFile = projectConfigPath(scan.appDir ?? environment.envDir)\n const project: { deploy?: { container?: Record<string, unknown> | null } } = readProjectConfig(deploymentFile)\n project.deploy ??= {}\n if (project.deploy.container != null && (typeof project.deploy.container !== 'object' || Array.isArray(project.deploy.container)))\n throw new Error(cliM('cli_deploy_config_node', { params: { path: deploymentFile, field: 'deploy.container' } }))\n project.deploy.container ??= {}\n if (!(option.field in project.deploy.container)) {\n project.deploy.container[option.field] = `\\${${option.variable}:${option.defaultValue}}`\n writeFileSync(deploymentFile, `${JSON.stringify(project, null, 2)}\\n`)\n }\n }\n if (mode === 'default' && provider?.type === 'vercel') {\n if (!backend.provisioner)\n throw new Error(cliM('cli_deploy_cloud_unsupported', { params: { backend: backend.label } }))\n const prior = existingServices[requirement.service]\n const priorConfig = prior && typeof prior === 'object' ? prior as Record<string, unknown> : {}\n const cloud: Record<string, string> = { provisioner: backend.provisioner }\n for (const name of backend.cloudFields ?? []) {\n const key = `HAI_DEPLOY_SERVICES_${requirement.service.toUpperCase()}_${name.toUpperCase()}`\n const initial = String(priorConfig[name] ?? environment.values[key] ?? '')\n const label = `${backend.label} — ${cliM(`cli_deploy_cloud_input_${name}` as Parameters<typeof cliM>[0])}`\n const value = yes ? initial : String(await ask({ type: /key|token|secret/i.test(name) ? 'password' : 'text', name: 'value', message: label, initial, validate: input => Boolean(input) || cliM('cli_deploy_required') }))\n if (!value)\n throw new Error(`${label}: ${cliM('cli_deploy_required')}`)\n cloud[name] = value\n updates[key] = value\n }\n services[requirement.service] = cloud\n }\n else {\n if (mode === 'default' && backend.containerSupported === false)\n throw new Error(cliM('cli_deploy_cloud_unsupported', { params: { backend: backend.label } }))\n // 默认与自定义都从同后端的有效配置继续,不能用表单字段重建并丢失未展示选项。\n const connection: Record<string, unknown> = backendName === current.backend ? { ...requirement.config } : requirement.config.name === undefined ? {} : { name: requirement.config.name }\n for (const field of backend.fields) {\n const previous = backendName === current.backend ? requirement.config[field.name] : undefined\n const initial = previous === undefined ? field.defaultValue ?? '' : typeof previous === 'object' ? JSON.stringify(previous) : String(previous)\n const variable = `${requirement.envPrefix}_${field.name.toUpperCase()}`\n const info = moduleEnvironmentVariables(requirement.configName).find(item => item.name === variable)\n const value = mode === 'custom' && !yes ? String(await ask({ type: field.secret ? 'password' : 'text', name: 'value', message: cliM('cli_deploy_field', { params: { description: info?.description ?? field.name, constraint: info?.constraint ?? field.kind ?? 'string' } }), initial, validate: input => module.validateMiddlewareField({ value: String(input), field, backend: backendName }) || cliM('cli_deploy_invalid_value') })) : initial\n const parsed = module.parseMiddlewareField({ value, field, backend: backendName, managed: mode === 'default' })\n if (!parsed.success)\n throw new Error(parsed.error.message)\n if (parsed.data === undefined)\n delete connection[field.name]\n else connection[field.name] = parsed.data\n }\n configuration = connection\n }\n const saved = module.saveMiddlewareEnvironment(environment, { appDir: scan.appDir ?? '.', requirement, backend: backendName, configuration, updates })\n if (!saved.success)\n throw new Error(saved.error.message)\n writeCliMessage(cliM('cli_deploy_saved', { params: { service: requirement.service } }))\n }\n // 仅默认选项对应的云服务参与初始化/开通;custom/keep 不认证、不创建。\n config.services = Object.keys(services).length ? services : undefined\n return modes\n}\n","/**\n * @h-ai/cli — 部署命令\n *\n * 使用: hai deploy [appDir]\n * @module cli-deploy\n */\n\nimport type { DeploymentEnvironment } from '@h-ai/deploy'\nimport type { GlobalOptions } from '../cli-types.js'\nimport type { BuildDownloadOptions } from './cli-build-downloads.js'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { dirname, resolve } from 'node:path'\nimport process from 'node:process'\nimport { pathToFileURL } from 'node:url'\nimport { parseEnv } from 'node:util'\nimport { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliError, writeCliMessage } from '../cli-utils.js'\nimport { preflightDownloadProxy, resolveBuildDownloads } from './cli-build-downloads.js'\nimport { buildCommand } from './cli-build.js'\nimport { configureDeployMiddleware } from './cli-deploy-middleware.js'\nimport { projectConfigPath, readProjectConfig } from './cli-project-config.js'\n\n/**\n * deploy 命令选项\n * 构建与部署分离;bundleOnly 只打包,不表示服务已上线。SSH 中断后的远端状态需按部署 ID 与结果文件核对。\n * @example 模块内部上下文\n * ```ts\n * const options: DeployCommandOptions = { cwd: '/workspace/shop', appDir: 'packages/shop-serv', env: 'prod', yes: true, bundleOnly: true, output: '.hai/shop.tar' }\n * ```\n */\nexport interface DeployCommandOptions extends GlobalOptions, BuildDownloadOptions {\n /** 只读检查,不初始化 Provider、不写配置、不构建、不连接目标。 */\n plan?: boolean\n /** 配合 plan,只读检查目标 current 与成功发布目录。 */\n inspectRemote?: boolean\n /** 部署环境;省略时必须交互输入。 */\n env?: string\n /** 环境文件目录,默认扫描应用/workspace 根。 */\n envDir?: string\n /** 非交互模式:保留完整的目标配置,其余采用当前后端默认配置。 */\n yes?: boolean\n /** 应用目录 */\n appDir?: string\n /** 已配置完备,跳过全部中间件处理并直接部署。 */\n skipMiddleware?: boolean\n /** 已构建镜像目录。 */\n artifactDir?: string\n /** 本次更新的服务,逗号分隔。 */\n services?: string\n /** 先构建镜像。 */\n build?: boolean\n /** 同时构建的应用镜像数,默认 2。 */\n concurrency?: number\n /** 本地容器引擎。 */\n runtime?: 'auto' | 'podman' | 'docker'\n /** 构建阶段的网络与原生依赖设置。 */\n network?: string\n sqlitePrebuildMirror?: string\n httpProxy?: boolean\n /** 只生成 tar,手工搬运。 */\n bundleOnly?: boolean\n /** 部署 tar 输出路径。 */\n output?: string\n}\n\n/** 配置输入中的可选对象;不让未完成的配置绕过最终 Provider Schema。 */\nfunction configObject(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {}\n}\n\n/**\n * 补齐部署目标,完整配置直接复用;SSH 参数和平台 Token 只写 `.env.<环境>.local`。\n * @example 首次输入主机和密钥或密码后,下次执行 `hai deploy --env prod` 自动复用。\n */\nasync function configureDeployTarget(module: typeof import('@h-ai/deploy'), config: Record<string, unknown>, environment: DeploymentEnvironment, nonInteractive?: boolean, bundleOnly?: boolean): Promise<void> {\n const original = configObject(config.provider)\n let editBundleTarget = false\n if (bundleOnly) {\n const existing = original\n if (existing.type && existing.type !== 'docker-ssh')\n throw new Error(cliM('cli_deploy_bundle_provider'))\n config.provider = { type: 'docker-ssh', remote: { runtime: 'auto' }, expose: { hostPort: 3000 }, ...existing }\n const candidate = module.ProviderConfigSchema.safeParse(config.provider)\n // 仅打包不依赖 SSH;未填写完整的连接由交付目录中的目标文件补齐。\n if (!candidate.success && candidate.error.issues.some(issue => issue.path[0] === 'ssh')) {\n const provider = configObject(config.provider)\n delete provider.ssh\n }\n if (!nonInteractive) {\n const answer = await prompts({ type: 'confirm', name: 'value', message: cliM('cli_deploy_bundle_configure_ssh'), initial: false })\n if (answer.value === undefined)\n throw new Error(cliM('cli_deploy_cancelled'))\n editBundleTarget = answer.value === true\n }\n }\n const current = module.ProviderConfigSchema.safeParse(config.provider)\n if (!editBundleTarget && current.success && (bundleOnly || current.data.type !== 'docker-ssh' || current.data.ssh)) {\n config.provider = current.data\n writeCliMessage(bundleOnly\n ? cliM('cli_deploy_bundle_target')\n : cliM('cli_deploy_target_reused', { params: { target: current.data.type === 'docker-ssh' && current.data.ssh ? `${current.data.ssh.username}@${current.data.ssh.host}:${current.data.ssh.port}` : 'Vercel' } }))\n return\n }\n if (nonInteractive || (bundleOnly && !editBundleTarget))\n throw new Error(cliM('cli_deploy_target_missing', { params: { fields: current.success ? 'provider.ssh' : current.error.issues.map(issue => `provider.${issue.path.join('.')}`).join(', ') } }))\n\n const platform = bundleOnly\n ? { value: 'docker-ssh' }\n : await prompts({\n type: 'select',\n name: 'value',\n message: cliM('cli_deploy_target_platform'),\n choices: [{ title: cliM('cli_deploy_target_ssh'), value: 'docker-ssh' }, { title: 'Vercel', value: 'vercel' }],\n initial: original.type === 'vercel' ? 1 : 0,\n })\n if (!platform.value)\n throw new Error(cliM('cli_deploy_cancelled'))\n\n const input = async (name: string, initial: unknown, options: { optional?: boolean, secret?: boolean, keepSecret?: boolean, port?: boolean, trim?: boolean } = {}): Promise<string> => {\n const answer = await prompts({\n type: options.secret ? 'password' : 'text',\n name: 'value',\n message: options.keepSecret ? cliM('cli_deploy_inputPASSWORDKEEP') : cliM(`cli_deploy_input${name.split('_').at(-1)}` as Parameters<typeof cliM>[0]),\n initial: options.secret ? undefined : initial === undefined ? '' : String(initial),\n validate: (value: string) => options.port\n ? (/^\\d+$/.test(value) && Number(value) >= 1 && Number(value) <= 65535) || cliM('cli_deploy_port_invalid')\n : options.optional || !!(options.trim === false ? value : value.trim()) || cliM('cli_deploy_invalid_value'),\n })\n if (answer.value === undefined)\n throw new Error(cliM('cli_deploy_cancelled'))\n return options.trim === false ? String(answer.value) : String(answer.value).trim()\n }\n let provider: Record<string, unknown>\n if (platform.value === 'docker-ssh') {\n writeCliMessage(cliM('cli_deploy_target_ssh_hint'))\n const ssh = configObject(original.ssh)\n const remote = configObject(original.remote)\n const expose = configObject(original.expose)\n const host = await input('HAI_DEPLOY_PROVIDER_SSH_HOST', ssh.host)\n const port = Number(await input('HAI_DEPLOY_PROVIDER_SSH_PORT', ssh.port ?? 22, { port: true }))\n const username = await input('HAI_DEPLOY_PROVIDER_SSH_USERNAME', ssh.username)\n const previousPasswordMode = ssh.auth === 'password' || (ssh.auth !== 'key' && typeof ssh.password === 'string' && ssh.password.length > 0)\n const authentication = await prompts({\n type: 'select',\n name: 'value',\n message: cliM('cli_deploy_target_auth'),\n choices: [{ title: cliM('cli_deploy_target_auth_key'), value: 'key' }, { title: cliM('cli_deploy_target_auth_password'), value: 'password' }],\n initial: previousPasswordMode ? 1 : 0,\n })\n if (!['key', 'password'].includes(authentication.value))\n throw new Error(cliM('cli_deploy_cancelled'))\n const auth = authentication.value as 'key' | 'password'\n const previousPassword = previousPasswordMode && typeof ssh.password === 'string' && ssh.password.length > 0 ? ssh.password : undefined\n const password = auth === 'password'\n ? previousPassword && !editBundleTarget ? previousPassword : await input('HAI_DEPLOY_PROVIDER_SSH_PASSWORD', undefined, { secret: true, trim: false, optional: !!previousPassword, keepSecret: !!previousPassword }) || previousPassword\n : undefined\n const identityFile = auth === 'key' ? await input('HAI_DEPLOY_PROVIDER_SSH_IDENTITYFILE', ssh.identityFile, { optional: true }) : undefined\n const knownHostsFile = await input('HAI_DEPLOY_PROVIDER_SSH_KNOWNHOSTSFILE', ssh.knownHostsFile, { optional: true })\n const baseDir = await input('HAI_DEPLOY_PROVIDER_REMOTE_BASEDIR', remote.baseDir || '/opt/hai/apps')\n const runtime = await prompts({ type: 'select', name: 'value', message: cliM('cli_deploy_target_runtime'), choices: ['auto', 'podman', 'docker'].map(value => ({ title: value, value })), initial: ['auto', 'podman', 'docker'].indexOf(String(remote.runtime ?? 'auto')) })\n if (!runtime.value)\n throw new Error(cliM('cli_deploy_cancelled'))\n const hostPort = Number(await input('HAI_DEPLOY_PROVIDER_EXPOSE_HOSTPORT', expose.hostPort || 3000, { port: true }))\n const containerPort = Number(await input('HAI_DEPLOY_PROVIDER_EXPOSE_CONTAINERPORT', expose.containerPort || 3000, { port: true }))\n provider = {\n type: 'docker-ssh',\n ssh: { ...ssh, host, port, username, auth, password, identityFile: identityFile || undefined, knownHostsFile: knownHostsFile || undefined },\n remote: { ...remote, baseDir, runtime: runtime.value },\n expose: { ...expose, type: 'port', hostPort, containerPort },\n }\n }\n else {\n provider = { type: 'vercel', token: await input('HAI_DEPLOY_PROVIDER_TOKEN', undefined, { secret: true }) }\n }\n const validated = module.ProviderConfigSchema.safeParse(provider)\n if (!validated.success)\n throw new Error(cliM('cli_deploy_invalid_value'))\n const saved = module.saveDeploymentEnvironment(environment, { HAI_DEPLOY_PROVIDER: validated.data }, { private: true })\n if (!saved.success)\n throw new Error(saved.error.message)\n config.provider = validated.data\n writeCliMessage(cliM('cli_deploy_target_saved'))\n}\n\n/** 所有模板共用的可选 HTTPS 环节;配置保存到选中环境的私有层。 */\nasync function configureDeployHttps(module: typeof import('@h-ai/deploy'), config: Record<string, unknown>, environment: DeploymentEnvironment, nonInteractive?: boolean, partial?: boolean): Promise<void> {\n const provider = configObject(config.provider)\n if (provider.type !== 'docker-ssh' || nonInteractive || partial)\n return\n const expose = configObject(provider.expose)\n const previous = configObject(expose.https)\n const selection = await prompts({\n type: 'select',\n name: 'httpsMode',\n message: cliM('cli_deploy_https_mode'),\n choices: [\n { title: cliM(previous.type ? 'cli_deploy_https_keep' : 'cli_deploy_https_off'), value: 'keep' },\n { title: cliM('cli_deploy_https_files'), value: 'files' },\n { title: 'Let\\'s Encrypt (Certbot)', value: 'letsencrypt' },\n ...(previous.type ? [{ title: cliM('cli_deploy_https_off'), value: 'off' }] : []),\n ],\n })\n if (selection.httpsMode === undefined)\n throw new Error(cliM('cli_deploy_cancelled'))\n if (selection.httpsMode === 'keep')\n return\n let https: Record<string, unknown> | undefined\n if (selection.httpsMode !== 'off') {\n const ask = async (name: string, initial?: unknown): Promise<string> => {\n const answer = await prompts({ type: 'text', name, message: cliM((`cli_deploy_${name}`) as Parameters<typeof cliM>[0]), initial: initial === undefined ? '' : String(initial), validate: (value: string) => !!value.trim() || cliM('cli_deploy_invalid_value') })\n if (answer[name] === undefined)\n throw new Error(cliM('cli_deploy_cancelled'))\n return String(answer[name]).trim()\n }\n https = { type: selection.httpsMode, domain: await ask('httpsDomain', previous.domain), port: Number(await ask('httpsPort', previous.port ?? 443)), redirectHttp: true }\n if (https.type === 'files') {\n https.certificateFile = await ask('httpsCertificate', previous.certificateFile)\n https.privateKeyFile = await ask('httpsPrivateKey', previous.privateKeyFile)\n }\n else {\n writeCliMessage(cliM('cli_deploy_https_requirements'))\n https.email = await ask('httpsEmail', previous.email)\n const consent = await prompts({ type: 'confirm', name: 'acceptTerms', message: cliM('cli_deploy_https_terms'), initial: previous.acceptTerms === true })\n if (consent.acceptTerms !== true)\n throw new Error(cliM('cli_deploy_cancelled'))\n https.acceptTerms = true\n }\n }\n const parsed = module.ProviderConfigSchema.safeParse({ ...provider, expose: { ...expose, ...(https?.type === 'letsencrypt' ? { hostPort: 80 } : {}), https } })\n if (!parsed.success)\n throw new Error(cliM('cli_deploy_invalid_value'))\n const saved = module.saveDeploymentEnvironment(environment, { HAI_DEPLOY_PROVIDER: parsed.data }, { private: true })\n if (!saved.success)\n throw new Error(saved.error.message)\n config.provider = parsed.data\n writeCliMessage(cliM('cli_deploy_https_saved'))\n}\n\n/**\n * 执行部署命令\n *\n * @param options - 部署选项\n * 显式加载目标环境、配置中间件并检查 HaiResult;退出时恢复原进程环境并关闭部署模块。\n * @throws Error - 扫描、配置、构建、打包或部署失败;SSH 本地终止不等于远端部署已停止。\n * @returns 部署或仅打包流程结束;具体模式见 bundleOnly。\n * @example 模块内部上下文\n * ```ts\n * // 前提:当前工程已构建镜像产物,且有根 hai.json.deploy 与生产公共/私有环境。\n * await deployCommand({ cwd: process.cwd(), env: 'prod', yes: true, bundleOnly: true, output: '.hai/shop.tar' })\n * // 等价:hai deploy --env prod --yes --bundle-only --output .hai/shop.tar。\n * ```\n */\nexport async function deployCommand(options: DeployCommandOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? process.cwd()\n let appDir = resolve(cwd, options.appDir ?? '.')\n let closeDeploy: (() => Promise<void>) | null = null\n let restoreProjectLogger: (() => void) | undefined\n const originalEnv = { ...process.env }\n const previousLogLevel = core.logger.getLevel()\n core.logger.setLevel('fatal')\n\n try {\n if (options.inspectRemote && !options.plan)\n throw new Error(cliM('cli_deploy_plan_options'))\n if (options.runtime && !['auto', 'podman', 'docker'].includes(options.runtime))\n throw new Error(cliM('cli_build_runtime_missing'))\n if (options.artifactDir && options.build)\n throw new Error(cliM('cli_deploy_build_artifact_conflict'))\n if (!options.build && (options.concurrency !== undefined || options.network !== undefined || options.sqlitePrebuildMirror !== undefined || options.npmSource !== undefined || options.npmRegistry !== undefined))\n throw new Error(cliM('cli_deploy_build_options_required'))\n let selectedServices = options.services?.split(',').map(name => name.trim())\n if (selectedServices && (!selectedServices.length || selectedServices.some(name => !/^[a-z][a-z0-9-]*$/.test(name)) || new Set(selectedServices).size !== selectedServices.length))\n throw new Error(cliM('cli_build_selection_invalid'))\n // 环境选择是第一步;取消、无 TTY 或缺文件均不能继续认证/开通资源。\n let environmentName = options.env\n if (!environmentName) {\n if (!process.stdin.isTTY)\n throw new Error(cliM('cli_deploy_environment_hint'))\n const answer = await prompts({ type: 'text', name: 'environment', message: cliM('cli_deploy_environment'), initial: 'prod' })\n environmentName = answer.environment\n if (!environmentName)\n throw new Error(cliM('cli_deploy_cancelled'))\n }\n if (!options.plan && !options.yes && !process.stdin.isTTY)\n throw new Error(cliM('cli_deploy_environment_hint'))\n // 动态导入 @h-ai/deploy(允许 CLI 在未安装 deploy 时仍可使用其他命令)\n let deployModule: typeof import('@h-ai/deploy')\n try {\n // 全局安装的 CLI 先使用目标工程的 deploy 版本,不依赖 CLI 的开发依赖。\n const localRequire = createRequire(resolve(appDir, 'package.json'))\n try {\n const { core: projectCore } = await import(pathToFileURL(localRequire.resolve('@h-ai/core')).href) as typeof import('@h-ai/core')\n if (projectCore !== core) {\n const level = projectCore.logger.getLevel()\n projectCore.logger.setLevel('fatal')\n restoreProjectLogger = () => projectCore.logger.setLevel(level)\n }\n }\n catch { /* 未安装项目依赖时,由 deploy 导入错误统一提示。 */ }\n let localModule: string | undefined\n try {\n localModule = localRequire.resolve('@h-ai/deploy')\n }\n catch { /* 源码仓库或直接模块测试可使用 CLI 本身可解析的安装。 */ }\n deployModule = localModule ? await import(pathToFileURL(localModule).href) : await import('@h-ai/deploy')\n }\n catch {\n writeCliError(chalk.red(cliM('cli_deploy_module_missing')))\n writeCliMessage(chalk.cyan(' pnpm add -D @h-ai/deploy'))\n throw new Error(cliM('cli_deploy_module_missing'))\n }\n\n const { deploy } = deployModule\n\n const scanResult = await deploy.scan(appDir, { environment: environmentName, envDir: options.envDir ? resolve(cwd, options.envDir) : undefined })\n if (!scanResult.success)\n throw new Error(cliM('cli_deploy_scan_failed', { params: { message: scanResult.error.message } }))\n const scan = scanResult.data\n appDir = scan.appDir ?? appDir\n const buildFile = projectConfigPath(appDir)\n const buildRoot = dirname(buildFile)\n const project = existsSync(buildFile) ? readProjectConfig(buildFile) : {}\n const buildConfig = configObject(project.build)\n const imageNames = Array.isArray(buildConfig.images)\n ? buildConfig.images.flatMap((image) => {\n const name = configObject(image).name\n return typeof name === 'string' ? [name] : []\n })\n : ['serv', 'web']\n const names = [...imageNames, ...(scan.middlewares ?? []).filter(item => !['sqlite', 'local', 'memory', 'disabled', 'console', 'lancedb'].includes(item.backend)).map(item => item.service)]\n const available = [...new Set(names)]\n if (selectedServices?.some(name => !available.includes(name)))\n throw new Error(cliM('cli_deploy_services_invalid', { params: { services: available.join(', ') } }))\n const environment = deployModule.loadDeploymentEnvironment({ environment: environmentName, envDir: scan.envDir ?? appDir })\n if (!environment.success)\n throw new Error(environment.error.message)\n if (options.plan) {\n if (options.build || options.bundleOnly || options.output || options.imageSource !== undefined || options.imageMirrors !== undefined || options.npmSource !== undefined || options.npmRegistry !== undefined || options.proxyMode !== undefined || options.proxyUrl !== undefined || options.proxyBypass !== undefined || options.httpProxy === false)\n throw new Error(cliM('cli_deploy_plan_options'))\n const loaded = deployModule.loadDeploymentConfig('deploy', buildFile, { ...process.env, ...environment.data.values })\n if (!loaded.success)\n throw new Error(loaded.error.message)\n const validated = deployModule.DeployConfigSchema.safeParse(loaded.data)\n if (!validated.success)\n throw new Error(cliM('cli_deploy_config_invalid', { params: { path: buildFile, fields: validated.error.issues.map(issue => issue.path.join('.')).join(', ') } }))\n const plan = await deployModule.createDeploymentPlan(appDir, validated.data, { inspectRemote: options.inspectRemote, environment: environmentName, envDir: environment.data.envDir, selectedServices, skipMiddleware: options.skipMiddleware, artifactDir: options.artifactDir ? resolve(cwd, options.artifactDir) : undefined, runtime: options.runtime })\n if (!plan.success)\n throw new Error(plan.error.message)\n writeCliMessage(JSON.stringify(plan.data, null, 2))\n return\n }\n Object.assign(process.env, environment.data.values)\n\n // 1. 加载凭证\n spinner.start(cliM('cli_deploy_load_credentials'))\n const credResult = deploy.credentials.load()\n if (!credResult.success) {\n throw new Error(cliM('cli_deploy_credentials_failed', { params: { message: credResult.error.message } }))\n }\n spinner.succeed(cliM('cli_deploy_credentials_loaded', { params: { count: credResult.data.length } }))\n\n // 2. 读取部署配置\n spinner.start(cliM('cli_deploy_load_config'))\n const configPath = buildFile\n if (!existsSync(configPath)) {\n spinner.fail(chalk.red(cliM('cli_deploy_config_missing', { params: { path: configPath } })))\n writeCliMessage(chalk.cyan(cliM('cli_deploy_config_hint')))\n throw new Error(cliM('cli_deploy_config_missing', { params: { path: configPath } }))\n }\n\n const loadedConfig = deployModule.loadDeploymentConfig('deploy', configPath, process.env)\n if (!loadedConfig.success)\n throw new Error(loadedConfig.error.message)\n const deployConfig = loadedConfig.data\n spinner.succeed(cliM('cli_deploy_config_loaded'))\n if (!options.build && !selectedServices && configObject(deployConfig.provider).type === 'docker-ssh') {\n let artifactDirectory = options.artifactDir ? resolve(cwd, options.artifactDir) : resolve(buildRoot, '.hai/build/docker')\n if (existsSync(resolve(artifactDirectory, 'latest'))) {\n const pointer = readFileSync(resolve(artifactDirectory, 'latest'), 'utf8').trim()\n if (!/^[a-z0-9][\\w.+-]*$/i.test(pointer))\n throw new Error(cliM('cli_deploy_artifact_invalid'))\n artifactDirectory = resolve(artifactDirectory, pointer)\n }\n if (existsSync(resolve(artifactDirectory, 'manifest.json'))) {\n try {\n const artifact = await deployModule.readDeploymentArtifact(artifactDirectory)\n if (artifact.partial)\n selectedServices = artifact.images.map(image => image.name)\n }\n catch {\n throw new Error(cliM('cli_deploy_artifact_invalid'))\n }\n }\n }\n if (options.bundleOnly) {\n const provider = configObject(deployConfig.provider)\n if (provider.type && provider.type !== 'docker-ssh')\n throw new Error(cliM('cli_deploy_bundle_provider'))\n deployConfig.provider = { type: 'docker-ssh', remote: { runtime: 'auto' }, expose: { hostPort: 3000 }, ...provider }\n }\n else {\n await configureDeployTarget(deployModule, deployConfig, environment.data, options.yes)\n }\n if (configObject(deployConfig.provider).type !== 'docker-ssh' && (selectedServices || options.build))\n throw new Error(cliM('cli_deploy_bundle_provider'))\n\n if (!options.yes && !selectedServices && configObject(deployConfig.provider).type === 'docker-ssh') {\n if (existsSync(buildFile)) {\n if (available.length > 1) {\n const choice = await prompts({ type: 'multiselect', name: 'value', message: cliM('cli_deploy_choose_services'), choices: available.map(name => ({ title: name, value: name, selected: true })), min: 1 })\n if (!Array.isArray(choice.value) || choice.value.length === 0)\n throw new Error(cliM('cli_deploy_cancelled'))\n if (choice.value.length !== available.length)\n selectedServices = choice.value\n }\n }\n }\n\n spinner.succeed(cliM('cli_deploy_scanned', { params: { name: scan.appName, sveltekit: String(scan.isSvelteKit), services: scan.requiredServices.join(', ') || cliM('cli_deploy_none') } }))\n\n const downloads = configObject(deployConfig.provider).type === 'docker-ssh' ? await resolveBuildDownloads(buildRoot, options) : undefined\n let builtImages = false\n if (options.build) {\n if (!existsSync(buildFile))\n throw new Error(cliM('cli_build_images_missing'))\n const imageNames = selectedServices?.filter(name => ['serv', 'web'].includes(name))\n if (!selectedServices || imageNames?.length) {\n writeCliMessage(cliM('cli_deploy_build_started'))\n builtImages = true\n await buildCommand({ ...options, cwd: buildRoot, target: 'image', images: imageNames?.join(','), yes: true, imageSource: downloads?.imageSource.type, imageMirrors: downloads?.imageSource.registries ? Object.entries(downloads.imageSource.registries).map(([key, value]) => `${key}=${value}`).join(',') : undefined, npmSource: downloads?.npmSource.type, npmRegistry: downloads?.npmSource.registry, proxyMode: downloads?.proxy.mode, proxyUrl: downloads?.proxy.url, proxyBypass: downloads?.proxy.bypass })\n }\n }\n if (selectedServices)\n writeCliMessage(cliM('cli_deploy_services', { params: { services: selectedServices.join(', ') } }))\n let skipMiddleware = options.skipMiddleware || selectedServices?.every(name => ['serv', 'web'].includes(name))\n if (!skipMiddleware && !options.yes && scan.requiredServices.length) {\n const action = await prompts({\n type: 'select',\n name: 'value',\n message: cliM('cli_deploy_middleware_plan'),\n choices: [{ title: cliM('cli_deploy_middleware_configure'), value: 'configure' }, { title: cliM('cli_deploy_middleware_skip'), value: 'skip' }],\n })\n if (!action.value)\n throw new Error(cliM('cli_deploy_cancelled'))\n skipMiddleware = action.value === 'skip'\n }\n if (skipMiddleware)\n writeCliMessage(cliM('cli_deploy_middleware_skipped'))\n const serviceModes = skipMiddleware\n ? Object.fromEntries(scan.requiredServices.map(service => [service, 'keep' as const]))\n : await configureDeployMiddleware(deployModule, { ...scan, middlewares: scan.middlewares?.filter(item => !selectedServices || selectedServices.includes(item.service)) }, environment.data, deployConfig, options.yes)\n if (skipMiddleware)\n deployConfig.services = undefined\n // 离线模式在构建和中间件配置之后最后询问;生成 tar 和 target 时使用同一份目标。\n if (options.bundleOnly)\n await configureDeployTarget(deployModule, deployConfig, environment.data, options.yes, true)\n await configureDeployHttps(deployModule, deployConfig, environment.data, options.yes, selectedServices !== undefined)\n // 刚写入文件的值不能被本次命令之前注入的快照覆盖;保留用户原有进程变量优先级。\n for (const key of Object.keys(process.env)) {\n if (originalEnv[key] === undefined)\n delete process.env[key]\n }\n Object.assign(process.env, originalEnv)\n const refreshed = deployModule.loadDeploymentEnvironment({ environment: environment.data.environment, envDir: environment.data.envDir })\n if (!refreshed.success)\n throw new Error(refreshed.error.message)\n Object.assign(process.env, refreshed.data.values)\n\n // 4. 初始化 deploy 模块\n spinner.start(cliM('cli_deploy_initializing'))\n const validatedConfig = deployModule.DeployConfigSchema.safeParse(deployConfig)\n if (!validatedConfig.success)\n throw new Error(cliM('cli_deploy_config_invalid', { params: { path: configPath, fields: validatedConfig.error.issues.map(issue => issue.path.join('.')).join(', ') } }))\n const initResult = await deploy.init(validatedConfig.data)\n if (!initResult.success) {\n throw new Error(cliM('cli_deploy_init_failed', { params: { message: initResult.error.message } }))\n }\n closeDeploy = () => deploy.close()\n spinner.succeed(cliM('cli_deploy_initialized'))\n\n // 5. 执行部署\n spinner.start(cliM('cli_deploy_deploying'))\n if (downloads && !builtImages && (!selectedServices || selectedServices.some(name => !['serv', 'web'].includes(name))))\n await preflightDownloadProxy(options.runtime ?? 'auto', downloads.proxy)\n const deployResult = await deploy.deployApp(appDir, {\n imageSource: downloads?.imageSource,\n proxy: downloads?.proxy,\n selectedServices,\n runtime: options.runtime,\n onProgress: stage => writeCliMessage(cliM(`cli_deploy_stage_${stage}`)),\n skipMiddleware,\n artifactDir: options.artifactDir ? resolve(cwd, options.artifactDir) : undefined,\n bundleOnly: options.bundleOnly,\n output: options.output ? resolve(cwd, options.output) : undefined,\n environment: environment.data.environment,\n envDir: environment.data.envDir,\n serviceModes,\n })\n\n if (!deployResult.success) {\n const execution = deployModule.getDeployCommandState(deployResult.error)\n if (execution) {\n const localKey = execution.localTermination === 'not-started' ? 'cli_deploy_local_not_started' : execution.localTermination === 'confirmed' ? 'cli_deploy_local_confirmed' : 'cli_deploy_local_unknown'\n writeCliMessage(cliM(localKey))\n if (execution.remoteExecution)\n writeCliMessage(cliM(execution.remoteExecution === 'finished' ? 'cli_deploy_remote_finished' : 'cli_deploy_remote_unknown'))\n if (execution.remoteRecovery) {\n const recoveryKeys = {\n 'not-needed': 'cli_deploy_recovery_not_needed',\n 'passed': 'cli_deploy_recovery_passed',\n 'failed': 'cli_deploy_recovery_failed',\n 'stopped': 'cli_deploy_recovery_stopped',\n } as const\n writeCliMessage(cliM(recoveryKeys[execution.remoteRecovery]))\n }\n if (execution.deploymentId && execution.resultFile)\n writeCliMessage(cliM('cli_deploy_result_check', { params: { id: execution.deploymentId, path: execution.resultFile } }))\n }\n if (deployResult.error.ext?.recovery) {\n writeCliMessage(deployResult.error.suggestion ?? cliM('cli_deploy_command_failed'))\n }\n throw new Error(cliM('cli_deploy_failed', { params: { message: deployResult.error.message } }))\n }\n\n spinner.succeed(chalk.green(cliM(deployResult.data.status === 'packaged' ? 'cli_deploy_bundle_ready' : 'cli_deploy_success')))\n writeCliMessage('')\n if (deployResult.data.bundlePath && (deployResult.data.status !== 'packaged' || !deployResult.data.instructions))\n writeCliMessage(cliM('cli_deploy_bundle_path', { params: { path: deployResult.data.bundlePath } }))\n if (deployResult.data.status === 'packaged')\n writeCliMessage(deployResult.data.instructions ?? '')\n else\n writeCliMessage(chalk.cyan(cliM('cli_deploy_url', { params: { url: deployResult.data.url } })))\n writeCliMessage(chalk.gray(cliM('cli_deploy_id', { params: { id: deployResult.data.deploymentId } })))\n if (refreshed.data.values.HAI_ADMIN_DEFAULT_PASSWORD && (!selectedServices || selectedServices.includes(imageNames.includes('serv') ? 'serv' : 'web'))) {\n const passwordKey = 'HAI_ADMIN_DEFAULT_PASSWORD'\n const source = originalEnv[passwordKey] !== undefined\n ? cliM('cli_deploy_processEnvironment')\n : [`.env.${refreshed.data.environment}.local`, '.env.local', `.env.${refreshed.data.environment}`, '.env']\n .map(file => resolve(refreshed.data.envDir, file))\n .find(file => existsSync(file) && parseEnv(readFileSync(file, 'utf8'))[passwordKey] !== undefined)\n if (source)\n writeCliMessage(chalk.cyan(cliM('cli_deploy_adminPasswordSource', { params: { source } })))\n }\n writeCliMessage('')\n }\n catch (error) {\n spinner.fail(chalk.red(cliM('cli_deploy_command_failed')))\n writeCliError(error instanceof Error ? error.message : String(error))\n throw error\n }\n finally {\n if (closeDeploy) {\n try {\n await closeDeploy()\n }\n catch (error) {\n writeCliError('Failed to close deploy module', error)\n process.exitCode = 1\n }\n }\n for (const key of Object.keys(process.env)) {\n if (originalEnv[key] === undefined)\n delete process.env[key]\n }\n Object.assign(process.env, originalEnv)\n core.logger.setLevel(previousLogLevel)\n restoreProjectLogger?.()\n }\n}\n","import { createRequire } from 'module';\nvar require = createRequire('/');\n// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar _a;\n// Mediocre shim\nvar Worker;\nvar isMarkedAsUntransferable;\nvar workerAdd = \";var __w=require('worker_threads');__w.parentPort.on('message',function(m){onmessage({data:m})}),postMessage=function(m,t){__w.parentPort.postMessage(m,t)},close=process.exit;self=global\";\ntry {\n (_a = require('worker_threads'), Worker = _a.Worker, isMarkedAsUntransferable = _a.isMarkedAsUntransferable);\n}\ncatch (e) {\n}\nvar wk = Worker ? function (c, _, msg, transfer, cb) {\n var done = false;\n var w = new Worker(c + workerAdd, { eval: true })\n .on('error', function (e) { return cb(e, null); })\n .on('message', function (m) { return cb(null, m); })\n .on('exit', function (c) {\n if (c && !done)\n cb(new Error('exited with code ' + c), null);\n });\n if (isMarkedAsUntransferable)\n transfer = transfer.filter(function (t) { return !isMarkedAsUntransferable(t); });\n w.postMessage(msg, transfer);\n w.terminate = function () {\n done = true;\n return Worker.prototype.terminate.call(w);\n };\n return w;\n} : function (_, __, ___, ____, cb) {\n setImmediate(function () { return cb(new Error('async operations unsupported - update to Node 12+ (or Node 10-11 with the --experimental-worker CLI flag)'), null); });\n var NOP = function () { };\n return {\n terminate: NOP,\n postMessage: NOP\n };\n};\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new i32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 1; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n , // determined by compression function\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n // source length dict length\n var sl = dat.length, dl = dict ? dict.length : 0;\n if (!sl || st.f && !st.l)\n return buf || new u8(0);\n var noBuf = !buf;\n // have to estimate size\n var resize = noBuf || st.i != 2;\n // no state\n var noSt = st.i;\n // Assumes roughly 33% compression ratio average\n if (noBuf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (resize)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17\n if (resize)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (resize)\n cbuf(bt + 131072);\n var end = bt + add;\n if (bt < dt) {\n var shift = dl - dt, dend = Math.min(dt, end);\n if (shift + bt < 0)\n err(3);\n for (; bt < dend; ++bt)\n buf[bt] = dict[shift + bt];\n }\n for (; bt < end; ++bt)\n buf[bt] = buf[bt - dt];\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n // don't reallocate for streams or user buffers\n return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return { t: et, l: 0 };\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return { t: v, l: 1 };\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n ++lcfreq[lclt[i] & 31];\n for (var i = 0; i < lcdt.length; ++i)\n ++lcfreq[lcdt[i] & 31];\n var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n var sym = syms[i];\n if (sym > 255) {\n var len = (sym >> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n var dst = sym & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[sym]), p += ll[sym];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n var s = st.z || dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var lst = st.l;\n var pos = (st.r || 0) & 7;\n if (lvl) {\n if (pos)\n w[0] = st.r >> 3;\n var opt = deo[lvl - 1];\n var n = opt >> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new i32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx blkpos\n var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n for (; i + 2 < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j & 32767;\n var pti = prev[ti];\n var cd = ti - pti & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one int32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n for (i = Math.max(i, wi); i < s; ++i) {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n if (!lst) {\n st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n // shft(pos) now 1 less if pos & 7 != 0\n pos -= 7;\n st.h = head, st.p = prev, st.i = i, st.w = wi;\n }\n }\n else {\n for (var i = st.w || 0; i < s + lst; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[(pos / 8) | 0] = lst;\n e = s;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n st.i = s;\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Adler32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n if (!st) {\n st = { l: 1 };\n if (opt.dictionary) {\n var dict = opt.dictionary.subarray(-32768);\n var newDat = new u8(dict.length + dat.length);\n newDat.set(dict);\n newDat.set(dat, dict.length);\n dat = newDat;\n st.w = dict.length;\n }\n }\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n fnStr = wcln(fns[i], fnStr, td_1);\n ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n }\n var td = mrg({}, ch[id].e);\n return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n out: o.size && new u8(o.size),\n dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) {\n if (ev.data[0]) {\n strm.push(ev.data[0], ev.data[1]);\n postMessage([ev.data[0].length]);\n }\n else\n strm.flush(ev.data[1]);\n };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else if (!Array.isArray(dat))\n ext(dat);\n else if (dat.length == 1) {\n strm.queuedSize -= dat[0];\n if (strm.ondrain)\n strm.ondrain(dat[0]);\n }\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.queuedSize = 0;\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n strm.queuedSize += d.length;\n // can fail for cross-realm Uint8Array, but ok - only a small performance penalty\n w.postMessage([d, t = f], d.buffer instanceof ArrayBuffer ? [d.buffer] : []);\n };\n strm.terminate = function () { w.terminate(); };\n if (flush) {\n strm.flush = function (sync) { w.postMessage([0, sync]); };\n }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\n// read 8 bytes\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += (d[10] | d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n if (o.dictionary) {\n var h = adler();\n h.p(o.dictionary);\n wbytes(c, 2, h.d());\n }\n};\n// zlib start\nvar zls = function (d, dict) {\n if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if ((d[1] >> 5 & 1) == +!dict)\n err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n // 98304 = 32768 (lookback) + 65536 (common chunk size)\n this.b = new u8(98304);\n if (this.o.dictionary) {\n var dict = this.o.dictionary.subarray(-32768);\n this.b.set(dict, 32768 - dict.length);\n this.s.i = 32768 - dict.length;\n }\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n var endLen = chunk.length + this.s.z;\n if (endLen > this.b.length) {\n if (endLen > 2 * this.b.length - 32768) {\n var newBuf = new u8(endLen & -32768);\n newBuf.set(this.b.subarray(0, this.s.z));\n this.b = newBuf;\n }\n var split = this.b.length - this.s.z;\n this.b.set(chunk.subarray(0, split), this.s.z);\n this.s.z = this.b.length;\n this.p(this.b, false);\n this.b.set(this.b.subarray(-32768));\n this.b.set(chunk.subarray(split), 32768);\n this.s.z = chunk.length - split + 32768;\n this.s.i = 32766, this.s.w = 32768;\n }\n else {\n this.b.set(chunk, this.s.z);\n this.s.z += chunk.length;\n }\n this.s.l = final & 1;\n if (this.s.z > this.s.w + 8191 || final) {\n this.p(this.b, final || false);\n this.s.w = this.s.i, this.s.i -= 2;\n }\n if (final) {\n // cleanup unneeded buffers/state to reduce memory usage\n this.s = this.o = {};\n this.b = et;\n }\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * deflated output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible. A separate DEFLATE stream may be concatenated\n * with the current output after a sync flush.\n */\n Deflate.prototype.flush = function (sync) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n this.p(this.b, false);\n this.s.w = this.s.i, this.s.i -= 2;\n // could technically skip writing the type-0 block for (this.s.r & 7) == 0,\n // but the deterministic trailer (00 00 FF FF) is useful in some situations\n if (sync) {\n var c = new u8(6);\n c[0] = this.s.r >> 3;\n // write empty, non-final type-0 block\n var ep = wfblk(c, this.s.r, et);\n this.s.r = 0;\n this.ondata(c.subarray(0, ep >> 3), false);\n }\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6, 1);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n function Inflate(opts, cb) {\n // no StrmOpt here to avoid adding to workerizer\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n this.s = { i: 0, b: dict ? dict.length : 0 };\n this.o = new u8(32768);\n this.p = new u8(0);\n if (dict)\n this.o.set(dict);\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n if (!this.p.length)\n this.p = c;\n else if (c.length) {\n var n = new u8(this.p.length + c.length);\n n.set(this.p), n.set(c, this.p.length), this.p = n;\n }\n };\n Inflate.prototype.c = function (final) {\n this.s.i = +(this.d = final || false);\n var bts = this.s.b;\n var dt = inflt(this.p, this.s, this.o);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n function AsyncInflate(opts, cb) {\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Inflate(ev.data);\n onmessage = astrm(strm);\n }, 7, 0);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\nexport function inflateSync(data, opts) {\n return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n this.l += chunk.length;\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * GZIPped output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Gzip.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8, 1);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n function Gunzip(opts, cb) {\n this.v = 1;\n this.r = 0;\n Inflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n this.r += chunk.length;\n if (this.v) {\n var p = this.p.subarray(this.v - 1);\n var s = p.length > 3 ? gzs(p) : 4;\n if (s > p.length) {\n if (!final)\n return;\n }\n else if (this.v > 1 && this.onmember) {\n this.onmember(this.r - p.length);\n }\n this.p = p.subarray(s), this.v = 0;\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, 0);\n // process concatenated GZIP\n if (this.s.f && !this.s.l) {\n this.v = shft(this.s.p) + 9;\n this.s = { i: 0 };\n this.o = new u8(0);\n this.push(new u8(0), final);\n }\n else if (final) {\n Inflate.prototype.c.call(this, final);\n }\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n function AsyncGunzip(opts, cb) {\n var _this = this;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gunzip(ev.data);\n strm.onmember = function (offset) { return postMessage(offset); };\n onmessage = astrm(strm);\n }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\nexport function gunzipSync(data, opts) {\n var st = gzs(data);\n if (st + 8 > data.length)\n err(6, 'invalid gzip data');\n return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * zlibbed output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Zlib.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10, 1);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n function Unzlib(opts, cb) {\n Inflate.call(this, opts, cb);\n this.v = opts && opts.dictionary ? 2 : 1;\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 6 && !final)\n return;\n this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n function AsyncUnzlib(opts, cb) {\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Unzlib(ev.data);\n onmessage = astrm(strm);\n }, 11, 0);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\nexport function unzlibSync(data, opts) {\n return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n function Decompress(opts, cb) {\n this.o = StrmOpt.call(this, opts, cb) || {};\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n }\n // init substream\n // overriden by AsyncDecompress\n Decompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (dat, final) {\n _this.ondata(dat, final);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(this.o)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(this.o)\n : new this.Z(this.o);\n this.i();\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n function AsyncDecompress(opts, cb) {\n Decompress.call(this, opts, cb);\n this.queuedSize = 0;\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n }\n AsyncDecompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (err, dat, final) {\n _this.ondata(err, dat, final);\n };\n this.s.ondrain = function (size) {\n _this.queuedSize -= size;\n if (_this.ondrain)\n _this.ondrain(size);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n this.queuedSize += chunk.length;\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, opts)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, opts)\n : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (ArrayBuffer.isView(val))\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return { s: r, r: slc(d, i - 1) };\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (final) {\n if (r.length)\n err(8);\n this.p = null;\n }\n else\n this.p = r;\n this.ondata(s, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td) {\n return td.decode(dat);\n }\n else {\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (r.length)\n err(8);\n return s;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), efl = b2(d, b + 30), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl;\n var _a = z64hs(d, es, efl, z, b4(d, b + 20), b4(d, b + 24), b4(d, b + 42)), sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + efl + b2(d, b + 32), off];\n};\n// read zip64 header sizes\nvar z64hs = function (d, b, l, z, sc, su, off) {\n var nsc = sc == 4294967295, nsu = su == 4294967295, noff = off == 4294967295, e = b + l;\n var nf = nsc + nsu + noff;\n if (z && nf) {\n for (; b + 4 < e; b += 4 + b2(d, b + 2)) {\n if (b2(d, b) == 1) {\n return [\n nsc ? b8(d, b + 4 + 8 * nsu) : sc,\n nsu ? b8(d, b + 4) : su,\n noff ? b8(d, b + 4 + 8 * (nsu + nsc)) : off,\n 1\n ];\n }\n }\n // z == 2 for unknown whether or not zip64\n if (z < 2)\n err(13);\n }\n return [sc, su, off, 0];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n if (c != -1) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n // we shouldn't really do this cast, but properly handling ArrayBufferLike\n // makes the API unergonomic with Buffer\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u, -1);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this.ondata(err, dat, final);\n _this.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this.d & 1))\n return;\n _this.u.splice(-1, 1);\n _this.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (chunk, final) {\n // same as ZipPassThrough: cast to retain Buffer ergonomics\n this.ondata(null, chunk, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this = this;\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (chunk, final) {\n try {\n this.i.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (chunk, final) {\n if (this.i.terminate)\n chunk = slc(chunk, 0);\n this.i.push(chunk, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var lsc = b4(buf, i + 18), lsu = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n var _a = z64hs(buf, i, es, 2, lsc, lsu, 0), sc_1 = _a[0], su_1 = _a[1], z64 = _a[3];\n if (dd)\n sc_1 = -1 - z64;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this.k[0] == chks_3 && _this.c)\n _this.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = lft = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n // Synchronously decompress under 512KB, or barely-compressed data\n if (su < 524288 || sc > 0.8 * su) {\n try {\n cbl(null, inflateSync(infl, { out: new u8(su) }));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n","import { strToU8 } from 'fflate'\n\ndeclare const __FEEDBACK_REPLAY_SCRIPT__: string\n\n/** 查看器只使用 textContent 与受限图片,不执行原应用或用户附件脚本。 */\nconst VIEWER_SCRIPT = `\nconst messages = {\n zh: {title:'问题反馈',facts:'采集事实',user:'用户描述',evidence:'证据',attachments:'截图与附件',missing:'缺失材料',history:'处理记录',error:'问题包读取失败',all:'全部',next:'下一页',previous:'上一页',download:'下载',empty:'未填写',replay:'页面回放',play:'播放',pause:'暂停',unavailable:'回放不可用,已保留原始证据',boundary:'回放展示采集的页面快照与交互,不执行原应用脚本。未内嵌的外部图片、字体和样式被离线策略阻止;缺失记录见下方。'},\n en: {title:'Feedback report',facts:'Collected facts',user:'User description',evidence:'Evidence',attachments:'Screenshots and attachments',missing:'Missing evidence',history:'Processing history',error:'Unable to read the bundle',all:'All',next:'Next',previous:'Previous',download:'Download',empty:'Not provided',replay:'Page replay',play:'Play',pause:'Pause',unavailable:'Replay unavailable; original evidence is preserved',boundary:'Replay shows captured snapshots and interactions without running application scripts. External images, fonts and styles that were not embedded are blocked by offline policy. See missing evidence below.'},\n ja: {title:'問題フィードバック',facts:'収集した事実',user:'ユーザーの説明',evidence:'証拠',attachments:'スクリーンショットと添付',missing:'不足資料',history:'処理記録',error:'パッケージを読み込めません',all:'すべて',next:'次へ',previous:'前へ',download:'ダウンロード',empty:'未入力',replay:'ページ再生',play:'再生',pause:'一時停止',unavailable:'再生できません。元の証拠は保持されています',boundary:'収集したスナップショットと操作を再生し、元のアプリのスクリプトは実行しません。埋め込まれていない外部画像、フォント、スタイルはオフライン方針で遮断されます。不足資料も確認してください。'}\n};\nconst language = navigator.language.startsWith('ja') ? 'ja' : navigator.language.startsWith('zh') ? 'zh' : 'en';\nconst m = messages[language];\nfunction text(tag,value,parent){const node=document.createElement(tag);node.textContent=String(value??'');parent.append(node);return node;}\nfunction section(title){const block=document.createElement('section');text('h2',title,block);document.querySelector('main').append(block);return block;}\nfunction safeImage(file){return ['image/png','image/jpeg','image/webp'].includes(file.contentType);}\nasync function load(path){const response=await fetch('../'+path);if(!response.ok)throw Error('Missing file');return response.json();}\ntry {\n const [manifest,report,evidence,history]=await Promise.all([load('manifest.json'),load('report.json'),load('evidence/records.json'),load('evidence/history.json')]);\n text('h1',m.title+' '+(report.number||report.id),document.querySelector('header'));\n text('pre',JSON.stringify(report,null,2),section(m.facts));\n text('p',report.description||m.empty,section(m.user));\n const attachments=section(m.attachments);\n for(const file of manifest.files.filter(item=>item.kind==='attachment')){\n if(!/^attachments\\\\/[\\\\w-]+\\\\.(png|jpg|webp|webm|mp4|txt|json|bin)$/.test(file.path))continue;\n const figure=document.createElement('figure');attachments.append(figure);text('figcaption',file.name||file.attachmentId,figure);\n if(safeImage(file)){const image=document.createElement('img');image.src='../'+file.path;image.alt=file.name||'';image.loading='lazy';figure.append(image);}\n if(['video/webm','video/mp4'].includes(file.contentType)){const video=document.createElement('video');video.src='../'+file.path;video.controls=true;video.preload='metadata';video.style.maxWidth='100%';figure.append(video);}\n const link=text('a',m.download,figure);link.href='../'+file.path;link.download=file.name||file.path.split('/').pop();\n }\n const replayEvents=evidence.filter(item=>item.kind==='replay'&&item.data&&item.data.event).map(item=>item.data.event).sort((a,b)=>a.timestamp-b.timestamp);\n\n if(replayEvents.length){\n const replay=section(m.replay);text('p',m.boundary,replay);\n try{\n await import('./replay.js');\n if(typeof globalThis.__HAI_FEEDBACK_REPLAY__!=='function')throw Error('Replay unavailable');\n const fullSnapshot=replayEvents.find(event=>event.type===2);\n if(!fullSnapshot)throw Error('Replay full snapshot unavailable');\n const target=document.createElement('div');replay.append(target);\n let player;\n const origin=replayEvents[0].timestamp;\n const duration=Math.max(0,replayEvents.at(-1).timestamp-origin);\n const snapshotOffset=Math.max(0,fullSnapshot.timestamp-origin);\n const play=text('button',m.play,replay);const pause=text('button',m.pause,replay);\n const slider=document.createElement('input');slider.type='range';slider.min='0';slider.max=String(Math.max(1,duration));slider.value='0';slider.setAttribute('aria-label',m.replay);replay.append(slider);\n let current=0;let playing=false;let frame=0;\n function position(value){return Math.max(0,Math.min(duration,Number.isFinite(value)?value:0));}\n function stop(){if(frame)cancelAnimationFrame(frame);frame=0;}\n // 每次定位重建实例,隔离旧回放末尾延迟到达的 finish,避免覆盖新的进度。\n function construct(){const instance=globalThis.__HAI_FEEDBACK_REPLAY__(replayEvents,target);player=instance;instance.on('finish',()=>{if(instance!==player||!playing)return;playing=false;stop();current=duration;slider.value=String(current);});}\n function update(){if(!playing)return;current=position(player.getCurrentTime());slider.value=String(current);frame=requestAnimationFrame(update);}\n // rrweb 仅同步应用严格早于偏移的事件;增加 1ms 使精确事件时间与首帧边界都包含在内。\n function seek(value){playing=false;stop();const requested=position(value);player?.destroy();construct();player.pause(Math.max(requested,snapshotOffset)+1);current=requested;slider.value=String(current);}\n\n play.onclick=()=>{stop();current=position(Number(slider.value));if(current>=duration)seek(0);playing=true;player.play(Math.max(current,snapshotOffset));update();};\n pause.onclick=()=>{player.pause();playing=false;stop();current=position(player.getCurrentTime());slider.value=String(current);};\n slider.oninput=()=>seek(Number(slider.value));\n window.addEventListener('pagehide',()=>{playing=false;stop();player.destroy();},{once:true});\n seek(0);\n }catch{text('p',m.unavailable,replay);}\n }\n const block=section(m.evidence);const filter=document.createElement('select');block.append(filter);const all=text('option',m.all,filter);all.value='';\n for(const kind of [...new Set(evidence.map(item=>item.kind))]){const option=text('option',kind,filter);option.value=kind;}\n const request=document.createElement('input');request.placeholder='requestId';request.setAttribute('aria-label','requestId');block.append(request);\n const output=text('pre','',block);const previous=text('button',m.previous,block);const next=text('button',m.next,block);const counter=text('span','',block);let page=1;\n function render(){const rows=evidence.filter(item=>(!filter.value||item.kind===filter.value)&&(!request.value||item.requestId===request.value));const pages=Math.max(1,Math.ceil(rows.length/20));page=Math.min(page,pages);output.textContent=JSON.stringify(rows.slice((page-1)*20,page*20),null,2);counter.textContent=' '+page+' / '+pages+' ('+rows.length+')';previous.disabled=page<=1;next.disabled=page>=pages;}\n filter.onchange=()=>{page=1;render();};request.oninput=()=>{page=1;render();};previous.onclick=()=>{page--;render();};next.onclick=()=>{page++;render();};render();\n text('pre',JSON.stringify(history,null,2),section(m.history));text('pre',manifest.missing.join('\\\\n')||'—',section(m.missing));\n} catch {text('p',m.error,document.querySelector('main'));}\n`\n\n/**\n * 包内可信查看器资源,CLI 从内置资源提供代码,绝不执行导入包自带的任意脚本。\n * @example 模块内部上下文\n * ```ts\n * const html = feedbackViewerFiles()['viewer/index.html']\n * const source: string = new TextDecoder().decode(html)\n * ```\n */\nexport function feedbackViewerFiles(): Record<string, Uint8Array> {\n return {\n 'viewer/index.html': strToU8(`<!doctype html><html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' blob: data:; media-src 'self' blob:; connect-src 'self'; frame-src 'self' about: blob:; font-src 'self' data:; base-uri 'none'; form-action 'none'\"><title>Feedback</title><link rel=\"stylesheet\" href=\"style.css\"></head><body><header></header><main></main><script type=\"module\" src=\"app.js\"></script></body></html>`),\n 'viewer/style.css': strToU8('body{font:15px system-ui,sans-serif;line-height:1.6;margin:0;background:#f5f6f8;color:#172033}header,main{max-width:1080px;margin:auto;padding:24px}section{background:white;padding:24px;margin-bottom:20px;border:1px solid #dce1e8;border-radius:12px}h1{font-size:26px}h2{font-size:19px;margin-top:0}pre{white-space:pre-wrap;overflow-wrap:anywhere;font:13px/1.6 ui-monospace,monospace}img{max-width:100%;height:auto;border:1px solid #dce1e8}figure{margin:16px 0}input,select,button{font:inherit;padding:8px;margin:4px;border:1px solid #ccd2dc;border-radius:6px}button{cursor:pointer}a{display:block;color:#215dc0}'),\n 'viewer/app.js': strToU8(VIEWER_SCRIPT),\n 'viewer/replay.js': strToU8(typeof __FEEDBACK_REPLAY_SCRIPT__ === 'string' ? __FEEDBACK_REPLAY_SCRIPT__ : '/* Replay is available in built package artifacts. */'),\n }\n}\n","import type { HaiResult } from '@h-ai/core'\nimport type { FeedbackBundle, FeedbackBundleEvidence, FeedbackBundleEvidencePage, FeedbackBundleFile, FeedbackBundleInput, FeedbackBundleManifest, FeedbackBundleQuery, FeedbackBundleReadOptions } from './feedback-bundle-types.js'\nimport { core, err, HaiCommonError, ok } from '@h-ai/core'\nimport { strFromU8, strToU8, unzipSync, zipSync } from 'fflate'\nimport { feedbackViewerFiles } from './feedback-bundle-viewer.js'\n\nconst bundleM = core.i18n.createMessageGetter({\n 'zh-CN': { invalid: '问题包格式、容量或完整性校验失败', title: '问题反馈', facts: '采集事实', missing: '缺失材料', user: '用户描述', empty: '未填写', evidence: '证据', attachments: '附件' },\n 'en-US': { invalid: 'The feedback bundle failed format, size or integrity validation', title: 'Feedback report', facts: 'Collected facts', missing: 'Missing evidence', user: 'User description', empty: 'Not provided', evidence: 'Evidence', attachments: 'Attachments' },\n 'ja-JP': { invalid: '問題パッケージの形式、容量または整合性の検証に失敗しました', title: '問題フィードバック', facts: '収集した事実', missing: '不足している資料', user: 'ユーザーの説明', empty: '未入力', evidence: '証拠', attachments: '添付ファイル' },\n})\n\nconst MAX_FILES = 1024\nconst MAX_BYTES = 64 * 1024 * 1024\nconst MAX_FILE_BYTES = 16 * 1024 * 1024\nconst SHA256 = /^[a-f0-9]{64}$/\nconst SAFE_ID = /^[\\w-]{1,128}$/\n\n/** JSON 仅做数据边界,禁止保留原型和可执行值。 */\nfunction jsonObject(value: unknown): Record<string, unknown> {\n const parsed: unknown = JSON.parse(JSON.stringify(value))\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))\n throw new Error('Expected object')\n return parsed as Record<string, unknown>\n}\n\nfunction safePath(value: string): boolean {\n return /^[a-z0-9][\\w./-]*$/i.test(value) && !value.endsWith('/')\n && !value.split('/').some(segment => !segment || segment === '.' || segment === '..')\n}\n\nasync function checksum(bytes: Uint8Array): Promise<string> {\n const hash = await globalThis.crypto.subtle.digest('SHA-256', new Uint8Array(bytes).buffer)\n return Array.from(new Uint8Array(hash), byte => byte.toString(16).padStart(2, '0')).join('')\n}\n\nfunction objectFromFile(files: Readonly<Record<string, Uint8Array>>, path: string): Record<string, unknown> {\n const bytes = files[path]\n if (!bytes)\n throw new Error('Missing file')\n const parsed: unknown = JSON.parse(strFromU8(bytes))\n return jsonObject(parsed)\n}\n\nfunction evidenceFrom(value: unknown): FeedbackBundleEvidence {\n const record = jsonObject(value)\n if (typeof record.source !== 'string' || typeof record.kind !== 'string' || typeof record.timestamp !== 'number' || !Number.isFinite(record.timestamp))\n throw new Error('Invalid evidence')\n for (const key of ['id', 'requestId', 'errorId', 'missingReason']) {\n if (record[key] !== undefined && typeof record[key] !== 'string')\n throw new Error('Invalid evidence field')\n }\n if (record.sequence !== undefined && (typeof record.sequence !== 'number' || !Number.isSafeInteger(record.sequence) || record.sequence < 0))\n throw new Error('Invalid evidence sequence')\n return {\n source: record.source,\n kind: record.kind,\n timestamp: record.timestamp,\n ...(typeof record.id === 'string' ? { id: record.id } : {}),\n ...(typeof record.sequence === 'number' ? { sequence: record.sequence } : {}),\n ...(typeof record.requestId === 'string' ? { requestId: record.requestId } : {}),\n ...(typeof record.errorId === 'string' ? { errorId: record.errorId } : {}),\n ...(typeof record.missingReason === 'string' ? { missingReason: record.missingReason } : {}),\n ...(record.data !== undefined ? { data: record.data } : {}),\n }\n}\n\nfunction limitsFor(options: FeedbackBundleReadOptions = {}) {\n const limits = { maxFiles: options.maxFiles ?? MAX_FILES, maxBytes: options.maxBytes ?? MAX_BYTES, maxFileBytes: options.maxFileBytes ?? MAX_FILE_BYTES }\n if (Object.values(limits).some(value => !Number.isSafeInteger(value) || value <= 0))\n throw new Error('Invalid limits')\n return limits\n}\n\n/** 先检查 ZIP 中央目录,避免解压后才发现重复路径、符号链接或压缩炸弹。 */\nfunction preflight(bytes: Uint8Array, limits: ReturnType<typeof limitsFor>): void {\n if (bytes.byteLength > limits.maxBytes || bytes.byteLength < 22)\n throw new Error('Invalid archive size')\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n let end = -1\n for (let offset = bytes.length - 22; offset >= Math.max(0, bytes.length - 65557); offset--) {\n if (view.getUint32(offset, true) === 0x06054B50 && offset + 22 + view.getUint16(offset + 20, true) === bytes.length) {\n end = offset\n break\n }\n }\n if (end < 0 || view.getUint16(end + 4, true) !== 0 || view.getUint16(end + 6, true) !== 0)\n throw new Error('Invalid archive directory')\n const count = view.getUint16(end + 10, true)\n const size = view.getUint32(end + 12, true)\n let offset = view.getUint32(end + 16, true)\n if (count === 0 || count > limits.maxFiles || count !== view.getUint16(end + 8, true) || offset + size !== end)\n throw new Error('Invalid archive directory size')\n let total = 0\n const names = new Set<string>()\n for (let index = 0; index < count; index++) {\n if (offset + 46 > end || view.getUint32(offset, true) !== 0x02014B50)\n throw new Error('Invalid archive entry')\n const nameLength = view.getUint16(offset + 28, true)\n const next = offset + 46 + nameLength + view.getUint16(offset + 30, true) + view.getUint16(offset + 32, true)\n if (next > end)\n throw new Error('Invalid archive entry length')\n const name = strFromU8(bytes.subarray(offset + 46, offset + 46 + nameLength))\n const originalSize = view.getUint32(offset + 24, true)\n const method = view.getUint16(offset + 10, true)\n const mode = (view.getUint32(offset + 38, true) >>> 16) & 0xF000\n if (!safePath(name) || names.has(name.toLowerCase()) || originalSize > limits.maxFileBytes\n || (view.getUint16(offset + 8, true) & 1) || ![0, 8].includes(method) || (mode !== 0 && mode !== 0x8000)) {\n throw new Error('Unsafe archive entry')\n }\n total += originalSize\n if (total > limits.maxBytes)\n throw new Error('Archive expansion limit')\n names.add(name.toLowerCase())\n offset = next\n }\n if (offset !== end)\n throw new Error('Unexpected archive entry')\n}\n\nfunction parseManifest(value: Record<string, unknown>): FeedbackBundleManifest {\n if (value.format !== 'hai-feedback' || value.version !== 1 || typeof value.reportId !== 'string'\n || typeof value.evidenceRevision !== 'number' || !Number.isSafeInteger(value.evidenceRevision) || value.evidenceRevision < 0\n || typeof value.createdAt !== 'number' || !Number.isFinite(value.createdAt) || !Array.isArray(value.files)\n || !Array.isArray(value.missing) || value.missing.some(item => typeof item !== 'string')) {\n throw new Error('Unsupported manifest')\n }\n const files: FeedbackBundleFile[] = value.files.map((item) => {\n const file = jsonObject(item)\n if (typeof file.path !== 'string' || !safePath(file.path) || file.path === 'manifest.json'\n || typeof file.size !== 'number' || !Number.isSafeInteger(file.size) || file.size < 0\n || typeof file.sha256 !== 'string' || !SHA256.test(file.sha256)\n || !['report', 'evidence', 'history', 'attachment', 'summary', 'viewer'].includes(String(file.kind))) {\n throw new Error('Invalid manifest file')\n }\n return {\n path: file.path,\n size: file.size,\n sha256: file.sha256,\n kind: file.kind as FeedbackBundleFile['kind'],\n ...(typeof file.attachmentId === 'string' ? { attachmentId: file.attachmentId } : {}),\n ...(typeof file.name === 'string' ? { name: file.name } : {}),\n ...(typeof file.contentType === 'string' ? { contentType: file.contentType } : {}),\n }\n })\n if (new Set(files.map(file => file.path)).size !== files.length)\n throw new Error('Duplicate manifest file')\n return { format: 'hai-feedback', version: 1, reportId: value.reportId, evidenceRevision: value.evidenceRevision, createdAt: value.createdAt, missing: value.missing as string[], files }\n}\n\n/**\n * 生成含摘要、证据索引、附件与静态查看器的 ZIP;调用前应完成授权与脱敏。\n * @example\n * ```ts\n * import { createFeedbackBundle } from '@h-ai/feedback/bundle'\n * const result = await createFeedbackBundle({ report: { id: 'fb_1' }, evidence: [] })\n * if (result.success) { const bytes: Uint8Array = result.data }\n * ```\n */\nexport async function createFeedbackBundle<TReport extends { id: string }>(input: FeedbackBundleInput<TReport>): Promise<HaiResult<Uint8Array>> {\n try {\n if (input.createdAt !== undefined && (!Number.isSafeInteger(input.createdAt) || input.createdAt < 0))\n throw new Error('Invalid bundle creation time')\n const report = jsonObject(input.report)\n if (typeof report.id !== 'string' || !SAFE_ID.test(report.id))\n throw new Error('Invalid report')\n if (['appVersion', 'buildId', 'commit'].some(key => report[key] !== undefined && (typeof report[key] !== 'string' || report[key].length > 128)))\n throw new Error('Invalid build metadata')\n if (report.evidenceRevision !== undefined && (typeof report.evidenceRevision !== 'number' || !Number.isSafeInteger(report.evidenceRevision) || report.evidenceRevision < 0))\n throw new Error('Invalid evidence revision')\n const evidence = input.evidence.map(evidenceFrom)\n const history = (input.history ?? []).map(jsonObject)\n const missing = [...(input.missing ?? [])]\n if (missing.some(item => typeof item !== 'string'))\n throw new Error('Invalid missing evidence')\n const files: Record<string, Uint8Array> = {\n 'report.json': strToU8(JSON.stringify(report)),\n 'timeline.ndjson': strToU8(evidence.map(record => JSON.stringify(record)).join('\\n')),\n 'evidence/records.json': strToU8(JSON.stringify(evidence)),\n 'evidence/history.json': strToU8(JSON.stringify(history)),\n ...feedbackViewerFiles(),\n }\n const manifestFiles: FeedbackBundleFile[] = []\n const ids = new Set<string>()\n for (const attachment of input.attachments ?? []) {\n if (typeof attachment.id !== 'string' || attachment.id.length < 1 || attachment.id.length > 128 || ids.has(attachment.id) || attachment.bytes.byteLength > MAX_FILE_BYTES)\n throw new Error('Invalid attachment')\n ids.add(attachment.id)\n const suffix = ({ 'image/png': 'png', 'image/jpeg': 'jpg', 'image/webp': 'webp', 'video/webm': 'webm', 'video/mp4': 'mp4', 'text/plain': 'txt', 'application/json': 'json', 'application/pdf': 'pdf' } as Record<string, string>)[attachment.contentType] ?? 'bin'\n // 原始标识仅保存在清单,使用区分大小写且保留字符串编码的摘要构造安全路径。\n const path = `attachments/${await checksum(strToU8(JSON.stringify(attachment.id)))}.${suffix}`\n const hash = await checksum(attachment.bytes)\n if (attachment.checksum && attachment.checksum !== hash)\n throw new Error('Attachment checksum mismatch')\n files[path] = new Uint8Array(attachment.bytes)\n manifestFiles.push({ path, size: attachment.bytes.byteLength, sha256: hash, kind: 'attachment', attachmentId: attachment.id, name: attachment.name, contentType: attachment.contentType })\n }\n const manifest: FeedbackBundleManifest = { format: 'hai-feedback', version: 1, reportId: report.id, evidenceRevision: typeof report.evidenceRevision === 'number' ? report.evidenceRevision : 0, createdAt: input.createdAt ?? Date.now(), missing, files: manifestFiles }\n const temporary: FeedbackBundle = { report: { ...report, id: report.id }, evidence, history, manifest, files }\n files['summary.md'] = strToU8(summarizeFeedbackBundle(temporary))\n for (const [path, bytes] of Object.entries(files)) {\n if (manifestFiles.some(file => file.path === path))\n continue\n const kind = path === 'report.json' ? 'report' : path === 'summary.md' ? 'summary' : path.startsWith('viewer/') ? 'viewer' : path.endsWith('history.json') ? 'history' : 'evidence'\n manifest.files.push({ path, size: bytes.byteLength, sha256: await checksum(bytes), kind })\n }\n files['manifest.json'] = strToU8(JSON.stringify(manifest, null, 2))\n const total = Object.values(files).reduce((sum, file) => sum + file.byteLength, 0)\n if (Object.keys(files).length > MAX_FILES || total > Math.min(input.maxBytes ?? MAX_BYTES, MAX_BYTES) || Object.values(files).some(file => file.byteLength > MAX_FILE_BYTES))\n throw new Error('Bundle limits exceeded')\n return ok(zipSync(files, { level: 1, mtime: new Date(1980, 0, 1) }))\n }\n catch {\n return err(HaiCommonError.VALIDATION_ERROR, bundleM('invalid'))\n }\n}\n\n/**\n * 校验 ZIP 路径、容量、协议与所有文件的 SHA-256 后读取;不执行包内代码。\n * @example\n * ```ts\n * import { createFeedbackBundle, readFeedbackBundle } from '@h-ai/feedback/bundle'\n * const created = await createFeedbackBundle({ report: { id: 'fb_1' }, evidence: [] })\n * if (created.success) {\n * const parsed = await readFeedbackBundle(created.data, { maxBytes: 32 * 1024 * 1024 })\n * if (parsed.success) { const reportId: string = parsed.data.report.id }\n * }\n * ```\n */\nexport async function readFeedbackBundle(bytes: Uint8Array, options?: FeedbackBundleReadOptions): Promise<HaiResult<FeedbackBundle>> {\n try {\n const limits = limitsFor(options)\n preflight(bytes, limits)\n const files = unzipSync(bytes)\n const manifest = parseManifest(objectFromFile(files, 'manifest.json'))\n if (Object.keys(files).length !== manifest.files.length + 1)\n throw new Error('Unexpected bundle file')\n let total = 0\n for (const file of manifest.files) {\n const content = files[file.path]\n if (!content || content.byteLength !== file.size || content.byteLength > limits.maxFileBytes || await checksum(content) !== file.sha256)\n throw new Error('File integrity failed')\n total += content.byteLength\n }\n if (total > limits.maxBytes)\n throw new Error('Bundle expansion limit')\n const report = objectFromFile(files, 'report.json')\n if (['appVersion', 'buildId', 'commit'].some(key => report[key] !== undefined && (typeof report[key] !== 'string' || report[key].length > 128)))\n throw new Error('Invalid build metadata')\n if (typeof report.id !== 'string' || report.id !== manifest.reportId)\n throw new Error('Report mismatch')\n const records: unknown = JSON.parse(strFromU8(files['evidence/records.json'] ?? new Uint8Array()))\n const history: unknown = JSON.parse(strFromU8(files['evidence/history.json'] ?? new Uint8Array()))\n if (!Array.isArray(records) || !Array.isArray(history))\n throw new Error('Invalid evidence collection')\n return ok({ manifest, report: { ...report, id: report.id }, evidence: records.map(evidenceFrom), history: history.map(jsonObject), files })\n }\n catch {\n return err(HaiCommonError.VALIDATION_ERROR, bundleM('invalid'))\n }\n}\n\n/**\n * 生成人工与 AI 可读摘要,明确用户描述与采集事实。\n * @example\n * ```ts\n * import { createFeedbackBundle, readFeedbackBundle, summarizeFeedbackBundle } from '@h-ai/feedback/bundle'\n * const created = await createFeedbackBundle({ report: { id: 'fb_1' }, evidence: [] })\n * if (created.success) {\n * const parsed = await readFeedbackBundle(created.data)\n * if (parsed.success) { const markdown: string = summarizeFeedbackBundle(parsed.data) }\n * }\n * ```\n */\nexport function summarizeFeedbackBundle(bundle: FeedbackBundle): string {\n const report = bundle.report\n const safeText = (value: unknown) => typeof value === 'string' || typeof value === 'number' ? String(value).replaceAll('\\r', '').replaceAll('\\n', ' ') : ''\n return [\n `# ${bundleM('title')} ${safeText(report.number ?? report.id)}`,\n '',\n `## ${bundleM('user')}`,\n '',\n safeText(report.description) || bundleM('empty'),\n '',\n `## ${bundleM('facts')}`,\n '',\n `- ID: ${safeText(report.id)}`,\n `- App: ${safeText(report.appId)} ${safeText(report.appVersion)}`,\n `- Build: ${safeText(report.buildId)} ${safeText(report.commit)}`,\n `- Revision: ${bundle.manifest.evidenceRevision}`,\n `- ${bundleM('evidence')}: ${bundle.evidence.length}`,\n `- ${bundleM('attachments')}: ${bundle.manifest.files.filter(file => file.kind === 'attachment').length}`,\n '',\n `## ${bundleM('missing')}`,\n '',\n ...bundle.manifest.missing.map(reason => `- ${safeText(reason)}`),\n '',\n ].join('\\n')\n}\n\n/**\n * 通过时间、请求、错误与类型筛选离线证据;错误按锚点来源和请求取前后各 100 条,分页最大 100 条。\n * @example\n * ```ts\n * import { createFeedbackBundle, queryFeedbackBundle, readFeedbackBundle } from '@h-ai/feedback/bundle'\n * const created = await createFeedbackBundle({ report: { id: 'fb_1' }, evidence: [] })\n * if (created.success) {\n * const parsed = await readFeedbackBundle(created.data)\n * if (parsed.success) { const page = queryFeedbackBundle(parsed.data, { requestId: 'req_1', page: 1, pageSize: 20 }) }\n * }\n * ```\n */\nexport function queryFeedbackBundle(bundle: FeedbackBundle, query: FeedbackBundleQuery = {}): FeedbackBundleEvidencePage {\n const page = Number.isSafeInteger(query.page) && (query.page ?? 0) > 0 ? query.page! : 1\n const pageSize = Number.isSafeInteger(query.pageSize) && (query.pageSize ?? 0) > 0 ? Math.min(100, query.pageSize!) : 20\n let candidates = bundle.evidence\n if (query.errorId) {\n const anchor = candidates.find(item => item.kind === 'error' && item.errorId === query.errorId)\n if (!anchor)\n return { items: [], total: 0, page, pageSize }\n const anchorSequence = anchor.sequence ?? anchor.timestamp\n const context = candidates.filter(item => item.source === anchor.source && item.requestId === anchor.requestId && ['log', 'error'].includes(item.kind))\n const before = context.filter(item => (item.sequence ?? item.timestamp) <= anchorSequence).sort((left, right) => (right.sequence ?? right.timestamp) - (left.sequence ?? left.timestamp)).slice(0, 101)\n const after = context.filter(item => (item.sequence ?? item.timestamp) > anchorSequence).sort((left, right) => (left.sequence ?? left.timestamp) - (right.sequence ?? right.timestamp)).slice(0, 100)\n const window = new Set([...before, ...after])\n candidates = candidates.filter(item => window.has(item))\n }\n const records = candidates.filter(item => (!query.kind || item.kind === query.kind)\n && (!query.requestId || item.requestId === query.requestId)\n && (query.from === undefined || item.timestamp >= query.from) && (query.to === undefined || item.timestamp <= query.to))\n .sort((left, right) => left.timestamp - right.timestamp || left.source.localeCompare(right.source) || (left.sequence ?? 0) - (right.sequence ?? 0))\n return { items: records.slice((page - 1) * pageSize, page * pageSize), total: records.length, page, pageSize }\n}\n\n/**\n * 获取内置可信离线查看器;本地服务必须使用此资源而不是执行导入包中的脚本。\n * @example\n * ```ts\n * import { getFeedbackBundleViewerFiles } from '@h-ai/feedback/bundle'\n * const html: Uint8Array | undefined = getFeedbackBundleViewerFiles()['viewer/index.html']\n * ```\n */\nexport function getFeedbackBundleViewerFiles(): Readonly<Record<string, Uint8Array>> {\n return feedbackViewerFiles()\n}\n","import type { FeedbackBundle } from '@h-ai/feedback/bundle'\nimport type { GlobalOptions } from '../cli-types.js'\nimport { randomBytes } from 'node:crypto'\nimport { readFile, stat } from 'node:fs/promises'\nimport { createServer } from 'node:http'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { getFeedbackBundleViewerFiles, queryFeedbackBundle, readFeedbackBundle, summarizeFeedbackBundle } from '@h-ai/feedback/bundle'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliMessage } from '../cli-utils.js'\n\n/**\n * 本地离线分析选项,不包含任何生产连接或凭据。\n * @example\n * ```ts\n * import type { FeedbackCommandOptions } from './cli-feedback.js'\n * const options: FeedbackCommandOptions = { page: 1, pageSize: 20, requestId: 'request-1' }\n * ```\n */\nexport interface FeedbackCommandOptions extends GlobalOptions {\n page?: number\n pageSize?: number\n kind?: string\n requestId?: string\n errorId?: string\n from?: number\n to?: number\n port?: number\n}\n\n/**\n * 本机查看器句柄,宿主负责在取消或退出时关闭。\n * @example\n * ```ts\n * import type { FeedbackViewer } from './cli-feedback.js'\n * async function closeViewer(viewer: FeedbackViewer) { await viewer.close() }\n * ```\n */\nexport interface FeedbackViewer {\n url: string\n close: () => Promise<void>\n}\n\n/**\n * 启动只监听 loopback 的离线查看器,使用内置代码和已校验数据。\n * @throws Error - 端口或本机监听失败。\n * @example\n * ```ts\n * import { createFeedbackBundle, readFeedbackBundle } from '@h-ai/feedback/bundle'\n * import { startFeedbackViewer } from './cli-feedback.js'\n * const created = await createFeedbackBundle({ report: { id: 'report-1' }, evidence: [] })\n * if (created.success) {\n * const parsed = await readFeedbackBundle(created.data)\n * if (parsed.success) {\n * const viewer = await startFeedbackViewer(parsed.data)\n * try { await fetch(viewer.url) } finally { await viewer.close() }\n * }\n * }\n * ```\n */\nexport async function startFeedbackViewer(bundle: FeedbackBundle, options: { port?: number } = {}): Promise<FeedbackViewer> {\n const port = options.port ?? 0\n if (!Number.isSafeInteger(port) || port < 0 || port > 65535)\n throw new Error(cliM('cli_feedback_invalidOptions'))\n const prefix = `/${randomBytes(18).toString('hex')}/`\n const trustedViewer = getFeedbackBundleViewerFiles()\n const server = createServer((request, response) => {\n response.setHeader('X-Content-Type-Options', 'nosniff')\n response.setHeader('Cache-Control', 'no-store')\n response.setHeader('Cross-Origin-Resource-Policy', 'same-origin')\n response.setHeader('Content-Security-Policy', 'default-src \\'none\\'; script-src \\'self\\'; style-src \\'self\\' \\'unsafe-inline\\'; img-src \\'self\\' blob: data:; media-src \\'self\\' blob:; connect-src \\'self\\'; frame-src \\'self\\' about: blob:; font-src \\'self\\' data:; base-uri \\'none\\'; form-action \\'none\\'; frame-ancestors \\'none\\'')\n const address = server.address()\n const host = address && typeof address === 'object' ? `127.0.0.1:${address.port}` : ''\n if (request.headers.host !== host || request.method !== 'GET' || !request.url?.startsWith(prefix)) {\n response.writeHead(404).end()\n return\n }\n const requested = request.url.slice(prefix.length).split('?')[0]\n if (!requested) {\n response.writeHead(302, { Location: `${prefix}viewer/index.html` }).end()\n return\n }\n // 包内同名 JS 即使重算 checksum 也不能替换框架内置查看器。\n const bytes = requested.startsWith('viewer/') ? trustedViewer[requested] : bundle.files[requested]\n if (!bytes || requested.includes('%') || requested.includes('..') || requested.includes('\\\\')) {\n response.writeHead(404).end()\n return\n }\n const viewerTypes: Record<string, string> = { 'viewer/index.html': 'text/html; charset=utf-8', 'viewer/app.js': 'text/javascript; charset=utf-8', 'viewer/replay.js': 'text/javascript; charset=utf-8', 'viewer/style.css': 'text/css; charset=utf-8' }\n const attachment = bundle.manifest.files.find(file => file.path === requested && file.kind === 'attachment')\n const mediaType = attachment && ['image/png', 'image/jpeg', 'image/webp', 'video/webm', 'video/mp4'].includes(attachment.contentType ?? '') ? attachment.contentType : undefined\n const contentType = viewerTypes[requested] ?? mediaType ?? (requested.endsWith('.json') ? 'application/json; charset=utf-8' : 'text/plain; charset=utf-8')\n response.setHeader('Content-Type', contentType)\n if (requested.startsWith('attachments/') && !mediaType)\n response.setHeader('Content-Disposition', 'attachment')\n response.writeHead(200).end(bytes)\n })\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject)\n server.listen(port, '127.0.0.1', () => {\n server.removeListener('error', reject)\n resolve()\n })\n })\n const address = server.address()\n if (!address || typeof address !== 'object')\n throw new Error(cliM('cli_feedback_invalidOptions'))\n return {\n url: `http://127.0.0.1:${address.port}${prefix}viewer/index.html`,\n close: () => new Promise<void>((resolve, reject) => {\n server.close(error => error ? reject(error) : resolve())\n server.closeAllConnections()\n }),\n }\n}\n\n/**\n * 离线读取问题包,输出摘要、manifest 或证据分页,或启动本机查看器。\n * @throws Error - 参数、文件或包校验失败。\n * @example\n * ```ts\n * import { feedbackCommand } from './cli-feedback.js'\n * await feedbackCommand('summary', './feedback-FB-1.zip', { page: 1 })\n * ```\n */\nexport async function feedbackCommand(action: string, bundlePath: string, options: FeedbackCommandOptions = {}): Promise<void> {\n if (!['inspect', 'summary', 'evidence', 'view'].includes(action))\n throw new Error(cliM('cli_feedback_invalidAction'))\n const filePath = path.resolve(options.cwd ?? process.cwd(), bundlePath)\n const metadata = await stat(filePath)\n if (!metadata.isFile() || metadata.size > 64 * 1024 * 1024)\n throw new Error(cliM('cli_feedback_invalidBundle'))\n const result = await readFeedbackBundle(await readFile(filePath))\n if (!result.success)\n throw new Error(result.error.message)\n const bundle = result.data\n if (action === 'summary') {\n writeCliMessage(summarizeFeedbackBundle(bundle))\n return\n }\n if (action === 'inspect') {\n writeCliMessage(JSON.stringify(bundle.manifest, null, 2))\n return\n }\n if (action === 'evidence') {\n for (const value of [options.page, options.pageSize]) {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 1))\n throw new Error(cliM('cli_feedback_invalidOptions'))\n }\n for (const value of [options.from, options.to]) {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 0))\n throw new Error(cliM('cli_feedback_invalidOptions'))\n }\n if (options.from !== undefined && options.to !== undefined && options.from > options.to)\n throw new Error(cliM('cli_feedback_invalidOptions'))\n writeCliMessage(JSON.stringify(queryFeedbackBundle(bundle, options), null, 2))\n return\n }\n const viewer = await startFeedbackViewer(bundle, options)\n writeCliMessage(cliM('cli_feedback_viewerStarted', { params: { url: viewer.url } }))\n await new Promise<void>((resolve, reject) => {\n const stop = () => {\n process.off('SIGINT', stop)\n process.off('SIGTERM', stop)\n viewer.close().then(resolve, reject)\n }\n process.once('SIGINT', stop)\n process.once('SIGTERM', stop)\n })\n}\n","import type { TemplateContext } from '../cli-types.js'\nimport type { GenerateTarget } from './cli-generate-target.js'\nimport path from 'node:path'\nimport fse from 'fs-extra'\nimport { cliM } from '../cli-i18n.js'\n\n/**\n * 一批经过预检后统一写入的生成文件。\n * 普通生成文件不携带 previousContent;已有聚合入口必须携带原内容,用于提交前检测并发修改。\n * @example 模块内部上下文\n * ```ts\n * const file: GeneratedFile = { path: path.resolve('src/server/procedures/orders.ts'), content: 'export const orderName = \\'orders\\'\\n' }\n * ```\n */\nexport interface GeneratedFile {\n /** 输出文件的绝对路径。 */\n path: string\n /** 写入后的完整源码。 */\n content: string\n /** 仅聚合文件编辑携带原内容;写入前校验文件没有被其他操作修改。 */\n previousContent?: string\n}\n\n/**\n * 只在唯一生成标记前插入一项;import 保持组内相对顺序,重复完整行保持原文。\n * @param source - 现有聚合文件的完整内容。\n * @param marker - 模板约定的唯一标记。\n * @param entry - 待插入的完整 import/export 或对象项。\n * @returns 更新后的完整文件内容;标记重复或缺失时抛错。\n * @example 模块内部上下文\n * ```ts\n * const marker = '// @hai-generator:contracts:entries'\n * const source = appendAt(`const contracts = {\\n${marker}\\n}`, marker, ' orders: ordersContract,')\n * ```\n */\nfunction appendAt(source: string, marker: string, entry: string): string {\n if (source.split(marker).length !== 2)\n throw new Error(cliM('cli_generateUnsupportedAggregator'))\n if (source.split(/\\r?\\n/).some(line => line.trim() === entry.trim()))\n return source\n // 模板的相对 import 均为单行;插在同组正确位置,避免增量生成破坏排序门禁。\n const moduleName = /^import .+ from ['\"](.+)['\"]$/.exec(entry)?.[1]\n if (moduleName) {\n for (const match of source.matchAll(/^import (?!type\\b)[^\\r\\n]+ from ['\"](\\.[^'\"]+)['\"]\\r?$/gm)) {\n if (match[1]!.localeCompare(moduleName) > 0)\n return `${source.slice(0, match.index)}${entry}\\n${source.slice(match.index)}`\n }\n }\n return source.replace(marker, `${entry}\\n${marker}`)\n}\n\n/**\n * 沿服务端依赖图生成 contract 与 procedure,并接入模板已有的聚合入口。\n * @param context - 已通过标识符校验的名称。\n * @param target - 解析后的后端 workspace 与共享 contract 包。\n * @returns 新源码及现有入口的完整修改计划,不在本函数落盘。\n * @throws Error - contract 包不唯一或入口不再具有可识别的生成标记。\n * @example 模块内部上下文\n * ```ts\n * // 前提:在 CLI 生成的 fullstack 根执行;后端包为 shop-serv。\n * const { resolveGenerateTarget } = await import('./cli-generate-target.js')\n * const { createTemplateContext } = await import('../cli-utils.js')\n * const target = await resolveGenerateTarget({ cwd: process.cwd(), type: 'api', name: 'orders', workspace: 'shop-serv' })\n * const files = await generateServApi(createTemplateContext('orders'), target)\n * // 这里只返回计划;由 generate 统一预检、写入与失败回滚。\n * ```\n */\nexport async function generateServApi(context: TemplateContext, target: GenerateTarget): Promise<GeneratedFile[]> {\n const contracts = target.packages.filter(pkg => pkg.dependencies['@h-ai/api-contract'] && pkg.dependencies.zod && pkg.name in target.target.dependencies)\n if (contracts.length !== 1)\n throw new Error(cliM('cli_generateUnsupportedAggregator'))\n const contract = contracts[0]!\n const contractSources = await fse.readdir(path.join(contract.directory, 'src'))\n const aggregators: Array<{ path: string, content: string }> = []\n for (const name of contractSources.filter(name => name.endsWith('.ts'))) {\n const file = path.join(contract.directory, 'src', name)\n const content = await fse.readFile(file, 'utf8')\n if (content.includes('// @hai-generator:contracts:entries'))\n aggregators.push({ path: file, content })\n }\n if (aggregators.length !== 1)\n throw new Error(cliM('cli_generateUnsupportedAggregator'))\n const aggregator = aggregators[0]!\n const contractIndex = path.join(contract.directory, 'src/index.ts')\n const procedureIndex = path.join(target.target.directory, 'src/server/procedures/index.ts')\n const indexSource = await fse.readFile(contractIndex, 'utf8')\n const procedureSource = await fse.readFile(procedureIndex, 'utf8')\n const contractName = `${context.camelCase}Contract`\n const factoryName = `create${context.pascalCase}Procedures`\n const domainMarker = `// @hai-generator:domain ${context.camelCase}`\n const contractFile = path.join(contract.directory, 'src', `${context.kebabCase}-contract.ts`)\n const procedureFile = path.join(target.target.directory, 'src/server/procedures', `${context.kebabCase}-procedures.ts`)\n const importLine = `import { ${contractName} } from './${context.kebabCase}-contract.js'`\n const entryLine = ` ${context.camelCase}: ${contractName},`\n const factoryImport = `import { ${factoryName} } from './${context.kebabCase}-procedures.js'`\n const domainProperty = new RegExp(`^\\\\s*(?:${context.camelCase}|['\"]${context.camelCase}['\"]):`, 'm')\n if (domainProperty.test(aggregator.content) || domainProperty.test(procedureSource)) {\n for (const file of [contractFile, procedureFile]) {\n if (!await fse.pathExists(file) || !(await fse.readFile(file, 'utf8')).includes(domainMarker))\n throw new Error(cliM('cli_generateDomainExists', { params: { name: context.camelCase } }))\n }\n }\n const contractContent = `${domainMarker}\nimport { apiContract } from '@h-ai/api-contract'\nimport { z } from 'zod'\n\n/**\n * ${context.pascalCase} 示例契约:GET 列表与 POST 校验回显,不执行持久写入。\n * @example client.${context.camelCase}.create({ name: 'Example' })\n */\nexport const ${contractName} = {\n list: apiContract\n .route({ method: 'GET', path: '/${context.kebabCase}', operationId: '${context.camelCase}.list', tags: ['${context.kebabCase}'] })\n .output(apiContract.haiResultSchema(z.object({ items: z.array(z.object({ name: z.string() })) }))),\n create: apiContract\n .route({ method: 'POST', path: '/${context.kebabCase}', operationId: '${context.camelCase}.create', tags: ['${context.kebabCase}'] })\n .input(z.object({ name: z.string().min(1) }))\n .output(apiContract.haiResultSchema(z.object({ name: z.string() }))),\n}\n`\n const procedureContent = `${domainMarker}\nimport type { ServContext } from '@h-ai/serv'\nimport { ok } from '@h-ai/core'\nimport { serv } from '@h-ai/serv'\nimport { ${contractName} } from '${contract.name}'\n\n/**\n * 创建 ${context.pascalCase} 示例过程;新增持久写入前接入授权与业务服务。\n * @returns 与共享契约一致的公开过程;示例不访问用户数据。\n * @example const procedures = { ${context.camelCase}: ${factoryName}() }\n */\nexport function ${factoryName}() {\n return serv\n .implement(${contractName})\n .context<ServContext>()\n .route('list', () => ok({ items: [] }))\n .route('create', ({ input }) => ok({ name: input.name }))\n .build()\n}\n`\n return [\n { path: contractFile, content: contractContent },\n { path: procedureFile, content: procedureContent },\n { path: aggregator.path, previousContent: aggregator.content, content: appendAt(appendAt(aggregator.content, '// @hai-generator:contracts:imports', importLine), ' // @hai-generator:contracts:entries', entryLine) },\n { path: contractIndex, previousContent: indexSource, content: appendAt(indexSource, '// @hai-generator:contracts:exports', `export * from './${context.kebabCase}-contract.js'`) },\n { path: procedureIndex, previousContent: procedureSource, content: appendAt(appendAt(procedureSource, '// @hai-generator:procedures:imports', factoryImport), ' // @hai-generator:procedures:entries', ` ${context.camelCase}: ${factoryName}(),`) },\n ]\n}\n","import type { GenerateOptions } from '../cli-types.js'\nimport { glob } from 'node:fs/promises'\nimport path from 'node:path'\nimport fse from 'fs-extra'\nimport { parse } from 'yaml'\nimport { cliM } from '../cli-i18n.js'\n\n/**\n * 生成目标与实际 workspace 清单;根目录同时作为跨包输出的安全边界。\n * @example 模块内部上下文\n * ```ts\n * const pkg: GeneratePackage = { directory: path.resolve('apps/shop'), name: 'shop', dependencies: { '@sveltejs/kit': '^2' } }\n * const target: GenerateTarget = { root: path.resolve('.'), target: pkg, packages: [pkg] }\n * ```\n */\nexport interface GenerateTarget {\n /** 真实工作区根路径。 */\n root: string\n /** 当前命令选中的应用包。 */\n target: GeneratePackage\n /** 工作区中可消费的包;仅包含根目录内的真实路径。 */\n packages: GeneratePackage[]\n}\n\n/**\n * 生成器实际使用的 package.json 字段。\n * @example 模块内部上下文\n * ```ts\n * const pkg: GeneratePackage = { directory: path.resolve('packages/shop-serv'), name: 'shop-serv', dependencies: { '@h-ai/serv': '*' } }\n * const architecture = generateArchitecture(pkg) // serv\n * ```\n */\nexport interface GeneratePackage {\n /** 包的绝对真实目录。 */\n directory: string\n /** package.json.name,缺省使用目录名。 */\n name: string\n /** 运行依赖和开发依赖的合并视图。 */\n dependencies: Record<string, string>\n}\n\n/**\n * 以 path.relative 检查真实路径包含关系,拒绝同名前缀的兄弟目录;调用方先解析符号链接。\n * @param root - 允许输出的真实根目录。\n * @param file - 已解析的绝对目标或现存祖先目录。\n * @returns 目标等于根目录或位于根目录内时为 true。\n * @example 模块内部上下文\n * ```ts\n * const root = path.resolve('shop')\n * const valid = isInside(root, path.join(root, 'src/orders.ts')) // true\n * const sibling = isInside(root, `${root}-other/orders.ts`) // false\n * ```\n */\nfunction isInside(root: string, file: string): boolean {\n const relative = path.relative(root, file)\n return relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative)\n}\n\n/** 只读取生成器需要的已校验包字段,不执行应用配置。 */\nasync function readPackage(directory: string): Promise<GeneratePackage | undefined> {\n if (!await fse.pathExists(path.join(directory, 'package.json')))\n return undefined\n const value: unknown = await fse.readJson(path.join(directory, 'package.json'))\n if (!value || typeof value !== 'object' || Array.isArray(value))\n throw new Error(cliM('cli_generateUnsupportedProject'))\n const dependencies: Record<string, string> = {}\n for (const key of ['dependencies', 'devDependencies']) {\n const entries = key in value ? Reflect.get(value, key) : undefined\n if (entries && typeof entries === 'object' && !Array.isArray(entries)) {\n for (const [name, version] of Object.entries(entries)) {\n if (typeof version === 'string')\n dependencies[name] = version\n }\n }\n }\n const name = 'name' in value && typeof value.name === 'string' ? value.name : path.basename(directory)\n if (!/^(?:@[\\w.-]+\\/)?[\\w.-]+$/.test(name))\n throw new Error(cliM('cli_generateUnsupportedProject'))\n return { directory, name, dependencies }\n}\n\n/**\n * 按实际依赖辨认路由能力;纯 Vite 不具备 SvelteKit 的文件路由。\n * @param pkg - 已校验的包清单。\n * @returns 应用实际安装的框架类型。\n * @example 模块内部上下文\n * ```ts\n * const architecture = generateArchitecture({ directory: path.resolve('.'), name: 'shop-serv', dependencies: { '@h-ai/serv': '*' } }) // serv\n * ```\n */\nexport function generateArchitecture(pkg: GeneratePackage): 'sveltekit' | 'serv' | 'svelte' | 'other' {\n if (pkg.dependencies['@sveltejs/kit'])\n return 'sveltekit'\n if (pkg.dependencies['@h-ai/serv'])\n return 'serv'\n return pkg.dependencies.svelte ? 'svelte' : 'other'\n}\n\n/**\n * 从当前包或 pnpm 工作区解析唯一可消费的目标;歧义要求显式 --workspace。\n * @param options - 命令选项;workspace 可为包名或根目录内相对路径。\n * @returns 目标包及受信路径边界。\n * @throws Error - 项目类型未知、包不存在、路径越界或存在多个适用包。\n * @example 模块内部上下文\n * ```ts\n * // 前提:当前 fullstack 工程中存在 shop-serv 后端包。\n * const target = await resolveGenerateTarget({ cwd: process.cwd(), type: 'api', name: 'orders', workspace: 'shop-serv' })\n * const serviceDirectory = target.target.directory\n * ```\n */\nexport async function resolveGenerateTarget(options: GenerateOptions): Promise<GenerateTarget> {\n const cwd = await fse.realpath(path.resolve(options.cwd ?? '.'))\n let root = cwd\n for (let current = cwd; ; current = path.dirname(current)) {\n if (await fse.pathExists(path.join(current, 'pnpm-workspace.yaml'))) {\n root = current\n break\n }\n if (path.dirname(current) === current)\n break\n }\n const packages: GeneratePackage[] = []\n const addPackage = async (directory: string) => {\n if (!isInside(root, directory))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n const real = await fse.realpath(directory)\n if (!isInside(root, real))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n const pkg = await readPackage(real)\n if (pkg && !packages.some(value => value.directory === real))\n packages.push(pkg)\n }\n await addPackage(root)\n if (await fse.pathExists(path.join(root, 'pnpm-workspace.yaml'))) {\n const workspace: unknown = parse(await fse.readFile(path.join(root, 'pnpm-workspace.yaml'), 'utf8'))\n const patterns = workspace && typeof workspace === 'object' && 'packages' in workspace && Array.isArray(workspace.packages) ? workspace.packages : []\n for (const pattern of patterns) {\n if (typeof pattern !== 'string' || pattern.startsWith('!') || pattern.split(/[\\\\/]/).includes('..') || path.isAbsolute(pattern))\n throw new Error(cliM('cli_generateUnsupportedProject'))\n for await (const manifest of glob(`${pattern}/package.json`, { cwd: root, exclude: ['**/node_modules/**'] }))\n await addPackage(path.dirname(path.resolve(root, manifest)))\n }\n }\n if (cwd !== root)\n await addPackage(cwd)\n const selected = options.workspace\n ? packages.filter(pkg => pkg.name === options.workspace || pkg.directory === path.resolve(root, options.workspace!))\n : packages.filter(pkg => pkg.directory === cwd)\n const applicable = (pkg: GeneratePackage) => {\n const architecture = generateArchitecture(pkg)\n return options.type === 'api'\n ? architecture === 'serv' || (architecture === 'sveltekit' && Boolean(pkg.dependencies['@h-ai/kit']) && Boolean(pkg.dependencies.zod))\n : options.type === 'page'\n ? architecture === 'sveltekit'\n : options.type === 'component'\n ? ['sveltekit', 'svelte'].includes(architecture)\n : Object.keys(pkg.dependencies).some(name => name.startsWith('@h-ai/'))\n }\n const candidates = options.workspace || (selected.length === 1 && (cwd !== root || applicable(selected[0]!))) ? selected.filter(applicable) : packages.filter(applicable)\n if (candidates.length !== 1)\n throw new Error(cliM(candidates.length > 1 ? 'cli_generateAmbiguousWorkspace' : 'cli_generateUnsupportedProject'))\n const target = candidates[0]!\n if (generateArchitecture(target) === 'sveltekit' && (options.type === 'page' || options.type === 'api')) {\n // 不执行应用 JS 配置;明确使用 kit.files 定制布局时拒绝猜测默认路由目录。\n for (const name of ['svelte.config.js', 'svelte.config.mjs', 'svelte.config.cjs', 'svelte.config.ts']) {\n const configFile = path.join(target.directory, name)\n if (await fse.pathExists(configFile) && /\\bfiles\\s*[:.[(]/.test(await fse.readFile(configFile, 'utf8')))\n throw new Error(cliM('cli_generateCustomRoutes'))\n }\n }\n return { root, target, packages }\n}\n","/**\n * @h-ai/cli — 代码生成命令\n * @module cli-generate\n */\n\nimport type { GenerateOptions, GeneratorType, TemplateContext } from '../cli-types.js'\nimport type { GeneratedFile } from './cli-generate-serv.js'\nimport { randomUUID } from 'node:crypto'\nimport path from 'node:path'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { createTemplateContext, writeCliError, writeCliMessage } from '../cli-utils.js'\nimport { generateServApi } from './cli-generate-serv.js'\nimport { generateArchitecture, resolveGenerateTarget } from './cli-generate-target.js'\n\n/**\n * 生成器配置\n */\nconst GENERATORS: Record<GeneratorType, {\n description: () => string\n defaultPath: string\n generate: (context: TemplateContext, outputDir: string) => Promise<Array<{ path: string, content: string }>>\n}> = {\n page: {\n description: () => cliM('cli_generatePageDescription'),\n defaultPath: 'src/routes',\n generate: generatePage,\n },\n component: {\n description: () => cliM('cli_generateComponentDescription'),\n defaultPath: 'src/lib/components',\n generate: generateComponent,\n },\n api: {\n description: () => cliM('cli_generateApiDescription'),\n defaultPath: 'src/routes/api',\n generate: generateApi,\n },\n model: {\n description: () => cliM('cli_generateModelDescription'),\n defaultPath: 'src/lib/models',\n generate: generateModel,\n },\n migration: {\n description: () => cliM('cli_generateMigrationDescription'),\n defaultPath: 'migrations',\n generate: generateMigration,\n },\n}\n\n/**\n * 按实际应用/workspace 架构生成代码,并在文件写入失败时回滚本次修改。\n * @param options - 生成类型、名称、workspace 及覆盖选项。\n * @returns 文件生成并接入已有路由入口后完成。\n * @throws Error | AggregateError - 架构不支持、路径/覆盖冲突,或写入及回滚失败。\n * @example 模块内部上下文\n * ```ts\n * // 前提:当前工程是 CLI 创建的 fullstack,shop-serv 含可识别的聚合标记。\n * await generate({ cwd: process.cwd(), workspace: 'shop-serv', type: 'api', name: 'orders' })\n * // 等价:hai g api orders --workspace shop-serv;不支持纯 Vite 文件路由时会拒绝。\n * ```\n */\nexport async function generate(options: GenerateOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? '.'\n\n try {\n // 交互式获取选项\n const resolvedOptions = await resolveGenerateOptions(options)\n const generator = GENERATORS[resolvedOptions.type]\n\n // 名称会同时进入路径、标识符与源码字符串,禁止路径片段和代码字符。\n if (!/^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/i.test(resolvedOptions.name))\n throw new Error(cliM('cli_invalidGenerateName'))\n\n const target = await resolveGenerateTarget(resolvedOptions)\n const architecture = generateArchitecture(target.target)\n const outputDir = path.resolve(target.target.directory, resolvedOptions.output || generator.defaultPath)\n // 文件路由必须在真实应用的路由目录内,不能生成不会被消费的“页面”。\n if (['page', 'api'].includes(resolvedOptions.type) && architecture === 'sveltekit') {\n const routes = path.join(target.target.directory, 'src/routes')\n if (!outputDir.startsWith(routes + path.sep) && outputDir !== routes)\n throw new Error(cliM('cli_generateInvalidRouteOutput'))\n }\n if (resolvedOptions.type === 'api' && architecture === 'serv' && resolvedOptions.output)\n throw new Error(cliM('cli_generateInvalidRouteOutput'))\n const relativeOutput = path.relative(target.root, outputDir)\n if (relativeOutput === '..' || relativeOutput.startsWith(`..${path.sep}`) || path.isAbsolute(relativeOutput))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n\n const context = createTemplateContext(resolvedOptions.name, {\n projectName: target.target.name,\n })\n\n spinner.start(cliM('cli_generateProgress', { params: { description: generator.description() } }))\n\n const files = resolvedOptions.type === 'api' && architecture === 'serv'\n ? await generateServApi(context, target)\n : await generator.generate(context, outputDir)\n await writeGeneratedFiles(files, target.root, resolvedOptions.force)\n\n spinner.succeed(cliM('cli_generateComplete'))\n\n writeCliMessage('')\n writeCliMessage(cliM('cli_generateFiles'))\n files.forEach((file) => {\n writeCliMessage(chalk.cyan(` ${path.relative(cwd, file.path)}`))\n })\n writeCliMessage('')\n }\n catch (error) {\n spinner.fail(cliM('cli_generateFailed'))\n writeCliError(cliM('cli_generateFailureDetail'), { error })\n if (error instanceof AggregateError) {\n for (const cause of error.errors)\n writeCliError(cliM('cli_generateFailureDetail'), { error: cause })\n }\n throw error\n }\n}\n\n/**\n * 解析生成选项\n */\nasync function resolveGenerateOptions(options: GenerateOptions): Promise<Required<GenerateOptions>> {\n const questions: prompts.PromptObject<'type' | 'name'>[] = []\n\n if (!options.type) {\n questions.push({\n type: 'select',\n name: 'type',\n message: cliM('cli_generateTypePrompt'),\n choices: Object.entries(GENERATORS).map(([key, value]) => ({\n title: `${key} - ${value.description()}`,\n value: key,\n })),\n })\n }\n\n if (!options.name) {\n questions.push({\n type: 'text',\n name: 'name',\n message: cliM('cli_generateNamePrompt'),\n validate: (value: string) => {\n if (!value.trim())\n return cliM('cli_generateNameRequired')\n return true\n },\n })\n }\n\n const answers = questions.length > 0\n ? await prompts<'type' | 'name'>(questions, { onCancel: () => { throw new Error(cliM('cli_generateCancelled')) } })\n : {}\n const type: unknown = options.type || ('type' in answers ? answers.type : undefined)\n const name: unknown = options.name || ('name' in answers ? answers.name : undefined)\n if (!isGeneratorType(type))\n throw new Error(cliM('cli_generateUnknownType', { params: { type: String(type ?? '') } }))\n if (typeof name !== 'string' || !name.trim())\n throw new Error(cliM('cli_generateNameRequired'))\n\n return {\n type,\n name,\n output: options.output ?? '',\n force: options.force ?? false,\n verbose: options.verbose ?? false,\n cwd: options.cwd ?? '.',\n workspace: options.workspace ?? '',\n }\n}\n\n/** 校验真实生成类型,避免未识别参数或对象原型成员绕过提示。 */\nfunction isGeneratorType(value: unknown): value is GeneratorType {\n return typeof value === 'string' && Object.hasOwn(GENERATORS, value)\n}\n\n/**\n * 先校验全部路径与覆盖条件,再暂存并逐个提交;失败时只回滚仍等于本次内容的文件,保留外部并发修改。\n * @param files - 生成文件计划;聚合入口必须携带原内容。\n * @param root - 已解析的真实 workspace 根目录。\n * @param force - 仅允许覆盖普通生成文件,不绕过聚合入口的原内容检查。\n * @returns 所有文件提交及临时文件清理完成。\n * @example 模块内部上下文\n * ```ts\n * const root = await fse.realpath(process.cwd())\n * const file = path.join(root, 'src/lib/models/order-item.ts')\n * await writeGeneratedFiles([{ path: file, content: 'export interface OrderItem { id: string }\\n' }], root, false)\n * ```\n */\nasync function writeGeneratedFiles(files: GeneratedFile[], root: string, force: boolean): Promise<void> {\n if (new Set(files.map(file => path.resolve(file.path))).size !== files.length)\n throw new Error(cliM('cli_generateUnsupportedAggregator'))\n const previous = new Map<string, string | undefined>()\n const stages = new Map<string, string>()\n const written: GeneratedFile[] = []\n const failures: unknown[] = []\n for (const file of files) {\n const relativeFile = path.relative(root, file.path)\n if (relativeFile === '..' || relativeFile.startsWith(`..${path.sep}`) || path.isAbsolute(relativeFile))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n let ancestor = file.path\n while (!await fse.pathExists(ancestor))\n ancestor = path.dirname(ancestor)\n const relative = path.relative(root, await fse.realpath(ancestor))\n if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n const content = await fse.pathExists(file.path) ? await fse.readFile(file.path, 'utf8') : undefined\n if (file.previousContent !== undefined ? content !== file.previousContent : content !== undefined && !force)\n throw new Error(cliM('cli_generateExists', { params: { path: file.path } }))\n previous.set(file.path, content)\n }\n try {\n for (const file of files) {\n await fse.ensureDir(path.dirname(file.path))\n const stage = path.join(path.dirname(file.path), `.${path.basename(file.path)}.${randomUUID()}.tmp`)\n stages.set(file.path, stage)\n await fse.writeFile(stage, file.content, { encoding: 'utf8', flag: 'wx' })\n }\n for (const file of files) {\n const current = await fse.pathExists(file.path) ? await fse.readFile(file.path, 'utf8') : undefined\n if (current !== previous.get(file.path))\n throw new Error(cliM('cli_generateExists', { params: { path: file.path } }))\n await fse.rename(stages.get(file.path)!, file.path)\n written.push(file)\n }\n }\n catch (error) {\n failures.push(error)\n for (const file of written.reverse()) {\n try {\n if (await fse.readFile(file.path, 'utf8') !== file.content)\n throw new Error(cliM('cli_generateExists', { params: { path: file.path } }))\n const original = previous.get(file.path)\n if (original === undefined)\n await fse.unlink(file.path)\n else\n await fse.writeFile(file.path, original, 'utf8')\n }\n catch (rollbackError) {\n failures.push(rollbackError)\n }\n }\n }\n finally {\n for (const stage of stages.values()) {\n try {\n await fse.unlink(stage)\n }\n catch (error) {\n // 已提交的 stage 被 rename 移走;其余清理失败逐项保留,不遮盖主错误。\n if (!error || typeof error !== 'object' || !('code' in error) || error.code !== 'ENOENT')\n failures.push(error)\n }\n }\n }\n if (failures.length > 1)\n throw new AggregateError(failures, cliM('cli_generateRollbackFailed'))\n if (failures.length === 1)\n throw failures[0]\n}\n\n/**\n * 生成页面\n */\nasync function generatePage(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n const pageDir = path.join(outputDir, context.kebabCase)\n\n // +page.svelte\n const pageContent = `<!-- ${context.pascalCase} 页面 -->\n<svelte:head>\n <title>${context.pascalCase}</title>\n</svelte:head>\n\n<div class='container mx-auto p-4'>\n <h1 class='text-2xl font-bold mb-4'>${context.pascalCase}</h1>\n\n <!-- 页面内容 -->\n</div>\n`\n\n const pagePath = path.join(pageDir, '+page.svelte')\n files.push({ path: pagePath, content: pageContent })\n\n // +page.server.ts\n const serverContent = `/**\n * ${context.pascalCase} 页面服务端\n */\nimport type { Actions, PageServerLoad } from './$types'\n\nexport const load: PageServerLoad = async () => {\n return {\n // 页面数据\n }\n}\n\nexport const actions: Actions = {\n default: async () => {\n // 表单处理\n },\n}\n`\n\n const serverPath = path.join(pageDir, '+page.server.ts')\n files.push({ path: serverPath, content: serverContent })\n\n return files\n}\n\n/**\n * 生成组件\n */\nasync function generateComponent(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n\n // Component.svelte\n const componentContent = `<script lang='ts'>\n import type { Snippet } from 'svelte'\n\n /**\n * ${context.pascalCase} 组件\n */\n\n interface Props {\n /** 自定义 class */\n class?: string\n /** 子内容(Svelte 5 snippet) */\n children?: Snippet\n }\n\n const { class: className = '', children }: Props = $props()\n</script>\n\n<div class={className}>\n <!-- 组件内容 -->\n {@render children?.()}\n</div>\n`\n\n const componentPath = path.join(outputDir, `${context.pascalCase}.svelte`)\n files.push({ path: componentPath, content: componentContent })\n\n return files\n}\n\n/**\n * 生成 API 端点\n */\nasync function generateApi(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n const apiDir = path.join(outputDir, context.kebabCase)\n\n // +server.ts\n const serverContent = `/**\n * ${context.pascalCase} API\n */\nimport type { RequestHandler } from './$types'\nimport { kit } from '@h-ai/kit'\nimport { z } from 'zod'\n\n/** 示例输入;添加业务逻辑前扩展字段和约束。 */\nconst InputSchema = z.object({\n /** 业务名称(非空) */\n name: z.string().min(1),\n})\n\n/**\n * GET ${context.kebabCase}\n */\nexport const GET: RequestHandler = kit.handler(async ({ locals }) => {\n return kit.response.ok({ items: [] }, locals.requestId)\n})\n\n/**\n * POST ${context.kebabCase}\n */\nexport const POST: RequestHandler = kit.handler(async ({ request, locals }) => {\n const body = await kit.validate.body(request, InputSchema)\n // 校验通过后再执行业务操作;示例仅回传数据,不执行写入。\n return kit.response.ok(body, locals.requestId)\n})\n`\n\n const serverPath = path.join(apiDir, '+server.ts')\n files.push({ path: serverPath, content: serverContent })\n\n return files\n}\n\n/**\n * 生成数据模型\n */\nasync function generateModel(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n\n // model.ts\n const modelContent = `/**\n * ${context.pascalCase} 模型\n */\nimport { z } from 'zod'\n\n/**\n * ${context.pascalCase} Schema\n */\nexport const ${context.camelCase}Schema = z.object({\n /** 记录唯一标识 */\n id: z.string(),\n /** 显示名称 */\n name: z.string().min(1),\n /** 创建时间 */\n createdAt: z.date(),\n /** 最后修改时间 */\n updatedAt: z.date(),\n})\n\n/**\n * 创建 ${context.pascalCase} Schema\n */\nexport const create${context.pascalCase}Schema = ${context.camelCase}Schema.omit({\n id: true,\n createdAt: true,\n updatedAt: true,\n})\n\n/**\n * 更新 ${context.pascalCase} Schema\n */\nexport const update${context.pascalCase}Schema = create${context.pascalCase}Schema.partial()\n\n/**\n * ${context.pascalCase} 类型\n */\nexport type ${context.pascalCase} = z.infer<typeof ${context.camelCase}Schema>\nexport type Create${context.pascalCase} = z.infer<typeof create${context.pascalCase}Schema>\nexport type Update${context.pascalCase} = z.infer<typeof update${context.pascalCase}Schema>\n`\n\n const modelPath = path.join(outputDir, `${context.kebabCase}.ts`)\n files.push({ path: modelPath, content: modelContent })\n\n return files\n}\n\n/**\n * 生成迁移\n */\nasync function generateMigration(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n const timestamp = Date.now()\n\n // migration.ts\n const migrationContent = `/**\n * 迁移: ${context.pascalCase}\n * 时间: ${new Date().toISOString()}\n */\nimport { reldb } from '@h-ai/reldb'\n\n/** 升级:调用前初始化 reldb,调用方必须检查返回的 HaiResult。 */\nexport function up() {\n return reldb.ddl.createTable('hai_app_${context.snakeCase}', {\n id: { type: 'TEXT', primaryKey: true },\n name: { type: 'TEXT', notNull: true },\n created_at: { type: 'TIMESTAMP', notNull: true },\n updated_at: { type: 'TIMESTAMP', notNull: true },\n })\n}\n\n/** 回滚会删除整张表;由应用确认数据可删除后显式调用。 */\nexport function down() {\n return reldb.ddl.dropTable('hai_app_${context.snakeCase}')\n}\n`\n\n const migrationPath = path.join(outputDir, `${timestamp}_${context.snakeCase}.ts`)\n files.push({ path: migrationPath, content: migrationContent })\n\n return files\n}\n","/**\n * @h-ai/cli — 项目初始化/校验命令\n *\n * 校验现有项目配置完整性,补全缺失的配置文件。\n * @module cli-init\n */\n\nimport type { GlobalOptions, ProjectInfo } from '../cli-types.js'\nimport path from 'node:path'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { cliM } from '../cli-i18n.js'\nimport { fileExists, writeCliError, writeCliMessage, writeFile } from '../cli-utils.js'\nimport { generateConfigFile } from './cli-config-templates.js'\nimport { detectProject } from './cli-create.js'\n\n/**\n * init 命令选项\n * @example 模块内部上下文\n * ```ts\n * const options: InitOptions = { cwd: '/workspace/shop', force: false } // force=true 会覆盖已有模块 YAML。\n * ```\n */\nexport interface InitOptions extends GlobalOptions {\n /** 强制重新生成配置 */\n force?: boolean\n}\n\n/**\n * 模块到配置文件的映射\n */\nconst MODULE_CONFIG_MAP: Record<string, { configKey: string, label: string }> = {\n '@h-ai/core': { configKey: 'core', get label() { return cliM('cli_coreLabel') } },\n '@h-ai/serv': { configKey: 'serv', get label() { return cliM('cli_serviceLabel') } },\n '@h-ai/reldb': { configKey: 'db', get label() { return cliM('cli_featureDbName') } },\n '@h-ai/cache': { configKey: 'cache', get label() { return cliM('cli_featureCacheName') } },\n '@h-ai/iam': { configKey: 'iam', get label() { return cliM('cli_featureIamName') } },\n '@h-ai/storage': { configKey: 'storage', get label() { return cliM('cli_featureStorageName') } },\n '@h-ai/ai': { configKey: 'ai', get label() { return cliM('cli_featureAiName') } },\n '@h-ai/vecdb': { configKey: 'vecdb', get label() { return cliM('cli_featureVecdbName') } },\n '@h-ai/reach': { configKey: 'reach', get label() { return cliM('cli_featureReachName') } },\n '@h-ai/scheduler': { configKey: 'scheduler', get label() { return cliM('cli_featureSchedulerName') } },\n '@h-ai/audit': { configKey: 'audit', get label() { return cliM('cli_featureAuditName') } },\n '@h-ai/payment': { configKey: 'payment', get label() { return cliM('cli_featurePaymentName') } },\n '@h-ai/deploy': { configKey: 'deploy', get label() { return cliM('cli_featureDeployName') } },\n}\n\n/**\n * 校验结果\n * 项目包声明与配置文件存在性的检查结果;不表示连接可用或配置已通过模块 Schema。\n * @example 模块内部上下文\n * ```ts\n * const validation: ValidationResult = { existing: ['core'], missing: [{ pkg: '@h-ai/reldb', configKey: 'db', label: 'Database' }], project: { name: 'shop', version: '1.0.0', isHaiProject: true, haiPackages: ['@h-ai/core', '@h-ai/reldb'] } }\n * ```\n */\ninterface ValidationResult {\n /** 已存在的配置 */\n existing: string[]\n /** 缺失的配置 */\n missing: Array<{ pkg: string, configKey: string, label: string }>\n /** 项目信息 */\n project: ProjectInfo\n}\n\n/**\n * 校验项目配置完整性\n */\nasync function validateProject(cwd: string): Promise<ValidationResult | null> {\n const project = await detectProject(cwd)\n if (!project) {\n return null\n }\n\n const existing: string[] = []\n const missing: ValidationResult['missing'] = []\n\n for (const pkg of project.haiPackages) {\n const mapping = MODULE_CONFIG_MAP[pkg]\n if (!mapping)\n continue\n\n const configPath = path.join(cwd, 'config', `_${mapping.configKey}.yml`)\n if (await fileExists(configPath)) {\n existing.push(mapping.configKey)\n }\n else {\n missing.push({ pkg, configKey: mapping.configKey, label: mapping.label })\n }\n }\n\n return { existing, missing, project }\n}\n\n/**\n * 初始化/校验项目配置\n * force=true 会重新生成已安装模块的配置;文件操作失败抛错,未检测到项目时打印提示并返回。\n * @param options - 命令参数;对应命令的工作目录、非交互与可选功能。\n * @returns 缺失配置补齐或 force 模式覆盖完成。\n * @example 模块内部上下文\n * ```ts\n * // 前提:当前目录已有 hai 项目的 package.json。\n * await initProject({ cwd: process.cwd(), force: false }) // 等价 hai init;只补缺失配置。\n * ```\n */\nexport async function initProject(options: InitOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? '.'\n\n try {\n // 检测项目\n spinner.start(cliM('cli_initDetecting'))\n const result = await validateProject(cwd)\n\n if (!result) {\n spinner.fail(chalk.red(cliM('cli_projectNotFound')))\n return\n }\n\n const { project, existing, missing } = result\n spinner.succeed(cliM('cli_initDetected', { params: { name: chalk.cyan(project.name) } }))\n\n // 即使配置齐备,也补全新增 AI 参考资源;已有项目规则与 Skill 不覆盖。\n if (project.isHaiProject) {\n const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates.js')\n const generatedFiles = await generateProjectAiSupport(cwd, resolveSkillNamesForPackages(project.haiPackages), {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n })\n for (const generatedFile of generatedFiles) {\n writeCliMessage(chalk.gray(` + ${generatedFile}`))\n }\n }\n\n // 显示项目状态\n writeCliMessage('')\n writeCliMessage(chalk.bold(cliM('cli_initStatus')))\n writeCliMessage(cliM('cli_initName', { params: { name: chalk.cyan(project.name) } }))\n writeCliMessage(cliM('cli_initVersion', { params: { version: project.version } }))\n writeCliMessage(cliM('cli_initModules', { params: { modules: project.haiPackages.length > 0 ? project.haiPackages.map(p => chalk.cyan(p)).join(', ') : chalk.gray(cliM('cli_none')) } }))\n writeCliMessage('')\n\n // 显示配置状态\n if (existing.length > 0) {\n writeCliMessage(chalk.bold(cliM('cli_initExisting')))\n for (const key of existing) {\n writeCliMessage(chalk.green(` ✔ config/_${key}.yml`))\n }\n }\n\n // 无缺失配置\n if (missing.length === 0 && !options.force) {\n writeCliMessage('')\n writeCliMessage(chalk.green(cliM('cli_initReady')))\n return\n }\n\n // 补全缺失配置\n if (missing.length > 0) {\n writeCliMessage('')\n writeCliMessage(chalk.bold(cliM('cli_initMissing')))\n for (const item of missing) {\n writeCliMessage(chalk.yellow(` ✘ config/_${item.configKey}.yml (${item.label})`))\n }\n writeCliMessage('')\n\n spinner.start(cliM('cli_initGenerating'))\n let generated = 0\n for (const item of missing) {\n const configPath = path.join(cwd, 'config', `_${item.configKey}.yml`)\n const content = generateConfigFile(item.configKey)\n await writeFile(configPath, content)\n generated++\n }\n spinner.succeed(cliM('cli_initGenerated', { params: { count: generated } }))\n }\n\n // 强制模式:重新生成所有配置\n if (options.force && existing.length > 0) {\n writeCliMessage('')\n spinner.start(cliM('cli_initRegenerating'))\n let regenerated = 0\n for (const pkg of project.haiPackages) {\n const mapping = MODULE_CONFIG_MAP[pkg]\n if (!mapping)\n continue\n const configPath = path.join(cwd, 'config', `_${mapping.configKey}.yml`)\n const content = generateConfigFile(mapping.configKey)\n await writeFile(configPath, content)\n regenerated++\n }\n spinner.succeed(cliM('cli_initRegenerated', { params: { count: regenerated } }))\n }\n\n // 检查 core 配置(始终需要)\n const coreConfigPath = path.join(cwd, 'config', '_core.yml')\n if (!(await fileExists(coreConfigPath))) {\n spinner.start(cliM('cli_initCore'))\n const content = generateConfigFile('core')\n await writeFile(coreConfigPath, content)\n spinner.succeed()\n }\n\n writeCliMessage('')\n writeCliMessage(chalk.green(cliM('cli_initSuccess')))\n writeCliMessage('')\n writeCliMessage(chalk.gray(cliM('cli_nextSteps')))\n writeCliMessage(chalk.gray(cliM('cli_initEditConfig')))\n writeCliMessage(chalk.gray(cliM('cli_initStartDev')))\n writeCliMessage('')\n }\n catch (error) {\n spinner.fail()\n writeCliError(chalk.red(cliM('cli_initFailed')), { error })\n throw error\n }\n}\n","/** 精确版本升级诊断;只读本地工程和发布制品,不安装、不改文件、不覆盖业务 skill。 */\nimport { execFileSync } from 'node:child_process'\nimport { createHash } from 'node:crypto'\nimport { existsSync, readFileSync, realpathSync } from 'node:fs'\nimport { glob } from 'node:fs/promises'\nimport { findPackageJSON } from 'node:module'\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path'\nimport process from 'node:process'\nimport { pathToFileURL } from 'node:url'\nimport { gunzipSync } from 'node:zlib'\nimport { parse, parseAllDocuments } from 'yaml'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliMessage } from '../cli-utils.js'\n\nfunction object(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {}\n}\n\n/** 只识别发布声明的值导出;注释、字符串、私有声明和 type 导出不构成迁移能力。 */\nfunction declaresValueExport(source: string, name: string): boolean {\n const declarations = source.replace(/\\/\\*[\\s\\S]*?\\*\\/|\\/\\/[^\\n]*|\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|`(?:\\\\.|[^`\\\\])*`/g, ' ')\n if (new RegExp(`\\\\bexport\\\\s+(?:declare\\\\s+)?(?:function|const|let|var)\\\\s+${name}\\\\b`).test(declarations))\n return true\n return [...declarations.matchAll(/\\bexport\\s*\\{([^}]+)\\}/g)].some(match => match[1]!.split(',').some((item) => {\n const value = item.trim()\n return !value.startsWith('type ') && (value.split(/\\s+as\\s+/).at(-1)?.trim() === name)\n }))\n}\n\n/** 有界检查 npm tar 内容,仅读取,不解压到工程。 */\nfunction tarFiles(bytes: Uint8Array): Map<string, Uint8Array> {\n const tar = gunzipSync(bytes, { maxOutputLength: 64 * 1024 * 1024 })\n const files = new Map<string, Uint8Array>()\n for (let offset = 0; offset + 512 <= tar.length;) {\n const name = tar.subarray(offset, offset + 100).toString().replace(/\\0.*$/, '')\n if (!name)\n break\n const size = Number.parseInt(tar.subarray(offset + 124, offset + 136).toString().replace(/\\0.*$/, '').trim(), 8)\n if (!Number.isSafeInteger(size) || size < 0 || offset + 512 + size > tar.length)\n throw new Error('Invalid archive')\n if (tar[offset + 156] === 0 || tar[offset + 156] === 48)\n files.set(name, tar.subarray(offset + 512, offset + 512 + size))\n offset += 512 + Math.ceil(size / 512) * 512\n }\n return files\n}\n\n/**\n * 指定精确版本检查全部消费包、CLI/deploy 制品和工作区漂移;不完整发布不会修改工程。\n * @example 模块内部上下文\n * ```ts\n * const result = await inspectFrameworkUpgrade('/workspace/shop', '0.1.0-alpha.71')\n * // result.releaseComplete 为真后再安排停机、备份与模块迁移;此函数始终只读。\n * ```\n */\nexport async function inspectFrameworkUpgrade(directory: string, version: string) {\n if (!/^\\d+\\.\\d+\\.\\d+(?:-[\\da-z.-]+)?(?:\\+[\\da-z.-]+)?$/i.test(version))\n throw new Error(cliM('cli_upgrade_exact_version'))\n const root = realpathSync(resolve(directory))\n const workspaceFile = join(root, 'pnpm-workspace.yaml')\n const workspace = existsSync(workspaceFile) ? object(parse(readFileSync(workspaceFile, 'utf8'))) : {}\n const rootManifest = object(JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')))\n const patterns: unknown[] = Array.isArray(workspace.packages) ? workspace.packages : Array.isArray(rootManifest.workspaces) ? rootManifest.workspaces : Array.isArray(object(rootManifest.workspaces).packages) ? object(rootManifest.workspaces).packages as unknown[] : []\n const directories = new Set([root])\n const safePatterns = patterns.filter((pattern): pattern is string => typeof pattern === 'string' && !isAbsolute(pattern.replace(/^!/, '')) && !pattern.split(/[\\\\/]/).includes('..'))\n const exclude = ['**/node_modules/**', ...safePatterns.filter(pattern => pattern.startsWith('!')).map(pattern => `${pattern.slice(1)}/package.json`)]\n for (const pattern of safePatterns.filter(pattern => !pattern.startsWith('!'))) {\n for await (const manifest of glob(`${pattern}/package.json`, { cwd: root, exclude })) {\n const location = realpathSync(dirname(join(root, manifest)))\n const fromRoot = relative(root, location)\n if (!isAbsolute(fromRoot) && fromRoot !== '..' && !fromRoot.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`))\n directories.add(location)\n }\n }\n const packages = new Set(['@h-ai/cli', '@h-ai/deploy'])\n const drift: Array<{ package: string, source: string, declared: string, installed?: string, issues: string[] }> = []\n const catalog = object(workspace.catalog)\n const lockPath = join(root, 'pnpm-lock.yaml')\n const lock = existsSync(lockPath)\n ? parseAllDocuments(readFileSync(lockPath, 'utf8')).reduce<Record<string, unknown>>((all, document) => {\n if (document.errors.length)\n throw new Error(cliM('cli_upgrade_lock_invalid'))\n const part = object(document.toJS())\n return { ...all, ...part, importers: { ...object(all.importers), ...object(part.importers) } }\n }, {})\n : {}\n for (const location of directories) {\n const manifest = object(JSON.parse(readFileSync(join(location, 'package.json'), 'utf8')))\n const dependencies = { ...object(manifest.dependencies), ...object(manifest.devDependencies), ...object(manifest.optionalDependencies) }\n const importer = object(object(lock.importers)[relative(root, location).replaceAll('\\\\', '/') || '.'])\n for (const [name, specifier] of Object.entries(dependencies)) {\n if (!/^@h-ai\\/[\\w-]+$/.test(name) || typeof specifier !== 'string')\n continue\n packages.add(name)\n const declared = specifier.startsWith('catalog:') ? String(object(specifier === 'catalog:' ? catalog : object(workspace.catalogs)[specifier.slice(8)])[name] ?? '') : specifier\n const issues: string[] = []\n if (declared !== version && !declared.startsWith('workspace:'))\n issues.push('declared-version-drift')\n let installed: string | undefined\n try {\n // 使用消费者的 ESM 包解析,不执行入口,也不要求包公开 package.json 子路径。\n const path = findPackageJSON(name, pathToFileURL(join(location, 'package.json')))\n if (path) {\n const candidate = object(JSON.parse(readFileSync(path, 'utf8')))\n if (candidate.name === name && typeof candidate.version === 'string')\n installed = candidate.version\n }\n }\n catch { /* 已安装版本缺失作为诊断输出,不触发安装。 */ }\n if (installed !== version)\n issues.push(installed ? 'installed-version-drift' : 'not-installed')\n const locked = object(object(importer.dependencies)[name] ?? object(importer.devDependencies)[name] ?? object(importer.optionalDependencies)[name])\n if (typeof locked.version !== 'string' || (!locked.version.startsWith('link:') && locked.version.split('(')[0] !== version))\n issues.push('lock-version-drift')\n drift.push({ package: name, source: relative(root, join(location, 'package.json')).replaceAll('\\\\', '/'), declared, installed, issues })\n }\n }\n const registry = new URL(process.env.npm_config_registry ?? 'https://registry.npmjs.org/')\n if (registry.username || registry.password || registry.protocol !== 'https:')\n throw new Error(cliM('cli_upgrade_registry'))\n const releases: Array<{ package: string, available: boolean, issues: string[] }> = []\n const migrationPreflight: string[] = []\n const skills: Array<{ name: string, state: string }> = []\n const pending = [...packages]\n for (let index = 0; index < pending.length; index++) {\n const name = pending[index]!\n const item = { package: name, available: false, issues: [] as string[] }\n releases.push(item)\n try {\n const response = await fetch(new URL(`${encodeURIComponent(name)}/${encodeURIComponent(version)}`, registry), { signal: AbortSignal.timeout(20000) })\n if (!response.ok)\n throw new Error('Release missing')\n const metadata = object(await response.json())\n const dist = object(metadata.dist)\n if (metadata.version !== version || typeof dist.tarball !== 'string' || typeof dist.integrity !== 'string')\n throw new Error('Invalid metadata')\n for (const dependency of Object.keys(object(metadata.dependencies))) {\n if (/^@h-ai\\/[\\w-]+$/.test(dependency) && !packages.has(dependency)) {\n packages.add(dependency)\n pending.push(dependency)\n }\n }\n const url = new URL(dist.tarball)\n if (url.protocol !== 'https:' || url.username || url.password)\n throw new Error('Invalid tarball')\n const available = await fetch(url, { method: 'HEAD', signal: AbortSignal.timeout(20000) })\n if (!available.ok)\n throw new Error('Artifact missing')\n if (['@h-ai/cli', '@h-ai/deploy', '@h-ai/iam', '@h-ai/reach', '@h-ai/scheduler', '@h-ai/audit'].includes(name)) {\n const archive = await fetch(url, { signal: AbortSignal.timeout(30000) })\n if (!archive.ok || Number(archive.headers.get('content-length')) > 32 * 1024 * 1024)\n throw new Error('Artifact missing')\n const bytes = new Uint8Array(await archive.arrayBuffer())\n if (bytes.length > 32 * 1024 * 1024)\n throw new Error('Artifact too large')\n const integrity = dist.integrity.split(' ').find(value => value.startsWith('sha512-'))\n if (!integrity || createHash('sha512').update(bytes).digest('base64') !== integrity.slice(7))\n throw new Error('Integrity mismatch')\n const files = tarFiles(bytes)\n const manifest = files.get('package/package.json')\n if (!manifest || object(JSON.parse(new TextDecoder().decode(manifest))).version !== version || !files.has('package/dist/index.js'))\n throw new Error('Incomplete artifact')\n const migration = { '@h-ai/iam': 'migrateIam', '@h-ai/reach': 'migrateReach', '@h-ai/scheduler': 'migrateScheduler', '@h-ai/audit': 'migrateAudit' }[name]\n if (migration && declaresValueExport(new TextDecoder().decode(files.get('package/dist/index.d.ts')), migration) && declaresValueExport(new TextDecoder().decode(files.get('package/dist/index.js')), migration))\n migrationPreflight.push(`${migration}({ dryRun: true })`)\n if (name === '@h-ai/cli') {\n if (!files.has('package/templates/skills/hai-feedback/SKILL.md'))\n throw new Error('Skills missing')\n for (const [path, bytes] of files) {\n const match = /^package\\/templates\\/skills\\/([^/]+)\\/SKILL.md$/.exec(path)\n if (!match)\n continue\n const local = join(root, '.agents/skills', match[1]!, 'SKILL.md')\n skills.push({ name: match[1]!, state: !existsSync(local) ? 'missing' : createHash('sha256').update(readFileSync(local)).digest('hex') === createHash('sha256').update(bytes).digest('hex') ? 'current' : 'customized-or-older' })\n }\n }\n }\n item.available = true\n }\n catch {\n item.issues.push('release-or-artifact-unavailable')\n }\n }\n let dirtyFiles: string[] = []\n try {\n dirtyFiles = execFileSync('git', ['status', '--porcelain', '--', '.'], { cwd: root, encoding: 'utf8', windowsHide: true, stdio: 'pipe' }).trim().split('\\n').filter(Boolean)\n }\n catch { /* 非 Git 工程仍可检查发布齐备性。 */ }\n return { version, releaseComplete: releases.every(item => item.available), modified: false, releases, drift, skills, dirtyFiles, customizations: { overrides: [...new Set([...Object.keys(object(workspace.overrides)), ...Object.keys(object(rootManifest.overrides)), ...Object.keys(object(object(rootManifest.pnpm).overrides))])], patches: [...new Set([...Object.keys(object(workspace.patchedDependencies)), ...Object.keys(object(object(rootManifest.pnpm).patchedDependencies))])] }, migration: { preflight: migrationPreflight, inspectModuleReadmes: true, exclusiveAccess: true, backup: ['database', 'shared-session-cache'], rollback: 'restore-compatible-database-and-binaries', sessions: 'legacy-credential-sessions-require-login' } }\n}\n\n/**\n * 只读升级诊断 CLI 入口。\n * @example 模块内部上下文\n * ```ts\n * await upgradeCommand('0.1.0-alpha.71', { cwd: '/workspace/shop' })\n * ```\n */\nexport async function upgradeCommand(version: string, options: { cwd?: string } = {}): Promise<void> {\n const report = await inspectFrameworkUpgrade(options.cwd ?? process.cwd(), version)\n writeCliMessage(JSON.stringify(report, null, 2))\n if (!report.releaseComplete)\n process.exitCode = 1\n}\n","/**\n * @h-ai/cli — 主入口\n *\n * hai Agent Framework CLI\n * @module cli-main\n */\n\nimport type { AppType, CreateProjectOptions, FeatureId, FrontendTarget, GeneratorType } from './cli-types.js'\nimport process from 'node:process'\nimport { cac } from 'cac'\nimport chalk from 'chalk'\nimport { cliM } from './cli-i18n.js'\nimport { getCliVersion, writeCliMessage } from './cli-utils.js'\nimport { addModule, buildCommand, createProject, deployCommand, deploySecretsCommand, feedbackCommand, generate, initProject, upgradeCommand } from './commands/cli-commands.js'\n\n// CLI 版本(从 package.json 动态读取,避免硬编码与 npm 发布版本不一致)\nconst VERSION = getCliVersion()\n\n// 创建 CLI\nconst cli = cac('hai')\n\n// 全局选项\ncli.option('-v, --verbose', cliM('cli_help_verbose'))\ncli.option('-C, --cwd <path>', cliM('cli_help_cwd'))\n\n// 创建项目命令\ncli\n .command('create [name]', cliM('cli_help_create'))\n .option('--type <type>', cliM('cli_help_appType'))\n .option('--frontends <targets>', cliM('cli_help_frontends'))\n .option('--no-install', cliM('cli_help_noInstall'))\n .option('--no-deploy', cliM('cli_help_noDeploy'))\n .option('-p, --package-manager <pm>', cliM('cli_help_packageManager'))\n .option('--no-git', cliM('cli_help_noGit'))\n .option('--git-remote <url>', cliM('cli_help_gitRemote'))\n .option('--defaults', cliM('cli_help_defaults'))\n .action(async (name: string | undefined, options: Record<string, unknown>) => {\n try {\n const frontends = typeof options.frontends === 'string'\n ? options.frontends.split(',').map(f => f.trim()).filter(Boolean) as FrontendTarget[]\n : undefined\n\n await createProject({\n name: name ?? '',\n appType: options.type as AppType,\n frontends,\n deploy: options.deploy as boolean,\n install: options.install as boolean,\n packageManager: options.packageManager as CreateProjectOptions['packageManager'],\n git: options.git as boolean,\n gitRemote: options.gitRemote as string,\n defaults: options.defaults as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n // 保留自然退出,让终端/管道中的失败详情写完。\n process.exitCode = 1\n }\n })\n\n// 增量添加模块\ncli\n .command('add [module]', cliM('cli_help_add'))\n .option('--no-install', cliM('cli_help_noInstall'))\n .action(async (module: string | undefined, options: Record<string, unknown>) => {\n try {\n await addModule({\n module: module as FeatureId,\n install: options.install as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 初始化/校验配置\ncli\n .command('init', cliM('cli_help_init'))\n .option('-f, --force', cliM('cli_help_forceConfig'))\n .action(async (options: Record<string, unknown>) => {\n try {\n await initProject({\n force: options.force as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 代码生成命令\ncli\n .command('generate [type] [name]', cliM('cli_help_generate'))\n .option('-w, --workspace <name>', cliM('cli_help_workspace'))\n .alias('g')\n .option('-o, --output <path>', cliM('cli_help_output'))\n .option('-f, --force', cliM('cli_help_force'))\n .action(async (type: string | undefined, name: string | undefined, options: Record<string, unknown>) => {\n try {\n await generate({\n type: type as GeneratorType,\n name: name ?? '',\n output: options.output as string,\n ...(options.workspace ? { workspace: String(options.workspace) } : {}),\n force: options.force as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 构建与部署分别执行;构建不读取部署环境配置。\ncli\n .command('build', cliM('cli_help_build'))\n .option('--target <target>', cliM('cli_help_target'))\n .option('--images <names>', cliM('cli_help_images'))\n .option('--concurrency <count>', cliM('cli_help_buildConcurrency'))\n .option('--runtime <runtime>', cliM('cli_help_buildRuntime'))\n .option('--network <network>', cliM('cli_help_buildNetwork'))\n .option('--platform <platform>', cliM('cli_help_platform'))\n .option('--arch <arch>', cliM('cli_help_arch'))\n .option('--sqlite-prebuild-mirror <url>', cliM('cli_help_sqliteMirror'))\n .option('--no-http-proxy', cliM('cli_help_noHttpProxy'))\n .option('-y, --yes', cliM('cli_help_deployYes'))\n .option('--image-source <source>', cliM('cli_help_imageSource'))\n .option('--image-mirrors <mappings>', cliM('cli_help_imageMirrors'))\n .option('--npm-source <source>', cliM('cli_help_npmSource'))\n .option('--npm-registry <url>', cliM('cli_help_npmRegistry'))\n .option('--proxy-mode <mode>', cliM('cli_help_proxyMode'))\n .option('--proxy-url <url>', cliM('cli_help_proxyUrl'))\n .option('--proxy-bypass <hosts>', cliM('cli_help_proxyBypass'))\n .action(async (options: Parameters<typeof buildCommand>[0]) => {\n try {\n await buildCommand(options)\n }\n catch (error) {\n writeCliMessage(error instanceof Error ? error.message : String(error))\n process.exitCode = 1\n }\n })\n\n// 部署命令\ncli.command('upgrade <version>', cliM('cli_help_upgrade')).action(async (version: string, options: { cwd?: string }) => {\n try {\n await upgradeCommand(version, options)\n }\n catch (error) {\n writeCliMessage(error instanceof Error ? error.message : String(error))\n process.exitCode = 1\n }\n})\n\n// 部署命令\ncli\n .command('deploy [appDir]', cliM('cli_help_deploy'))\n .option('--plan', cliM('cli_help_deployPlan'))\n .option('--inspect-remote', cliM('cli_help_inspectRemote'))\n .option('--env <environment>', cliM('cli_help_environment'))\n .option('--env-dir <path>', cliM('cli_help_envDir'))\n .option('-y, --yes', cliM('cli_help_deployYes'))\n .option('--skip-middleware', cliM('cli_help_skipMiddleware'))\n .option('--artifact-dir <path>', cliM('cli_help_artifactDir'))\n .option('--services <names>', cliM('cli_help_services'))\n .option('--build', cliM('cli_help_deployBuild'))\n .option('--concurrency <count>', cliM('cli_help_buildConcurrency'))\n .option('--network <network>', cliM('cli_help_deployNetwork'))\n .option('--sqlite-prebuild-mirror <url>', cliM('cli_help_deploySqliteMirror'))\n .option('--no-http-proxy', cliM('cli_help_deployNoProxy'))\n .option('--image-source <source>', cliM('cli_help_imageSource'))\n .option('--image-mirrors <mappings>', cliM('cli_help_imageMirrors'))\n .option('--npm-source <source>', cliM('cli_help_npmSource'))\n .option('--npm-registry <url>', cliM('cli_help_npmRegistry'))\n .option('--proxy-mode <mode>', cliM('cli_help_proxyMode'))\n .option('--proxy-url <url>', cliM('cli_help_proxyUrl'))\n .option('--proxy-bypass <hosts>', cliM('cli_help_proxyBypass'))\n .option('--runtime <runtime>', cliM('cli_help_deployRuntime'))\n .option('--bundle-only', cliM('cli_help_bundleOnly'))\n .option('--output <path>', cliM('cli_help_bundleOutput'))\n .action(async (appDir: string | undefined, options: Record<string, unknown>) => {\n try {\n await deployCommand({\n appDir,\n plan: options.plan as boolean,\n inspectRemote: options.inspectRemote as boolean,\n env: options.env as string,\n envDir: options.envDir as string,\n yes: options.yes as boolean,\n skipMiddleware: options.skipMiddleware as boolean,\n artifactDir: options.artifactDir as string,\n services: options.services as string,\n build: options.build as boolean,\n concurrency: options.concurrency as number,\n network: options.network as string,\n sqlitePrebuildMirror: options.sqlitePrebuildMirror as string,\n httpProxy: options.httpProxy as boolean,\n imageSource: options.imageSource as 'official' | 'cn' | 'custom',\n imageMirrors: options.imageMirrors as string,\n npmSource: options.npmSource as 'official' | 'cn' | 'custom',\n npmRegistry: options.npmRegistry as string,\n proxyMode: options.proxyMode as 'inherit' | 'system' | 'custom' | 'none',\n proxyUrl: options.proxyUrl as string,\n proxyBypass: options.proxyBypass as string,\n runtime: options.runtime as 'auto' | 'podman' | 'docker',\n bundleOnly: options.bundleOnly as boolean,\n output: options.output as string,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exitCode = 1\n }\n })\n\n// 服务器本机凭据迁移,不复用普通部署的默认目标或配置保存逻辑。\ncli.command('deploy-secrets <directory>', cliM('cli_help_deploySecrets'))\n .option('--import <file>', cliM('cli_help_secretImport'))\n .option('--apply', cliM('cli_help_secretApply'))\n .option('--runtime <runtime>', cliM('cli_help_deployRuntime'))\n .action(async (directory: string, options: { import?: string, apply?: boolean, runtime?: string, cwd?: string }) => {\n try {\n await deploySecretsCommand(directory, options)\n }\n catch (error) {\n writeCliMessage(error instanceof Error ? error.message : String(error))\n process.exitCode = 1\n }\n })\n\n// 快捷生成命令\ncli\n .command('feedback <action> <bundle>', cliM('cli_help_feedback'))\n .option('--page <number>', cliM('cli_feedback_page'))\n .option('--page-size <number>', cliM('cli_feedback_pageSize'))\n .option('--kind <kind>', cliM('cli_feedback_kind'))\n .option('--request-id <id>', cliM('cli_feedback_requestId'))\n .option('--error-id <id>', cliM('cli_feedback_errorId'))\n .option('--from <timestamp>', cliM('cli_feedback_from'))\n .option('--to <timestamp>', cliM('cli_feedback_to'))\n .option('--port <number>', cliM('cli_feedback_port'))\n .action(async (action: string, bundle: string, options: Record<string, unknown>) => {\n try {\n const numberOption = (value: unknown) => value === undefined ? undefined : Number(value)\n await feedbackCommand(action, bundle, {\n cwd: options.cwd as string,\n page: numberOption(options.page),\n pageSize: numberOption(options.pageSize),\n kind: options.kind as string,\n requestId: options.requestId as string,\n errorId: options.errorId as string,\n from: numberOption(options.from),\n to: numberOption(options.to),\n port: numberOption(options.port),\n })\n }\n catch (error) {\n writeCliMessage(error instanceof Error ? error.message : String(error))\n process.exitCode = 1\n }\n })\n\n// 快捷生成命令\ncli\n .command('g:page <name>', cliM('cli_help_generatePage'))\n .option('-w, --workspace <name>', cliM('cli_help_workspace'))\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'page', name, cwd: options.cwd as string, ...(options.workspace ? { workspace: String(options.workspace) } : {}) })\n })\n\ncli\n .command('g:component <name>', cliM('cli_help_generateComponent'))\n .option('-w, --workspace <name>', cliM('cli_help_workspace'))\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'component', name, cwd: options.cwd as string, ...(options.workspace ? { workspace: String(options.workspace) } : {}) })\n })\n\ncli\n .command('g:api <name>', cliM('cli_help_generateApi'))\n .option('-w, --workspace <name>', cliM('cli_help_workspace'))\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'api', name, cwd: options.cwd as string, ...(options.workspace ? { workspace: String(options.workspace) } : {}) })\n })\n\ncli\n .command('g:model <name>', cliM('cli_help_generateModel'))\n .option('-w, --workspace <name>', cliM('cli_help_workspace'))\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'model', name, cwd: options.cwd as string, ...(options.workspace ? { workspace: String(options.workspace) } : {}) })\n })\n\n// 版本和帮助\ncli.version(VERSION, '-V, --version')\ncli.help()\n\n// 解析参数\nconst parsed = cli.parse()\n\n// 无命令且未请求帮助/版本时显示帮助\nif (!cli.matchedCommand && !parsed.options.help && !parsed.options.version) {\n writeCliMessage('')\n writeCliMessage(chalk.cyan('hai Agent Framework CLI'))\n writeCliMessage('')\n cli.outputHelp()\n}\n"]}
|